DBA Data[Home] [Help]

PACKAGE BODY: APPS.PA_FP_GEN_FCST_AMT_PUB1

Source


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