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