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