[Home] [Help]
PACKAGE BODY: APPS.PA_FP_GEN_FCST_AMT_PUB1
Source
1 PACKAGE body PA_FP_GEN_FCST_AMT_PUB1 as
2 /* $Header: PAFPFG2B.pls 120.5.12010000.3 2008/09/30 01:10:02 asahoo ship $ */
3
4 P_PA_DEBUG_MODE varchar2(1) := NVL(FND_PROFILE.value('PA_DEBUG_MODE'), 'N');
5
6 /**
7 * This procedure updates planning txn level override rates
8 * for NON-RATE-BASED txns in the following ways:
9 * 1. In Cost and Revenue together target versions,
10 * for non-rate-based txns with only revenue amounts:
11 * a. Set bill rate override to 1
12 * b. Set cost rate overrides to 0
13 * 2. Null out any existing rate overrides for non-rate-based
14 * txns that do not have any budget lines.
15 *
16 * IMPORTANT NOTE:
17 * This procedure should only be called before the final
18 * rollup of amounts in the pa_resource_asgn_curr table.
19 * The impact of calling this API out of order is that rolled
20 * up amounts and average rates will be nulled out for
21 * updated planning txns!
22 *
23 * Also worth noting is that this procedure is package-private.
24 */
25 PROCEDURE UPD_NRB_TXN_OVR_RATES
26 (P_PROJECT_ID IN PA_PROJECTS_ALL.PROJECT_ID%TYPE,
27 P_BUDGET_VERSION_ID IN PA_BUDGET_VERSIONS.BUDGET_VERSION_ID%TYPE,
28 P_FP_COLS_REC IN PA_FP_GEN_AMOUNT_UTILS.FP_COLS,
29 P_ETC_START_DATE IN DATE,
30 X_RETURN_STATUS OUT NOCOPY VARCHAR2,
31 X_MSG_COUNT OUT NOCOPY NUMBER,
32 X_MSG_DATA OUT NOCOPY VARCHAR2 )
33 IS
34 l_package_name VARCHAR2(30) := 'PA_FP_GEN_FCST_AMT_PUB1';
35 l_procedure_name VARCHAR2(30) := 'UPD_NRB_TXN_OVR_RATES';
36 l_module_name VARCHAR2(100);
37
38 -- This cursor gets distinct (resource_assignment_id,txn_currency_code)
39 -- values for any non-rate-based txns in the given budget version
40 -- (p_budget_version_id) that have only (ETC) revenue amounts.
41 -- This cursor can be used for both timephased and non-timephased
42 -- Budgets and Forecasts, since only (plan-actual) values are checked.
43 -- Also, the cursor considers both manually and non-manually added
44 -- lines since Update Case 1 applies to both cases.
45
46 -- ER 5726773: Instead of selecting only planning transactions with
47 -- positive internal Plan/ETC quantity, relax the restriction to only
48 -- non-zero internal Plan/ETC quantity.
49
50 CURSOR rev_only_nrb_txns_csr IS
51 SELECT bl.resource_assignment_id,
52 bl.txn_currency_code
53 FROM pa_resource_assignments ra,
54 pa_budget_lines bl
55 WHERE ra.budget_version_id = p_budget_version_id
56 AND ra.project_id = p_project_id
57 AND ra.rate_based_flag = 'N'
58 AND bl.resource_assignment_id = ra.resource_assignment_id
59 AND bl.cost_rejection_code is null
60 AND bl.revenue_rejection_code is null
61 AND bl.burden_rejection_code is null
62 AND bl.other_rejection_code is null
63 AND bl.pc_cur_conv_rejection_code is null
64 AND bl.pfc_cur_conv_rejection_code is null
65 GROUP BY bl.resource_assignment_id,
66 bl.txn_currency_code
67 HAVING nvl(sum(bl.txn_raw_cost),0)-nvl(sum(bl.txn_init_raw_cost),0) = 0
68 and nvl(sum(bl.quantity),0)-nvl(sum(bl.init_quantity),0) <> 0
69 and nvl(sum(bl.quantity),0)-nvl(sum(bl.init_quantity),0) =
70 nvl(sum(bl.txn_revenue),0)-nvl(sum(bl.txn_init_revenue),0);
71
72 -- This cursor gets distinct (resource_assignment_id,txn_currency_code)
73 -- values for any non-rate-based txns in the given budget version
74 -- (p_budget_version_id) that have existing txn-level rate overrides
75 -- but no (ETC) budget lines.
76 -- This cursor can be used for both timephased and non-timephased
77 -- Budgets and Forecasts, since a plan qty vs. actual qty check is
78 -- used (instead of relying on etc_start_date).
79 -- Also, the cursor considers both manually and non-manually added
80 -- lines since Update Case 2 applies to both cases.
81 -- For an explanation of why budget line rejection codes are not
82 -- checked by this cursor, refer to Closed Issue #2 in the comment
83 -- block for Update Case 2.
84
85 CURSOR nrb_txns_without_bl_csr IS
86 SELECT rbc.resource_assignment_id,
87 rbc.txn_currency_code
88 FROM pa_resource_assignments ra,
89 pa_resource_asgn_curr rbc
90 WHERE ra.budget_version_id = p_budget_version_id
91 AND ra.project_id = p_project_id
92 AND ra.rate_based_flag = 'N'
93 AND rbc.resource_assignment_id = ra.resource_assignment_id
94 AND NOT EXISTS
95 ( SELECT null
96 FROM pa_budget_lines bl
97 WHERE bl.resource_assignment_id = rbc.resource_assignment_id
98 AND bl.txn_currency_code = rbc.txn_currency_code
99 AND nvl(bl.quantity,0) <> nvl(bl.init_quantity,0) )
100 AND ( rbc.txn_raw_cost_rate_override is not null OR
101 rbc.txn_burden_cost_rate_override is not null OR
102 rbc.txn_bill_rate_override is not null );
103
104 l_res_asg_id_tab PA_PLSQL_DATATYPES.NumTabTyp;
105 l_txn_currency_code_tab PA_PLSQL_DATATYPES.Char30TabTyp;
106
107 -- This flag tracks if the pa_resource_asgn_curr_tmp global
108 -- temp table has been deleted/cleared yet.
109 l_rbc_tmp_tbl_deleted_flag VARCHAR2(1);
110
111 -- This flag tracks if calling maintain_data API in Insert
112 -- mode is required at the end of this procedure.
113 l_maint_data_ins_req_flag VARCHAR2(1);
114
115 -- This will be used for the p_calling_module parameter
116 -- of the MAINTAIN_DATA API.
117 l_calling_module VARCHAR2(30);
118
119 l_log_level NUMBER := 5;
120 l_msg_count NUMBER;
121 l_data VARCHAR2(1000);
122 l_msg_data VARCHAR2(1000);
123 l_msg_index_out NUMBER;
124 BEGIN
125 l_module_name := 'pa.plsql.' || l_package_name || '.' || l_procedure_name;
126
127 x_return_status := FND_API.G_RET_STS_SUCCESS;
128 x_msg_count := 0;
129
130 IF p_pa_debug_mode = 'Y' THEN
131 PA_DEBUG.SET_CURR_FUNCTION( p_function => l_procedure_name,
132 p_debug_mode => p_pa_debug_mode );
133 END IF;
134
135 -- Print values of Input Parameters to debug log
136 IF p_pa_debug_mode = 'Y' THEN
137 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG
138 ( p_msg => 'Input Parameters for '
139 || l_module_name || '():',
140 --p_called_mode => p_called_mode,
141 p_module_name => l_module_name,
142 p_log_level => l_log_level );
143 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG
144 ( p_msg => 'P_PROJECT_ID:['||p_project_id||']',
145 --p_called_mode => p_called_mode,
146 p_module_name => l_module_name,
147 p_log_level => l_log_level );
148 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG
149 ( p_msg => 'P_BUDGET_VERSION_ID:['||p_budget_version_id||']',
150 --p_called_mode => p_called_mode,
151 p_module_name => l_module_name,
152 p_log_level => l_log_level );
153 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG
154 ( p_msg => 'P_FP_COLS_REC.X_PLAN_CLASS_CODE:[' ||
155 p_fp_cols_rec.x_plan_class_code || ']',
156 --p_called_mode => p_called_mode,
157 p_module_name => l_module_name,
158 p_log_level => l_log_level );
159 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG
160 ( p_msg => 'P_FP_COLS_REC.X_VERSION_TYPE:[' ||
161 p_fp_cols_rec.x_version_type || ']',
162 --p_called_mode => p_called_mode,
163 p_module_name => l_module_name,
164 p_log_level => l_log_level );
165 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG
166 ( p_msg => 'P_ETC_START_DATE:['||p_etc_start_date||']',
167 --p_called_mode => p_called_mode,
168 p_module_name => l_module_name,
169 p_log_level => l_log_level );
170 END IF; -- IF p_pa_debug_mode = 'Y' THEN
171
172 -- Validate input parameters
173 IF p_project_id is NULL OR
174 p_budget_version_id is NULL OR
175 ( p_etc_start_date is NULL AND
176 p_fp_cols_rec.x_plan_class_code = 'FORECAST' ) THEN
177 IF p_pa_debug_mode = 'Y' THEN
178 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG
179 ( p_msg => 'Input Parameter Validation FAILED',
180 --p_called_mode => p_called_mode,
181 p_module_name => l_module_name,
182 p_log_level => l_log_level );
183 PA_DEBUG.RESET_CURR_FUNCTION;
184 END IF;
185 RETURN;
186 END IF;
187
188 -- Initialize l_calling_module
189 IF p_fp_cols_rec.x_plan_class_code = 'BUDGET' THEN
190 l_calling_module := 'BUDGET_GENERATION';
191 ELSIF p_fp_cols_rec.x_plan_class_code = 'FORECAST' THEN
192 l_calling_module := 'FORECAST_GENERATION';
193 END IF;
194
195 -- Initialize l_rbc_tmp_tbl_deleted_flag.
196 -- Intended Usage:
197 -- Logic that deletes the pa_resource_asgn_curr_tmp
198 -- global temp table should set this flag to 'Y' so that
199 -- downstream code knows that the table has been cleared
200 -- by this procedure.
201 l_rbc_tmp_tbl_deleted_flag := 'N';
202
203 -- Initialize l_maint_data_ins_req_flag
204 -- Intended Usage:
205 -- Logic that requires the maintain_data API to be
206 -- called in Insert mode should set this flag to 'Y'.
207 -- The purpose of this flag is to group together all
208 -- txns that need to be updated so that maintain_data
209 -- can be called just once.
210 l_maint_data_ins_req_flag := 'N';
211
212 IF p_pa_debug_mode = 'Y' THEN
213 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG
214 ( p_msg => 'Beginning Update Case 1',
215 --p_called_mode => p_called_mode,
216 p_module_name => l_module_name,
217 p_log_level => l_log_level );
218 END IF;
219
220 /**
221 * Update Case 1:
222 * In Cost and Revenue together target versions
223 * for non-rate-based txns with only revenue amounts:
224 * a. Set bill rate override to 1
225 * b. Set cost rate overrides to 0
226 *
227 * Background:
228 * By default, quantity = txn_raw_cost for non-rate-based
229 * txns at the periodic line level. In IPM, it is possible
230 * to have non-rate-based txns with just revenue amounts
231 * (without cost amounts); quantity = txn_revenue in such
232 * cases. The problem is that when users update or refresh
233 * the revenue for such txns, the Calculate API defaults
234 * quantity to raw cost in the absence of txn-level rate
235 * overrides, which is functionally incorrect. If txn-level
236 * rate overrides are set according to (a) and (b) above,
237 * then the Calculate API behaves correctly.
238 **/
239 IF p_fp_cols_rec.x_version_type = 'ALL' THEN
240
241 -- Get distinct (resource_assignment_id,txn_currency_code)
242 -- values for non-rate-based txns having only revenue amounts.
243 OPEN rev_only_nrb_txns_csr;
244 FETCH rev_only_nrb_txns_csr
245 BULK COLLECT
246 INTO l_res_asg_id_tab,
247 l_txn_currency_code_tab;
248 CLOSE rev_only_nrb_txns_csr;
249
250 IF l_res_asg_id_tab.count > 0 THEN
251
252 l_maint_data_ins_req_flag := 'Y';
253
254 IF l_rbc_tmp_tbl_deleted_flag = 'N' THEN
255 DELETE pa_resource_asgn_curr_tmp;
256 l_rbc_tmp_tbl_deleted_flag := 'Y';
257
258 IF p_pa_debug_mode = 'Y' THEN
259 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG
260 ( p_msg => 'Records Deleted from pa_resource_asgn_curr_tmp',
261 --p_called_mode => p_called_mode,
262 p_module_name => l_module_name,
263 p_log_level => l_log_level );
264 END IF;
265 END IF; -- IF l_rbc_tmp_tbl_deleted_flag = 'N' THEN
266
267 FORALL i IN 1..l_res_asg_id_tab.count
268 INSERT INTO PA_RESOURCE_ASGN_CURR_TMP
269 ( resource_assignment_id,
270 txn_currency_code,
271 txn_raw_cost_rate_override,
272 txn_burden_cost_rate_override,
273 txn_bill_rate_override )
274 VALUES
275 ( l_res_asg_id_tab(i),
276 l_txn_currency_code_tab(i),
277 0, -- txn_raw_cost_rate_override
278 0, -- txn_burden_cost_rate_override
279 1 ); -- txn_bill_rate_override
280
281 IF p_pa_debug_mode = 'Y' THEN
282 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG
283 ( p_msg => 'Number of records Inserted into ' ||
284 'PA_RESOURCE_ASGN_CURR_TMP:['||sql%Rowcount||']',
285 --p_called_mode => p_called_mode,
286 p_module_name => l_module_name,
287 p_log_level => l_log_level );
288 END IF;
289 END IF; -- IF l_res_asg_id_tab.count > 0 THEN
290
291 END IF; -- IF p_fp_cols_rec.x_version_type = 'ALL' THEN
292 /* End Update Case 1 */
293
294 IF p_pa_debug_mode = 'Y' THEN
295 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG
296 ( p_msg => 'Beginning Update Case 2',
297 --p_called_mode => p_called_mode,
298 p_module_name => l_module_name,
299 p_log_level => l_log_level );
300 END IF;
301
302 /**
303 * Update Case 2:
304 * Null out any existing rate overrides for non-rate-based
305 * txns that do not have any budget lines.
306 *
307 * Background:
308 * In IPM, non-rate-based txns are considered 'amount-based'
309 * and rates are not functionally meaningful. Thus, internal
310 * txn-level rates are not displayed to users. When users
311 * enter amounts on a blank line (i.e. for a txn that does
312 * not have any budget lines), calculation of amounts should
313 * not be affected by old internal txn-level rates.
314 *
315 * Open/Closed Issues:
316 * 1. Does this apply only to ETC budget lines?
317 * Answer: Yes. Since actuals are read-only, the absence of
318 * ETC budget lines would fall under the blank line scenario.
319 * 2. Should this consider only lines w/o rejections?
320 * Answer: No. Here's an example where rates should be retained:
321 * Src/Tgt options match. Src has cost rate overrides
322 * that get copied to tgt. However, bill rate is missing
323 * for the txn, so revenue_rejection_code stamped. We
324 * should not null out the cost rates in this case.
325 **/
326
327 -- Get distinct (resource_assignment_id,txn_currency_code)
328 -- values for non-rate-based txns that have existing txn-level
329 -- rate overrides but no (ETC) budget lines.
330 OPEN nrb_txns_without_bl_csr;
331 FETCH nrb_txns_without_bl_csr
332 BULK COLLECT
333 INTO l_res_asg_id_tab,
334 l_txn_currency_code_tab;
335 CLOSE nrb_txns_without_bl_csr;
336
337 IF l_res_asg_id_tab.count > 0 THEN
338
339 l_maint_data_ins_req_flag := 'Y';
340
341 IF l_rbc_tmp_tbl_deleted_flag = 'N' THEN
342 DELETE pa_resource_asgn_curr_tmp;
343 l_rbc_tmp_tbl_deleted_flag := 'Y';
344
345 IF p_pa_debug_mode = 'Y' THEN
346 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG
347 ( p_msg => 'Records Deleted from pa_resource_asgn_curr_tmp',
348 --p_called_mode => p_called_mode,
349 p_module_name => l_module_name,
350 p_log_level => l_log_level );
351 END IF;
352 END IF; -- IF l_rbc_tmp_tbl_deleted_flag = 'N' THEN
353
354 -- Because the planning txns involved in Update Case 1
355 -- and Update Case 2 are mutually exclusive, no extra
356 -- logic needs to be added to avoid duplicate records
357 -- begin inserted into pa_resource_asgn_curr_tmp.
358 --
359 -- In the future, if additional Update Cases with
360 -- overlapping txns are added, then a precedence of
361 -- updates will need to be determined with corresponding
362 -- updates to the global temporary table.
363
364 -- Note: all rate overrides are implicitly set to Null.
365 FORALL i IN 1..l_res_asg_id_tab.count
366 INSERT INTO PA_RESOURCE_ASGN_CURR_TMP
367 ( resource_assignment_id,
368 txn_currency_code )
369 VALUES
370 ( l_res_asg_id_tab(i),
371 l_txn_currency_code_tab(i) );
372
373 IF p_pa_debug_mode = 'Y' THEN
374 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG
375 ( p_msg => 'Number of records Inserted into ' ||
376 'PA_RESOURCE_ASGN_CURR_TMP:['||sql%Rowcount||']',
377 --p_called_mode => p_called_mode,
378 p_module_name => l_module_name,
379 p_log_level => l_log_level );
380 END IF;
381 END IF; -- IF l_res_asg_id_tab.count > 0 THEN
382 /* End Update Case 2 */
383
384
385 -- Call MAINTAIN_DATA to Insert rate overrides into the
386 -- pa_resource_asgn_curr table if required.
387 -- Note: temp table data should be completed populated
388 -- by this point by the preceding Update Cases.
389
390 IF l_maint_data_ins_req_flag = 'Y' THEN
391
392 -- Call the maintenance api in INSERT mode
393 IF p_pa_debug_mode = 'Y' THEN
394 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
395 P_MSG => 'Before calling PA_RES_ASG_CURRENCY_PUB.' ||
396 'MAINTAIN_DATA',
397 --P_CALLED_MODE => p_called_mode,
398 P_MODULE_NAME => l_module_name);
399 END IF;
400 PA_RES_ASG_CURRENCY_PUB.MAINTAIN_DATA
401 ( P_FP_COLS_REC => p_fp_cols_rec,
402 P_CALLING_MODULE => l_calling_module,
403 P_VERSION_LEVEL_FLAG => 'N',
404 P_ROLLUP_FLAG => 'N', -- 'N' indicates Insert
405 --P_CALLED_MODE => p_called_mode,
406 X_RETURN_STATUS => x_return_status,
407 X_MSG_COUNT => x_msg_count,
408 X_MSG_DATA => x_msg_data );
409 IF p_pa_debug_mode = 'Y' THEN
410 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
411 P_MSG => 'After calling PA_RES_ASG_CURRENCY_PUB.' ||
412 'MAINTAIN_DATA: '||x_return_status,
413 --P_CALLED_MODE => p_called_mode,
414 P_MODULE_NAME => l_module_name);
415 END IF;
416 IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
417 raise PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
418 END IF;
419
420 END IF; -- IF l_maint_data_ins_req_flag = 'Y' THEN
421
422 IF p_pa_debug_mode = 'Y' THEN
423 PA_DEBUG.RESET_CURR_FUNCTION;
424 END IF;
425 EXCEPTION
426 WHEN PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc THEN
427 l_msg_count := FND_MSG_PUB.count_msg;
428 IF l_msg_count = 1 THEN
429 PA_INTERFACE_UTILS_PUB.GET_MESSAGES
430 ( p_encoded => FND_API.G_TRUE,
431 p_msg_index => 1,
432 p_msg_count => l_msg_count,
433 p_msg_data => l_msg_data,
434 p_data => l_data,
435 p_msg_index_out => l_msg_index_out);
436 x_msg_data := l_data;
437 x_msg_count := l_msg_count;
438 ELSE
439 x_msg_count := l_msg_count;
440 END IF;
441
442 ROLLBACK;
443 x_return_status := FND_API.G_RET_STS_ERROR;
444
445 IF p_pa_debug_mode = 'Y' THEN
446 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG
447 (p_msg => 'Invalid Arguments Passed',
448 p_module_name => l_module_name,
449 p_log_level => 5);
450 PA_DEBUG.RESET_CURR_FUNCTION;
451 END IF;
452 RAISE;
453 WHEN OTHERS THEN
454 ROLLBACK;
455 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
456 x_msg_count := 1;
457 x_msg_data := substr(sqlerrm,1,240);
458 FND_MSG_PUB.ADD_EXC_MSG
459 ( p_pkg_name => l_package_name,
460 p_procedure_name => l_procedure_name,
461 p_error_text => substr(sqlerrm,1,240));
462
463 IF p_pa_debug_mode = 'Y' THEN
464 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG
465 (p_msg => 'Unexpected Error'||substr(sqlerrm, 1, 240),
466 p_module_name => l_module_name,
467 p_log_level => 5);
468 PA_DEBUG.RESET_CURR_FUNCTION;
469 END IF;
470 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
471
472 END UPD_NRB_TXN_OVR_RATES;
473
474
475 /**
476 * This procedure populates the PA_FP_GEN_RATE_TMP table with values from the
477 * PA_BUDGET_LINES table for the given (source resource assignment, txn currency code)
478 * parameter combination.
479 *
480 * The target resource assignment id is currently unused.
481 */
482 PROCEDURE POPULATE_GEN_RATE
483 (P_SOURCE_RES_ASG_ID IN PA_BUDGET_LINES.RESOURCE_ASSIGNMENT_ID%TYPE,
484 P_TARGET_RES_ASG_ID IN PA_BUDGET_LINES.RESOURCE_ASSIGNMENT_ID%TYPE,
485 P_TXN_CURRENCY_CODE IN PA_BUDGET_LINES.TXN_CURRENCY_CODE%TYPE,
486 X_RETURN_STATUS OUT NOCOPY VARCHAR2,
487 X_MSG_COUNT OUT NOCOPY NUMBER,
488 X_MSG_DATA OUT NOCOPY VARCHAR2)
489 IS
490 l_package_name VARCHAR2(30) := 'PA_FP_GEN_FCST_AMT_PUB1';
491 l_procedure_name VARCHAR2(30) := 'POPULATE_GEN_RATE';
492 l_module_name VARCHAR2(100);
493
494 CURSOR bl_rates_cur (c_res_asg_id PA_BUDGET_LINES.RESOURCE_ASSIGNMENT_ID%TYPE) IS
495 SELECT bl.period_name,
496 NVL(bl.txn_cost_rate_override,bl.txn_standard_cost_rate),
497 NVL(bl.burden_cost_rate_override,bl.burden_cost_rate),
498 NVL(bl.txn_bill_rate_override,bl.txn_standard_bill_rate)
499 FROM pa_budget_lines bl
500 WHERE bl.resource_assignment_id = c_res_asg_id
501 AND bl.txn_currency_code = p_txn_currency_code;
502
503 l_period_name_tab PA_PLSQL_DATATYPES.Char30TabTyp;
504 l_raw_cost_rate_tab PA_PLSQL_DATATYPES.NumTabTyp;
505 l_burdened_cost_rate_tab PA_PLSQL_DATATYPES.NumTabTyp;
506 l_revenue_bill_rate_tab PA_PLSQL_DATATYPES.NumTabTyp;
507 l_count NUMBER;
508 l_msg_count NUMBER;
509 l_data VARCHAR2(1000);
510 l_msg_data VARCHAR2(1000);
511 l_msg_index_out NUMBER;
512 BEGIN
513 l_module_name := 'pa.plsql.' || l_package_name || '.' || l_procedure_name;
514
515 x_return_status := FND_API.G_RET_STS_SUCCESS;
516 x_msg_count := 0;
517
518 IF p_pa_debug_mode = 'Y' THEN
519 PA_DEBUG.SET_CURR_FUNCTION( p_function => l_procedure_name,
520 p_debug_mode => p_pa_debug_mode );
521 END IF;
522
523 IF p_source_res_asg_id IS NULL OR p_txn_currency_code is NULL THEN
524 IF p_pa_debug_mode = 'Y' THEN
525 PA_DEBUG.RESET_CURR_FUNCTION;
526 END IF;
527 RETURN;
528 END IF;
529
530 /* Get data for Source resource assignment */
531 OPEN bl_rates_cur ( p_source_res_asg_id );
532 FETCH bl_rates_cur
533 BULK COLLECT
534 INTO l_period_name_tab,
535 l_raw_cost_rate_tab,
536 l_burdened_cost_rate_tab,
537 l_revenue_bill_rate_tab;
538 CLOSE bl_rates_cur;
539
540 /* Bug 4117267 added TARGET_RES_ASG_ID column in the INSERT stmt. */
541
542 FORALL i IN 1..l_period_name_tab.count
543 INSERT INTO PA_FP_GEN_RATE_TMP
544 ( SOURCE_RES_ASG_ID,
545 TXN_CURRENCY_CODE,
546 PERIOD_NAME,
547 RAW_COST_RATE,
548 BURDENED_COST_RATE,
549 REVENUE_BILL_RATE,
550 TARGET_RES_ASG_ID)
551 VALUES
552 ( p_source_res_asg_id,
553 p_txn_currency_code,
554 l_period_name_tab(i),
555 l_raw_cost_rate_tab(i),
556 l_burdened_cost_rate_tab(i),
557 l_revenue_bill_rate_tab(i),
558 p_target_res_asg_id );
559
560 IF p_pa_debug_mode = 'Y' THEN
561 PA_DEBUG.RESET_CURR_FUNCTION;
562 END IF;
563 EXCEPTION
564 WHEN PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc THEN
565 l_msg_count := FND_MSG_PUB.count_msg;
566 IF l_msg_count = 1 THEN
567 PA_INTERFACE_UTILS_PUB.GET_MESSAGES
568 ( p_encoded => FND_API.G_TRUE,
569 p_msg_index => 1,
570 p_msg_count => l_msg_count,
571 p_msg_data => l_msg_data,
572 p_data => l_data,
573 p_msg_index_out => l_msg_index_out);
574 x_msg_data := l_data;
575 x_msg_count := l_msg_count;
576 ELSE
577 x_msg_count := l_msg_count;
578 END IF;
579
580 ROLLBACK;
581 x_return_status := FND_API.G_RET_STS_ERROR;
582
583 IF p_pa_debug_mode = 'Y' THEN
584 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG
585 (p_msg => 'Invalid Arguments Passed',
586 p_module_name => l_module_name,
587 p_log_level => 5);
588 PA_DEBUG.RESET_CURR_FUNCTION;
589 END IF;
590 RAISE;
591 WHEN OTHERS THEN
592 ROLLBACK;
593 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
594 x_msg_count := 1;
595 x_msg_data := substr(sqlerrm,1,240);
596 FND_MSG_PUB.ADD_EXC_MSG
597 ( p_pkg_name => l_package_name,
598 p_procedure_name => l_procedure_name,
599 p_error_text => substr(sqlerrm,1,240));
600
601 IF p_pa_debug_mode = 'Y' THEN
602 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG
603 (p_msg => 'Unexpected Error'||substr(sqlerrm, 1, 240),
604 p_module_name => l_module_name,
605 p_log_level => 5);
606 PA_DEBUG.RESET_CURR_FUNCTION;
607 END IF;
608 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
609
610 END POPULATE_GEN_RATE;
611
612
613 /**
614 * This procedure checks for rate-based target txns that have source txns in
615 * different units of measurement mapped to them. Such target txns are updated
616 * in the pa_resource_assignments table to be non rate-based with UOM equal to
617 * currency.
618 *
619 * Currently the P_FP_COLS_REC parameter is unused. This, however, will likely
620 * change with future modifications.
621 */
622 PROCEDURE CHK_UPD_RATE_BASED_FLAG
623 (P_BUDGET_VERSION_ID IN PA_BUDGET_VERSIONS.BUDGET_VERSION_ID%TYPE,
624 P_FP_COLS_REC IN PA_FP_GEN_AMOUNT_UTILS.FP_COLS,
625 X_RETURN_STATUS OUT NOCOPY VARCHAR2,
626 X_MSG_COUNT OUT NOCOPY NUMBER,
627 X_MSG_DATA OUT NOCOPY VARCHAR2)
628 IS
629 l_module_name VARCHAR2(200) := 'pa.plsql.pa_fp_gen_fcst_amt_pub1.chk_upd_rate_based_flag';
630
631 CURSOR get_res_asg_cur IS
632 SELECT /*+ INDEX(tmp,PA_FP_CALC_AMT_TMP1_N1)*/
633 DISTINCT(tmp.target_res_asg_id)
634 FROM pa_fp_calc_amt_tmp1 tmp,
635 pa_resource_assignments ra
636 WHERE ra.resource_assignment_id = tmp.target_res_asg_id
637 and ra.budget_version_id = p_budget_version_id
638 and ra.rate_based_flag = 'Y'
639 GROUP BY tmp.target_res_asg_id
640 HAVING COUNT(DISTINCT(tmp.unit_of_measure)) > 1;
641
642 l_res_asg_id_tab PA_PLSQL_DATATYPES.IdTabTyp;
643
644 l_currency_code CONSTANT PA_RESOURCE_ASSIGNMENTS.UNIT_OF_MEASURE%TYPE := 'DOLLARS';
645 l_last_updated_by NUMBER := FND_GLOBAL.user_id;
646 l_last_update_login NUMBER := FND_GLOBAL.login_id;
647
648 l_count NUMBER;
649 l_msg_count NUMBER;
650 l_data VARCHAR2(1000);
651 l_msg_data VARCHAR2(1000);
652 l_msg_index_out NUMBER;
653 BEGIN
654 x_return_status := FND_API.G_RET_STS_SUCCESS;
655 x_msg_count := 0;
656
657 IF p_pa_debug_mode = 'Y' THEN
658 PA_DEBUG.SET_CURR_FUNCTION( p_function => 'CHK_UPD_RATE_BASED_FLAG',
659 p_debug_mode => p_pa_debug_mode );
660 END IF;
661
662 OPEN get_res_asg_cur;
663 FETCH get_res_asg_cur
664 BULK COLLECT
665 INTO l_res_asg_id_tab;
666 CLOSE get_res_asg_cur;
667
668 IF l_res_asg_id_tab.count = 0 THEN
669 IF p_pa_debug_mode = 'Y' THEN
670 PA_DEBUG.RESET_CURR_FUNCTION;
671 END IF;
672 RETURN;
673 END IF;
674
675 FORALL i IN 1..l_res_asg_id_tab.count
676 UPDATE pa_resource_assignments
677 SET rate_based_flag = 'N',
678 unit_of_measure = l_currency_code,
679 last_update_date = SYSDATE,
680 last_updated_by = l_last_updated_by,
681 last_update_login = l_last_update_login
682 WHERE resource_assignment_id = l_res_asg_id_tab(i);
683
684 IF p_pa_debug_mode = 'Y' THEN
685 PA_DEBUG.RESET_CURR_FUNCTION;
686 END IF;
687 EXCEPTION
688 WHEN PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc THEN
689 l_msg_count := FND_MSG_PUB.count_msg;
690 IF l_msg_count = 1 THEN
691 PA_INTERFACE_UTILS_PUB.GET_MESSAGES
692 ( p_encoded => FND_API.G_TRUE,
693 p_msg_index => 1,
694 p_msg_count => l_msg_count,
695 p_msg_data => l_msg_data,
696 p_data => l_data,
697 p_msg_index_out => l_msg_index_out);
698 x_msg_data := l_data;
699 x_msg_count := l_msg_count;
700 ELSE
701 x_msg_count := l_msg_count;
702 END IF;
703
704 ROLLBACK;
705 x_return_status := FND_API.G_RET_STS_ERROR;
706
707 IF p_pa_debug_mode = 'Y' THEN
708 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG
709 (p_msg => 'Invalid Arguments Passed',
710 p_module_name => l_module_name,
711 p_log_level => 5);
712 PA_DEBUG.RESET_CURR_FUNCTION;
713 END IF;
714 RAISE;
715 WHEN OTHERS THEN
716 ROLLBACK;
717 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
718 x_msg_count := 1;
719 x_msg_data := substr(sqlerrm,1,240);
720 FND_MSG_PUB.ADD_EXC_MSG
721 ( p_pkg_name => 'PA_FP_GEN_FCST_AMT_PUB1',
722 p_procedure_name => 'CHK_UPD_RATE_BASED_FLAG',
723 p_error_text => substr(sqlerrm,1,240));
724
725 IF p_pa_debug_mode = 'Y' THEN
726 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG
727 (p_msg => 'Unexpected Error'||substr(sqlerrm, 1, 240),
728 p_module_name => l_module_name,
729 p_log_level => 5);
730 PA_DEBUG.RESET_CURR_FUNCTION;
731 END IF;
732 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
733
734 END CHK_UPD_RATE_BASED_FLAG;
735
736
737 /**As of now, this procedure will be called three times for 3 different sources,
738 *the taking param for P_DATA_TYPE_CODE are: ETC_FP, ETC_WP, TARGET_FP
739 *Instead of calling this 3 times, we need to verfity whether resource list
740 *are same between eitehr two or 3 of them. If they do, we only need to call
741 *this procedure 2 or 1 times, instead of 3.
742 *WILL BE CHANGED LATER**/
743 PROCEDURE CALL_SUMM_POP_TMPS
744 (P_PROJECT_ID IN PA_PROJECTS_ALL.PROJECT_ID%TYPE,
745 P_CALENDAR_TYPE IN VARCHAR2,
746 P_RECORD_TYPE IN VARCHAR2,
747 P_RESOURCE_LIST_ID IN NUMBER,
748 P_STRUCT_VER_ID IN NUMBER,
749 P_ACTUALS_THRU_DATE IN PA_PERIODS_ALL.END_DATE%TYPE,
750 P_DATA_TYPE_CODE IN VARCHAR2,
751 X_RETURN_STATUS OUT NOCOPY VARCHAR2,
752 X_MSG_COUNT OUT NOCOPY NUMBER,
753 X_MSG_DATA OUT NOCOPY VARCHAR2)
754 IS
755 l_module_name VARCHAR2(200) := 'pa.plsql.pa_fp_gen_fcst_amt_pub1.call_summ_pop_tmps';
756 l_project_id_tab SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
757 l_resource_list_id_tab SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
758 l_struct_ver_id_tab SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
759 l_calendar_type_tab SYSTEM.pa_varchar2_1_tbl_type := SYSTEM.pa_varchar2_1_tbl_type();
760 l_end_date_tab SYSTEM.pa_date_tbl_type := SYSTEM.pa_date_tbl_type();
761
762 l_msg_count NUMBER;
763 l_msg_data VARCHAR2(2000);
764 l_data VARCHAR2(2000);
765 l_msg_index_out NUMBER:=0;
766 l_count NUMBER;
767 l_rlm_id pa_resource_list_members.resource_list_member_id%TYPE;
768 l_uncategorized_flag VARCHAR2(1);
769 BEGIN
770 IF p_pa_debug_mode = 'Y' THEN
771 pa_debug.set_curr_function( p_function => 'CALL_SUMM_POP_TMPS',
772 p_debug_mode => p_pa_debug_mode);
773 END IF;
774 X_RETURN_STATUS := FND_API.G_RET_STS_SUCCESS;
775 X_MSG_COUNT := 0;
776
777 l_project_id_tab.extend;
778 l_resource_list_id_tab.extend;
779 l_struct_ver_id_tab.extend;
780 l_calendar_type_tab.extend;
781 l_end_date_tab.extend;
782 l_project_id_tab(1) := P_PROJECT_ID;
783 l_resource_list_id_tab(1) := P_RESOURCE_LIST_ID;
784 l_struct_ver_id_tab(1) := P_STRUCT_VER_ID;
785 l_calendar_type_tab(1) := P_CALENDAR_TYPE;
786 l_end_date_tab(1) := P_ACTUALS_THRU_DATE;
787
788 IF P_PA_DEBUG_MODE = 'Y' THEN
789 pa_fp_gen_amount_utils.fp_debug
790 (p_msg => 'Before calling PJI_FM_XBS_ACCUM_UTILS.get_summarized_data;'
791 ||'project id passed to get_summarized:'||l_project_id_tab(1)
792 ||'; resource_list_id:'||l_resource_list_id_tab(1)
793 ||'; structure version id:'||l_struct_ver_id_tab(1)
794 ||'; end date:'||p_actuals_thru_date
795 ||'; calendar type:'||p_calendar_type
796 ||'; record type:'||p_record_type,
797 p_module_name => l_module_name,
798 p_log_level => 5);
799 END IF;
800 --dbms_output.put_line('Before calling pji api');
801 --Calling PJI API to get table pji_fm_xbs_accum_tmp1 populated
802 PJI_FM_XBS_ACCUM_UTILS.get_summarized_data(
803 p_project_ids => l_project_id_tab,
804 p_resource_list_ids => l_resource_list_id_tab,
805 p_struct_ver_ids => l_struct_ver_id_tab,
806 p_start_date => NULL,
807 p_end_date => l_end_date_tab,
808 p_start_period_name => NULL,
809 p_end_period_name => NULL,
810 p_calendar_type => l_calendar_type_tab,
811 -- p_extraction_type => NULL,
812 -- p_calling_context => NULL,
813 p_record_type => p_record_type,
814 p_currency_type => 6,
815 x_return_status => x_return_status,
816 x_msg_code => x_msg_data);
817 IF P_PA_DEBUG_MODE = 'Y' THEN
818 pa_fp_gen_amount_utils.fp_debug
819 (p_msg => 'After calling PJI_FM_XBS_ACCUM_UTILS.get_summarized_data,
820 return status is:'||x_return_status,
821 p_module_name => l_module_name,
822 p_log_level => 5);
823 END IF;
824 select count(*) into l_count from PJI_FM_XBS_ACCUM_TMP1;
825 --hr_utility.trace('CALLSUM: After calling pji api, PJI_FM_XBS_ACCUM_TMP1 has:'|| l_count);
826 --hr_utility.trace('CALLSUM: After calling pji api: '||x_return_status);
827 IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
828 raise PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
829 END IF;
830
831 /* Update rlm_id for all rows in pji_fm_xbs_accum_tmp1 if the resource list
832 * (p_fp_cols_rec.X_RESOURCE_LIST_ID) is None - Uncategorized.
833 * This logic is not handled by the PJI generic resource mapping API. */
834
835 SELECT NVL(uncategorized_flag,'N')
836 INTO l_uncategorized_flag
837 FROM pa_resource_lists_all_bg
838 WHERE resource_list_id = p_resource_list_id;
839
840 IF l_uncategorized_flag = 'Y' THEN
841 l_rlm_id := PA_FP_GEN_AMOUNT_UTILS.GET_RLM_ID (
842 p_project_id => p_project_id,
843 p_resource_list_id => p_resource_list_id,
844 p_resource_class_code => 'FINANCIAL_ELEMENTS' );
845 UPDATE pji_fm_xbs_accum_tmp1
846 SET res_list_member_id = l_rlm_id;
847 END IF;
848
849 INSERT INTO PA_FP_FCST_GEN_TMP1 (
850 PROJECT_ID,
851 STRUCT_VERSION_ID,
852 PROJECT_ELEMENT_ID,
853 CALENDAR_TYPE,
854 PERIOD_NAME,
855 PLAN_VERSION_ID,
856 RES_LIST_MEMBER_ID,
857 QUANTITY,
858 TXN_CURRENCY_CODE,
859 TXN_RAW_COST,
860 TXN_BRDN_COST,
861 TXN_REVENUE,
862 TXN_LABOR_RAW_COST,
863 TXN_LABOR_BRDN_COST,
864 TXN_EQUIP_RAW_COST,
865 TXN_EQUIP_BRDN_COST,
866 TXN_BASE_RAW_COST,
867 TXN_BASE_BRDN_COST,
868 TXN_BASE_LABOR_RAW_COST,
869 TXN_BASE_LABOR_BRDN_COST,
870 TXN_BASE_EQUIP_RAW_COST,
871 TXN_BASE_EQUIP_BRDN_COST,
872 PRJ_RAW_COST,
873 PRJ_BRDN_COST,
874 PRJ_REVENUE,
875 PRJ_LABOR_RAW_COST,
876 PRJ_LABOR_BRDN_COST,
877 PRJ_EQUIP_RAW_COST,
878 PRJ_EQUIP_BRDN_COST,
879 PRJ_BASE_RAW_COST,
880 PRJ_BASE_BRDN_COST,
881 PRJ_BASE_LABOR_RAW_COST,
882 PRJ_BASE_LABOR_BRDN_COST,
883 PRJ_BASE_EQUIP_RAW_COST,
884 PRJ_BASE_EQUIP_BRDN_COST,
885 POU_RAW_COST,
886 POU_BRDN_COST,
887 POU_REVENUE,
888 POU_LABOR_RAW_COST,
889 POU_LABOR_BRDN_COST,
890 POU_EQUIP_RAW_COST,
891 POU_EQUIP_BRDN_COST,
892 POU_BASE_RAW_COST,
893 POU_BASE_BRDN_COST,
894 POU_BASE_LABOR_RAW_COST,
895 POU_BASE_LABOR_BRDN_COST,
896 POU_BASE_EQUIP_RAW_COST,
897 POU_BASE_EQUIP_BRDN_COST,
898 LABOR_HOURS,
899 EQUIPMENT_HOURS,
900 SOURCE_ID,
901 DATA_TYPE_CODE )
902 (SELECT PROJECT_ID,
903 STRUCT_VERSION_ID,
904 PROJECT_ELEMENT_ID,
905 CALENDAR_TYPE,
906 PERIOD_NAME,
907 PLAN_VERSION_ID,
908 RES_LIST_MEMBER_ID,
909 QUANTITY,
910 TXN_CURRENCY_CODE,
911 TXN_RAW_COST,
912 TXN_BRDN_COST,
913 TXN_REVENUE,
914 TXN_LABOR_RAW_COST,
915 TXN_LABOR_BRDN_COST,
916 TXN_EQUIP_RAW_COST,
917 TXN_EQUIP_BRDN_COST,
918 TXN_BASE_RAW_COST,
919 TXN_BASE_BRDN_COST,
920 TXN_BASE_LABOR_RAW_COST,
921 TXN_BASE_LABOR_BRDN_COST,
922 TXN_BASE_EQUIP_RAW_COST,
923 TXN_BASE_EQUIP_BRDN_COST,
924 PRJ_RAW_COST,
925 PRJ_BRDN_COST,
926 PRJ_REVENUE,
927 PRJ_LABOR_RAW_COST,
928 PRJ_LABOR_BRDN_COST,
929 PRJ_EQUIP_RAW_COST,
930 PRJ_EQUIP_BRDN_COST,
931 PRJ_BASE_RAW_COST,
932 PRJ_BASE_BRDN_COST,
933 PRJ_BASE_LABOR_RAW_COST,
934 PRJ_BASE_LABOR_BRDN_COST,
935 PRJ_BASE_EQUIP_RAW_COST,
936 PRJ_BASE_EQUIP_BRDN_COST,
937 POU_RAW_COST,
938 POU_BRDN_COST,
939 POU_REVENUE,
940 POU_LABOR_RAW_COST,
941 POU_LABOR_BRDN_COST,
942 POU_EQUIP_RAW_COST,
943 POU_EQUIP_BRDN_COST,
944 POU_BASE_RAW_COST,
945 POU_BASE_BRDN_COST,
946 POU_BASE_LABOR_RAW_COST,
947 POU_BASE_LABOR_BRDN_COST,
948 POU_BASE_EQUIP_RAW_COST,
949 POU_BASE_EQUIP_BRDN_COST,
950 LABOR_HOURS,
951 EQUIPMENT_HOURS,
952 SOURCE_ID,
953 P_DATA_TYPE_CODE
954 FROM PJI_FM_XBS_ACCUM_TMP1 );
955 IF p_pa_debug_mode = 'Y' THEN
956 PA_DEBUG.Reset_Curr_Function;
957 END IF;
958 EXCEPTION
959 WHEN PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc THEN
960 l_msg_count := FND_MSG_PUB.count_msg;
961 IF l_msg_count = 1 THEN
962 PA_INTERFACE_UTILS_PUB.get_messages
963 (p_encoded => FND_API.G_TRUE
964 ,p_msg_index => 1
965 ,p_msg_count => l_msg_count
966 ,p_msg_data => l_msg_data
967 ,p_data => l_data
968 ,p_msg_index_out => l_msg_index_out);
969 x_msg_data := l_data;
970 x_msg_count := l_msg_count;
971 ELSE
972 x_msg_count := l_msg_count;
973 END IF;
974 ROLLBACK;
975
976 x_return_status := FND_API.G_RET_STS_ERROR;
977 IF P_PA_DEBUG_MODE = 'Y' THEN
978 pa_fp_gen_amount_utils.fp_debug
979 (p_msg => 'Invalid Arguments Passed',
980 p_module_name => l_module_name,
981 p_log_level => 5);
982 PA_DEBUG.Reset_Curr_Function;
983 END IF;
984 RAISE;
985
986 WHEN OTHERS THEN
987 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
988 x_msg_data := SUBSTR(SQLERRM,1,240);
989 FND_MSG_PUB.add_exc_msg
990 ( p_pkg_name => 'PA_FP_GEN_FCST_AMT_PUB1'
991 ,p_procedure_name => 'CALL_SUMM_POP_TMPS');
992 IF P_PA_DEBUG_MODE = 'Y' THEN
993 pa_fp_gen_amount_utils.fp_debug
994 (p_msg => 'Unexpected Error'||substr(sqlerrm, 1, 240),
995 p_module_name => l_module_name,
996 p_log_level => 5);
997 PA_DEBUG.Reset_Curr_Function;
998 END IF;
999 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1000 END CALL_SUMM_POP_TMPS;
1001
1002 PROCEDURE GEN_AVERAGE_OF_ACTUALS_WRP
1003 (P_BUDGET_VERSION_ID IN PA_BUDGET_VERSIONS.BUDGET_VERSION_ID%TYPE,
1004 P_TASK_ID IN PA_RESOURCE_ASSIGNMENTS.TASK_ID%TYPE,
1005 P_ACTUALS_THRU_DATE IN DATE,
1006 P_FP_COLS_REC IN PA_FP_GEN_AMOUNT_UTILS.FP_COLS,
1007 P_ACTUALS_FROM_PERIOD IN PA_PERIODS_ALL.PERIOD_NAME%TYPE,
1008 P_ACTUALS_TO_PERIOD IN PA_PERIODS_ALL.PERIOD_NAME%TYPE,
1009 P_ETC_FROM_PERIOD IN PA_PERIODS_ALL.PERIOD_NAME%TYPE,
1010 P_ETC_TO_PERIOD IN PA_PERIODS_ALL.PERIOD_NAME%TYPE,
1011 X_RETURN_STATUS OUT NOCOPY VARCHAR2,
1012 X_MSG_COUNT OUT NOCOPY NUMBER,
1013 X_MSG_DATA OUT NOCOPY VARCHAR2)
1014 IS
1015 l_module_name VARCHAR2(200) := 'pa.plsql.PA_FP_GEN_FCST_AMT_PUB1.GEN_AVERAGE_OF_ACTUALS_WRP';
1016 l_task_id_flag VARCHAR2(1);
1017 CURSOR get_res_asg_cur(c_task_id_flag VARCHAR2) IS
1018 SELECT ra.resource_assignment_id,
1019 ra.resource_list_member_id,
1020 ra.planning_start_date,
1021 ra.planning_end_date,
1022 p_task_id
1023 FROM pa_resource_assignments ra
1024 WHERE c_task_id_flag = 'Y' AND
1025 ra.budget_version_id = P_BUDGET_VERSION_ID
1026 AND ra.task_id = P_TASK_ID
1027 UNION ALL
1028 SELECT ra.resource_assignment_id,
1029 ra.resource_list_member_id,
1030 ra.planning_start_date,
1031 ra.planning_end_date,
1032 ra.task_id
1033 FROM pa_resource_assignments ra
1034 WHERE c_task_id_flag = 'N' AND
1035 ra.budget_version_id = P_BUDGET_VERSION_ID;
1036
1037 -- Bug 4040832, 3970800: Modified project-level cursor to get
1038 -- actuals data from PJI table instead of target budget lines.
1039 CURSOR get_res_asg_cur_proj IS
1040 SELECT /*+ INDEX(tmp,PA_FP_FCST_GEN_TMP1_N1)*/
1041 DISTINCT ra.resource_assignment_id,
1042 tmp.res_list_member_id,
1043 ra.planning_start_date,
1044 ra.planning_end_date,
1045 tmp.project_element_id
1046 FROM PA_FP_FCST_GEN_TMP1 tmp,
1047 pa_resource_assignments ra
1048 WHERE tmp.project_element_id = p_task_id AND
1049 ra.budget_version_id = P_BUDGET_VERSION_ID AND
1050 NVL(ra.task_id,0) = 0 AND
1051 ra.resource_list_member_id = tmp.res_list_member_id;
1052
1053 -- Bug 4237961: The following 4 cursors have been added for the
1054 -- Retain Manually Added Lines logic (_ml) for PA/GL and None (_none).
1055
1056 CURSOR get_res_asg_cur_ml(c_task_id_flag VARCHAR2) IS
1057 SELECT ra.resource_assignment_id,
1058 ra.resource_list_member_id,
1059 ra.planning_start_date,
1060 ra.planning_end_date,
1061 p_task_id
1062 FROM pa_resource_assignments ra
1063 WHERE c_task_id_flag = 'Y' AND
1064 ra.budget_version_id = P_BUDGET_VERSION_ID
1065 AND ra.task_id = P_TASK_ID
1066 AND ( ra.transaction_source_code IS NOT NULL
1067 OR ( ra.transaction_source_code IS NULL
1068 AND NOT EXISTS ( SELECT 1
1069 FROM pa_budget_lines bl
1070 WHERE bl.resource_assignment_id =
1071 ra.resource_assignment_id
1072 AND bl.start_date > p_actuals_thru_date
1073 AND rownum < 2 )))
1074 UNION ALL
1075 SELECT ra.resource_assignment_id,
1076 ra.resource_list_member_id,
1077 ra.planning_start_date,
1078 ra.planning_end_date,
1079 ra.task_id
1080 FROM pa_resource_assignments ra
1081 WHERE c_task_id_flag = 'N' AND
1082 ra.budget_version_id = P_BUDGET_VERSION_ID
1083 AND ( ra.transaction_source_code IS NOT NULL
1084 OR ( ra.transaction_source_code IS NULL
1085 AND NOT EXISTS ( SELECT 1
1086 FROM pa_budget_lines bl
1087 WHERE bl.resource_assignment_id =
1088 ra.resource_assignment_id
1089 AND bl.start_date > p_actuals_thru_date
1090 AND rownum < 2 )));
1091
1092 CURSOR get_res_asg_cur_ml_none(c_task_id_flag VARCHAR2) IS
1093 SELECT ra.resource_assignment_id,
1094 ra.resource_list_member_id,
1095 ra.planning_start_date,
1096 ra.planning_end_date,
1097 p_task_id
1098 FROM pa_resource_assignments ra
1099 WHERE c_task_id_flag = 'Y' AND
1100 ra.budget_version_id = P_BUDGET_VERSION_ID
1101 AND ra.task_id = P_TASK_ID
1102 AND ( ra.transaction_source_code IS NOT NULL
1103 OR ( ra.transaction_source_code IS NULL
1104 AND NOT EXISTS ( SELECT 1
1105 FROM pa_budget_lines bl
1106 WHERE bl.resource_assignment_id =
1107 ra.resource_assignment_id
1108 AND NVL(quantity,0) <> NVL(init_quantity,0)
1109 AND rownum < 2 )))
1110 UNION ALL
1111 SELECT ra.resource_assignment_id,
1112 ra.resource_list_member_id,
1113 ra.planning_start_date,
1114 ra.planning_end_date,
1115 ra.task_id
1116 FROM pa_resource_assignments ra
1117 WHERE c_task_id_flag = 'N' AND
1118 ra.budget_version_id = P_BUDGET_VERSION_ID
1119 AND ( ra.transaction_source_code IS NOT NULL
1120 OR ( ra.transaction_source_code IS NULL
1121 AND NOT EXISTS ( SELECT 1
1122 FROM pa_budget_lines bl
1123 WHERE bl.resource_assignment_id =
1124 ra.resource_assignment_id
1125 AND NVL(quantity,0) <> NVL(init_quantity,0)
1126 AND rownum < 2 )));
1127
1128 CURSOR get_res_asg_cur_proj_ml IS
1129 SELECT /*+ INDEX(tmp,PA_FP_FCST_GEN_TMP1_N1)*/
1130 DISTINCT ra.resource_assignment_id,
1131 tmp.res_list_member_id,
1132 ra.planning_start_date,
1133 ra.planning_end_date,
1134 tmp.project_element_id
1135 FROM PA_FP_FCST_GEN_TMP1 tmp,
1136 pa_resource_assignments ra
1137 WHERE tmp.project_element_id = p_task_id AND
1138 ra.budget_version_id = P_BUDGET_VERSION_ID AND
1139 NVL(ra.task_id,0) = 0 AND
1140 ra.resource_list_member_id = tmp.res_list_member_id
1141 AND ( ra.transaction_source_code IS NOT NULL
1142 OR ( ra.transaction_source_code IS NULL
1143 AND NOT EXISTS ( SELECT 1
1144 FROM pa_budget_lines bl
1145 WHERE bl.resource_assignment_id =
1146 ra.resource_assignment_id
1147 AND bl.start_date > p_actuals_thru_date
1148 AND rownum < 2 )));
1149
1150 CURSOR get_res_asg_cur_proj_ml_none IS
1151 SELECT /*+ INDEX(tmp,PA_FP_FCST_GEN_TMP1_N1)*/
1152 DISTINCT ra.resource_assignment_id,
1153 tmp.res_list_member_id,
1154 ra.planning_start_date,
1155 ra.planning_end_date,
1156 tmp.project_element_id
1157 FROM PA_FP_FCST_GEN_TMP1 tmp,
1158 pa_resource_assignments ra
1159 WHERE tmp.project_element_id = p_task_id AND
1160 ra.budget_version_id = P_BUDGET_VERSION_ID AND
1161 NVL(ra.task_id,0) = 0 AND
1162 ra.resource_list_member_id = tmp.res_list_member_id
1163 AND ( ra.transaction_source_code IS NOT NULL
1164 OR ( ra.transaction_source_code IS NULL
1165 AND NOT EXISTS ( SELECT 1
1166 FROM pa_budget_lines bl
1167 WHERE bl.resource_assignment_id =
1168 ra.resource_assignment_id
1169 AND NVL(quantity,0) <> NVL(init_quantity,0)
1170 AND rownum < 2 )));
1171
1172 --Cursor used to select the start_date for PA periods
1173 CURSOR pa_start_date_csr(c_period PA_PERIODS_ALL.PERIOD_NAME%TYPE) IS
1174 SELECT start_date
1175 FROM pa_periods_all
1176 WHERE period_name = c_period
1177 AND org_id = p_fp_cols_rec.x_org_id;
1178
1179 --Cursor used to select the start_date for GL periods
1180 CURSOR gl_start_date_csr(c_period PA_PERIODS_ALL.PERIOD_NAME%TYPE) IS
1181 SELECT start_date
1182 FROM gl_period_statuses
1183 WHERE period_name = c_period
1184 AND application_id = PA_PERIOD_PROCESS_PKG.Application_id
1185 AND set_of_books_id = p_fp_cols_rec.x_set_of_books_id
1186 AND adjustment_period_flag = 'N';
1187
1188 l_res_asg_id_tab PA_PLSQL_DATATYPES.IdTabTyp;
1189 l_rlm_id_tab PA_PLSQL_DATATYPES.IdTabTyp;
1190 l_task_id_tab PA_PLSQL_DATATYPES.IdTabTyp;
1191 l_currency_code PA_BUDGET_LINES.TXN_CURRENCY_CODE%TYPE;
1192 l_planning_start_date_tab PA_PLSQL_DATATYPES.DateTabTyp;
1193 l_planning_end_date_tab PA_PLSQL_DATATYPES.DateTabTyp;
1194
1195 l_actual_from_date PA_PERIODS_ALL.START_DATE%TYPE;
1196 l_actual_to_date PA_PERIODS_ALL.START_DATE%TYPE;
1197 l_currency_count NUMBER;
1198 l_currency_flag VARCHAR2(2);
1199
1200 l_msg_count NUMBER;
1201 l_msg_data VARCHAR2(2000);
1202 l_data VARCHAR2(2000);
1203 l_msg_index_out NUMBER:=0;
1204 BEGIN
1205 IF p_pa_debug_mode = 'Y' THEN
1206 pa_debug.set_curr_function( p_function => 'GEN_AVERAGE_OF_ACTUALS_WRP',
1207 p_debug_mode => p_pa_debug_mode);
1208 END IF;
1209 X_RETURN_STATUS := FND_API.G_RET_STS_SUCCESS;
1210 X_MSG_COUNT := 0;
1211
1212 IF p_task_id IS NULL THEN
1213 l_task_id_flag := 'N';
1214 ELSE
1215 l_task_id_flag := 'Y';
1216 END IF;
1217
1218 /* Getting the start_date for given actual period based on time phase code */
1219 IF p_fp_cols_rec.x_time_phased_code = 'P' THEN
1220 /* Getting the actual_from_date for the given actual_from_period(PA Period) */
1221 OPEN pa_start_date_csr(p_actuals_from_period);
1222 FETCH pa_start_date_csr
1223 INTO l_actual_from_date;
1224 CLOSE pa_start_date_csr;
1225 /* Getting the actual_to_date for the given actual_to_period(PA Period) */
1226 OPEN pa_start_date_csr(p_actuals_to_period);
1227 FETCH pa_start_date_csr
1228 INTO l_actual_to_date;
1229 CLOSE pa_start_date_csr;
1230 ELSIF p_fp_cols_rec.x_time_phased_code = 'G' THEN
1231 /* Getting the actual_from_date for the given actual_from_period(GL Period) */
1232 OPEN gl_start_date_csr(p_actuals_from_period);
1233 FETCH gl_start_date_csr
1234 INTO l_actual_from_date;
1235 CLOSE gl_start_date_csr;
1236 /* Getting the actual_to_date for the given actual_to_period(GL Period) */
1237 OPEN gl_start_date_csr(p_actuals_to_period);
1238 FETCH gl_start_date_csr
1239 INTO l_actual_to_date;
1240 CLOSE gl_start_date_csr;
1241 END IF;
1242
1243 -- Bug 4233720 : When the Target version is Revenue with ETC Source of
1244 -- Average of Actuals, we should not go with the project-level cursor.
1245 -- Instead, we should use get_res_asg_cur to get all the resource
1246 -- assignments. In this case, p_task_id will be passed as Null, so
1247 -- l_task_id_flag will be 'Y'.
1248
1249 IF p_fp_cols_rec.x_gen_ret_manual_line_flag = 'N' THEN
1250 IF P_FP_COLS_REC.X_FIN_PLAN_LEVEL_CODE = 'P' AND
1251 NOT ( P_FP_COLS_REC.X_VERSION_TYPE = 'REVENUE' AND
1252 P_FP_COLS_REC.X_GEN_ETC_SRC_CODE = 'AVERAGE_ACTUALS' ) THEN
1253 OPEN get_res_asg_cur_proj;
1254 FETCH get_res_asg_cur_proj
1255 BULK COLLECT
1256 INTO l_res_asg_id_tab,
1257 l_rlm_id_tab,
1258 l_planning_start_date_tab,
1259 l_planning_end_date_tab,
1260 l_task_id_tab;
1261 CLOSE get_res_asg_cur_proj;
1262 ELSE
1263 OPEN get_res_asg_cur(l_task_id_flag);
1264 FETCH get_res_asg_cur
1265 BULK COLLECT
1266 INTO l_res_asg_id_tab,
1267 l_rlm_id_tab,
1268 l_planning_start_date_tab,
1269 l_planning_end_date_tab,
1270 l_task_id_tab;
1271 CLOSE get_res_asg_cur;
1272 END IF;
1273 ELSIF p_fp_cols_rec.x_gen_ret_manual_line_flag = 'Y' THEN
1274 -- Bug 4237961: In addition to the IF/ELSE logic from the Retain
1275 -- Manual Flag = 'N' case, check the Target time phase code. If
1276 -- PA/GL, then use the _ml version of the cursor. If None time
1277 -- phase, then use the _ml_none version of the cursor.
1278 IF P_FP_COLS_REC.X_FIN_PLAN_LEVEL_CODE = 'P' AND
1279 NOT ( P_FP_COLS_REC.X_VERSION_TYPE = 'REVENUE' AND
1280 P_FP_COLS_REC.X_GEN_ETC_SRC_CODE = 'AVERAGE_ACTUALS' ) THEN
1281 IF p_fp_cols_rec.x_time_phased_code IN ('P','G') THEN
1282 OPEN get_res_asg_cur_proj_ml;
1283 FETCH get_res_asg_cur_proj_ml
1284 BULK COLLECT
1285 INTO l_res_asg_id_tab,
1286 l_rlm_id_tab,
1287 l_planning_start_date_tab,
1288 l_planning_end_date_tab,
1289 l_task_id_tab;
1290 CLOSE get_res_asg_cur_proj_ml;
1291 ELSIF p_fp_cols_rec.x_time_phased_code = 'N' THEN
1292 OPEN get_res_asg_cur_proj_ml_none;
1293 FETCH get_res_asg_cur_proj_ml_none
1294 BULK COLLECT
1295 INTO l_res_asg_id_tab,
1296 l_rlm_id_tab,
1297 l_planning_start_date_tab,
1298 l_planning_end_date_tab,
1299 l_task_id_tab;
1300 CLOSE get_res_asg_cur_proj_ml_none;
1301 END IF;
1302 ELSE
1303 IF p_fp_cols_rec.x_time_phased_code IN ('P','G') THEN
1304 OPEN get_res_asg_cur_ml(l_task_id_flag);
1305 FETCH get_res_asg_cur_ml
1306 BULK COLLECT
1307 INTO l_res_asg_id_tab,
1308 l_rlm_id_tab,
1309 l_planning_start_date_tab,
1310 l_planning_end_date_tab,
1311 l_task_id_tab;
1312 CLOSE get_res_asg_cur_ml;
1313 ELSIF p_fp_cols_rec.x_time_phased_code = 'N' THEN
1314 OPEN get_res_asg_cur_ml_none(l_task_id_flag);
1315 FETCH get_res_asg_cur_ml_none
1316 BULK COLLECT
1317 INTO l_res_asg_id_tab,
1318 l_rlm_id_tab,
1319 l_planning_start_date_tab,
1320 l_planning_end_date_tab,
1321 l_task_id_tab;
1322 CLOSE get_res_asg_cur_ml_none;
1323 END IF;
1324 END IF;
1325 END IF;
1326
1327 IF l_res_asg_id_tab.count = 0 THEN
1328 IF P_PA_DEBUG_MODE = 'Y' THEN
1329 pa_fp_gen_amount_utils.fp_debug
1330 (p_msg => 'inside GEN_AVERAGE_OF_ACTUALS_WRP,no res asg, return...',
1331 p_module_name => l_module_name,
1332 p_log_level => 5);
1333 PA_DEBUG.RESET_CURR_FUNCTION;
1334 END IF;
1335 RETURN;
1336 END IF;
1337 FOR i IN 1..l_res_asg_id_tab.count LOOP
1338 SELECT COUNT(DISTINCT txn_currency_code)
1339 INTO l_currency_count
1340 FROM PA_BUDGET_LINES
1341 WHERE resource_assignment_id = l_res_asg_id_tab(i)
1342 AND start_date BETWEEN l_actual_from_date AND l_actual_to_date;
1343 IF l_currency_count <>0 THEN
1344 /* If we have actual txn amounts in only one currency then the ETC amount
1345 will be generated in the same currency. */
1346 IF l_currency_count = 1 THEN
1347 l_currency_flag := 'TC';
1348 SELECT DISTINCT txn_currency_code
1349 INTO l_currency_code
1350 FROM PA_BUDGET_LINES
1351 WHERE resource_assignment_id = l_res_asg_id_tab(i)
1352 AND start_date BETWEEN l_actual_from_date AND l_actual_to_date;
1353 /* If we have actual txn amounts in more than one currency then the ETC amount
1354 will be generated in PC by taking the average amount from PC amount. */
1355 ELSIF l_currency_count > 1 THEN
1356 l_currency_flag := 'PC';
1357 l_currency_code := P_FP_COLS_REC.x_project_currency_code;
1358 END IF;
1359
1360 IF P_PA_DEBUG_MODE = 'Y' THEN
1361 pa_fp_gen_amount_utils.fp_debug
1362 (p_msg => 'Before calling PA_FP_GEN_FCST_AMT_PVT.GEN_AVERAGE_OF_ACTUALS',
1363 p_module_name => l_module_name,
1364 p_log_level => 5);
1365 END IF;
1366 PA_FP_GEN_FCST_AMT_PVT.GEN_AVERAGE_OF_ACTUALS
1367 (P_BUDGET_VERSION_ID => P_BUDGET_VERSION_ID,
1368 P_TASK_ID => l_task_id_tab(i),
1369 P_RES_LIST_MEMBER_ID => l_rlm_id_tab(i),
1370 P_TXN_CURRENCY_CODE => l_currency_code,
1371 P_CURRENCY_FLAG => l_currency_flag,
1372 P_PLANNING_START_DATE => l_planning_start_date_tab(i),
1373 P_PLANNING_END_DATE => l_planning_end_date_tab(i),
1374 P_ACTUALS_THRU_DATE => P_ACTUALS_THRU_DATE,
1375 P_FP_COLS_REC => P_FP_COLS_REC,
1376 P_ACTUAL_FROM_PERIOD => P_ACTUALS_FROM_PERIOD,
1377 P_ACTUAL_TO_PERIOD => P_ACTUALS_TO_PERIOD,
1378 P_ETC_FROM_PERIOD => P_ETC_FROM_PERIOD,
1379 P_ETC_TO_PERIOD => P_ETC_TO_PERIOD,
1380 P_RESOURCE_ASSIGNMENT_ID => l_res_asg_id_tab(i),
1381 X_RETURN_STATUS => X_RETURN_STATUS,
1382 X_MSG_COUNT => X_MSG_COUNT,
1383 X_MSG_DATA => X_MSG_DATA );
1384 IF P_PA_DEBUG_MODE = 'Y' THEN
1385 pa_fp_gen_amount_utils.fp_debug
1386 (p_msg => 'After calling PA_FP_GEN_FCST_AMT_PVT.GEN_AVERAGE_OF_ACTUALS,
1387 return status is: '||x_return_status,
1388 p_module_name => l_module_name,
1389 p_log_level => 5);
1390 END IF;
1391 IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
1392 raise PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
1393 END IF;
1394 END IF;
1395 /* end if for checking currency count <> 0 */
1396 END LOOP;
1397
1398 -- Bug 4165701: Since the generation source is Average of Actuals, we
1399 -- need to NULL out the spread curves of the generated resources.
1400 FORALL i IN 1..l_res_asg_id_tab.count
1401 UPDATE pa_resource_assignments
1402 SET spread_curve_id = NULL,
1403 sp_fixed_date = NULL,
1404 transaction_source_code = 'AVERAGE_ACTUALS' -- bug 4232619
1405 WHERE resource_assignment_id = l_res_asg_id_tab(i);
1406
1407 IF P_PA_DEBUG_MODE = 'Y' THEN
1408 PA_DEBUG.RESET_CURR_FUNCTION;
1409 END IF;
1410 EXCEPTION
1411 WHEN PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc THEN
1412 l_msg_count := FND_MSG_PUB.count_msg;
1413 IF l_msg_count = 1 THEN
1414 PA_INTERFACE_UTILS_PUB.get_messages
1415 ( p_encoded => FND_API.G_TRUE,
1416 p_msg_index => 1,
1417 p_msg_count => l_msg_count,
1418 p_msg_data => l_msg_data,
1419 p_data => l_data,
1420 p_msg_index_out => l_msg_index_out);
1421 x_msg_data := l_data;
1422 x_msg_count := l_msg_count;
1423 ELSE
1424 x_msg_count := l_msg_count;
1425 END IF;
1426
1427 ROLLBACK;
1428 x_return_status := FND_API.G_RET_STS_ERROR;
1429
1430 IF P_PA_DEBUG_MODE = 'Y' THEN
1431 pa_fp_gen_amount_utils.fp_debug
1432 (p_msg => 'Invalid Arguments Passed',
1433 p_module_name => l_module_name,
1434 p_log_level => 5);
1435 PA_DEBUG.RESET_CURR_FUNCTION;
1436 END IF;
1437 RAISE;
1438 WHEN OTHERS THEN
1439 rollback;
1440 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1441 x_msg_count := 1;
1442 x_msg_data := substr(sqlerrm,1,240);
1443 FND_MSG_PUB.add_exc_msg
1444 ( p_pkg_name => 'PA_FP_GEN_FCST_AMT_PUB1',
1445 p_procedure_name => 'GEN_AVERAGE_OF_ACTUALS_WRP',
1446 p_error_text => substr(sqlerrm,1,240));
1447
1448 IF P_PA_DEBUG_MODE = 'Y' THEN
1449 pa_fp_gen_amount_utils.fp_debug
1450 (p_msg => 'Unexpected Error'||substr(sqlerrm, 1, 240),
1451 p_module_name => l_module_name,
1452 p_log_level => 5);
1453 PA_DEBUG.RESET_CURR_FUNCTION;
1454 END IF;
1455 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1456 END GEN_AVERAGE_OF_ACTUALS_WRP;
1457
1458 /**Valid values for param:P_ETC_SOURCE_CODE
1459 * --ETC_WP
1460 * --ETC_FP
1461 * --TARGET_FP
1462 **/
1463 PROCEDURE GET_ETC_REMAIN_BDGT_AMTS
1464 (P_ETC_SOURCE_CODE IN VARCHAR2,
1465 P_RESOURCE_ASSIGNMENT_ID IN NUMBER,
1466 P_TASK_ID IN NUMBER,
1467 P_RESOURCE_LIST_MEMBER_ID IN NUMBER,
1468 P_ACTUALS_THRU_DATE IN PA_PERIODS_ALL.END_DATE%TYPE,
1469 P_FP_COLS_REC IN PA_FP_GEN_AMOUNT_UTILS.FP_COLS,
1470 P_WP_STRUCTURE_VERSION_ID IN PA_PROJ_ELEM_VER_STRUCTURE.ELEMENT_VERSION_ID%TYPE,
1471 X_RETURN_STATUS OUT NOCOPY VARCHAR2,
1472 X_MSG_COUNT OUT NOCOPY NUMBER,
1473 X_MSG_DATA OUT NOCOPY VARCHAR2)
1474 IS
1475 l_module_name VARCHAR2(200) := 'pa.plsql.PA_FP_GEN_FCST_AMT_PUB1.GEN_ETC_REMAIN_BDGT_AMTS';
1476
1477 l_currency_count_tot NUMBER;
1478 l_currency_count_act NUMBER;
1479 l_currency_code_tot PA_PROJECTS_ALL.PROJECT_CURRENCY_CODE%TYPE;
1480 l_currency_code_act PA_PROJECTS_ALL.PROJECT_CURRENCY_CODE%TYPE;
1481 l_currency_flag VARCHAR2(2);
1482 l_etc_currency_code PA_PROJECTS_ALL.PROJECT_CURRENCY_CODE%TYPE;
1483
1484 l_tot_qty NUMBER;
1485 l_tot_txn_raw_cost NUMBER;
1486 l_tot_txn_brdn_cost NUMBER;
1487
1488 l_act_qty NUMBER;
1489 l_act_txn_raw_cost NUMBER;
1490 l_act_txn_brdn_cost NUMBER;
1491
1492 l_etc_qty NUMBER;
1493 l_etc_txn_raw_cost NUMBER;
1494 l_etc_txn_brdn_cost NUMBER;
1495
1496 l_act_work_qty NUMBER;
1497 l_tot_work_qty NUMBER;
1498 l_ppl_act_cost_pc NUMBER;
1499 l_eqpmt_act_cost_pc NUMBER;
1500 l_oth_act_cost_pc NUMBER;
1501 l_ppl_act_cst_fc NUMBER;
1502 l_eqpmt_act_cost_fc NUMBER;
1503 l_oth_act_cost_fc NUMBER;
1504 l_txn_currency_code VARCHAR2(30);
1505 l_ppl_act_cost_tc NUMBER;
1506 l_eqpmt_act_cost_tc NUMBER;
1507 l_oth_act_cost_tc NUMBER;
1508 l_ppl_act_rawcost_pc NUMBER;
1509 l_eqpmt_act_rawcost_pc NUMBER;
1510 l_oth_act_rawcost_pc NUMBER;
1511 l_ppl_act_rawcst_fc NUMBER;
1512 l_eqpmt_act_rawcost_fc NUMBER;
1513 l_oth_act_rawcost_fc NUMBER;
1514 l_ppl_act_rawcost_tc NUMBER;
1515 l_eqpmt_act_rawcost_tc NUMBER;
1516 l_oth_act_rawcost_tc NUMBER;
1517
1518 l_oth_quantity NUMBER;
1519 l_act_labor_effort NUMBER;
1520 l_act_eqpmt_effort NUMBER;
1521 l_uom VARCHAR2(30);
1522
1523 l_msg_count NUMBER;
1524 l_msg_data VARCHAR2(2000);
1525 l_data VARCHAR2(2000);
1526 l_msg_index_out NUMBER:=0;
1527 BEGIN
1528 IF p_pa_debug_mode = 'Y' THEN
1529 pa_debug.set_curr_function( p_function => 'GEN_ETC_REMAIN_BDGT_AMTS',
1530 p_debug_mode => p_pa_debug_mode);
1531 END IF;
1532 X_RETURN_STATUS := FND_API.G_RET_STS_SUCCESS;
1533 X_MSG_COUNT := 0;
1534
1535 /*currency_flag is defaulted to PC: project currency,
1536 etc_currency_code is defaulted to project currency code.
1537 cnt of 'total' currency; cnt of 'act'; currency_flag; etc_currency_code
1538 1 1 TC tot currency code
1539 1 0 TC tot currency_code
1540 0 1 TC act currency_code
1541 0 0 return without processing etc
1542 m n PC proj currency_code
1543 */
1544 IF P_ETC_SOURCE_CODE = 'FINANCIAL_PLAN' THEN
1545 l_currency_flag := 'PC';
1546 l_etc_currency_code := P_FP_COLS_REC.x_project_currency_code;
1547
1548 SELECT /*+ INDEX(PA_FP_CALC_AMT_TMP2,PA_FP_CALC_AMT_TMP2_N2)*/
1549 COUNT(DISTINCT TXN_CURRENCY_CODE)
1550 INTO l_currency_count_tot
1551 FROM PA_FP_CALC_AMT_TMP2
1552 WHERE RESOURCE_ASSIGNMENT_ID = P_RESOURCE_ASSIGNMENT_ID
1553 AND ETC_CURRENCY_CODE IS NULL;
1554
1555 SELECT /*+ INDEX(PA_FP_FCST_GEN_TMP1,PA_FP_FCST_GEN_TMP1_N1)*/
1556 COUNT(DISTINCT TXN_CURRENCY_CODE)
1557 INTO l_currency_count_act
1558 FROM PA_FP_FCST_GEN_TMP1
1559 WHERE project_element_id = P_TASK_ID
1560 AND res_list_member_id = P_RESOURCE_LIST_MEMBER_ID
1561 AND data_type_code = P_ETC_SOURCE_CODE;
1562 /* hr_utility.trace('currency count tot :'||l_currency_count_tot );
1563 hr_utility.trace('currency count act :'||l_currency_count_act ); */
1564 IF l_currency_count_tot = 0 and l_currency_count_act = 0 THEN
1565 IF P_PA_DEBUG_MODE = 'Y' THEN
1566 PA_DEBUG.RESET_CURR_FUNCTION;
1567 END IF;
1568 RETURN;
1569 END IF;
1570
1571 IF l_currency_count_tot = 1
1572 AND l_currency_count_act = 1
1573 AND p_fp_cols_rec.x_plan_in_multi_curr_flag = 'Y' THEN
1574 SELECT /*+ INDEX(PA_FP_CALC_AMT_TMP2,PA_FP_CALC_AMT_TMP2_N2)*/
1575 DISTINCT TXN_CURRENCY_CODE
1576 INTO l_currency_code_tot
1577 FROM PA_FP_CALC_AMT_TMP2
1578 WHERE RESOURCE_ASSIGNMENT_ID = P_RESOURCE_ASSIGNMENT_ID
1579 AND ETC_CURRENCY_CODE IS NULL;
1580
1581 SELECT /*+ INDEX(PA_FP_FCST_GEN_TMP1,PA_FP_FCST_GEN_TMP1_N1)*/
1582 DISTINCT TXN_CURRENCY_CODE
1583 INTO l_currency_code_act
1584 FROM PA_FP_FCST_GEN_TMP1
1585 WHERE project_element_id = P_TASK_ID
1586 AND res_list_member_id = P_RESOURCE_LIST_MEMBER_ID
1587 AND data_type_code = P_ETC_SOURCE_CODE;
1588
1589 IF l_currency_code_tot = l_currency_code_act THEN
1590 l_currency_flag := 'TC';
1591 l_etc_currency_code := l_currency_code_tot;
1592 END IF;
1593 ELSIF l_currency_count_tot = 1
1594 AND l_currency_count_act = 0
1595 AND p_fp_cols_rec.x_plan_in_multi_curr_flag = 'Y' THEN
1596 l_currency_flag := 'TC';
1597 SELECT /*+ INDEX(PA_FP_CALC_AMT_TMP2,PA_FP_CALC_AMT_TMP2_N2)*/
1598 DISTINCT TXN_CURRENCY_CODE
1599 INTO l_etc_currency_code
1600 FROM PA_FP_CALC_AMT_TMP2
1601 WHERE RESOURCE_ASSIGNMENT_ID = P_RESOURCE_ASSIGNMENT_ID
1602 AND ETC_CURRENCY_CODE IS NULL;
1603 ELSIF l_currency_count_tot = 0
1604 AND l_currency_count_act = 1
1605 AND p_fp_cols_rec.x_plan_in_multi_curr_flag = 'Y' THEN
1606 l_currency_flag := 'TC';
1607 SELECT /*+ INDEX(PA_FP_FCST_GEN_TMP1,PA_FP_FCST_GEN_TMP1_N1)*/
1608 DISTINCT TXN_CURRENCY_CODE
1609 INTO l_etc_currency_code
1610 FROM PA_FP_FCST_GEN_TMP1
1611 WHERE project_element_id = P_TASK_ID
1612 AND res_list_member_id = P_RESOURCE_LIST_MEMBER_ID
1613 AND data_type_code = P_ETC_SOURCE_CODE;
1614 END IF;
1615
1616 BEGIN
1617 SELECT /*+ INDEX(PA_FP_CALC_AMT_TMP2,PA_FP_CALC_AMT_TMP2_N2)*/
1618 SUM(NVL(TOTAL_PLAN_QUANTITY, 0)),
1619 SUM(NVL(DECODE(l_currency_flag, 'TC', TOTAL_TXN_RAW_COST,
1620 'PC', TOTAL_PC_RAW_COST), 0)),
1621 SUM(NVL(DECODE(l_currency_flag, 'TC', TOTAL_TXN_BURDENED_COST,
1622 'PC', TOTAL_PC_BURDENED_COST),0))
1623 INTO l_tot_qty,
1624 l_tot_txn_raw_cost,
1625 l_tot_txn_brdn_cost
1626 FROM PA_FP_CALC_AMT_TMP2
1627 WHERE RESOURCE_ASSIGNMENT_ID = P_RESOURCE_ASSIGNMENT_ID
1628 AND ETC_CURRENCY_CODE IS NULL;
1629 EXCEPTION
1630 WHEN NO_DATA_FOUND THEN
1631 l_tot_qty := 0;
1632 l_tot_txn_raw_cost := 0;
1633 l_tot_txn_brdn_cost := 0;
1634 END;
1635 /* hr_utility.trace('tot qty in rem plan:'||l_tot_qty );
1636 hr_utility.trace('tot rc in rem plan:'||l_tot_txn_raw_cost );
1637 hr_utility.trace('tot bc in rem plan:'||l_tot_txn_brdn_cost ); */
1638 /* commented the following code. B/c, the qty could be NULL AND
1639 we may get raw cost and burdened cost. (data issues)
1640 IF l_tot_qty IS NULL THEN
1641 -- hr_utility.trace('inside tot qty null'||l_tot_qty );
1642 l_tot_qty := 0;
1643 l_tot_txn_raw_cost := 0;
1644 l_tot_txn_brdn_cost := 0;
1645 END IF;
1646 */
1647 l_tot_qty := NVL(l_tot_qty,0);
1648 l_tot_txn_raw_cost := NVL(l_tot_txn_raw_cost,0);
1649 l_tot_txn_brdn_cost := NVL(l_tot_txn_brdn_cost,0);
1650
1651 BEGIN
1652 SELECT SUM(NVL(quantity,0)),
1653 SUM(NVL(DECODE(l_currency_flag, 'TC', txn_raw_cost,
1654 'PC', prj_raw_cost),0)),
1655 SUM(NVL(DECODE(l_currency_flag, 'TC', txn_brdn_cost,
1656 'PC', prj_brdn_cost),0))
1657 INTO
1658 l_act_qty,
1659 l_act_txn_raw_cost,
1660 l_act_txn_brdn_cost
1661 FROM /*+ INDEX(PA_FP_FCST_GEN_TMP1,PA_FP_FCST_GEN_TMP1_N1)*/
1662 PA_FP_FCST_GEN_TMP1
1663 WHERE project_element_id = P_TASK_ID
1664 AND res_list_member_id = P_RESOURCE_LIST_MEMBER_ID
1665 AND data_type_code = P_ETC_SOURCE_CODE;
1666 EXCEPTION
1667 WHEN NO_DATA_FOUND THEN
1668 l_act_qty := 0;
1669 l_act_txn_raw_cost := 0;
1670 l_act_txn_brdn_cost := 0;
1671 END;
1672 /* hr_utility.trace('act qty '||l_act_qty );
1673 hr_utility.trace('act rc '||l_act_txn_raw_cost );
1674 hr_utility.trace('act bc '||l_act_txn_brdn_cost ); */
1675 /* IF l_act_qty IS NULL THEN
1676 l_act_qty := 0;
1677 l_act_txn_raw_cost := 0;
1678 l_act_txn_brdn_cost := 0;
1679 END IF; */
1680 l_act_qty := NVL(l_act_qty,0);
1681 l_act_txn_raw_cost := NVL(l_act_txn_raw_cost,0);
1682 l_act_txn_brdn_cost := NVL(l_act_txn_brdn_cost,0);
1683
1684 ELSIF P_ETC_SOURCE_CODE = 'WORKPLAN_RESOURCES' THEN
1685 /*getting actuals*/
1686 l_currency_flag := 'PC';
1687 l_etc_currency_code := P_FP_COLS_REC.x_project_currency_code;
1688
1689 IF P_PA_DEBUG_MODE = 'Y' THEN
1690 pa_fp_gen_amount_utils.fp_debug
1691 (p_msg => 'Before calling PA_PROGRESS_UTILS.'||
1692 'get_actuals_for_task in remain_bdgt',
1693 p_module_name => l_module_name,
1694 p_log_level => 5);
1695 END IF;
1696
1697 PA_PROGRESS_UTILS.get_actuals_for_task(
1698 p_project_id => P_FP_COLS_REC.X_PROJECT_ID,
1699 p_wp_task_id => P_TASK_ID,
1700 p_res_list_mem_id => P_RESOURCE_LIST_MEMBER_ID,
1701 p_as_of_date => P_ACTUALS_THRU_DATE,
1702 x_planned_work_qty => l_tot_work_qty,
1703 x_actual_work_qty => l_act_work_qty,
1704 x_ppl_act_cost_pc => l_ppl_act_cost_pc,
1705 x_eqpmt_act_cost_pc => l_eqpmt_act_cost_pc,
1706 x_oth_act_cost_pc => l_oth_act_cost_pc,
1707 x_ppl_act_cost_fc => l_ppl_act_cst_fc,
1708 x_eqpmt_act_cost_fc => l_eqpmt_act_cost_fc,
1709 x_oth_act_cost_fc => l_oth_act_cost_fc,
1710 x_act_labor_effort => l_act_labor_effort,
1711 x_act_eqpmt_effort => l_act_eqpmt_effort,
1712 x_unit_of_measure => l_uom,
1713 x_txn_currency_code => l_txn_currency_code,
1714 x_ppl_act_cost_tc => l_ppl_act_cost_tc,
1715 x_eqpmt_act_cost_tc => l_eqpmt_act_cost_tc,
1716 x_oth_act_cost_tc => l_oth_act_cost_tc,
1717 X_PPL_ACT_RAWCOST_PC => l_ppl_act_rawcost_pc,
1718 X_EQPMT_ACT_RAWCOST_PC => l_eqpmt_act_rawcost_pc,
1719 X_OTH_ACT_RAWCOST_PC => l_oth_act_rawcost_pc,
1720 X_PPL_ACT_RAWCOST_FC => l_ppl_act_rawcst_fc,
1721 X_EQPMT_ACT_RAWCOST_FC => l_eqpmt_act_rawcost_fc,
1722 X_OTH_ACT_RAWCOST_FC => l_oth_act_rawcost_fc,
1723 X_PPL_ACT_RAWCOST_TC => l_ppl_act_rawcost_tc,
1724 X_EQPMT_ACT_RAWCOST_TC => l_eqpmt_act_rawcost_tc,
1725 X_OTH_ACT_RAWCOST_TC => l_oth_act_rawcost_tc,
1726 X_OTH_QUANTITY => l_oth_quantity,
1727 x_return_status => x_return_status,
1728 x_msg_count => x_msg_count,
1729 x_msg_data => x_msg_data );
1730 IF P_PA_DEBUG_MODE = 'Y' THEN
1731 pa_fp_gen_amount_utils.fp_debug
1732 (p_msg => 'After calling PA_PROGRESS_UTILS.'||
1733 'get_actuals_for_task in remain_bdgt'||x_return_status,
1734 p_module_name => l_module_name,
1735 p_log_level => 5);
1736 END IF;
1737 IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
1738 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
1739 END IF;
1740 l_act_qty := NVL(l_act_labor_effort,0) + NVL(l_act_eqpmt_effort,0)
1741 + NVL(l_oth_quantity,0);
1742 l_act_txn_brdn_cost := nvl(l_ppl_act_cost_pc,0) +
1743 nvl(l_eqpmt_act_cost_pc,0) +
1744 nvl(l_oth_act_cost_pc,0);
1745 l_act_txn_raw_cost := nvl(l_ppl_act_rawcost_pc,0) +
1746 nvl(l_eqpmt_act_rawcost_pc,0) +
1747 nvl(l_oth_act_rawcost_pc,0);
1748
1749 /*getting total*/
1750 SELECT /*+ INDEX(PA_FP_CALC_AMT_TMP2,PA_FP_CALC_AMT_TMP2_N2)*/
1751 COUNT(DISTINCT TXN_CURRENCY_CODE)
1752 INTO l_currency_count_tot
1753 FROM PA_FP_CALC_AMT_TMP2
1754 WHERE RESOURCE_ASSIGNMENT_ID = P_RESOURCE_ASSIGNMENT_ID
1755 AND ETC_CURRENCY_CODE IS NULL;
1756
1757 IF l_currency_count_tot = 1
1758 AND p_fp_cols_rec.x_plan_in_multi_curr_flag = 'Y' THEN
1759 SELECT /*+ INDEX(PA_FP_CALC_AMT_TMP2,PA_FP_CALC_AMT_TMP2_N2)*/
1760 DISTINCT TXN_CURRENCY_CODE
1761 INTO l_currency_code_tot
1762 FROM PA_FP_CALC_AMT_TMP2
1763 WHERE RESOURCE_ASSIGNMENT_ID = P_RESOURCE_ASSIGNMENT_ID
1764 AND ETC_CURRENCY_CODE IS NULL;
1765
1766 IF l_currency_code_tot = l_txn_currency_code OR
1767 l_txn_currency_code is NULL THEN
1768 l_currency_flag := 'TC';
1769 l_etc_currency_code := l_currency_code_tot;
1770
1771 l_act_txn_brdn_cost := nvl(l_ppl_act_cost_tc,0) +
1772 nvl(l_eqpmt_act_cost_tc,0) +
1773 nvl(l_oth_act_cost_tc,0);
1774 l_act_txn_raw_cost := nvl(l_ppl_act_rawcost_tc,0) +
1775 nvl(l_eqpmt_act_rawcost_tc,0) +
1776 nvl(l_oth_act_rawcost_tc,0);
1777 END IF;
1778 END IF;
1779
1780 BEGIN
1781 SELECT /*+ INDEX(PA_FP_CALC_AMT_TMP2,PA_FP_CALC_AMT_TMP2_N2)*/
1782 SUM(NVL(TOTAL_PLAN_QUANTITY, 0)),
1783 SUM(NVL(DECODE(l_currency_flag, 'TC', TOTAL_TXN_RAW_COST,
1784 'PC', TOTAL_PC_RAW_COST), 0)),
1785 SUM(NVL(DECODE(l_currency_flag, 'TC', TOTAL_TXN_BURDENED_COST,
1786 'PC', TOTAL_PC_BURDENED_COST),0))
1787 INTO l_tot_qty,
1788 l_tot_txn_raw_cost,
1789 l_tot_txn_brdn_cost
1790 FROM PA_FP_CALC_AMT_TMP2
1791 WHERE RESOURCE_ASSIGNMENT_ID = P_RESOURCE_ASSIGNMENT_ID
1792 AND ETC_CURRENCY_CODE IS NULL;
1793 EXCEPTION
1794 WHEN NO_DATA_FOUND THEN
1795 l_tot_qty := 0;
1796 l_tot_txn_raw_cost := 0;
1797 l_tot_txn_brdn_cost := 0;
1798 END;
1799 l_tot_qty := NVL(l_tot_qty,0);
1800 l_tot_txn_raw_cost := NVL(l_tot_txn_raw_cost,0);
1801 l_tot_txn_brdn_cost := NVL(l_tot_txn_brdn_cost,0);
1802 /* IF l_tot_qty IS NULL THEN
1803 l_tot_qty := 0;
1804 l_tot_txn_raw_cost := 0;
1805 l_tot_txn_brdn_cost := 0;
1806 END IF; */
1807
1808 END IF;
1809
1810 l_etc_qty := l_tot_qty - l_act_qty;
1811 l_etc_txn_raw_cost := l_tot_txn_raw_cost - l_act_txn_raw_cost;
1812 l_etc_txn_brdn_cost := l_tot_txn_brdn_cost - l_act_txn_brdn_cost;
1813 /* hr_utility.trace('etc qty '||l_etc_qty );
1814 hr_utility.trace('etc curr'||l_ETC_CURRENCY_CODE );
1815 hr_utility.trace('etc rc '||l_etc_txn_raw_cost );
1816 hr_utility.trace('etc bc '||l_etc_txn_brdn_cost ); */
1817
1818 IF l_etc_qty <> 0 OR l_etc_txn_raw_cost <> 0 OR l_etc_txn_brdn_cost <> 0 THEN
1819 INSERT INTO PA_FP_CALC_AMT_TMP2
1820 (RESOURCE_ASSIGNMENT_ID,
1821 ETC_CURRENCY_CODE,
1822 ETC_PLAN_QUANTITY,
1823 ETC_TXN_RAW_COST,
1824 ETC_TXN_BURDENED_COST)
1825 VALUES
1826 (P_RESOURCE_ASSIGNMENT_ID,
1827 l_etc_currency_code,
1828 l_etc_qty,
1829 l_etc_txn_raw_cost,
1830 l_etc_txn_brdn_cost);
1831 END IF;
1832
1833 IF P_PA_DEBUG_MODE = 'Y' THEN
1834 PA_DEBUG.RESET_CURR_FUNCTION;
1835 END IF;
1836 EXCEPTION
1837 WHEN PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc THEN
1838 l_msg_count := FND_MSG_PUB.count_msg;
1839 IF l_msg_count = 1 THEN
1840 PA_INTERFACE_UTILS_PUB.get_messages
1841 ( p_encoded => FND_API.G_TRUE,
1842 p_msg_index => 1,
1843 p_msg_count => l_msg_count,
1844 p_msg_data => l_msg_data,
1845 p_data => l_data,
1846 p_msg_index_out => l_msg_index_out);
1847 x_msg_data := l_data;
1848 x_msg_count := l_msg_count;
1849 ELSE
1850 x_msg_count := l_msg_count;
1851 END IF;
1852
1853 ROLLBACK;
1854 x_return_status := FND_API.G_RET_STS_ERROR;
1855
1856 IF P_PA_DEBUG_MODE = 'Y' THEN
1857 pa_fp_gen_amount_utils.fp_debug
1858 (p_msg => 'Invalid Arguments Passed',
1859 p_module_name => l_module_name,
1860 p_log_level => 5);
1861 PA_DEBUG.RESET_CURR_FUNCTION;
1862 END IF;
1863 RAISE;
1864 WHEN OTHERS THEN
1865 rollback;
1866 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1867 x_msg_count := 1;
1868 x_msg_data := substr(sqlerrm,1,240);
1869 --dbms_output.put_line('error msg :'||x_msg_data);
1870 FND_MSG_PUB.add_exc_msg
1871 ( p_pkg_name => 'PA_FP_GEN_FCST_AMT_PUB1',
1872 p_procedure_name => 'GEN_ETC_REMAIN_BDGT_AMTS',
1873 p_error_text => substr(sqlerrm,1,240));
1874
1875 IF P_PA_DEBUG_MODE = 'Y' THEN
1876 pa_fp_gen_amount_utils.fp_debug
1877 (p_msg => 'Unexpected Error'||substr(sqlerrm, 1, 240),
1878 p_module_name => l_module_name,
1879 p_log_level => 5);
1880 PA_DEBUG.RESET_CURR_FUNCTION;
1881 END IF;
1882 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1883 END GET_ETC_REMAIN_BDGT_AMTS;
1884
1885
1886 PROCEDURE GET_ETC_BDGT_COMPLETE_AMTS
1887 (P_ETC_SOURCE_CODE IN VARCHAR2,
1888 P_ETC_SRC_BUDGET_VER_ID IN PA_BUDGET_VERSIONS.BUDGET_VERSION_ID%TYPE,
1889 P_RESOURCE_ASSIGNMENT_ID IN NUMBER,
1890 P_TASK_ID IN NUMBER,
1891 P_RESOURCE_LIST_MEMBER_ID IN NUMBER,
1892 P_ACTUALS_THRU_DATE IN PA_PERIODS_ALL.END_DATE%TYPE,
1893 P_FP_COLS_REC IN PA_FP_GEN_AMOUNT_UTILS.FP_COLS,
1894 P_WP_STRUCTURE_VERSION_ID IN PA_PROJ_ELEM_VER_STRUCTURE.ELEMENT_VERSION_ID%TYPE,
1895 X_RETURN_STATUS OUT NOCOPY VARCHAR2,
1896 X_MSG_COUNT OUT NOCOPY NUMBER,
1897 X_MSG_DATA OUT NOCOPY VARCHAR2 )
1898 IS
1899 l_module_name VARCHAR2(200) := 'pa.plsql.PA_FP_GEN_FCST_AMT_PUB1.GEN_ETC_BDGT_COMPLETE_AMTS';
1900
1901 l_currency_count_tot NUMBER;
1902 l_currency_count_bsl NUMBER;
1903 l_currency_code_tot PA_PROJECTS_ALL.PROJECT_CURRENCY_CODE%TYPE;
1904 l_currency_code_bsl PA_PROJECTS_ALL.PROJECT_CURRENCY_CODE%TYPE;
1905 l_currency_flag VARCHAR2(2);
1906 l_etc_currency_code PA_PROJECTS_ALL.PROJECT_CURRENCY_CODE%TYPE;
1907
1908 l_tot_txn_currency_code NUMBER;
1909 l_tot_qty NUMBER;
1910 l_tot_txn_raw_cost NUMBER;
1911 l_tot_txn_brdn_cost NUMBER;
1912
1913 l_structure_type VARCHAR2(30);
1914 l_structure_status VARCHAR2(30);
1915 l_structure_status_flag VARCHAR2(30);
1916 lx_percent_complete NUMBER;
1917 l_percent_complete NUMBER;
1918
1919 l_bsln_qty NUMBER;
1920 l_bsln_txn_raw_cost NUMBER;
1921 l_bsln_txn_brdn_cost NUMBER;
1922
1923 l_etc_qty NUMBER;
1924 l_etc_txn_raw_cost NUMBER;
1925 l_etc_txn_brdn_cost NUMBER;
1926
1927 l_msg_count NUMBER;
1928 l_msg_data VARCHAR2(2000);
1929 l_data VARCHAR2(2000);
1930 l_msg_index_out NUMBER:=0;
1931 l_WP_STRUCTURE_VERSION_ID number;
1932 BEGIN
1933 IF p_pa_debug_mode = 'Y' THEN
1934 pa_debug.set_curr_function( p_function => 'GEN_ETC_BDGT_COMPLETE_AMTS',
1935 p_debug_mode => p_pa_debug_mode);
1936 END IF;
1937 X_RETURN_STATUS := FND_API.G_RET_STS_SUCCESS;
1938 X_MSG_COUNT := 0;
1939
1940 l_structure_type := null;
1941 l_structure_status := null;
1942 l_structure_status_flag := null;
1943 l_WP_STRUCTURE_VERSION_ID := null;
1944 /* for getting the financial percent complete,
1945 we dont have to pass the structure version id.
1946 It always comes from the lates published
1947 financial structure version. */
1948
1949 IF P_ETC_SOURCE_CODE = 'FINANCIAL_PLAN' THEN
1950 l_structure_type := 'FINANCIAL';
1951 ELSE
1952 l_WP_STRUCTURE_VERSION_ID := P_WP_STRUCTURE_VERSION_ID;
1953
1954 l_structure_type := 'WORKPLAN';
1955 l_structure_status_flag :=
1956 PA_PROJECT_STRUCTURE_UTILS.Check_Struc_Ver_Published(
1957 P_FP_COLS_REC.X_PROJECT_ID,l_WP_STRUCTURE_VERSION_ID);
1958 If l_structure_status_flag = 'Y' THEN
1959 l_structure_status := 'PUBLISHED';
1960 ELSE
1961 l_structure_status := 'WORKING';
1962 END IF;
1963 END IF;
1964
1965
1966 IF P_PA_DEBUG_MODE = 'Y' THEN
1967 pa_fp_gen_amount_utils.fp_debug
1968 (p_msg => 'Before calling PA_PROGRESS_UTILS.REDEFAULT_BASE_PC',
1969 p_module_name => l_module_name,
1970 p_log_level => 5);
1971 END IF;
1972 --dbms_output.put_line('project_id:'||P_FP_COLS_REC.X_PROJECT_ID);
1973 --dbms_output.put_line('proj_element_id; task_id:'||P_TASK_ID);
1974 --dbms_output.put_line('P_ACTUALS_THRU_DATE:'||P_ACTUALS_THRU_DATE);
1975 --dbms_output.put_line('l_structure_status_flag:'||l_structure_status_flag);
1976 --dbms_output.put_line('l_structure_status:'||l_structure_status);
1977 --dbms_output.put_line('P_WP_STRUCTURE_VERSION_ID:'||P_WP_STRUCTURE_VERSION_ID);
1978 --dbms_output.put_line('l_structure_type:'||l_structure_type);
1979 PA_PROGRESS_UTILS.REDEFAULT_BASE_PC (
1980 p_Project_ID => P_FP_COLS_REC.X_PROJECT_ID,
1981 p_Proj_element_id => P_TASK_ID,
1982 p_Structure_type => l_structure_type,
1983 p_object_type => 'PA_TASKS',
1984 p_As_Of_Date => P_ACTUALS_THRU_DATE,
1985 P_STRUCTURE_VERSION_ID => l_WP_STRUCTURE_VERSION_ID,
1986 P_STRUCTURE_STATUS => l_structure_status,
1987 p_calling_context => 'FINANCIAL_PLANNING',
1988 X_base_percent_complete => lx_percent_complete,
1989 x_return_status => x_return_status,
1990 x_msg_count => x_msg_count,
1991 x_msg_data => x_msg_data );
1992 IF P_PA_DEBUG_MODE = 'Y' THEN
1993 pa_fp_gen_amount_utils.fp_debug
1994 (p_msg => 'After calling PA_PROGRESS_UTILS.REDEFAULT_BASE_PC,
1995 return status is:'||x_return_status,
1996 p_module_name => l_module_name,
1997 p_log_level => 5);
1998 END IF;
1999 --dbms_output.put_line('BDGT_COMPLETE: p_proj_element_id:'||p_task_id);
2000 --dbms_output.put_line('l_percent_complete:'||lx_percent_complete);
2001
2002 IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
2003 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
2004 END IF;
2005 l_percent_complete := NVL(lx_percent_complete,0)/100;
2006
2007 /*currency_flag is defaulted to PC: project currency,
2008 etc_currency_code is defaulted to project currency code.
2009 cnt of 'total' currency; cnt of 'bsln'; currency_flag; etc_currency_code
2010 1 1 TC tot currency code
2011 1 0 TC tot currency_code
2012 0 1 TC bsln currency_code
2013 0 0 return without processing etc
2014 m n PC proj currency_code
2015 */
2016 l_currency_flag := 'PC';
2017 l_etc_currency_code := P_FP_COLS_REC.x_project_currency_code;
2018
2019 SELECT /*+ INDEX(PA_FP_CALC_AMT_TMP2,PA_FP_CALC_AMT_TMP2_N2)*/
2020 COUNT(DISTINCT TXN_CURRENCY_CODE)
2021 INTO l_currency_count_tot
2022 FROM PA_FP_CALC_AMT_TMP2
2023 WHERE RESOURCE_ASSIGNMENT_ID = P_RESOURCE_ASSIGNMENT_ID
2024 AND ETC_CURRENCY_CODE IS NULL;
2025
2026 /* SELECT COUNT(DISTINCT TXN_CURRENCY_CODE)
2027 INTO l_currency_count_bsl
2028 FROM PA_FP_CALC_AMT_TMP3
2029 WHERE plan_version_id = P_ETC_SRC_BUDGET_VER_ID
2030 AND task_id = P_TASK_ID
2031 AND res_list_member_id = P_RESOURCE_LIST_MEMBER_ID
2032 AND res_asg_id = P_RESOURCE_ASSIGNMENT_ID;*/
2033
2034 IF l_currency_count_tot = 0 THEN
2035 IF P_PA_DEBUG_MODE = 'Y' THEN
2036 PA_DEBUG.RESET_CURR_FUNCTION;
2037 END IF;
2038 RETURN;
2039 END IF;
2040
2041 IF l_currency_count_tot = 1 AND
2042 p_fp_cols_rec.x_plan_in_multi_curr_flag = 'Y' THEN
2043 SELECT /*+ INDEX(PA_FP_CALC_AMT_TMP2,PA_FP_CALC_AMT_TMP2_N2)*/
2044 DISTINCT TXN_CURRENCY_CODE
2045 INTO l_currency_code_tot
2046 FROM PA_FP_CALC_AMT_TMP2
2047 WHERE RESOURCE_ASSIGNMENT_ID = P_RESOURCE_ASSIGNMENT_ID
2048 AND ETC_CURRENCY_CODE IS NULL;
2049 l_currency_flag := 'TC';
2050 l_etc_currency_code := l_currency_code_tot;
2051 ELSE
2052 l_currency_flag := 'PC';
2053 l_etc_currency_code := P_FP_COLS_REC.x_project_currency_code;
2054 END IF;
2055
2056 BEGIN
2057 SELECT /*+ INDEX(PA_FP_CALC_AMT_TMP2,PA_FP_CALC_AMT_TMP2_N2)*/
2058 SUM(NVL(TOTAL_PLAN_QUANTITY,0)),
2059 SUM(NVL(DECODE(l_currency_flag, 'TC', TOTAL_TXN_RAW_COST,
2060 'PC', TOTAL_PC_RAW_COST),0)),
2061 SUM(NVL(DECODE(l_currency_flag, 'TC', TOTAL_TXN_BURDENED_COST,
2062 'PC', TOTAL_PC_BURDENED_COST),0))
2063 INTO l_tot_qty,
2064 l_tot_txn_raw_cost,
2065 l_tot_txn_brdn_cost
2066 FROM PA_FP_CALC_AMT_TMP2
2067 WHERE RESOURCE_ASSIGNMENT_ID = P_RESOURCE_ASSIGNMENT_ID
2068 AND ETC_CURRENCY_CODE IS NULL;
2069 EXCEPTION
2070 WHEN NO_DATA_FOUND THEN
2071 l_tot_qty := 0;
2072 l_tot_txn_raw_cost := 0;
2073 l_tot_txn_brdn_cost := 0;
2074 END;
2075 /* IF l_tot_qty IS NULL THEN
2076 l_tot_qty := 0;
2077 l_tot_txn_raw_cost := 0;
2078 l_tot_txn_brdn_cost := 0;
2079 END IF; */
2080 l_tot_qty := NVL(l_tot_qty,0);
2081 l_tot_txn_raw_cost := NVL(l_tot_txn_raw_cost,0);
2082 l_tot_txn_brdn_cost := NVL(l_tot_txn_brdn_cost,0);
2083
2084 l_etc_qty := l_tot_qty - (l_percent_complete*l_tot_qty);
2085 l_etc_txn_raw_cost := l_tot_txn_raw_cost - (l_percent_complete*l_tot_txn_raw_cost);
2086 l_etc_txn_brdn_cost := l_tot_txn_brdn_cost - (l_percent_complete*l_tot_txn_brdn_cost);
2087
2088 IF l_etc_qty <> 0 OR l_etc_txn_raw_cost <> 0 OR l_etc_txn_brdn_cost <> 0 THEN
2089 INSERT INTO PA_FP_CALC_AMT_TMP2
2090 (RESOURCE_ASSIGNMENT_ID,
2091 ETC_CURRENCY_CODE,
2092 ETC_PLAN_QUANTITY,
2093 ETC_TXN_RAW_COST,
2094 ETC_TXN_BURDENED_COST)
2095 VALUES
2096 (P_RESOURCE_ASSIGNMENT_ID,
2097 l_etc_currency_code,
2098 l_etc_qty,
2099 l_etc_txn_raw_cost,
2100 l_etc_txn_brdn_cost);
2101 END IF;
2102
2103 IF P_PA_DEBUG_MODE = 'Y' THEN
2104 PA_DEBUG.RESET_CURR_FUNCTION;
2105 END IF;
2106 EXCEPTION
2107 WHEN PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc THEN
2108 l_msg_count := FND_MSG_PUB.count_msg;
2109 IF l_msg_count = 1 THEN
2110 PA_INTERFACE_UTILS_PUB.get_messages
2111 ( p_encoded => FND_API.G_TRUE,
2112 p_msg_index => 1,
2113 p_msg_count => l_msg_count,
2114 p_msg_data => l_msg_data,
2115 p_data => l_data,
2116 p_msg_index_out => l_msg_index_out);
2117 x_msg_data := l_data;
2118 x_msg_count := l_msg_count;
2119 ELSE
2120 x_msg_count := l_msg_count;
2121 END IF;
2122
2123 ROLLBACK;
2124 x_return_status := FND_API.G_RET_STS_ERROR;
2125
2126 IF P_PA_DEBUG_MODE = 'Y' THEN
2127 pa_fp_gen_amount_utils.fp_debug
2128 (p_msg => 'Invalid Arguments Passed',
2129 p_module_name => l_module_name,
2130 p_log_level => 5);
2131 PA_DEBUG.RESET_CURR_FUNCTION;
2132 END IF;
2133 RAISE;
2134 WHEN OTHERS THEN
2135 rollback;
2136 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2137 x_msg_count := 1;
2138 x_msg_data := substr(sqlerrm,1,240);
2139 -- dbms_output.put_line('error msg :'||x_msg_data);
2140 FND_MSG_PUB.add_exc_msg
2141 ( p_pkg_name => 'PA_FP_GEN_FCST_AMT_PUB1',
2142 p_procedure_name => 'GEN_ETC_BDGT_COMPLETE_AMTS',
2143 p_error_text => substr(sqlerrm,1,240));
2144
2145 IF P_PA_DEBUG_MODE = 'Y' THEN
2146 pa_fp_gen_amount_utils.fp_debug
2147 (p_msg => 'Unexpected Error'||substr(sqlerrm, 1, 240),
2148 p_module_name => l_module_name,
2149 p_log_level => 5);
2150 PA_DEBUG.RESET_CURR_FUNCTION;
2151 END IF;
2152 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2153 END GET_ETC_BDGT_COMPLETE_AMTS;
2154
2155 PROCEDURE GET_ETC_EARNED_VALUE_AMTS
2156 (P_ETC_SOURCE_CODE IN VARCHAR2,
2157 P_RESOURCE_ASSIGNMENT_ID IN NUMBER,
2158 P_TASK_ID IN NUMBER,
2159 P_RESOURCE_LIST_MEMBER_ID IN NUMBER,
2160 P_ACTUALS_THRU_DATE IN PA_PERIODS_ALL.END_DATE%TYPE,
2161 P_FP_COLS_REC IN PA_FP_GEN_AMOUNT_UTILS.FP_COLS,
2162 P_WP_STRUCTURE_VERSION_ID IN PA_PROJ_ELEM_VER_STRUCTURE.ELEMENT_VERSION_ID%TYPE,
2163 X_RETURN_STATUS OUT NOCOPY VARCHAR2,
2164 X_MSG_COUNT OUT NOCOPY NUMBER,
2165 X_MSG_DATA OUT NOCOPY VARCHAR2
2166 )
2167 IS
2168 l_module_name VARCHAR2(200) := 'pa.plsql.PA_FP_GEN_FCST_AMT_PUB1.GEN_ETC_EARNED_VALUE_AMTS';
2169
2170 l_txn_currency_count_act NUMBER;
2171 l_txn_currency_code_act PA_PROJECTS_ALL.PROJECT_CURRENCY_CODE%TYPE;
2172 l_txn_currency_count_tot NUMBER;
2173 l_txn_currency_code_tot PA_PROJECTS_ALL.PROJECT_CURRENCY_CODE%TYPE;
2174 l_etc_currency_code PA_PROJECTS_ALL.PROJECT_CURRENCY_CODE%TYPE;
2175
2176 l_act_qty NUMBER;
2177 l_act_txn_raw_cost NUMBER;
2178 l_act_txn_brdn_cost NUMBER;
2179 l_act_pc_raw_cost NUMBER;
2180 l_act_pc_brdn_cost NUMBER;
2181
2182 l_tot_qty NUMBER;
2183 l_tot_txn_raw_cost NUMBER;
2184 l_tot_txn_brdn_cost NUMBER;
2185 l_tot_pc_raw_cost NUMBER;
2186 l_tot_pc_brdn_cost NUMBER;
2187
2188 l_structure_type VARCHAR2(30);
2189 l_structure_status VARCHAR2(30);
2190 l_structure_status_flag VARCHAR2(30);
2191 lx_percent_complete NUMBER;
2192 l_percent_complete NUMBER;
2193 l_etc_qty NUMBER;
2194 l_etc_raw_cost NUMBER;
2195 l_etc_brdn_cost NUMBER;
2196
2197 l_act_work_qty NUMBER;
2198 l_tot_work_qty NUMBER;
2199 l_ppl_act_cost_pc NUMBER;
2200 l_eqpmt_act_cost_pc NUMBER;
2201 l_oth_act_cost_pc NUMBER;
2202 l_ppl_act_cst_fc NUMBER;
2203 l_eqpmt_act_cost_fc NUMBER;
2204 l_oth_act_cost_fc NUMBER;
2205 l_txn_currency_code VARCHAR2(30);
2206 l_ppl_act_cost_tc NUMBER;
2207 l_eqpmt_act_cost_tc NUMBER;
2208 l_oth_act_cost_tc NUMBER;
2209 l_act_labor_effort NUMBER;
2210 l_act_eqpmt_effort NUMBER;
2211 l_uom VARCHAR2(30);
2212
2213 l_ppl_act_rawcost_pc NUMBER;
2214 l_eqpmt_act_rawcost_pc NUMBER;
2215 l_oth_act_rawcost_pc NUMBER;
2216 l_ppl_act_rawcst_fc NUMBER;
2217 l_eqpmt_act_rawcost_fc NUMBER;
2218 l_oth_act_rawcost_fc NUMBER;
2219 l_ppl_act_rawcost_tc NUMBER;
2220 l_eqpmt_act_rawcost_tc NUMBER;
2221 l_oth_act_rawcost_tc NUMBER;
2222
2223 l_oth_quantity NUMBER;
2224
2225 l_msg_count NUMBER;
2226 l_msg_data VARCHAR2(2000);
2227 l_data VARCHAR2(2000);
2228 l_msg_index_out NUMBER:=0;
2229 l_WP_STRUCTURE_VERSION_ID number;
2230 l_act_exist_flag VARCHAR2(1):= 'N';
2231 l_act_txn_pc_flag VARCHAR2(10):= 'PC';
2232 l_tot_txn_pc_flag VARCHAR2(10):= 'PC';
2233 BEGIN
2234 IF p_pa_debug_mode = 'Y' THEN
2235 pa_debug.set_curr_function( p_function => 'GEN_ETC_EARNED_VALUE_AMTS',
2236 p_debug_mode => p_pa_debug_mode);
2237 END IF;
2238 X_RETURN_STATUS := FND_API.G_RET_STS_SUCCESS;
2239 X_MSG_COUNT := 0;
2240
2241 l_structure_type := null;
2242 l_structure_status := null;
2243 l_structure_status_flag := null;
2244 l_WP_STRUCTURE_VERSION_ID := null;
2245 /* for getting the financial percent complete,
2246 we dont have to pass the structure version id.
2247 It always comes from the lates published
2248 financial structure version. */
2249 IF P_ETC_SOURCE_CODE = 'FINANCIAL_PLAN' THEN
2250 l_structure_type := 'FINANCIAL';
2251 ELSE
2252 l_WP_STRUCTURE_VERSION_ID := P_WP_STRUCTURE_VERSION_ID;
2253 l_structure_type := 'WORKPLAN';
2254 l_structure_status_flag :=
2255 PA_PROJECT_STRUCTURE_UTILS.Check_Struc_Ver_Published(
2256 P_FP_COLS_REC.X_PROJECT_ID,l_WP_STRUCTURE_VERSION_ID);
2257 If l_structure_status_flag = 'Y' THEN
2258 l_structure_status := 'PUBLISHED';
2259 ELSE
2260 l_structure_status := 'WORKING';
2261 END IF;
2262 END IF;
2263
2264
2265 IF P_PA_DEBUG_MODE = 'Y' THEN
2266 pa_fp_gen_amount_utils.fp_debug
2267 (p_msg => 'Before calling PA_PROGRESS_UTILS.REDEFAULT_BASE_PC',
2268 p_module_name => l_module_name,
2269 p_log_level => 5);
2270 END IF;
2271 PA_PROGRESS_UTILS.REDEFAULT_BASE_PC (
2272 p_Project_ID => P_FP_COLS_REC.X_PROJECT_ID,
2273 p_Proj_element_id => P_TASK_ID,
2274 p_Structure_type => l_structure_type,
2275 p_object_type => 'PA_TASKS',
2276 p_As_Of_Date => P_ACTUALS_THRU_DATE,
2277 P_STRUCTURE_VERSION_ID => l_WP_STRUCTURE_VERSION_ID,
2278 P_STRUCTURE_STATUS => l_structure_status,
2279 p_calling_context => 'FINANCIAL_PLANNING',
2280 X_base_percent_complete => lx_percent_complete,
2281 x_return_status => x_return_status,
2282 x_msg_count => x_msg_count,
2283 x_msg_data => x_msg_data );
2284 IF P_PA_DEBUG_MODE = 'Y' THEN
2285 pa_fp_gen_amount_utils.fp_debug
2286 (p_msg => 'After calling PA_PROGRESS_UTILS.REDEFAULT_BASE_PC,
2287 return status is:'||x_return_status,
2288 p_module_name => l_module_name,
2289 p_log_level => 5);
2290 END IF;
2291 IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
2292 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
2293 END IF;
2294
2295 l_percent_complete := NVL(lx_percent_complete,0)/100;
2296 IF l_percent_complete = 1 THEN
2297 IF P_PA_DEBUG_MODE = 'Y' THEN
2298 PA_DEBUG.RESET_CURR_FUNCTION;
2299 END IF;
2300 RETURN;
2301 END IF;
2302
2303 /*Getting ACWP in both TXN and PROJ currencies*/
2304 IF P_ETC_SOURCE_CODE = 'FINANCIAL_PLAN' THEN
2305 SELECT /*+ INDEX(PA_FP_FCST_GEN_TMP1,PA_FP_FCST_GEN_TMP1_N1)*/
2306 COUNT(DISTINCT TXN_CURRENCY_CODE),SUM(NVL(quantity,0))
2307 INTO l_txn_currency_count_act,l_act_qty
2308 FROM PA_FP_FCST_GEN_TMP1
2309 WHERE project_element_id = P_TASK_ID
2310 AND res_list_member_id = P_RESOURCE_LIST_MEMBER_ID
2311 AND data_type_code = P_ETC_SOURCE_CODE;
2312
2313 IF l_txn_currency_count_act = 0
2314 OR NVL(l_act_qty,0) = 0 THEN
2315 l_act_exist_flag := 'N';
2316 ELSIF l_txn_currency_count_act = 1
2317 AND p_fp_cols_rec.x_plan_in_multi_curr_flag = 'Y' THEN
2318 l_act_exist_flag := 'Y';
2319 l_act_txn_pc_flag := 'TC';
2320 SELECT /*+ INDEX(PA_FP_FCST_GEN_TMP1,PA_FP_FCST_GEN_TMP1_N1)*/
2321 DISTINCT TXN_CURRENCY_CODE
2322 INTO l_txn_currency_code_act
2323 FROM PA_FP_FCST_GEN_TMP1
2324 WHERE project_element_id = P_TASK_ID
2325 AND res_list_member_id = P_RESOURCE_LIST_MEMBER_ID
2326 AND data_type_code = P_ETC_SOURCE_CODE;
2327
2328 BEGIN
2329 SELECT /*+ INDEX(PA_FP_FCST_GEN_TMP1,PA_FP_FCST_GEN_TMP1_N1)*/
2330 SUM(NVL(quantity,0)),
2331 SUM(NVL(txn_raw_cost,0)),
2332 SUM(NVL(txn_brdn_cost,0)),
2333 SUM(NVL(prj_raw_cost,0)),
2334 SUM(NVL(prj_brdn_cost,0))
2335 INTO
2336 l_act_qty,
2337 l_act_txn_raw_cost,
2338 l_act_txn_brdn_cost,
2339 l_act_pc_raw_cost,
2340 l_act_pc_brdn_cost
2341 FROM PA_FP_FCST_GEN_TMP1
2342 WHERE project_element_id = P_TASK_ID
2343 AND res_list_member_id = P_RESOURCE_LIST_MEMBER_ID
2344 AND data_type_code = P_ETC_SOURCE_CODE;
2345 EXCEPTION
2346 WHEN NO_DATA_FOUND THEN
2347 l_act_qty := 0;
2348 l_act_txn_raw_cost := 0;
2349 l_act_txn_brdn_cost := 0;
2350 l_act_pc_raw_cost := 0;
2351 l_act_pc_brdn_cost := 0;
2352 END;
2353 ELSE
2354 l_act_exist_flag := 'Y';
2355 l_act_txn_pc_flag := 'PC';
2356 BEGIN
2357 SELECT /*+ INDEX(PA_FP_FCST_GEN_TMP1,PA_FP_FCST_GEN_TMP1_N1)*/
2358 SUM(NVL(quantity,0)),
2359 SUM(NVL(prj_raw_cost,0)),
2360 SUM(NVL(prj_brdn_cost,0))
2361 INTO
2362 l_act_qty,
2363 l_act_pc_raw_cost,
2364 l_act_pc_brdn_cost
2365 FROM PA_FP_FCST_GEN_TMP1
2366 WHERE project_element_id = P_TASK_ID
2367 AND res_list_member_id = P_RESOURCE_LIST_MEMBER_ID
2368 AND data_type_code = P_ETC_SOURCE_CODE;
2369 EXCEPTION
2370 WHEN NO_DATA_FOUND THEN
2371 l_act_qty := 0;
2372 l_act_pc_raw_cost := 0;
2373 l_act_pc_brdn_cost := 0;
2374 END;
2375 END IF;
2376 ELSIF P_ETC_SOURCE_CODE = 'WORKPLAN_RESOURCES' THEN
2377 IF P_PA_DEBUG_MODE = 'Y' THEN
2378 pa_fp_gen_amount_utils.fp_debug
2379 (p_msg => 'Before calling PA_PROGRESS_UTILS.'||
2380 'get_actuals_for_task in earned_value',
2381 p_module_name => l_module_name,
2382 p_log_level => 5);
2383 END IF;
2384 PA_PROGRESS_UTILS.get_actuals_for_task(
2385 p_project_id => P_FP_COLS_REC.X_PROJECT_ID,
2386 p_wp_task_id => P_TASK_ID,
2387 p_res_list_mem_id => P_RESOURCE_LIST_MEMBER_ID,
2388 p_as_of_date => P_ACTUALS_THRU_DATE,
2389 x_planned_work_qty => l_tot_work_qty,
2390 x_actual_work_qty => l_act_work_qty,
2391 x_ppl_act_cost_pc => l_ppl_act_cost_pc,
2392 x_eqpmt_act_cost_pc => l_eqpmt_act_cost_pc,
2393 x_oth_act_cost_pc => l_oth_act_cost_pc,
2394 x_ppl_act_cost_fc => l_ppl_act_cst_fc,
2395 x_eqpmt_act_cost_fc => l_eqpmt_act_cost_fc,
2396 x_oth_act_cost_fc => l_oth_act_cost_fc,
2397 x_act_labor_effort => l_act_labor_effort,
2398 x_act_eqpmt_effort => l_act_eqpmt_effort,
2399 x_unit_of_measure => l_uom,
2400 x_txn_currency_code => l_txn_currency_code,
2401 x_ppl_act_cost_tc => l_ppl_act_cost_tc,
2402 x_eqpmt_act_cost_tc => l_eqpmt_act_cost_tc,
2403 x_oth_act_cost_tc => l_oth_act_cost_tc,
2404 X_PPL_ACT_RAWCOST_PC => l_ppl_act_rawcost_pc,
2405 X_EQPMT_ACT_RAWCOST_PC => l_eqpmt_act_rawcost_pc,
2406 X_OTH_ACT_RAWCOST_PC => l_oth_act_rawcost_pc,
2407 X_PPL_ACT_RAWCOST_FC => l_ppl_act_rawcst_fc,
2408 X_EQPMT_ACT_RAWCOST_FC => l_eqpmt_act_rawcost_fc,
2409 X_OTH_ACT_RAWCOST_FC => l_oth_act_rawcost_fc,
2410 X_PPL_ACT_RAWCOST_TC => l_ppl_act_rawcost_tc,
2411 X_EQPMT_ACT_RAWCOST_TC => l_eqpmt_act_rawcost_tc,
2412 X_OTH_ACT_RAWCOST_TC => l_oth_act_rawcost_tc,
2413 X_OTH_QUANTITY => l_oth_quantity,
2414 x_return_status => x_return_status,
2415 x_msg_count => x_msg_count,
2416 x_msg_data => x_msg_data );
2417 IF P_PA_DEBUG_MODE = 'Y' THEN
2418 pa_fp_gen_amount_utils.fp_debug
2419 (p_msg => 'After calling PA_PROGRESS_UTILS.'||
2420 'get_actuals_for_task in earned_value'||x_return_status,
2421 p_module_name => l_module_name,
2422 p_log_level => 5);
2423 END IF;
2424 IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
2425 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
2426 END IF;
2427 IF NVL(l_act_labor_effort,0) + NVL(l_act_eqpmt_effort,0)
2428 + NVL(l_oth_quantity,0) = 0 THEN
2429 l_act_exist_flag := 'N';
2430 ELSE
2431 l_act_exist_flag := 'Y';
2432 END IF;
2433
2434 IF p_fp_cols_rec.x_plan_in_multi_curr_flag = 'Y' THEN
2435 l_act_txn_pc_flag := 'TC';
2436 ELSIF p_fp_cols_rec.x_plan_in_multi_curr_flag = 'N' THEN
2437 l_act_txn_pc_flag := 'PC';
2438 END IF;
2439
2440 l_act_qty := NVL(l_act_labor_effort,0) + NVL(l_act_eqpmt_effort,0)
2441 + NVL(l_oth_quantity,0);
2442 l_act_txn_brdn_cost := nvl(l_ppl_act_cost_tc,0) +
2443 nvl(l_eqpmt_act_cost_tc,0) +
2444 nvl(l_oth_act_cost_tc,0);
2445 l_act_txn_raw_cost := nvl(l_ppl_act_rawcost_tc,0) +
2446 nvl(l_eqpmt_act_rawcost_tc,0) +
2447 nvl(l_oth_act_rawcost_tc,0);
2448
2449 l_act_pc_brdn_cost := nvl(l_ppl_act_cost_pc,0) +
2450 nvl(l_eqpmt_act_cost_pc,0) +
2451 nvl(l_oth_act_cost_pc,0);
2452 l_act_pc_raw_cost := nvl(l_ppl_act_rawcost_pc,0) +
2453 nvl(l_eqpmt_act_rawcost_pc,0) +
2454 nvl(l_oth_act_rawcost_pc,0);
2455 l_txn_currency_code_act := l_txn_currency_code;
2456 END IF;
2457
2458 /*Getting TOTAL in both TXN and PROJ currencies*/
2459 SELECT /*+ INDEX(PA_FP_CALC_AMT_TMP2,PA_FP_CALC_AMT_TMP2_N2)*/
2460 COUNT(DISTINCT TXN_CURRENCY_CODE)
2461 INTO l_txn_currency_count_tot
2462 FROM PA_FP_CALC_AMT_TMP2
2463 WHERE RESOURCE_ASSIGNMENT_ID = P_RESOURCE_ASSIGNMENT_ID
2464 AND ETC_CURRENCY_CODE IS NULL;
2465
2466 IF l_txn_currency_count_tot = 1
2467 AND p_fp_cols_rec.x_plan_in_multi_curr_flag = 'Y' THEN
2468 l_tot_txn_pc_flag := 'TC';
2469 SELECT /*+ INDEX(PA_FP_CALC_AMT_TMP2,PA_FP_CALC_AMT_TMP2_N2)*/
2470 DISTINCT TXN_CURRENCY_CODE
2471 INTO l_txn_currency_code_tot
2472 FROM PA_FP_CALC_AMT_TMP2
2473 WHERE RESOURCE_ASSIGNMENT_ID = P_RESOURCE_ASSIGNMENT_ID
2474 AND ETC_CURRENCY_CODE IS NULL;
2475
2476 BEGIN
2477 SELECT /*+ INDEX(PA_FP_CALC_AMT_TMP2,PA_FP_CALC_AMT_TMP2_N2)*/
2478 SUM(NVL(TOTAL_PLAN_QUANTITY, 0)),
2479 SUM(NVL(TOTAL_TXN_RAW_COST,0)),
2480 SUM(NVL(TOTAL_TXN_BURDENED_COST,0)),
2481 SUM(NVL(TOTAL_PC_RAW_COST, 0)),
2482 SUM(NVL(TOTAL_PC_BURDENED_COST,0))
2483 INTO l_tot_qty,
2484 l_tot_txn_raw_cost,
2485 l_tot_txn_brdn_cost,
2486 l_tot_pc_raw_cost,
2487 l_tot_pc_brdn_cost
2488 FROM PA_FP_CALC_AMT_TMP2
2489 WHERE RESOURCE_ASSIGNMENT_ID = P_RESOURCE_ASSIGNMENT_ID
2490 AND ETC_CURRENCY_CODE IS NULL;
2491 EXCEPTION
2492 WHEN NO_DATA_FOUND THEN
2493 l_tot_qty := 0;
2494 l_tot_txn_raw_cost := 0;
2495 l_tot_txn_brdn_cost := 0;
2496 l_tot_pc_raw_cost := 0;
2497 l_tot_pc_brdn_cost := 0;
2498 END;
2499 ELSE
2500 l_tot_txn_pc_flag := 'PC';
2501 BEGIN
2502 SELECT /*+ INDEX(PA_FP_CALC_AMT_TMP2,PA_FP_CALC_AMT_TMP2_N2)*/
2503 SUM(NVL(TOTAL_PLAN_QUANTITY, 0)),
2504 SUM(NVL(TOTAL_PC_RAW_COST,0)),
2505 SUM(NVL(TOTAL_PC_BURDENED_COST,0))
2506 INTO l_tot_qty,
2507 l_tot_pc_raw_cost,
2508 l_tot_pc_brdn_cost
2509 FROM PA_FP_CALC_AMT_TMP2
2510 WHERE RESOURCE_ASSIGNMENT_ID = P_RESOURCE_ASSIGNMENT_ID
2511 AND ETC_CURRENCY_CODE IS NULL;
2512 EXCEPTION
2513 WHEN NO_DATA_FOUND THEN
2514 l_tot_qty := 0;
2515 l_tot_pc_raw_cost := 0;
2516 l_tot_pc_brdn_cost := 0;
2517 END;
2518 END IF;
2519
2520 /* Getting ETC amounts
2521 1.ACWP = 0: ETC = TOTAL
2522 2.Percent = 0: ETC = TOTAL-ACWP
2523 3.OTHERS: ETC = ACWP * (1-percent)/percent*/
2524 l_etc_currency_code := P_FP_COLS_REC.x_project_currency_code;
2525 IF l_act_exist_flag = 'N' THEN
2526 l_etc_qty := l_tot_qty;
2527 IF l_tot_txn_pc_flag = 'PC' THEN
2528 l_etc_raw_cost := l_tot_pc_raw_cost;
2529 l_etc_brdn_cost := l_tot_pc_brdn_cost;
2530 ELSE
2531 l_etc_raw_cost := l_tot_txn_raw_cost;
2532 l_etc_brdn_cost := l_tot_txn_brdn_cost;
2533 l_etc_currency_code := l_txn_currency_code_tot;
2534 END IF;
2535 ELSIF l_percent_complete = 0 THEN
2536 l_etc_qty := NVL(l_tot_qty,0) - NVL(l_act_qty,0);
2537 IF l_tot_txn_pc_flag = 'TC' AND l_act_txn_pc_flag = 'TC' THEN
2538 l_etc_raw_cost := NVL(l_tot_txn_raw_cost,0) - NVL(l_act_txn_raw_cost,0);
2539 l_etc_brdn_cost := NVL(l_tot_txn_brdn_cost,0) - NVL(l_act_txn_brdn_cost,0);
2540 l_etc_currency_code := l_txn_currency_code_tot;
2541 ELSE
2542 l_etc_raw_cost := NVL(l_tot_pc_raw_cost,0) - NVL(l_act_pc_raw_cost,0);
2543 l_etc_brdn_cost := NVL(l_tot_pc_brdn_cost,0) - NVL(l_act_pc_brdn_cost,0);
2544 END IF;
2545 ELSE
2546 l_etc_qty := l_act_qty *((1-l_percent_complete)/l_percent_complete);
2547 IF l_act_txn_pc_flag = 'TC' THEN
2548 l_etc_raw_cost := l_act_txn_raw_cost *((1-l_percent_complete)/l_percent_complete);
2549 l_etc_brdn_cost := l_act_txn_brdn_cost *((1-l_percent_complete)/l_percent_complete);
2550 l_etc_currency_code := l_txn_currency_code_act;
2551 ELSE
2552 l_etc_raw_cost := l_act_pc_raw_cost *((1-l_percent_complete)/l_percent_complete);
2553 l_etc_brdn_cost := l_act_pc_brdn_cost *((1-l_percent_complete)/l_percent_complete);
2554 END IF;
2555 END IF;
2556
2557 IF l_etc_qty <> 0 OR l_etc_raw_cost <> 0 OR l_etc_brdn_cost <> 0 THEN
2558 INSERT INTO PA_FP_CALC_AMT_TMP2
2559 (RESOURCE_ASSIGNMENT_ID,
2560 ETC_CURRENCY_CODE,
2561 ETC_PLAN_QUANTITY,
2562 ETC_TXN_RAW_COST,
2563 ETC_TXN_BURDENED_COST)
2564 VALUES
2565 (P_RESOURCE_ASSIGNMENT_ID,
2566 l_etc_currency_code,
2567 l_etc_qty,
2568 l_etc_raw_cost,
2569 l_etc_brdn_cost);
2570 END IF;
2571
2572 IF P_PA_DEBUG_MODE = 'Y' THEN
2573 PA_DEBUG.RESET_CURR_FUNCTION;
2574 END IF;
2575
2576 EXCEPTION
2577 WHEN PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc THEN
2578 l_msg_count := FND_MSG_PUB.count_msg;
2579 IF l_msg_count = 1 THEN
2580 PA_INTERFACE_UTILS_PUB.get_messages
2581 ( p_encoded => FND_API.G_TRUE,
2582 p_msg_index => 1,
2583 p_msg_count => l_msg_count,
2584 p_msg_data => l_msg_data,
2585 p_data => l_data,
2586 p_msg_index_out => l_msg_index_out);
2587 x_msg_data := l_data;
2588 x_msg_count := l_msg_count;
2589 ELSE
2590 x_msg_count := l_msg_count;
2591 END IF;
2592
2593 ROLLBACK;
2594 x_return_status := FND_API.G_RET_STS_ERROR;
2595
2596 IF P_PA_DEBUG_MODE = 'Y' THEN
2597 pa_fp_gen_amount_utils.fp_debug
2598 (p_msg => 'Invalid Arguments Passed',
2599 p_module_name => l_module_name,
2600 p_log_level => 5);
2601 PA_DEBUG.RESET_CURR_FUNCTION;
2602 END IF;
2603 RAISE;
2604 WHEN OTHERS THEN
2605 rollback;
2606 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2607 x_msg_count := 1;
2608 x_msg_data := substr(sqlerrm,1,240);
2609 -- dbms_output.put_line('error msg :'||x_msg_data);
2610 FND_MSG_PUB.add_exc_msg
2611 ( p_pkg_name => 'PA_FP_GEN_FCST_AMT_PUB1',
2612 p_procedure_name => 'GEN_ETC_EARNED_VALUE_AMTS',
2613 p_error_text => substr(sqlerrm,1,240));
2614
2615 IF P_PA_DEBUG_MODE = 'Y' THEN
2616 pa_fp_gen_amount_utils.fp_debug
2617 (p_msg => 'Unexpected Error'||substr(sqlerrm, 1, 240),
2618 p_module_name => l_module_name,
2619 p_log_level => 5);
2620 PA_DEBUG.RESET_CURR_FUNCTION;
2621 END IF;
2622 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2623 END GET_ETC_EARNED_VALUE_AMTS;
2624
2625 PROCEDURE GET_ETC_WORK_QTY_AMTS
2626 (P_PROJECT_ID IN PA_PROJECTS_ALL.PROJECT_ID%TYPE,
2627 P_PROJ_CURRENCY_CODE IN VARCHAR2,
2628 P_BUDGET_VERSION_ID IN PA_BUDGET_VERSIONS.BUDGET_VERSION_ID%TYPE,
2629 P_TASK_ID IN NUMBER,
2630 P_TARGET_RES_LIST_ID IN NUMBER,
2631 P_ACTUALS_THRU_DATE IN PA_PERIODS_ALL.END_DATE%TYPE,
2632 P_FP_COLS_REC IN PA_FP_GEN_AMOUNT_UTILS.FP_COLS,
2633 P_WP_STRUCTURE_VERSION_ID IN PA_PROJ_ELEM_VER_STRUCTURE.ELEMENT_VERSION_ID%TYPE,
2634 X_RETURN_STATUS OUT NOCOPY VARCHAR2,
2635 X_MSG_COUNT OUT NOCOPY NUMBER,
2636 X_MSG_DATA OUT NOCOPY VARCHAR2)
2637 IS
2638 l_module_name VARCHAR2(200) := 'pa.plsql.PA_FP_GEN_FCST_AMT_PUB1.GEN_ETC_WORK_QTY_AMT';
2639
2640 l_stru_sharing_code pa_projects_all.STRUCTURE_SHARING_CODE%TYPE;
2641
2642 l_act_work_qty NUMBER :=0;
2643 l_act_raw_cost_pc NUMBER :=0;
2644 l_act_brdn_cost_pc NUMBER :=0;
2645
2646 l_act_work_qty_ind NUMBER :=0;
2647 l_act_raw_cost_pc_ind NUMBER :=0;
2648 l_act_brdn_cost_pc_ind NUMBER :=0;
2649
2650 l_etc_work_qty NUMBER :=0;
2651 l_etc_raw_cost_pc NUMBER :=0;
2652 l_etc_brdn_cost_pc NUMBER :=0;
2653
2654 l_etc_work_qty_ind NUMBER :=0;
2655 l_etc_raw_cost_pc_ind NUMBER :=0;
2656 l_etc_brdn_cost_pc_ind NUMBER :=0;
2657
2658 l_tot_work_qty NUMBER :=0;
2659
2660 l_tot_work_qty_ind NUMBER;
2661
2662 l_ppl_act_cost_pc NUMBER;
2663 l_eqpmt_act_cost_pc NUMBER;
2664 l_oth_act_cost_pc NUMBER;
2665 l_ppl_act_cst_fc NUMBER;
2666 l_eqpmt_act_cost_fc NUMBER;
2667 l_oth_act_cost_fc NUMBER;
2668 l_txn_currency_code VARCHAR2(30);
2669 l_ppl_act_cost_tc NUMBER;
2670 l_eqpmt_act_cost_tc NUMBER;
2671 l_oth_act_cost_tc NUMBER;
2672 l_act_labor_effort NUMBER;
2673 l_act_eqpmt_effort NUMBER;
2674 l_uom VARCHAR2(30);
2675
2676 l_ppl_act_cost_pc_ind NUMBER;
2677 l_eqpmt_act_cost_pc_ind NUMBER;
2678 l_oth_act_cost_pc_ind NUMBER;
2679 l_ppl_act_cst_fc_ind NUMBER;
2680 l_eqpmt_act_cost_fc_ind NUMBER;
2681 l_oth_act_cost_fc_ind NUMBER;
2682 l_txn_currency_code_ind VARCHAR2(30);
2683 l_ppl_act_cost_tc_ind NUMBER;
2684 l_eqpmt_act_cost_tc_ind NUMBER;
2685 l_oth_act_cost_tc_ind NUMBER;
2686 l_act_labor_effort_ind NUMBER;
2687 l_act_eqpmt_effort_ind NUMBER;
2688 l_uom_ind VARCHAR2(30);
2689 --
2690 l_ppl_act_rawcost_pc NUMBER;
2691 l_eqpmt_act_rawcost_pc NUMBER;
2692 l_oth_act_rawcost_pc NUMBER;
2693 l_ppl_act_rawcst_fc NUMBER;
2694 l_eqpmt_act_rawcost_fc NUMBER;
2695 l_oth_act_rawcost_fc NUMBER;
2696 l_ppl_act_rawcost_tc NUMBER;
2697 l_eqpmt_act_rawcost_tc NUMBER;
2698 l_oth_act_rawcost_tc NUMBER;
2699
2700 l_oth_quantity NUMBER;
2701
2702 l_ppl_act_rawcost_pc_ind NUMBER;
2703 l_eqpmt_act_rawcost_pc_ind NUMBER;
2704 l_oth_act_rawcost_pc_ind NUMBER;
2705 l_ppl_act_rawcst_fc_ind NUMBER;
2706 l_eqpmt_act_rawcost_fc_ind NUMBER;
2707 l_oth_act_rawcost_fc_ind NUMBER;
2708 l_ppl_act_rawcost_tc_ind NUMBER;
2709 l_eqpmt_act_rawcost_tc_ind NUMBER;
2710 l_oth_act_rawcost_tc_ind NUMBER;
2711
2712 l_oth_quantity_ind NUMBER;
2713 --
2714 l_wp_task_tab PA_PLSQL_DATATYPES.IdTabTyp;
2715
2716 l_start_date DATE;
2717 l_completion_date DATE;
2718
2719 l_ppl_class_rlm_id NUMBER;
2720
2721 l_msg_count NUMBER;
2722 l_msg_data VARCHAR2(2000);
2723 l_data VARCHAR2(2000);
2724 l_msg_index_out NUMBER:=0;
2725 l_sysdate DATE;
2726 l_transaction_source_code PA_FP_CALC_AMT_TMP2.transaction_source_code%TYPE;
2727 BEGIN
2728 X_RETURN_STATUS := FND_API.G_RET_STS_SUCCESS;
2729 X_MSG_COUNT := 0;
2730 l_sysdate := trunc(sysdate);
2731 IF p_pa_debug_mode = 'Y' THEN
2732 pa_debug.set_curr_function( p_function => 'GEN_ETC_WORK_QTY_AMTS',
2733 p_debug_mode => p_pa_debug_mode);
2734 END IF;
2735
2736 l_stru_sharing_code :=
2737 PA_PROJECT_STRUCTURE_UTILS.get_Structure_sharing_code(P_PROJECT_ID=> P_PROJECT_ID);
2738 IF l_stru_sharing_code = 'SHARE_FULL' THEN
2739 IF P_PA_DEBUG_MODE = 'Y' THEN
2740 pa_fp_gen_amount_utils.fp_debug
2741 (p_msg => 'Before calling PA_PROGRESS_UTILS.'||
2742 'get_actuals_for_task when SHARE_FULL',
2743 p_module_name => l_module_name,
2744 p_log_level => 5);
2745 END IF;
2746 PA_PROGRESS_UTILS.get_actuals_for_task(
2747 p_project_id => P_PROJECT_ID,
2748 p_wp_task_id => P_TASK_ID,
2749 p_res_list_mem_id => NULL,
2750 p_as_of_date => P_ACTUALS_THRU_DATE,
2751 x_planned_work_qty => l_tot_work_qty,
2752 x_actual_work_qty => l_act_work_qty,
2753 x_ppl_act_cost_pc => l_ppl_act_cost_pc,
2754 x_eqpmt_act_cost_pc => l_eqpmt_act_cost_pc,
2755 x_oth_act_cost_pc => l_oth_act_cost_pc,
2756 x_ppl_act_cost_fc => l_ppl_act_cst_fc,
2757 x_eqpmt_act_cost_fc => l_eqpmt_act_cost_fc,
2758 x_oth_act_cost_fc => l_oth_act_cost_fc,
2759 x_act_labor_effort => l_act_labor_effort,
2760 x_act_eqpmt_effort => l_act_eqpmt_effort,
2761 x_unit_of_measure => l_uom,
2762 x_txn_currency_code => l_txn_currency_code,
2763 x_ppl_act_cost_tc => l_ppl_act_cost_tc,
2764 x_eqpmt_act_cost_tc => l_eqpmt_act_cost_tc,
2765 x_oth_act_cost_tc => l_oth_act_cost_tc,
2766 X_PPL_ACT_RAWCOST_PC => l_ppl_act_rawcost_pc,
2767 X_EQPMT_ACT_RAWCOST_PC => l_eqpmt_act_rawcost_pc,
2768 X_OTH_ACT_RAWCOST_PC => l_oth_act_rawcost_pc,
2769 X_PPL_ACT_RAWCOST_FC => l_ppl_act_rawcst_fc,
2770 X_EQPMT_ACT_RAWCOST_FC => l_eqpmt_act_rawcost_fc,
2771 X_OTH_ACT_RAWCOST_FC => l_oth_act_rawcost_fc,
2772 X_PPL_ACT_RAWCOST_TC => l_ppl_act_rawcost_tc,
2773 X_EQPMT_ACT_RAWCOST_TC => l_eqpmt_act_rawcost_tc,
2774 X_OTH_ACT_RAWCOST_TC => l_oth_act_rawcost_tc,
2775 X_OTH_QUANTITY => l_oth_quantity,
2776 x_return_status => x_return_status,
2777 x_msg_count => x_msg_count,
2778 x_msg_data => x_msg_data );
2779 IF P_PA_DEBUG_MODE = 'Y' THEN
2780 pa_fp_gen_amount_utils.fp_debug
2781 (p_msg => 'After calling PA_PROGRESS_UTILS.'||
2782 'get_actuals_for_task when SHARE_FULL'||x_return_status,
2783 p_module_name => l_module_name,
2784 p_log_level => 5);
2785 END IF;
2786 IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
2787 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
2788 END IF;
2789
2790 IF NVL(l_act_work_qty,0) <> 0 THEN
2791 l_etc_work_qty := NVL(l_tot_work_qty,0) - NVL(l_act_work_qty,0);
2792 l_act_brdn_cost_pc := nvl(l_ppl_act_cost_pc,0) +
2793 nvl(l_eqpmt_act_cost_pc,0) +
2794 nvl(l_oth_act_cost_pc,0);
2795 l_etc_brdn_cost_pc := l_etc_work_qty * (l_act_brdn_cost_pc/l_act_work_qty);
2796 l_act_raw_cost_pc := nvl(l_ppl_act_rawcost_pc,0) +
2797 nvl(l_eqpmt_act_rawcost_pc,0) +
2798 nvl(l_oth_act_rawcost_pc,0);
2799 l_etc_raw_cost_pc := l_etc_work_qty * (l_act_raw_cost_pc/l_act_work_qty);
2800 END IF;
2801 ELSIF l_stru_sharing_code = 'SHARE_PARTIAL' OR
2802 l_stru_sharing_code = 'SPLIT_MAPPING' THEN
2803 SELECT PROJ_ELEMENT_ID
2804 BULK COLLECT INTO l_wp_task_tab
2805 FROM PA_MAP_WP_TO_FIN_TASKS_V
2806 WHERE PARENT_STRUCTURE_VERSION_ID = P_WP_STRUCTURE_VERSION_ID
2807 AND MAPPED_FIN_TASK_ID = P_TASK_ID;
2808
2809 FOR i IN 1..l_wp_task_tab.count LOOP
2810 IF P_PA_DEBUG_MODE = 'Y' THEN
2811 pa_fp_gen_amount_utils.fp_debug
2812 (p_msg => 'Before calling PA_PROGRESS_UTILS.'||
2813 'get_actuals_for_task when MAPPING',
2814 p_module_name => l_module_name,
2815 p_log_level => 5);
2816 END IF;
2817 PA_PROGRESS_UTILS.get_actuals_for_task(
2818 p_project_id => P_PROJECT_ID,
2819 p_wp_task_id => l_wp_task_tab(i),
2820 p_res_list_mem_id => NULL,
2821 p_as_of_date => P_ACTUALS_THRU_DATE,
2822 x_planned_work_qty => l_tot_work_qty_ind,
2823 x_actual_work_qty => l_act_work_qty_ind,
2824 x_ppl_act_cost_pc => l_ppl_act_cost_pc_ind,
2825 x_eqpmt_act_cost_pc => l_eqpmt_act_cost_pc_ind,
2826 x_oth_act_cost_pc => l_oth_act_cost_pc_ind,
2827 x_ppl_act_cost_fc => l_ppl_act_cst_fc_ind,
2828 x_eqpmt_act_cost_fc => l_eqpmt_act_cost_fc_ind,
2829 x_oth_act_cost_fc => l_oth_act_cost_fc_ind,
2830 x_act_labor_effort => l_act_labor_effort_ind,
2831 x_act_eqpmt_effort => l_act_eqpmt_effort_ind,
2832 x_unit_of_measure => l_uom_ind,
2833 x_txn_currency_code => l_txn_currency_code_ind,
2834 x_ppl_act_cost_tc => l_ppl_act_cost_tc_ind,
2835 x_eqpmt_act_cost_tc => l_eqpmt_act_cost_tc_ind,
2836 x_oth_act_cost_tc => l_oth_act_cost_tc_ind,
2837 X_PPL_ACT_RAWCOST_PC => l_ppl_act_rawcost_pc_ind,
2838 X_EQPMT_ACT_RAWCOST_PC => l_eqpmt_act_rawcost_pc_ind,
2839 X_OTH_ACT_RAWCOST_PC => l_oth_act_rawcost_pc_ind,
2840 X_PPL_ACT_RAWCOST_FC => l_ppl_act_rawcst_fc_ind,
2841 X_EQPMT_ACT_RAWCOST_FC => l_eqpmt_act_rawcost_fc_ind,
2842 X_OTH_ACT_RAWCOST_FC => l_oth_act_rawcost_fc_ind,
2843 X_PPL_ACT_RAWCOST_TC => l_ppl_act_rawcost_tc_ind,
2844 X_EQPMT_ACT_RAWCOST_TC => l_eqpmt_act_rawcost_tc_ind,
2845 X_OTH_ACT_RAWCOST_TC => l_oth_act_rawcost_tc_ind,
2846 X_OTH_QUANTITY => l_oth_quantity_ind,
2847 x_return_status => x_return_status,
2848 x_msg_count => x_msg_count,
2849 x_msg_data => x_msg_data );
2850 IF P_PA_DEBUG_MODE = 'Y' THEN
2851 pa_fp_gen_amount_utils.fp_debug
2852 (p_msg => 'After calling PA_PROGRESS_UTILS.'||
2853 'get_actuals_for_task when MAPPING'||x_return_status,
2854 p_module_name => l_module_name,
2855 p_log_level => 5);
2856 END IF;
2857 IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
2858 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
2859 END IF;
2860 IF NVL(l_act_work_qty_ind,0) <> 0 THEN
2861 -- ER 5726773: Sum work qty for WP tasks mapping to target task
2862 l_tot_work_qty := l_tot_work_qty + l_tot_work_qty_ind;
2863 l_etc_work_qty_ind := NVL(l_tot_work_qty_ind,0) - NVL(l_act_work_qty_ind,0);
2864 l_act_brdn_cost_pc_ind := nvl(l_ppl_act_cost_pc_ind,0) +
2865 nvl(l_eqpmt_act_cost_pc_ind,0) +
2866 nvl(l_oth_act_cost_pc_ind,0);
2867 l_etc_brdn_cost_pc_ind := l_etc_work_qty_ind * (l_act_brdn_cost_pc_ind/l_act_work_qty_ind);
2868 l_etc_brdn_cost_pc := l_etc_brdn_cost_pc + l_etc_brdn_cost_pc_ind;
2869
2870 l_act_raw_cost_pc_ind := nvl(l_ppl_act_rawcost_pc_ind,0) +
2871 nvl(l_eqpmt_act_rawcost_pc_ind,0) +
2872 nvl(l_oth_act_rawcost_pc_ind,0);
2873 l_etc_raw_cost_pc_ind := l_etc_work_qty_ind * (l_act_raw_cost_pc_ind/l_act_work_qty_ind);
2874 l_etc_raw_cost_pc := l_etc_raw_cost_pc + l_etc_raw_cost_pc_ind;
2875 END IF;
2876 END LOOP;
2877 ELSE -- l_stru_sharing_code ='SPLIT_NO_MAPPING'
2878 SELECT proj_element_id
2879 BULK COLLECT INTO l_wp_task_tab
2880 FROM pa_proj_element_versions
2881 WHERE PARENT_STRUCTURE_VERSION_ID = P_WP_STRUCTURE_VERSION_ID
2882 AND OBJECT_TYPE = 'PA_TASKS';
2883
2884 FOR i IN 1..l_wp_task_tab.count LOOP
2885 IF P_PA_DEBUG_MODE = 'Y' THEN
2886 pa_fp_gen_amount_utils.fp_debug
2887 (p_msg => 'Before calling PA_PROGRESS_UTILS.'||
2888 'get_actuals_for_task when NO_MAPPINGL',
2889 p_module_name => l_module_name,
2890 p_log_level => 5);
2891 END IF;
2892 PA_PROGRESS_UTILS.get_actuals_for_task(
2893 p_project_id => P_PROJECT_ID,
2894 p_wp_task_id => l_wp_task_tab(i),
2895 p_res_list_mem_id => NULL,
2896 p_as_of_date => P_ACTUALS_THRU_DATE,
2897 x_planned_work_qty => l_tot_work_qty_ind,
2898 x_actual_work_qty => l_act_work_qty_ind,
2899 x_ppl_act_cost_pc => l_ppl_act_cost_pc_ind,
2900 x_eqpmt_act_cost_pc => l_eqpmt_act_cost_pc_ind,
2901 x_oth_act_cost_pc => l_oth_act_cost_pc_ind,
2902 x_ppl_act_cost_fc => l_ppl_act_cst_fc_ind,
2903 x_eqpmt_act_cost_fc => l_eqpmt_act_cost_fc_ind,
2904 x_oth_act_cost_fc => l_oth_act_cost_fc_ind,
2905 x_act_labor_effort => l_act_labor_effort_ind,
2906 x_act_eqpmt_effort => l_act_eqpmt_effort_ind,
2907 x_unit_of_measure => l_uom_ind,
2908 x_txn_currency_code => l_txn_currency_code_ind,
2909 x_ppl_act_cost_tc => l_ppl_act_cost_tc_ind,
2910 x_eqpmt_act_cost_tc => l_eqpmt_act_cost_tc_ind,
2911 x_oth_act_cost_tc => l_oth_act_cost_tc_ind,
2912 X_PPL_ACT_RAWCOST_PC => l_ppl_act_rawcost_pc_ind,
2913 X_EQPMT_ACT_RAWCOST_PC => l_eqpmt_act_rawcost_pc_ind,
2914 X_OTH_ACT_RAWCOST_PC => l_oth_act_rawcost_pc_ind,
2915 X_PPL_ACT_RAWCOST_FC => l_ppl_act_rawcst_fc_ind,
2916 X_EQPMT_ACT_RAWCOST_FC => l_eqpmt_act_rawcost_fc_ind,
2917 X_OTH_ACT_RAWCOST_FC => l_oth_act_rawcost_fc_ind,
2918 X_PPL_ACT_RAWCOST_TC => l_ppl_act_rawcost_tc_ind,
2919 X_EQPMT_ACT_RAWCOST_TC => l_eqpmt_act_rawcost_tc_ind,
2920 X_OTH_ACT_RAWCOST_TC => l_oth_act_rawcost_tc_ind,
2921 X_OTH_QUANTITY => l_oth_quantity_ind,
2922 x_return_status => x_return_status,
2923 x_msg_count => x_msg_count,
2924 x_msg_data => x_msg_data );
2925 IF P_PA_DEBUG_MODE = 'Y' THEN
2926 pa_fp_gen_amount_utils.fp_debug
2927 (p_msg => 'After calling PA_PROGRESS_UTILS.'||
2928 'get_actuals_for_task when NO_MAPPING'||x_return_status,
2929 p_module_name => l_module_name,
2930 p_log_level => 5);
2931 END IF;
2932 IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
2933 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
2934 END IF;
2935 IF NVL(l_act_work_qty_ind,0) <> 0 THEN
2936 -- ER 5726773: Sum work qty for WP tasks mapping to target task
2937 l_tot_work_qty := l_tot_work_qty + l_tot_work_qty_ind;
2938 l_etc_work_qty_ind := NVL(l_tot_work_qty_ind,0) - NVL(l_act_work_qty_ind,0);
2939 l_act_brdn_cost_pc_ind := nvl(l_ppl_act_cost_pc_ind,0) +
2940 nvl(l_eqpmt_act_cost_pc_ind,0) +
2941 nvl(l_oth_act_cost_pc_ind,0);
2942 l_etc_brdn_cost_pc_ind := l_etc_work_qty_ind * (l_act_brdn_cost_pc_ind/l_act_work_qty_ind);
2943 l_etc_brdn_cost_pc := l_etc_brdn_cost_pc + l_etc_brdn_cost_pc_ind;
2944
2945 l_act_raw_cost_pc_ind := nvl(l_ppl_act_rawcost_pc_ind,0) +
2946 nvl(l_eqpmt_act_rawcost_pc_ind,0) +
2947 nvl(l_oth_act_rawcost_pc_ind,0);
2948 l_etc_raw_cost_pc_ind := l_etc_work_qty_ind * (l_act_raw_cost_pc_ind/l_act_work_qty_ind);
2949 l_etc_raw_cost_pc := l_etc_raw_cost_pc + l_etc_raw_cost_pc_ind;
2950 END IF;
2951 END LOOP;
2952 END IF;
2953 /*not used in work_qty
2954 INSERT INTO PA_FP_CALC_AMT_TMP2 (
2955 RESOURCE_ASSIGNMENT_ID,
2956 TXN_CURRENCY_CODE,
2957 TOTAL_PLAN_QUANTITY,
2958 TOTAL_TXN_RAW_COST,
2959 TOTAL_TXN_BURDENED_COST)
2960 VALUES ( (-1) * P_TASK_ID,
2961 P_PROJ_CURRENCY_CODE,
2962 l_tot_work_qty,
2963 l_tot_raw_cost_pc,
2964 l_tot_brdn_cost_pc);*/
2965 -- ER 5726773: Instead of directly checking if (ETC > 0), let the
2966 -- plan_etc_signs_match function decide if ETC should be generated.
2967
2968 IF pa_fp_fcst_gen_amt_utils.
2969 PLAN_ETC_SIGNS_MATCH(l_tot_work_qty,l_etc_work_qty) THEN
2970 IF P_FP_COLS_REC.X_GEN_INCL_OPEN_COMM_FLAG = 'Y' THEN
2971 l_transaction_source_code := 'TOTAL_ETC';
2972 ELSE
2973 l_transaction_source_code := 'ETC';
2974 END IF;
2975 INSERT INTO PA_FP_CALC_AMT_TMP2 (
2976 RESOURCE_ASSIGNMENT_ID,
2977 ETC_CURRENCY_CODE,
2978 ETC_PLAN_QUANTITY,
2979 ETC_TXN_RAW_COST,
2980 ETC_TXN_BURDENED_COST,
2981 TRANSACTION_SOURCE_CODE,
2982 ACTUAL_WORK_QTY)
2983 VALUES ((-1) * P_TASK_ID,
2984 P_PROJ_CURRENCY_CODE,
2985 l_etc_raw_cost_pc,
2986 l_etc_raw_cost_pc,
2987 l_etc_brdn_cost_pc,
2988 l_transaction_source_code,
2989 l_act_work_qty_ind);
2990 END IF;
2991
2992 IF p_task_id IS NOT NULL THEN
2993 SELECT nvl(start_date,l_sysdate),
2994 nvl(completion_date,l_sysdate)
2995 INTO l_start_date, l_completion_date
2996 FROM pa_tasks
2997 WHERE task_id = P_TASK_ID;
2998 ELSE
2999 SELECT nvl(start_date,l_sysdate),
3000 nvl(completion_date,l_sysdate)
3001 INTO l_start_date, l_completion_date
3002 FROM pa_projects_all
3003 WHERE project_id = p_project_id;
3004
3005 END IF;
3006 /**For work quantity, we needn't do mapping, because we get the corresponding res
3007 *list id (PEOPLE) for the specific rml_id**/
3008 l_ppl_class_rlm_id := PA_FP_GEN_AMOUNT_UTILS.GET_RLM_ID
3009 (P_PROJECT_ID => P_PROJECT_ID,
3010 P_RESOURCE_LIST_ID => P_TARGET_RES_LIST_ID,
3011 P_RESOURCE_CLASS_CODE => 'FINANCIAL_ELEMENTS');
3012 /*
3013 SELECT resource_list_member_id INTO l_ppl_class_rlm_id
3014 FROM pa_resource_list_members
3015 WHERE resource_list_id = P_TARGET_RES_LIST_ID
3016 AND resource_class_flag = 'Y'
3017 AND resource_class_code = 'PEOPLE';
3018 */
3019 INSERT INTO PA_FP_CALC_AMT_TMP1 (
3020 RESOURCE_ASSIGNMENT_ID,
3021 BUDGET_VERSION_ID,
3022 PROJECT_ID,
3023 TASK_ID,
3024 TARGET_RLM_ID,
3025 PLANNING_START_DATE,
3026 PLANNING_END_DATE,
3027 TRANSACTION_SOURCE_CODE,
3028 MAPPED_FIN_TASK_ID )
3029 VALUES (
3030 (-1) * P_TASK_ID,
3031 P_BUDGET_VERSION_ID,
3032 P_PROJECT_ID,
3033 P_TASK_ID,
3034 l_ppl_class_rlm_id,
3035 l_start_date,
3036 l_completion_date,
3037 'WORK_QUANTITY',
3038 P_TASK_ID );
3039
3040 IF P_PA_DEBUG_MODE = 'Y' THEN
3041 PA_DEBUG.RESET_CURR_FUNCTION;
3042 END IF;
3043 EXCEPTION
3044 WHEN PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc THEN
3045 l_msg_count := FND_MSG_PUB.count_msg;
3046 IF l_msg_count = 1 THEN
3047 PA_INTERFACE_UTILS_PUB.get_messages
3048 ( p_encoded => FND_API.G_TRUE,
3049 p_msg_index => 1,
3050 p_msg_count => l_msg_count,
3051 p_msg_data => l_msg_data,
3052 p_data => l_data,
3053 p_msg_index_out => l_msg_index_out);
3054 x_msg_data := l_data;
3055 x_msg_count := l_msg_count;
3056 ELSE
3057 x_msg_count := l_msg_count;
3058 END IF;
3059
3060 ROLLBACK;
3061 x_return_status := FND_API.G_RET_STS_ERROR;
3062
3063 IF P_PA_DEBUG_MODE = 'Y' THEN
3064 pa_fp_gen_amount_utils.fp_debug
3065 (p_msg => 'Invalid Arguments Passed',
3066 p_module_name => l_module_name,
3067 p_log_level => 5);
3068 PA_DEBUG.RESET_CURR_FUNCTION;
3069 END IF;
3070 RAISE;
3071 WHEN OTHERS THEN
3072 rollback;
3073 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
3074 x_msg_count := 1;
3075 x_msg_data := substr(sqlerrm,1,240);
3076 -- dbms_output.put_line('error msg :'||x_msg_data);
3077 FND_MSG_PUB.add_exc_msg
3078 ( p_pkg_name => 'PA_FP_GEN_FCST_AMT_PUB1',
3079 p_procedure_name => 'GEN_ETC_WORK_QTY_AMTS',
3080 p_error_text => substr(sqlerrm,1,240));
3081
3082 IF P_PA_DEBUG_MODE = 'Y' THEN
3083 pa_fp_gen_amount_utils.fp_debug
3084 (p_msg => 'Unexpected Error'||substr(sqlerrm, 1, 240),
3085 p_module_name => l_module_name,
3086 p_log_level => 5);
3087 PA_DEBUG.RESET_CURR_FUNCTION;
3088 END IF;
3089 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3090 END GET_ETC_WORK_QTY_AMTS;
3091
3092 PROCEDURE NONE_ETC_SRC
3093 (P_PROJECT_ID IN PA_PROJECTS_ALL.PROJECT_ID%TYPE,
3094 P_BUDGET_VERSION_ID IN PA_BUDGET_VERSIONS.BUDGET_VERSION_ID%TYPE,
3095 P_RESOURCE_LIST_ID IN NUMBER,
3096 P_TASK_ID IN NUMBER,
3097 X_RETURN_STATUS OUT NOCOPY VARCHAR2,
3098 X_MSG_COUNT OUT NOCOPY NUMBER,
3099 X_MSG_DATA OUT NOCOPY VARCHAR2)
3100 IS
3101 l_module_name VARCHAR2(200) := 'pa.plsql.PA_FP_GEN_FCST_AMT_PUB1.NONE_ETC_SRC';
3102 l_task_start_date DATE;
3103 l_task_completion_date DATE;
3104 l_target_class_rlm_id NUMBER;
3105
3106 l_msg_count NUMBER;
3107 l_msg_data VARCHAR2(2000);
3108 l_data VARCHAR2(2000);
3109 l_msg_index_out NUMBER:=0;
3110 l_sysdate date;
3111 BEGIN
3112 X_RETURN_STATUS := FND_API.G_RET_STS_SUCCESS;
3113 X_MSG_COUNT := 0;
3114 IF p_pa_debug_mode = 'Y' THEN
3115 pa_debug.set_curr_function( p_function => 'NONE_ETC_SRC',
3116 p_debug_mode => p_pa_debug_mode);
3117 END IF;
3118
3119 l_sysdate := trunc(SYSDATE);
3120
3121 IF nvl(p_task_id,0) > 0 THEN
3122 SELECT nvl(start_date,l_sysdate),
3123 nvl(completion_date,l_sysdate)
3124 INTO l_task_start_date, l_task_completion_date
3125 FROM pa_tasks
3126 WHERE task_id = P_TASK_ID;
3127 ELSE
3128 SELECT nvl(start_date,l_sysdate),
3129 nvl(completion_date,l_sysdate)
3130 INTO l_task_start_date, l_task_completion_date
3131 FROM pa_projects_all WHERE
3132 project_id = p_project_id;
3133 END IF;
3134 /* for etc source as NULL or NONE the planning resource will be
3135 created based on the task + people resourece class combination.
3136 This is to generate the ETC amounts by calling the forecast
3137 generation client extension API. - msoundra */
3138
3139 l_target_class_rlm_id := PA_FP_GEN_AMOUNT_UTILS.GET_RLM_ID
3140 (P_PROJECT_ID => P_PROJECT_ID,
3141 P_RESOURCE_LIST_ID => P_RESOURCE_LIST_ID,
3142 P_RESOURCE_CLASS_CODE => 'FINANCIAL_ELEMENTS');
3143
3144 -- hr_utility.trace('inside none etc class rlm id:'||l_target_class_rlm_id);
3145 /* bug 3741059 target_rlm_id col should be populated instead of
3146 resource_list_member_id col in the following insert for the value
3147 l_target_class_rlm_id value. */
3148 INSERT INTO PA_FP_CALC_AMT_TMP1 (
3149 RESOURCE_ASSIGNMENT_ID,
3150 BUDGET_VERSION_ID,
3151 PROJECT_ID,
3152 TASK_ID,
3153 target_rlm_id,
3154 PLANNING_START_DATE,
3155 PLANNING_END_DATE,
3156 MAPPED_FIN_TASK_ID )
3157 VALUES (
3158 (-1) * P_TASK_ID,
3159 P_BUDGET_VERSION_ID,
3160 P_PROJECT_ID,
3161 P_TASK_ID,
3162 l_target_class_rlm_id,
3163 l_task_start_date,
3164 l_task_completion_date,
3165 P_TASK_ID );
3166
3167 IF P_PA_DEBUG_MODE = 'Y' THEN
3168 PA_DEBUG.RESET_CURR_FUNCTION;
3169 END IF;
3170
3171 EXCEPTION
3172 WHEN PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc THEN
3173 l_msg_count := FND_MSG_PUB.count_msg;
3174 IF l_msg_count = 1 THEN
3175 PA_INTERFACE_UTILS_PUB.get_messages
3176 ( p_encoded => FND_API.G_TRUE,
3177 p_msg_index => 1,
3178 p_msg_count => l_msg_count,
3179 p_msg_data => l_msg_data,
3180 p_data => l_data,
3181 p_msg_index_out => l_msg_index_out);
3182 x_msg_data := l_data;
3183 x_msg_count := l_msg_count;
3184 ELSE
3185 x_msg_count := l_msg_count;
3186 END IF;
3187
3188 ROLLBACK;
3189 x_return_status := FND_API.G_RET_STS_ERROR;
3190
3191 IF P_PA_DEBUG_MODE = 'Y' THEN
3192 pa_fp_gen_amount_utils.fp_debug
3193 (p_msg => 'Invalid Arguments Passed',
3194 p_module_name => l_module_name,
3195 p_log_level => 5);
3196 PA_DEBUG.RESET_CURR_FUNCTION;
3197 END IF;
3198 RAISE;
3199 WHEN OTHERS THEN
3200 rollback;
3201 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
3202 x_msg_count := 1;
3203 x_msg_data := substr(sqlerrm,1,240);
3204 FND_MSG_PUB.add_exc_msg
3205 ( p_pkg_name => 'PA_FP_GEN_FCST_AMT_PUB1',
3206 p_procedure_name => 'NONE_ETC_SOURCE',
3207 p_error_text => substr(sqlerrm,1,240));
3208
3209 IF P_PA_DEBUG_MODE = 'Y' THEN
3210 pa_fp_gen_amount_utils.fp_debug
3211 (p_msg => 'Unexpected Error'||substr(sqlerrm, 1, 240),
3212 p_module_name => l_module_name,
3213 p_log_level => 5);
3214 PA_DEBUG.RESET_CURR_FUNCTION;
3215 END IF;
3216 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3217 END NONE_ETC_SRC;
3218
3219 PROCEDURE MAINTAIN_BUDGET_VERSION
3220 (P_PROJECT_ID IN PA_PROJECTS_ALL.PROJECT_ID%TYPE,
3221 P_BUDGET_VERSION_ID IN PA_BUDGET_VERSIONS.BUDGET_VERSION_ID%TYPE,
3222 P_ETC_START_DATE IN DATE,
3223 P_CALL_MAINTAIN_DATA_API IN VARCHAR2,
3224 X_RETURN_STATUS OUT NOCOPY VARCHAR2,
3225 X_MSG_COUNT OUT NOCOPY NUMBER,
3226 X_MSG_DATA OUT NOCOPY VARCHAR2 )
3227 IS
3228 l_module_name VARCHAR2(200) := 'pa.plsql.PA_FP_GEN_FCST_AMT_PUB1. MAINTAIN_BUDGET_VERSION';
3229 l_fp_version_ids_tab SYSTEM.pa_num_tbl_type := SYSTEM.pa_num_tbl_type();
3230
3231 l_msg_count NUMBER;
3232 l_msg_data VARCHAR2(2000);
3233 l_data VARCHAR2(2000);
3234 l_msg_index_out NUMBER:=0;
3235
3236 -- Bug Fix: 4569365. Removed MRC code.
3237 -- g_mrc_exception EXCEPTION;
3238
3239 l_fp_cols_rec PA_FP_GEN_AMOUNT_UTILS.FP_COLS;
3240 l_wp_version_flag pa_budget_versions.wp_version_flag%TYPE;
3241
3242 -- IPM: Added local variable to pass variable values of the
3243 -- p_calling_module parameter of the MAINTAIN_DATA API.
3244 l_calling_module VARCHAR2(30);
3245
3246 BEGIN
3247 X_RETURN_STATUS := FND_API.G_RET_STS_SUCCESS;
3248 X_MSG_COUNT := 0;
3249 IF p_pa_debug_mode = 'Y' THEN
3250 pa_debug.set_curr_function( p_function => 'MAINTAIN_BUDGET_VERSION',
3251 p_debug_mode => p_pa_debug_mode);
3252 END IF;
3253
3254 /* Calling the get_plan_version_dtls api */
3255 IF p_pa_debug_mode = 'Y' THEN
3256 pa_fp_gen_amount_utils.fp_debug
3257 (p_msg => 'Before calling
3258 pa_fp_gen_amount_utils.get_plan_version_dtls',
3259 p_module_name => l_module_name,
3260 p_log_level => 5);
3261 END IF;
3262 PA_FP_GEN_AMOUNT_UTILS.GET_PLAN_VERSION_DTLS
3263 (P_PROJECT_ID => P_PROJECT_ID,
3264 P_BUDGET_VERSION_ID => P_BUDGET_VERSION_ID,
3265 X_FP_COLS_REC => l_fp_cols_rec,
3266 X_RETURN_STATUS => X_RETURN_STATUS,
3267 X_MSG_COUNT => X_MSG_COUNT,
3268 X_MSG_DATA => X_MSG_DATA);
3269 IF p_pa_debug_mode = 'Y' THEN
3270 pa_fp_gen_amount_utils.fp_debug
3271 (p_msg => 'Status after calling
3272 pa_fp_gen_amount_utils.get_plan_version_dtls'
3273 ||x_return_status,
3274 p_module_name => l_module_name,
3275 p_log_level => 5);
3276 END IF;
3277 IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
3278 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
3279 END IF;
3280
3281 -- ER 5726773: Delete any budget lines that have 0 plan quantity.
3282 -- Such lines are possible as a result of:
3283 -- 1. Multiple periodic lines mapping to the same line
3284 -- 2. Commitments mapped to a line with negative quantity
3285 -- 3. Billing events mapped to a revenue-only line with negative
3286 -- (internal) quantity
3287
3288 DELETE FROM pa_budget_lines bl
3289 WHERE nvl(bl.quantity,0) = 0
3290 AND bl.budget_version_id = p_budget_version_id
3291 AND bl.init_quantity is null
3292 AND bl.txn_init_raw_cost is null
3293 AND bl.txn_init_burdened_cost is null
3294 AND bl.txn_init_revenue is null;
3295
3296 /**This is to address bug 4156875.
3297 For none time phased, after generating budget lines from the source,
3298 commitments, and billing events, all budget lines of different currencies for
3299 the same resource assignments should be updated to the same start and end
3300 dates, which honor the max and min of the individual budget lines. This
3301 should also be updated back to resource assignments. **/
3302 IF l_fp_cols_rec.x_time_phased_code = 'N' THEN
3303 IF p_pa_debug_mode = 'Y' THEN
3304 pa_fp_gen_amount_utils.fp_debug
3305 (p_msg => 'Before calling pa_fp_maintain_actual_pub.'||
3306 'SYNC_UP_PLANNING_DATES_NONE_TP',
3307 p_module_name => l_module_name,
3308 p_log_level => 5);
3309 END IF;
3310 PA_FP_MAINTAIN_ACTUAL_PUB.SYNC_UP_PLANNING_DATES_NONE_TP
3311 (P_BUDGET_VERSION_ID => P_BUDGET_VERSION_ID,
3312 P_FP_COLS_REC => l_fp_cols_rec,
3313 X_RETURN_STATUS => X_RETURN_STATUS,
3314 X_MSG_COUNT => X_MSG_COUNT,
3315 X_MSG_DATA => X_MSG_DATA);
3316 IF p_pa_debug_mode = 'Y' THEN
3317 pa_fp_gen_amount_utils.fp_debug
3318 (p_msg => 'Status after calling pa_fp_maintain_actual_pub.'||
3319 'SYNC_UP_PLANNING_DATES_NONE_TP:'||x_return_status,
3320 p_module_name => l_module_name,
3321 p_log_level => 5);
3322 END IF;
3323 IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
3324 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
3325 END IF;
3326 END IF;
3327
3328 IF p_pa_debug_mode = 'Y' THEN
3329 pa_fp_gen_amount_utils.fp_debug
3330 (p_msg => 'Before calling
3331 PA_FP_GEN_PUB.MAINTAIN_FIXED_DATE_SP',
3332 p_module_name => l_module_name,
3333 p_log_level => 5);
3334 END IF;
3335 PA_FP_GEN_PUB.MAINTAIN_FIXED_DATE_SP
3336 (P_BUDGET_VERSION_ID => P_BUDGET_VERSION_ID,
3337 P_FP_COLS_REC => l_fp_cols_rec,
3338 X_RETURN_STATUS => x_return_status,
3339 X_MSG_COUNT => x_msg_count,
3340 X_MSG_DATA => x_msg_data);
3341 IF p_pa_debug_mode = 'Y' THEN
3342 pa_fp_gen_amount_utils.fp_debug
3343 (p_msg => 'Status after calling
3344 PA_FP_GEN_PUB.MAINTAIN_FIXED_DATE_SP:'||x_return_status,
3345 p_module_name => l_module_name,
3346 p_log_level => 5);
3347 END IF;
3348 IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
3349 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
3350 END IF;
3351
3352 IF P_PA_DEBUG_MODE = 'Y' THEN
3353 pa_fp_gen_amount_utils.fp_debug
3354 (p_msg => 'Before calling PA_FP_MULTI_CURRENCY_PKG.CONVERT_TXN_CURRENCY',
3355 p_module_name => l_module_name,
3356 p_log_level => 5);
3357 END IF;
3358 PA_FP_MULTI_CURRENCY_PKG.CONVERT_TXN_CURRENCY
3359 (p_budget_version_id => P_BUDGET_VERSION_ID,
3360 p_entire_version => 'Y',
3361 p_calling_module => 'BUDGET_GENERATION', -- Added for Bug#5395732
3362 X_RETURN_STATUS => X_RETURN_STATUS,
3363 X_MSG_COUNT => X_MSG_COUNT,
3364 X_MSG_DATA => X_MSG_DATA);
3365 IF P_PA_DEBUG_MODE = 'Y' THEN
3366 pa_fp_gen_amount_utils.fp_debug
3367 (p_msg => 'After calling PA_FP_MULTI_CURRENCY_PKG.CONVERT_TXN_CURRENCY,
3368 ret status: '||x_return_status,
3369 p_module_name => l_module_name,
3370 p_log_level => 5);
3371 END IF;
3372 --dbms_output.put_line('After calling convert_txn_currency api: '||x_return_status);
3373 IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
3374 raise PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
3375 END IF;
3376
3377 IF P_PA_DEBUG_MODE = 'Y' THEN
3378 pa_fp_gen_amount_utils.fp_debug
3379 (p_msg => 'Before calling PA_FP_ROLLUP_PKG.ROLLUP_BUDGET_VERSION',
3380 p_module_name => l_module_name,
3381 p_log_level => 5);
3382 END IF;
3383 PA_FP_ROLLUP_PKG.ROLLUP_BUDGET_VERSION
3384 (p_budget_version_id => P_BUDGET_VERSION_ID,
3385 p_entire_version => 'Y',
3386 X_RETURN_STATUS => X_RETURN_STATUS,
3387 X_MSG_COUNT => X_MSG_COUNT,
3388 X_MSG_DATA => X_MSG_DATA);
3389 IF P_PA_DEBUG_MODE = 'Y' THEN
3390 pa_fp_gen_amount_utils.fp_debug
3391 (p_msg => 'After calling PA_FP_ROLLUP_PKG.ROLLUP_BUDGET_VERSION,
3392 ret status: '||x_return_status,
3393 p_module_name => l_module_name,
3394 p_log_level => 5);
3395 END IF;
3396 IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
3397 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
3398 END IF;
3399
3400 SELECT wp_version_flag
3401 INTO l_wp_version_flag
3402 FROM pa_budget_versions
3403 WHERE budget_version_id=p_budget_version_id;
3404
3405 IF l_wp_version_flag = 'Y' THEN
3406 IF l_fp_cols_rec.x_fin_plan_level_code <> 'P' THEN
3407 /* Calling the UPD_WBS_ELEMENT_VERSION_ID api */
3408 IF p_pa_debug_mode = 'Y' THEN
3409 pa_fp_gen_amount_utils.fp_debug
3410 (p_msg => 'Before calling
3411 PA_FP_GEN_PUB.UPD_WBS_ELEMENT_VERSION_ID',
3412 p_module_name => l_module_name,
3413 p_log_level => 5);
3414 END IF;
3415 PA_FP_GEN_PUB.UPD_WBS_ELEMENT_VERSION_ID
3416 (P_BUDGET_VERSION_ID => P_BUDGET_VERSION_ID,
3417 P_STRUCTURE_VERSION_ID => l_fp_cols_rec.x_project_structure_version_id,
3418 X_RETURN_STATUS => X_RETURN_STATUS,
3419 X_MSG_COUNT => X_MSG_COUNT,
3420 X_MSG_DATA => X_MSG_DATA);
3421 IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
3422 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
3423 END IF;
3424 IF p_pa_debug_mode = 'Y' THEN
3425 pa_fp_gen_amount_utils.fp_debug
3426 (p_msg => 'Status after calling
3427 PA_FP_GEN_PUB.UPD_WBS_ELEMENT_VERSION_ID'
3428 ||x_return_status,
3429 p_module_name => l_module_name,
3430 p_log_level => 5);
3431 END IF;
3432 END IF;
3433 END IF;
3434
3435
3436
3437 IF l_fp_cols_rec.x_plan_in_multi_curr_flag = 'Y' THEN
3438 /* Calling insert_txn_currency api */
3439 IF p_pa_debug_mode = 'Y' THEN
3440 pa_fp_gen_amount_utils.fp_debug
3441 (p_msg => 'Before calling
3442 pa_fp_gen_budget_amt_pub.insert_txn_currency',
3443 p_module_name => l_module_name,
3444 p_log_level => 5);
3445 END IF;
3446 PA_FP_GEN_BUDGET_AMT_PUB.INSERT_TXN_CURRENCY
3447 (P_PROJECT_ID => P_PROJECT_ID,
3448 P_BUDGET_VERSION_ID => P_BUDGET_VERSION_ID,
3449 P_FP_COLS_REC => l_fp_cols_rec,
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_msg => 'Status after calling
3459 pa_fp_gen_budget_amt_pub.insert_txn_currency'
3460 ||x_return_status,
3461 p_module_name => l_module_name,
3462 p_log_level => 5);
3463 END IF;
3464 END IF;
3465 -- Bug Fix: 4569365. Removed MRC code.
3466
3467 /*
3468 -- Bug 4187704: Uncommented the MRC code. Also, set added logic to set
3469 -- PA_MRC_FINPLAN.G_CALLING_MODULE based on Target Plan Class Code.
3470 IF PA_MRC_FINPLAN.G_MRC_ENABLED_FOR_BUDGETS IS NULL THEN
3471
3472 IF P_PA_DEBUG_MODE = 'Y' THEN
3473 pa_fp_gen_amount_utils.fp_debug
3474 (p_msg => 'Before calling PA_MRC_FINPLAN.CHECK_MRC_INSTALL',
3475 p_module_name => l_module_name,
3476 p_log_level => 5);
3477 END IF;
3478 PA_MRC_FINPLAN.CHECK_MRC_INSTALL
3479 (x_return_status => x_return_status,
3480 x_msg_count => x_msg_count,
3481 x_msg_data => x_msg_data);
3482 IF P_PA_DEBUG_MODE = 'Y' THEN
3483 pa_fp_gen_amount_utils.fp_debug
3484 (p_msg => 'After calling PA_MRC_FINPLAN.CHECK_MRC_INSTALL,
3485 ret status: '||x_return_status,
3486 p_module_name => l_module_name,
3487 p_log_level => 5);
3488 END IF;
3489 IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
3490 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
3491 END IF;
3492 END IF;
3493
3494 IF PA_MRC_FINPLAN.G_MRC_ENABLED_FOR_BUDGETS AND
3495 PA_MRC_FINPLAN.G_FINPLAN_MRC_OPTION_CODE = 'A' THEN
3496
3497 IF l_fp_cols_rec.x_plan_class_code = 'FORECAST' THEN
3498 PA_MRC_FINPLAN.G_CALLING_MODULE := PA_MRC_FINPLAN.G_GENERATE_FORECAST;
3499 ELSIF l_fp_cols_rec.x_plan_class_code = 'BUDGET' THEN
3500 PA_MRC_FINPLAN.G_CALLING_MODULE := PA_MRC_FINPLAN.G_GENERATE_BUDGET;
3501 END IF;
3502
3503 IF P_PA_DEBUG_MODE = 'Y' THEN
3504 pa_fp_gen_amount_utils.fp_debug
3505 (p_msg => 'Before calling PA_MRC_FINPLAN.MAINTAIN_ALL_MC_BUDGET_LINES',
3506 p_module_name => l_module_name,
3507 p_log_level => 5);
3508 END IF;
3509 PA_MRC_FINPLAN.MAINTAIN_ALL_MC_BUDGET_LINES
3510 (p_fin_plan_version_id => p_budget_version_id,
3511 p_entire_version => 'Y',
3512 x_return_status => x_return_status,
3513 x_msg_count => x_msg_count,
3514 x_msg_data => x_msg_data);
3515 IF P_PA_DEBUG_MODE = 'Y' THEN
3516 pa_fp_gen_amount_utils.fp_debug
3517 (p_msg => 'After calling PA_MRC_FINPLAN.MAINTAIN_ALL_MC_BUDGET_LINES,
3518 ret status: '||x_return_status,
3519 p_module_name => l_module_name,
3520 p_log_level => 5);
3521 END IF;
3522 IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
3523 RAISE g_mrc_exception;
3524 END IF;
3525
3526 PA_MRC_FINPLAN.G_CALLING_MODULE := Null;
3527 END IF;
3528 */
3529
3530 l_fp_version_ids_tab.extend;
3531 l_fp_version_ids_tab(1) := P_BUDGET_VERSION_ID;
3532
3533 IF P_PA_DEBUG_MODE = 'Y' THEN
3534 pa_fp_gen_amount_utils.fp_debug
3535 (p_msg => 'Before calling PJI_FM_XBS_ACCUM_MAINT.PLAN_DELETE',
3536 p_module_name => l_module_name,
3537 p_log_level => 5);
3538 END IF;
3539 PJI_FM_XBS_ACCUM_MAINT.PLAN_DELETE (
3540 p_fp_version_ids => l_fp_version_ids_tab,
3541 x_return_status => x_return_status,
3542 x_msg_code => x_msg_data );
3543 IF P_PA_DEBUG_MODE = 'Y' THEN
3544 pa_fp_gen_amount_utils.fp_debug
3545 (p_msg => 'After calling PJI_FM_XBS_ACCUM_MAINT.PLAN_DELETE,
3546 ret status: '||x_return_status,
3547 p_module_name => l_module_name,
3548 p_log_level => 5);
3549 END IF;
3550 IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
3551 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
3552 END IF;
3553
3554 IF l_fp_cols_rec.X_RBS_VERSION_ID IS NOT NULL THEN
3555
3556 IF P_PA_DEBUG_MODE = 'Y' THEN
3557 pa_fp_gen_amount_utils.fp_debug
3558 (p_msg => 'Before calling
3559 pa_fp_map_bv_pub.maintain_rbs_dtls',
3560 p_module_name => l_module_name,
3561 p_log_level => 5);
3562 END IF;
3563 PA_FP_MAP_BV_PUB.MAINTAIN_RBS_DTLS
3564 (P_BUDGET_VERSION_ID => p_budget_version_id,
3565 P_FP_COLS_REC => l_fp_cols_rec,
3566 X_RETURN_STATUS => X_RETURN_STATUS,
3567 X_MSG_COUNT => X_MSG_COUNT,
3568 X_MSG_DATA => X_MSG_DATA);
3569 IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
3570 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
3571 END IF;
3572
3573 IF P_PA_DEBUG_MODE = 'Y' THEN
3574 pa_fp_gen_amount_utils.fp_debug
3575 (p_msg => 'After calling pa_fp_map_bv_pub.maintain_rbs_dtls,
3576 ret status: '||x_return_status,
3577 p_module_name => l_module_name,
3578 p_log_level => 5);
3579 END IF;
3580 END IF;
3581 IF P_PA_DEBUG_MODE = 'Y' THEN
3582 pa_fp_gen_amount_utils.fp_debug
3583 (p_msg => 'Before calling PJI_FM_XBS_ACCUM_MAINT.PLAN_CREATE',
3584 p_module_name => l_module_name,
3585 p_log_level => 5);
3586 END IF;
3587 PJI_FM_XBS_ACCUM_MAINT.PLAN_CREATE (
3588 p_fp_version_ids => l_fp_version_ids_tab,
3589 x_return_status => x_return_status,
3590 x_msg_code => x_msg_data );
3591 IF P_PA_DEBUG_MODE = 'Y' THEN
3592 pa_fp_gen_amount_utils.fp_debug
3593 (p_msg => 'After calling PJI_FM_XBS_ACCUM_MAINT.PLAN_CREATE,
3594 ret status: '||x_return_status,
3595 p_module_name => l_module_name,
3596 p_log_level => 5);
3597 END IF;
3598 IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
3599 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
3600 END IF;
3601
3602 IF P_PA_DEBUG_MODE = 'Y' THEN
3603 pa_fp_gen_amount_utils.fp_debug
3604 (p_msg => 'Before calling PA_FP_GEN_BUDGET_AMT_PUB.UPDATE_BV_FOR_GEN_DATE',
3605 p_module_name => l_module_name,
3606 p_log_level => 5);
3607 END IF;
3608 PA_FP_GEN_BUDGET_AMT_PUB.UPDATE_BV_FOR_GEN_DATE
3609 (P_PROJECT_ID => P_PROJECT_ID,
3610 P_BUDGET_VERSION_ID => P_BUDGET_VERSION_ID,
3611 P_ETC_START_DATE => P_ETC_START_DATE,
3612 X_RETURN_STATUS => X_RETURN_STATUS,
3613 X_MSG_COUNT => X_MSG_COUNT,
3614 X_MSG_DATA => X_MSG_DATA);
3615 IF P_PA_DEBUG_MODE = 'Y' THEN
3616 pa_fp_gen_amount_utils.fp_debug
3617 (p_msg => 'After calling PA_FP_GEN_BUDGET_AMT_PUB.UPDATE_BV_FOR_GEN_DATE,
3618 ret status: '||x_return_status,
3619 p_module_name => l_module_name,
3620 p_log_level => 5);
3621 END IF;
3622
3623
3624 -- IPM: New Entity and Display Quantity ERs --------------------
3625
3626 -- Before calling maintain_data to rollup amounts, there are
3627 -- a number of updates that must be performed on txn-level
3628 -- rate overrides for non-rate-based txns. The following API
3629 -- call handles those updates. Refer to the comment section at
3630 -- the beginning of the API for details.
3631
3632 IF P_CALL_MAINTAIN_DATA_API = 'Y' THEN
3633 -- Call the maintenance api in ROLLUP mode
3634 IF p_pa_debug_mode = 'Y' THEN
3635 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
3636 P_MSG => 'Before calling PA_FP_GEN_FCST_AMT_PUB1.' ||
3637 'UPD_NRB_TXN_OVR_RATES',
3638 --P_CALLED_MODE => p_called_mode,
3639 P_MODULE_NAME => l_module_name);
3640 END IF;
3641 PA_FP_GEN_FCST_AMT_PUB1.UPD_NRB_TXN_OVR_RATES
3642 (P_PROJECT_ID => P_PROJECT_ID,
3643 P_BUDGET_VERSION_ID => P_BUDGET_VERSION_ID,
3644 P_FP_COLS_REC => l_fp_cols_rec,
3645 P_ETC_START_DATE => P_ETC_START_DATE,
3646 X_RETURN_STATUS => X_RETURN_STATUS,
3647 X_MSG_COUNT => X_MSG_COUNT,
3648 X_MSG_DATA => X_MSG_DATA);
3649 IF p_pa_debug_mode = 'Y' THEN
3650 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
3651 P_MSG => 'After calling PA_FP_GEN_FCST_AMT_PUB1.' ||
3652 'UPD_NRB_TXN_OVR_RATES: '||x_return_status,
3653 --P_CALLED_MODE => p_called_mode,
3654 P_MODULE_NAME => l_module_name);
3655 END IF;
3656
3657 -- For budgets, if we are not retaining manual lines, then
3658 -- all resources for the version need to be rolled up in the
3659 -- pa_resource_asgn_curr table. If we are retaining manual lines,
3660 -- then we can selectively roll up only non-manual lines to
3661 -- improve performance.
3662 -- For forecasts, we always need to roll up rates and amounts
3663 -- because of possible changes in actual amounts. As a result,
3664 -- l_fp_cols_rec.x_gen_ret_manual_line_flag does not need to be
3665 -- checked in this case.
3666 -- The same logic applies when populating the display quantity.
3667
3668 -- TABLE MODE Processing: -------------------------------------
3669
3670 IF ( l_fp_cols_rec.x_plan_class_code = 'BUDGET' AND
3671 l_fp_cols_rec.x_gen_ret_manual_line_flag = 'Y' ) THEN
3672
3673 -- Bug 5029306: Display_quantity needs to be populated before
3674 -- amounts are rolled up. Therefore, swapped the ordering of
3675 -- the populate_display_qty() and maintain_data() API calls.
3676
3677 -- Populate the display quantity for non-manually added resources.
3678
3679 DELETE pa_resource_asgn_curr_tmp;
3680
3681 INSERT INTO pa_resource_asgn_curr_tmp
3682 ( resource_assignment_id )
3683 SELECT ra.resource_assignment_id
3684 FROM pa_resource_assignments ra
3685 WHERE ra.budget_version_id = p_budget_version_id
3686 AND ra.transaction_source_code IS NOT NULL;
3687
3688 IF p_pa_debug_mode = 'Y' THEN
3689 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
3690 P_MSG => 'Before calling PA_BUDGET_LINES_UTILS.' ||
3691 'POPULATE_DISPLAY_QTY',
3692 --P_CALLED_MODE => p_called_mode,
3693 P_MODULE_NAME => l_module_name);
3694 END IF;
3695 PA_BUDGET_LINES_UTILS.POPULATE_DISPLAY_QTY
3696 ( P_BUDGET_VERSION_ID => p_budget_version_id,
3697 P_CONTEXT => 'FINANCIAL',
3698 P_USE_TEMP_TABLE_FLAG => 'Y',
3699 X_RETURN_STATUS => x_return_status );
3700 IF p_pa_debug_mode = 'Y' THEN
3701 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
3702 P_MSG => 'After calling PA_BUDGET_LINES_UTILS.' ||
3703 'POPULATE_DISPLAY_QTY: '||x_return_status,
3704 --P_CALLED_MODE => p_called_mode,
3705 P_MODULE_NAME => l_module_name);
3706 END IF;
3707 IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
3708 raise PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
3709 END IF;
3710
3711 -- Call MAINTAIN_DATA to roll up amounts to pa_resource_asgn_curr
3712 -- for non-manually added resources. First, populate temp table data.
3713
3714 DELETE pa_resource_asgn_curr_tmp;
3715
3716 INSERT INTO pa_resource_asgn_curr_tmp
3717 ( resource_assignment_id,
3718 txn_currency_code,
3719 txn_raw_cost_rate_override,
3720 txn_burden_cost_rate_override,
3721 txn_bill_rate_override )
3722 SELECT DISTINCT
3723 bl.resource_assignment_id,
3724 bl.txn_currency_code,
3725 rbc.txn_raw_cost_rate_override,
3726 rbc.txn_burden_cost_rate_override,
3727 rbc.txn_bill_rate_override
3728 FROM pa_resource_assignments ra,
3729 pa_budget_lines bl,
3730 pa_resource_asgn_curr rbc
3731 WHERE ra.budget_version_id = p_budget_version_id
3732 AND ra.project_id = p_project_id
3733 AND ra.transaction_source_code IS NOT NULL
3734 AND bl.resource_assignment_id = ra.resource_assignment_id
3735 AND bl.resource_assignment_id = rbc.resource_assignment_id (+)
3736 AND bl.txn_currency_code = rbc.txn_currency_code (+);
3737
3738 IF p_pa_debug_mode = 'Y' THEN
3739 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
3740 P_MSG => 'Before calling PA_RES_ASG_CURRENCY_PUB.' ||
3741 'MAINTAIN_DATA',
3742 --P_CALLED_MODE => p_called_mode,
3743 P_MODULE_NAME => l_module_name);
3744 END IF;
3745 PA_RES_ASG_CURRENCY_PUB.MAINTAIN_DATA
3746 ( P_FP_COLS_REC => l_fp_cols_rec,
3747 P_CALLING_MODULE => 'BUDGET_GENERATION',
3748 P_ROLLUP_FLAG => 'Y',
3749 P_VERSION_LEVEL_FLAG => 'N',
3750 --P_CALLED_MODE => p_called_mode,
3751 X_RETURN_STATUS => x_return_status,
3752 X_MSG_COUNT => x_msg_count,
3753 X_MSG_DATA => x_msg_data );
3754 IF p_pa_debug_mode = 'Y' THEN
3755 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
3756 P_MSG => 'After calling PA_RES_ASG_CURRENCY_PUB.' ||
3757 'MAINTAIN_DATA: '||x_return_status,
3758 --P_CALLED_MODE => p_called_mode,
3759 P_MODULE_NAME => l_module_name);
3760 END IF;
3761 IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
3762 raise PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
3763 END IF;
3764
3765 -- VERSION LEVEL Processing: ----------------------------------
3766
3767 ELSIF ( l_fp_cols_rec.x_plan_class_code = 'BUDGET' AND
3768 l_fp_cols_rec.x_gen_ret_manual_line_flag = 'N' )
3769 OR l_fp_cols_rec.x_plan_class_code = 'FORECAST' THEN
3770
3771 -- Bug 5029306: Display_quantity needs to be populated before
3772 -- amounts are rolled up. Therefore, swapped the ordering of
3773 -- the populate_display_qty() and maintain_data() API calls.
3774
3775 -- Populate the display quantity for all resources in the version.
3776
3777 IF p_pa_debug_mode = 'Y' THEN
3778 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
3779 P_MSG => 'Before calling PA_BUDGET_LINES_UTILS.' ||
3780 'POPULATE_DISPLAY_QTY',
3781 --P_CALLED_MODE => p_called_mode,
3782 P_MODULE_NAME => l_module_name);
3783 END IF;
3784 PA_BUDGET_LINES_UTILS.POPULATE_DISPLAY_QTY
3785 ( P_BUDGET_VERSION_ID => p_budget_version_id,
3786 P_CONTEXT => 'FINANCIAL',
3787 P_USE_TEMP_TABLE_FLAG => 'N',
3788 X_RETURN_STATUS => x_return_status );
3789 IF p_pa_debug_mode = 'Y' THEN
3790 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
3791 P_MSG => 'After calling PA_BUDGET_LINES_UTILS.' ||
3792 'POPULATE_DISPLAY_QTY: '||x_return_status,
3793 --P_CALLED_MODE => p_called_mode,
3794 P_MODULE_NAME => l_module_name);
3795 END IF;
3796 IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
3797 raise PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
3798 END IF;
3799
3800 -- Call MAINTAIN_DATA to roll up amounts to pa_resource_asgn_curr.
3801
3802 IF l_fp_cols_rec.x_plan_class_code = 'BUDGET' THEN
3803 l_calling_module := 'BUDGET_GENERATION';
3804 ELSIF l_fp_cols_rec.x_plan_class_code = 'FORECAST' THEN
3805 l_calling_module := 'FORECAST_GENERATION';
3806 END IF;
3807
3808 IF p_pa_debug_mode = 'Y' THEN
3809 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
3810 P_MSG => 'Before calling PA_RES_ASG_CURRENCY_PUB.' ||
3811 'MAINTAIN_DATA',
3812 --P_CALLED_MODE => p_called_mode,
3813 P_MODULE_NAME => l_module_name);
3814 END IF;
3815 PA_RES_ASG_CURRENCY_PUB.MAINTAIN_DATA
3816 ( P_FP_COLS_REC => l_fp_cols_rec,
3817 P_CALLING_MODULE => l_calling_module,
3818 P_ROLLUP_FLAG => 'Y',
3819 P_VERSION_LEVEL_FLAG => 'Y',
3820 --P_CALLED_MODE => p_called_mode,
3821 X_RETURN_STATUS => x_return_status,
3822 X_MSG_COUNT => x_msg_count,
3823 X_MSG_DATA => x_msg_data );
3824 IF p_pa_debug_mode = 'Y' THEN
3825 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
3826 P_MSG => 'After calling PA_RES_ASG_CURRENCY_PUB.' ||
3827 'MAINTAIN_DATA: '||x_return_status,
3828 --P_CALLED_MODE => p_called_mode,
3829 P_MODULE_NAME => l_module_name);
3830 END IF;
3831 IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
3832 raise PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
3833 END IF;
3834 END IF;
3835
3836 END IF; -- IPM logic
3837
3838 -- IPM: Delete records from PA_RESOURCE_ASSIGNMENTS that:
3839 -- 1. Do not have budget lines.
3840 -- 2. Have a non-null transaction_source_code.
3841 -- 3. Do not have a record in the PA_RESOURCE_ASGN_CURR table.
3842 -- In this way, we can ensure that all records in the resource
3843 -- assignments table have a corresponding records in the new
3844 -- pa_resource_asgn_curr entity.
3845
3846 DELETE FROM pa_resource_assignments ra
3847 WHERE ra.budget_version_id = p_budget_version_id
3848 AND ra.transaction_source_code IS NOT NULL
3849 AND NOT EXISTS (SELECT null
3850 FROM pa_budget_lines bl
3851 WHERE bl.resource_assignment_id = ra.resource_assignment_id)
3852 AND NOT EXISTS (SELECT null
3853 FROM pa_resource_asgn_curr rbc
3854 WHERE rbc.resource_assignment_id = ra.resource_assignment_id);
3855
3856 -- END OF IPM: New Entity and Display Quantity ERs --------------------
3857
3858
3859 IF P_PA_DEBUG_MODE = 'Y' THEN
3860 PA_DEBUG.RESET_CURR_FUNCTION;
3861 END IF;
3862 EXCEPTION
3863 WHEN PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc THEN
3864 l_msg_count := FND_MSG_PUB.count_msg;
3865 IF l_msg_count = 1 THEN
3866 PA_INTERFACE_UTILS_PUB.get_messages
3867 ( p_encoded => FND_API.G_TRUE,
3868 p_msg_index => 1,
3869 p_msg_count => l_msg_count,
3870 p_msg_data => l_msg_data,
3871 p_data => l_data,
3872 p_msg_index_out => l_msg_index_out);
3873 x_msg_data := l_data;
3874 x_msg_count := l_msg_count;
3875 ELSE
3876 x_msg_count := l_msg_count;
3877 END IF;
3878
3879 ROLLBACK;
3880 x_return_status := FND_API.G_RET_STS_ERROR;
3881
3882 IF P_PA_DEBUG_MODE = 'Y' THEN
3883 pa_fp_gen_amount_utils.fp_debug
3884 (p_msg => 'Invalid Arguments Passed',
3885 p_module_name => l_module_name,
3886 p_log_level => 5);
3887 PA_DEBUG.RESET_CURR_FUNCTION;
3888 END IF;
3889 RAISE;
3890 WHEN OTHERS THEN
3891 rollback;
3892 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
3893 x_msg_count := 1;
3894 x_msg_data := substr(sqlerrm,1,240);
3895 -- dbms_output.put_line('error msg :'||x_msg_data);
3896 FND_MSG_PUB.add_exc_msg
3897 ( p_pkg_name => 'PA_FP_GEN_FCST_AMT_PUB1',
3898 p_procedure_name => 'MAINTAIN_BUDGET_VERSION',
3899 p_error_text => substr(sqlerrm,1,240));
3900
3901 IF P_PA_DEBUG_MODE = 'Y' THEN
3902 pa_fp_gen_amount_utils.fp_debug
3903 (p_msg => 'Unexpected Error'||substr(sqlerrm, 1, 240),
3904 p_module_name => l_module_name,
3905 p_log_level => 5);
3906 PA_DEBUG.RESET_CURR_FUNCTION;
3907 END IF;
3908 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3909 END MAINTAIN_BUDGET_VERSION;
3910
3911
3912
3913 /*This function can be called under two contexts:
3914 1.'VER_ID' to get etc workplan version Id
3915 2.'VER_NAME' to get etc workplan version name*/
3916 FUNCTION GET_ETC_WP_DTLS
3917 (P_BUDGET_VERSION_ID IN PA_BUDGET_VERSIONS.BUDGET_VERSION_ID%TYPE,
3918 P_CONTEXT IN VARCHAR2)
3919 RETURN VARCHAR2
3920 IS
3921 l_project_id number;
3922 l_etc_wp_bdgt_ver_id number;
3923 l_versioning_enabled varchar2(30);
3924 l_etc_wp_ver_code PA_PROJ_FP_OPTIONS.GEN_SRC_COST_WP_VER_CODE%type;
3925 l_etc_wp_ver_id VARCHAR2(100);
3926 l_etc_wp_ver_name PA_PROJ_ELEM_VER_STRUCTURE.name%type;
3927 l_dummy VARCHAR2(100):=null;
3928 BEGIN
3929 SELECT DECODE(BV.VERSION_TYPE,
3930 'COST', OPT.GEN_SRC_COST_WP_VERSION_ID,
3931 'REVENUE',OPT.GEN_SRC_REV_WP_VERSION_ID,
3932 'ALL',OPT.GEN_SRC_ALL_WP_VERSION_ID),
3933 DECODE(BV.VERSION_TYPE,
3934 'COST', OPT1.GEN_SRC_COST_WP_VER_CODE,
3935 'REVENUE',OPT1.GEN_SRC_REV_WP_VER_CODE,
3936 'ALL',OPT1.GEN_SRC_ALL_WP_VER_CODE),
3937 BV.PROJECT_ID
3938 INTO l_etc_wp_bdgt_ver_id,
3939 l_etc_wp_ver_code,
3940 l_project_id
3941 FROM PA_PROJ_FP_OPTIONS OPT,PA_PROJ_FP_OPTIONS OPT1,
3942 PA_BUDGET_VERSIONS BV
3943 WHERE OPT.FIN_PLAN_VERSION_ID = P_BUDGET_VERSION_ID
3944 AND OPT.FIN_PLAN_VERSION_ID = BV.BUDGET_VERSION_ID
3945 --AND OPT.FIN_PLAN_OPTION_LEVEL_CODE = 'PLAN_VERSION'
3946 AND OPT1.FIN_PLAN_TYPE_ID = BV.FIN_PLAN_TYPE_ID
3947 AND OPT1.FIN_PLAN_OPTION_LEVEL_CODE = 'PLAN_TYPE'
3948 AND OPT1.PROJECT_ID = BV.PROJECT_ID;
3949 /* Plan_ver_code is selected at PLAN_TYPE instead of PLAN_VERSION */
3950
3951 IF l_etc_wp_bdgt_ver_id is not null AND P_CONTEXT = 'VER_ID' THEN
3952 SELECT PROJECT_STRUCTURE_VERSION_ID into l_etc_wp_ver_id
3953 FROM PA_BUDGET_VERSIONS
3954 WHERE BUDGET_VERSION_ID = l_etc_wp_bdgt_ver_id;
3955 RETURN l_etc_wp_ver_id;
3956 END IF;
3957 IF l_etc_wp_bdgt_ver_id is not null AND P_CONTEXT = 'VER_NAME' THEN
3958 SELECT el.name INTO l_etc_wp_ver_name
3959 FROM pa_budget_versions bv, pa_proj_elem_ver_structure el
3960 WHERE bv.budget_version_id = l_etc_wp_bdgt_ver_id
3961 AND bv.project_structure_version_id = el.element_version_id
3962 AND bv.project_id = el.project_id;
3963 RETURN l_etc_wp_ver_name;
3964 END IF;
3965
3966 IF l_etc_wp_ver_code IS NULL THEN
3967 RETURN l_etc_wp_ver_code;
3968 /* version id or version name cannot be derived. */
3969 END IF;
3970 l_versioning_enabled :=
3971 PA_WORKPLAN_ATTR_UTILS.CHECK_WP_VERSIONING_ENABLED(l_project_id);
3972 IF l_versioning_enabled = 'Y' THEN
3973 IF (l_etc_wp_ver_code = 'LAST_PUBLISHED') THEN
3974 l_etc_wp_ver_id := PA_PROJECT_STRUCTURE_UTILS.GET_LATEST_WP_VERSION(
3975 P_PROJECT_ID => l_project_id);
3976 ELSIF (l_etc_wp_ver_code = 'CURRENT_WORKING') THEN
3977 l_etc_wp_ver_id := PA_PROJECT_STRUCTURE_UTILS.GET_CURRENT_WORKING_VER_ID(
3978 P_PROJECT_ID => l_project_id);
3979 IF l_etc_wp_ver_id is null THEN
3980 l_etc_wp_ver_id := PA_PROJECT_STRUCTURE_UTILS.GET_LATEST_WP_VERSION(
3981 P_PROJECT_ID => l_project_id);
3982 END IF;
3983 -- Bug 4426511: Changed 'BASELINE', which was INCORRECT, to 'BASELINED'.
3984 ELSIF (l_etc_wp_ver_code = 'BASELINED') THEN
3985 l_etc_wp_ver_id := PA_PROJECT_STRUCTURE_UTILS.GET_BASELINE_STRUCT_VER(
3986 P_PROJECT_ID => l_project_id);
3987 END IF;
3988 ELSE
3989 l_etc_wp_ver_id := PA_PROJECT_STRUCTURE_UTILS.GET_LATEST_WP_VERSION(
3990 P_PROJECT_ID => l_project_id);
3991 END IF;
3992
3993 IF P_CONTEXT = 'VER_ID' THEN
3994 RETURN l_etc_wp_ver_id;
3995 END IF;
3996
3997 IF P_CONTEXT = 'VER_NAME' AND l_etc_wp_ver_id is not null THEN
3998 SELECT name INTO l_etc_wp_ver_name
3999 FROM pa_proj_elem_ver_structure
4000 WHERE element_version_id = l_etc_wp_ver_id
4001 AND project_id = l_project_id;
4002 RETURN l_etc_wp_ver_name;
4003 END IF;
4004 RETURN l_dummy;
4005 EXCEPTION
4006 WHEN OTHERS THEN
4007 RETURN l_dummy;
4008 END GET_ETC_WP_DTLS;
4009
4010 /*This function can be called under two contexts:
4011 1.'PTYPE_ID' to get etc finplan type Id
4012 2.'PTYPE_NAME' to get etc finplan type name*/
4013 FUNCTION GET_ETC_FP_PTYPE_DTLS
4014 (P_BUDGET_VERSION_ID IN PA_BUDGET_VERSIONS.BUDGET_VERSION_ID%TYPE,
4015 P_CONTEXT IN VARCHAR2)
4016 RETURN VARCHAR2
4017 IS
4018 l_src_plan_type_id varchar2(50);
4019 l_src_plan_type_name pa_fin_plan_types_vl.NAME%type;
4020 l_dummy varchar2(50):=null;
4021 BEGIN
4022
4023 SELECT DECODE(BV.VERSION_TYPE,
4024 'COST', OPT.GEN_SRC_COST_PLAN_TYPE_ID,
4025 'REVENUE',OPT.GEN_SRC_REV_PLAN_TYPE_ID,
4026 'ALL',OPT.GEN_SRC_ALL_PLAN_TYPE_ID),
4027 PT.NAME
4028 INTO l_src_plan_type_id,
4029 l_src_plan_type_name
4030 FROM PA_PROJ_FP_OPTIONS OPT,
4031 PA_BUDGET_VERSIONS BV,
4032 pa_fin_plan_types_vl PT
4033 WHERE
4034 OPT.FIN_PLAN_VERSION_ID = P_BUDGET_VERSION_ID
4035 AND P_BUDGET_VERSION_ID = BV.BUDGET_VERSION_ID
4036 AND DECODE(BV.VERSION_TYPE,
4037 'COST', OPT.GEN_SRC_COST_PLAN_TYPE_ID,
4038 'REVENUE',OPT.GEN_SRC_REV_PLAN_TYPE_ID,
4039 'ALL',OPT.GEN_SRC_ALL_PLAN_TYPE_ID)
4040 = PT.FIN_PLAN_TYPE_ID;
4041
4042 IF P_CONTEXT = 'PTYPE_ID' THEN
4043 RETURN l_src_plan_type_id;
4044 END IF;
4045
4046 IF P_CONTEXT = 'PTYPE_NAME' THEN
4047 RETURN l_src_plan_type_name;
4048 END IF;
4049 EXCEPTION
4050 WHEN OTHERS THEN
4051 RETURN l_dummy;
4052 END GET_ETC_FP_PTYPE_DTLS;
4053
4054 /*This function can be called under two contexts:
4055 1.'VER_ID' to get etc finplan version Id
4056 2.'VER_NAME' to get etc finplan version name*/
4057 FUNCTION GET_ETC_FP_PVERSION_DTLS
4058 (P_BUDGET_VERSION_ID IN PA_BUDGET_VERSIONS.BUDGET_VERSION_ID%TYPE,
4059 P_CONTEXT IN VARCHAR2)
4060 RETURN VARCHAR2
4061 IS
4062 l_project_id number;
4063 l_etc_fp_ver_code varchar2(20);
4064 l_src_plan_type_id number;
4065 l_etc_fp_ver_id varchar2(50);
4066 l_etc_fp_ver_name pa_budget_versions.version_name%type;
4067 l_fp_options_id number;
4068
4069 l_return_status varchar2(10);
4070 l_msg_count number;
4071 l_msg_data varchar2(50);
4072 l_dummy varchar2(50):=null;
4073 BEGIN
4074
4075 SELECT DECODE(BV.VERSION_TYPE,
4076 'COST', OPT.GEN_SRC_COST_PLAN_VERSION_ID,
4077 'REVENUE',OPT.GEN_SRC_REV_PLAN_VERSION_ID,
4078 'ALL',OPT.GEN_SRC_ALL_PLAN_VERSION_ID),
4079 DECODE(BV.VERSION_TYPE,
4080 'COST', OPT1.GEN_SRC_COST_PLAN_VER_CODE,
4081 'REVENUE',OPT1.GEN_SRC_REV_PLAN_VER_CODE,
4082 'ALL',OPT1.GEN_SRC_ALL_PLAN_VER_CODE),
4083 DECODE(BV.VERSION_TYPE,
4084 'COST', OPT.GEN_SRC_COST_PLAN_TYPE_ID,
4085 'REVENUE',OPT.GEN_SRC_REV_PLAN_TYPE_ID,
4086 'ALL',OPT.GEN_SRC_ALL_PLAN_TYPE_ID),
4087 BV.PROJECT_ID
4088 INTO l_etc_fp_ver_id,
4089 l_etc_fp_ver_code,
4090 l_src_plan_type_id,
4091 l_project_id
4092 FROM PA_PROJ_FP_OPTIONS OPT, PA_PROJ_FP_OPTIONS OPT1,
4093 PA_BUDGET_VERSIONS BV
4094 WHERE BV.BUDGET_VERSION_ID = P_BUDGET_VERSION_ID
4095 AND OPT.FIN_PLAN_VERSION_ID = BV.BUDGET_VERSION_ID
4096 AND OPT1.PROJECT_ID = BV.PROJECT_ID
4097 AND OPT1.FIN_PLAN_TYPE_ID = BV.FIN_PLAN_TYPE_ID
4098 AND OPT1.FIN_PLAN_OPTION_LEVEL_CODE = 'PLAN_TYPE';
4099 /* Plan_ver_code is selected at PLAN_TYPE instead of PLAN_VERSION */
4100
4101 IF l_etc_fp_ver_id is not null AND P_CONTEXT = 'VER_ID' THEN
4102 RETURN l_etc_fp_ver_id;
4103 END IF;
4104 IF l_etc_fp_ver_id is not null AND P_CONTEXT = 'VER_NAME' THEN
4105 SELECT version_name INTO l_etc_fp_ver_name
4106 FROM PA_BUDGET_VERSIONS
4107 WHERE BUDGET_VERSION_ID = l_etc_fp_ver_id;
4108 RETURN l_etc_fp_ver_name;
4109 END IF;
4110
4111 IF l_etc_fp_ver_code = 'CURRENT_BASELINED'
4112 OR l_etc_fp_ver_code = 'ORIGINAL_BASELINED'
4113 OR l_etc_fp_ver_code = 'CURRENT_APPROVED'
4114 OR l_etc_fp_ver_code = 'ORIGINAL_APPROVED' THEN
4115 /*Get the current baselined or original baselined version*/
4116 pa_fp_gen_amount_utils.Get_Curr_Original_Version_Info(
4117 p_project_id => l_project_id,
4118 p_fin_plan_type_id => l_src_plan_type_id,
4119 p_version_type => 'COST',
4120 p_status_code => l_etc_fp_ver_code,
4121 x_fp_options_id => l_fp_options_id,
4122 x_fin_plan_version_id => l_etc_fp_ver_id,
4123 x_return_status => l_return_status,
4124 x_msg_count => l_msg_count,
4125 x_msg_data => l_msg_data);
4126 IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
4127 RETURN l_dummy;
4128 END IF;
4129 ELSIF l_etc_fp_ver_code = 'CURRENT_WORKING' THEN
4130 /*Get the current working version*/
4131 pa_fin_plan_utils.Get_Curr_Working_Version_Info(
4132 p_project_id => l_project_id,
4133 p_fin_plan_type_id => l_src_plan_type_id,
4134 p_version_type => 'COST',
4135 x_fp_options_id => l_fp_options_id,
4136 x_fin_plan_version_id => l_etc_fp_ver_id,
4137 x_return_status => l_return_status,
4138 x_msg_count => l_msg_count,
4139 x_msg_data => l_msg_data);
4140 IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
4141 RETURN l_dummy;
4142 END IF;
4143 ELSE
4144 RETURN l_dummy;
4145 END IF;
4146 IF P_CONTEXT = 'VER_ID' THEN
4147 RETURN l_etc_fp_ver_id;
4148 END IF;
4149
4150 IF P_CONTEXT = 'VER_NAME' THEN
4151 SELECT version_name INTO l_etc_fp_ver_name
4152 FROM PA_BUDGET_VERSIONS
4153 WHERE BUDGET_VERSION_ID = l_etc_fp_ver_id;
4154 RETURN l_etc_fp_ver_name;
4155 END IF;
4156 EXCEPTION
4157 WHEN OTHERS THEN
4158 RETURN l_dummy;
4159 END GET_ETC_FP_PVERSION_DTLS;
4160
4161
4162 PROCEDURE GET_WP_ACTUALS_FOR_RA
4163 (P_FP_COLS_SRC_REC IN PA_FP_GEN_AMOUNT_UTILS.FP_COLS,
4164 P_FP_COLS_TGT_REC IN PA_FP_GEN_AMOUNT_UTILS.FP_COLS,
4165 P_SRC_RES_ASG_ID IN PA_RESOURCE_ASSIGNMENTS.RESOURCE_ASSIGNMENT_ID%TYPE,
4166 P_TASK_ID IN PA_TASKS.TASK_ID%TYPE,
4167 P_RES_LIST_MEM_ID IN PA_RESOURCE_LIST_MEMBERS.RESOURCE_LIST_MEMBER_ID%TYPE,
4168 P_ACTUALS_THRU_DATE IN DATE,
4169 X_ACT_QUANTITY OUT NOCOPY NUMBER,
4170 X_ACT_TXN_CURRENCY_CODE OUT NOCOPY PA_BUDGET_LINES.TXN_CURRENCY_CODE%TYPE,
4171 X_ACT_TXN_RAW_COST OUT NOCOPY NUMBER,
4172 X_ACT_TXN_BRDN_COST OUT NOCOPY NUMBER,
4173 X_ACT_PC_RAW_COST OUT NOCOPY NUMBER,
4174 X_ACT_PC_BRDN_COST OUT NOCOPY NUMBER,
4175 X_ACT_PFC_RAW_COST OUT NOCOPY NUMBER,
4176 X_ACT_PFC_BRDN_COST OUT NOCOPY NUMBER,
4177 X_RETURN_STATUS OUT NOCOPY VARCHAR2,
4178 X_MSG_COUNT OUT NOCOPY NUMBER,
4179 X_MSG_DATA OUT NOCOPY VARCHAR2 )
4180 IS
4181 l_module_name VARCHAR2(200) := 'pa.plsql.PA_FP_GEN_FCST_AMT_PUB1.GET_ACTUALS_FOR_RA';
4182
4183 l_wp_bdgt_ver_id pa_budget_versions.budget_version_id%type;
4184
4185 l_txn_currency_code_tab PA_PLSQL_DATATYPES.Char30TabTyp;
4186 l_init_quantity_tab PA_PLSQL_DATATYPES.NumTabTyp;
4187 l_txn_init_raw_cost_tab PA_PLSQL_DATATYPES.NumTabTyp;
4188 l_txn_init_brdn_cost_tab PA_PLSQL_DATATYPES.NumTabTyp;
4189 l_prj_init_raw_cost_tab PA_PLSQL_DATATYPES.NumTabTyp;
4190 l_prj_init_brdn_cost_tab PA_PLSQL_DATATYPES.NumTabTyp;
4191 l_init_raw_cost_tab PA_PLSQL_DATATYPES.NumTabTyp;
4192 l_init_brdn_cost_tab PA_PLSQL_DATATYPES.NumTabTyp;
4193
4194 l_msg_count NUMBER;
4195 l_msg_data VARCHAR2(2000);
4196 l_data VARCHAR2(2000);
4197 l_msg_index_out NUMBER:=0;
4198 BEGIN
4199 IF p_pa_debug_mode = 'Y' THEN
4200 pa_debug.set_curr_function( p_function => 'GEN_ETC_BDGT_COMPLETE_AMTS',
4201 p_debug_mode => p_pa_debug_mode);
4202 END IF;
4203 X_RETURN_STATUS := FND_API.G_RET_STS_SUCCESS;
4204 X_MSG_COUNT := 0;
4205
4206 l_wp_bdgt_ver_id := p_fp_cols_tgt_rec.x_gen_src_wp_version_id;
4207
4208 -- Bug 4285554: When source time phase is None, do not check for
4209 -- end_date <= p_actuals_thru_date when picking up actuals.
4210
4211 IF p_fp_cols_src_rec.x_time_phased_code = 'N' THEN
4212 SELECT txn_currency_code,
4213 SUM(NVL(init_quantity,0)),
4214 SUM(NVL(txn_init_raw_cost,0)),
4215 SUM(NVL(txn_init_burdened_cost,0)),
4216 SUM(NVL(project_init_raw_cost,0)),
4217 SUM(NVL(project_init_burdened_cost,0)),
4218 SUM(NVL(init_raw_cost,0)),
4219 SUM(NVL(init_burdened_cost,0))
4220 BULK COLLECT INTO
4221 l_txn_currency_code_tab,
4222 l_init_quantity_tab,
4223 l_txn_init_raw_cost_tab,
4224 l_txn_init_brdn_cost_tab,
4225 l_prj_init_raw_cost_tab,
4226 l_prj_init_brdn_cost_tab,
4227 l_init_raw_cost_tab,
4228 l_init_brdn_cost_tab
4229 FROM pa_budget_lines
4230 WHERE budget_version_id = l_wp_bdgt_ver_id
4231 AND resource_assignment_id = p_src_res_asg_id
4232 AND init_quantity is not null
4233 GROUP BY txn_currency_code;
4234 ELSE
4235 SELECT txn_currency_code,
4236 SUM(NVL(init_quantity,0)),
4237 SUM(NVL(txn_init_raw_cost,0)),
4238 SUM(NVL(txn_init_burdened_cost,0)),
4239 SUM(NVL(project_init_raw_cost,0)),
4240 SUM(NVL(project_init_burdened_cost,0)),
4241 SUM(NVL(init_raw_cost,0)),
4242 SUM(NVL(init_burdened_cost,0))
4243 BULK COLLECT INTO
4244 l_txn_currency_code_tab,
4245 l_init_quantity_tab,
4246 l_txn_init_raw_cost_tab,
4247 l_txn_init_brdn_cost_tab,
4248 l_prj_init_raw_cost_tab,
4249 l_prj_init_brdn_cost_tab,
4250 l_init_raw_cost_tab,
4251 l_init_brdn_cost_tab
4252 FROM pa_budget_lines
4253 WHERE budget_version_id = l_wp_bdgt_ver_id
4254 AND resource_assignment_id = p_src_res_asg_id
4255 AND end_date <= p_actuals_thru_date
4256 AND init_quantity is not null
4257 GROUP BY txn_currency_code;
4258 END IF; -- source time phase check
4259
4260 /*Workplan side only stores amounts in one currency for each planning
4261 resource. This part needs to be revisted when workplan side is changed
4262 to support multi currencies.*/
4263 IF l_txn_currency_code_tab.count >= 1 THEN
4264 X_ACT_TXN_CURRENCY_CODE := l_txn_currency_code_tab(1);
4265 X_ACT_QUANTITY := l_init_quantity_tab(1);
4266 X_ACT_TXN_RAW_COST := l_txn_init_raw_cost_tab(1);
4267 X_ACT_TXN_BRDN_COST := l_txn_init_brdn_cost_tab(1);
4268 X_ACT_PC_RAW_COST := l_prj_init_raw_cost_tab(1);
4269 X_ACT_PC_BRDN_COST := l_prj_init_brdn_cost_tab(1);
4270 X_ACT_PFC_RAW_COST := l_init_raw_cost_tab(1);
4271 X_ACT_PFC_BRDN_COST := l_init_brdn_cost_tab(1);
4272 ELSIF l_txn_currency_code_tab.count = 0 THEN
4273 X_ACT_TXN_CURRENCY_CODE := p_fp_cols_tgt_rec.x_project_currency_code;
4274 X_ACT_QUANTITY := 0;
4275 X_ACT_TXN_RAW_COST := 0;
4276 X_ACT_TXN_BRDN_COST := 0;
4277 X_ACT_PC_RAW_COST := 0;
4278 X_ACT_PC_BRDN_COST := 0;
4279 X_ACT_PFC_RAW_COST := 0;
4280 X_ACT_PFC_BRDN_COST := 0;
4281 END IF;
4282
4283 IF P_PA_DEBUG_MODE = 'Y' THEN
4284 PA_DEBUG.RESET_CURR_FUNCTION;
4285 END IF;
4286
4287 EXCEPTION
4288 WHEN PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc THEN
4289 l_msg_count := FND_MSG_PUB.count_msg;
4290 IF l_msg_count = 1 THEN
4291 PA_INTERFACE_UTILS_PUB.get_messages
4292 ( p_encoded => FND_API.G_TRUE,
4293 p_msg_index => 1,
4294 p_msg_count => l_msg_count,
4295 p_msg_data => l_msg_data,
4296 p_data => l_data,
4297 p_msg_index_out => l_msg_index_out);
4298 x_msg_data := l_data;
4299 x_msg_count := l_msg_count;
4300 ELSE
4301 x_msg_count := l_msg_count;
4302 END IF;
4303
4304 ROLLBACK;
4305 x_return_status := FND_API.G_RET_STS_ERROR;
4306
4307 IF P_PA_DEBUG_MODE = 'Y' THEN
4308 pa_fp_gen_amount_utils.fp_debug
4309 (p_msg => 'Invalid Arguments Passed',
4310 p_module_name => l_module_name,
4311 p_log_level => 5);
4312 PA_DEBUG.RESET_CURR_FUNCTION;
4313 END IF;
4314 RAISE;
4315 WHEN OTHERS THEN
4316 rollback;
4317 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4318 x_msg_count := 1;
4319 x_msg_data := substr(sqlerrm,1,240);
4320 -- dbms_output.put_line('error msg :'||x_msg_data);
4321 FND_MSG_PUB.add_exc_msg
4322 ( p_pkg_name => 'PA_FP_GEN_FCST_AMT_PUB1',
4323 p_procedure_name => 'GET_WP_ACTUALS_FOR_RA',
4324 p_error_text => substr(sqlerrm,1,240));
4325
4326 IF P_PA_DEBUG_MODE = 'Y' THEN
4327 pa_fp_gen_amount_utils.fp_debug
4328 (p_msg => 'Unexpected Error'||substr(sqlerrm, 1, 240),
4329 p_module_name => l_module_name,
4330 p_log_level => 5);
4331 PA_DEBUG.RESET_CURR_FUNCTION;
4332 END IF;
4333 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4334 END GET_WP_ACTUALS_FOR_RA;
4335
4336 PROCEDURE call_clnt_extn_and_update_bl(
4337 p_project_id IN pa_projects_all.project_id%TYPE
4338 ,p_budget_version_id IN pa_budget_versions.budget_version_id%TYPE
4339 ,x_call_maintain_data_api OUT NOCOPY VARCHAR2
4340 ,X_RETURN_STATUS OUT NOCOPY VARCHAR2
4341 ,X_MSG_COUNT OUT NOCOPY NUMBER
4342 ,X_MSG_DATA OUT NOCOPY VARCHAR2) IS
4343
4344 l_msg_count NUMBER;
4345 l_msg_data VARCHAR2(2000);
4346 l_data VARCHAR2(2000);
4347 l_msg_index_out NUMBER:=0;
4348 l_module_name VARCHAR2(200) := 'call_clnt_extn_and_update_bl';
4349
4350 l_fp_cols_rec PA_FP_GEN_AMOUNT_UTILS.FP_COLS;
4351 l_budget_lines_exist VARCHAR2(1) DEFAULT 'N';
4352
4353 l_ra_id_tbl SYSTEM.pa_num_tbl_type;
4354 l_task_id_tbl SYSTEM.pa_num_tbl_type;
4355 l_rlm_id_tbl SYSTEM.pa_num_tbl_type;
4356 l_txn_currency_code_tbl SYSTEM.pa_varchar2_15_tbl_type;
4357 l_planning_start_date_tbl SYSTEM.pa_date_tbl_type;
4358 l_planning_end_date_tbl SYSTEM.pa_date_tbl_type;
4359 l_total_qty_tbl SYSTEM.pa_num_tbl_type;
4360 l_txn_raw_cost_tbl SYSTEM.pa_num_tbl_type;
4361 l_txn_burdened_cost_tbl SYSTEM.pa_num_tbl_type;
4362 l_txn_revenue_tbl SYSTEM.pa_num_tbl_type;
4363 l_raw_cost_rate_tbl SYSTEM.pa_num_tbl_type;
4364 l_burdened_cost_rate_tbl SYSTEM.pa_num_tbl_type;
4365 l_bill_rate_tbl SYSTEM.pa_num_tbl_type;
4366 l_line_start_date_tbl SYSTEM.pa_date_tbl_type;
4367 l_line_end_date_tbl SYSTEM.pa_date_tbl_type;
4368
4369 l_disp_quant_tbl SYSTEM.pa_num_tbl_type;
4370 l_init_quantity_tbl SYSTEM.pa_num_tbl_type;
4371 l_init_raw_cost_tbl SYSTEM.pa_num_tbl_type;
4372 l_init_burd_cost_tbl SYSTEM.pa_num_tbl_type;
4373 l_init_revenue_tbl SYSTEM.pa_num_tbl_type;
4374 l_tras_source_code_tbl SYSTEM.pa_varchar2_30_tbl_type;
4375
4376
4377 l_ra_id_tbl_1 SYSTEM.pa_num_tbl_type;
4378 l_task_id_tbl_1 SYSTEM.pa_num_tbl_type;
4379 l_rlm_id_tbl_1 SYSTEM.pa_num_tbl_type;
4380 l_txn_currency_code_tbl_1 SYSTEM.pa_varchar2_15_tbl_type;
4381 l_planning_start_date_tbl_1 SYSTEM.pa_date_tbl_type;
4382 l_planning_end_date_tbl_1 SYSTEM.pa_date_tbl_type;
4383 l_etc_qty_tbl_1 SYSTEM.pa_num_tbl_type;
4384 l_txn_raw_cost_tbl_1 SYSTEM.pa_num_tbl_type;
4385 l_txn_burdened_cost_tbl_1 SYSTEM.pa_num_tbl_type;
4386 l_total_revenue_tbl_1 SYSTEM.pa_num_tbl_type;
4387 l_raw_cost_rate_tbl_1 SYSTEM.pa_num_tbl_type;
4388 l_burdened_cost_rate_tbl_1 SYSTEM.pa_num_tbl_type;
4389 l_bill_rate_tbl_1 SYSTEM.pa_num_tbl_type;
4390 l_line_start_date_tbl_1 SYSTEM.pa_date_tbl_type;
4391 l_line_end_date_tbl_1 SYSTEM.pa_date_tbl_type;
4392 l_period_name_tbl_1 SYSTEM.pa_varchar2_30_tbl_type;
4393 l_disp_quant_tbl_1 SYSTEM.pa_num_tbl_type;
4394 l_init_quantity_tbl_1 SYSTEM.pa_num_tbl_type;
4395 l_init_raw_cost_tbl_1 SYSTEM.pa_num_tbl_type;
4396 l_init_burd_cost_tbl_1 SYSTEM.pa_num_tbl_type;
4397 l_init_revenue_tbl_1 SYSTEM.pa_num_tbl_type;
4398 l_txn_revenue_tbl_1 SYSTEM.pa_num_tbl_type;
4399
4400
4401 l_ext_period_name_tab PA_PLSQL_DATATYPES.Char30TabTyp;
4402 l_ext_raw_cost_rate_tab PA_PLSQL_DATATYPES.NumTabTyp;
4403 l_ext_burdened_cost_rate_tab PA_PLSQL_DATATYPES.NumTabTyp;
4404 l_ext_revenue_bill_rate_tab PA_PLSQL_DATATYPES.NumTabTyp;
4405
4406 l_plan_txn_prd_amt_tbl_1 PA_FP_FCST_GEN_CLIENT_EXT.l_plan_txn_prd_amt_tbl;
4407 l_input_period_rates_tbl PA_FP_FCST_GEN_CLIENT_EXT.l_pds_rate_dtls_tab;
4408 l_period_rates_tbl PA_FP_FCST_GEN_CLIENT_EXT.l_pds_rate_dtls_tab;
4409
4410
4411 l_cal_etc_qty_tab SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
4412 l_cal_etc_raw_cost_tab SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
4413 l_cal_etc_burdened_cost_tab SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
4414 l_cal_etc_revenue_tab SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
4415 l_cal_raid_tab SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
4416 l_cal_txn_currency_code_tab SYSTEM.pa_varchar2_15_tbl_type:=SYSTEM.pa_varchar2_15_tbl_type();
4417
4418
4419 l_upd_rbf_tbl_1 SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
4420
4421 l_rate_based_flag_tbl SYSTEM.pa_varchar2_15_tbl_type;
4422 l_res_rate_based_flag_tbl SYSTEM.pa_varchar2_15_tbl_type;
4423 l_etc_method_code_tbl SYSTEM.pa_varchar2_30_tbl_type;
4424
4425
4426 l_plan_txn_prd_amt_tbl_1_bak PA_FP_FCST_GEN_CLIENT_EXT.l_plan_txn_prd_amt_tbl;
4427 l_upd_bud_line_tbl PA_FP_FCST_GEN_CLIENT_EXT.l_plan_txn_prd_amt_tbl;
4428
4429 TYPE del_bud_line_rec IS RECORD ( ra_id pa_budget_lines.resource_assignment_id%TYPE
4430 ,txn_curr_code pa_budget_lines.txn_currency_code%TYPE
4431 ,period_name pa_budget_lines.period_name%TYPE);
4432
4433
4434 TYPE l_upd_bgt_line_rec IS RECORD
4435 (
4436 ra_id pa_budget_lines.resource_assignment_id%TYPE,
4437 txn_curr_code pa_budget_lines.txn_currency_code%TYPE,
4438 period_name pa_budget_lines.period_name%TYPE,
4439 tot_quantity pa_budget_lines.quantity%TYPE, -- this attribute is used to update the total quantity field in pa_budget_lines
4440 txn_raw_cost pa_budget_lines.txn_raw_cost%TYPE,
4441 txn_burdened_cost pa_budget_lines.txn_burdened_cost%TYPE,
4442 txn_revenue pa_budget_lines.txn_revenue%TYPE,
4443 RAW_COST_RATE pa_budget_lines.txn_standard_cost_rate%TYPE,
4444 BURDENED_COST_RATE pa_budget_lines.burden_cost_rate%TYPE,
4445 REVENUE_BILL_RATE pa_budget_lines.txn_standard_bill_rate%TYPE,
4446 disp_quantity pa_budget_lines.display_quantity%TYPE);
4447
4448
4449 TYPE l_ra_id_tbl_prest is TABLE OF NUMBER INDEX BY BINARY_INTEGER;
4450 l_ra_id_tbl_present l_ra_id_tbl_prest;
4451
4452 TYPE l_upd_budget_line_tbl IS TABLE OF l_upd_bgt_line_rec;
4453 l_upd_bgt_line_tbl l_upd_budget_line_tbl := l_upd_budget_line_tbl();
4454
4455 TYPE del_bud_line_tbl IS TABLE OF del_bud_line_rec;
4456 l_del_bud_line_tbl del_bud_line_tbl := del_bud_line_tbl();
4457
4458 --Record created for updating rate_based_flag in pa_resource_assignments.
4459 TYPE update_rbf_rec IS RECORD( ra_id pa_resource_assignments.resource_assignment_id%TYPE,
4460 rate_based_flag pa_resource_assignments.rate_based_flag%TYPE);
4461 --pl/sql table created for updating rate_based_flag in pa_resource_assignments.
4462 TYPE update_rbf_tbl IS TABLE OF update_rbf_rec;
4463 l_upd_rbf_tbl update_rbf_tbl;
4464
4465 TYPE description_tbl IS TABLE OF VARCHAR2(30) INDEX BY VARCHAR2(30);
4466 l_description_tbl description_tbl;
4467
4468 l_etc_start_date DATE;
4469 l_act_thru_date DATE;
4470
4471 l_txn_raw_cost_rate_override NUMBER;
4472 l_txn_burd_cost_rate_override NUMBER;
4473 l_txn_bill_rate_override NUMBER;
4474 l_txn_avg_raw_cost_rate NUMBER;
4475 l_txn_avg_burden_cost_rate NUMBER;
4476 l_txn_avg_bill_rate NUMBER;
4477
4478 l_txn_raw_cost_rate_ovrrid_tbl SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
4479 l_txn_burd_cst_rate_ovrrid_tbl SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
4480 l_txn_bill_rate_ovrrid_tbl SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
4481 l_txn_avg_raw_cost_rate_tbl SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
4482 l_txn_avg_burd_cost_rate_tbl SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
4483 l_txn_avg_bill_rate_tbl SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
4484 l_txn_src_code_tbl SYSTEM.pa_varchar2_30_tbl_type :=SYSTEM.pa_varchar2_30_tbl_type();
4485 l_etc_source_tbl SYSTEM.pa_varchar2_80_tbl_type :=SYSTEM.pa_varchar2_80_tbl_type();
4486
4487
4488 l_period_data_modified VARCHAR2(1) DEFAULT 'N';
4489 l_ra_multi_curr VARCHAR2(1) DEFAULT 'N';
4490
4491 l_task_id_tab SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
4492 l_unit_of_measure_tbl SYSTEM.pa_varchar2_30_tbl_type:=SYSTEM.pa_varchar2_30_tbl_type();
4493 l_found VARCHAR2(1);
4494 l_call_calculate_flag VARCHAR2(1) := 'N';
4495 l_calc_cur_txn_flag VARCHAR2(1) := 'N';
4496 l_total_quantity NUMBER;
4497 l_etc_qty NUMBER;
4498 l_etc_raw_cost NUMBER;
4499 l_etc_burdened_cost NUMBER;
4500 l_etc_revenue NUMBER;
4501 l_actual_qty NUMBER;
4502 l_actual_raw_cost NUMBER;
4503 l_actual_burdened_cost NUMBER;
4504 l_actual_revenue NUMBER;
4505 l_task_percent_complete NUMBER;
4506 l_fcst_etc_qty NUMBER;
4507 l_fcst_etc_raw_cost NUMBER;
4508 l_fcst_etc_burdened_cost NUMBER;
4509 l_fcst_etc_revenue NUMBER;
4510
4511 l_raw_cost_rate NUMBER;
4512 l_burden_cost_rate NUMBER;
4513 l_bill_rate NUMBER;
4514 l_raw_cost NUMBER;
4515 l_burdened_cost NUMBER;
4516 l_revenue NUMBER;
4517 l_upd_count NUMBER := 0;
4518 l_del_count NUMBER := 0;
4519 k NUMBER;
4520 l_set_rbf VARCHAR2(1);
4521 l_rate_change_indicator VARCHAR2(1) := 'N';
4522 l_etc_method_code VARCHAR2(30);
4523 l_etc_plan_qty NUMBER;
4524 l_act_work_qty NUMBER;
4525 l_miss_num CONSTANT NUMBER := FND_API.G_MISS_NUM;
4526 l_struct_status_flag VARCHAR2(1);
4527 l_proj_per_comp NUMBER;
4528
4529
4530
4531 BEGIN
4532
4533 x_call_maintain_data_api := 'Y';
4534 IF p_pa_debug_mode = 'Y' THEN
4535 pa_debug.set_curr_function( p_function => 'call_clnt_extn_and_update_bl',
4536 p_debug_mode => p_pa_debug_mode);
4537 END IF;
4538 X_RETURN_STATUS := FND_API.G_RET_STS_SUCCESS;
4539 X_MSG_COUNT := 0;
4540
4541
4542
4543 IF p_project_id IS NULL OR p_budget_version_id IS NULL THEN
4544 IF p_pa_debug_mode = 'Y' THEN
4545 pa_fp_gen_amount_utils.fp_debug
4546 (p_msg => 'PA_FP_INV_PARAM_PASSED',
4547 p_module_name => l_module_name,
4548 p_log_level => 5);
4549 PA_DEBUG.RESET_CURR_FUNCTION;
4550 END IF;
4551 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
4552 END IF;
4553
4554 IF p_pa_debug_mode = 'Y' THEN
4555 pa_fp_gen_amount_utils.fp_debug
4556 (p_msg => 'Before calling pa_fp_gen_amount_utils.get_plan_version_dtls',
4557 p_module_name => l_module_name,
4558 p_log_level => 5);
4559 END IF;
4560
4561 PA_FP_GEN_AMOUNT_UTILS.GET_PLAN_VERSION_DTLS
4562 (P_PROJECT_ID => P_PROJECT_ID,
4563 P_BUDGET_VERSION_ID => P_BUDGET_VERSION_ID,
4564 X_FP_COLS_REC => l_fp_cols_rec,
4565 X_RETURN_STATUS => X_RETURN_STATUS,
4566 X_MSG_COUNT => X_MSG_COUNT,
4567 X_MSG_DATA => X_MSG_DATA);
4568 IF p_pa_debug_mode = 'Y' THEN
4569 pa_fp_gen_amount_utils.fp_debug
4570 (p_msg => 'Status after calling pa_fp_gen_amount_utils.get_plan_version_dtls'||x_return_status,
4571 p_module_name => l_module_name,
4572 p_log_level => 5);
4573 END IF;
4574 IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
4575 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
4576 END IF;
4577
4578 l_etc_start_date := PA_FP_GEN_AMOUNT_UTILS.GET_ETC_START_DATE(p_budget_version_id);
4579 l_act_thru_date := PA_FP_GEN_AMOUNT_UTILS.GET_ACTUALS_THRU_DATE(p_budget_version_id);
4580
4581
4582
4583 --Calling this procedure to set the global parameters to for getting the task percent complete.
4584
4585 l_struct_status_flag := PA_PROJECT_STRUCTURE_UTILS.check_struc_ver_published(p_project_id,
4586 l_fp_cols_rec.x_project_structure_version_id);
4587
4588
4589 --Setting the global parameters for the use of the api get_physical_pc_complete to get the task percent complete.
4590 pa_fin_plan_utils.g_fp_wa_struct_ver_id := l_fp_cols_rec.x_project_structure_version_id;
4591 pa_fin_plan_utils.g_fp_wa_struct_status_flag := l_struct_status_flag;
4592
4593
4594 -- Getting the project percent complete.
4595
4596 IF p_pa_debug_mode = 'Y' THEN
4597 pa_fp_gen_amount_utils.fp_debug
4598 (p_msg => 'Getting the project percent complete',
4599 p_module_name => l_module_name,
4600 p_log_level => 5);
4601 END IF;
4602
4603 PA_PROGRESS_UTILS.REDEFAULT_BASE_PC (
4604 p_Project_ID => p_project_id,
4605 p_Proj_element_id => NULL,
4606 p_Structure_type => 'FINANCIAL',
4607 p_object_type => 'PA_STRUCTURES',
4608 p_As_Of_Date => l_act_thru_date,
4609 P_STRUCTURE_VERSION_ID => NULL,
4610 P_STRUCTURE_STATUS => NULL,
4611 p_calling_context => 'FINANCIAL_PLANNING',
4612 X_base_percent_complete => l_proj_per_comp,
4613 x_return_status => x_return_status,
4614 x_msg_count => x_msg_count,
4615 x_msg_data => x_msg_data );
4616
4617 IF P_PA_DEBUG_MODE = 'Y' THEN
4618 pa_fp_gen_amount_utils.fp_debug
4619 (p_msg => 'After calling PA_PROGRESS_UTILS.REDEFAULT_BASE_PC,
4620 return status is:'||x_return_status,
4621 p_module_name => l_module_name,
4622 p_log_level => 5);
4623 END IF;
4624
4625 IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
4626 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
4627 END IF;
4628
4629
4630
4631
4632
4633 IF p_pa_debug_mode = 'Y' THEN
4634 pa_fp_gen_amount_utils.fp_debug
4635 (p_msg => 'Start of bulk collecting budget lines',
4636 p_module_name => l_module_name,
4637 p_log_level => 5);
4638 END IF;
4639
4640 -- debu: testing: calling populate_display_quantity
4641 PA_BUDGET_LINES_UTILS.populate_display_qty
4642 (p_budget_version_id => p_budget_version_id,
4643 p_context => 'FINANCIAL',
4644 x_return_status => X_RETURN_STATUS);
4645
4646 IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
4647 IF P_PA_debug_mode = 'Y' THEN
4648 pa_fp_gen_amount_utils.fp_debug
4649 (p_msg => 'Status after calling PA_BUDGET_LINES_UTILS.populate_display_qty'||X_RETURN_STATUS,
4650 p_module_name => l_module_name,
4651 p_log_level => 5);
4652 END IF;
4653 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
4654 END IF;
4655
4656 -- UT Fix: calling maintain_data API to synch up PA_RESOURCE_ASGN_CURR so that this table can be used
4657 -- further down in this API and in Calculate API when it is called in RESOURCE_ASSIGNMENT mode.
4658 -- Call MAINTAIN_DATA to roll up amounts to pa_resource_asgn_curr
4659
4660
4661 IF p_pa_debug_mode = 'Y' THEN
4662 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
4663 P_MSG => 'Before calling PA_FP_GEN_FCST_AMT_PUB1.' ||
4664 'UPD_NRB_TXN_OVR_RATES',
4665 --P_CALLED_MODE => p_called_mode,
4666 P_MODULE_NAME => l_module_name);
4667 END IF;
4668 PA_FP_GEN_FCST_AMT_PUB1.UPD_NRB_TXN_OVR_RATES
4669 (P_PROJECT_ID => P_PROJECT_ID,
4670 P_BUDGET_VERSION_ID => P_BUDGET_VERSION_ID,
4671 P_FP_COLS_REC => l_fp_cols_rec,
4672 P_ETC_START_DATE => l_etc_start_date,
4673 X_RETURN_STATUS => X_RETURN_STATUS,
4674 X_MSG_COUNT => X_MSG_COUNT,
4675 X_MSG_DATA => X_MSG_DATA);
4676 IF p_pa_debug_mode = 'Y' THEN
4677 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
4678 P_MSG => 'After calling PA_FP_GEN_FCST_AMT_PUB1.' ||
4679 'UPD_NRB_TXN_OVR_RATES: '||x_return_status,
4680 --P_CALLED_MODE => p_called_mode,
4681 P_MODULE_NAME => l_module_name);
4682 END IF;
4683 IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
4684 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
4685 END IF;
4686
4687
4688
4689
4690 PA_RES_ASG_CURRENCY_PUB.MAINTAIN_DATA
4691 ( p_fp_cols_rec => l_fp_cols_rec,
4692 p_calling_module => 'FORECAST_GENERATION',
4693 p_rollup_flag => 'Y',
4694 p_version_level_flag => 'Y',
4695 p_called_mode => 'SELF_SERVICE',
4696 x_return_status => X_RETURN_STATUS,
4697 x_msg_data => X_MSG_DATA,
4698 x_msg_count => X_MSG_COUNT);
4699
4700 IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
4701 IF P_PA_debug_mode = 'Y' THEN
4702 pa_fp_gen_amount_utils.fp_debug
4703 (p_msg => 'Status after calling PA_RES_ASG_CURRENCY_PUB.maintain_data'||X_RETURN_STATUS,
4704 p_module_name => l_module_name,
4705 p_log_level => 5);
4706 END IF;
4707 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
4708 END IF;
4709
4710
4711 -- Adding the call to sync up the planning dates with the budget line dates for a non time phased version if the
4712
4713 IF l_fp_cols_rec.x_time_phased_code IN ('N') THEN
4714 PA_FP_MAINTAIN_ACTUAL_PUB.SYNC_UP_PLANNING_DATES_NONE_TP
4715 (P_BUDGET_VERSION_ID => P_BUDGET_VERSION_ID,
4716 P_FP_COLS_REC => l_fp_cols_rec,
4717 X_RETURN_STATUS => X_RETURN_STATUS,
4718 X_MSG_COUNT => X_MSG_COUNT,
4719 X_MSG_DATA => X_MSG_DATA);
4720
4721 IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
4722 IF P_PA_debug_mode = 'Y' THEN
4723 pa_fp_gen_amount_utils.fp_debug
4724 (p_msg => 'PA_FP_MAINTAIN_ACTUAL_PUB.SYNC_UP_PLANNING_DATES_NONE_TP'||X_RETURN_STATUS,
4725 p_module_name => l_module_name,
4726 p_log_level => 5);
4727 END IF;
4728 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
4729 END IF;
4730 END IF;
4731
4732
4733
4734 --Checking if budget lines exist for the forecast version and collecting the budget lines
4735 SELECT prac.resource_assignment_id
4736 ,prac.txn_currency_code
4737 ,prac.total_quantity - NVL(prac.total_init_quantity,0)
4738 ,prac.total_txn_raw_cost - NVL(prac.total_txn_init_raw_cost,0)
4739 ,prac.total_txn_burdened_cost -NVL(prac.total_txn_init_burdened_cost,0)
4740 ,prac.total_txn_revenue - NVL(prac.total_txn_init_revenue,0)
4741 ,DECODE (prac.total_display_quantity, NULL, NULL, (prac.total_display_quantity - NVL(prac.total_init_quantity,0)))
4742 ,prac.total_init_quantity
4743 ,prac.total_txn_init_raw_cost
4744 ,prac.total_txn_init_burdened_cost
4745 ,prac.total_txn_init_revenue
4746 ,pra.task_id
4747 ,pra.RESOURCE_LIST_MEMBER_ID
4748 ,pra.unit_of_measure
4749 ,pra.rate_based_flag
4750 ,pra.resource_rate_based_flag
4751 ,pra.etc_method_code
4752 ,prac.txn_raw_cost_rate_override
4753 ,prac.txn_burden_cost_rate_override
4754 ,prac.txn_bill_rate_override
4755 ,prac.txn_average_raw_cost_rate
4756 ,prac.txn_average_burden_cost_rate
4757 ,prac.txn_average_bill_rate
4758 ,pra.transaction_source_code
4759 ,pra.planning_end_date
4760 ,decode(pra.transaction_source_code,NULL,NULL,
4761 (SELECT meaning
4762 FROM PA_LOOKUPS
4763 WHERE LOOKUP_TYPE='PA_FP_FCST_GEN_SRC_ALL'
4764 AND LOOKUP_CODE= pra.transaction_source_code)) etc_source
4765 BULK COLLECT INTO
4766 l_ra_id_tbl_1
4767 ,l_txn_currency_code_tbl_1
4768 ,l_etc_qty_tbl_1 /* ETC QTY */
4769 ,l_txn_raw_cost_tbl_1
4770 ,l_txn_burdened_cost_tbl_1
4771 ,l_txn_revenue_tbl_1
4772 ,l_disp_quant_tbl_1
4773 ,l_init_quantity_tbl_1
4774 ,l_init_raw_cost_tbl_1
4775 ,l_init_burd_cost_tbl_1
4776 ,l_init_revenue_tbl_1
4777 ,l_task_id_tab
4778 ,l_rlm_id_tbl
4779 ,l_unit_of_measure_tbl
4780 ,l_rate_based_flag_tbl
4781 ,l_res_rate_based_flag_tbl
4782 ,l_etc_method_code_tbl
4783 ,l_txn_raw_cost_rate_ovrrid_tbl
4784 ,l_txn_burd_cst_rate_ovrrid_tbl
4785 ,l_txn_bill_rate_ovrrid_tbl
4786 ,l_txn_avg_raw_cost_rate_tbl
4787 ,l_txn_avg_burd_cost_rate_tbl
4788 ,l_txn_avg_bill_rate_tbl
4789 ,l_txn_src_code_tbl
4790 ,l_planning_end_date_tbl_1
4791 ,l_etc_source_tbl
4792 FROM pa_resource_asgn_curr prac,
4793 pa_resource_assignments pra
4794 WHERE prac.budget_version_id = p_budget_version_id
4795 AND pra.budget_version_id = p_budget_version_id
4796 AND prac.resource_assignment_id = pra.resource_assignment_id;
4797
4798 IF p_pa_debug_mode = 'Y' THEN
4799 pa_fp_gen_amount_utils.fp_debug
4800 (p_msg => 'End of bulk collecting budget lines',
4801 p_module_name => l_module_name,
4802 p_log_level => 5);
4803 END IF;
4804
4805 -- the for loop for all the resource assignments for the client extension will be called , that are collected
4806 -- from the above selects
4807 -- need to put if for the plsql table to check the count
4808
4809 l_upd_rbf_tbl := update_rbf_tbl();
4810 l_upd_rbf_tbl.DELETE;
4811
4812 IF l_ra_id_tbl_1.COUNT > 0 THEN
4813
4814
4815 FOR C1 IN (select lookup_code, meaning from pa_lookups where lookup_type = 'PA_FP_FCST_GEN_CLNT_EXTN_LU') loop
4816 l_description_tbl(c1.lookup_code) := c1.meaning;
4817 END LOOP;
4818
4819
4820
4821 DELETE from PA_FP_GEN_RATE_TMP;
4822 FOR kk in l_ra_id_tbl_1.FIRST .. l_ra_id_tbl_1.LAST
4823 LOOP
4824
4825 l_calc_cur_txn_flag := 'N';
4826 l_etc_qty := l_disp_quant_tbl_1(kk);
4827 l_etc_raw_cost := l_txn_raw_cost_tbl_1(kk);
4828 l_etc_burdened_cost := l_txn_burdened_cost_tbl_1(kk);
4829 l_etc_revenue := l_txn_revenue_tbl_1(kk);
4830 l_actual_qty := l_init_quantity_tbl_1(kk);
4831 l_actual_raw_cost := l_init_raw_cost_tbl_1(kk);
4832 l_actual_burdened_cost := l_init_burd_cost_tbl_1(kk);
4833 l_actual_revenue := l_init_revenue_tbl_1(kk);
4834 l_total_quantity := l_etc_qty_tbl_1(kk) + l_init_quantity_tbl_1(kk);
4835 IF p_pa_debug_mode = 'Y' THEN
4836 pa_fp_gen_amount_utils.fp_debug
4837 (p_msg => 'Before collecting budget lines for a ra id',
4838 p_module_name => l_module_name,
4839 p_log_level => 5);
4840 END IF;
4841
4842 SELECT
4843 pbl.period_name
4844 ,NVL(pbl.txn_cost_rate_override,pbl.txn_standard_cost_rate)
4845 ,NVL(pbl.burden_cost_rate_override,pbl.burden_cost_rate)
4846 ,NVL(pbl.txn_bill_rate_override,pbl.txn_standard_bill_rate)
4847 ,pbl.quantity
4848 ,pbl.start_date
4849 ,pbl.end_date
4850 ,pbl.txn_raw_cost
4851 ,pbl.txn_burdened_cost
4852 ,pbl.txn_revenue
4853 ,pbl.display_quantity
4854 ,pbl.init_quantity
4855 ,pbl.txn_init_raw_cost
4856 ,pbl.txn_init_burdened_cost
4857 ,pbl.txn_init_revenue
4858 BULK COLLECT INTO
4859 l_ext_period_name_tab
4860 ,l_ext_raw_cost_rate_tab
4861 ,l_ext_burdened_cost_rate_tab
4862 ,l_ext_revenue_bill_rate_tab
4863 ,l_total_qty_tbl
4864 ,l_line_start_date_tbl
4865 ,l_line_end_date_tbl
4866 ,l_txn_raw_cost_tbl
4867 ,l_txn_burdened_cost_tbl
4868 ,l_txn_revenue_tbl
4869 ,l_disp_quant_tbl
4870 ,l_init_quantity_tbl
4871 ,l_init_raw_cost_tbl
4872 ,l_init_burd_cost_tbl
4873 ,l_init_revenue_tbl
4874 FROM pa_budget_lines pbl
4875 WHERE resource_assignment_id = l_ra_id_tbl_1(kk)
4876 AND txn_currency_code = l_txn_currency_code_tbl_1(kk);
4877
4878 IF p_pa_debug_mode = 'Y' THEN
4879 pa_fp_gen_amount_utils.fp_debug
4880 (p_msg => 'After collecting budget lines for a ra id',
4881 p_module_name => l_module_name,
4882 p_log_level => 5);
4883 END IF;
4884
4885
4886 -- populate the override rates table to be passed for the lines
4887 l_input_period_rates_tbl.delete;
4888 l_plan_txn_prd_amt_tbl_1.delete;
4889
4890 FOR j IN 1..l_ext_period_name_tab.count
4891 LOOP
4892 l_input_period_rates_tbl(j).period_name := l_ext_period_name_tab(j);
4893 l_input_period_rates_tbl(j).raw_cost_rate := l_ext_raw_cost_rate_tab(j);
4894 l_input_period_rates_tbl(j).burdened_cost_rate := l_ext_burdened_cost_rate_tab(j);
4895 l_input_period_rates_tbl(j).revenue_bill_rate := l_ext_revenue_bill_rate_tab(j);
4896
4897 l_plan_txn_prd_amt_tbl_1(j).period_name := l_ext_period_name_tab(j);
4898
4899 IF l_fp_cols_rec.x_time_phased_code IN ('P' , 'G') THEN
4900 l_plan_txn_prd_amt_tbl_1(j).txn_raw_cost := l_txn_raw_cost_tbl(j);
4901 l_plan_txn_prd_amt_tbl_1(j).txn_burdened_cost := l_txn_burdened_cost_tbl(j);
4902 l_plan_txn_prd_amt_tbl_1(j).txn_revenue := l_txn_revenue_tbl(j);
4903 l_plan_txn_prd_amt_tbl_1(j).etc_quantity := l_disp_quant_tbl(j);
4904
4905 ELSE
4906 l_plan_txn_prd_amt_tbl_1(j).txn_raw_cost := l_txn_raw_cost_tbl(j) - l_init_raw_cost_tbl(j);
4907 l_plan_txn_prd_amt_tbl_1(j).txn_burdened_cost := l_txn_burdened_cost_tbl(j) - l_init_burd_cost_tbl(j);
4908 l_plan_txn_prd_amt_tbl_1(j).txn_revenue := l_txn_revenue_tbl(j) - l_init_revenue_tbl(j);
4909 l_plan_txn_prd_amt_tbl_1(j).etc_quantity := l_disp_quant_tbl(j) - l_init_quantity_tbl(j);
4910 END IF;
4911
4912 l_plan_txn_prd_amt_tbl_1(j).init_quantity := l_init_quantity_tbl(j);
4913 l_plan_txn_prd_amt_tbl_1(j).init_raw_cost := l_init_raw_cost_tbl(j);
4914 l_plan_txn_prd_amt_tbl_1(j).init_burdened_cost := l_init_burd_cost_tbl(j);
4915 l_plan_txn_prd_amt_tbl_1(j).init_revenue := l_init_revenue_tbl(j);
4916
4917 IF NOT (l_fp_cols_rec.x_gen_ret_manual_line_flag = 'N' AND l_txn_src_code_tbl(kk) IS NULL )
4918 AND l_line_end_date_tbl(j) < NVL (l_etc_start_date,l_line_end_date_tbl(j) + 1) THEN
4919 l_plan_txn_prd_amt_tbl_1(j).description := l_description_tbl('CLOSED_PERIOD');
4920 l_plan_txn_prd_amt_tbl_1(j).periodic_line_editable := 'N';
4921 ELSIF (l_fp_cols_rec.x_gen_ret_manual_line_flag = 'Y' AND l_txn_src_code_tbl(kk) IS NULL) THEN
4922 l_plan_txn_prd_amt_tbl_1(j).description := l_description_tbl('MANUALLY_ADDED_LINE'); -- Modified to MANUALLY_ADDED_LINE for Bug #5979618
4923 l_plan_txn_prd_amt_tbl_1(j).periodic_line_editable := 'N';
4924 ELSE
4925 l_plan_txn_prd_amt_tbl_1(j).description := l_description_tbl('EDITABLE');
4926 l_plan_txn_prd_amt_tbl_1(j).periodic_line_editable := 'Y';
4927 END IF;
4928
4929 END LOOP;
4930
4931
4932 -- Call the client extension for each planning transaction
4933 IF P_PA_DEBUG_MODE = 'Y' THEN
4934 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
4935 P_MSG =>
4936 'Before calling pa_fp_fcst_gen_client_ext.fcst_gen_client_extn',
4937 P_MODULE_NAME => l_module_name);
4938 END IF;
4939 --back up the values to be compared later
4940 l_plan_txn_prd_amt_tbl_1_bak := l_plan_txn_prd_amt_tbl_1;
4941 l_period_data_modified := 'N';
4942
4943 -- call the client extns;
4944
4945 -- Fetching the etc method code for the temp table used in calcuate.
4946
4947 l_etc_method_code := NULL;
4948 l_etc_plan_qty := NULL;
4949 l_act_work_qty := NULL;
4950
4951 BEGIN
4952 -- for etc_method_code
4953 SELECT tmp1.etc_method_code
4954 INTO l_etc_method_code
4955 FROM PA_FP_CALC_AMT_TMP1 tmp1,
4956 PA_FP_CALC_AMT_TMP2 tmp2
4957 WHERE tmp1.TARGET_RES_ASG_ID = l_ra_id_tbl_1(kk)
4958 AND tmp2.TARGET_RES_ASG_ID = l_ra_id_tbl_1(kk)
4959 AND tmp1.resource_assignment_id = tmp2.resource_assignment_id
4960 AND tmp1.target_res_asg_id = tmp2.target_res_asg_id
4961 AND tmp2.txn_currency_code = l_txn_currency_code_tbl_1(kk)
4962 AND tmp1.transaction_source_code <> 'OPEN_COMMITMENTS'
4963 AND tmp2.transaction_source_code = 'ETC';
4964
4965 -- for work quantity
4966 /* In work quantity flows, resource_assignment_id is inserted as (-1) * task_id
4967 * so we have to split this select into two to get the below values separately.
4968 * -- Below code commented since this doesnt work. The tmp2
4969 * table is empty for work qty flows! ... Logic needs to be put
4970 * for this...
4971 SELECT tmp2.etc_plan_quantity
4972 ,tmp2.actual_work_qty
4973 INTO l_etc_plan_qty
4974 ,l_act_work_qty
4975 FROM PA_FP_CALC_AMT_TMP1 tmp1,
4976 PA_FP_CALC_AMT_TMP2 tmp2
4977 WHERE tmp1.resource_assignment_id = ((-1) * l_task_id_tab(kk))
4978 AND tmp2.resource_assignment_id = ((-1) * l_task_id_tab(kk))
4979 AND tmp1.resource_assignment_id = tmp2.resource_assignment_id
4980 AND tmp1.mapped_fin_task_id = l_task_id_tab(kk)
4981 AND tmp1.transaction_source_code = 'WORK_QUANTITY';
4982
4983 *****/
4984
4985 EXCEPTION
4986 WHEN NO_DATA_FOUND THEN
4987 l_etc_method_code := NULL;
4988 l_etc_plan_qty := NULL;
4989 l_act_work_qty := NULL;
4990 WHEN OTHERS THEN
4991 /* Ideally this part of code should never get executed.
4992 * This is put just to ensure that the fst generation flow
4993 * doesnt break just for want of the etc_method_code
4994 * information parameter */
4995 l_etc_method_code := NULL;
4996 l_etc_plan_qty := NULL;
4997 l_act_work_qty := NULL;
4998
4999 END;
5000
5001
5002 l_task_percent_complete :=PA_FIN_PLAN_UTILS.get_physical_pc_complete
5003 (p_project_id => p_project_id
5004 ,p_proj_element_id =>l_task_id_tab(kk));
5005
5006 PA_FP_FCST_GEN_CLIENT_EXT.FCST_GEN_CLIENT_EXTN
5007 (P_PROJECT_ID => P_PROJECT_ID,
5008 P_BUDGET_VERSION_ID => P_BUDGET_VERSION_ID,
5009 P_RESOURCE_ASSIGNMENT_ID => l_ra_id_tbl_1(kk),
5010 P_TASK_ID => l_task_id_tab(kk),
5011 P_TASK_PERCENT_COMPLETE => l_task_percent_complete,
5012 P_PROJECT_PERCENT_COMPLETE => l_proj_per_comp,
5013 P_RESOURCE_LIST_MEMBER_ID => l_rlm_id_tbl(kk),
5014 P_UNIT_OF_MEASURE => l_unit_of_measure_tbl(kk),
5015 P_TXN_CURRENCY_CODE => l_txn_currency_code_tbl_1(kk),
5016 P_ETC_QTY => l_etc_qty,
5017 P_ETC_RAW_COST => l_etc_raw_cost,
5018 P_ETC_BURDENED_COST => l_etc_burdened_cost,
5019 P_ETC_REVENUE => l_etc_revenue,
5020 P_ETC_SOURCE => l_etc_source_tbl(kk),
5021 P_ETC_GEN_METHOD => l_etc_method_code,
5022 P_ACTUAL_THRU_DATE => l_act_thru_date,
5023 P_ETC_START_DATE => l_act_thru_date+1,
5024 P_ETC_END_DATE => l_planning_end_date_tbl_1(kk),
5025 P_PLANNED_WORK_QTY => l_etc_plan_qty,
5026 P_ACTUAL_WORK_QTY => l_act_work_qty,
5027 P_ACTUAL_QTY => l_actual_qty,
5028 P_ACTUAL_RAW_COST => l_actual_raw_cost,
5029 P_ACTUAL_BURDENED_COST => l_actual_burdened_cost,
5030 P_ACTUAL_REVENUE => l_actual_revenue,
5031 P_PERIOD_RATES_TBL => l_input_period_rates_tbl,
5032 X_ETC_QTY => l_fcst_etc_qty,
5033 X_ETC_RAW_COST => l_fcst_etc_raw_cost,
5034 X_ETC_BURDENED_COST => l_fcst_etc_burdened_cost,
5035 X_ETC_REVENUE => l_fcst_etc_revenue,
5036 X_PERIOD_RATES_TBL => l_period_rates_tbl,
5037 p_override_raw_cost_rate => l_txn_raw_cost_rate_ovrrid_tbl(kk),
5038 p_override_burd_cost_rate => l_txn_burd_cst_rate_ovrrid_tbl(kk),
5039 p_override_bill_rate => l_txn_bill_rate_ovrrid_tbl(kk),
5040 p_avg_raw_cost_rate => l_txn_avg_raw_cost_rate_tbl(kk),
5041 p_avg_burd_cost_rate => l_txn_avg_burd_cost_rate_tbl(kk),
5042 p_avg_bill_rate => l_txn_avg_bill_rate_tbl(kk),
5043 px_period_amts_tbl => l_plan_txn_prd_amt_tbl_1,
5044 px_period_data_modified => l_period_data_modified,
5045 X_RETURN_STATUS => x_return_status,
5046 X_MSG_DATA => x_msg_data,
5047 X_MSG_COUNT => x_msg_count);
5048
5049
5050
5051
5052 IF P_PA_DEBUG_MODE = 'Y' THEN
5053 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
5054 P_MSG => 'After calling pa_fp_fcst_gen_client_ext.fcst_gen_client_extn: '||x_return_status,
5055 P_MODULE_NAME => l_module_name);
5056 END IF;
5057 IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
5058 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
5059 END IF;
5060
5061
5062 IF l_ra_id_tbl_present.exists(l_ra_id_tbl_1(kk)) THEN
5063 l_ra_multi_curr := 'Y';
5064 IF l_upd_rbf_tbl.count > 0 THEN -- added for bug 5516731
5065 FOR u IN l_upd_rbf_tbl.FIRST..l_upd_rbf_tbl.LAST LOOP
5066 IF l_upd_rbf_tbl(u).ra_id = l_ra_id_tbl_1(kk) THEN
5067 l_upd_rbf_tbl.DELETE(u);
5068 END IF;
5069 End LOOP;
5070 END IF; -- added for bug 5516731
5071 ELSE
5072 l_ra_id_tbl_present(l_ra_id_tbl_1(kk)) := l_ra_id_tbl_1(kk);
5073 l_ra_multi_curr := 'N';
5074 END IF;
5075
5076 -- validating the modified amounts
5077 IF l_fp_cols_rec.x_time_phased_code IN ('P' , 'G') THEN
5078 IF NVL(l_period_data_modified,'N') = 'Y' THEN
5079 -- loop thru the backup table and the recieved table to see whether the period line is present
5080 -- and if so get it.
5081 IF l_plan_txn_prd_amt_tbl_1_bak.COUNT > 0 AND l_plan_txn_prd_amt_tbl_1.COUNT > 0 THEN
5082 IF l_rate_based_flag_tbl(kk) = 'N' AND l_res_rate_based_flag_tbl(kk) = 'Y' THEN
5083 l_set_rbf := 'N';
5084 IF l_ra_multi_curr = 'N' THEN
5085 <<OUTERLOOP>> FOR d IN l_plan_txn_prd_amt_tbl_1_bak.FIRST..l_plan_txn_prd_amt_tbl_1_bak.LAST LOOP
5086 <<INNERLOOP>> FOR e IN l_plan_txn_prd_amt_tbl_1.FIRST..l_plan_txn_prd_amt_tbl_1.LAST LOOP
5087 IF l_plan_txn_prd_amt_tbl_1(e).period_name = l_plan_txn_prd_amt_tbl_1_bak(d).period_name THEN
5088 IF l_plan_txn_prd_amt_tbl_1(e).etc_quantity IS NULL AND
5089 (l_plan_txn_prd_amt_tbl_1(e).txn_raw_cost IS NOT NULL OR
5090 l_plan_txn_prd_amt_tbl_1(e).txn_burdened_cost IS NOT NULL OR
5091 l_plan_txn_prd_amt_tbl_1(e).txn_revenue IS NOT NULL) THEN
5092 l_set_rbf := 'N';
5093 EXIT OUTERLOOP;
5094 ELSE
5095 l_set_rbf := 'Y';
5096 END IF;
5097 END IF;
5098 END LOOP;
5099 END LOOP;
5100 END IF;
5101 IF l_set_rbf = 'Y' THEN
5102 l_upd_rbf_tbl.extend(1);
5103 l_upd_rbf_tbl(l_upd_rbf_tbl.COUNT).ra_id := l_ra_id_tbl_1(kk);
5104 END IF;
5105 END IF;
5106
5107 FOR j IN l_plan_txn_prd_amt_tbl_1_bak.first .. l_plan_txn_prd_amt_tbl_1_bak.last
5108 LOOP
5109
5110 l_found := 'N';
5111 k := null;
5112 FOR z IN l_plan_txn_prd_amt_tbl_1.first .. l_plan_txn_prd_amt_tbl_1.last
5113 LOOP
5114
5115 IF l_plan_txn_prd_amt_tbl_1_bak(j).period_name = l_plan_txn_prd_amt_tbl_1(z).period_name THEN
5116 l_found := 'Y';
5117 k :=z;
5118 EXIT;
5119 END IF;
5120 END LOOP; --l_plan_txn_prd_amt_tbl_1 (k)
5121 -- if the line is found and that line is editable
5122
5123 IF l_plan_txn_prd_amt_tbl_1_bak(j).periodic_line_editable = 'Y' and l_found = 'Y' AND
5124 (NVL(l_plan_txn_prd_amt_tbl_1_bak(j).etc_quantity,l_miss_num) <>
5125 NVL(l_plan_txn_prd_amt_tbl_1(k).etc_quantity,l_miss_num) OR
5126 NVL(l_plan_txn_prd_amt_tbl_1_bak(j).txn_raw_cost,l_miss_num) <>
5127 NVL(l_plan_txn_prd_amt_tbl_1(k).txn_raw_cost,l_miss_num) OR
5128 NVL(l_plan_txn_prd_amt_tbl_1_bak(j).txn_burdened_cost,l_miss_num) <>
5129 NVL(l_plan_txn_prd_amt_tbl_1(k).txn_burdened_cost,l_miss_num) OR
5130 NVL(l_plan_txn_prd_amt_tbl_1_bak(j).txn_revenue,l_miss_num) <>
5131 NVL(l_plan_txn_prd_amt_tbl_1(k).txn_revenue,l_miss_num)) THEN
5132 /*Start of the rounding handing*/
5133
5134 -- if resource_rate_based_flag is N for the planning transaction, then we are ignoring any update
5135 -- on the etc_quantity. So updating it aas null. For other cases, we might have to honor the changes
5136 -- done for etc_quantity by the client extn.
5137 IF l_res_rate_based_flag_tbl(kk) = 'N' THEN
5138 l_plan_txn_prd_amt_tbl_1(k).etc_quantity := NULL;
5139 ELSIF l_plan_txn_prd_amt_tbl_1(k).etc_quantity IS NOT NULL THEN
5140 l_plan_txn_prd_amt_tbl_1(k).etc_quantity := pa_fin_plan_utils2.round_quantity
5141 (p_quantity => l_plan_txn_prd_amt_tbl_1(k).etc_quantity);
5142 END IF;
5143
5144 IF l_fp_cols_rec.x_version_type = 'COST' OR l_fp_cols_rec.x_version_type = 'ALL' THEN
5145 IF l_plan_txn_prd_amt_tbl_1(k).txn_raw_cost IS NOT NULL THEN
5146 l_plan_txn_prd_amt_tbl_1(k).txn_raw_cost := pa_currency.round_trans_currency_amt1
5147 (x_amount => l_plan_txn_prd_amt_tbl_1(k).txn_raw_cost,
5148 x_curr_Code => l_txn_currency_code_tbl_1(kk));
5149 END IF;
5150 IF l_plan_txn_prd_amt_tbl_1(k).txn_burdened_cost IS NOT NULL THEN
5151 l_plan_txn_prd_amt_tbl_1(k).txn_burdened_cost := pa_currency.round_trans_currency_amt1
5152 (x_amount => l_plan_txn_prd_amt_tbl_1(k).txn_burdened_cost,
5153 x_curr_Code => l_txn_currency_code_tbl_1(kk));
5154 END IF;
5155 END IF;
5156 IF l_fp_cols_rec.x_version_type = 'REVENUE' OR l_fp_cols_rec.x_version_type = 'ALL' THEN
5157 IF l_plan_txn_prd_amt_tbl_1(k).txn_revenue IS NOT NULL THEN
5158 l_plan_txn_prd_amt_tbl_1(k).txn_revenue := pa_currency.round_trans_currency_amt1
5159 (x_amount => l_plan_txn_prd_amt_tbl_1(k).txn_revenue,
5160 x_curr_Code => l_txn_currency_code_tbl_1(kk));
5161 END IF;
5162 END IF;
5163 /*End of the rounding handling*/
5164
5165 -- if all amounts have been nulled out , delete that budget line ,
5166 -- populating the del_bug_line table to be deleted.
5167
5168 -- else populationg the upd budget line table.
5169 -- and taking care of the precedence rules.
5170
5171 IF l_rate_based_flag_tbl(kk) = 'Y' AND l_res_rate_based_flag_tbl(kk) = 'Y'
5172 AND l_plan_txn_prd_amt_tbl_1(k).etc_quantity IS NOT NULL THEN
5173
5174 l_upd_bgt_line_tbl.extend(1);
5175 l_upd_count := l_upd_bgt_line_tbl.COUNT;
5176 l_upd_bgt_line_tbl(l_upd_count).ra_id := l_ra_id_tbl_1(kk);
5177 l_upd_bgt_line_tbl(l_upd_count).txn_curr_code := l_txn_currency_code_tbl_1(kk);
5178
5179 l_upd_bgt_line_tbl(l_upd_count).period_name := l_plan_txn_prd_amt_tbl_1_bak(j).period_name;
5180 l_upd_bgt_line_tbl(l_upd_count).txn_raw_cost := l_plan_txn_prd_amt_tbl_1_bak(j).txn_raw_cost;
5181 l_upd_bgt_line_tbl(l_upd_count).txn_burdened_cost := l_plan_txn_prd_amt_tbl_1_bak(j).txn_burdened_cost;
5182 l_upd_bgt_line_tbl(l_upd_count).txn_revenue := l_plan_txn_prd_amt_tbl_1_bak(j).txn_revenue;
5183 l_upd_bgt_line_tbl(l_upd_count).raw_cost_rate := l_ext_raw_cost_rate_tab(j);
5184 l_upd_bgt_line_tbl(l_upd_count).BURDENED_COST_RATE := l_ext_burdened_cost_rate_tab(j);
5185 l_upd_bgt_line_tbl(l_upd_count).REVENUE_BILL_RATE := l_ext_revenue_bill_rate_tab(j);
5186 l_upd_bgt_line_tbl(l_upd_count).disp_quantity := l_plan_txn_prd_amt_tbl_1_bak(j).etc_quantity;
5187 -- the etc_quantity field would contain total_quantity for the budget line. so adding back the init value also
5188 -- though there would not be any actual quantity for open periods.
5189 l_upd_bgt_line_tbl(l_upd_count).tot_quantity := l_plan_txn_prd_amt_tbl_1_bak(j).etc_quantity + Nvl(l_plan_txn_prd_amt_tbl_1_bak(j).init_quantity, 0);
5190
5191
5192
5193 IF Nvl(l_plan_txn_prd_amt_tbl_1(k).etc_quantity, 0) <> Nvl(l_plan_txn_prd_amt_tbl_1_bak(j).etc_quantity, 0) THEN
5194
5195 -- update the changed quantity - making display quantity equal to total quantity.
5196 l_upd_bgt_line_tbl(l_upd_count).tot_quantity := l_plan_txn_prd_amt_tbl_1(j).etc_quantity + Nvl(l_plan_txn_prd_amt_tbl_1_bak(j).init_quantity, 0);
5197 l_upd_bgt_line_tbl(l_upd_count).disp_quantity := l_plan_txn_prd_amt_tbl_1(j).etc_quantity + Nvl(l_plan_txn_prd_amt_tbl_1_bak(j).init_quantity, 0);
5198 IF l_fp_cols_rec.x_version_type = 'COST' OR l_fp_cols_rec.x_version_type = 'ALL' THEN
5199
5200 IF l_plan_txn_prd_amt_tbl_1(k).txn_raw_cost IS NULL THEN
5201 l_upd_bgt_line_tbl(l_upd_count).txn_raw_cost := NULL;
5202 l_upd_bgt_line_tbl(l_upd_count).raw_cost_rate := 0;
5203 ELSE
5204 l_upd_bgt_line_tbl(l_upd_count).txn_raw_cost := l_plan_txn_prd_amt_tbl_1(k).txn_raw_cost;
5205 l_upd_bgt_line_tbl(l_upd_count).raw_cost_rate := l_plan_txn_prd_amt_tbl_1(k).txn_raw_cost
5206 /l_plan_txn_prd_amt_tbl_1(k).etc_quantity;
5207 END IF;
5208 IF l_plan_txn_prd_amt_tbl_1(k).txn_burdened_cost IS NULL THEN
5209 l_upd_bgt_line_tbl(l_upd_count).txn_burdened_cost := NULL;
5210 l_upd_bgt_line_tbl(l_upd_count).burdened_cost_rate := 0;
5211 ELSE
5212 l_upd_bgt_line_tbl(l_upd_count).txn_burdened_cost := l_plan_txn_prd_amt_tbl_1(k).txn_burdened_cost;
5213 l_upd_bgt_line_tbl(l_upd_count).burdened_cost_rate := l_plan_txn_prd_amt_tbl_1(k).txn_burdened_cost
5214 /l_plan_txn_prd_amt_tbl_1(k).etc_quantity;
5215 END IF;
5216 END IF;
5217 IF l_fp_cols_rec.x_version_type = 'REVENUE' OR l_fp_cols_rec.x_version_type = 'ALL' THEN
5218 IF l_plan_txn_prd_amt_tbl_1(k).txn_revenue IS NULL THEN
5219 l_upd_bgt_line_tbl(l_upd_count).txn_revenue := NULL;
5220 l_upd_bgt_line_tbl(l_upd_count).revenue_bill_rate := 0;
5221 ELSE
5222 l_upd_bgt_line_tbl(l_upd_count).txn_revenue := l_plan_txn_prd_amt_tbl_1(k).txn_revenue;
5223 l_upd_bgt_line_tbl(l_upd_count).revenue_bill_rate := l_plan_txn_prd_amt_tbl_1(k).txn_revenue
5224 /l_plan_txn_prd_amt_tbl_1(k).etc_quantity;
5225 END IF;
5226 END IF;
5227 ELSE
5228 IF l_fp_cols_rec.x_version_type = 'COST' OR l_fp_cols_rec.x_version_type = 'ALL' THEN
5229
5230 IF l_plan_txn_prd_amt_tbl_1(k).txn_raw_cost IS NULL THEN
5231 l_upd_bgt_line_tbl(l_upd_count).txn_raw_cost := NULL;
5232 l_upd_bgt_line_tbl(l_upd_count).raw_cost_rate := 0;
5233 ELSIF l_plan_txn_prd_amt_tbl_1(k).txn_raw_cost <> l_plan_txn_prd_amt_tbl_1_bak(j).txn_raw_cost THEN
5234 l_upd_bgt_line_tbl(l_upd_count).txn_raw_cost := l_plan_txn_prd_amt_tbl_1(k).txn_raw_cost;
5235 l_upd_bgt_line_tbl(l_upd_count).raw_cost_rate := l_plan_txn_prd_amt_tbl_1(k).txn_raw_cost
5236 /l_plan_txn_prd_amt_tbl_1(k).etc_quantity;
5237 END IF;
5238 IF l_plan_txn_prd_amt_tbl_1(k).txn_burdened_cost IS NULL THEN
5239 l_upd_bgt_line_tbl(l_upd_count).txn_burdened_cost := NULL;
5240 l_upd_bgt_line_tbl(l_upd_count).burdened_cost_rate := 0;
5241 ELSIF l_plan_txn_prd_amt_tbl_1(k).txn_burdened_cost <> l_plan_txn_prd_amt_tbl_1_bak(j).txn_burdened_cost THEN
5242 l_upd_bgt_line_tbl(l_upd_count).txn_burdened_cost := l_plan_txn_prd_amt_tbl_1(k).txn_burdened_cost;
5243 l_upd_bgt_line_tbl(l_upd_count).burdened_cost_rate := l_plan_txn_prd_amt_tbl_1(k).txn_burdened_cost
5244 /l_plan_txn_prd_amt_tbl_1(k).etc_quantity;
5245 END IF;
5246 END IF;
5247 IF l_fp_cols_rec.x_version_type = 'REVENUE' OR l_fp_cols_rec.x_version_type = 'ALL' THEN
5248 IF l_plan_txn_prd_amt_tbl_1(k).txn_revenue IS NULL THEN
5249 l_upd_bgt_line_tbl(l_upd_count).txn_revenue := NULL;
5250 l_upd_bgt_line_tbl(l_upd_count).revenue_bill_rate := 0;
5251 ELSIF l_plan_txn_prd_amt_tbl_1(k).txn_revenue <> l_plan_txn_prd_amt_tbl_1_bak(j).txn_revenue THEN
5252 l_upd_bgt_line_tbl(l_upd_count).txn_revenue := l_plan_txn_prd_amt_tbl_1(k).txn_revenue;
5253 l_upd_bgt_line_tbl(l_upd_count).revenue_bill_rate := l_plan_txn_prd_amt_tbl_1(k).txn_revenue
5254 /l_plan_txn_prd_amt_tbl_1(k).etc_quantity;
5255 END IF;
5256 END IF;
5257 END IF;
5258
5259 ELSIF l_rate_based_flag_tbl(kk) = 'Y' AND l_res_rate_based_flag_tbl(kk) = 'Y'
5260 AND l_plan_txn_prd_amt_tbl_1(k).etc_quantity IS NULL THEN
5261
5262 /* Quantity null or nulled out means the bl has to be deletedc */
5263 l_del_bud_line_tbl.extend(1);
5264 l_del_count := l_del_bud_line_tbl.COUNT;
5265 l_del_bud_line_tbl(l_del_count).ra_id := l_ra_id_tbl_1(kk);
5266 l_del_bud_line_tbl(l_del_count).txn_curr_code := l_txn_currency_code_tbl_1(kk);
5267 l_del_bud_line_tbl(l_del_count).period_name := l_plan_txn_prd_amt_tbl_1(k).period_name;
5268
5269 ELSIF l_rate_based_flag_tbl(kk) = 'N' AND l_res_rate_based_flag_tbl(kk) = 'Y'
5270 AND l_set_rbf = 'Y' AND l_plan_txn_prd_amt_tbl_1(k).etc_quantity IS NOT NULL THEN
5271
5272 l_upd_bgt_line_tbl.extend(1);
5273 l_upd_count := l_upd_bgt_line_tbl.COUNT;
5274 l_upd_bgt_line_tbl(l_upd_count).ra_id := l_ra_id_tbl_1(kk);
5275 l_upd_bgt_line_tbl(l_upd_count).txn_curr_code := l_txn_currency_code_tbl_1(kk);
5276 l_upd_bgt_line_tbl(l_upd_count).period_name := l_plan_txn_prd_amt_tbl_1(k).period_name;
5277 l_upd_bgt_line_tbl(l_upd_count).disp_quantity := l_plan_txn_prd_amt_tbl_1(k).etc_quantity;
5278 l_upd_bgt_line_tbl(l_upd_count).tot_quantity := l_plan_txn_prd_amt_tbl_1(k).etc_quantity;
5279
5280
5281 IF l_fp_cols_rec.x_version_type = 'COST' OR l_fp_cols_rec.x_version_type = 'ALL' THEN
5282 IF l_plan_txn_prd_amt_tbl_1(k).txn_raw_cost IS NOT NULL THEN
5283 l_upd_bgt_line_tbl(l_upd_count).txn_raw_cost := l_plan_txn_prd_amt_tbl_1(k).txn_raw_cost;
5284 l_upd_bgt_line_tbl(l_upd_count).raw_cost_rate := l_plan_txn_prd_amt_tbl_1(k).txn_raw_cost/l_plan_txn_prd_amt_tbl_1(k).etc_quantity;
5285 IF l_plan_txn_prd_amt_tbl_1(k).txn_burdened_cost IS NOT NULL THEN
5286 l_upd_bgt_line_tbl(l_upd_count).txn_burdened_cost := l_plan_txn_prd_amt_tbl_1(k).txn_burdened_cost;
5287 l_upd_bgt_line_tbl(l_upd_count).burdened_cost_rate := l_plan_txn_prd_amt_tbl_1(k).txn_burdened_cost/l_plan_txn_prd_amt_tbl_1(k).etc_quantity;
5288 ELSE
5289 l_upd_bgt_line_tbl(l_upd_count).txn_burdened_cost := NULL;
5290 l_upd_bgt_line_tbl(l_upd_count).burdened_cost_rate := 0;
5291 END IF;
5292 ELSIF l_plan_txn_prd_amt_tbl_1(k).txn_burdened_cost IS NOT NULL THEN
5293 l_upd_bgt_line_tbl(l_upd_count).txn_burdened_cost := l_plan_txn_prd_amt_tbl_1(k).txn_burdened_cost;
5294 l_upd_bgt_line_tbl(l_upd_count).burdened_cost_rate := l_plan_txn_prd_amt_tbl_1(k).txn_burdened_cost
5295 /l_plan_txn_prd_amt_tbl_1(k).etc_quantity;
5296 l_upd_bgt_line_tbl(l_upd_count).txn_raw_cost := l_plan_txn_prd_amt_tbl_1(k).txn_burdened_cost;
5297 l_upd_bgt_line_tbl(l_upd_count).raw_cost_rate := l_upd_bgt_line_tbl(l_upd_count).txn_raw_cost
5298 /l_plan_txn_prd_amt_tbl_1(k).etc_quantity;
5299 ELSE
5300 l_upd_bgt_line_tbl(l_upd_count).txn_raw_cost := NULL;
5301 l_upd_bgt_line_tbl(l_upd_count).raw_cost_rate := 0;
5302 l_upd_bgt_line_tbl(l_upd_count).txn_burdened_cost := NULL;
5303 l_upd_bgt_line_tbl(l_upd_count).burdened_cost_rate := 0;
5304 END IF;
5305 END IF;
5306 IF l_fp_cols_rec.x_version_type = 'REVENUE' OR l_fp_cols_rec.x_version_type = 'ALL' THEN
5307 IF l_plan_txn_prd_amt_tbl_1(k).txn_revenue IS NOT NULL THEN
5308 l_upd_bgt_line_tbl(l_upd_count).txn_revenue := l_plan_txn_prd_amt_tbl_1(k).txn_revenue;
5309 l_upd_bgt_line_tbl(l_upd_count).revenue_bill_rate := l_plan_txn_prd_amt_tbl_1(k).txn_revenue
5310 /l_plan_txn_prd_amt_tbl_1(k).etc_quantity;
5311 ELSE
5312 l_upd_bgt_line_tbl(l_upd_count).txn_revenue := NULL;
5313 l_upd_bgt_line_tbl(l_upd_count).revenue_bill_rate := 0;
5314 END IF;
5315 END IF;
5316 ELSE
5317
5318 l_upd_bgt_line_tbl.extend(1);
5319 l_upd_count := l_upd_bgt_line_tbl.COUNT;
5320 l_upd_bgt_line_tbl(l_upd_count).ra_id := l_ra_id_tbl_1(kk);
5321 l_upd_bgt_line_tbl(l_upd_count).txn_curr_code := l_txn_currency_code_tbl_1(kk);
5322 l_upd_bgt_line_tbl(l_upd_count).period_name := l_plan_txn_prd_amt_tbl_1_bak(j).period_name;
5323 l_upd_bgt_line_tbl(l_upd_count).disp_quantity := NULL;
5324
5325
5326 l_upd_bgt_line_tbl(l_upd_count).txn_raw_cost := l_plan_txn_prd_amt_tbl_1_bak(j).txn_raw_cost;
5327 l_upd_bgt_line_tbl(l_upd_count).txn_burdened_cost := l_plan_txn_prd_amt_tbl_1_bak(j).txn_burdened_cost;
5328 l_upd_bgt_line_tbl(l_upd_count).txn_revenue := l_plan_txn_prd_amt_tbl_1_bak(j).txn_revenue;
5329 l_upd_bgt_line_tbl(l_upd_count).raw_cost_rate := l_ext_raw_cost_rate_tab(j);
5330 l_upd_bgt_line_tbl(l_upd_count).BURDENED_COST_RATE := l_ext_burdened_cost_rate_tab(j);
5331 l_upd_bgt_line_tbl(l_upd_count).REVENUE_BILL_RATE := l_ext_revenue_bill_rate_tab(j);
5332 /* ALL CONDITIONS WOULD FIT HERE */
5333 IF l_fp_cols_rec.x_version_type = 'COST' OR l_fp_cols_rec.x_version_type = 'ALL' THEN
5334 IF l_plan_txn_prd_amt_tbl_1(k).txn_raw_cost IS NOT NULL THEN
5335 l_upd_bgt_line_tbl(l_upd_count).txn_raw_cost := l_plan_txn_prd_amt_tbl_1(k).txn_raw_cost;
5336 l_upd_bgt_line_tbl(l_upd_count).tot_quantity := l_plan_txn_prd_amt_tbl_1(k).txn_raw_cost;
5337 l_upd_bgt_line_tbl(l_upd_count).raw_cost_rate := l_plan_txn_prd_amt_tbl_1(k).txn_raw_cost / l_upd_bgt_line_tbl(l_upd_count).tot_quantity;
5338 IF l_plan_txn_prd_amt_tbl_1(k).txn_burdened_cost IS NOT NULL THEN
5339 l_upd_bgt_line_tbl(l_upd_count).txn_burdened_cost := l_plan_txn_prd_amt_tbl_1(k).txn_burdened_cost;
5340 l_upd_bgt_line_tbl(l_upd_count).BURDENED_COST_RATE := l_upd_bgt_line_tbl(l_upd_count).txn_burdened_cost/ l_upd_bgt_line_tbl(l_upd_count).tot_quantity;
5341 ELSE
5342 l_upd_bgt_line_tbl(l_upd_count).txn_burdened_cost := NULL;
5343 l_upd_bgt_line_tbl(l_upd_count).BURDENED_COST_RATE := 0;
5344 END IF;
5345 ELSIF l_plan_txn_prd_amt_tbl_1(k).txn_burdened_cost IS NOT NULL THEN
5346 l_upd_bgt_line_tbl(l_upd_count).txn_burdened_cost := l_plan_txn_prd_amt_tbl_1(k).txn_burdened_cost;
5347 l_upd_bgt_line_tbl(l_upd_count).tot_quantity := l_plan_txn_prd_amt_tbl_1(k).txn_burdened_cost;
5348 l_upd_bgt_line_tbl(l_upd_count).BURDENED_COST_RATE := l_upd_bgt_line_tbl(l_upd_count).txn_burdened_cost / l_upd_bgt_line_tbl(l_upd_count).tot_quantity;
5349 l_upd_bgt_line_tbl(l_upd_count).txn_raw_cost := l_plan_txn_prd_amt_tbl_1(k).txn_burdened_cost;
5350 l_upd_bgt_line_tbl(l_upd_count).raw_cost_rate := l_upd_bgt_line_tbl(l_upd_count).txn_raw_cost / l_upd_bgt_line_tbl(l_upd_count).tot_quantity;
5351 ELSIF l_fp_cols_rec.x_version_type = 'ALL' AND l_plan_txn_prd_amt_tbl_1(k).txn_revenue IS NOT NULL THEN
5352 l_upd_bgt_line_tbl(l_upd_count).txn_burdened_cost := NULL;
5353 l_upd_bgt_line_tbl(l_upd_count).BURDENED_COST_RATE := 0;
5354 l_upd_bgt_line_tbl(l_upd_count).txn_raw_cost := NULL;
5355 l_upd_bgt_line_tbl(l_upd_count).raw_cost_rate := 0;
5356 l_upd_bgt_line_tbl(l_upd_count).txn_revenue := l_plan_txn_prd_amt_tbl_1(k).txn_revenue;
5357 l_upd_bgt_line_tbl(l_upd_count).tot_quantity := l_plan_txn_prd_amt_tbl_1(k).txn_revenue;
5358 l_upd_bgt_line_tbl(l_upd_count).raw_cost_rate := l_plan_txn_prd_amt_tbl_1(k).txn_revenue / l_upd_bgt_line_tbl(l_upd_count).tot_quantity;
5359 ELSE
5360 l_del_bud_line_tbl.extend(1);
5361 l_del_count := l_del_bud_line_tbl.COUNT;
5362 l_del_bud_line_tbl(l_del_count).ra_id := l_ra_id_tbl_1(kk);
5363 l_del_bud_line_tbl(l_del_count).txn_curr_code := l_txn_currency_code_tbl_1(kk);
5364 l_del_bud_line_tbl(l_del_count).period_name := l_plan_txn_prd_amt_tbl_1(k).period_name;
5365 END IF;
5366 END IF;
5367 IF l_fp_cols_rec.x_version_type = 'REVENUE' OR l_fp_cols_rec.x_version_type = 'ALL' THEN
5368 IF l_plan_txn_prd_amt_tbl_1(k).txn_revenue IS NOT NULL THEN
5369 IF l_fp_cols_rec.x_version_type = 'REVENUE' THEN
5370 l_upd_bgt_line_tbl(l_upd_count).txn_revenue := l_plan_txn_prd_amt_tbl_1(k).txn_revenue;
5371 l_upd_bgt_line_tbl(l_upd_count).tot_quantity := l_plan_txn_prd_amt_tbl_1(k).txn_revenue;
5372 ELSE
5373 l_upd_bgt_line_tbl(l_upd_count).txn_revenue := l_plan_txn_prd_amt_tbl_1(k).txn_revenue;
5374 END IF;
5375 l_upd_bgt_line_tbl(l_upd_count).REVENUE_BILL_RATE := l_plan_txn_prd_amt_tbl_1(k).txn_revenue / l_upd_bgt_line_tbl(l_upd_count).tot_quantity;
5376 ELSIF l_fp_cols_rec.x_version_type = 'REVENUE' THEN
5377 l_del_bud_line_tbl.extend(1);
5378 l_del_count := l_del_bud_line_tbl.COUNT;
5379 l_del_bud_line_tbl(l_del_count).ra_id := l_ra_id_tbl_1(kk);
5380 l_del_bud_line_tbl(l_del_count).txn_curr_code := l_txn_currency_code_tbl_1(kk);
5381 l_del_bud_line_tbl(l_del_count).period_name := l_plan_txn_prd_amt_tbl_1(k).period_name;
5382 ELSE
5383 l_upd_bgt_line_tbl(l_upd_count).txn_revenue := NULL;
5384 l_upd_bgt_line_tbl(l_upd_count).REVENUE_BILL_RATE := 0;
5385
5386 END IF;
5387 END IF;
5388 END IF; -- rate based check
5389 END IF; -- period line editable.
5390 END LOOP; --l_plan_txn_prd_amt_tbl_1 (j)
5391 END IF; -- l_plan_txn_prd_amt_tbl_1 and l_plan_txn_prd_amt_tbl_1_bak count > 0
5392
5393
5394 -- if the periodic data has not been modified then use the scalar parameters and call calculate.
5395 -- populate the calcuate table
5396 ELSIF NVL(l_period_data_modified,'N') = 'N' THEN
5397 -- This logic is exactly same as the case when time phasing
5398 -- = N condition.. the next else if.. any changes here might have to be done there too..
5399
5400 -- first check, if the values passed to the client extn has changed. If there is any change, then
5401 -- prepare variables to call calculate.
5402 -- first loop through the rate tables to check if any rate has changed by the client extn.
5403 l_rate_change_indicator := 'N';
5404 IF l_input_period_rates_tbl.COUNT > 0 THEN
5405 FOR r IN l_input_period_rates_tbl.FIRST .. l_input_period_rates_tbl.LAST LOOP
5406 IF l_input_period_rates_tbl(r).period_name = l_period_rates_tbl(r).period_name THEN
5407 IF nvl(l_input_period_rates_tbl(r).raw_cost_rate,l_miss_num) <> nvl(l_period_rates_tbl(r).raw_cost_rate,l_miss_num) OR
5408 nvl(l_input_period_rates_tbl(r).burdened_cost_rate,l_miss_num) <> nvl(l_period_rates_tbl(r).burdened_cost_rate,l_miss_num) OR
5409 nvl(l_input_period_rates_tbl(r).revenue_bill_rate,l_miss_num) <> nvl(l_period_rates_tbl(r).revenue_bill_rate,l_miss_num) THEN
5410 l_rate_change_indicator := 'Y';
5411 EXIT;
5412 END IF;
5413 END IF; -- if same period
5414 END LOOP;
5415 END IF;
5416 IF l_txn_src_code_tbl(kk) IS NOT NULL AND
5417 (l_rate_change_indicator = 'Y' OR
5418 nvl(l_etc_qty,l_miss_num) <> nvl(l_fcst_etc_qty,l_miss_num) OR
5419 nvl(l_etc_raw_cost,l_miss_num) <> nvl(l_fcst_etc_raw_cost,l_miss_num) OR
5420 nvl(l_etc_burdened_cost,l_miss_num) <> nvl(l_fcst_etc_burdened_cost,l_miss_num) OR
5421 nvl(l_etc_revenue,l_miss_num) <> nvl(l_fcst_etc_revenue,l_miss_num)) THEN
5422 l_call_calculate_flag := 'Y';
5423 l_calc_cur_txn_flag := 'Y';
5424 l_cal_etc_qty_tab.extend(1);
5425 l_cal_etc_raw_cost_tab.extend(1);
5426 l_cal_etc_burdened_cost_tab.extend(1);
5427 l_cal_etc_revenue_tab.extend(1);
5428 l_cal_raid_tab.extend(1);
5429 l_cal_txn_currency_code_tab.extend(1);
5430
5431 l_cal_txn_currency_code_tab(l_cal_txn_currency_code_tab.count) := l_txn_currency_code_tbl_1(kk);
5432 l_cal_raid_tab(l_cal_raid_tab.count) := l_ra_id_tbl_1(kk);
5433 IF l_fcst_etc_qty IS NOT NULL THEN
5434 l_cal_etc_qty_tab(l_cal_etc_qty_tab.count) := l_fcst_etc_qty;
5435 -- update the pra table to make it a rate based transaction in case resource rate
5436 --based flag is 'Y' and quantity is passed.
5437 IF l_rate_based_flag_tbl(kk) = 'N' and l_res_rate_based_flag_tbl(kk) = 'Y' THEN
5438 IF l_ra_multi_curr = 'N' THEN
5439 l_upd_rbf_tbl_1.extend(1);
5440 l_upd_rbf_tbl_1(l_upd_rbf_tbl_1.count) := l_ra_id_tbl_1(kk);
5441 END IF;
5442 END IF;
5443 ELSE
5444 l_cal_etc_qty_tab(l_cal_etc_qty_tab.count) := l_etc_qty_tbl_1(kk); /* ETC QTY */
5445 END IF;
5446 l_cal_etc_raw_cost_tab(l_cal_etc_raw_cost_tab.count) := l_fcst_etc_raw_cost; --, 0) + l_init_raw_cost_tbl_1(kk);
5447 l_cal_etc_burdened_cost_tab(l_cal_etc_burdened_cost_tab.count) := l_fcst_etc_burdened_cost;-- + l_init_burd_cost_tbl_1(kk);
5448 l_cal_etc_revenue_tab(l_cal_etc_revenue_tab.count) := l_fcst_etc_revenue;-- + l_init_revenue_tbl_1(kk);
5449
5450 END IF; -- something has changed
5451 END IF; -- l_period_data_modified
5452
5453 -- for a non time phased version take the scalar parameters and call calculate.
5454 -- populate the calcuate table
5455 ELSIF l_fp_cols_rec.x_time_phased_code IN ('N') THEN
5456 -- This logic is exactly same as the case when periodic data modified = N
5457 -- ie., the previous else if.. any changes here might have to be done there too..
5458
5459 l_rate_change_indicator := 'N';
5460 IF l_input_period_rates_tbl.COUNT > 0 THEN
5461 FOR r IN l_input_period_rates_tbl.FIRST .. l_input_period_rates_tbl.LAST LOOP
5462 IF nvl(l_input_period_rates_tbl(r).raw_cost_rate,l_miss_num) <> nvl(l_period_rates_tbl(r).raw_cost_rate,l_miss_num) OR
5463 nvl(l_input_period_rates_tbl(r).burdened_cost_rate,l_miss_num) <> nvl(l_period_rates_tbl(r).burdened_cost_rate,l_miss_num) OR
5464 nvl(l_input_period_rates_tbl(r).revenue_bill_rate,l_miss_num) <> nvl(l_period_rates_tbl(r).revenue_bill_rate,l_miss_num) THEN
5465 l_rate_change_indicator := 'Y';
5466 EXIT;
5467 END IF;
5468 END LOOP;
5469 END IF;
5470 IF l_txn_src_code_tbl(kk) IS NOT NULL AND
5471 (l_rate_change_indicator = 'Y' OR
5472 nvl(l_etc_qty,l_miss_num) <> nvl(l_fcst_etc_qty,l_miss_num) OR
5473 nvl(l_etc_raw_cost,l_miss_num) <> nvl(l_fcst_etc_raw_cost,l_miss_num) OR
5474 nvl(l_etc_burdened_cost,l_miss_num) <> nvl(l_fcst_etc_burdened_cost,l_miss_num) OR
5475 nvl(l_etc_revenue,l_miss_num) <> nvl(l_fcst_etc_revenue,l_miss_num)) THEN
5476 l_call_calculate_flag := 'Y';
5477 l_calc_cur_txn_flag := 'Y';
5478 l_cal_etc_qty_tab.extend(1);
5479 l_cal_etc_raw_cost_tab.extend(1);
5480 l_cal_etc_burdened_cost_tab.extend(1);
5481 l_cal_etc_revenue_tab.extend(1);
5482 l_cal_raid_tab.extend(1);
5483 l_cal_txn_currency_code_tab.extend(1);
5484
5485 l_cal_txn_currency_code_tab(l_cal_txn_currency_code_tab.count) := l_txn_currency_code_tbl_1(kk);
5486 l_cal_raid_tab(l_cal_raid_tab.count) := l_ra_id_tbl_1(kk);
5487
5488 IF l_fcst_etc_qty IS NOT NULL THEN
5489 l_cal_etc_qty_tab(l_cal_etc_qty_tab.count) := l_fcst_etc_qty;
5490 -- update the pra table to make it a rate based transaction in case resource rate
5491 --based flag is 'Y' and quantity is passed.
5492 IF l_rate_based_flag_tbl(kk) = 'N' and l_res_rate_based_flag_tbl(kk) = 'Y' THEN
5493 IF l_ra_multi_curr = 'N' THEN
5494 l_upd_rbf_tbl_1.extend(1);
5495 l_upd_rbf_tbl_1(l_upd_rbf_tbl_1.count) := l_ra_id_tbl_1(kk);
5496 END IF;
5497 END IF;
5498 ELSE
5499 l_cal_etc_qty_tab(l_cal_etc_qty_tab.count) := l_etc_qty_tbl_1(kk);
5500 END IF;
5501 l_cal_etc_raw_cost_tab(l_cal_etc_raw_cost_tab.count) := l_fcst_etc_raw_cost; --, 0) + l_init_raw_cost_tbl_1(kk);
5502 l_cal_etc_burdened_cost_tab(l_cal_etc_burdened_cost_tab.count) := l_fcst_etc_burdened_cost;-- + l_init_burd_cost_tbl_1(kk);
5503 l_cal_etc_revenue_tab(l_cal_etc_revenue_tab.count) := l_fcst_etc_revenue;-- + l_init_revenue_tbl_1(kk);
5504
5505 END IF; -- something has changed
5506 END IF;-- l_fp_cols_rec.x_time_phased_code
5507
5508 IF l_calc_cur_txn_flag = 'Y' THEN
5509 FOR j IN l_period_rates_tbl.FIRST..l_period_rates_tbl.LAST LOOP
5510 INSERT INTO PA_FP_GEN_RATE_TMP
5511 ( TXN_CURRENCY_CODE,
5512 PERIOD_NAME,
5513 RAW_COST_RATE,
5514 BURDENED_COST_RATE,
5515 REVENUE_BILL_RATE
5516 )
5517 VALUES
5518 ( l_txn_currency_code_tbl_1(kk),
5519 l_period_rates_tbl(j).period_name,
5520 l_period_rates_tbl(j).raw_cost_rate,
5521 l_period_rates_tbl(j).burdened_cost_rate,
5522 l_period_rates_tbl(j).revenue_bill_rate
5523 );
5524 END LOOP;
5525 END IF; -- l_call_calculate_flag = 'Y'
5526
5527 END LOOP;
5528 END IF; -- ra_id table count > 0
5529
5530
5531 -- update the budget lines with the changes values
5532 IF l_upd_count > 0 THEN
5533
5534 FOR i in l_upd_bgt_line_tbl.first..l_upd_bgt_line_tbl.last
5535 LOOP
5536
5537
5538 UPDATE pa_budget_lines
5539 SET txn_raw_cost = l_upd_bgt_line_tbl(i).txn_raw_cost
5540 ,txn_revenue = l_upd_bgt_line_tbl(i).txn_revenue
5541 ,txn_burdened_cost = l_upd_bgt_line_tbl(i).txn_burdened_cost
5542 ,display_quantity = l_upd_bgt_line_tbl(i).disp_quantity
5543 ,quantity = l_upd_bgt_line_tbl(i).tot_quantity -- updating total quantity
5544 ,txn_cost_rate_override = l_upd_bgt_line_tbl(i). raw_cost_rate -- updating rates
5545 ,burden_cost_rate_override = l_upd_bgt_line_tbl(i).burdened_cost_rate -- updating rates
5546 ,txn_bill_rate_override = l_upd_bgt_line_tbl(i).revenue_bill_rate -- updating rates
5547 ,cost_rejection_code = NULL
5548 ,revenue_rejection_code =NULL
5549 ,burden_rejection_code = NULL
5550 ,other_rejection_code = NULL
5551 WHERE
5552 resource_assignment_id = l_upd_bgt_line_tbl(i).ra_id
5553 AND txn_currency_code = l_upd_bgt_line_tbl(i).txn_curr_code
5554 AND period_name = NVL(l_upd_bgt_line_tbl(i).period_name , period_name);
5555 END LOOP;
5556 END IF;
5557
5558
5559
5560 -- delete the budget lines for the changed amounts.
5561 IF l_del_count > 0 THEN
5562
5563 FOR i in l_del_bud_line_tbl.first..l_del_bud_line_tbl.last
5564 LOOP
5565 DELETE FROM pa_budget_lines
5566 WHERE
5567 resource_assignment_id = l_del_bud_line_tbl(i).ra_id
5568 AND txn_currency_code = l_del_bud_line_tbl(i).txn_curr_code
5569 AND period_name = NVL(l_del_bud_line_tbl(i).period_name , period_name);
5570 END LOOP;
5571 END IF;
5572
5573 --Update the rate_based_flag in pa_resource_assignments.
5574 IF l_upd_rbf_tbl.COUNT > 0 THEN
5575
5576 FOR upd IN l_upd_rbf_tbl.FIRST..l_upd_rbf_tbl.LAST LOOP
5577 UPDATE pa_resource_assignments
5578 SET rate_based_flag = 'Y'
5579 WHERE resource_assignment_id = l_upd_rbf_tbl(upd).ra_id;
5580 END LOOP;
5581 END IF;
5582
5583 -- call calculate in case required
5584
5585
5586
5587
5588
5589
5590
5591 IF NVL(l_call_calculate_flag,'N') = 'Y' THEN
5592
5593
5594 IF l_upd_rbf_tbl_1.count > 0 THEN
5595
5596 FORALL upd IN 1..l_upd_rbf_tbl_1.COUNT
5597 UPDATE pa_resource_assignments
5598 SET rate_based_flag = 'Y'
5599 WHERE resource_assignment_id = l_upd_rbf_tbl_1(upd);
5600 END IF;
5601
5602 --For Bug 6722414
5603 pa_fp_calc_plan_pkg.g_from_etc_client_extn_flag := 'Y';
5604
5605 PA_FP_CALC_PLAN_PKG.calculate(
5606 p_calling_module => 'FORECAST_GENERATION'
5607 ,p_project_id => p_project_id
5608 ,p_budget_version_id => p_budget_version_id
5609 ,P_REFRESH_RATES_FLAG => 'N'
5610 ,P_REFRESH_CONV_RATES_FLAG => 'N'
5611 ,P_SPREAD_REQUIRED_FLAG => 'Y'
5612 ,P_CONV_RATES_REQUIRED_FLAG => 'N'
5613 ,p_rollup_required_flag => 'N'
5614 ,p_source_context => 'RESOURCE_ASSIGNMENT'
5615 ,p_resource_assignment_tab => l_cal_raid_tab
5616 ,p_txn_currency_code_tab => l_cal_txn_currency_code_tab
5617 ,p_total_qty_tab => l_cal_etc_qty_tab
5618 ,p_total_raw_cost_tab => l_cal_etc_raw_cost_tab
5619 ,p_total_burdened_cost_tab => l_cal_etc_burdened_cost_tab
5620 ,p_total_revenue_tab => l_cal_etc_revenue_tab
5621 ,p_raTxn_rollup_api_call_flag => 'N'
5622 ,x_return_status => x_return_status
5623 ,x_msg_count => l_msg_count
5624 ,x_msg_data => l_msg_data);
5625
5626 --For Bug 6722414
5627 pa_fp_calc_plan_pkg.g_from_etc_client_extn_flag := 'N';
5628
5629 IF P_PA_DEBUG_MODE = 'Y' THEN
5630 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
5631 P_MSG =>
5632 'After calling PA_FP_CALC_PLAN_PKG.calculate '
5633 ||x_return_status,
5634 P_MODULE_NAME => l_module_name);
5635 END IF;
5636 IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
5637 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
5638 END IF;
5639 END IF;
5640
5641 /* -- ER 5726773: Commenting out call to CheckZeroQTyNegETC.
5642 -- The api has been removed and should no longer be called.
5643
5644 IF NVL(l_call_calculate_flag,'N') = 'N' THEN
5645
5646 DELETE FROM pa_fp_spread_calc_tmp;
5647
5648 FORALL kk IN 1..l_ra_id_tbl_1.COUNT
5649 INSERT INTO pa_fp_spread_calc_tmp
5650 (budget_version_id,
5651 resource_assignment_id)
5652 VALUES
5653 (p_budget_version_id,
5654 l_ra_id_tbl_1(kk));
5655
5656 PA_FP_CALC_PLAN_PKG.CheckZeroQTyNegETC
5657 (p_budget_version_id => p_budget_version_id
5658 ,p_initialize => 'Y'
5659 ,x_return_status => x_return_status
5660 ,x_msg_count => x_msg_count
5661 ,x_msg_data => x_msg_data);
5662 END IF;
5663
5664 -- End Comment 5726773
5665 */
5666 IF l_call_calculate_flag = 'N' and l_upd_count = 0 and l_del_count = 0 THEN
5667 x_call_maintain_data_api := 'N';
5668 END IF;
5669 IF P_PA_DEBUG_MODE = 'Y' THEN
5670 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
5671 P_MSG =>
5672 'After calling PA_FP_CALC_PLAN_PKG.CheckZeroQTyNegETC '
5673 ||x_return_status,
5674 P_MODULE_NAME => l_module_name);
5675 END IF;
5676 IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
5677 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
5678 END IF;
5679
5680 EXCEPTION
5681 WHEN PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc THEN
5682 l_msg_count := FND_MSG_PUB.count_msg;
5683 IF l_msg_count = 1 THEN
5684 PA_INTERFACE_UTILS_PUB.GET_MESSAGES
5685 ( p_encoded => FND_API.G_TRUE,
5686 p_msg_index => 1,
5687 p_msg_count => l_msg_count,
5688 p_msg_data => l_msg_data,
5689 p_data => l_data,
5690 p_msg_index_out => l_msg_index_out);
5691 x_msg_data := l_data;
5692 x_msg_count := l_msg_count;
5693 ELSE
5694 x_msg_count := l_msg_count;
5695 END IF;
5696
5697 ROLLBACK;
5698 x_return_status := FND_API.G_RET_STS_ERROR;
5699 WHEN OTHERS THEN
5700 ROLLBACK;
5701 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5702 x_msg_count := 1;
5703 x_msg_data := substr(sqlerrm,1,240);
5704 FND_MSG_PUB.ADD_EXC_MSG
5705 ( p_pkg_name => 'PA_FP_GEN_FCST_AMT_PUB1',
5706 p_procedure_name => 'call_clnt_extn_and_update_bl',
5707 p_error_text => substr(sqlerrm,1,240));
5708
5709 IF p_pa_debug_mode = 'Y' THEN
5710 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG
5711 (p_msg => 'Unexpected Error'||substr(sqlerrm, 1, 240),
5712 p_module_name => l_module_name,
5713 p_log_level => 5);
5714 PA_DEBUG.RESET_CURR_FUNCTION;
5715 END IF;
5716 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5717
5718 END call_clnt_extn_and_update_bl;
5719
5720
5721 END PA_FP_GEN_FCST_AMT_PUB1;