DBA Data[Home] [Help]

PACKAGE BODY: APPS.PA_FP_GEN_FCST_AMT_PUB

Source


1 PACKAGE body PA_FP_GEN_FCST_AMT_PUB as
2 /* $Header: PAFPFGPB.pls 120.25.12020000.3 2013/06/07 10:43:38 bpottipa ship $ */
3 
4 
5 P_PA_DEBUG_MODE varchar2(1) := NVL(FND_PROFILE.value('PA_DEBUG_MODE'), 'N');
6 
7 -----------------------------------------------------------------------
8 --------- Forward declarations for local/private procedures -----------
9 -----------------------------------------------------------------------
10 
11 PROCEDURE UPD_REV_CALCULATION_ERR
12           (P_PROJECT_ID              IN          PA_PROJECTS_ALL.PROJECT_ID%TYPE,
13            P_BUDGET_VERSION_ID       IN          PA_BUDGET_VERSIONS.BUDGET_VERSION_ID%TYPE,
14            P_FP_COLS_REC             IN          PA_FP_GEN_AMOUNT_UTILS.FP_COLS,
15            P_ETC_START_DATE          IN          DATE,
16            P_CALLED_MODE             IN          VARCHAR2 DEFAULT 'SELF_SERVICE',
17            X_RETURN_STATUS           OUT  NOCOPY VARCHAR2,
18            X_MSG_COUNT               OUT  NOCOPY NUMBER,
19            X_MSG_DATA                OUT  NOCOPY VARCHAR2 );
20 
21 ------------------------------------------------------------------------------
22 --------- END OF Forward declarations for local/private procedures -----------
23 ------------------------------------------------------------------------------
24 
25 /**GENERATE_FCST_AMT_WRP is called from PA_FP_GEN_FCST_PG_PKG.UPD_VER_DTLS_AND_GEN_AMT,
26   *which was called directly from forecast generation page.
27  **/
28 PROCEDURE GENERATE_FCST_AMT_WRP
29        (   P_PROJECT_ID              IN          PA_PROJECTS_ALL.PROJECT_ID%TYPE,
30            P_BUDGET_VERSION_ID       IN          PA_BUDGET_VERSIONS.BUDGET_VERSION_ID%TYPE,
31            P_FP_COLS_REC             IN          PA_FP_GEN_AMOUNT_UTILS.FP_COLS,
32            P_CALLED_MODE             IN          VARCHAR2,
33            P_COMMIT_FLAG             IN          VARCHAR2,
34            P_INIT_MSG_FLAG           IN          VARCHAR2,
35            P_VERSION_TYPE            IN          PA_BUDGET_VERSIONS.VERSION_TYPE%TYPE,
36            P_UNSPENT_AMT_FLAG        IN          PA_PROJ_FP_OPTIONS.GEN_COST_INCL_UNSPENT_AMT_FLAG%TYPE,
37            P_UNSPENT_AMT_PERIOD      IN          VARCHAR2,
38            P_INCL_CHG_DOC_FLAG       IN          PA_PROJ_FP_OPTIONS.GEN_COST_INCL_CHANGE_DOC_FLAG%TYPE,
39            P_INCL_OPEN_CMT_FLAG      IN          PA_PROJ_FP_OPTIONS.GEN_COST_INCL_OPEN_COMM_FLAG%TYPE,
40            P_INCL_BILL_EVT_FLAG      IN          PA_PROJ_FP_OPTIONS.GEN_REV_INCL_BILL_EVENT_FLAG%TYPE,
41            P_RET_MANUAL_LNS_FLAG     IN          PA_PROJ_FP_OPTIONS.GEN_COST_RET_MANUAL_LINE_FLAG%TYPE,
42            P_PLAN_TYPE_ID            IN          PA_PROJ_FP_OPTIONS.FIN_PLAN_TYPE_ID%TYPE,
43            P_PLAN_VERSION_ID         IN          PA_PROJ_FP_OPTIONS.FIN_PLAN_VERSION_ID%TYPE,
44            P_PLAN_VERSION_NAME       IN          PA_BUDGET_VERSIONS.VERSION_NAME%TYPE,
45            P_ETC_PLAN_TYPE_ID        IN          PA_PROJ_FP_OPTIONS.FIN_PLAN_TYPE_ID%TYPE,
46            P_ETC_PLAN_VERSION_ID     IN          PA_PROJ_FP_OPTIONS.FIN_PLAN_VERSION_ID%TYPE,
47            P_ETC_PLAN_VERSION_NAME   IN          PA_BUDGET_VERSIONS.VERSION_NAME%TYPE,
48            P_ACTUALS_FROM_PERIOD     IN          VARCHAR2,
49            P_ACTUALS_TO_PERIOD       IN          VARCHAR2,
50            P_ETC_FROM_PERIOD         IN          VARCHAR2,
51            P_ETC_TO_PERIOD           IN          VARCHAR2,
52            P_ACTUALS_THRU_PERIOD     IN          PA_BUDGET_VERSIONS.ACTUAL_AMTS_THRU_PERIOD%TYPE,
53            P_ACTUALS_THRU_DATE       IN          PA_PERIODS_ALL.END_DATE%TYPE,
54            P_WP_STRUCTURE_VERSION_ID IN          PA_PROJ_ELEM_VER_STRUCTURE.ELEMENT_VERSION_ID%TYPE,
55            X_RETURN_STATUS           OUT  NOCOPY VARCHAR2,
56            X_MSG_COUNT               OUT  NOCOPY NUMBER,
57            X_MSG_DATA                OUT  NOCOPY VARCHAR2) IS
58 
59 l_module_name                VARCHAR2(200) := 'pa.plsql.pa_fp_gen_fcst_amt_pub.generate_fcst_amt_wrp';
60 l_cost_version_id            PA_BUDGET_VERSIONS.BUDGET_VERSION_ID%TYPE;
61 l_ci_id_tab                  PA_PLSQL_DATATYPES.IdTabTyp;
62 l_gen_res_asg_id_tab         PA_PLSQL_DATATYPES.IdTabTyp;
63 l_deleted_res_asg_id_tab     PA_PLSQL_DATATYPES.IdTabTyp;
64 
65 l_rev_gen_method             VARCHAR2(3);
66 l_error_msg                  VARCHAR2(30);
67 l_msg_count                  NUMBER;
68 l_msg_data                   VARCHAR2(2000);
69 l_data                       VARCHAR2(2000);
70 l_msg_index_out              NUMBER:=0;
71 
72 l_count                      NUMBER;
73 l_dummy                      NUMBER;
74 l_task_count                 NUMBER;
75 
76 l_src_plan_class_code        pa_fin_plan_types_b.plan_class_code%type;
77 l_src_version_type           pa_budget_versions.version_type%type;
78 lx_deleted_res_asg_id_tab  PA_PLSQL_DATATYPES.IdTabTyp;
79 lx_gen_res_asg_id_tab      PA_PLSQL_DATATYPES.IdTabTyp;
80 
81 -- BEGIN Bug 10298995 : Added for Viasat enhancement
82 cursor res_asgn_csr IS
83 select resource_assignment_id, txn_currency_code
84 from pa_resource_asgn_curr
85 where budget_version_id = P_BUDGET_VERSION_ID;
86 
87 l_res_asgn_id_tab   SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
88 l_txn_curr_code_tab SYSTEM.pa_varchar2_15_tbl_type:=SYSTEM.pa_varchar2_15_tbl_type();
89 -- END Bug 10298995 : Added for Viasat enhancement
90 -- Bug 4592564: Removed variables for Unspent Amounts option.
91 
92 -- Added as part of fix for Bug 4232094
93 l_budget_generation_flow_flag  VARCHAR2(1) := 'N';
94 
95 l_call_maintain_data_api       VARCHAR2(1);
96 
97 --Bug 8557807
98 l_ci_id_tbl                    SYSTEM.pa_num_tbl_type:=SYSTEM.PA_NUM_TBL_TYPE();
99 l_translated_msgs_tbl          SYSTEM.pa_varchar2_2000_tbl_type;
100 l_translated_err_msg_count     NUMBER;
101 l_translated_err_msg_level_tbl SYSTEM.pa_varchar2_30_tbl_type;
102 l_budget_version_id_tbl        SYSTEM.pa_num_tbl_type:=SYSTEM.PA_NUM_TBL_TYPE();
103 l_impl_cost_flag_tbl           SYSTEM.pa_varchar2_1_tbl_type:=SYSTEM.pa_varchar2_1_tbl_type();
104 l_impl_rev_flag_tbl            SYSTEM.pa_varchar2_1_tbl_type:=SYSTEM.pa_varchar2_1_tbl_type();
105 
106 BEGIN
107     /* hr_utility.trace_on(null,'mftest');
108     hr_utility.trace('---BEGIN---'); */
109     IF P_INIT_MSG_FLAG = 'Y' THEN
110         FND_MSG_PUB.initialize;
111     END IF;
112     X_MSG_COUNT := 0;
113     X_RETURN_STATUS := FND_API.G_RET_STS_SUCCESS;
114 
115     IF p_pa_debug_mode = 'Y' THEN
116         pa_debug.set_curr_function( p_function     => 'GENERATE_FCST_AMT_WRP',
117                                     p_debug_mode   =>  p_pa_debug_mode);
118     END IF;
119 
120     IF P_PA_DEBUG_MODE = 'Y' THEN
121                pa_fp_gen_amount_utils.fp_debug
122                (p_called_mode => P_CALLED_MODE,
123                 p_msg         =>
124                  'Before calling PA_FP_GEN_BUDGET_AMT_PUB.UPDATE_BV_FOR_GEN_DATE',
125                 p_module_name => l_module_name);
126     END IF;
127     PA_FP_GEN_BUDGET_AMT_PUB.UPDATE_BV_FOR_GEN_DATE
128                (P_PROJECT_ID                 => P_PROJECT_ID,
129                 P_BUDGET_VERSION_ID          => P_BUDGET_VERSION_ID,
130                 P_ETC_START_DATE             => P_ACTUALS_THRU_DATE + 1,
131                 X_RETURN_STATUS              => X_RETURN_STATUS,
132                 X_MSG_COUNT                  => X_MSG_COUNT,
133                 X_MSG_DATA                   => X_MSG_DATA);
134     IF P_PA_DEBUG_MODE = 'Y' THEN
135                pa_fp_gen_amount_utils.fp_debug
136                (p_called_mode => P_CALLED_MODE,
137                 p_msg         => 'After calling PA_FP_GEN_BUDGET_AMT_PUB.UPDATE_BV_FOR_GEN_DATE,
138                             ret status: '||x_return_status,
139                 p_module_name => l_module_name);
140     END IF;
141 
142     DELETE FROM PA_FP_CALC_AMT_TMP1;
143     DELETE FROM PA_FP_CALC_AMT_TMP2;
144     IF p_fp_cols_rec.x_gen_incl_open_comm_flag = 'Y' THEN
145         IF p_pa_debug_mode = 'Y' THEN
146             PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
147                 P_CALLED_MODE           => P_CALLED_MODE,
148                 P_MSG                   => 'Before calling pa_fp_commitment_amounts.'||
149                                            'get_commitment_amts',
150                 P_MODULE_NAME           => l_module_name);
151         END IF;
152         PA_FP_COMMITMENT_AMOUNTS.GET_COMMITMENT_AMTS
153                   (P_PROJECT_ID                 => P_PROJECT_ID,
154                    P_BUDGET_VERSION_ID          => P_BUDGET_VERSION_ID,
155                    P_FP_COLS_REC                => p_fp_cols_rec,
156                    PX_GEN_RES_ASG_ID_TAB        => l_gen_res_asg_id_tab,
157                    PX_DELETED_RES_ASG_ID_TAB    => l_deleted_res_asg_id_tab,
158                    X_RETURN_STATUS              => X_RETURN_STATUS,
159                    X_MSG_COUNT                  => X_MSG_COUNT,
160                    X_MSG_DATA                   => X_MSG_DATA);
161         --dbms_output.put_line('??x_msg_count:'||x_msg_count);
162         x_msg_count := 0;
163         IF p_pa_debug_mode = 'Y' THEN
164              PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
165                 P_CALLED_MODE           => P_CALLED_MODE,
166                 P_MSG                   => 'After calling pa_fp_commitment_amounts.'||
167                                            'get_commitment_amts: '||x_return_status,
168                 P_MODULE_NAME           => l_module_name);
169         END IF;
170         IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
171             RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
172         END IF;
173     END IF;
174 
175     IF p_etc_plan_type_id IS NOT NULL AND
176        p_etc_plan_version_id IS NOT NULL THEN
177 
178         SELECT plan_class_code
179         INTO l_src_plan_class_code
180         FROM pa_fin_plan_types_b
181         WHERE fin_plan_type_id = P_ETC_PLAN_TYPE_ID;
182 
183         SELECT version_type
184         INTO l_src_version_type
185         FROM pa_budget_versions
186         WHERE budget_version_id = P_ETC_PLAN_VERSION_ID;
187 
188     END IF;
189 
190     -- Bug 4130319: Moved initialization of l_rev_gen_method from below.
191     -- Before, it was being set after the call to COPY_ACTUALS for the
192     -- Event-based Revenue and Resource Schedule cases.
193        l_rev_gen_method := nvl(P_FP_COLS_REC.X_REVENUE_DERIVATION_METHOD,PA_FP_GEN_FCST_PG_PKG.GET_REV_GEN_METHOD(p_project_id)); --Bug 5462471
194     --l_rev_gen_method := PA_FP_GEN_FCST_PG_PKG.GET_REV_GEN_METHOD(p_project_id);
195 
196     -- Bug 4114589: We call the Copy Actuals API for these two cases here,
197     -- and postpone calling it until after CREATE_RES_ASG and UPDATE_RES_ASG
198     -- have been called in the remaining two cases (see conditional logic below).
199     IF (P_FP_COLS_REC.X_VERSION_TYPE = 'REVENUE' AND  l_rev_gen_method = 'E') OR
200        (P_FP_COLS_REC.X_GEN_ETC_SRC_CODE = 'RESOURCE_SCHEDULE') THEN
201         IF p_pa_debug_mode = 'Y' THEN
202             PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
203                 P_CALLED_MODE       => P_CALLED_MODE,
204                 P_MSG               => 'Before calling pa_fp_copy_actuals_pub.copy_actuals',
205                 P_MODULE_NAME       => l_module_name);
206         END IF;
207         PA_FP_COPY_ACTUALS_PUB.COPY_ACTUALS
208               (P_PROJECT_ID               => P_PROJECT_ID,
209                P_BUDGET_VERSION_ID        => P_BUDGET_VERSION_ID,
210                P_FP_COLS_REC              => P_fp_cols_rec,
211                P_END_DATE                 => P_ACTUALS_THRU_DATE,
212                P_INIT_MSG_FLAG            => 'N',
213                P_COMMIT_FLAG              => 'N',
214                X_RETURN_STATUS            => X_RETURN_STATUS,
215                X_MSG_COUNT                => X_MSG_COUNT,
216                X_MSG_DATA                 => X_MSG_DATA);
217         IF p_pa_debug_mode = 'Y' THEN
218             PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
219                 P_CALLED_MODE       => P_CALLED_MODE,
220                 P_MSG               => 'After calling pa_fp_copy_actuals_pub.copy_actuals:'
221                                        ||x_return_status,
222                 P_MODULE_NAME       => l_module_name);
223         END IF;
224         IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
225             RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
226         END IF;
227     END IF;
228 
229   --dbms_output.put_line('++P_FP_COLS_REC.X_GEN_ETC_SRC_CODE is :' ||P_FP_COLS_REC.X_GEN_ETC_SRC_CODE);
230     IF P_FP_COLS_REC.X_VERSION_TYPE = 'REVENUE' AND  l_rev_gen_method = 'E' THEN
231         /*Skip both resource_schedule and task_level_sel*/
232         l_dummy := 1;
233     ELSIF P_FP_COLS_REC.X_GEN_ETC_SRC_CODE = 'RESOURCE_SCHEDULE' THEN
234         -- Bug 4222555: When the Target is a Revenue version and the accrual
235         -- method is Cost, we need to call the GEN_REV_BDGT_AMT_RES_SCH_WRP API.
236         IF p_fp_cols_rec.x_version_type = 'REVENUE' AND l_rev_gen_method = 'C' THEN
237             IF p_pa_debug_mode = 'Y' THEN
238                 pa_fp_gen_amount_utils.fp_debug
239                     ( p_called_mode => p_called_mode,
240                       p_msg         => 'Before calling
241                       pa_fp_gen_budget_amt_pub.gen_rev_bdgt_amt_res_sch_wrp',
242                       p_module_name => l_module_name,
243                       p_log_level   => 5 );
244             END IF;
245              --hr_utility.trace('before PA_FP_GEN_BUDGET_AMT_PUB.GEN_REV_BDGT_AMT_RES_SCH_WRP');
246             PA_FP_GEN_BUDGET_AMT_PUB.GEN_REV_BDGT_AMT_RES_SCH_WRP
247                 ( P_PROJECT_ID               => P_PROJECT_ID,
248                   P_BUDGET_VERSION_ID        => P_BUDGET_VERSION_ID,
249                   P_FP_COLS_REC              => P_fp_cols_rec,
250                   P_PLAN_CLASS_CODE          => P_fp_cols_rec.x_plan_class_code,
251                   P_GEN_SRC_CODE             => P_fp_cols_rec.x_gen_etc_src_code,
252                   P_COST_PLAN_TYPE_ID        => P_fp_cols_rec.x_gen_src_plan_type_id,
253                   p_COST_VERSION_ID          => l_cost_version_id,
254                   P_RETAIN_MANUAL_FLAG       => P_fp_cols_rec.x_gen_ret_manual_line_flag,
255                   P_CALLED_MODE              => P_CALLED_MODE,
256                   P_INC_CHG_DOC_FLAG         => P_fp_cols_rec.x_gen_incl_change_doc_flag,
257                   P_INC_BILL_EVENT_FLAG      => P_fp_cols_rec.x_gen_incl_bill_event_flag,
258                   P_INC_OPEN_COMMIT_FLAG     => P_fp_cols_rec.x_gen_incl_open_comm_flag,
259                   P_ACTUALS_THRU_DATE        => P_ACTUALS_THRU_DATE,
260                   P_CI_ID_TAB                => l_ci_id_tab,
261                   PX_GEN_RES_ASG_ID_TAB      => l_gen_res_asg_id_tab,
262                   PX_DELETED_RES_ASG_ID_TAB  => l_deleted_res_asg_id_tab,
263                   P_COMMIT_FLAG              => 'N',
264                   P_INIT_MSG_FLAG            => 'N',
265                   X_RETURN_STATUS            => X_RETURN_STATUS,
266                   X_MSG_COUNT                => X_MSG_COUNT,
267                   X_MSG_DATA                 => X_MSG_DATA );
268             IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
269                 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
270             END IF;
271             IF p_pa_debug_mode = 'Y' THEN
272                 pa_fp_gen_amount_utils.fp_debug
273                     ( p_called_mode => p_called_mode,
274                       p_msg         => 'Status after calling pa_fp_gen_budget_amt_pub.'||
275                                        'gen_rev_bdgt_amt_res_sch_wrp:'||x_return_status,
276                       p_module_name => l_module_name,
277                       p_log_level   => 5 );
278             END IF;
279         ELSE
280             IF p_pa_debug_mode = 'Y' THEN
281                 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
282                     P_CALLED_MODE       => P_CALLED_MODE,
283                     P_MSG               => 'Before calling pa_fp_gen_budget_amt_pub.'||
284                                            'generate_budget_amt_res_sch',
285                     P_MODULE_NAME       => l_module_name);
286             END IF;
287             PA_FP_GEN_BUDGET_AMT_PUB.GENERATE_BUDGET_AMT_RES_SCH
288                   (P_PROJECT_ID               => P_PROJECT_ID,
289                    P_BUDGET_VERSION_ID        => P_BUDGET_VERSION_ID,
290                    P_FP_COLS_REC              => P_fp_cols_rec,
291                    P_PLAN_CLASS_CODE          => P_fp_cols_rec.x_plan_class_code,
292                    P_GEN_SRC_CODE             => P_fp_cols_rec.x_gen_etc_src_code,
293                    P_COST_PLAN_TYPE_ID        => P_fp_cols_rec.x_gen_src_plan_type_id,
294                    p_COST_VERSION_ID          => l_cost_version_id,
295                    P_RETAIN_MANUAL_FLAG       => P_fp_cols_rec.x_gen_ret_manual_line_flag,
296                    P_CALLED_MODE              => P_CALLED_MODE,
297                    P_INC_CHG_DOC_FLAG         => P_fp_cols_rec.x_gen_incl_change_doc_flag,
298                    P_INC_BILL_EVENT_FLAG      => P_fp_cols_rec.x_gen_incl_bill_event_flag,
299                    P_INC_OPEN_COMMIT_FLAG     => P_fp_cols_rec.x_gen_incl_open_comm_flag,
300                    P_ACTUALS_THRU_DATE        => P_ACTUALS_THRU_DATE,
301                    P_CI_ID_TAB                => l_ci_id_tab,
302                    PX_GEN_RES_ASG_ID_TAB      => l_gen_res_asg_id_tab,
303                    PX_DELETED_RES_ASG_ID_TAB  => l_deleted_res_asg_id_tab,
304                    P_COMMIT_FLAG              => 'N',
305                    P_INIT_MSG_FLAG            => 'N',
306                    X_RETURN_STATUS            => X_RETURN_STATUS,
307                    X_MSG_COUNT                => X_MSG_COUNT,
308                    X_MSG_DATA                 => X_MSG_DATA);
309             IF p_pa_debug_mode = 'Y' THEN
310                 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
311                     P_CALLED_MODE       => P_CALLED_MODE,
312                     P_MSG               => 'After calling pa_fp_gen_budget_amt_pub.'||
313                                            'generate_budget_amt_res_sch: '||x_return_status,
314                     P_MODULE_NAME       => l_module_name);
315             END IF;
316             IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
317                 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
318             END IF;
319         END IF; -- cost-based revenue check
320     ELSIF P_FP_COLS_REC.X_VERSION_TYPE = 'REVENUE' AND
321           p_etc_plan_type_id IS NOT NULL AND
322           l_src_plan_class_code = 'FORECAST' AND
323          (l_src_version_type = 'COST' OR l_src_version_type = 'ALL')  THEN
324 
325         -- Added as part of fix for Bug 4232094
326         l_budget_generation_flow_flag := 'Y';
327 
328         /* For revenue fcst generation, source can only be cost and all.
329            From revenue version is provented from UI.
330            Revenue fcst generation should follow the budget generation logic.*/
331         IF p_pa_debug_mode = 'Y' THEN
332             PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
333                 P_CALLED_MODE    => P_CALLED_MODE,
334                 P_MSG            =>
335                 'Before calling PA_FP_WP_GEN_BUDGET_AMT_PUB.'||
336                                     'GENERATE_WP_BUDGET_AMT',
337                 P_MODULE_NAME    => l_module_name);
338         END IF;
339         PA_FP_WP_GEN_BUDGET_AMT_PUB.GENERATE_WP_BUDGET_AMT
340            (P_PROJECT_ID               => P_PROJECT_ID,
341             P_BUDGET_VERSION_ID        => P_BUDGET_VERSION_ID,
342             P_PLAN_CLASS_CODE          => 'FORECAST',
343             P_GEN_SRC_CODE             => 'FINANCIAL_PLAN',
344             P_COST_PLAN_TYPE_ID        => NULL,
345             P_COST_VERSION_ID          => NULL,
346             P_RETAIN_MANUAL_FLAG       => P_RET_MANUAL_LNS_FLAG,
347             P_CALLED_MODE              => P_CALLED_MODE,
348             P_INC_CHG_DOC_FLAG         => P_INCL_CHG_DOC_FLAG,
349             P_INC_BILL_EVENT_FLAG      => P_INCL_BILL_EVT_FLAG,
350             P_INC_OPEN_COMMIT_FLAG     => P_INCL_OPEN_CMT_FLAG,
351             --P_CI_ID_TAB
352             P_INIT_MSG_FLAG            => 'N',
353             P_COMMIT_FLAG              => 'N',
354             P_CALLING_CONTEXT          => 'FORECAST_GENERATION',
355             P_ETC_PLAN_TYPE_ID         =>  P_ETC_PLAN_TYPE_ID,
356             P_ETC_PLAN_VERSION_ID      =>  P_ETC_PLAN_VERSION_ID,
357             --P_ETC_PLAN_VERSION_NAME
358             P_ACTUALS_THRU_DATE        => P_ACTUALS_THRU_DATE,
359             PX_DELETED_RES_ASG_ID_TAB  => lx_deleted_res_asg_id_tab,
360             PX_GEN_RES_ASG_ID_TAB      => lx_gen_res_asg_id_tab,
361             X_RETURN_STATUS            => X_RETURN_STATUS,
362             X_MSG_COUNT                => X_MSG_COUNT,
363             X_MSG_DATA                 => X_MSG_DATA );
364         IF p_pa_debug_mode = 'Y' THEN
365             PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
366                 P_CALLED_MODE    => P_CALLED_MODE,
367                 P_MSG            =>
368                 'After calling PA_FP_WP_GEN_BUDGET_AMT_PUB.'||
369                 'GENERATE_WP_BUDGET_AMT: '||x_return_status,
370                 P_MODULE_NAME    => l_module_name);
371         END IF;
372         IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
373             RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
374         END IF;
375     ELSE
376         IF p_pa_debug_mode = 'Y' THEN
377             PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
378                 P_CALLED_MODE       => P_CALLED_MODE,
379                 P_MSG               => 'Before calling pa_fp_gen_fcst_amt_pub.'||
380                                             'gen_fcst_task_level_amt',
381                 P_MODULE_NAME       => l_module_name);
382         END IF;
383         PA_FP_GEN_FCST_AMT_PUB.GEN_FCST_TASK_LEVEL_AMT
384             (P_PROJECT_ID              => P_PROJECT_ID,
385             P_BUDGET_VERSION_ID        => P_BUDGET_VERSION_ID,
386             P_FP_COLS_REC              => P_FP_COLS_REC,
387             P_WP_STRUCTURE_VERSION_ID  => P_WP_STRUCTURE_VERSION_ID,
388             P_ETC_FP_PLAN_VERSION_ID   => P_ETC_PLAN_VERSION_ID,
389             P_ACTUALS_THRU_DATE        => P_ACTUALS_THRU_DATE,
390             P_ACTUALS_FROM_PERIOD      => P_ACTUALS_FROM_PERIOD,
391             P_ACTUALS_TO_PERIOD        => P_ACTUALS_TO_PERIOD,
392             P_ETC_FROM_PERIOD          => P_ETC_FROM_PERIOD,
393             P_ETC_TO_PERIOD            => P_ETC_TO_PERIOD,
394             X_RETURN_STATUS            => X_RETURN_STATUS,
395             X_MSG_COUNT                => X_MSG_COUNT,
396             X_MSG_DATA                 => X_MSG_DATA);
397 
398         IF p_pa_debug_mode = 'Y' THEN
399             PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
400                 P_CALLED_MODE       => P_CALLED_MODE,
401                 P_MSG               => 'After calling pa_fp_gen_fcst_amt_pub.'||
402                                        'gen_fcst_task_level_amt: '||x_return_status,
403                 P_MODULE_NAME       => l_module_name);
404         END IF;
405         IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
406             RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
407         END IF;
408     END IF;
409 
410     --hr_utility.trace('p_fp_cols_rec.x_gen_incl_open_comm_flag:'||p_fp_cols_rec.x_gen_incl_open_comm_flag);
411     /* IF p_pa_debug_mode = 'Y' THEN
412          pa_fp_gen_amount_utils.fp_debug
413         (p_msg         => 'Value of gen_incl_open_comm_flag: '||p_fp_cols_rec.x_gen_incl_open_comm_flag,
414          p_module_name => l_module_name,
415          p_log_level   => 5);
416     END IF;*/
417 
418     /*IF p_pa_debug_mode = 'Y' THEN
419          pa_fp_gen_amount_utils.fp_debug
420         (p_msg         => 'Value of gen_incl_change_doc_flag: '||p_fp_cols_rec.x_gen_incl_change_doc_flag,
421          p_module_name => l_module_name,
422          p_log_level   => 5);
423     END IF;*/
424 
425     IF p_fp_cols_rec.x_gen_incl_open_comm_flag = 'Y' THEN
426         IF p_pa_debug_mode = 'Y' THEN
427             PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
428                 P_CALLED_MODE      => P_CALLED_MODE,
429                 P_MSG              => 'Before calling PA_FP_GEN_COMMITMENT_AMOUNTS.'||
430                                       'GEN_COMMITMENT_AMOUNTS',
431                 P_MODULE_NAME      => l_module_name);
432         END IF;
433         PA_FP_GEN_COMMITMENT_AMOUNTS.GEN_COMMITMENT_AMOUNTS
434             (P_PROJECT_ID                 => P_PROJECT_ID,
435              P_BUDGET_VERSION_ID          => P_BUDGET_VERSION_ID,
436              P_FP_COLS_REC                => p_fp_cols_rec,
437              PX_GEN_RES_ASG_ID_TAB        => l_gen_res_asg_id_tab,
438              PX_DELETED_RES_ASG_ID_TAB    => l_deleted_res_asg_id_tab,
439              X_RETURN_STATUS              => X_RETURN_STATUS,
440              X_MSG_COUNT                  => X_MSG_COUNT,
441              X_MSG_DATA                   => X_MSG_DATA);
442         IF p_pa_debug_mode = 'Y' THEN
443             PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
444                 P_CALLED_MODE            => P_CALLED_MODE,
445                 P_MSG                    => 'After calling PA_FP_GEN_COMMITMENT_AMOUNTS.'||
446                                             'GEN_COMMITMENT_AMOUNTS: '||x_return_status,
447                 P_MODULE_NAME            => l_module_name);
448         END IF;
449         IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
450             RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
451         END IF;
452     END IF;--p_fp_cols_rec.x_gen_incl_open_comm_flag = 'Y'
453 
454     --dbms_output.put_line('++Before reven++');
455     --dbms_output.put_line('??x_msg_count:'||x_msg_count);
456        /* IF p_pa_debug_mode = 'Y' THEN
457              pa_fp_gen_amount_utils.fp_debug
458             (p_msg         => 'Value of version_type: '||p_fp_cols_rec.x_version_type,
459              p_module_name => l_module_name,
460              p_log_level   => 5);
461         END IF;*/
462 --------------FOR REVENUE: FROM PAFPGAMB.pls------
463     IF  (p_fp_cols_rec.x_version_type = 'ALL'
464          OR p_fp_cols_rec.x_version_type = 'REVENUE')
465          AND l_rev_gen_method = 'C'   THEN
466 
467         -- Bug 4232094: When the Target version is Revenue with accrual method
468         -- of Cost, time phasing is None, and the code did not go through the
469         -- budget generation flow (PAFPWPGB), then we need to call the currency
470         -- conversion API.
471 
472         -- Bug 4549862: When generating a Cost and Revenue together version
473         -- from Staffing Plan with revenue accrual method of COST, the
474         -- currency conversion step is performed on the PA_FP_ROLLUP_TMP
475         -- table (instead of pa_budget_lines) earlier in the code flow by the
476         -- GENERATE_BUDGET_AMT_RES_SCH API so that pc/pfc Commitment amounts
477         -- can be honored. We should not call the currency conversion API in
478         -- this case.
479 
480         IF ( p_fp_cols_rec.x_version_type = 'ALL' AND
481              p_fp_cols_rec.x_gen_etc_src_code <> 'RESOURCE_SCHEDULE' ) OR
482           (l_budget_generation_flow_flag = 'N' AND
483            p_fp_cols_rec.x_version_type = 'REVENUE' AND
484            l_rev_gen_method = 'C' AND
485            p_fp_cols_rec.x_time_phased_code = 'N') THEN
486                 --Calling the currency conversion API
487                IF p_pa_debug_mode = 'Y' THEN
488                   pa_fp_gen_amount_utils.fp_debug
489                   (p_called_mode => p_called_mode,
490                    p_msg         => 'Before calling
491                         pa_fp_multi_currency_pkg.convert_txn_currency',
492                    p_module_name => l_module_name,
493                    p_log_level   => 5);
494                END IF;
495                PA_FP_MULTI_CURRENCY_PKG.CONVERT_TXN_CURRENCY
496                 (p_budget_version_id          => P_BUDGET_VERSION_ID,
497                  p_entire_version             => 'Y',
498                  p_calling_module              => 'FORECAST_GENERATION', -- Added for Bug#5395732
499                  X_RETURN_STATUS              => X_RETURN_STATUS,
500                  X_MSG_COUNT                  => X_MSG_COUNT,
501                  X_MSG_DATA                    => X_MSG_DATA);
502               IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
503                    RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
504               END IF;
505 
506               IF p_pa_debug_mode = 'Y' THEN
507                  pa_fp_gen_amount_utils.fp_debug
508                  (p_called_mode => p_called_mode,
509                  p_msg         => 'Status after calling
510                  pa_fp_multi_currency_pkg.convert_txn_currency: '
511                                ||x_return_status,
512                  p_module_name => l_module_name,
513                  p_log_level   => 5);
514              END IF;
515         END IF;
516 
517         /* Calling rollup budget version api
518            rollup amounts for the version level not required as the
519            amounts are derived from budget lines data
520         IF p_pa_debug_mode = 'Y' THEN
521             pa_fp_gen_amount_utils.fp_debug
522              (p_called_mode => p_called_mode,
523               p_msg         => 'Before calling
524               pa_fp_rollup_pkg.rollup_budget_version',
525               p_module_name => l_module_name,
526               p_log_level   => 5);
527         END IF;
528         PA_FP_ROLLUP_PKG.ROLLUP_BUDGET_VERSION
529           (p_budget_version_id          => P_BUDGET_VERSION_ID,
530            p_entire_version             =>  'Y',
531            X_RETURN_STATUS              => X_RETURN_STATUS,
532            X_MSG_COUNT                  => X_MSG_COUNT,
533            X_MSG_DATA                   => X_MSG_DATA);
534 
535         IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
536              RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
537         END IF;
538         IF p_pa_debug_mode = 'Y' THEN
539             pa_fp_gen_amount_utils.fp_debug
540              (p_called_mode => p_called_mode,
541               p_msg         => 'Status after calling
542               pa_fp_rollup_pkg.rollup_budget_version: '
543                               ||x_return_status,
544               p_module_name => l_module_name,
545               p_log_level   => 5);
546         END IF;
547         IF p_pa_debug_mode = 'Y' THEN
548              pa_fp_gen_amount_utils.fp_debug
549             (p_msg         => 'Value of project_value: '||p_fp_cols_rec.x_project_value,
550              p_module_name => l_module_name,
551              p_log_level   => 5);
552         END IF;
553         IF  p_fp_cols_rec.x_project_value IS NULL THEN
554             PA_UTILS.ADD_MESSAGE( p_app_short_name => 'PA',
555                                   p_msg_name       => 'PA_FCST_NO_PRJ_VALUE');
556             RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
557         END IF;
558         the error for project value null chk is handled in
559          gen cost based revenue gen API */
560         --Calling gen cost based revenue api
561         IF p_pa_debug_mode = 'Y' THEN
562             pa_fp_gen_amount_utils.fp_debug
563                 (p_called_mode => p_called_mode,
564                 p_msg         => 'Before calling
565                        pa_fp_rev_gen_pub.gen_cost_based_revenue',
566                 p_module_name => l_module_name,
567                 p_log_level   => 5);
568         END IF;
569       --hr_utility.trace('---calling cost based rev gen---');
570         PA_FP_REV_GEN_PUB.GEN_COST_BASED_REVENUE
571                 (P_BUDGET_VERSION_ID          => P_BUDGET_VERSION_ID,
572                 P_FP_COLS_REC                => p_fp_cols_rec,
573                 P_ETC_START_DATE             => P_ACTUALS_THRU_DATE + 1,
574                 X_RETURN_STATUS              => X_RETURN_STATUS,
575                 X_MSG_COUNT                  => X_MSG_COUNT,
576                 X_MSG_DATA                   => X_MSG_DATA);
577         IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
578             RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
579         END IF;
580         IF p_pa_debug_mode = 'Y' THEN
581             pa_fp_gen_amount_utils.fp_debug
582                 (p_called_mode => p_called_mode,
583                  p_msg         => 'Status after calling
584                         pa_fp_rev_gen_pub.gen_cost_based_revenue'
585                         ||x_return_status,
586                  p_module_name => l_module_name,
587                  p_log_level   => 5);
588         END IF;
589      END IF;
590 
591     -- Bug 4592564: Removed Unspent Amounts API call and related logic for
592     -- getting the Source Approved Budget version.
593 
594      /*Only for ALL or Revenue version, revenue generation method can be set
595        and include billing event flag can be chosen. This logic is implemented
596        in both here and UI*/
597      IF (p_fp_cols_rec.x_version_type = 'ALL'
598          OR p_fp_cols_rec.x_version_type = 'REVENUE')
599          AND (l_rev_gen_method = 'E'
600          OR p_fp_cols_rec.x_gen_incl_bill_event_flag = 'Y') THEN
601         --Calling Billing Events API
602         IF p_pa_debug_mode = 'Y' THEN
603             pa_fp_gen_amount_utils.fp_debug
604                  (p_called_mode => p_called_mode,
605                   p_msg         => 'Before calling
606                          pa_fp_gen_billing_amounts.gen_billing_amounts',
607                   p_module_name => l_module_name,
608                   p_log_level   => 5);
609         END IF;
610         PA_FP_GEN_BILLING_AMOUNTS.GEN_BILLING_AMOUNTS
611              (P_PROJECT_ID                 => P_PROJECT_ID,
612               P_BUDGET_VERSION_ID          => P_BUDGET_VERSION_ID,
613               P_FP_COLS_REC                => p_fp_cols_rec,
614               PX_GEN_RES_ASG_ID_TAB        => l_gen_res_asg_id_tab,
615               P_ETC_START_DATE             => P_ACTUALS_THRU_DATE + 1,
616               PX_DELETED_RES_ASG_ID_TAB    => l_deleted_res_asg_id_tab,
617               X_RETURN_STATUS              => X_RETURN_STATUS,
618               X_MSG_COUNT                  => X_MSG_COUNT,
619               X_MSG_DATA                   => X_MSG_DATA);
620 
621         IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
622             RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
623         END IF;
624         IF p_pa_debug_mode = 'Y' THEN
625             pa_fp_gen_amount_utils.fp_debug
626                 (p_called_mode => p_called_mode,
627                  p_msg         => 'Status after calling
628                               pa_fp_gen_billing_amounts.gen_billing_amounts: '
629                               ||x_return_status,
630                  p_module_name => l_module_name,
631                  p_log_level   => 5);
632         END IF;
633     END IF;
634 
635     IF p_fp_cols_rec.x_version_type = 'REVENUE' THEN
636         IF p_pa_debug_mode = 'Y' THEN
637             pa_fp_gen_amount_utils.fp_debug
638                 (p_called_mode => p_called_mode,
639                  p_msg         => 'Before calling
640                         pa_fp_gen_budget_amt_pub.reset_cost_amounts',
641                  p_module_name => l_module_name,
642                  p_log_level   => 5);
643         END IF;
644         --hr_utility.trace('######Calling RESET_COST_AMOUNTS');
645         PA_FP_GEN_BUDGET_AMT_PUB.RESET_COST_AMOUNTS
646             (P_BUDGET_VERSION_ID        => P_BUDGET_VERSION_ID,
647              X_RETURN_STATUS      => X_RETURN_STATUS,
648              X_MSG_COUNT          => X_MSG_COUNT,
649              X_MSG_DATA         => X_MSG_DATA);
650         IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
651             RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
652         END IF;
653         IF p_pa_debug_mode = 'Y' THEN
654             pa_fp_gen_amount_utils.fp_debug
655                 (p_called_mode => p_called_mode,
656                  p_msg         => 'Status after calling
657                               pa_fp_gen_budget_amt_pub.reset_cost_amounts: '
658                               ||x_return_status,
659                  p_module_name => l_module_name,
660                  p_log_level   => 5);
661         END IF;
662     END IF;
663     --dbms_output.put_line('??x_msg_count:'||x_msg_count);
664     --dbms_output.put_line('++Exiting rev part++');
665 -----------------------------------
666 
667     -- Start Bug 8557807.
668     -- The change orders are getting lost when forecast is generated as system
669     -- deletes all the budget line and regenerates the same but in doing so
670     -- the system is  not regenrating the change order changes and hence it
671     -- not visible for next include nor its amounts are seen budget.
672     IF P_fp_cols_rec.x_gen_ret_manual_line_flag <> 'Y' THEN
673 
674       IF p_pa_debug_mode = 'Y' THEN
675             pa_fp_gen_amount_utils.fp_debug
676              (p_msg         => 'Before calling
677                                pa_fp_ci_merge.implement_change_document',
678               p_module_name => l_module_name,
679               p_log_level   => 5);
680       END IF;
681 
682       SELECT pfmci.ci_id
683       BULK   COLLECT
684       INTO   l_ci_id_tbl
685       FROM  pa_fp_merged_ctrl_items pfmci
686       WHERE pfmci.plan_version_id = P_FP_COLS_REC.X_BUDGET_VERSION_ID
687       AND NOT EXISTS ( SELECT 1 FROM pa_fp_merged_ctrl_items pfmci1
688                        WHERE pfmci1.plan_version_id = P_FP_COLS_REC.X_GEN_SRC_PLAN_VERSION_ID
689                        AND  pfmci.ci_id = pfmci1.ci_id);
690 
691       l_budget_version_id_tbl.extend;
692       l_budget_version_id_tbl(1) := P_FP_COLS_REC.X_BUDGET_VERSION_ID;
693 
694       DELETE
695       FROM pa_fp_merged_ctrl_items pfmci
696       WHERE pfmci.plan_version_id = P_FP_COLS_REC.X_BUDGET_VERSION_ID
697       AND NOT EXISTS ( SELECT 1 FROM pa_fp_merged_ctrl_items pfmci1
698                        WHERE pfmci1.plan_version_id = P_FP_COLS_REC.X_GEN_SRC_PLAN_VERSION_ID
699                        AND  pfmci.ci_id = pfmci1.ci_id);
700 
701 
702     	PA_FP_CI_MERGE.implement_change_document
703       (p_context                      =>
704        'INCLUDE',
705        p_calling_context              =>
706        'FORECAST_GENERATION',
707        p_ci_id_tbl                    =>
708        l_ci_id_tbl,
709        p_budget_version_id_tbl        =>
710        l_budget_version_id_tbl,
711        p_impl_cost_flag_tbl           =>
712        l_impl_cost_flag_tbl,
713        p_impl_rev_flag_tbl            =>
714        l_impl_rev_flag_tbl,
715        p_raTxn_rollup_api_call_flag   =>
716        'N',
717        x_translated_msgs_tbl          =>
718        l_translated_msgs_tbl,
719        x_translated_err_msg_count     =>
720        l_translated_err_msg_count,
721        x_translated_err_msg_level_tbl =>
722        l_translated_err_msg_level_tbl,
723        x_return_status                =>
724        x_return_status,
725        x_msg_count                    =>
726        x_msg_count,
727        x_msg_data                     =>
728        x_msg_data);
729 
730 
731 			IF p_pa_debug_mode = 'Y' THEN
732 			    pa_fp_gen_amount_utils.fp_debug
733 			     (p_msg => 'Status after calling pa_fp_ci_merge.implement_change_document'
734 			                      ||x_return_status,
735 			      p_module_name => l_module_name,
736 			      p_log_level   => 5);
737       END IF;
738 
739 			IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
740 			     RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
741 			END IF;
742 
743     END IF;
744     -- End Bug 8557807.
745 
746 
747     /* calling the change document merge API after calling
748        the cost based revenue generation API for bug 3815353   */
749 
750     IF p_fp_cols_rec.x_gen_incl_change_doc_flag = 'Y' THEN
751       IF p_etc_plan_version_id IS NOT NULL THEN
752         SELECT count(*)
753         INTO   l_task_count
754         FROM   pa_tasks
755         WHERE  project_id = p_project_id
756         AND    gen_etc_source_code = 'FINANCIAL_PLAN'
757         AND    gen_etc_source_code IS NOT NULL;
758 
759         IF l_task_count > 0 THEN
760              IF p_pa_debug_mode = 'Y' THEN
761                pa_fp_gen_amount_utils.fp_debug
762                (p_called_mode => p_called_mode,
763                 p_msg         => 'Before calling
764                             pa_fp_ci_merge.copy_merged_ctrl_items',
765                 p_module_name => l_module_name,
766                 p_log_level   => 5);
767              END IF;
768              PA_FP_CI_MERGE.copy_merged_ctrl_items
769              (  p_project_id        => p_project_id
770                ,p_source_version_id => p_etc_plan_version_id
771                ,p_target_version_id => p_fp_cols_rec.x_budget_version_id
772                ,p_calling_context   =>'GENERATION' --Bug 4247703
773                ,x_return_status     => x_return_status
774                ,x_msg_count         => x_msg_count
775                ,x_msg_data          => x_msg_data);
776             IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
777                  RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
778             END IF;
779             IF p_pa_debug_mode = 'Y' THEN
780                pa_fp_gen_amount_utils.fp_debug
781                (p_called_mode => p_called_mode,
782                 p_msg         => 'Status after calling
783                             pa_fp_ci_merge.copy_merged_ctrl_items: '
784                               ||x_return_status,
785                 p_module_name => l_module_name,
786                 p_log_level   => 5);
787             END IF;
788           END IF;
789        END IF;
790         IF p_pa_debug_mode = 'Y' THEN
791             PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
792                 P_CALLED_MODE           => P_CALLED_MODE,
793                 P_MSG                   => 'Before calling pa_fp_gen_pub.'||
794                                            'include_change_document_wrp',
795                 P_MODULE_NAME           => l_module_name);
796             END IF;
797         --dbms_output.put_line('++Before chg doc++');
798         PA_FP_GEN_PUB.INCLUDE_CHANGE_DOCUMENT_WRP
799                 (P_FP_COLS_REC   => p_fp_cols_rec,
800                 X_RETURN_STATUS => X_RETURN_STATUS,
801                 X_MSG_COUNT     => X_MSG_COUNT,
802                 X_MSG_DATA      => X_MSG_DATA);
803         --dbms_output.put_line('++After chg doc is: '||x_return_status);
804         IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
805             RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
806         END IF;
807         IF p_pa_debug_mode = 'Y' THEN
808             PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
809                 P_CALLED_MODE           => P_CALLED_MODE,
810                 P_MSG                   => 'After calling pa_fp_gen_pub.'||
811                                            'include_change_document_wrp:'||x_return_status,
812                 P_MODULE_NAME           => l_module_name);
813         END IF;
814 
815     END IF;
816 
817     -- Bug 4247669: We should not update the budget lines after calling
818     -- the MAINTAIN_BUDGET_VERSION API because it calls the PJI create
819     -- and delete APIs. Hence, moved UPDATE_TOTAL_PLAN_AMTS call before
820     -- the MAINTAIN_BUDGET_VERSION call.
821 
822     /*Due to the request from workplan team, this part gets handled in
823       PA_FP_MAINTAIN_ACTUAL_PUB.MAINTAIN_ACTUAL_AMT_RA. Hence commented
824       out this part */
825 
826     -- Bug 4232094: Uncommented the UPDATE_TOTAL_PLAN_AMTS API call to
827     -- address Issue 2 of the bug concerning inccorect ETC amounts being
828     -- displayed. In addition, added IF condition so that the API call
829     -- happens only when the Target is None timephased.
830 
831     -- Bug 4292083: Commenting the UPDATE_TOTAL_PLAN_AMTS API call again
832     -- in favor of a different approach to updating the plan amounts. See
833     -- bug updates for more details.
834 
835     /* Begin Comment for Bug 4292083 ************************************************
836 
837     IF p_fp_cols_rec.x_time_phased_code = 'N' THEN
838         IF p_pa_debug_mode = 'Y' THEN
839             PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
840                     P_CALLED_MODE           => P_CALLED_MODE,
841                     P_MSG                   => 'Before calling pa_fp_gen_fcst_amt_pub.'||
842                                                'update_total_plan_amts',
843                     P_MODULE_NAME           => l_module_name);
844         END IF;
845         PA_FP_GEN_FCST_AMT_PVT.UPDATE_TOTAL_PLAN_AMTS
846               (P_BUDGET_VERSION_ID   => P_BUDGET_VERSION_ID,
847                X_RETURN_STATUS       => X_RETURN_STATUS,
848                X_MSG_COUNT           => X_MSG_COUNT,
849                X_MSG_DATA            => X_MSG_DATA);
850         --dbms_output.put_line('Status of update total plan amts api: '||X_RETURN_STATUS);
851         --dbms_output.put_line('??x_msg_count:'||x_msg_count);
852         IF p_pa_debug_mode = 'Y' THEN
853             PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
854                     P_CALLED_MODE           => P_CALLED_MODE,
855                     P_MSG                   => 'AFTER CALLING PA_FP_GEN_FCST_AMT_PUB.'||
856                                                'UPDATE_TOTAL_PLAN_AMTS:'||x_return_status,
857                     P_MODULE_NAME           => l_module_name);
858         END IF;
859         IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
860             RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
861         END IF;
862     END IF;
863 
864     ** End Comment for Bug 4292083 **************************************************/
865 
866     -- Call API to update pa_budget_lines.other_rejection_code
867     -- with any ETC revenue amount calculation errors.
868     -- See bug 5203622 for more details.
869     IF p_pa_debug_mode = 'Y' THEN
870         PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
871             P_MSG                   => 'Before calling PA_FP_GEN_FCST_AMT_PUB.' ||
872                                        'UPD_REV_CALCULATION_ERR',
873             P_CALLED_MODE           => p_called_mode,
874             P_MODULE_NAME           => l_module_name);
875     END IF;
876     PA_FP_GEN_FCST_AMT_PUB.UPD_REV_CALCULATION_ERR
877           (P_PROJECT_ID              => p_project_id,
878            P_BUDGET_VERSION_ID       => p_budget_version_id,
879            P_FP_COLS_REC             => p_fp_cols_rec,
880            P_ETC_START_DATE          => p_actuals_thru_date + 1,
881            P_CALLED_MODE             => p_called_mode,
882            X_RETURN_STATUS           => X_RETURN_STATUS,
883            X_MSG_COUNT               => X_MSG_COUNT,
884            X_MSG_DATA                => X_MSG_DATA);
885     IF p_pa_debug_mode = 'Y' THEN
886         PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
887             P_MSG                   => 'After calling PA_FP_GEN_FCST_AMT_PUB.' ||
888                                        'UPD_REV_CALCULATION_ERR: '||x_return_status,
889             P_CALLED_MODE           => p_called_mode,
890             P_MODULE_NAME           => l_module_name);
891     END IF;
892 
893 --Start Bug 5726785
894 
895  	     PA_FP_GEN_FCST_AMT_PUB1.call_clnt_extn_and_update_bl
896  	         (p_project_id       =>  p_project_id
897  	         ,p_budget_version_id   =>  p_budget_version_id
898  	         ,x_call_maintain_data_api => l_call_maintain_data_api
899  	         ,x_return_status    => x_return_status
900  	         ,x_msg_count        => x_msg_count
901  	         ,x_msg_data         => x_msg_data);
902 
903  	         IF p_pa_debug_mode = 'Y' THEN
904  	             PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
905  	                 P_CALLED_MODE       => P_CALLED_MODE,
906  	                 P_MSG               => 'After calling pa_fp_gen_fcst_amt_pub.'||
907  	                                        'call_clnt_extn_and_update_bl '||x_return_status,
908  	                 P_MODULE_NAME       => l_module_name);
909  	         END IF;
910  	         IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
911  	             RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
912  	         END IF;
913 
914 
915 
916  	 --End Bug 5726785
917 
918 
919     IF p_pa_debug_mode = 'Y' THEN
920         PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
921                 P_CALLED_MODE           => P_CALLED_MODE,
922                 P_MSG                   => 'Before calling PA_FP_GEN_FCST_AMT_PUB1.'||
923                                             'MAINTAIN_BUDGET_VERSION',
924                 P_MODULE_NAME           => l_module_name);
925     END IF;
926     --dbms_output.put_line('++Before pub1.maintain_bv++');
927     PA_FP_GEN_FCST_AMT_PUB1.MAINTAIN_BUDGET_VERSION
928        (P_PROJECT_ID            => P_PROJECT_ID,
929         P_BUDGET_VERSION_ID     => P_BUDGET_VERSION_ID,
930         P_ETC_START_DATE        => P_ACTUALS_THRU_DATE + 1,
931 	P_CALL_MAINTAIN_DATA_API => L_CALL_MAINTAIN_DATA_API,
932         X_RETURN_STATUS         => x_return_status,
933         X_MSG_COUNT            => x_msg_count,
934         X_MSG_DATA             => x_msg_data );
935     --dbms_output.put_line('++AFter pub1.maintain_bv++:'||x_return_status);
936     --dbms_output.put_line('??x_msg_count:'||x_msg_count);
937     IF p_pa_debug_mode = 'Y' THEN
938         PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
939                 P_CALLED_MODE           => P_CALLED_MODE,
940                 P_MSG                   => 'After calling PA_FP_GEN_FCST_AMT_PUB1.'||
941                                             'MAINTAIN_BUDGET_VERSION: '||x_return_status,
942                 P_MODULE_NAME           => l_module_name);
943     END IF;
944     IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
945         RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
946     END IF;
947 
948 	-- BEGIN bug 10298995 : Added for Viasat enhancement
949     IF (NVL(FND_PROFILE.value('PA_USE_FCST_RATE_SCHEDULE'),'N') = 'Y') THEN
950 
951        OPEN res_asgn_csr;
952        FETCH res_asgn_csr BULK COLLECT INTO l_res_asgn_id_tab, l_txn_curr_code_tab;
953        CLOSE res_asgn_csr;
954 
955        IF P_PA_DEBUG_MODE = 'Y' THEN
956           PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
957                  P_CALLED_MODE   => P_CALLED_MODE,
958                  P_MSG           => 'Calling PA_FP_CALC_PLAN_PKG.calculate l_res_asgn_id_tab.count '|| l_res_asgn_id_tab.count,
959                  P_MODULE_NAME   => l_module_name);
960        END IF;
961        PA_FP_CALC_PLAN_PKG.calculate(
962                    p_project_id                   => P_PROJECT_ID,
963                    p_budget_version_id            => P_BUDGET_VERSION_ID,
964                    p_refresh_rates_flag           => 'Y',
965                    p_refresh_conv_rates_flag      => 'N',
966                    p_source_context               => 'RESOURCE_ASSIGNMENT',
967                    p_resource_assignment_tab      => l_res_asgn_id_tab,
968                    p_txn_currency_code_tab        => l_txn_curr_code_tab,
969                    x_return_status                => x_return_status,
970                    x_msg_count                    => x_msg_count,
971                    x_msg_data                     => x_msg_data);
972 
973        IF P_PA_DEBUG_MODE = 'Y' THEN
974           PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
975                  P_CALLED_MODE   => P_CALLED_MODE,
976                  P_MSG           => 'After calling PA_FP_CALC_PLAN_PKG.calculate: '|| x_return_status,
977                  P_MODULE_NAME   => l_module_name);
978        END IF;
979        IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
980           RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
981        END IF;
982 
983     END IF;
984     -- END bug 10298995 : Added for Viasat enhancement
985 
986     IF P_COMMIT_FLAG = 'Y' THEN
987         COMMIT;
988     END IF;
989     IF p_pa_debug_mode = 'Y' THEN
990         PA_DEBUG.Reset_Curr_Function;
991     END IF;
992     --dbms_output.put_line('??END: x_msg_count:'||x_msg_count);
993     /*temp */
994     IF x_return_status = FND_API.G_RET_STS_SUCCESS THEN
995         x_msg_count := 0;
996     END IF;
997 EXCEPTION
998      WHEN PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc THEN
999           l_msg_count := FND_MSG_PUB.count_msg;
1000           IF l_msg_count = 1 THEN
1001               PA_INTERFACE_UTILS_PUB.get_messages
1002                  (p_encoded        => FND_API.G_TRUE
1003                   ,p_msg_index      => 1
1004                   ,p_msg_count      => l_msg_count
1005                   ,p_msg_data       => l_msg_data
1006                   ,p_data           => l_data
1007                   ,p_msg_index_out  => l_msg_index_out);
1008                  x_msg_data  := l_data;
1009                  x_msg_count := l_msg_count;
1010           ELSE
1011                 x_msg_count := l_msg_count;
1012           END IF;
1013           ROLLBACK;
1014 
1015           x_return_status := FND_API.G_RET_STS_ERROR;
1016           IF P_PA_DEBUG_MODE = 'Y' THEN
1017         PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
1018                 P_CALLED_MODE           => P_CALLED_MODE,
1019                 P_MSG                   => 'Invalid Arguments Passed',
1020                 P_MODULE_NAME           => l_module_name);
1021               PA_DEBUG.Reset_Curr_Function;
1022           END IF;
1023           RAISE;
1024 
1025       WHEN OTHERS THEN
1026            x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1027            x_msg_data      := SUBSTR(SQLERRM,1,240);
1028            FND_MSG_PUB.add_exc_msg
1029              ( p_pkg_name       => 'PA_FP_GEN_FCST_AMT_PUB'
1030               ,p_procedure_name => 'GENERATE_FCST_AMT_WRP');
1031            IF P_PA_DEBUG_MODE = 'Y' THEN
1032                 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
1033                 P_CALLED_MODE           => P_CALLED_MODE,
1034                 P_MSG                   => 'Unexpected Error'||substr(sqlerrm, 1, 240),
1035                 P_MODULE_NAME           => l_module_name);
1036                 PA_DEBUG.Reset_Curr_Function;
1037            END IF;
1038            RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1039 
1040 END GENERATE_FCST_AMT_WRP;
1041 
1042 PROCEDURE GEN_FCST_TASK_LEVEL_AMT
1043           (P_PROJECT_ID              IN PA_PROJECTS_ALL.PROJECT_ID%TYPE,
1044            P_BUDGET_VERSION_ID       IN PA_BUDGET_VERSIONS.BUDGET_VERSION_ID%TYPE,
1045            P_FP_COLS_REC             IN PA_FP_GEN_AMOUNT_UTILS.FP_COLS,
1046            P_WP_STRUCTURE_VERSION_ID IN PA_PROJ_ELEM_VER_STRUCTURE.ELEMENT_VERSION_ID%TYPE,
1047            P_ETC_FP_PLAN_VERSION_ID  IN PA_PROJ_FP_OPTIONS.FIN_PLAN_VERSION_ID%TYPE,
1048            P_ACTUALS_THRU_DATE       IN PA_PERIODS_ALL.END_DATE%TYPE,
1049            P_ACTUALS_FROM_PERIOD     IN VARCHAR2,
1050            P_ACTUALS_TO_PERIOD       IN VARCHAR2,
1051            P_ETC_FROM_PERIOD         IN VARCHAR2,
1052            P_ETC_TO_PERIOD           IN VARCHAR2,
1053            X_RETURN_STATUS           OUT  NOCOPY VARCHAR2,
1054            X_MSG_COUNT               OUT  NOCOPY NUMBER,
1055            X_MSG_DATA                OUT  NOCOPY VARCHAR2) IS
1056 
1057 l_module_name         VARCHAR2(200) := 'pa.plsql.pa_fp_gen_fcst_amt_pub.gen_fcst_task_level_amt';
1058 
1059 l_latest_published_fwbs_id      NUMBER;
1060 l_proj_struc_sharing_code       VARCHAR2(30);
1061 
1062 l_wp_version_id                 NUMBER;
1063 l_fp_cols_rec_target            PA_FP_GEN_AMOUNT_UTILS.FP_COLS;
1064 l_fp_cols_rec_wp                PA_FP_GEN_AMOUNT_UTILS.FP_COLS;
1065 l_fp_cols_rec_fp                PA_FP_GEN_AMOUNT_UTILS.FP_COLS;
1066 l_fp_cols_rec_approved          PA_FP_GEN_AMOUNT_UTILS.FP_COLS;
1067 l_resource_list_id      NUMBER;
1068 l_struct_ver_id         NUMBER;
1069 l_calendar_type         VARCHAR2(3);
1070 l_record_type           VARCHAR2(10);
1071 
1072 l_calling_context       VARCHAR2(30);
1073 
1074 CURSOR  traverse_tasks_cur(c_gen_etc_src_code PA_PROJ_FP_OPTIONS.GEN_COST_SRC_CODE%TYPE) IS
1075 SELECT  task_id,
1076         DECODE(c_gen_etc_src_code,
1077                NULL,NVL(gen_etc_source_code,'NONE'),
1078                c_gen_etc_src_code)
1079 FROM    pa_tasks t
1080 WHERE   project_id = P_PROJECT_ID;
1081 
1082 CURSOR  traverse_top_tasks_cur(c_gen_etc_src_code PA_PROJ_FP_OPTIONS.GEN_COST_SRC_CODE%TYPE) IS
1083         SELECT  task_id,
1084         DECODE(c_gen_etc_src_code,
1085                NULL,NVL(gen_etc_source_code,'NONE'),
1086                c_gen_etc_src_code)
1087         FROM    pa_tasks t
1088         WHERE   project_id = P_PROJECT_ID and
1089                 parent_task_id is null;
1090 
1091 l_temp_top_task_id              PA_TASKS.TOP_TASK_ID%TYPE;
1092 CURSOR  traverse_child_tasks_cur IS
1093         SELECT  task_id
1094         FROM    pa_tasks t
1095         WHERE   project_id = P_PROJECT_ID and
1096                 top_task_id = l_temp_top_task_id and
1097                 task_id <> top_task_id; -- don't want to retrieve the current node
1098 
1099 l_top_task_id_tab               PA_PLSQL_DATATYPES.NumTabTyp; -- ETC Enhancements 10/2004
1100 l_child_task_id_tab             PA_PLSQL_DATATYPES.NumTabTyp; -- ETC Enhancements 10/2004
1101 l_top_gen_etc_src_code_tab      pa_plsql_datatypes.Char30TabTyp; -- ETC Enhancements 10/2004
1102 l_task_id_tab                   PA_PLSQL_DATATYPES.NumTabTyp;
1103 l_gen_etc_source_code_tab       pa_plsql_datatypes.Char30TabTyp;
1104 l_curr_task_id                  PA_TASKS.TASK_ID%TYPE;
1105 l_curr_etc_source               PA_TASKS.GEN_ETC_SOURCE_CODE%TYPE;
1106 l_curr_etc_ver_id               NUMBER;
1107 l_curr_etc_method_code          VARCHAR2(30);
1108 l_curr_src_ra_id                NUMBER;
1109 l_curr_tgt_ra_id                NUMBER;
1110 l_curr_rlm_id                   NUMBER;
1111 l_curr_cbs_id                   NUMBER;--bug#16791711
1112 l_txn_amt_rec                   PA_FP_GEN_FCST_AMT_PUB.TXN_AMT_REC_TYP;
1113 l_work_qty_cnt                  NUMBER:= 0;
1114 
1115 /* Indices for ETC method PL/SQL tables */
1116 l_rb_index                     BINARY_INTEGER;
1117 l_bc_index                     BINARY_INTEGER;
1118 l_ev_index                     BINARY_INTEGER;
1119 
1120 /* PL/SQL tables for Remaining Budget - Performance Bug 4194849 */
1121 l_rb_src_ra_id_tab             PA_PLSQL_DATATYPES.IdTabTyp;
1122 l_rb_tgt_ra_id_tab             PA_PLSQL_DATATYPES.IdTabTyp;
1123 l_rb_task_id_tab               PA_PLSQL_DATATYPES.IdTabTyp;
1124 l_rb_rlm_id_tab                PA_PLSQL_DATATYPES.IdTabTyp;
1125 l_rb_cbs_id_tab                PA_PLSQL_DATATYPES.IdTabTyp;--bug#16791711
1126 l_rb_etc_source_tab            PA_PLSQL_DATATYPES.Char30TabTyp;
1127 
1128 /* PL/SQL tables for Budget To Complete - Performance Bug 4194849 */
1129 l_bc_src_ra_id_tab            PA_PLSQL_DATATYPES.IdTabTyp;
1130 l_bc_tgt_ra_id_tab            PA_PLSQL_DATATYPES.IdTabTyp;
1131 l_bc_task_id_tab              PA_PLSQL_DATATYPES.IdTabTyp;
1132 l_bc_rlm_id_tab               PA_PLSQL_DATATYPES.IdTabTyp;
1133 l_bc_cbs_id_tab               PA_PLSQL_DATATYPES.IdTabTyp;--bug#16791711
1134 l_bc_etc_source_tab           PA_PLSQL_DATATYPES.Char30TabTyp;
1135 
1136 /* PL/SQL tables for Earned Value - Performance Bug 4194849 */
1137 l_ev_src_ra_id_tab             PA_PLSQL_DATATYPES.IdTabTyp;
1138 l_ev_tgt_ra_id_tab             PA_PLSQL_DATATYPES.IdTabTyp;
1139 l_ev_task_id_tab               PA_PLSQL_DATATYPES.IdTabTyp;
1140 l_ev_rlm_id_tab                PA_PLSQL_DATATYPES.IdTabTyp;
1141 l_ev_cbs_id_tab                PA_PLSQL_DATATYPES.IdTabTyp;--bug#16791711
1142 l_ev_etc_source_tab            PA_PLSQL_DATATYPES.Char30TabTyp;
1143 
1144 -- Bug 4114589: When populating temporary table data, we need to process
1145 -- tasks with source of Average of Actuals separately after copying actuals.
1146 l_avg_actuals_task_id_tab       PA_PLSQL_DATATYPES.IdTabTyp;
1147 
1148 -- Bug 4089850: Modified traverse_tasks_rlm_cur so that we no longer
1149 -- join with pa_tasks to get the ETC source code. Instead, we return
1150 -- the transaction_source_code from tmp1.
1151 
1152 CURSOR  traverse_tasks_rlm_cur (c_gen_etc_source_code VARCHAR2) IS
1153 SELECT  tmp1.task_id,
1154         NVL(c_gen_etc_source_code, NVL(tmp1.transaction_source_code,'NONE')),
1155         tmp1.resource_assignment_id,
1156         tmp1.target_res_asg_id,
1157         tmp1.resource_list_member_id,
1158 		tmp1.cbs_element_id, --bug#16791711
1159         tmp1.etc_method_code
1160 FROM    PA_FP_CALC_AMT_TMP1 tmp1;
1161 
1162 l_task_id_tab2                  PA_PLSQL_DATATYPES.NumTabTyp;
1163 l_gen_etc_source_code_tab2      pa_plsql_datatypes.Char30TabTyp;
1164 l_src_ra_id_tab2                PA_PLSQL_DATATYPES.NumTabTyp;
1165 l_tgt_ra_id_tab2                PA_PLSQL_DATATYPES.NumTabTyp;
1166 l_rlm_id_tab2                   PA_PLSQL_DATATYPES.NumTabTyp;
1167 l_cbs_id_tab2                   PA_PLSQL_DATATYPES.NumTabTyp;--bug#16791711
1168 l_etc_method_tab2               pa_plsql_datatypes.Char30TabTyp;
1169 
1170 -- gboomina Bug 8318932 AAI Enhancement - Start
1171 CURSOR get_copy_etc_from_plan_csr
1172 IS
1173 SELECT COPY_ETC_FROM_PLAN_FLAG
1174 FROM PA_PROJ_FP_OPTIONS
1175 WHERE FIN_PLAN_VERSION_ID = P_BUDGET_VERSION_ID;
1176 
1177 l_copy_etc_from_plan_flag PA_PROJ_FP_OPTIONS.COPY_ETC_FROM_PLAN_FLAG%TYPE;
1178 -- gboomina Bug 8318932 AAI Enhancement - End
1179 
1180 l_gen_etc_source_code_override  VARCHAR2(30);
1181 
1182 --in param for PPA_FP_MAP_BV_PUB.GEN_MAP_BV_TO_TARGET_RL to
1183 --get baselined cost.
1184 l_approved_fp_version_id        pa_proj_fp_options.fin_plan_version_id%TYPE;
1185 l_approved_fp_options_id        pa_proj_fp_options.proj_fp_options_id%TYPE;
1186 
1187 l_fin_plan_type_id              pa_proj_fp_options.fin_plan_type_id%TYPE;
1188 l_version_type                  VARCHAR2(15);
1189 
1190 l_plan_level                    VARCHAR2(15);
1191 
1192 l_amt_dtls_tbl                  pa_fp_maintain_actual_pub.l_amt_dtls_tbl_typ;
1193 
1194 /*For None Time Phase*/
1195 l_start_date                DATE;
1196 l_end_date                  DATE;
1197 
1198 --local PL/SQL table used for calling Calculate API
1199 l_refresh_rates_flag          VARCHAR2(1);
1200 l_refresh_conv_rates_flag     VARCHAR2(1);
1201 l_spread_required_flag        VARCHAR2(1);
1202 l_conv_rates_required_flag    VARCHAR2(1);
1203 l_raTxn_rollup_api_call_flag  VARCHAR2(1); -- Added for IPM new entity ER
1204 
1205 l_source_context              VARCHAR2(30) :='RESOURCE_ASSIGNMENT';
1206 l_cal_ra_id_tab               SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
1207 l_cal_src_ra_id_tab           SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
1208 l_cal_rate_based_flag_tab     SYSTEM.pa_varchar2_1_tbl_type:=SYSTEM.pa_varchar2_1_tbl_type();
1209 l_cal_rlm_id_tab              SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
1210 l_cal_cbs_id_tab              SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();--bug#16791711
1211 l_cal_task_id_tab             SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
1212 l_cal_etc_method_code_tab     SYSTEM.pa_varchar2_30_tbl_type:=SYSTEM.pa_varchar2_30_tbl_type();
1213 l_cal_rcost_rate_override_tab SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
1214 l_cal_bcost_rate_override_tab SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
1215 l_cal_bill_rate_override_tab  SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
1216 l_delete_budget_lines_tab     SYSTEM.pa_varchar2_1_tbl_type:=SYSTEM.pa_varchar2_1_tbl_type();
1217 l_spread_amts_flag_tab        SYSTEM.pa_varchar2_1_tbl_type:=SYSTEM.pa_varchar2_1_tbl_type();
1218 l_cal_txn_currency_code_tab   SYSTEM.pa_varchar2_15_tbl_type:=SYSTEM.pa_varchar2_15_tbl_type();
1219 l_txn_currency_override_tab   SYSTEM.pa_varchar2_15_tbl_type:=SYSTEM.pa_varchar2_15_tbl_type();
1220 l_cal_etc_qty_tab             SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
1221 l_addl_qty_tab                SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
1222 l_cal_etc_raw_cost_tab        SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
1223 l_addl_raw_cost_tab           SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
1224 l_cal_etc_burdened_cost_tab   SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
1225 l_addl_burdened_cost_tab      SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
1226 l_cal_etc_revenue_tab         SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
1227 l_addl_revenue_tab            SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
1228 l_raw_cost_rate_tab           SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
1229 l_b_cost_rate_tab             SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
1230 l_bill_rate_tab               SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
1231 l_line_start_date_tab         SYSTEM.pa_date_tbl_type:=SYSTEM.pa_date_tbl_type();
1232 l_line_end_date_tab           SYSTEM.pa_date_tbl_type:=SYSTEM.pa_date_tbl_type();
1233 l_input_period_rates_tbl      PA_FP_FCST_GEN_CLIENT_EXT.l_pds_rate_dtls_tab;
1234 l_period_rates_tbl            PA_FP_FCST_GEN_CLIENT_EXT.l_pds_rate_dtls_tab;
1235 l_cal_unit_of_measure_tab     SYSTEM.pa_varchar2_30_tbl_type:=SYSTEM.pa_varchar2_30_tbl_type();
1236 
1237 L_RES_ASG_UOM_UPDATE_TAB        PA_PLSQL_DATATYPES.IdTabTyp;
1238 
1239 l_target_class_rlm_id           NUMBER;
1240 l_target_class_cbs_id           NUMBER;--bug#16791711
1241 l_rev_gen_method                VARCHAR2(10);
1242 
1243 l_msg_count                     NUMBER;
1244 l_msg_data                      VARCHAR2(2000);
1245 l_data                          VARCHAR2(2000);
1246 l_msg_index_out                 NUMBER:=0;
1247 
1248 l_count_tmp                     NUMBER;
1249 l_test                          NUMBER;
1250 p_called_mode                   varchar2(20) := 'SELF_SERVICE';
1251 l_dummy                         NUMBER;
1252 l_date date;
1253 l_count number;
1254 l_task_index                    NUMBER; -- used for populating task pl/sql tables
1255 
1256 l_fcst_etc_qty NUMBER;
1257 l_fcst_etc_raw_cost NUMBER;
1258 l_fcst_etc_burdened_cost NUMBER;
1259 l_fcst_etc_revenue NUMBER;
1260 l_init_qty NUMBER;
1261 l_init_raw_cost NUMBER;
1262 l_init_burdened_cost NUMBER;
1263 l_init_revenue NUMBER;
1264 
1265 l_fp_cols_rec_src               PA_FP_GEN_AMOUNT_UTILS.FP_COLS;
1266 /* Bug 4369741: Replaced l_planning_options_flag with 2 separate
1267  * planning options flags for WP and FP later in the declaration. */
1268 --l_planning_options_flag       VARCHAR2(1);
1269 l_ra_txn_source_code            PA_RESOURCE_ASSIGNMENTS.TRANSACTION_SOURCE_CODE%TYPE;
1270 l_bl_count                      NUMBER;
1271 
1272 l_cnt                           NUMBER := 1;
1273 l_cal_ra_id_tab_tmp             SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
1274 l_cal_txn_curr_code_tab_tmp     SYSTEM.pa_varchar2_15_tbl_type:=SYSTEM.pa_varchar2_15_tbl_type();
1275 l_cal_rate_based_flag_tab_tmp   SYSTEM.pa_varchar2_1_tbl_type:=SYSTEM.pa_varchar2_1_tbl_type();
1276 l_cal_rlm_id_tab_tmp            SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
1277 l_cal_cbs_id_tab_tmp            SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();--bug#16791711
1278 l_cal_task_id_tab_tmp           SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
1279 l_cal_unit_of_measure_tab_tmp   SYSTEM.pa_varchar2_30_tbl_type:=SYSTEM.pa_varchar2_30_tbl_type();
1280 l_cal_etc_method_code_tab_tmp   SYSTEM.pa_varchar2_30_tbl_type:=SYSTEM.pa_varchar2_30_tbl_type();
1281 l_cal_etc_qty_tab_tmp           SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
1282 l_cal_etc_raw_cost_tab_tmp      SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
1283 l_cal_etc_brdn_cost_tab_tmp     SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
1284 l_cal_etc_revenue_tab_tmp       SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
1285 
1286 l_fcst_gen_src_code             PA_PROJ_FP_OPTIONS.GEN_COST_SRC_CODE%TYPE;
1287 
1288 l_etc_start_date               DATE;
1289 
1290 /* Bug 3968748: Variables for populating PA_FP_GEN_RATE_TMP */
1291 l_ext_period_name_tab          PA_PLSQL_DATATYPES.Char30TabTyp;
1292 l_ext_raw_cost_rate_tab        PA_PLSQL_DATATYPES.NumTabTyp;
1293 l_ext_burdened_cost_rate_tab   PA_PLSQL_DATATYPES.NumTabTyp;
1294 l_ext_revenue_bill_rate_tab    PA_PLSQL_DATATYPES.NumTabTyp;
1295 
1296 l_entered_flag                 VARCHAR2(1) := 'N';
1297 l_proceed_flag                 VARCHAR2(1) := 'Y';
1298 
1299 -- Bug 4346172: l_use_src_rates_flag will be 'Y' when the src/tgt planning
1300 -- options match, and when the source ETC method is not EARNED_VALUE.
1301 l_use_src_rates_flag           VARCHAR2(1);
1302 
1303 /* Variables Added for ER 4376722 */
1304 l_billable_flag_tab            SYSTEM.pa_varchar2_1_tbl_type:=SYSTEM.pa_varchar2_1_tbl_type();
1305 l_billable_flag_tab_tmp        SYSTEM.pa_varchar2_1_tbl_type:=SYSTEM.pa_varchar2_1_tbl_type();
1306 l_cal_src_ra_id_tab_tmp        SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
1307 
1308 -- This index is used in billability logic to track the running index of the _tmp tables
1309 l_tmp_index                    NUMBER;
1310 
1311 /* Variables Added for Bug 4369741 */
1312 l_wp_planning_options_flag      VARCHAR2(1);
1313 l_fp_planning_options_flag      VARCHAR2(1);
1314 
1315 l_gen_etc_src_code_tab_tmp      SYSTEM.pa_varchar2_30_tbl_type:=SYSTEM.pa_varchar2_30_tbl_type();
1316 l_gen_etc_src_code_tab          SYSTEM.pa_varchar2_30_tbl_type:=SYSTEM.pa_varchar2_30_tbl_type();
1317 
1318 -- Bug 4346172: As part of the fix, added join on pa_fp_calc_amt_tmp1
1319 -- to get the correct source ETC method code.
1320 -- As a result of further testing, discovered that the original fix
1321 -- introduced a duplicate resource error when Commitments are included.
1322 -- PROBLEM:
1323 -- Normally, there should be 1 record per target_res_asg_id in the
1324 -- PA_FP_CALC_AMT_TMP1 table. However, when Commitments are included,
1325 -- extra PA_FP_CALC_AMT_TMP1 records are added for commitment records.
1326 -- As a result, the query returned 2 records for target resources with
1327 -- commitments and ETC.
1328 -- SOLUTION:
1329 -- Ignore records in the PA_FP_CALC_AMT_TMP1 table with transaction
1330 -- source code of 'OPEN_COMMITMENTS'. This will ensure that the query
1331 -- retrieves at most 1 record per target_res_asg_id. Note that we do
1332 -- not need to worry about the scenario when there is a commitment
1333 -- record in the temp table but no ETC record, since the purpose of
1334 -- this query is to get ETC amounts (and Commitments are generated
1335 -- later by a separate API).
1336 
1337 -- ER 4376722: To carry out the Task Billability logic, we need to
1338 -- modify the queries to fetch the task billable_flag for each target
1339 -- resource. Since ra.task_id can be NULL or 0, we take the outer
1340 -- join: NVL(ra.task_id,0) = ta.task_id (+). By default, tasks are
1341 -- billable, so we SELECT NVL(ta.billable_flag,'Y').
1342 
1343 -- Bug 4571025: To avoid TMP2 records matching multiple TMP1 records,
1344 -- added the following additional WHERE clause join condition to ETC
1345 -- amount cursors (etc_amts_cur_wp_opt_same, etc_amts_cur_fp_opt_same,
1346 -- etc_amts_cur_wp_fp_opt_diff, and etc_amts_cur_wp_fp_opt_same):
1347 --   AND tmp_ra.resource_assignment_id = tmp.resource_assignment_id
1348 
1349 /* Bug 4369741: Added cursor etc_amts_cur_wp_fp_opt_same to be used in
1350  * the following scenarios:
1351  * 1. Target ETC generation source = 'WORKPLAN_RESOURCES'
1352  *    l_wp_planning_options_flag = Y
1353  * 2. Target ETC generation source = 'FINANCIAL_PLAN'
1354  *    l_fp_planning_options_flag = Y
1355  * 3. Target ETC generation source = 'TASK_LEVEL_SEL'
1356  *    l_wp_planning_options_flag = Y
1357  *    l_fp_planning_options_flag = Y
1358  * When the ETC generation source is Workplan or Financial Plan,
1359  * 'WORKPLAN_RESOURCES' or 'FINANCIAL_PLAN' should be passed for the
1360  * c_gen_etc_source_code cursor parameter, respectively.
1361  * When the ETC generation source is Task Level Selection, the
1362  * c_gen_etc_source_code cursor parameter should be NULL so that the
1363  * cursor picks up each task's generation source. */
1364 
1365 CURSOR etc_amts_cur_wp_fp_opt_same
1366     (c_gen_etc_source_code VARCHAR2 DEFAULT NULL) IS
1367 SELECT /*+ INDEX(tmp,PA_FP_CALC_AMT_TMP2_N1)
1368            INDEX(tmp_ra,PA_FP_CALC_AMT_TMP1_N1) */
1369      tmp.RESOURCE_ASSIGNMENT_ID,
1370      tmp.TARGET_RES_ASG_ID,
1371      tmp.ETC_CURRENCY_CODE,
1372      ra.rate_based_flag,
1373      ra.resource_list_member_id,
1374 	 ra.cbs_element_id, --bug#16791711
1375      ra.task_id,
1376      ra.unit_of_measure,
1377      tmp_ra.etc_method_code,
1378      SUM(tmp.ETC_PLAN_QUANTITY),
1379      SUM(tmp.ETC_TXN_RAW_COST),
1380      SUM(tmp.ETC_TXN_BURDENED_COST),
1381      SUM(tmp.ETC_TXN_REVENUE),
1382      NVL(ta.billable_flag,'Y'),                       /* Added for ER 4376722 */
1383      nvl(c_gen_etc_source_code,                       /* Added for Bug 4369741 */
1384          nvl(tmp_ra.transaction_source_code, 'NONE'))
1385 FROM PA_FP_CALC_AMT_TMP1 tmp_ra,
1386      PA_FP_CALC_AMT_TMP2 tmp,
1387      PA_RESOURCE_ASSIGNMENTS ra,
1388      pa_tasks ta                                      /* Added for ER 4376722 */
1389 WHERE tmp.target_res_asg_id = ra.resource_assignment_id
1390       AND tmp.TRANSACTION_SOURCE_CODE = 'ETC'
1391       AND tmp_ra.target_res_asg_id = tmp.target_res_asg_id
1392       AND tmp_ra.transaction_source_code <> 'OPEN_COMMITMENTS' /* Bug 4346172 */
1393       and NVL(ra.task_id,0) = ta.task_id (+)          /* Added for ER 4376722 */
1394       --and ta.project_id = P_PROJECT_ID              /* Added for ER 4376722 */
1395       AND ra.budget_version_id = P_BUDGET_VERSION_ID  /* Added for Bug 4369741 Perf */
1396       AND ra.project_id = P_PROJECT_ID                /* Added for Bug 4369741 Perf */
1397       AND tmp_ra.resource_assignment_id = tmp.resource_assignment_id /* Added for Bug 4571025 */
1398 GROUP BY tmp.RESOURCE_ASSIGNMENT_ID,
1399          tmp.TARGET_RES_ASG_ID,
1400          tmp.ETC_CURRENCY_CODE,
1401          ra.rate_based_flag,
1402          ra.resource_list_member_id,
1403 		 ra.cbs_element_id, --bug#16791711
1404          ra.task_id,
1405          ra.unit_of_measure,
1406          tmp_ra.etc_method_code,
1407          NVL(ta.billable_flag,'Y'),                  /* Added for ER 4376722 */
1408          nvl(c_gen_etc_source_code,                  /* Added for Bug 4369741 */
1409              nvl(tmp_ra.transaction_source_code, 'NONE'));
1410 
1411 -- 5/10/05 : When planning options do not match, we potentially
1412 -- have many source resources mapping to each target resource. As
1413 -- such, we cannot determine a single source ETC method. Thus,
1414 -- replaced ra.etc_method_code with NULL in the SELECT clause below.
1415 
1416 /* Bug 4369741: Added cursor etc_amts_cur_wp_fp_opt_diff to be used in
1417  * the following scenarios:
1418  * 1. Target ETC generation source = 'WORKPLAN_RESOURCES'
1419  *    l_wp_planning_options_flag = N
1420  * 2. Target ETC generation source = 'FINANCIAL_PLAN'
1421  *    l_fp_planning_options_flag = N
1422  * 3. Target ETC generation source = 'TASK_LEVEL_SEL'
1423  *    l_wp_planning_options_flag = N
1424  *    l_fp_planning_options_flag = N
1425  * When the ETC generation source is Workplan or Financial Plan,
1426  * 'WORKPLAN_RESOURCES' or 'FINANCIAL_PLAN' should be passed for the
1427  * c_gen_etc_source_code cursor parameter, respectively.
1428  * When the ETC generation source is Task Level Selection, the
1429  * c_gen_etc_source_code cursor parameter should be NULL so that the
1430  * cursor picks up each task's generation source. */
1431 
1432 CURSOR etc_amts_cur_wp_fp_opt_diff
1433     (c_gen_etc_source_code VARCHAR2 DEFAULT NULL) IS
1434 SELECT /*+ INDEX(tmp,PA_FP_CALC_AMT_TMP2_N1)
1435            INDEX(tmp_ra,PA_FP_CALC_AMT_TMP1_N1) */
1436      sum(1*null),
1437      tmp.TARGET_RES_ASG_ID,
1438      tmp.ETC_CURRENCY_CODE,
1439      ra.rate_based_flag,
1440      ra.resource_list_member_id,
1441 	 ra.cbs_element_id, --bug#16791711
1442      ra.task_id,
1443      ra.unit_of_measure,
1444      null, --ra.etc_method_code,
1445      SUM(tmp.ETC_PLAN_QUANTITY),
1446      SUM(tmp.ETC_TXN_RAW_COST),
1447      SUM(tmp.ETC_TXN_BURDENED_COST),
1448      SUM(tmp.ETC_TXN_REVENUE),
1449      NVL(ta.billable_flag,'Y'),                     /* Added for ER 4376722 */
1450      nvl(c_gen_etc_source_code,                     /* Added for Bug 4369741 */
1451          nvl(tmp_ra.transaction_source_code, 'NONE'))
1452 FROM PA_FP_CALC_AMT_TMP1 tmp_ra,                    /* Added for Bug 4369741 */
1453    PA_FP_CALC_AMT_TMP2 tmp,
1454    PA_RESOURCE_ASSIGNMENTS ra,
1455    pa_tasks ta                                      /* Added for ER 4376722 */
1456 WHERE tmp.target_res_asg_id = ra.resource_assignment_id
1457     AND tmp.TRANSACTION_SOURCE_CODE = 'ETC'
1458     and NVL(ra.task_id,0) = ta.task_id (+)          /* Added for ER 4376722 */
1459     --and ta.project_id = P_PROJECT_ID              /* Added for ER 4376722 */
1460     AND tmp_ra.target_res_asg_id = tmp.target_res_asg_id     /* Added for Bug 4369741 */
1461     AND tmp_ra.transaction_source_code <> 'OPEN_COMMITMENTS' /* Added for Bug 4369741 */
1462     AND ra.budget_version_id = P_BUDGET_VERSION_ID  /* Added for Bug 4369741 Perf */
1463     AND ra.project_id = P_PROJECT_ID                /* Added for Bug 4369741 Perf */
1464     AND tmp_ra.resource_assignment_id = tmp.resource_assignment_id /* Added for Bug 4571025 */
1465 GROUP BY
1466 tmp.TARGET_RES_ASG_ID,
1467        tmp.ETC_CURRENCY_CODE,
1468        ra.rate_based_flag,
1469        ra.resource_list_member_id,
1470 	   ra.cbs_element_id, --bug#16791711
1471        ra.task_id,
1472        ra.unit_of_measure,
1473        null, --ra.etc_method_code,
1474        NVL(ta.billable_flag,'Y'),                   /* Added for ER 4376722 */
1475        nvl(c_gen_etc_source_code,                   /* Added for Bug 4369741 */
1476            nvl(tmp_ra.transaction_source_code, 'NONE'));
1477 
1478 /* Bug 4369741: Added cursor etc_amts_cur_wp_opt_same to be used in
1479  * the following scenario:
1480  * 1. Target ETC generation source = 'TASK_LEVEL_SEL'
1481  *    l_wp_planning_options_flag = Y
1482  *    l_fp_planning_options_flag = N
1483  * This cursor's SELECT statement uses the etc_amts_cur_wp_fp_opt_same
1484  * cursor's SELECT statement for resources with Workplan source UNION
1485  * ALL the etc_amts_cur_wp_fp_opt_diff cursor's SELECT statement for
1486  * resources with non-Workplan source. */
1487 
1488 CURSOR etc_amts_cur_wp_opt_same IS
1489 SELECT /*+ INDEX(tmp,PA_FP_CALC_AMT_TMP2_N1)
1490            INDEX(tmp_ra,PA_FP_CALC_AMT_TMP1_N1) */
1491      tmp.RESOURCE_ASSIGNMENT_ID,
1492      tmp.TARGET_RES_ASG_ID,
1493      tmp.ETC_CURRENCY_CODE,
1494      ra.rate_based_flag,
1495      ra.resource_list_member_id,
1496 	 ra.cbs_element_id, --bug#16791711
1497      ra.task_id,
1498      ra.unit_of_measure,
1499      tmp_ra.etc_method_code,
1500      SUM(tmp.ETC_PLAN_QUANTITY),
1501      SUM(tmp.ETC_TXN_RAW_COST),
1502      SUM(tmp.ETC_TXN_BURDENED_COST),
1503      SUM(tmp.ETC_TXN_REVENUE),
1504      NVL(ta.billable_flag,'Y'),                       /* Added for ER 4376722 */
1505      tmp_ra.transaction_source_code                   /* Added for Bug 4369741 */
1506 FROM PA_FP_CALC_AMT_TMP1 tmp_ra,
1507      PA_FP_CALC_AMT_TMP2 tmp,
1508      PA_RESOURCE_ASSIGNMENTS ra,
1509      pa_tasks ta                                      /* Added for ER 4376722 */
1510 WHERE tmp.target_res_asg_id = ra.resource_assignment_id
1511       AND tmp.TRANSACTION_SOURCE_CODE = 'ETC'
1512       AND tmp_ra.target_res_asg_id = tmp.target_res_asg_id
1513       AND tmp_ra.transaction_source_code = 'WORKPLAN_RESOURCES' /* Added for Bug 4369741 */
1514       and NVL(ra.task_id,0) = ta.task_id (+)          /* Added for ER 4376722 */
1515       --and ta.project_id = P_PROJECT_ID              /* Added for ER 4376722 */
1516       AND ra.budget_version_id = P_BUDGET_VERSION_ID  /* Added for Bug 4369741 Perf */
1517       AND ra.project_id = P_PROJECT_ID                /* Added for Bug 4369741 Perf */
1518       AND tmp_ra.resource_assignment_id = tmp.resource_assignment_id /* Added for Bug 4571025 */
1519 GROUP BY tmp.RESOURCE_ASSIGNMENT_ID,
1520          tmp.TARGET_RES_ASG_ID,
1521          tmp.ETC_CURRENCY_CODE,
1522          ra.rate_based_flag,
1523          ra.resource_list_member_id,
1524 		 ra.cbs_element_id, --bug#16791711
1525          ra.task_id,
1526          ra.unit_of_measure,
1527          tmp_ra.etc_method_code,
1528          NVL(ta.billable_flag,'Y'),                  /* Added for ER 4376722 */
1529          tmp_ra.transaction_source_code              /* Added for Bug 4369741 */
1530 UNION ALL
1531 SELECT /*+ INDEX(tmp,PA_FP_CALC_AMT_TMP2_N1)
1532            INDEX(tmp_ra,PA_FP_CALC_AMT_TMP1_N1) */
1533      sum(1*null),
1534      tmp.TARGET_RES_ASG_ID,
1535      tmp.ETC_CURRENCY_CODE,
1536      ra.rate_based_flag,
1537      ra.resource_list_member_id,
1538 	 ra.cbs_element_id, --bug#16791711
1539      ra.task_id,
1540      ra.unit_of_measure,
1541      null, --ra.etc_method_code,
1542      SUM(tmp.ETC_PLAN_QUANTITY),
1543      SUM(tmp.ETC_TXN_RAW_COST),
1544      SUM(tmp.ETC_TXN_BURDENED_COST),
1545      SUM(tmp.ETC_TXN_REVENUE),
1546      NVL(ta.billable_flag,'Y'),                     /* Added for ER 4376722 */
1547      tmp_ra.transaction_source_code                 /* Added for Bug 4369741 */
1548 FROM PA_FP_CALC_AMT_TMP1 tmp_ra,                    /* Added for Bug 4369741 */
1549    PA_FP_CALC_AMT_TMP2 tmp,
1550    PA_RESOURCE_ASSIGNMENTS ra,
1551    pa_tasks ta                                      /* Added for ER 4376722 */
1552 WHERE tmp.target_res_asg_id = ra.resource_assignment_id
1553     AND tmp.TRANSACTION_SOURCE_CODE = 'ETC'
1554     and NVL(ra.task_id,0) = ta.task_id (+)          /* Added for ER 4376722 */
1555     --and ta.project_id = P_PROJECT_ID              /* Added for ER 4376722 */
1556     AND tmp_ra.target_res_asg_id = tmp.target_res_asg_id       /* Added for Bug 4369741 */
1557     AND tmp_ra.transaction_source_code <> 'OPEN_COMMITMENTS'   /* Added for Bug 4369741 */
1558     AND tmp_ra.transaction_source_code <> 'WORKPLAN_RESOURCES' /* Added for Bug 4369741 */
1559     AND ra.budget_version_id = P_BUDGET_VERSION_ID  /* Added for Bug 4369741 Perf */
1560     AND ra.project_id = P_PROJECT_ID                /* Added for Bug 4369741 Perf */
1561     AND tmp_ra.resource_assignment_id = tmp.resource_assignment_id /* Added for Bug 4571025 */
1562 GROUP BY
1563 tmp.TARGET_RES_ASG_ID,
1564        tmp.ETC_CURRENCY_CODE,
1565        ra.rate_based_flag,
1566        ra.resource_list_member_id,
1567 	   ra.cbs_element_id, --bug#16791711
1568        ra.task_id,
1569        ra.unit_of_measure,
1570        null, --ra.etc_method_code,
1571        NVL(ta.billable_flag,'Y'),                   /* Added for ER 4376722 */
1572        tmp_ra.transaction_source_code;              /* Added for Bug 4369741 */
1573 
1574 /* Bug 4369741: Added cursor etc_amts_cur_fp_opt_same to be used in
1575  * the following scenario:
1576  * 1. Target ETC generation source = 'TASK_LEVEL_SEL'
1577  *    l_wp_planning_options_flag = N
1578  *    l_fp_planning_options_flag = Y
1579  * This cursor's SELECT statement uses the etc_amts_cur_wp_fp_opt_same
1580  * cursor's SELECT statement for resources with Financial Plan source
1581  * UNION ALL the etc_amts_cur_wp_fp_opt_diff cursor's SELECT statement for
1582  * resources with non Financial Plan source. */
1583 
1584 CURSOR etc_amts_cur_fp_opt_same IS
1585 SELECT /*+ INDEX(tmp,PA_FP_CALC_AMT_TMP2_N1)
1586            INDEX(tmp_ra,PA_FP_CALC_AMT_TMP1_N1) */
1587      tmp.RESOURCE_ASSIGNMENT_ID,
1588      tmp.TARGET_RES_ASG_ID,
1589      tmp.ETC_CURRENCY_CODE,
1590      ra.rate_based_flag,
1591      ra.resource_list_member_id,
1592 	 ra.cbs_element_id, --bug#16791711
1593      ra.task_id,
1594      ra.unit_of_measure,
1595      tmp_ra.etc_method_code,
1596      SUM(tmp.ETC_PLAN_QUANTITY),
1597      SUM(tmp.ETC_TXN_RAW_COST),
1598      SUM(tmp.ETC_TXN_BURDENED_COST),
1599      SUM(tmp.ETC_TXN_REVENUE),
1600      NVL(ta.billable_flag,'Y'),                       /* Added for ER 4376722 */
1601      tmp_ra.transaction_source_code                   /* Added for Bug 4369741 */
1602 FROM PA_FP_CALC_AMT_TMP1 tmp_ra,
1603      PA_FP_CALC_AMT_TMP2 tmp,
1604      PA_RESOURCE_ASSIGNMENTS ra,
1605      pa_tasks ta                                      /* Added for ER 4376722 */
1606 WHERE tmp.target_res_asg_id = ra.resource_assignment_id
1607       AND tmp.TRANSACTION_SOURCE_CODE = 'ETC'
1608       AND tmp_ra.target_res_asg_id = tmp.target_res_asg_id
1609       AND tmp_ra.transaction_source_code = 'FINANCIAL_PLAN' /* Added for Bug 4369741 */
1610       and NVL(ra.task_id,0) = ta.task_id (+)          /* Added for ER 4376722 */
1611       --and ta.project_id = P_PROJECT_ID              /* Added for ER 4376722 */
1612       AND ra.budget_version_id = P_BUDGET_VERSION_ID  /* Added for Bug 4369741 Perf */
1613       AND ra.project_id = P_PROJECT_ID                /* Added for Bug 4369741 Perf */
1614       AND tmp_ra.resource_assignment_id = tmp.resource_assignment_id /* Added for Bug 4571025 */
1615 GROUP BY tmp.RESOURCE_ASSIGNMENT_ID,
1616          tmp.TARGET_RES_ASG_ID,
1617          tmp.ETC_CURRENCY_CODE,
1618          ra.rate_based_flag,
1619          ra.resource_list_member_id,
1620 		 ra.cbs_element_id, --bug#16791711
1621          ra.task_id,
1622          ra.unit_of_measure,
1623          tmp_ra.etc_method_code,
1624          NVL(ta.billable_flag,'Y'),                  /* Added for ER 4376722 */
1625          tmp_ra.transaction_source_code              /* Added for Bug 4369741 */
1626 UNION ALL
1627 SELECT /*+ INDEX(tmp,PA_FP_CALC_AMT_TMP2_N1)
1628            INDEX(tmp_ra,PA_FP_CALC_AMT_TMP1_N1) */
1629      sum(1*null),
1630      tmp.TARGET_RES_ASG_ID,
1631      tmp.ETC_CURRENCY_CODE,
1632      ra.rate_based_flag,
1633      ra.resource_list_member_id,
1634 	 ra.cbs_element_id, --bug#16791711
1635      ra.task_id,
1636      ra.unit_of_measure,
1637      null, --ra.etc_method_code,
1638      SUM(tmp.ETC_PLAN_QUANTITY),
1639      SUM(tmp.ETC_TXN_RAW_COST),
1640      SUM(tmp.ETC_TXN_BURDENED_COST),
1641      SUM(tmp.ETC_TXN_REVENUE),
1642      NVL(ta.billable_flag,'Y'),                     /* Added for ER 4376722 */
1643      tmp_ra.transaction_source_code                 /* Added for Bug 4369741 */
1644 FROM PA_FP_CALC_AMT_TMP1 tmp_ra,                    /* Added for Bug 4369741 */
1645    PA_FP_CALC_AMT_TMP2 tmp,
1646    PA_RESOURCE_ASSIGNMENTS ra,
1647    pa_tasks ta                                      /* Added for ER 4376722 */
1648 WHERE tmp.target_res_asg_id = ra.resource_assignment_id
1649     AND tmp.TRANSACTION_SOURCE_CODE = 'ETC'
1650     and NVL(ra.task_id,0) = ta.task_id (+)          /* Added for ER 4376722 */
1651     --and ta.project_id = P_PROJECT_ID              /* Added for ER 4376722 */
1652     AND tmp_ra.target_res_asg_id = tmp.target_res_asg_id      /* Added for Bug 4369741 */
1653     AND tmp_ra.transaction_source_code <> 'OPEN_COMMITMENTS'  /* Added for Bug 4369741 */
1654     AND tmp_ra.transaction_source_code <> 'FINANCIAL_PLAN'    /* Added for Bug 4369741 */
1655     AND ra.budget_version_id = P_BUDGET_VERSION_ID  /* Added for Bug 4369741 Perf */
1656     AND ra.project_id = P_PROJECT_ID                /* Added for Bug 4369741 Perf */
1657     AND tmp_ra.resource_assignment_id = tmp.resource_assignment_id /* Added for Bug 4571025 */
1658 GROUP BY
1659 tmp.TARGET_RES_ASG_ID,
1660        tmp.ETC_CURRENCY_CODE,
1661        ra.rate_based_flag,
1662        ra.resource_list_member_id,
1663 	   ra.cbs_element_id, --bug#16791711
1664        ra.task_id,
1665        ra.unit_of_measure,
1666        null, --ra.etc_method_code,
1667        NVL(ta.billable_flag,'Y'),                   /* Added for ER 4376722 */
1668        tmp_ra.transaction_source_code;              /* Added for Bug 4369741 */
1669 
1670 /* Bug 4654157 and 4670253: Variables for enforcing positive total plan quantity */
1671 l_index                        NUMBER; -- index for _tmp tables
1672 l_total_plan_qty               NUMBER;
1673 l_cal_rcost_rate_ovrd_tab_tmp  SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
1674 l_cal_bcost_rate_ovrd_tab_tmp  SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
1675 l_cal_bill_rate_ovrd_tab_tmp   SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
1676 
1677 -- IPM: New Entity ER ------------------------------------------
1678 -- Stores ids of resources with Financial Plan as the ETC generation source
1679 l_fp_ra_id_tab                 SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
1680 -- Stores ids of resources with Workplan as the ETC generation source
1681 l_wp_ra_id_tab                 SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
1682 -- Stores ids of non-billable resources with Financial Plan as the ETC generation source
1683 l_non_billable_fp_ra_id_tab    SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
1684 
1685 -- Defining a table of tables to process tables in a loop.
1686 TYPE SystemPaNumTblTypeTabType
1687 IS TABLE OF SYSTEM.pa_num_tbl_type INDEX BY BINARY_INTEGER;
1688 
1689 l_ra_id_tab_table              SystemPaNumTblTypeTabType;
1690 l_planning_options_flag_tab    PA_PLSQL_DATATYPES.Char1TabTyp;
1691 l_src_version_id_tab           PA_PLSQL_DATATYPES.NumTabTyp;
1692 
1693  /***
1694   * Added in IPM
1695   * Variable   : L_REMOVE_RECORD_FLAG_TAB
1696   * Background : There are a growing number of cases where it is
1697   *              necessary to skip certain records in further
1698   *              processing. The strategy up till now has been
1699   *              to copy non-skipped records into a set of temporary
1700   *              pl/sql tables and then copy back to the original
1701   *              tables. This table is being introduced to reduce
1702   *              the number of times tables are copied back and forth.
1703   * Usage    : - Records in this table should be in a 1-to-1 mapping
1704   *              with planning txns given by the l_cal_ra_id_tab and
1705   *              l_cal_txn_curr_code_tab tables.
1706   *            - By default, initialize all records in this table to 'N'.
1707   *            - Any time it becomes necessary for a planning txn
1708   *              to be skipped in further processing, the corresponding
1709   *              record in this table should be set to 'Y'.
1710   *            - Downstream generation code should check this table
1711   *              at the beginning of logical processing blocks.
1712   *
1713   * Variable   : L_REMOVE_RECORDS_FLAG
1714   * Usage    : - By default, initialize this flag to 'N'.
1715   *            - Set this flag to 'Y' if any record in the associated
1716   *              l_remove_record_flag_tab table is set to 'Y'.
1717   *            - Before the Calculate or Maintain_Actual_Amt_Ra APIs
1718   *              are called, if this flag is 'Y', then records with
1719   *              l_remove_record_flag_tab(i) = 'Y' should be filtered
1720   *              from the main pl/sql tables.
1721   *
1722   * Variable   : L_REV_ONLY_SRC_TXN_FLAG_TAB
1723   * Background : As of IPM, it is possible to plan for just revenue
1724   *              amounts (without cost amounts) in a Cost and Revenue
1725   *              Together version. Pre-IPM, quantity was always set to
1726   *              raw cost for non-rate-based transactions. However, in
1727   *              the revenue only case, we store quantity as revenue.
1728   *              In order to handle this correctly, it is necessary to
1729   *              know if ETC revenue exists without ETC raw cost. This
1730   *              latter piece of information is initially available
1731   *              after querying for the ETC numbers. However, it may
1732   *              be lost once the generation logic begins processing
1733   *              and manipulating the amounts. Hence, this table is being
1734   *              introduced to track which transactions have only ETC
1735   *              revenue amounts.
1736   * Usage    : - Records in this table should be in a 1-to-1 mapping
1737   *              with planning txns given by the l_cal_ra_id_tab and
1738   *              l_cal_txn_curr_code_tab tables.
1739   *            - By default, initialize all records in this table to 'N'.
1740   *            - Set records whose corresponding planning txns have only
1741   *              ETC revenue amounts (i.e. Null ETC raw cost) to 'Y'.
1742   */
1743 
1744 -- Added in IPM to track if a record in the existing set of
1745 -- pl/sql tables needs to be removed.
1746 l_remove_record_flag_tab       PA_PLSQL_DATATYPES.Char1TabTyp;
1747 l_remove_records_flag          VARCHAR2(1);
1748 
1749 -- Added in IPM to track if only ETC revenue is available.
1750 -- Note that this table should be initialized after ETC is
1751 -- fetched but before assignments to ETC raw cost begin.
1752 l_rev_only_src_txn_flag_tab        PA_PLSQL_DATATYPES.Char1TabTyp;
1753 
1754 /* This user-defined exception is used to skip processing of
1755  * a planning transaction within a loop */
1756 continue_loop                 EXCEPTION;
1757 
1758 l_source_version_type_tab      PA_PLSQL_DATATYPES.Char30TabTyp;
1759 l_target_version_type          PA_BUDGET_VERSIONS.VERSION_TYPE%TYPE;
1760 
1761 BEGIN
1762     X_RETURN_STATUS := FND_API.G_RET_STS_SUCCESS;
1763     X_MSG_COUNT := 0;
1764     IF p_pa_debug_mode = 'Y' THEN
1765         pa_debug.set_curr_function( p_function     => 'GEN_FCST_TASK_LEVEL_AMT',
1766                                     p_debug_mode   =>  p_pa_debug_mode);
1767     END IF;
1768     l_latest_published_fwbs_id := PA_PROJECT_STRUCTURE_UTILS.GET_LATEST_FIN_STRUC_VER_ID(P_PROJECT_ID);
1769     l_proj_struc_sharing_code := NVL(PA_PROJECT_STRUCTURE_UTILS.
1770                 get_Structure_sharing_code(P_PROJECT_ID),'SHARE_FULL');
1771         /*IF p_pa_debug_mode = 'Y' THEN
1772              pa_fp_gen_amount_utils.fp_debug
1773             (p_msg         => 'Value of l_latest_published_fwbs_id: '||l_latest_published_fwbs_id,
1774              p_module_name => l_module_name,
1775              p_log_level   => 5);
1776         END IF;*/
1777         /*IF p_pa_debug_mode = 'Y' THEN
1778              pa_fp_gen_amount_utils.fp_debug
1779             (p_msg         => 'Value of l_proj_struc_sharing_code: '||l_proj_struc_sharing_code,
1780              p_module_name => l_module_name,
1781              p_log_level   => 5);
1782         END IF;*/
1783         /*IF p_pa_debug_mode = 'Y' THEN
1784              pa_fp_gen_amount_utils.fp_debug
1785             (p_msg         => 'Value of p_wp_structure_version_id: '||p_wp_structure_version_id,
1786              p_module_name => l_module_name,
1787              p_log_level   => 5);
1788         END IF;*/
1789 
1790     IF p_fp_cols_rec.x_version_type = 'REVENUE' THEN
1791         l_fcst_gen_src_code := p_fp_cols_rec.x_gen_etc_src_code;
1792     END IF;
1793 
1794     IF p_fp_cols_rec.x_version_type = 'REVENUE' AND
1795        l_fcst_gen_src_code IN ('NONE','AVERAGE_ACTUALS') THEN
1796 
1797         IF p_pa_debug_mode = 'Y' THEN
1798             PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
1799                 P_CALLED_MODE       => P_CALLED_MODE,
1800                 P_MSG               => 'Before calling pa_fp_copy_actuals_pub.copy_actuals',
1801                 P_MODULE_NAME       => l_module_name);
1802         END IF;
1803         PA_FP_COPY_ACTUALS_PUB.COPY_ACTUALS
1804               (P_PROJECT_ID               => P_PROJECT_ID,
1805                P_BUDGET_VERSION_ID        => P_BUDGET_VERSION_ID,
1806                P_FP_COLS_REC              => P_fp_cols_rec,
1807                P_END_DATE                 => P_ACTUALS_THRU_DATE,
1808                P_INIT_MSG_FLAG            => 'N',
1809                P_COMMIT_FLAG              => 'N',
1810                X_RETURN_STATUS            => X_RETURN_STATUS,
1811                X_MSG_COUNT                => X_MSG_COUNT,
1812                X_MSG_DATA                 => X_MSG_DATA);
1813         IF p_pa_debug_mode = 'Y' THEN
1814             PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
1815                 P_CALLED_MODE       => P_CALLED_MODE,
1816                 P_MSG               => 'After calling pa_fp_copy_actuals_pub.copy_actuals:'
1817                                        ||x_return_status,
1818                 P_MODULE_NAME       => l_module_name);
1819         END IF;
1820         IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
1821             RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
1822         END IF;
1823 
1824         IF l_fcst_gen_src_code = 'NONE' THEN
1825             IF p_pa_debug_mode = 'Y' THEN
1826                 PA_DEBUG.Reset_Curr_Function;
1827             END IF;
1828             RETURN;
1829         END IF;
1830 
1831         IF l_fcst_gen_src_code = 'AVERAGE_ACTUALS' THEN
1832             IF p_pa_debug_mode = 'Y' THEN
1833                 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
1834                     P_CALLED_MODE       => P_CALLED_MODE,
1835                     P_MSG               => 'Before calling PA_FP_GEN_FCST_AMT_PUB.'||
1836                    'GEN_AVERAGE_OF_ACTUALS_WRP for Revenue only version',
1837                     P_MODULE_NAME       => l_module_name);
1838             END IF;
1839 
1840             /* hr_utility.trace('Values passed to call GEN_AVERAGE_OF_ACTUALS_WRP api');
1841             hr_utility.trace('P_BUDGET_VERSION_ID: '||P_BUDGET_VERSION_ID);
1842             hr_utility.trace('l_curr_task_id: '||l_curr_task_id);
1843             hr_utility.trace('P_ACTUALS_THRU_DATE: '||P_ACTUALS_THRU_DATE);
1844             hr_utility.trace('P_ACTUALS_FROM_PERIOD: '||P_ACTUALS_FROM_PERIOD);
1845             hr_utility.trace('P_ACTUALS_TO_PERIOD: '||P_ACTUALS_TO_PERIOD);
1846             hr_utility.trace('P_ETC_FROM_PERIOD: '||P_ETC_FROM_PERIOD);
1847             hr_utility.trace('P_ETC_TO_PERIOD: '||P_ETC_TO_PERIOD);   */
1848 
1849             /* When the task id is passed as NULL, the wrapper API generates
1850                the ETC numbers for all the target version planning resources
1851                based on the average value of the actual txn data. */
1852 
1853             PA_FP_GEN_FCST_AMT_PUB1.GEN_AVERAGE_OF_ACTUALS_WRP
1854                     (P_BUDGET_VERSION_ID        => P_BUDGET_VERSION_ID,
1855                      P_TASK_ID                  => NULL,
1856                      P_ACTUALS_THRU_DATE        => P_ACTUALS_THRU_DATE,
1857                      P_FP_COLS_REC              => P_FP_COLS_REC,
1858                      P_ACTUALS_FROM_PERIOD      => P_ACTUALS_FROM_PERIOD,
1859                      P_ACTUALS_TO_PERIOD        => P_ACTUALS_TO_PERIOD,
1860                      P_ETC_FROM_PERIOD          => P_ETC_FROM_PERIOD,
1861                      P_ETC_TO_PERIOD            => P_ETC_TO_PERIOD,
1862                      X_RETURN_STATUS            => X_RETURN_STATUS,
1863                      X_MSG_COUNT                => X_MSG_COUNT,
1864                      X_MSG_DATA                 => X_MSG_DATA );
1865               -- hr_utility.trace('Return status after calling GEN_AVERAGE_OF_ACTUALS_WRP: '
1866               -- ||x_return_status);
1867             IF p_pa_debug_mode = 'Y' THEN
1868                 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
1869                     P_CALLED_MODE       => P_CALLED_MODE,
1870                     P_MSG               => 'After calling PA_FP_GEN_FCST_AMT_PUB.'||
1871                                            'GEN_AVERAGE_OF_ACTUALS_WRP: '||x_return_status,
1872                     P_MODULE_NAME       => l_module_name);
1873             END IF;
1874 
1875             IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
1876                 IF p_pa_debug_mode = 'Y' THEN
1877                     PA_DEBUG.Reset_Curr_Function;
1878                 END IF;
1879                 raise PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
1880             END IF;
1881 
1882             IF p_pa_debug_mode = 'Y' THEN
1883                 PA_DEBUG.Reset_Curr_Function;
1884             END IF;
1885 
1886             RETURN;
1887        END IF;       -- for average actual check
1888        /* the processing should continue when the target plan version type is
1889           REVENUE and the ETC Revenue generation source is either 'FINANCIAL_PLAN'
1890           or 'WORKPLAN_RESOURCES'. */
1891 
1892     END IF; -- for revenue check
1893 
1894     IF P_WP_STRUCTURE_VERSION_ID IS NOT NULL THEN
1895         l_wp_version_id := Pa_Fp_wp_gen_amt_utils.get_wp_version_id
1896             ( p_project_id                    => P_PROJECT_ID,
1897               p_plan_type_id                  => -1,
1898               p_proj_str_ver_id               => P_WP_STRUCTURE_VERSION_ID );
1899 
1900         IF P_PA_DEBUG_MODE = 'Y' THEN
1901             PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
1902                 P_CALLED_MODE           => P_CALLED_MODE,
1903                 P_MSG                   => 'Before calling PA_FP_GEN_AMOUNT_UTILS.'||
1904                                            'GET_PLAN_VERSION_DTL',
1905                 P_MODULE_NAME           => l_module_name);
1906         END IF;
1907         PA_FP_GEN_AMOUNT_UTILS.GET_PLAN_VERSION_DTLS(
1908                 P_PROJECT_ID            => P_PROJECT_ID,
1909                 P_BUDGET_VERSION_ID     => l_wp_version_id,
1910                 X_FP_COLS_REC           => l_fp_cols_rec_wp,
1911                 X_RETURN_STATUS         => x_return_status,
1912                 X_MSG_COUNT             => x_msg_count,
1913                 X_MSG_DATA              => x_msg_data);
1914         IF P_PA_DEBUG_MODE = 'Y' THEN
1915             PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
1916                 P_CALLED_MODE           => P_CALLED_MODE,
1917                 P_MSG                   => 'After calling PA_FP_GEN_AMOUNT_UTILS.'||
1918                                            'GET_PLAN_VERSION_DTL:'||x_return_status,
1919                 P_MODULE_NAME           => l_module_name);
1920         END IF;
1921         IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
1922             raise PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
1923         END IF;
1924     END IF;
1925 
1926         /*IF p_pa_debug_mode = 'Y' THEN
1927              pa_fp_gen_amount_utils.fp_debug
1928             (p_msg         => 'Value of p_etc_fp_plan_version_id: '||p_etc_fp_plan_version_id,
1929              p_module_name => l_module_name,
1930              p_log_level   => 5);
1931         END IF;*/
1932 
1933     IF P_ETC_FP_PLAN_VERSION_ID IS NOT NULL THEN
1934         IF P_PA_DEBUG_MODE = 'Y' THEN
1935             PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
1936                 P_CALLED_MODE           => P_CALLED_MODE,
1937                 P_MSG                   => 'Before calling PA_FP_GEN_AMOUNT_UTILS.'||
1938                                            'GET_PLAN_VERSION_DTLS',
1939                 P_MODULE_NAME           => l_module_name);
1940         END IF;
1941         PA_FP_GEN_AMOUNT_UTILS.GET_PLAN_VERSION_DTLS(
1942                 P_PROJECT_ID            => P_PROJECT_ID,
1943                 P_BUDGET_VERSION_ID     => P_ETC_FP_PLAN_VERSION_ID,
1944                 X_FP_COLS_REC           => l_fp_cols_rec_fp,
1945                 X_RETURN_STATUS         => x_return_status,
1946                 X_MSG_COUNT             => x_msg_count,
1947                 X_MSG_DATA              => x_msg_data);
1948         IF P_PA_DEBUG_MODE = 'Y' THEN
1949             PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
1950                 P_CALLED_MODE           => P_CALLED_MODE,
1951                 P_MSG                   => 'After calling PA_FP_GEN_AMOUNT_UTILS.'||
1952                                            'GET_PLAN_VERSION_DTLS: '||x_return_status,
1953                 P_MODULE_NAME           => l_module_name);
1954         END IF;
1955         IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
1956             raise PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
1957         END IF;
1958     END IF;
1959 
1960     l_fp_cols_rec_target :=  P_FP_COLS_REC;
1961     l_calendar_type := l_fp_cols_rec_target.X_TIME_PHASED_CODE;
1962 
1963     /**l_record_type: XXXX
1964       *1st X: 'Y',data will be returned in periods;
1965       *       'N',ITD amounts will be returned;
1966       *2nd X: 'Y',data will be returned by planning resources at
1967       *        entered level(periodic/total);
1968       *3rd X:  'Y',data is returned by tasks;
1969       *4th X:  'N',amt will be gotten at entered level, no rollup is done.**/
1970     IF (l_calendar_type = 'G' OR l_calendar_type = 'P') THEN
1971         l_record_type := 'Y';
1972     ELSE
1973         l_record_type := 'N';
1974     END IF;
1975     l_record_type := l_record_type||'Y'||'Y'||'N';
1976 
1977     --*****Populate pji tmp1,fcst tmp1 tables from workplan version******--
1978     -- hr_utility.trace('P_WP_STRUCTURE_VERSION_ID: '||P_WP_STRUCTURE_VERSION_ID);
1979     IF P_WP_STRUCTURE_VERSION_ID IS NOT NULL THEN
1980         l_resource_list_id := l_fp_cols_rec_wp.X_RESOURCE_LIST_ID;
1981         l_struct_ver_id := l_fp_cols_rec_wp.X_PROJECT_STRUCTURE_VERSION_ID;
1982 
1983         /*IF p_pa_debug_mode = 'Y' THEN
1984              pa_fp_gen_amount_utils.fp_debug
1985             (p_msg         => 'Value of l_resource_list_id: '||l_resource_list_id,
1986              p_module_name => l_module_name,
1987              p_log_level   => 5);
1988         END IF;*/
1989         /*IF p_pa_debug_mode = 'Y' THEN
1990              pa_fp_gen_amount_utils.fp_debug
1991             (p_msg         => 'Value of l_struct_ver_id: '||l_struct_ver_id,
1992              p_module_name => l_module_name,
1993              p_log_level   => 5);
1994         END IF;*/
1995 
1996         IF P_PA_DEBUG_MODE = 'Y' THEN
1997             PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
1998                 P_CALLED_MODE           => P_CALLED_MODE,
1999                 P_MSG                   => 'Before calling PA_FP_GEN_FCST_AMT_PUB1.'||
2000                                            'CALL_SUMM_POP_TMPS',
2001                 P_MODULE_NAME           => l_module_name);
2002         END IF;
2003 
2004 /* hr_utility.trace('1.l_calendar_type: '||l_calendar_type);
2005 hr_utility.trace('1.l_record_type: '||l_record_type);
2006 hr_utility.trace('1.l_resource_list_id: '||l_resource_list_id);
2007 hr_utility.trace('1.l_struct_ver_id: '||l_struct_ver_id);
2008 hr_utility.trace('1.P_ACTUALS_THRU_DATE: '||P_ACTUALS_THRU_DATE);   */
2009 
2010         PA_FP_GEN_FCST_AMT_PUB1.CALL_SUMM_POP_TMPS(
2011                 P_PROJECT_ID            => P_PROJECT_ID,
2012                 P_CALENDAR_TYPE         => l_calendar_type,
2013                 P_RECORD_TYPE           => l_record_type,
2014                 P_RESOURCE_LIST_ID      => l_resource_list_id,
2015                 P_STRUCT_VER_ID         => l_struct_ver_id,
2016                 P_ACTUALS_THRU_DATE     => P_ACTUALS_THRU_DATE,
2017                 P_DATA_TYPE_CODE        => 'ETC_WP',
2018                 X_RETURN_STATUS         => x_return_status,
2019                 X_MSG_COUNT             => x_msg_count,
2020                 X_MSG_DATA              => x_msg_data );
2021         -- hr_utility.trace('1.Status after calling call_summ_pop_tmps api: '||x_return_status);
2022         IF P_PA_DEBUG_MODE = 'Y' THEN
2023             PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
2024                 P_CALLED_MODE           => P_CALLED_MODE,
2025                 P_MSG                   => 'After calling PA_FP_GEN_FCST_AMT_PUB1.'||
2026                                            'CALL_SUMM_POP_TMPS:'||x_return_status,
2027                 P_MODULE_NAME           => l_module_name);
2028         END IF;
2029         --dbms_output.put_line('After calling pji api: '||x_return_status);
2030         IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
2031             raise PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
2032         END IF;
2033      END IF; -- for wp_structure_version_id check
2034 
2035     --*****Populate pji tmp1,fcst tmp1 tables from ETC financial version******--
2036     -- hr_utility.trace('P_ETC_FP_PLAN_VERSION_ID: '||P_ETC_FP_PLAN_VERSION_ID);
2037     IF P_ETC_FP_PLAN_VERSION_ID IS NOT NULL THEN
2038         l_resource_list_id := l_fp_cols_rec_fp.X_RESOURCE_LIST_ID;
2039         l_struct_ver_id := l_fp_cols_rec_fp.X_PROJECT_STRUCTURE_VERSION_ID;
2040 
2041         /*IF p_pa_debug_mode = 'Y' THEN
2042              pa_fp_gen_amount_utils.fp_debug
2043             (p_msg         => 'Value of l_resource_list_id: '||l_resource_list_id,
2044              p_module_name => l_module_name,
2045              p_log_level   => 5);
2046         END IF;*/
2047         /*IF p_pa_debug_mode = 'Y' THEN
2048              pa_fp_gen_amount_utils.fp_debug
2049             (p_msg         => 'Value of l_struct_ver_id: '||l_struct_ver_id,
2050              p_module_name => l_module_name,
2051              p_log_level   => 5);
2052         END IF;*/
2053 
2054         IF P_PA_DEBUG_MODE = 'Y' THEN
2055             PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
2056                 P_CALLED_MODE           => P_CALLED_MODE,
2057                 P_MSG                   => 'Before calling PA_FP_GEN_FCST_AMT_PUB1.'||
2058                                            'CALL_SUMM_POP_TMPS',
2059                 P_MODULE_NAME           => l_module_name);
2060         END IF;
2061 
2062 /* hr_utility.trace('2.l_calendar_type: '||l_calendar_type);
2063 hr_utility.trace('2.l_record_type: '||l_record_type);
2064 hr_utility.trace('2.l_resource_list_id: '||l_resource_list_id);
2065 hr_utility.trace('2.l_struct_ver_id: '||l_struct_ver_id);
2066 hr_utility.trace('2.P_ACTUALS_THRU_DATE: '||P_ACTUALS_THRU_DATE);   */
2067 
2068         PA_FP_GEN_FCST_AMT_PUB1.CALL_SUMM_POP_TMPS(
2069                 P_PROJECT_ID            => P_PROJECT_ID,
2070                 P_CALENDAR_TYPE         => l_calendar_type,
2071                 P_RECORD_TYPE           => l_record_type,
2072                 P_RESOURCE_LIST_ID      => l_resource_list_id,
2073                 P_STRUCT_VER_ID         => l_struct_ver_id,
2074                 P_ACTUALS_THRU_DATE     => P_ACTUALS_THRU_DATE,
2075                 P_DATA_TYPE_CODE        => 'ETC_FP',
2076                 X_RETURN_STATUS         => x_return_status,
2077                 X_MSG_COUNT             => x_msg_count,
2078                 X_MSG_DATA              => x_msg_data );
2079         -- hr_utility.trace('2.Status after calling call_summ_pop_tmps api: '||x_return_status);
2080         IF P_PA_DEBUG_MODE = 'Y' THEN
2081             PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
2082                 P_CALLED_MODE           => P_CALLED_MODE,
2083                 P_MSG                   => 'After calling PA_FP_GEN_FCST_AMT_PUB1.'||
2084                                            'CALL_SUMM_POP_TMPS:'||x_return_status,
2085                 P_MODULE_NAME           => l_module_name);
2086         END IF;
2087         --dbms_output.put_line('After calling pji api: '||x_return_status);
2088         IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
2089             raise PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
2090         END IF;
2091      END IF; -- for P_ETC_FP_PLAN_VERSION_ID check
2092 
2093     --*****Populate pji tmp1,fcst tmp1 tables from target financial version******--
2094     l_resource_list_id := l_fp_cols_rec_target.X_RESOURCE_LIST_ID;
2095     l_struct_ver_id := l_fp_cols_rec_target.X_PROJECT_STRUCTURE_VERSION_ID;
2096         /*IF p_pa_debug_mode = 'Y' THEN
2097              pa_fp_gen_amount_utils.fp_debug
2098             (p_msg         => 'Value of l_resource_list_id: '||l_resource_list_id,
2099              p_module_name => l_module_name,
2100              p_log_level   => 5);
2101         END IF;
2102         IF p_pa_debug_mode = 'Y' THEN
2103              pa_fp_gen_amount_utils.fp_debug
2104             (p_msg         => 'Value of l_struct_ver_id: '||l_struct_ver_id,
2105              p_module_name => l_module_name,
2106              p_log_level   => 5);
2107         END IF;*/
2108     IF P_PA_DEBUG_MODE = 'Y' THEN
2109         PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
2110                 P_CALLED_MODE           => P_CALLED_MODE,
2111                 P_MSG                   => 'Before calling PA_FP_GEN_FCST_AMT_PUB1.'||
2112                                            'CALL_SUMM_POP_TMPS',
2113                 P_MODULE_NAME           => l_module_name);
2114     END IF;
2115 /* hr_utility.trace('3.l_calendar_type: '||l_calendar_type);
2116 hr_utility.trace('3.l_record_type: '||l_record_type);
2117 hr_utility.trace('3.l_resource_list_id: '||l_resource_list_id);
2118 hr_utility.trace('3.l_struct_ver_id: '||l_struct_ver_id);
2119 hr_utility.trace('3.P_ACTUALS_THRU_DATE: '||P_ACTUALS_THRU_DATE);  */
2120     PA_FP_GEN_FCST_AMT_PUB1.CALL_SUMM_POP_TMPS(
2121                 P_PROJECT_ID            => P_PROJECT_ID,
2122                 P_CALENDAR_TYPE         => l_calendar_type,
2123                 P_RECORD_TYPE           => l_record_type,
2124                 P_RESOURCE_LIST_ID      => l_resource_list_id,
2125                 P_STRUCT_VER_ID         => l_struct_ver_id,
2126                 P_ACTUALS_THRU_DATE     => P_ACTUALS_THRU_DATE,
2127                 P_DATA_TYPE_CODE        => 'TARGET_FP',
2128                 X_RETURN_STATUS         => x_return_status,
2129                 X_MSG_COUNT             => x_msg_count,
2130                 X_MSG_DATA              => x_msg_data );
2131     -- hr_utility.trace('3.Status after calling call_summ_pop_tmps api: '||x_return_status);
2132     IF P_PA_DEBUG_MODE = 'Y' THEN
2133         PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
2134                 P_CALLED_MODE           => P_CALLED_MODE,
2135                 P_MSG                   => 'After calling PA_FP_GEN_FCST_AMT_PUB1.'||
2136                                            'CALL_SUMM_POP_TMPS:'||x_return_status,
2137                 P_MODULE_NAME           => l_module_name);
2138     END IF;
2139     --dbms_output.put_line('  --After calling pji get_summarized api: '||x_return_status);
2140     IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
2141         raise PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
2142     END IF;
2143 
2144     /**traverse each node in latest published finanical WBS,
2145       *check for each task's etc source code, do corresponding
2146       *operations.**/
2147 
2148     /* 10/11/2004 ETC Enhancements:
2149        For Top Task planning, copy ETC method from Top Task to all of its children
2150     */
2151     -- hr_utility.trace('FIN_PLAN_LEVEL_CODE: '||l_fp_cols_rec_target.X_FIN_PLAN_LEVEL_CODE);
2152     /* Planning level : top task */
2153     if l_fp_cols_rec_target.X_FIN_PLAN_LEVEL_CODE = 'T' then
2154         OPEN traverse_top_tasks_cur(l_fcst_gen_src_code);
2155         FETCH traverse_top_tasks_cur
2156         BULK COLLECT
2157         INTO  l_top_task_id_tab,
2158               l_top_gen_etc_src_code_tab;
2159         CLOSE traverse_top_tasks_cur;
2160 /* hr_utility.trace('l_top_task_id_tab,count: '||l_top_task_id_tab.count);
2161 hr_utility.trace('l_top_gen_etc_src_code_tab.count: '||l_top_gen_etc_src_code_tab.count); */
2162         l_task_index := 0;
2163         FOR i in 1..l_top_task_id_tab.last LOOP
2164             /* Add the Top Task to pl/sql tables */
2165             l_task_id_tab(l_task_index) := l_top_task_id_tab(i);
2166             l_gen_etc_source_code_tab(l_task_index) := l_top_gen_etc_src_code_tab(i);
2167             l_task_index := l_task_index + 1;
2168             l_temp_top_task_id := l_top_task_id_tab(i);
2169             l_child_task_id_tab.DELETE;
2170 
2171             OPEN traverse_child_tasks_cur;
2172             FETCH traverse_child_tasks_cur
2173             BULK COLLECT
2174             INTO l_child_task_id_tab;
2175             CLOSE traverse_child_tasks_cur;
2176 
2177             -- hr_utility.trace('l_child_task_id_tab.count: '||l_child_task_id_tab.count);
2178             FOR j in 1..l_child_task_id_tab.count LOOP
2179                 /* Add the Top Task's childen to pl/sql tables */
2180                 l_task_id_tab(l_task_index) := l_child_task_id_tab(j);
2181                 l_gen_etc_source_code_tab(l_task_index) := l_top_gen_etc_src_code_tab(i);
2182                 l_task_index := l_task_index + 1;
2183             END LOOP;
2184         END LOOP;
2185     ELSIF   l_fp_cols_rec_target.X_FIN_PLAN_LEVEL_CODE IN ('L','P') THEN
2186         /* Lowest task or Project */
2187         OPEN traverse_tasks_cur(l_fcst_gen_src_code);
2188         FETCH traverse_tasks_cur
2189         BULK COLLECT
2190         INTO  l_task_id_tab,
2191               l_gen_etc_source_code_tab;
2192         CLOSE traverse_tasks_cur;
2193     END IF; -- for plan level check
2194 
2195     IF P_PA_DEBUG_MODE = 'Y' THEN
2196         PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
2197                 P_CALLED_MODE           => P_CALLED_MODE,
2198                 P_MSG                   => 'In traverse cursor, we have how many records?'||
2199                 l_task_id_tab.count,
2200                 P_MODULE_NAME           => l_module_name);
2201     END IF;
2202     IF l_task_id_tab.count = 0 THEN
2203         IF p_pa_debug_mode = 'Y' THEN
2204             PA_DEBUG.Reset_Curr_Function;
2205         END IF;
2206         RETURN;
2207     END IF;
2208 
2209 	-- Changes done for bug#10406949 ,FP Bug#12800007
2210  	--IF (l_proj_struc_sharing_code = 'SPLIT_MAPPING') or (l_proj_struc_sharing_code = 'SPLIT_NO_MAPPING') THEN
2211 	--bug#13829368 modified the if condition to support SHARE_PARTIAL structure_sharing_code
2212 	IF (l_proj_struc_sharing_code = 'SPLIT_MAPPING') or (l_proj_struc_sharing_code = 'SHARE_PARTIAL') THEN
2213  		DELETE FROM pa_map_wp_to_fin_tasks_tmp;
2214  		INSERT INTO pa_map_wp_to_fin_tasks_tmp (SELECT * FROM  pa_map_wp_to_fin_tasks_v WHERE project_id = P_PROJECT_ID);
2215 	END IF;
2216 
2217      /* hr_utility.trace('--Before traverse any task node');
2218     hr_utility.trace('--we have :'||l_task_id_tab.count||' task ids');  */
2219     FOR i IN l_task_id_tab.first..l_task_id_tab.last LOOP
2220         -- hr_utility.trace(i||'th task->');
2221 
2222         l_curr_task_id := l_task_id_tab(i);
2223         l_curr_etc_source := l_gen_etc_source_code_tab(i);
2224 
2225         /* hr_utility.trace('--task id is:'||l_task_id_tab(i));
2226         hr_utility.trace('--curr etc source is fin/wp/wkqty/avgact:'||
2227         l_gen_etc_source_code_tab(i));  */
2228         --dbms_output.put_line('--task id is:'||l_task_id_tab(i));
2229         --dbms_output.put_line('--curr etc source is fin/wp/wkqty/avgact:'||l_gen_etc_source_code_tab(i));
2230        /* IF p_pa_debug_mode = 'Y' THEN
2231              pa_fp_gen_amount_utils.fp_debug
2232             (p_msg         => 'Value of l_curr_etc_source: '||l_curr_etc_source,
2233              p_module_name => l_module_name,
2234              p_log_level   => 5);
2235         END IF;*/
2236         -- hr_utility.trace('l_curr_etc_source: '||l_curr_etc_source);
2237         IF l_curr_etc_source = 'AVERAGE_ACTUALS' THEN
2238             -- Bug 4114589: Processing of tasks with source of Average of Actuals
2239             -- has moved to after the resource mapping and Copy Actuals API call.
2240             l_avg_actuals_task_id_tab(l_avg_actuals_task_id_tab.count+1) := l_curr_task_id;
2241         ELSIF l_curr_etc_source = 'FINANCIAL_PLAN'
2242               OR l_curr_etc_source = 'WORKPLAN_RESOURCES' THEN
2243             l_proceed_flag := 'Y';
2244             IF l_curr_etc_source = 'WORKPLAN_RESOURCES' AND
2245                l_proj_struc_sharing_code = 'SPLIT_NO_MAPPING' THEN
2246                 IF l_entered_flag = 'Y' THEN
2247                     l_proceed_flag := 'N';
2248                 ELSE
2249                     l_proceed_flag := 'Y';
2250                     l_entered_flag := 'Y';
2251                 END IF;
2252             END IF;
2253             IF l_proceed_flag = 'Y' THEN
2254                 IF l_curr_etc_source = 'FINANCIAL_PLAN' THEN
2255                     l_calling_context := 'FINANCIAL_PLAN';
2256                 ELSIF l_curr_etc_source = 'WORKPLAN_RESOURCES' THEN
2257                     l_calling_context := 'WORK_PLAN';
2258                 END IF;
2259 
2260                 /*IF p_pa_debug_mode = 'Y' THEN
2261                      pa_fp_gen_amount_utils.fp_debug
2262                     (p_msg         => 'Value of l_calling_context: '||l_calling_context,
2263                      p_module_name => l_module_name,
2264                      p_log_level   => 5);
2265                 END IF;*/
2266 
2267                 /**Calling the total_plan_txn_amts api to get the total
2268                   *transaction amts for a given task**/
2269                 IF P_PA_DEBUG_MODE = 'Y' THEN
2270                     PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
2271                         P_CALLED_MODE       => P_CALLED_MODE,
2272                         P_MSG               => 'Before calling pa_fp_gen_fcst_amt_pub.'||
2273                                                'get_total_plan_txn_amts',
2274                         P_MODULE_NAME       => l_module_name);
2275                 END IF;
2276                 --dbms_output.put_line('--Before GET_TOTAL--');
2277                 --dbms_output.put_line('--P_PROJECT_ID:'||p_project_id);
2278                 --dbms_output.put_line('--P_BUDGET_VERSION_ID:'||P_BUDGET_VERSION_ID);
2279                 --dbms_output.put_line('--l_wp_version_id:'||l_wp_version_id);
2280                 --dbms_output.put_line('--P_ETC_FP_PLAN_VERSION_ID:'||P_ETC_FP_PLAN_VERSION_ID);
2281                 --dbms_output.put_line('--l_fp_cols_rec_wp:'||l_fp_cols_rec_wp.X_PROJ_FP_OPTIONS_ID);
2282                 --dbms_output.put_line('--l_fp_cols_rec_fp:'||l_fp_cols_rec_fp.X_PROJ_FP_OPTIONS_ID);
2283                 --dbms_output.put_line('--P_FP_COLS_REC:'||P_FP_COLS_REC.X_PROJ_FP_OPTIONS_ID);
2284                 --dbms_output.put_line('--l_curr_task_id:'||l_curr_task_id);
2285                 --dbms_output.put_line('--l_calling_context:'||l_calling_context);
2286 
2287                 BEGIN
2288                 PA_FP_GEN_FCST_AMT_PVT.GET_TOTAL_PLAN_TXN_AMTS
2289                       ( P_PROJECT_ID                => P_PROJECT_ID,
2290                         P_BUDGET_VERSION_ID         => P_BUDGET_VERSION_ID,
2291                         P_BV_ID_ETC_WP              => l_wp_version_id,
2292                         P_BV_ID_ETC_FP              => P_ETC_FP_PLAN_VERSION_ID,
2293                         P_FP_COLS_REC_ETC_WP        => l_fp_cols_rec_wp,
2294                         P_FP_COLS_REC_ETC_FP        => l_fp_cols_rec_fp,
2295                         P_FP_COLS_REC               => P_FP_COLS_REC,
2296                         P_TASK_ID                   => l_curr_task_id,
2297 			    P_STRUCTURE_SHARING_CODE    => l_proj_struc_sharing_code,   -- Changes done for bug#10406949 ,FP Bug#12800007
2298                         --P_RES_LIST_MEMBER_ID      => NULL,
2299                         --P_TXN_CURRENCY_CODE       => NULL,
2300                         P_LATEST_PUBLISH_FP_WBS_ID  => l_latest_published_fwbs_id,
2301                         P_CALLING_CONTEXT           => l_calling_context,
2302                         X_TXN_AMT_REC               => l_txn_amt_rec,
2303                         X_RETURN_STATUS             => x_return_status,
2304                         X_MSG_COUNT                 => x_msg_count,
2305                         X_MSG_DATA                  => x_msg_data );
2306                 EXCEPTION
2307                 WHEN no_data_found THEN
2308                     IF p_pa_debug_mode = 'Y' THEN
2309                          PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
2310                             P_CALLED_MODE           => P_CALLED_MODE,
2311                             P_MSG                   => 'PA_FP_GEN_FCST_AMT_PVT.GET_TOTAL_PLAN_TXN_AMTS '||
2312                                                        'throws out no_data_found exception',
2313                             P_MODULE_NAME           => l_module_name);
2314                     END IF;
2315                 END;
2316                 IF p_pa_debug_mode = 'Y' THEN
2317                     PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
2318                         P_CALLED_MODE       => P_CALLED_MODE,
2319                         P_MSG               => 'After calling pa_fp_gen_fcst_amt_pub.'||
2320                                                'get_total_plan_txn_amts: '||x_return_status,
2321                         P_MODULE_NAME       => l_module_name);
2322                 END IF;
2323                 IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
2324                     IF p_pa_debug_mode = 'Y' THEN
2325                         PA_DEBUG.Reset_Curr_Function;
2326                     END IF;
2327                     raise PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
2328                 END IF;
2329             END IF;
2330         ELSIF l_curr_etc_source = 'WORK_QUANTITY' THEN
2331             /*IF p_pa_debug_mode = 'Y' THEN
2332                  pa_fp_gen_amount_utils.fp_debug
2333                 (p_msg         => 'Value of l_curr_etc_source: '||l_curr_etc_source,
2334                  p_module_name => l_module_name,
2335                  p_log_level   => 5);
2336             END IF;
2337             IF p_pa_debug_mode = 'Y' THEN
2338                  pa_fp_gen_amount_utils.fp_debug
2339                 (p_msg         => 'Value of l_work_qty_cnt: '||l_work_qty_cnt,
2340                  p_module_name => l_module_name,
2341                  p_log_level   => 5);
2342             END IF;
2343             IF p_pa_debug_mode = 'Y' THEN
2344                  pa_fp_gen_amount_utils.fp_debug
2345                 (p_msg         => 'Value of l_proj_struc_sharing_code: '||l_proj_struc_sharing_code,
2346                  p_module_name => l_module_name,
2347                  p_log_level   => 5);
2348             END IF;*/
2349             IF l_work_qty_cnt = 0 THEN
2350                 IF l_proj_struc_sharing_code = 'SPLIT_NO_MAPPING' THEN
2351                     l_work_qty_cnt := 1;
2352                     l_curr_task_id := NULL;
2353                 END IF;
2354                 IF P_PA_DEBUG_MODE = 'Y' THEN
2355                     PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
2356                         P_CALLED_MODE   => P_CALLED_MODE,
2357                         P_MSG           => 'Before calling pa_fp_gen_fcst_amt_pub1.'||
2358                                            'GET_ETC_WORK_QTY_AMTS',
2359                         P_MODULE_NAME   => l_module_name);
2360                 END IF;
2361                 /*WORK_QTY_AMTS are generated at task level, so P_RESOURCE_ASSIGNMENT and
2362                   P_RESOURCE_LIST_MEMBER_ID are not needed*/
2363                 PA_FP_GEN_FCST_AMT_PUB1.GET_ETC_WORK_QTY_AMTS(
2364                         P_PROJECT_ID                    => P_PROJECT_ID,
2365                         P_PROJ_CURRENCY_CODE            => P_FP_COLS_REC.X_PROJECT_CURRENCY_CODE,
2366                         P_BUDGET_VERSION_ID             => P_BUDGET_VERSION_ID,
2367                         P_TASK_ID                       => l_curr_task_id,
2368                         P_TARGET_RES_LIST_ID            => l_fp_cols_rec_target.X_RESOURCE_LIST_ID,
2369                         P_ACTUALS_THRU_DATE             => P_ACTUALS_THRU_DATE,
2370                         P_FP_COLS_REC                   => P_FP_COLS_REC,
2371                         P_WP_STRUCTURE_VERSION_ID       => P_WP_STRUCTURE_VERSION_ID,
2372                         X_RETURN_STATUS                 => x_return_status,
2373                         X_MSG_COUNT                     => x_msg_count,
2374                         X_MSG_DATA                      => x_msg_data);
2375                 IF p_pa_debug_mode = 'Y' THEN
2376                     PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
2377                         P_CALLED_MODE   => P_CALLED_MODE,
2378                         P_MSG           => 'After calling pa_fp_gen_fcst_amt_pub1.'||
2379                                            'GET_ETC_WORK_QTY_AMTS: '||x_return_status,
2380                         P_MODULE_NAME   => l_module_name);
2381                 END IF;
2382                 IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
2383                     raise PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
2384                 END IF;
2385             END IF;
2386         ELSIF l_curr_etc_source = 'NONE' THEN
2387             IF P_PA_DEBUG_MODE = 'Y' THEN
2388                 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
2389                     P_CALLED_MODE       => P_CALLED_MODE,
2390                     P_MSG               => 'Before calling pa_fp_gen_fcst_amt_pub1.none_etc_src',
2391                     P_MODULE_NAME       => l_module_name);
2392             END IF;
2393             PA_FP_GEN_FCST_AMT_PUB1.NONE_ETC_SRC(
2394                         P_PROJECT_ID            => P_PROJECT_ID,
2395                         P_BUDGET_VERSION_ID     => P_BUDGET_VERSION_ID,
2396                         P_RESOURCE_LIST_ID      => l_fp_cols_rec_target.X_RESOURCE_LIST_ID,
2397                         P_TASK_ID               => l_curr_task_id,
2398                         X_RETURN_STATUS         => x_return_status,
2399                         X_MSG_COUNT             => x_msg_count,
2400                         X_MSG_DATA              => x_msg_data );
2401             IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
2402                 IF p_pa_debug_mode = 'Y' THEN
2403                     PA_DEBUG.Reset_Curr_Function;
2404                 END IF;
2405                 raise PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
2406             END IF;
2407         END IF;
2408     END LOOP;
2409 
2410 	-- Changes done for bug#10406949 , FP Bug#12800007
2411 	   	DELETE FROM pa_map_wp_to_fin_tasks_tmp;
2412 
2413     --Bug 6407972
2414     --Bug 5929269. If the plan version into whihc amounts are being forecasted has
2415     --Top Task Planning level then the task ids in PA_FP_FCST_GEN_TMP1 should be updated
2416     --to the top task ids since the ETC should now be calculated for top tasks
2417     IF p_fp_cols_rec.x_fin_plan_level_code = 'T' THEN
2418 
2419         UPDATE pa_fp_fcst_gen_tmp1 tmp
2420         SET    tmp.project_element_id = (SELECT pt.top_task_id
2421                                          FROM   pa_tasks pt
2422                                          WHERE  tmp.project_element_id = pt.task_id)
2423         WHERE  tmp.data_type_code     = 'ETC_FP'
2424         AND    tmp.project_element_id
2425         IN
2426         (SELECT  pt.task_id
2427          FROM    pa_tasks pt
2428          WHERE   pt.top_task_id  IN (SELECT tmp1.task_id
2429                                      FROM   pa_fp_calc_amt_tmp1 tmp1
2430                                      WHERE  tmp1.budget_version_id =
2431                                             p_etc_fp_plan_version_id)
2432          AND     pt.task_id NOT IN (SELECT tmp1.task_id
2433                                     FROM   pa_fp_calc_amt_tmp1 tmp1
2434                                     WHERE  tmp1.budget_version_id =
2435                                            p_etc_fp_plan_version_id)
2436          AND     pt.project_id=p_project_id
2437          AND     pt.task_id<>pt.top_task_id
2438         );
2439 
2440     END IF;
2441 
2442     /* Call resource mapping API on source transaction resources.
2443        The planning resources from the generation source must be mapped to the
2444        target forecast verion resource list before calculating the ETC numbers.
2445        The ETC calculation is based on the rate based flag of the target
2446        planning resource. */
2447 
2448     IF p_pa_debug_mode = 'Y' THEN
2449         PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
2450             P_CALLED_MODE       => P_CALLED_MODE,
2451             P_MSG               => 'Before calling pa_fp_gen_fcst_rmap_pkg.fcst_src_txns_rmap',
2452             P_MODULE_NAME       => l_module_name);
2453     END IF;
2454         -- hr_utility.trace('before fcst src txns rmap');
2455     PA_FP_GEN_FCST_RMAP_PKG.FCST_SRC_TXNS_RMAP
2456           (P_PROJECT_ID               => P_PROJECT_ID,
2457            P_BUDGET_VERSION_ID        => P_BUDGET_VERSION_ID,
2458            P_FP_COLS_REC              => P_fp_cols_rec,
2459            X_RETURN_STATUS            => X_RETURN_STATUS,
2460            X_MSG_COUNT                => X_MSG_COUNT,
2461            X_MSG_DATA                 => X_MSG_DATA);
2462         -- hr_utility.trace('after fcst src txns rmap');
2463     IF p_pa_debug_mode = 'Y' THEN
2464         PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
2465             P_CALLED_MODE       => P_CALLED_MODE,
2466             P_MSG               => 'After calling pa_fp_gen_fcst_rmap_pkg.fcst_src_txns_rmap'
2467                                    ||x_return_status,
2468             P_MODULE_NAME       => l_module_name);
2469     END IF;
2470     IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
2471         RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
2472     END IF;
2473 
2474     -- Bug 4114589: Moved from beginning of GENERATE_FCST_AMT_WRP to after
2475     -- resource mapping, which also calls CREATE_RES_ASG and UPDATE_RES_ASG
2476     -- via call to MAINTAIN_RES_ASG, so that planning dates from the source
2477     -- are honored when possible, since resources created by the Copy Actuals
2478     -- API use task/project-level default dates.
2479     IF p_pa_debug_mode = 'Y' THEN
2480         PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
2481             P_CALLED_MODE       => P_CALLED_MODE,
2482             P_MSG               => 'Before calling pa_fp_copy_actuals_pub.copy_actuals',
2483             P_MODULE_NAME       => l_module_name);
2484     END IF;
2485     PA_FP_COPY_ACTUALS_PUB.COPY_ACTUALS
2486           (P_PROJECT_ID               => P_PROJECT_ID,
2487            P_BUDGET_VERSION_ID        => P_BUDGET_VERSION_ID,
2488            P_FP_COLS_REC              => P_fp_cols_rec,
2489            P_END_DATE                 => P_ACTUALS_THRU_DATE,
2490            P_INIT_MSG_FLAG            => 'N',
2491            P_COMMIT_FLAG              => 'N',
2492            X_RETURN_STATUS            => X_RETURN_STATUS,
2493            X_MSG_COUNT                => X_MSG_COUNT,
2494            X_MSG_DATA                 => X_MSG_DATA);
2495     IF p_pa_debug_mode = 'Y' THEN
2496         PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
2497             P_CALLED_MODE       => P_CALLED_MODE,
2498             P_MSG               => 'After calling pa_fp_copy_actuals_pub.copy_actuals:'
2499                                    ||x_return_status,
2500             P_MODULE_NAME       => l_module_name);
2501     END IF;
2502     IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
2503         RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
2504     END IF;
2505 
2506     -- Now that we have copied the actuals, we do the delayed processing
2507     -- for tasks with source of Average of Actuals.
2508     FOR i IN 1..l_avg_actuals_task_id_tab.count LOOP
2509         IF p_pa_debug_mode = 'Y' THEN
2510             PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
2511                 P_CALLED_MODE       => P_CALLED_MODE,
2512                 P_MSG               => 'Before calling PA_FP_GEN_FCST_AMT_PUB.'||
2513                                        'GEN_AVERAGE_OF_ACTUALS_WRP',
2514                 P_MODULE_NAME       => l_module_name);
2515         END IF;
2516         /* hr_utility.trace('Values passed to call GEN_AVERAGE_OF_ACTUALS_WRP api');
2517         hr_utility.trace('P_BUDGET_VERSION_ID: '||P_BUDGET_VERSION_ID);
2518         hr_utility.trace('l_curr_task_id: '||l_curr_task_id);
2519         hr_utility.trace('P_ACTUALS_THRU_DATE: '||P_ACTUALS_THRU_DATE);
2520         hr_utility.trace('P_ACTUALS_FROM_PERIOD: '||P_ACTUALS_FROM_PERIOD);
2521         hr_utility.trace('P_ACTUALS_TO_PERIOD: '||P_ACTUALS_TO_PERIOD);
2522         hr_utility.trace('P_ETC_FROM_PERIOD: '||P_ETC_FROM_PERIOD);
2523         hr_utility.trace('P_ETC_TO_PERIOD: '||P_ETC_TO_PERIOD);   */
2524         PA_FP_GEN_FCST_AMT_PUB1.GEN_AVERAGE_OF_ACTUALS_WRP
2525                 (P_BUDGET_VERSION_ID        => P_BUDGET_VERSION_ID,
2526                  P_TASK_ID                  => l_avg_actuals_task_id_tab(i),
2527                  P_ACTUALS_THRU_DATE        => P_ACTUALS_THRU_DATE,
2528                  P_FP_COLS_REC              => P_FP_COLS_REC,
2529                  P_ACTUALS_FROM_PERIOD      => P_ACTUALS_FROM_PERIOD,
2530                  P_ACTUALS_TO_PERIOD        => P_ACTUALS_TO_PERIOD,
2531                  P_ETC_FROM_PERIOD          => P_ETC_FROM_PERIOD,
2532                  P_ETC_TO_PERIOD            => P_ETC_TO_PERIOD,
2533                  X_RETURN_STATUS            => X_RETURN_STATUS,
2534                  X_MSG_COUNT                => X_MSG_COUNT,
2535                  X_MSG_DATA                 => X_MSG_DATA );
2536           -- hr_utility.trace('Return status after calling GEN_AVERAGE_OF_ACTUALS_WRP: '
2537           -- ||x_return_status);
2538         IF p_pa_debug_mode = 'Y' THEN
2539             PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
2540                 P_CALLED_MODE       => P_CALLED_MODE,
2541                 P_MSG               => 'After calling PA_FP_GEN_FCST_AMT_PUB.'||
2542                                        'GEN_AVERAGE_OF_ACTUALS_WRP: '||x_return_status,
2543                 P_MODULE_NAME       => l_module_name);
2544         END IF;
2545         IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
2546             IF p_pa_debug_mode = 'Y' THEN
2547                 PA_DEBUG.Reset_Curr_Function;
2548             END IF;
2549             raise PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
2550         END IF;
2551     END LOOP;
2552     -- Bug 4114589: End changes.
2553 
2554     --dbms_output.put_line('--next, we will get all etc amts for each task');
2555     /***********************************************************
2556         *Above gets all the plan amounts for any specifc tasks
2557         *Below will get all the etc amounts for the tasks.
2558      ***********************************************************/
2559 
2560     /**From latest approved version, by calling gen_map_bv_to_target_rl
2561       *we get PA_FP_CALC_AMT_TMP3 popuated, from it, we can get the
2562       *baselined cost**/
2563 
2564     /* select count(*) into l_test from Pa_fp_CALC_AMT_TMP1;
2565     hr_utility.trace('fp calc amt tmp1 tab count '||l_test);
2566     select count(*) into l_test from Pa_fp_CALC_AMT_TMP2;
2567     hr_utility.trace('fp calc amt tmp2 tab count '||l_test);   */
2568 
2569     DELETE FROM PA_FP_CALC_AMT_TMP3;
2570 /* the following code is commented. We are not going to use the
2571    baselined budget cost for ETC gen method Plan to Complete. */
2572     /* IF P_PA_DEBUG_MODE = 'Y' THEN
2573         PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
2574             P_CALLED_MODE       => P_CALLED_MODE,
2575             P_MSG               => 'Before calling PA_FIN_PLAN_UTILS.'||
2576                                    'Get_Appr_Cost_Plan_Type_Info',
2577             P_MODULE_NAME       => l_module_name);
2578     END IF;
2579     PA_FIN_PLAN_UTILS.Get_Appr_Cost_Plan_Type_Info(
2580          p_project_id               => P_PROJECT_ID,
2581          x_plan_type_id             => l_fin_plan_type_id,
2582          x_return_status            => x_return_status,
2583          x_msg_count                => x_msg_count,
2584          x_msg_data                 => x_msg_data);
2585 
2586     --dbms_output.put_line('l_fin_plan_type_id is '||l_fin_plan_type_id);
2587     IF P_PA_DEBUG_MODE = 'Y' THEN
2588         PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
2589             P_CALLED_MODE       => P_CALLED_MODE,
2590             P_MSG               => 'After calling PA_FIN_PLAN_UTILS.'||
2591                                    'Get_Appr_Cost_Plan_Type_Info: '||x_return_status,
2592             P_MODULE_NAME       => l_module_name);
2593     END IF;
2594     IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
2595         RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
2596     END IF;
2597     IF (l_fin_plan_type_id IS NULL) THEN
2598         PA_UTILS.ADD_MESSAGE( p_app_short_name => 'PA',
2599                               p_msg_name       => 'PA_FP_GENFCST_NO_COST_PTYPE');
2600         RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
2601     END IF;
2602 
2603     SELECT DECODE( FIN_PLAN_PREFERENCE_CODE,'COST_ONLY', 'COST' ,
2604                    'COST_AND_REV_SEP', 'COST',
2605                    'COST_AND_REV_SAME', 'ALL') INTO l_version_type
2606     FROM pa_proj_fp_options
2607     WHERE fin_plan_type_id = l_fin_plan_type_id
2608           AND fin_plan_option_level_code = 'PLAN_TYPE'
2609           AND project_id = P_PROJECT_ID;
2610 
2611     --dbms_output.put_line('--l_version_type: '||l_version_type);
2612     IF P_PA_DEBUG_MODE = 'Y' THEN
2613         PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
2614             P_CALLED_MODE       => P_CALLED_MODE,
2615             P_MSG               => 'Before calling PA_FP_GEN_AMOUNT_UTILS.'||
2616                                    'Get_Curr_Original_Version_Info',
2617             P_MODULE_NAME       => l_module_name);
2618     END IF;
2619     PA_FP_GEN_AMOUNT_UTILS.Get_Curr_Original_Version_Info(
2620           p_project_id              => P_PROJECT_ID,
2621           p_fin_plan_type_id        => l_fin_plan_type_id,
2622           p_version_type            => l_version_type,
2623           p_status_code             => 'CURRENT_APPROVED',
2624           x_fp_options_id           => l_approved_fp_options_id,
2625           x_fin_plan_version_id     => l_approved_fp_version_id,
2626           x_return_status           => x_return_status,
2627           x_msg_count               => x_msg_count,
2628           x_msg_data                => x_msg_data);
2629     --dbms_output.put_line('--!after PA_FP_GEN_AMOUNT_UTILS.Get_Curr_Original_Version_Info'||x_return_status);
2630   --dbms_output.put_line('--l_approved_fp_version_id is:'||l_approved_fp_version_id);
2631     IF P_PA_DEBUG_MODE = 'Y' THEN
2632         PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
2633             P_CALLED_MODE       => P_CALLED_MODE,
2634             P_MSG               => 'After calling PA_FP_GEN_AMOUNT_UTILS.'||
2635                                    'Get_Curr_Original_Version_Info: '||x_return_status,
2636             P_MODULE_NAME       => l_module_name);
2637     END IF;
2638     IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
2639         RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
2640     END IF;
2641     IF (l_approved_fp_version_id IS NULL) THEN
2642       --dbms_output.put_line('--l_approved_fp_version_id is NULL');
2643         PA_UTILS.ADD_MESSAGE( p_app_short_name => 'PA',
2644                               p_msg_name       => 'PA_FP_GENFCST_NO_APPR_FPVER');
2645         RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
2646     END IF;
2647 
2648     IF P_PA_DEBUG_MODE = 'Y' THEN
2649         PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
2650             P_CALLED_MODE       => P_CALLED_MODE,
2651             P_MSG               => 'Before calling PA_FP_GEN_AMOUNT_UTILS.'||
2652                                    'GET_PLAN_VERSION_DTLS',
2653             P_MODULE_NAME       => l_module_name);
2654     END IF;
2655   --dbms_output.put_line('--before PA_FP_GEN_AMOUNT_UTILS.GET_PLAN_VERSION_DTLS');
2656     PA_FP_GEN_AMOUNT_UTILS.GET_PLAN_VERSION_DTLS(
2657                 P_PROJECT_ID            => P_PROJECT_ID,
2658                 P_BUDGET_VERSION_ID     => l_approved_fp_version_id,
2659                 X_FP_COLS_REC           => l_fp_cols_rec_approved,
2660                 X_RETURN_STATUS         => x_return_status,
2661                 X_MSG_COUNT             => x_msg_count,
2662                 X_MSG_DATA              => x_msg_data);
2663     --dbms_output.put_line('--after PA_FP_GEN_AMOUNT_UTILS.GET_PLAN_VERSION_DTLS :'||x_return_status);
2664     IF P_PA_DEBUG_MODE = 'Y' THEN
2665         PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
2666             P_CALLED_MODE       => P_CALLED_MODE,
2667             P_MSG               => 'After calling PA_FP_GEN_AMOUNT_UTILS.'||
2668                                    'GET_PLAN_VERSION_DTLS: '||x_return_status,
2669             P_MODULE_NAME       => l_module_name);
2670     END IF;
2671     IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
2672         RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
2673     END IF;
2674 
2675     IF P_PA_DEBUG_MODE = 'Y' THEN
2676         PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
2677             P_CALLED_MODE       => P_CALLED_MODE,
2678             P_MSG               => 'Before calling PA_FP_MAP_BV_PUB.'||
2679                                    'GEN_MAP_BV_TO_TARGET_RL',
2680             P_MODULE_NAME       => l_module_name);
2681     END IF;
2682   --dbms_output.put_line('--before MAP_BV_TO_TARGET_RL');
2683 --hr_utility.trace('bef call PA_FP_MAP_BV_PUB.GEN_MAP_BV_TO_TARGET_RL api');
2684     PA_FP_MAP_BV_PUB.GEN_MAP_BV_TO_TARGET_RL
2685          (P_SOURCE_BV_ID            => l_approved_fp_version_id,
2686           P_TARGET_FP_COLS_REC      => P_FP_COLS_REC,
2687           P_ETC_FP_COLS_REC         => l_fp_cols_rec_wp,
2688           P_CB_FP_COLS_REC          => l_fp_cols_rec_approved,
2689           X_RETURN_STATUS           => x_return_status,
2690           X_MSG_COUNT               => x_msg_count,
2691           X_MSG_DATA                => x_msg_data);
2692   --dbms_output.put_line('--PA_FP_MAP_BV_PUB.GEN_MAP_BV_TO_TARGET_RL:' ||x_return_status);
2693 --hr_utility.trace('aft call GEN_MAP_BV_TO_TARGET_RL api:'||x_return_status);
2694     IF P_PA_DEBUG_MODE = 'Y' THEN
2695         PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
2696             P_CALLED_MODE       => P_CALLED_MODE,
2697             P_MSG               => 'After calling PA_FP_MAP_BV_PUB.'||
2698                                    'GEN_MAP_BV_TO_TARGET_RL: '||x_return_status,
2699             P_MODULE_NAME       => l_module_name);
2700     END IF;
2701     IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
2702         RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
2703     END IF;
2704 
2705     IF P_PA_DEBUG_MODE = 'Y' THEN
2706         PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
2707             P_CALLED_MODE       => P_CALLED_MODE,
2708             P_MSG               => 'Before calling PA_FP_MAP_BV_PUB.'||
2709                                    'GEN_MAP_BV_TO_TARGET_RL(2nd time)',
2710             P_MODULE_NAME       => l_module_name);
2711     END IF;
2712     PA_FP_MAP_BV_PUB.GEN_MAP_BV_TO_TARGET_RL
2713          (P_SOURCE_BV_ID            => l_approved_fp_version_id,
2714           P_TARGET_FP_COLS_REC      => P_FP_COLS_REC,
2715           P_ETC_FP_COLS_REC         => l_fp_cols_rec_fp,
2716           P_CB_FP_COLS_REC          => l_fp_cols_rec_approved,
2717           X_RETURN_STATUS           => x_return_status,
2718           X_MSG_COUNT               => x_msg_count,
2719           X_MSG_DATA                => x_msg_data);
2720     --tmp3's basedline value will be used in method api
2721     IF P_PA_DEBUG_MODE = 'Y' THEN
2722         PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
2723             P_CALLED_MODE       => P_CALLED_MODE,
2724             P_MSG               => 'After calling PA_FP_MAP_BV_PUB.'||
2725                                    'GEN_MAP_BV_TO_TARGET_RL:(2nd time) '||x_return_status,
2726             P_MODULE_NAME       => l_module_name);
2727     END IF;
2728     IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
2729         RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
2730     END IF; */
2731 /*End baselined comments*/
2732 
2733     /* For Forecast Generation of Revenue-only plans, we should honor the
2734      * target's gen source code instead of the gen source codes specified
2735      * at the task level. */
2736     IF p_fp_cols_rec.x_version_type = 'REVENUE' THEN
2737         l_gen_etc_source_code_override := l_fcst_gen_src_code;
2738     ELSE
2739         l_gen_etc_source_code_override := NULL;
2740     END IF;
2741 
2742     --select count(*) into l_count_tmp from PA_FP_CALC_AMT_TMP1;
2743     --dbms_output.put_line('l_count_tmp:'||l_count_tmp);
2744     --hr_utility.trace('bef cursor for etc amt calc');
2745     OPEN traverse_tasks_rlm_cur(l_gen_etc_source_code_override);
2746     FETCH traverse_tasks_rlm_cur
2747     BULK COLLECT
2748     INTO  l_task_id_tab2,
2749           l_gen_etc_source_code_tab2,
2750           l_src_ra_id_tab2,
2751           l_tgt_ra_id_tab2,
2752           l_rlm_id_tab2,
2753 		  l_cbs_id_tab2, --bug#16791711
2754           l_etc_method_tab2;
2755     CLOSE traverse_tasks_rlm_cur;
2756             /*IF p_pa_debug_mode = 'Y' THEN
2757                  pa_fp_gen_amount_utils.fp_debug
2758                 (p_msg         => 'Value of l_ra_id_tab2.count: '||l_ra_id_tab2.count,
2759                  p_module_name => l_module_name,
2760                  p_log_level   => 5);
2761             END IF;*/
2762     --dbms_output.put_line('++l_ra_id_tab2.count:'||l_ra_id_tab2.count);
2763     --dbms_output.put_line('++l_ra_id_tab2.first:'||l_ra_id_tab2.first);
2764     --dbms_output.put_line('++l_ra_id_tab2.last:'||l_ra_id_tab2.last);
2765     IF P_PA_DEBUG_MODE = 'Y' THEN
2766         PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
2767             P_CALLED_MODE       => P_CALLED_MODE,
2768             P_MSG               => 'second traverse cursor, we have how many records?'
2769                                    ||l_src_ra_id_tab2.count,
2770             P_MODULE_NAME       => l_module_name);
2771     END IF;
2772 
2773     /*Check the planning options */
2774 
2775     -- Bug 4369741: Initialize planning options flags to 'N'
2776     l_wp_planning_options_flag := 'N';
2777     l_fp_planning_options_flag := 'N';
2778 
2779     /* Bug 4369741: Call the COMPARE_ETC_SRC_TARGET_FP_OPT API separately
2780      * for Workplan and Financial Plan source(s) as needed and store the
2781      * results in l_wp_planning_options_flag and l_fp_planning_options_flag. */
2782 
2783     IF l_wp_version_id IS NOT NULL AND
2784        p_fp_cols_rec.x_gen_etc_src_code IN ('WORKPLAN_RESOURCES','TASK_LEVEL_SEL') THEN
2785 
2786         IF P_PA_DEBUG_MODE = 'Y' THEN
2787             PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
2788                 P_CALLED_MODE => P_CALLED_MODE,
2789                 P_MSG  => 'Before calling PA_FP_FCST_GEN_AMT_UTILS.'||
2790                           'COMPARE_ETC_SRC_TARGET_FP_OPT',
2791                 P_MODULE_NAME => l_module_name);
2792         END IF;
2793         PA_FP_FCST_GEN_AMT_UTILS.COMPARE_ETC_SRC_TARGET_FP_OPT
2794               (P_PROJECT_ID                     => P_PROJECT_ID,
2795                P_WP_SRC_PLAN_VER_ID             => l_wp_version_id,
2796                P_FP_SRC_PLAN_VER_ID             => NULL,                       /* Bug 4369741 */
2797                P_FP_TARGET_PLAN_VER_ID          => P_BUDGET_VERSION_ID,
2798                X_SAME_PLANNING_OPTION_FLAG      => l_wp_planning_options_flag, /* Bug 4369741 */
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_CALLED_MODE => P_CALLED_MODE,
2805                 P_MSG  => 'After calling PA_FP_FCST_GEN_AMT_UTILS.'||
2806                           'COMPARE_ETC_SRC_TARGET_FP_OPT:'||l_wp_planning_options_flag,
2807                 P_MODULE_NAME => l_module_name);
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     END IF; -- get WP planning options flags
2813 
2814     IF p_etc_fp_plan_version_id IS NOT NULL AND
2815        p_fp_cols_rec.x_gen_etc_src_code IN ('FINANCIAL_PLAN','TASK_LEVEL_SEL') THEN
2816 
2817         IF P_PA_DEBUG_MODE = 'Y' THEN
2818             PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
2819                 P_CALLED_MODE => P_CALLED_MODE,
2820                 P_MSG  => 'Before calling PA_FP_FCST_GEN_AMT_UTILS.'||
2821                           'COMPARE_ETC_SRC_TARGET_FP_OPT',
2822                 P_MODULE_NAME => l_module_name);
2823         END IF;
2824         PA_FP_FCST_GEN_AMT_UTILS.COMPARE_ETC_SRC_TARGET_FP_OPT
2825               (P_PROJECT_ID                     => P_PROJECT_ID,
2826                P_WP_SRC_PLAN_VER_ID             => null,                       /* Bug 4369741 */
2827                P_FP_SRC_PLAN_VER_ID             => P_ETC_FP_PLAN_VERSION_ID,
2828                P_FP_TARGET_PLAN_VER_ID          => P_BUDGET_VERSION_ID,
2829                X_SAME_PLANNING_OPTION_FLAG      => l_fp_planning_options_flag, /* Bug 4369741 */
2830                X_RETURN_STATUS                  => X_RETURN_STATUS,
2831                X_MSG_COUNT                      => X_MSG_COUNT,
2832                X_MSG_DATA                       => X_MSG_DATA);
2833         IF P_PA_DEBUG_MODE = 'Y' THEN
2834             PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
2835                 P_CALLED_MODE => P_CALLED_MODE,
2836                 P_MSG  => 'After calling PA_FP_FCST_GEN_AMT_UTILS.'||
2837                           'COMPARE_ETC_SRC_TARGET_FP_OPT:'||l_fp_planning_options_flag,
2838                 P_MODULE_NAME => l_module_name);
2839         END IF;
2840         IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
2841             RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
2842         END IF;
2843     END IF; -- get FP planning options flags
2844 
2845 
2846         /* hr_utility.trace('l_src_ra_id_tab2.COUNT  :'||l_src_ra_id_tab2.COUNT);
2847         hr_utility.trace('before for loop   :');  */
2848 
2849     IF P_PA_DEBUG_MODE = 'Y' THEN
2850         PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
2851             P_CALLED_MODE => P_CALLED_MODE,
2852             P_MSG  => 'Before calling PA_FP_GEN_FCST_AMT_PVT.'||
2853                       'UPD_TGT_RATE_BASED_FLAG',
2854             P_MODULE_NAME => l_module_name);
2855     END IF;
2856     PA_FP_GEN_FCST_AMT_PVT.UPD_TGT_RATE_BASED_FLAG(
2857            P_FP_COLS_REC             => P_FP_COLS_REC,
2858            X_RETURN_STATUS           => x_return_status,
2859            X_MSG_COUNT               => x_msg_count,
2860            X_MSG_DATA                => x_msg_data);
2861     IF P_PA_DEBUG_MODE = 'Y' THEN
2862         PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
2863             P_CALLED_MODE       => P_CALLED_MODE,
2864             P_MSG               => 'After calling PA_FP_GEN_FCST_AMT_PVT.'||
2865                                    'UPD_TGT_RATE_BASED_FLAG: '||x_return_status,
2866             P_MODULE_NAME       => l_module_name);
2867     END IF;
2868     IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
2869         RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
2870     END IF;
2871 
2872     /* Initialize indices for ETC method PL/SQL tables */
2873     l_rb_index  := 0;
2874     l_bc_index := 0;
2875     l_ev_index  := 0;
2876 
2877     FOR i IN 1..l_src_ra_id_tab2.COUNT LOOP
2878         /*hr_utility.trace('===i===='||i);
2879         hr_utility.trace('task id :'||l_task_id_tab2(i));
2880         hr_utility.trace('rlm id :'||l_rlm_id_tab2(i));
2881         hr_utility.trace('src ra id :'||l_src_ra_id_tab2(i));
2882         hr_utility.trace('gen etc src code:'||l_gen_etc_source_code_tab2(i));
2883         hr_utility.trace('gen etc mtd code:'||l_etc_method_tab2(i));  */
2884 
2885         l_curr_task_id := l_task_id_tab2(i);
2886         l_curr_etc_source := l_gen_etc_source_code_tab2(i);
2887         l_curr_src_ra_id := l_src_ra_id_tab2(i);
2888         l_curr_tgt_ra_id := l_tgt_ra_id_tab2(i);
2889         l_curr_rlm_id := l_rlm_id_tab2(i);
2890 		l_curr_cbs_id := l_cbs_id_tab2(i);--bug#16791711
2891         l_curr_etc_method_code := l_etc_method_tab2(i);
2892             /*IF p_pa_debug_mode = 'Y' THEN
2893                  pa_fp_gen_amount_utils.fp_debug
2894                 (p_msg         => 'Value of l_curr_task_id: '||l_curr_task_id,
2895                  p_module_name => l_module_name,
2896                  p_log_level   => 5);
2897             END IF;
2898             IF p_pa_debug_mode = 'Y' THEN
2899                  pa_fp_gen_amount_utils.fp_debug
2900                 (p_msg         => 'Value of l_curr_etc_source: '||l_curr_etc_source,
2901                  p_module_name => l_module_name,
2902                  p_log_level   => 5);
2903             END IF;
2904             IF p_pa_debug_mode = 'Y' THEN
2905                  pa_fp_gen_amount_utils.fp_debug
2906                 (p_msg         => 'Value of l_curr_ra_id: '||l_curr_ra_id,
2907                  p_module_name => l_module_name,
2908                  p_log_level   => 5);
2909             END IF;
2910             IF p_pa_debug_mode = 'Y' THEN
2911                  pa_fp_gen_amount_utils.fp_debug
2912                 (p_msg         => 'Value of l_curr_rlm_id: '||l_curr_rlm_id,
2913                  p_module_name => l_module_name,
2914                  p_log_level   => 5);
2915             END IF;
2916             IF p_pa_debug_mode = 'Y' THEN
2917                  pa_fp_gen_amount_utils.fp_debug
2918                 (p_msg         => 'Value of l_curr_etc_method_code: '||l_curr_etc_method_code,
2919                  p_module_name => l_module_name,
2920                  p_log_level   => 5);
2921             END IF;*/
2922         --dbms_output.put_line('@l_curr_task_id:'|| l_curr_task_id);
2923         --dbms_output.put_line('@l_curr_etc_src:'|| l_curr_etc_source);
2924         --dbms_output.put_line('@l_curr_rlm_id'||l_curr_rlm_id);
2925         --dbms_output.put_line('@l_curr_ra_id'||l_curr_ra_id);
2926         --dbms_output.put_line('@l_curr_etc_method:'|| l_curr_etc_method_code);
2927 
2928         IF l_curr_etc_source = 'FINANCIAL_PLAN'
2929         OR l_curr_etc_source = 'WORKPLAN_RESOURCES' THEN
2930 
2931             IF l_curr_etc_method_code = 'REMAINING_BUDGET' THEN
2932                 l_rb_index := l_rb_index + 1;
2933                 l_rb_src_ra_id_tab(l_rb_index)  := l_curr_src_ra_id;
2934                 l_rb_tgt_ra_id_tab(l_rb_index)  := l_curr_tgt_ra_id;
2935                 l_rb_task_id_tab(l_rb_index)    := l_curr_task_id;
2936                 l_rb_rlm_id_tab(l_rb_index)     := l_curr_rlm_id;
2937 				l_rb_cbs_id_tab(l_rb_index)     := l_curr_cbs_id; --bug#16791711
2938                 l_rb_etc_source_tab(l_rb_index) := l_curr_etc_source;
2939             ELSIF l_curr_etc_method_code = 'BUDGET_TO_COMPLETE' THEN
2940                 l_bc_index := l_bc_index + 1;
2941                 l_bc_src_ra_id_tab(l_bc_index)  := l_curr_src_ra_id;
2942                 l_bc_tgt_ra_id_tab(l_bc_index)  := l_curr_tgt_ra_id;
2943                 l_bc_task_id_tab(l_bc_index)    := l_curr_task_id;
2944                 l_bc_rlm_id_tab(l_bc_index)     := l_curr_rlm_id;
2945 				l_bc_cbs_id_tab(l_bc_index)     := l_curr_cbs_id; --bug#16791711 bug#16923124(changed index)
2946                 l_bc_etc_source_tab(l_bc_index) := l_curr_etc_source;
2947             ELSIF l_curr_etc_method_code = 'EARNED_VALUE' THEN
2948                 l_ev_index := l_ev_index + 1;
2949                 l_ev_src_ra_id_tab(l_ev_index)  := l_curr_src_ra_id;
2950                 l_ev_tgt_ra_id_tab(l_ev_index)  := l_curr_tgt_ra_id;
2951                 l_ev_task_id_tab(l_ev_index)    := l_curr_task_id;
2952                 l_ev_rlm_id_tab(l_ev_index)     := l_curr_rlm_id;
2953 				l_ev_cbs_id_tab(l_ev_index)     := l_curr_cbs_id; --bug#16791711 bug#16923124(changed index)
2954                 l_ev_etc_source_tab(l_ev_index) := l_curr_etc_source;
2955             END IF;
2956         END IF;
2957     END LOOP;
2958 
2959     -- gboomina Bug 8318932 AAI Enhancement - Start
2960     OPEN get_copy_etc_from_plan_csr;
2961     FETCH get_copy_etc_from_plan_csr INTO l_copy_etc_from_plan_flag;
2962     CLOSE get_copy_etc_from_plan_csr;
2963 
2964     IF NVL(l_copy_etc_from_plan_flag,'N') = 'N' THEN
2965     -- gboomina Bug 8318932 AAI Enhancement - End
2966 
2967     IF l_rb_src_ra_id_tab.count > 0 THEN
2968         /* Bug 4369741: Pass NULL for the P_PLANNING_OPTIONS_FLAG parameter
2969          * to make explicit the fact that the ETC method APIs do not make
2970          * use of the planning options flag. All of the planning options logic
2971          * is present in this API itself. */
2972         IF P_PA_DEBUG_MODE = 'Y' THEN
2973             PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
2974                 P_CALLED_MODE   => P_CALLED_MODE,
2975                 P_MSG           => 'Before calling pa_fp_gen_fcst_amt_pub3.'||
2976                                    'GET_ETC_REMAIN_BDGT_AMTS_BLK',
2977                 P_MODULE_NAME   => l_module_name);
2978         END IF;
2979         PA_FP_GEN_FCST_AMT_PUB3.GET_ETC_REMAIN_BDGT_AMTS_BLK(
2980             P_SRC_RES_ASG_ID_TAB            => l_rb_src_ra_id_tab,
2981             P_TGT_RES_ASG_ID_TAB            => l_rb_tgt_ra_id_tab,
2982             P_FP_COLS_SRC_REC_FP            => l_fp_cols_rec_fp,
2983             P_FP_COLS_SRC_REC_WP            => l_fp_cols_rec_wp,
2984             P_FP_COLS_TGT_REC               => P_FP_COLS_REC,
2985             P_TASK_ID_TAB                   => l_rb_task_id_tab,
2986             P_RES_LIST_MEMBER_ID_TAB        => l_rb_rlm_id_tab,
2987 			P_CBS_ELEMENT_ID_TAB		    => l_rb_cbs_id_tab, --bug#16791711
2988             P_ETC_SOURCE_CODE_TAB           => l_rb_etc_source_tab,
2989             P_WP_STRUCTURE_VERSION_ID       => P_WP_STRUCTURE_VERSION_ID,
2990             P_ACTUALS_THRU_DATE             => P_ACTUALS_THRU_DATE,
2991             P_PLANNING_OPTIONS_FLAG         => NULL,                      /* Bug 4369741 */
2992             X_RETURN_STATUS                 => x_return_status,
2993             X_MSG_COUNT                     => x_msg_count,
2994             X_MSG_DATA                      => x_msg_data);
2995         IF p_pa_debug_mode = 'Y' THEN
2996             PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
2997                 P_CALLED_MODE   => P_CALLED_MODE,
2998                 P_MSG           => 'After calling pa_fp_gen_fcst_amt_pub3.'||
2999                                    'GET_ETC_REMAIN_BDGT_AMTS_BLK: '||x_return_status,
3000                 P_MODULE_NAME   => l_module_name);
3001         END IF;
3002         IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
3003             raise PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
3004         END IF;
3005     END IF;
3006 
3007     IF l_bc_src_ra_id_tab.count > 0 THEN
3008         /* Bug 4369741: Pass NULL for the P_PLANNING_OPTIONS_FLAG parameter
3009          * to make explicit the fact that the ETC method APIs do not make
3010          * use of the planning options flag. All of the planning options logic
3011          * is present in this API itself. */
3012         IF P_PA_DEBUG_MODE = 'Y' THEN
3013             PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
3014                 P_CALLED_MODE   => P_CALLED_MODE,
3015                 P_MSG           => 'Before calling pa_fp_gen_fcst_amt_pub4.'||
3016                                    'GET_ETC_BDGT_COMPLETE_AMTS_BLK',
3017                 P_MODULE_NAME   => l_module_name);
3018         END IF;
3019         PA_FP_GEN_FCST_AMT_PUB4.GET_ETC_BDGT_COMPLETE_AMTS_BLK(
3020             P_SRC_RES_ASG_ID_TAB            => l_bc_src_ra_id_tab,
3021             P_TGT_RES_ASG_ID_TAB            => l_bc_tgt_ra_id_tab,
3022             P_FP_COLS_SRC_REC_FP            => l_fp_cols_rec_fp,
3023             P_FP_COLS_SRC_REC_WP            => l_fp_cols_rec_wp,
3024             P_FP_COLS_TGT_REC               => P_FP_COLS_REC,
3025             P_TASK_ID_TAB                   => l_bc_task_id_tab,
3026             P_RES_LIST_MEMBER_ID_TAB        => l_bc_rlm_id_tab,
3027             P_ETC_SOURCE_CODE_TAB           => l_bc_etc_source_tab,
3028             P_WP_STRUCTURE_VERSION_ID       => P_WP_STRUCTURE_VERSION_ID,
3029             P_ACTUALS_THRU_DATE             => P_ACTUALS_THRU_DATE,
3030             P_PLANNING_OPTIONS_FLAG         => NULL,                      /* Bug 4369741 */
3031             X_RETURN_STATUS                 => x_return_status,
3032             X_MSG_COUNT                     => x_msg_count,
3033             X_MSG_DATA                      => x_msg_data);
3034         IF p_pa_debug_mode = 'Y' THEN
3035             PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
3036                 P_CALLED_MODE   => P_CALLED_MODE,
3037                 P_MSG           => 'After calling pa_fp_gen_fcst_amt_pub4.'||
3038                                    'GET_ETC_BDGT_COMPLETE_AMTS_BLK: '||x_return_status,
3039                 P_MODULE_NAME   => l_module_name);
3040         END IF;
3041         IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
3042             raise PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
3043         END IF;
3044     END IF;
3045 
3046     IF l_ev_src_ra_id_tab.count > 0 THEN
3047         /* Bug 4369741: Pass NULL for the P_PLANNING_OPTIONS_FLAG parameter
3048          * to make explicit the fact that the ETC method APIs do not make
3049          * use of the planning options flag. All of the planning options logic
3050          * is present in this API itself. */
3051         IF P_PA_DEBUG_MODE = 'Y' THEN
3052             PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
3053                 P_CALLED_MODE   => P_CALLED_MODE,
3054                 P_MSG           => 'Before calling pa_fp_gen_fcst_amt_pub5.'||
3055                                    'GET_ETC_EARNED_VALUE_AMTS_BLK',
3056                 P_MODULE_NAME   => l_module_name);
3057         END IF;
3058         PA_FP_GEN_FCST_AMT_PUB5.GET_ETC_EARNED_VALUE_AMTS_BLK(
3059             P_SRC_RES_ASG_ID_TAB            => l_ev_src_ra_id_tab,
3060             P_TGT_RES_ASG_ID_TAB            => l_ev_tgt_ra_id_tab,
3061             P_FP_COLS_SRC_REC_FP            => l_fp_cols_rec_fp,
3062             P_FP_COLS_SRC_REC_WP            => l_fp_cols_rec_wp,
3063             P_FP_COLS_TGT_REC               => P_FP_COLS_REC,
3064             P_TASK_ID_TAB                   => l_ev_task_id_tab,
3065             P_RES_LIST_MEMBER_ID_TAB        => l_ev_rlm_id_tab,
3066 			P_CBS_ELEMENT_ID_TAB			=> l_ev_cbs_id_tab,
3067             P_ETC_SOURCE_CODE_TAB           => l_ev_etc_source_tab,
3068             P_WP_STRUCTURE_VERSION_ID       => P_WP_STRUCTURE_VERSION_ID,
3069             P_ACTUALS_THRU_DATE             => P_ACTUALS_THRU_DATE,
3070             P_PLANNING_OPTIONS_FLAG         => NULL,                      /* Bug 4369741 */
3071             X_RETURN_STATUS                 => x_return_status,
3072             X_MSG_COUNT                     => x_msg_count,
3073             X_MSG_DATA                      => x_msg_data);
3074         IF p_pa_debug_mode = 'Y' THEN
3075             PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
3076                 P_CALLED_MODE   => P_CALLED_MODE,
3077                 P_MSG           => 'After calling pa_fp_gen_fcst_amt_pub5.'||
3078                                    'GET_ETC_EARNED_VALUE_AMTS_BLK: '||x_return_status,
3079                 P_MODULE_NAME   => l_module_name);
3080         END IF;
3081         IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
3082             raise PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
3083         END IF;
3084     END IF;
3085 
3086     IF p_fp_cols_rec.x_gen_incl_open_comm_flag = 'Y' THEN
3087 
3088         /* Bug 4369741: Modified parameters of GET_ETC_COMMITMENT_AMTS
3089          * API to reflect spec change from a single planning options
3090          * flag to 2 separate flags for Workplan and Financial Plan sources. */
3091 
3092         -- hr_utility.trace('after for loop   :');
3093           IF P_PA_DEBUG_MODE = 'Y' THEN
3094                         PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
3095                             P_CALLED_MODE   => P_CALLED_MODE,
3096                             P_MSG           => 'Before calling PA_FP_GEN_FCST_AMT_PUB3.'||
3097                                                'GET_ETC_COMMITMENT_AMTS',
3098                             P_MODULE_NAME   => l_module_name);
3099           END IF;
3100         -- hr_utility.trace('before pub3 cmt amts:');
3101           PA_FP_GEN_FCST_AMT_PUB3.GET_ETC_COMMITMENT_AMTS
3102           (P_FP_COLS_TGT_REC            => p_fp_cols_rec,
3103            P_WP_PLANNING_OPTIONS_FLAG   => l_wp_planning_options_flag,  /* Bug 4369741 */
3104            P_FP_PLANNING_OPTIONS_FLAG   => l_fp_planning_options_flag,  /* Bug 4369741 */
3105            X_RETURN_STATUS              => x_return_status,
3106            X_MSG_COUNT                  => x_msg_count,
3107            X_MSG_DATA                   => x_msg_data);
3108 
3109          -- hr_utility.trace('after pub3 cmt amts:');
3110 
3111            IF p_pa_debug_mode = 'Y' THEN
3112                         PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
3113                             P_CALLED_MODE   => P_CALLED_MODE,
3114                             P_MSG           => 'After calling PA_FP_GEN_FCST_AMT_PUB3.'||
3115                                                'GET_ETC_COMMITMENT_AMTS: '||x_return_status,
3116                             P_MODULE_NAME   => l_module_name);
3117            END IF;
3118            IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
3119                         raise PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
3120            END IF;
3121 	 END IF;
3122        -- gboomina Bug 8318932 for AAI Enhancement - Start
3123        ELSE
3124                IF P_PA_DEBUG_MODE = 'Y' THEN
3125                    PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
3126                        P_CALLED_MODE   => P_CALLED_MODE,
3127                        P_MSG           => 'Before calling pa_fp_gen_fcst_amt_pub3.'||
3128                                           'GET_ETC_FROM_SRC_BDGT',
3129                        P_MODULE_NAME   => l_module_name);
3130                END IF;
3131                PA_FP_GEN_FCST_AMT_PUB3.GET_ETC_FROM_SRC_BDGT(
3132                    P_FP_COLS_SRC_FP_REC            => l_fp_cols_rec_fp,
3133                    P_FP_COLS_SRC_WP_REC            => l_fp_cols_rec_wp,
3134                    P_FP_COLS_TGT_REC               => l_fp_cols_rec_target,
3135                    P_ACTUALS_THRU_DATE             => P_ACTUALS_THRU_DATE,
3136                    X_RETURN_STATUS                 => x_return_status,
3137                    X_MSG_COUNT                     => x_msg_count,
3138                    X_MSG_DATA                      => x_msg_data);
3139                IF p_pa_debug_mode = 'Y' THEN
3140                    PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
3141                        P_CALLED_MODE   => P_CALLED_MODE,
3142                        P_MSG           => 'After calling pa_fp_gen_fcst_amt_pub3.'||
3143                                           'GET_ETC_FROM_SRC_BDGT: '||x_return_status,
3144                        P_MODULE_NAME   => l_module_name);
3145                END IF;
3146                IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
3147                    raise PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
3148                END IF;
3149 
3150        END IF; -- IF l_fp_cols_rec_target.X_COPY_ETC_FROM_PLAN_FLAG
3151        -- gboomina Bug 8318932 for AAI Enhancement - End
3152 
3153     --hr_utility.trace('After processing all etc source!');
3154     --dbms_output.put_line('--before mapping++');
3155     /**After calling apis based on each res_asg_id's gen_method, we have all the plan totals and
3156       *ETC amounts populated in tmp2 table, now, we need to map the amounts to the target fin
3157       *plan's resource list, summ up, call calculate to spread into pa_budget_lines if time_phase
3158       *is not null, otherwise, we need to populate into pa_budget_lines by ourselves**/
3159 
3160     /* select count(*) into l_count_tmp from PA_FP_CALC_AMT_TMP1;
3161     hr_utility.trace('tmp1 count :'|| l_count_tmp);
3162     select count(*) into l_count_tmp from PA_FP_CALC_AMT_TMP2;
3163     hr_utility.trace('tmp2 count :'|| l_count_tmp);  */
3164     --delete from calc_amt_tmp11;
3165     --insert into calc_amt_tmp11 select * from pa_fp_calc_amt_tmp1;
3166 
3167     --select count(*) into l_count_tmp from PA_FP_CALC_AMT_TMP1;
3168     --hr_utility.trace('***PA_FP_CALC_AMT_TMP1.count'||l_count_tmp);
3169     --select count(*) into l_count_tmp from PA_FP_CALC_AMT_TMP2;
3170     --hr_utility.trace('**PA_FP_CALC_AMT_TMP2.count'||l_count_tmp);
3171     --hr_utility.trace('**P_FP_COLS_REC.X_TIME_PHASED_CODE:'||P_FP_COLS_REC.X_TIME_PHASED_CODE);
3172 
3173     --l_rev_gen_method := PA_FP_GEN_FCST_PG_PKG.GET_REV_GEN_METHOD(p_project_id);
3174       l_rev_gen_method := nvl(P_FP_COLS_REC.X_REVENUE_DERIVATION_METHOD,PA_FP_GEN_FCST_PG_PKG.GET_REV_GEN_METHOD(p_project_id)); --Bug 5462471
3175     IF l_fp_cols_rec_target.x_version_type = 'REVENUE' and l_rev_gen_method = 'C' THEN
3176         IF p_fp_cols_rec.X_GEN_RET_MANUAL_LINE_FLAG = 'N' THEN
3177             SELECT DISTINCT target_res_asg_id
3178             BULK COLLECT INTO l_res_asg_uom_update_tab
3179             FROM PA_FP_CALC_AMT_TMP2
3180             WHERE transaction_source_code = 'ETC';
3181         ELSIF p_fp_cols_rec.X_GEN_RET_MANUAL_LINE_FLAG = 'Y' THEN
3182             IF p_fp_cols_rec.x_time_phased_code IN ('P','G') THEN
3183                 l_etc_start_date :=
3184                     PA_FP_GEN_AMOUNT_UTILS.GET_ETC_START_DATE(p_budget_version_id);
3185 
3186                 SELECT /*+ INDEX(tmp1,PA_FP_CALC_AMT_TMP1_N1)*/
3187                        DISTINCT tmp1.target_res_asg_id
3188                 BULK COLLECT
3189                 INTO   l_res_asg_uom_update_tab
3190                 FROM   PA_FP_CALC_AMT_TMP1 tmp1,
3191                        pa_resource_assignments ra
3192                 WHERE  ra.budget_version_id = p_budget_version_id
3193                 AND    ra.resource_assignment_id = tmp1.target_res_asg_id
3194                 AND    ( ra.transaction_source_code IS NOT NULL
3195                          OR ( ra.transaction_source_code IS NULL
3196                               AND NOT EXISTS ( SELECT 1
3197                                                FROM   pa_budget_lines bl
3198                                                WHERE  bl.resource_assignment_id =
3199                                                       ra.resource_assignment_id
3200                                                AND    bl.start_date >= l_etc_start_date
3201                                                AND    rownum = 1 )))
3202                 AND EXISTS ( SELECT /*+ INDEX(tmp2,PA_FP_CALC_AMT_TMP2_N1)*/ 1
3203                              FROM   PA_FP_CALC_AMT_TMP2 tmp2
3204                              WHERE  tmp2.target_res_asg_id = tmp1.target_res_asg_id
3205                              AND    tmp2.transaction_source_code = 'ETC'
3206                              AND    rownum = 1 );
3207             ELSIF p_fp_cols_rec.x_time_phased_code = 'N' THEN
3208                 SELECT /*+ INDEX(tmp1,PA_FP_CALC_AMT_TMP1_N1)*/
3209                        DISTINCT tmp1.target_res_asg_id
3210                 BULK COLLECT
3211                 INTO   l_res_asg_uom_update_tab
3212                 FROM   PA_FP_CALC_AMT_TMP1 tmp1,
3213                        pa_resource_assignments ra
3214                 WHERE  ra.budget_version_id = p_budget_version_id
3215                 AND    ra.resource_assignment_id = tmp1.target_res_asg_id
3216                 AND    ( ra.transaction_source_code IS NOT NULL
3217                          OR ( ra.transaction_source_code IS NULL
3218                               AND NOT EXISTS ( SELECT 1
3219                                                FROM   pa_budget_lines bl
3220                                                WHERE  bl.resource_assignment_id =
3221                                                       ra.resource_assignment_id
3222                                                AND    NVL(bl.quantity,0) <>
3223                                                       NVL(bl.init_quantity,0)
3224                                                AND    rownum = 1 )))
3225                 AND EXISTS ( SELECT /*+ INDEX(tmp2,PA_FP_CALC_AMT_TMP2_N1)*/ 1
3226                              FROM   PA_FP_CALC_AMT_TMP2 tmp2
3227                              WHERE  tmp2.target_res_asg_id = tmp1.target_res_asg_id
3228                              AND    tmp2.transaction_source_code = 'ETC'
3229                              AND    rownum = 1 );
3230             END IF; -- time phase check
3231         END IF;
3232 
3233         FORALL i IN 1..l_res_asg_uom_update_tab.count
3234             UPDATE pa_resource_assignments
3235             SET unit_of_measure = 'DOLLARS',
3236                 rate_based_flag = 'N'
3237             WHERE resource_assignment_id = l_res_asg_uom_update_tab(i);
3238     END IF;
3239 
3240     l_cal_ra_id_tab.delete;
3241     l_cal_txn_currency_code_tab.delete;
3242     l_cal_unit_of_measure_tab.delete;
3243     l_cal_etc_qty_tab.delete;
3244     l_cal_etc_raw_cost_tab.delete;
3245     l_cal_etc_burdened_cost_tab.delete;
3246     l_cal_rate_based_flag_tab.delete;
3247 
3248     l_cal_rlm_id_tab.delete;
3249 	l_cal_cbs_id_tab.delete; --bug#16791711
3250     l_cal_task_id_tab.delete;
3251     l_cal_etc_method_code_tab.delete;
3252 
3253     --select count(*) into l_count_tmp from PA_FP_CALC_AMT_TMP2;
3254     --hr_utility.trace('?????PA_FP_CALC_AMT_TMP2.count'||l_count_tmp);
3255 
3256     -- select count(*) into l_test from PA_FP_CALC_AMT_TMP2 where
3257     --          TRANSACTION_SOURCE_CODE = 'ETC';
3258     -- hr_utility.trace('calc amt tmp2 count with src code as ETC:'||l_test);
3259 
3260     IF ( l_fp_planning_options_flag = 'Y' AND
3261          P_FP_COLS_REC.x_gen_etc_src_code = 'FINANCIAL_PLAN' ) OR
3262        ( l_wp_planning_options_flag = 'Y' AND
3263          P_FP_COLS_REC.x_gen_etc_src_code = 'WORKPLAN_RESOURCES' ) THEN
3264         OPEN  etc_amts_cur_wp_fp_opt_same
3265             ( p_fp_cols_rec.x_gen_etc_src_code );
3266         FETCH etc_amts_cur_wp_fp_opt_same
3267         BULK COLLECT
3268         INTO  l_cal_src_ra_id_tab_tmp,                        /* Modified during ER 4376722 */
3269               l_cal_ra_id_tab_tmp,
3270               l_cal_txn_curr_code_tab_tmp,
3271               l_cal_rate_based_flag_tab_tmp,
3272               l_cal_rlm_id_tab_tmp,
3273 			  l_cal_cbs_id_tab_tmp, --bug#16791711
3274               l_cal_task_id_tab_tmp,
3275               l_cal_unit_of_measure_tab_tmp,
3276               l_cal_etc_method_code_tab_tmp,
3277               l_cal_etc_qty_tab_tmp,
3278               l_cal_etc_raw_cost_tab_tmp,
3279               l_cal_etc_brdn_cost_tab_tmp,
3280               l_cal_etc_revenue_tab_tmp,
3281               l_billable_flag_tab_tmp,                        /* Added for ER 4376722 */
3282               l_gen_etc_src_code_tab_tmp;                     /* Added for Bug 4369741 */
3283         CLOSE etc_amts_cur_wp_fp_opt_same;
3284     ELSIF ( l_fp_planning_options_flag = 'N' AND
3285             P_FP_COLS_REC.x_gen_etc_src_code = 'FINANCIAL_PLAN' ) OR
3286           ( l_wp_planning_options_flag = 'N' AND
3287             P_FP_COLS_REC.x_gen_etc_src_code = 'WORKPLAN_RESOURCES' ) THEN
3288         OPEN  etc_amts_cur_wp_fp_opt_diff
3289             ( p_fp_cols_rec.x_gen_etc_src_code );
3290         FETCH etc_amts_cur_wp_fp_opt_diff
3291         BULK COLLECT
3292         INTO  l_cal_src_ra_id_tab_tmp,                        /* Modified during ER 4376722 */
3293               l_cal_ra_id_tab_tmp,
3294               l_cal_txn_curr_code_tab_tmp,
3295               l_cal_rate_based_flag_tab_tmp,
3296               l_cal_rlm_id_tab_tmp,
3297 			  l_cal_cbs_id_tab_tmp, --bug#16791711
3298               l_cal_task_id_tab_tmp,
3299               l_cal_unit_of_measure_tab_tmp,
3300               l_cal_etc_method_code_tab_tmp,
3301               l_cal_etc_qty_tab_tmp,
3302               l_cal_etc_raw_cost_tab_tmp,
3303               l_cal_etc_brdn_cost_tab_tmp,
3304               l_cal_etc_revenue_tab_tmp,
3305               l_billable_flag_tab_tmp,                        /* Added for ER 4376722 */
3306               l_gen_etc_src_code_tab_tmp;                     /* Added for Bug 4369741 */
3307         CLOSE etc_amts_cur_wp_fp_opt_diff;
3308     ELSIF P_FP_COLS_REC.x_gen_etc_src_code = 'TASK_LEVEL_SEL' THEN
3309 	IF l_wp_planning_options_flag = 'Y' AND
3310 	   l_fp_planning_options_flag = 'Y' THEN
3311             OPEN  etc_amts_cur_wp_fp_opt_same;
3312             FETCH etc_amts_cur_wp_fp_opt_same
3313             BULK COLLECT
3314             INTO  l_cal_src_ra_id_tab_tmp,                        /* Modified during ER 4376722 */
3315                   l_cal_ra_id_tab_tmp,
3316                   l_cal_txn_curr_code_tab_tmp,
3317                   l_cal_rate_based_flag_tab_tmp,
3318                   l_cal_rlm_id_tab_tmp,
3319 				  l_cal_cbs_id_tab_tmp, --bug#16791711
3320                   l_cal_task_id_tab_tmp,
3321                   l_cal_unit_of_measure_tab_tmp,
3322                   l_cal_etc_method_code_tab_tmp,
3323                   l_cal_etc_qty_tab_tmp,
3324                   l_cal_etc_raw_cost_tab_tmp,
3325                   l_cal_etc_brdn_cost_tab_tmp,
3326                   l_cal_etc_revenue_tab_tmp,
3327                   l_billable_flag_tab_tmp,                        /* Added for ER 4376722 */
3328                   l_gen_etc_src_code_tab_tmp;                     /* Added for Bug 4369741 */
3329             CLOSE etc_amts_cur_wp_fp_opt_same;
3330 	ELSIF l_wp_planning_options_flag = 'Y' AND
3331 	      l_fp_planning_options_flag = 'N' THEN
3332             OPEN  etc_amts_cur_wp_opt_same;
3333             FETCH etc_amts_cur_wp_opt_same
3334             BULK COLLECT
3335             INTO  l_cal_src_ra_id_tab_tmp,                        /* Modified during ER 4376722 */
3336                   l_cal_ra_id_tab_tmp,
3337                   l_cal_txn_curr_code_tab_tmp,
3338                   l_cal_rate_based_flag_tab_tmp,
3339                   l_cal_rlm_id_tab_tmp,
3340 				  l_cal_cbs_id_tab_tmp, --bug#16791711
3341                   l_cal_task_id_tab_tmp,
3342                   l_cal_unit_of_measure_tab_tmp,
3343                   l_cal_etc_method_code_tab_tmp,
3344                   l_cal_etc_qty_tab_tmp,
3345                   l_cal_etc_raw_cost_tab_tmp,
3346                   l_cal_etc_brdn_cost_tab_tmp,
3347                   l_cal_etc_revenue_tab_tmp,
3348                   l_billable_flag_tab_tmp,                        /* Added for ER 4376722 */
3349                   l_gen_etc_src_code_tab_tmp;                     /* Added for Bug 4369741 */
3350             CLOSE etc_amts_cur_wp_opt_same;
3351 	ELSIF l_wp_planning_options_flag = 'N' AND
3352 	      l_fp_planning_options_flag = 'Y' THEN
3353             OPEN  etc_amts_cur_fp_opt_same;
3354             FETCH etc_amts_cur_fp_opt_same
3355             BULK COLLECT
3356             INTO  l_cal_src_ra_id_tab_tmp,                        /* Modified during ER 4376722 */
3357                   l_cal_ra_id_tab_tmp,
3358                   l_cal_txn_curr_code_tab_tmp,
3359                   l_cal_rate_based_flag_tab_tmp,
3360                   l_cal_rlm_id_tab_tmp,
3361 				  l_cal_cbs_id_tab_tmp, --bug#16791711
3362                   l_cal_task_id_tab_tmp,
3363                   l_cal_unit_of_measure_tab_tmp,
3364                   l_cal_etc_method_code_tab_tmp,
3365                   l_cal_etc_qty_tab_tmp,
3366                   l_cal_etc_raw_cost_tab_tmp,
3367                   l_cal_etc_brdn_cost_tab_tmp,
3368                   l_cal_etc_revenue_tab_tmp,
3369                   l_billable_flag_tab_tmp,                        /* Added for ER 4376722 */
3370                   l_gen_etc_src_code_tab_tmp;                     /* Added for Bug 4369741 */
3371             CLOSE etc_amts_cur_fp_opt_same;
3372 	ELSIF l_wp_planning_options_flag = 'N' AND
3373 	      l_fp_planning_options_flag = 'N' THEN
3374             OPEN  etc_amts_cur_wp_fp_opt_diff;
3375             FETCH etc_amts_cur_wp_fp_opt_diff
3376             BULK COLLECT
3377             INTO  l_cal_src_ra_id_tab_tmp,                        /* Modified during ER 4376722 */
3378                   l_cal_ra_id_tab_tmp,
3379                   l_cal_txn_curr_code_tab_tmp,
3380                   l_cal_rate_based_flag_tab_tmp,
3381                   l_cal_rlm_id_tab_tmp,
3382 				  l_cal_cbs_id_tab_tmp, --bug#16791711
3383                   l_cal_task_id_tab_tmp,
3384                   l_cal_unit_of_measure_tab_tmp,
3385                   l_cal_etc_method_code_tab_tmp,
3386                   l_cal_etc_qty_tab_tmp,
3387                   l_cal_etc_raw_cost_tab_tmp,
3388                   l_cal_etc_brdn_cost_tab_tmp,
3389                   l_cal_etc_revenue_tab_tmp,
3390                   l_billable_flag_tab_tmp,                        /* Added for ER 4376722 */
3391                   l_gen_etc_src_code_tab_tmp;                     /* Added for Bug 4369741 */
3392             CLOSE etc_amts_cur_wp_fp_opt_diff;
3393         END IF;
3394     ELSE
3395         -- error handling code stub
3396         l_dummy := 1;
3397     END IF; -- fetch ETC data
3398     --hr_utility.trace('????l_cal_ra_id_tab.count:'||l_cal_ra_id_tab.count);
3399 
3400 
3401 IF p_fp_cols_rec.x_gen_ret_manual_line_flag = 'Y' THEN
3402 
3403     FOR i in 1..l_cal_ra_id_tab_tmp.count LOOP
3404         SELECT transaction_source_code
3405         INTO l_ra_txn_source_code
3406         FROM pa_resource_assignments
3407         WHERE resource_assignment_id = l_cal_ra_id_tab_tmp(i);
3408 
3409         l_bl_count := 0;
3410 
3411         -- Bug 4301959: Modified the Retain Manually Added Lines logic to
3412         -- handle the non-time phased case separately, using the (quantity <>
3413         -- actual quantity) check instead of (start_date > etc_start_date).
3414 
3415         IF l_ra_txn_source_code IS NULL THEN
3416             IF p_fp_cols_rec.x_time_phased_code IN ('P','G') THEN
3417                 SELECT count(*)
3418                 INTO   l_bl_count
3419                 FROM   pa_budget_lines
3420                 WHERE  resource_assignment_id = l_cal_ra_id_tab_tmp(i)
3421                 AND    start_date > p_actuals_thru_date;
3422             ELSIF p_fp_cols_rec.x_time_phased_code = 'N' THEN
3423                 SELECT count(*)
3424                 INTO   l_bl_count
3425                 FROM   pa_budget_lines
3426                 WHERE  resource_assignment_id = l_cal_ra_id_tab_tmp(i)
3427                 AND    NVL(quantity,0) <> NVL(init_quantity,0);
3428             END IF;
3429         END IF;
3430 
3431           /* hr_utility.trace('blines count for res asg id '||
3432               l_bl_count  || '   for res asg '||l_cal_ra_id_tab_tmp(i));  */
3433 
3434         /* modified the logic for handling retain manually added lines
3435            for bug 3968630. If the txn source code for the planning resource is
3436            not null (generated - not manually entered), then the existing
3437            plan lines should be deleted and amounts should be generated from the
3438            generation source. */
3439 
3440             IF ( l_ra_txn_source_code IS NULL AND l_bl_count > 0 ) THEN
3441                 /* Mannually entered lines do exist, so they will be honored,
3442                    source records will be dropped */
3443                 l_dummy := 1;
3444             ELSE
3445                 /* Mannually entered lines don't exist, so source records will
3446                    be honored */
3447                 -- gboomina Bug 8318932 for AAI Enhancement - Start
3448                 -- Avoiding the deletion of budget lines created when l_copy_etc_from_plan_flag is checked
3449                 IF (p_fp_cols_rec.x_time_phased_code = 'P'
3450                    OR p_fp_cols_rec.x_time_phased_code = 'G')
3451                    AND NVL(l_copy_etc_from_plan_flag,'N') = 'N' THEN
3452                     DELETE FROM pa_budget_lines
3453                     WHERE resource_assignment_id = l_cal_ra_id_tab_tmp(i)
3454                       AND start_date > p_actuals_thru_date;
3455                 END IF;
3456                 -- gboomina Bug 8318932 for AAI Enhancement - End
3457                 -- hr_utility.trace('inside table population ');
3458 
3459                 l_cal_ra_id_tab.EXTEND;
3460                 l_cal_txn_currency_code_tab.EXTEND;
3461                 l_cal_rate_based_flag_tab.EXTEND;
3462                 l_cal_rlm_id_tab.EXTEND;
3463 				l_cal_cbs_id_tab.EXTEND;--bug#16791711
3464                 l_cal_task_id_tab.EXTEND;
3465                 l_cal_unit_of_measure_tab.EXTEND;
3466                 l_cal_etc_method_code_tab.EXTEND;
3467                 l_cal_etc_qty_tab.EXTEND;
3468                 l_cal_etc_raw_cost_tab.EXTEND;
3469                 l_cal_etc_burdened_cost_tab.EXTEND;
3470                 l_cal_etc_revenue_tab.EXTEND;
3471                 l_billable_flag_tab.EXTEND;  /* Added for ER 4376722 */
3472                 l_cal_src_ra_id_tab.EXTEND;  /* Modified during ER 4376722 */
3473                 l_gen_etc_src_code_tab.EXTEND; /* Added for Bug 4369741 */
3474 
3475                 l_cal_ra_id_tab(l_cnt) := l_cal_ra_id_tab_tmp(i);
3476                 l_cal_txn_currency_code_tab(l_cnt) := l_cal_txn_curr_code_tab_tmp(i);
3477                 l_cal_rate_based_flag_tab(l_cnt) := l_cal_rate_based_flag_tab_tmp(i);
3478                 l_cal_rlm_id_tab(l_cnt) := l_cal_rlm_id_tab_tmp(i);
3479 				l_cal_cbs_id_tab(l_cnt) := l_cal_cbs_id_tab_tmp(i);--bug#16791711
3480                 l_cal_task_id_tab(l_cnt) := l_cal_task_id_tab_tmp(i);
3481                 l_cal_unit_of_measure_tab(l_cnt) := l_cal_unit_of_measure_tab_tmp(i);
3482                 l_cal_etc_method_code_tab(l_cnt) := l_cal_etc_method_code_tab_tmp(i);
3483                 l_cal_etc_qty_tab(l_cnt) := l_cal_etc_qty_tab_tmp(i);
3484                 l_cal_etc_raw_cost_tab(l_cnt) := l_cal_etc_raw_cost_tab_tmp(i);
3485                 l_cal_etc_burdened_cost_tab(l_cnt) := l_cal_etc_brdn_cost_tab_tmp(i);
3486                 l_cal_etc_revenue_tab(l_cnt) := l_cal_etc_revenue_tab_tmp(i);
3487                 l_billable_flag_tab(l_cnt) := l_billable_flag_tab_tmp(i); /* Added for ER 4376722 */
3488                 l_cal_src_ra_id_tab(l_cnt) := l_cal_src_ra_id_tab_tmp(i); /* Modified during ER 4376722 */
3489                 l_gen_etc_src_code_tab(l_cnt) := l_gen_etc_src_code_tab_tmp(i); /* Added for Bug 4369741 */
3490 
3491                 l_cnt := l_cnt + 1;
3492             END IF;
3493     END LOOP;
3494         -- hr_utility.trace('after the for loop for calc api ');
3495     /* End the logic to handle mannually updated lines*/
3496 
3497 ELSE
3498 
3499                 l_cal_ra_id_tab := l_cal_ra_id_tab_tmp;
3500                 l_cal_txn_currency_code_tab := l_cal_txn_curr_code_tab_tmp;
3501                 l_cal_rate_based_flag_tab := l_cal_rate_based_flag_tab_tmp;
3502                 l_cal_rlm_id_tab := l_cal_rlm_id_tab_tmp;
3503 				l_cal_cbs_id_tab := l_cal_cbs_id_tab_tmp;--bug#16791711
3504                 l_cal_task_id_tab := l_cal_task_id_tab_tmp;
3505                 l_cal_unit_of_measure_tab := l_cal_unit_of_measure_tab_tmp;
3506                 l_cal_etc_method_code_tab := l_cal_etc_method_code_tab_tmp;
3507                 l_cal_etc_qty_tab := l_cal_etc_qty_tab_tmp;
3508                 l_cal_etc_raw_cost_tab := l_cal_etc_raw_cost_tab_tmp;
3509                 l_cal_etc_burdened_cost_tab := l_cal_etc_brdn_cost_tab_tmp;
3510                 l_cal_etc_revenue_tab := l_cal_etc_revenue_tab_tmp;
3511                 l_billable_flag_tab := l_billable_flag_tab_tmp; /* Added for ER 4376722 */
3512                 l_cal_src_ra_id_tab := l_cal_src_ra_id_tab_tmp; /* Modified during ER 4376722 */
3513                 l_gen_etc_src_code_tab := l_gen_etc_src_code_tab_tmp; /* Added for Bug 4369741 */
3514 
3515 END IF; -- manual lines condition
3516 
3517 
3518     -- IPM: New Entity ER ------------------------------------------
3519     IF l_fp_planning_options_flag = 'Y' OR
3520        l_wp_planning_options_flag = 'Y' THEN
3521 
3522         -- Sort resource assignment ids into two pl/sql tables
3523         -- based on whether the ETC generation source is FP or WP.
3524         -- Also, track non-billable resources whose source is FP.
3525         FOR i IN 1..l_cal_ra_id_tab.count LOOP
3526             IF l_gen_etc_src_code_tab(i) = 'FINANCIAL_PLAN' THEN
3527                 l_fp_ra_id_tab.EXTEND;
3528                 l_fp_ra_id_tab(l_fp_ra_id_tab.count) := l_cal_ra_id_tab(i);
3529 
3530                 IF l_billable_flag_tab(i) = 'N' THEN
3531                     l_non_billable_fp_ra_id_tab.EXTEND;
3532                     l_non_billable_fp_ra_id_tab(l_non_billable_fp_ra_id_tab.count)
3533                         := l_cal_ra_id_tab(i);
3534                 END IF;
3535             ELSIF l_gen_etc_src_code_tab(i) = 'WORKPLAN_RESOURCES' THEN
3536                 l_wp_ra_id_tab.EXTEND;
3537                 l_wp_ra_id_tab(l_wp_ra_id_tab.count) := l_cal_ra_id_tab(i);
3538             END IF;
3539         END LOOP;
3540 
3541         -- Index 1 stores Financial Plan data.
3542         l_ra_id_tab_table(1) := l_fp_ra_id_tab;
3543         l_planning_options_flag_tab(1) := l_fp_planning_options_flag;
3544         l_src_version_id_tab(1) := p_etc_fp_plan_version_id;
3545 
3546         -- Index 2 stores Workplan data.
3547         l_ra_id_tab_table(2) := l_wp_ra_id_tab;
3548         l_planning_options_flag_tab(2) := l_wp_planning_options_flag;
3549         l_src_version_id_tab(2) := l_wp_version_id;
3550 
3551         FOR i IN 1..l_ra_id_tab_table.count LOOP
3552 
3553             IF l_ra_id_tab_table(i).count > 0 AND
3554                l_planning_options_flag_tab(i) = 'Y' THEN
3555 
3556                 DELETE pa_resource_asgn_curr_tmp;
3557 
3558                 -- As per the copy_table_records API specification, when calling the
3559                 -- maintenance API in temp table Copy mode, populate the temp table
3560                 -- with distinct target ra_id values (without txn_currency_code values).
3561 
3562                 INSERT INTO pa_resource_asgn_curr_tmp
3563                     ( resource_assignment_id )
3564                 SELECT DISTINCT column_value
3565                 FROM TABLE( CAST( l_ra_id_tab_table(i) AS SYSTEM.pa_num_tbl_type ));
3566 
3567                 -- Call the maintenance api in COPY mode
3568                 IF p_pa_debug_mode = 'Y' THEN
3569                     PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
3570                         P_MSG                   => 'Before calling PA_RES_ASG_CURRENCY_PUB.' ||
3571                                                    'MAINTAIN_DATA',
3572                         P_CALLED_MODE           => p_called_mode,
3573                         P_MODULE_NAME           => l_module_name);
3574                 END IF;
3575                 PA_RES_ASG_CURRENCY_PUB.MAINTAIN_DATA
3576                       ( P_FP_COLS_REC           => l_fp_cols_rec_target,
3577                         P_CALLING_MODULE        => 'FORECAST_GENERATION',
3578                         P_COPY_FLAG             => 'Y',
3579                         P_SRC_VERSION_ID        => l_src_version_id_tab(i),
3580                         P_COPY_MODE             => 'COPY_OVERRIDES',
3581                         P_VERSION_LEVEL_FLAG    => 'N',
3582                         P_CALLED_MODE           => p_called_mode,
3583                         X_RETURN_STATUS         => x_return_status,
3584                         X_MSG_COUNT             => x_msg_count,
3585                         X_MSG_DATA              => x_msg_data );
3586                 IF p_pa_debug_mode = 'Y' THEN
3587                     PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
3588                         P_MSG                   => 'After calling PA_RES_ASG_CURRENCY_PUB.' ||
3589                                                    'MAINTAIN_DATA: '||x_return_status,
3590                         P_CALLED_MODE           => p_called_mode,
3591                         P_MODULE_NAME           => l_module_name);
3592                 END IF;
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             END IF; -- planning options flag check
3597         END LOOP; -- FOR i IN 1..l_ra_id_tab_table.count LOOP
3598 
3599         -- Ensure that non-billable tasks do not have bill rate overrides
3600         -- in the new entity table by re-Inserting new entity records with
3601         -- existing cost rate overrides but Null bill rate overrides for
3602         -- non-billable tasks.
3603         -- Note: Processing resources with Workplan as the source is not
3604         -- required since workplans are guaranteed to store only costs.
3605 
3606         IF l_fp_planning_options_flag = 'Y' AND
3607            l_non_billable_fp_ra_id_tab.count > 0 AND
3608            l_fp_cols_rec_fp.x_version_type = 'ALL' AND
3609            l_fp_cols_rec_target.x_version_type IN ('REVENUE','ALL') THEN
3610 
3611             DELETE pa_resource_asgn_curr_tmp;
3612 
3613 	    -- Note: An outer join on pa_tasks is not needed in the query
3614 	    -- below because we are only interested in updating resources
3615 	    -- for non-billable tasks. Project-level tasks that require an
3616 	    -- outer join are always billable.
3617 	    INSERT INTO pa_resource_asgn_curr_tmp
3618 	        ( RESOURCE_ASSIGNMENT_ID,
3619 	          TXN_CURRENCY_CODE,
3620 	          TXN_RAW_COST_RATE_OVERRIDE,
3621 	          TXN_BURDEN_COST_RATE_OVERRIDE )
3622 	    SELECT rbc.resource_assignment_id,
3623 	           rbc.txn_currency_code,
3624 	           rbc.txn_raw_cost_rate_override,
3625 	           rbc.txn_burden_cost_rate_override
3626 	    FROM   pa_resource_asgn_curr rbc
3627 	    WHERE  rbc.budget_version_id = p_budget_version_id
3628 	    AND    rbc.txn_bill_rate_override IS NOT NULL
3629 	    AND EXISTS ( SELECT null
3630 	                 FROM   TABLE(CAST( l_non_billable_fp_ra_id_tab AS SYSTEM.pa_num_tbl_type ))
3631 	                 WHERE  rbc.resource_assignment_id = column_value );
3632 
3633             l_count := SQL%ROWCOUNT;
3634 
3635             IF l_count > 0 THEN
3636                 -- CALL the maintenance api in INSERT mode
3637                 IF p_pa_debug_mode = 'Y' THEN
3638                     PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
3639                         P_MSG                   => 'Before calling PA_RES_ASG_CURRENCY_PUB.' ||
3640                                                    'MAINTAIN_DATA',
3641                         P_CALLED_MODE           => p_called_mode,
3642                         P_MODULE_NAME           => l_module_name);
3643                 END IF;
3644                 PA_RES_ASG_CURRENCY_PUB.MAINTAIN_DATA
3645                       ( P_FP_COLS_REC           => l_fp_cols_rec_target,
3646                         P_CALLING_MODULE        => 'FORECAST_GENERATION',
3647                         P_VERSION_LEVEL_FLAG    => 'N',
3648                         P_ROLLUP_FLAG           => 'N', -- 'N' indicates Insert
3649                         P_CALLED_MODE           => p_called_mode,
3650                         X_RETURN_STATUS         => x_return_status,
3651                         X_MSG_COUNT             => x_msg_count,
3652                         X_MSG_DATA              => x_msg_data );
3653                 IF p_pa_debug_mode = 'Y' THEN
3654                     PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
3655                         P_MSG                   => 'After calling PA_RES_ASG_CURRENCY_PUB.' ||
3656                                                    'MAINTAIN_DATA: '||x_return_status,
3657                         P_CALLED_MODE           => p_called_mode,
3658                         P_MODULE_NAME           => l_module_name);
3659                 END IF;
3660                 IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
3661                     raise PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
3662                 END IF;
3663             END IF; -- IF l_count > 0 THEN
3664         END IF; -- logic to null out bill rate overrides for non-billable tasks
3665 
3666     END IF; -- logic to copy source pa_resource_asgn_curr overrides
3667     -- END OF IPM: New Entity ER ------------------------------------------
3668 
3669 
3670     IF l_fp_cols_rec_target.x_version_type = 'REVENUE' and l_rev_gen_method = 'C' THEN
3671         l_cal_etc_revenue_tab := l_cal_etc_burdened_cost_tab;
3672     END IF;
3673              /*IF p_pa_debug_mode = 'Y' THEN
3674                  pa_fp_gen_amount_utils.fp_debug
3675                 (p_msg         => 'Value of l_rev_gen_method: '||l_rev_gen_method,
3676                  p_module_name => l_module_name,
3677                  p_log_level   => 5);
3678             END IF;
3679              IF p_pa_debug_mode = 'Y' THEN
3680                  pa_fp_gen_amount_utils.fp_debug
3681                 (p_msg         => 'Value of l_cal_etc_revenue_tab.count: '||l_cal_etc_revenue_tab.count,
3682                  p_module_name => l_module_name,
3683                  p_log_level   => 5);
3684             END IF;
3685              IF p_pa_debug_mode = 'Y' THEN
3686                  pa_fp_gen_amount_utils.fp_debug
3687                 (p_msg         => 'Value of l_cal_ra_id_tab.count: '||l_cal_ra_id_tab.count,
3688                  p_module_name => l_module_name,
3689                  p_log_level   => 5);
3690             END IF;*/
3691      -- hr_utility.trace('==Before calling calculate api in the loop');
3692      -- hr_utility.trace('==l_cal_ra_id tab count bef calculate api '||l_cal_ra_id_tab.count);
3693 
3694 
3695     /* ER 4376722: When the Target is a Revenue-only Forecast, we do not
3696      * generate quantity or amounts for non-rate-based resources of
3697      * non-billable tasks. The simple algorithm to do this is as follows:
3698      *
3699      * 0. Clear out any data in the _tmp tables.
3700      * 1. Copy records for
3701      *    a) billable tasks
3702      *    b) rate-based resources of non-billable tasks
3703      *       into _tmp tables.
3704      * 2. Copy records from _tmp tables back to non-temporary tables.
3705      *
3706      * The result is that we do not process records for non-rate-based
3707      * resources of non-billable task afterwards. Hence, quantity and
3708      * amounts for these resources will not be generated. */
3709 
3710     IF l_fp_cols_rec_target.x_version_type = 'REVENUE' THEN
3711 
3712         -- 0. Clear out any data in the _tmp tables.
3713         l_cal_src_ra_id_tab_tmp.delete;
3714         l_cal_ra_id_tab_tmp.delete;
3715         l_cal_txn_curr_code_tab_tmp.delete;
3716         l_cal_rate_based_flag_tab_tmp.delete;
3717         l_cal_rlm_id_tab_tmp.delete;
3718 		l_cal_cbs_id_tab_tmp.delete; --bug#16791711
3719         l_cal_task_id_tab_tmp.delete;
3720         l_cal_unit_of_measure_tab_tmp.delete;
3721         l_cal_etc_method_code_tab_tmp.delete;
3722         l_cal_etc_qty_tab_tmp.delete;
3723         l_cal_etc_raw_cost_tab_tmp.delete;
3724         l_cal_etc_brdn_cost_tab_tmp.delete;
3725         l_cal_etc_revenue_tab_tmp.delete;
3726         l_billable_flag_tab_tmp.delete;
3727 
3728         -- 1. Copy records for billable tasks into _tmp tables.
3729         l_tmp_index := 0;
3730         FOR i IN 1..l_cal_ra_id_tab.count LOOP
3731             IF l_billable_flag_tab(i) = 'Y' OR
3732               (l_billable_flag_tab(i) = 'N' AND
3733                l_cal_rate_based_flag_tab(i) = 'Y') THEN
3734 
3735                 l_cal_src_ra_id_tab_tmp.extend;
3736                 l_cal_ra_id_tab_tmp.extend;
3737                 l_cal_txn_curr_code_tab_tmp.extend;
3738                 l_cal_rate_based_flag_tab_tmp.extend;
3739                 l_cal_rlm_id_tab_tmp.extend;
3740 				l_cal_cbs_id_tab_tmp.extend; --bug#16791711
3741                 l_cal_task_id_tab_tmp.extend;
3742                 l_cal_unit_of_measure_tab_tmp.extend;
3743                 l_cal_etc_method_code_tab_tmp.extend;
3744                 l_cal_etc_qty_tab_tmp.extend;
3745                 l_cal_etc_raw_cost_tab_tmp.extend;
3746                 l_cal_etc_brdn_cost_tab_tmp.extend;
3747                 l_cal_etc_revenue_tab_tmp.extend;
3748                 l_billable_flag_tab_tmp.extend;
3749 
3750                 l_tmp_index := l_tmp_index + 1;
3751                 l_cal_src_ra_id_tab_tmp(l_tmp_index)       := l_cal_src_ra_id_tab(i);
3752                 l_cal_ra_id_tab_tmp(l_tmp_index)           := l_cal_ra_id_tab(i);
3753                 l_cal_txn_curr_code_tab_tmp(l_tmp_index)   := l_cal_txn_currency_code_tab(i);
3754                 l_cal_rate_based_flag_tab_tmp(l_tmp_index) := l_cal_rate_based_flag_tab(i);
3755                 l_cal_rlm_id_tab_tmp(l_tmp_index)          := l_cal_rlm_id_tab(i);
3756 				l_cal_cbs_id_tab_tmp(l_tmp_index)          := l_cal_cbs_id_tab(i);--bug#16791711
3757                 l_cal_task_id_tab_tmp(l_tmp_index)         := l_cal_task_id_tab(i);
3758                 l_cal_unit_of_measure_tab_tmp(l_tmp_index) := l_cal_unit_of_measure_tab(i);
3759                 l_cal_etc_method_code_tab_tmp(l_tmp_index) := l_cal_etc_method_code_tab(i);
3760                 l_cal_etc_qty_tab_tmp(l_tmp_index)         := l_cal_etc_qty_tab(i);
3761                 l_cal_etc_raw_cost_tab_tmp(l_tmp_index)    := l_cal_etc_raw_cost_tab(i);
3762                 l_cal_etc_brdn_cost_tab_tmp(l_tmp_index)   := l_cal_etc_burdened_cost_tab(i);
3763                 l_cal_etc_revenue_tab_tmp(l_tmp_index)     := l_cal_etc_revenue_tab(i);
3764                 l_billable_flag_tab_tmp(l_tmp_index)       := l_billable_flag_tab(i);
3765             END IF;
3766         END LOOP;
3767 
3768         -- 2. Copy records from _tmp_ tables back to non-temporary tables.
3769         l_cal_src_ra_id_tab         := l_cal_src_ra_id_tab_tmp;
3770         l_cal_ra_id_tab             := l_cal_ra_id_tab_tmp;
3771         l_cal_txn_currency_code_tab := l_cal_txn_curr_code_tab_tmp;
3772         l_cal_rate_based_flag_tab   := l_cal_rate_based_flag_tab_tmp;
3773         l_cal_rlm_id_tab            := l_cal_rlm_id_tab_tmp;
3774 		l_cal_cbs_id_tab            := l_cal_cbs_id_tab_tmp;--bug#16791711
3775         l_cal_task_id_tab           := l_cal_task_id_tab_tmp;
3776         l_cal_unit_of_measure_tab   := l_cal_unit_of_measure_tab_tmp;
3777         l_cal_etc_method_code_tab   := l_cal_etc_method_code_tab_tmp;
3778         l_cal_etc_qty_tab           := l_cal_etc_qty_tab_tmp;
3779         l_cal_etc_raw_cost_tab      := l_cal_etc_raw_cost_tab_tmp;
3780         l_cal_etc_burdened_cost_tab := l_cal_etc_brdn_cost_tab_tmp;
3781         l_cal_etc_revenue_tab       := l_cal_etc_revenue_tab_tmp;
3782         l_billable_flag_tab         := l_billable_flag_tab_tmp;
3783 
3784     END IF; -- ER 4376722 billability logic for REVENUE Forecast
3785 
3786     -- Initialize l_remove_record_flag
3787     l_remove_records_flag := 'N';
3788 
3789     -- Initialize l_remove_record_flag_tab
3790     FOR i IN 1..l_cal_ra_id_tab.count LOOP
3791         l_remove_record_flag_tab(i) := 'N';
3792     END LOOP;
3793 
3794     -- Initialize l_source_version_type_tab
3795     -- Initialize l_rev_only_src_txn_flag_tab
3796     FOR i IN 1..l_cal_ra_id_tab.count LOOP
3797 
3798         IF l_gen_etc_src_code_tab(i) = 'FINANCIAL_PLAN' THEN
3799             l_source_version_type_tab(i) := l_fp_cols_rec_fp.x_version_type;
3800         ELSIF l_gen_etc_src_code_tab(i) IN ('WORKPLAN_RESOURCES','WORK_QUANTITY') THEN
3801             l_source_version_type_tab(i) := l_fp_cols_rec_wp.x_version_type;
3802         ELSE -- l_gen_etc_src_code_tab(i) = 'NONE'
3803             l_source_version_type_tab(i) := null;
3804         END IF;
3805 
3806         l_rev_only_src_txn_flag_tab(i) := 'N';
3807 
3808         -- NOTE: Generation from Revenue-only versions not supported.
3809         -- This case has been added in case of future changes.
3810         IF l_source_version_type_tab(i) = 'REVENUE' OR
3811          ( l_source_version_type_tab(i) = 'ALL' AND
3812            nvl(l_cal_etc_raw_cost_tab(i),0) = 0 ) THEN
3813             l_rev_only_src_txn_flag_tab(i) := 'Y';
3814         END IF;
3815     END LOOP;
3816 
3817     l_target_version_type := l_fp_cols_rec_target.x_version_type;
3818 
3819     -- Added for IPM :
3820     -- This loop processes each planning txn, based on the source/target
3821     -- version type combination, and does the following:
3822     -- 1. Updates l_remove_record_flag_tab
3823 
3824     FOR i in 1..l_cal_ra_id_tab.count LOOP
3825 
3826         -- 1. Update l_remove_record_flag_tab based on source/target version types.
3827         IF l_source_version_type_tab(i) = 'ALL' AND l_target_version_type = 'COST' THEN
3828             IF l_cal_rate_based_flag_tab(i) = 'N' THEN
3829                 IF l_rev_only_src_txn_flag_tab(i) = 'Y' THEN
3830                     l_remove_record_flag_tab(i) := 'Y';
3831                     l_remove_records_flag := 'Y';
3832                 END IF;
3833             END IF;
3834         ELSIF l_source_version_type_tab(i) = 'ALL' AND
3835               l_target_version_type = 'REVENUE' AND
3836               l_rev_gen_method = 'T' THEN
3837             -- Set quantity to revenue in the main processing loop later.
3838             -- Do nothing for now.
3839             l_dummy := 1;
3840         ELSIF l_source_version_type_tab(i) = 'ALL' AND
3841               l_target_version_type = 'REVENUE' AND
3842               l_rev_gen_method = 'C' THEN
3843             IF l_cal_rate_based_flag_tab(i) = 'N' THEN
3844                 IF l_rev_only_src_txn_flag_tab(i) = 'Y' THEN
3845                     l_remove_record_flag_tab(i) := 'Y';
3846                     l_remove_records_flag := 'Y';
3847                 END IF;
3848             END IF;
3849         ELSIF l_source_version_type_tab(i) = 'ALL' AND
3850               l_target_version_type = 'REVENUE' AND
3851               l_rev_gen_method = 'E' THEN
3852             /*Revenue is only based on billing events, which is handled seperately*/
3853             l_dummy := 1;
3854             IF P_PA_DEBUG_MODE = 'Y' THEN
3855                 PA_DEBUG.RESET_CURR_FUNCTION;
3856             END IF;
3857             RETURN;
3858         ELSIF l_source_version_type_tab(i) = 'ALL' AND
3859               l_target_version_type = 'ALL' AND
3860               l_rev_gen_method = 'T' THEN
3861             -- Set quantity to revenue in the main processing loop later.
3862             -- Do nothing for now.
3863             l_dummy := 1;
3864         ELSIF l_source_version_type_tab(i) = 'ALL' AND
3865               l_target_version_type = 'ALL' AND
3866               l_rev_gen_method = 'C' THEN
3867             IF l_cal_rate_based_flag_tab(i) = 'N' THEN
3868                 IF l_rev_only_src_txn_flag_tab(i) = 'Y' THEN
3869                     l_remove_record_flag_tab(i) := 'Y';
3870                     l_remove_records_flag := 'Y';
3871                 END IF;
3872             END IF;
3873         ELSIF l_source_version_type_tab(i) = 'ALL' AND
3874               l_target_version_type = 'ALL' AND
3875               l_rev_gen_method = 'E' THEN
3876             IF l_cal_rate_based_flag_tab(i) = 'N' THEN
3877                 IF l_rev_only_src_txn_flag_tab(i) = 'Y' THEN
3878                     l_remove_record_flag_tab(i) := 'Y';
3879                     l_remove_records_flag := 'Y';
3880                 END IF;
3881             END IF;
3882         END IF;
3883 
3884     END LOOP; -- IPM filtering logic
3885 
3886     -- Added for IPM : In a Cost and Revenue Together version,
3887     -- if a non-billable, non-rate-based planning txn has only
3888     -- ETC revenue amounts, then filter out the record as if the
3889     -- Target were a Revenue-only version.
3890 
3891     IF l_target_version_type = 'ALL' THEN
3892         FOR i IN 1..l_cal_ra_id_tab.count LOOP
3893             IF l_billable_flag_tab(i) = 'N' AND
3894                l_rev_only_src_txn_flag_tab(i) = 'Y' AND
3895                l_cal_rate_based_flag_tab(i) = 'N' THEN
3896                 l_remove_record_flag_tab(i) := 'Y';
3897                 l_remove_records_flag := 'Y';
3898             END IF;
3899         END LOOP;
3900     END IF; -- Added billability logic for ALL versions in IPM
3901 
3902     -- Added for IPM : Properly size pl/sql system tables
3903     -- outside of the loop so that skipping records using
3904     -- the continue_loop exception does not throw the loop
3905     -- iterator and table sizes out of sync.
3906 
3907     IF l_cal_ra_id_tab.count > 0 THEN
3908         l_cal_rcost_rate_override_tab.extend(l_cal_ra_id_tab.count);
3909         l_cal_bcost_rate_override_tab.extend(l_cal_ra_id_tab.count);
3910         l_cal_bill_rate_override_tab.extend(l_cal_ra_id_tab.count);
3911     END IF;
3912 
3913     FOR i in 1..l_cal_ra_id_tab.count LOOP
3914     BEGIN
3915 
3916         -- Added in IPM:
3917         -- Before processing the current planning txn, check if the
3918         -- record should be skipped. If so, continue with next record.
3919         IF l_remove_record_flag_tab(i) = 'Y' THEN
3920             RAISE continue_loop;
3921         END IF;
3922 
3923         -- Bug 4346172: In general, when source/target planning options match,
3924         -- we use the source version's periodic planning rates to calculate the
3925         -- amounts. However, when the ETC method is Earned Value, we honor the
3926         -- actuals rates. The l_use_src_rates_flag captures this information.
3927 
3928         -- Bug 4369741: Extended IF condition logic to set l_use_src_rates_flag
3929         -- based on 2 separate planning options flags (for WP and FP) and the
3930         -- ETC generation source stored in l_gen_etc_src_code_tab.
3931 
3932         IF l_cal_etc_method_code_tab(i) <> 'EARNED_VALUE' AND
3933            (( l_fp_planning_options_flag = 'Y' AND
3934               l_gen_etc_src_code_tab(i) = 'FINANCIAL_PLAN' ) OR
3935             ( l_wp_planning_options_flag = 'Y' AND
3936               l_gen_etc_src_code_tab(i) = 'WORKPLAN_RESOURCES' )) THEN
3937 	    l_use_src_rates_flag := 'Y';
3938         ELSE
3939 	    l_use_src_rates_flag := 'N';
3940 	END IF;
3941 
3942 
3943         IF l_cal_rate_based_flag_tab(i) = 'N' THEN
3944             -- Bug 4232094, 4232253: For Cost-based Revenue generation, quantity should
3945             -- equal burdened cost. We make use of this modified l_cal_etc_qty_tab later
3946             -- for another part of the bug fix.
3947             IF l_fp_cols_rec_target.x_version_type = 'REVENUE' and l_rev_gen_method = 'C' THEN
3948                 -- IPM : Earlier, the code checks if cost amounts exists and
3949                 -- skips processing if they do not exist. Hence, the assignment
3950                 -- below should only be reached when it makes sense to do so.
3951                 l_cal_etc_qty_tab(i) := l_cal_etc_burdened_cost_tab(i);
3952             ELSE
3953                 -- IPM : When only revenue amounts exist, quantity should equal revenue
3954                 -- for non-rate-based transactions. Based on record filtering logic
3955                 -- upstream, this should only happen under the following conditions:
3956                 -- * Source is an 'ALL' version
3957                 -- * Target is either a 'REVENUE' or 'ALL' version
3958                 -- * Revenue accrual method is 'T' (work-based)
3959                 IF l_rev_only_src_txn_flag_tab(i) = 'Y' THEN
3960                     l_cal_etc_qty_tab(i) := l_cal_etc_revenue_tab(i);
3961                 ELSE
3962                     l_cal_etc_qty_tab(i) := l_cal_etc_raw_cost_tab(i);
3963                 END IF;
3964 
3965             END IF;
3966         END IF;
3967 
3968          -- hr_utility.trace('==inside the loop for calling calcualte   ');
3969 
3970         -- Modified for IPM : Instead of extending the table size by 1 on
3971         -- each loop iteration, we now extend all at once before the loop.
3972         --l_cal_rcost_rate_override_tab.extend;
3973         --l_cal_bcost_rate_override_tab.extend;
3974 
3975         -- ER 5726773: Instead of requiring l_cal_etc_qty_tab(i) be positive,
3976  	-- relax the condition to ensure it is non-zero.
3977  	IF l_cal_etc_qty_tab(i) <> 0 THEN
3978             l_cal_rcost_rate_override_tab(i) := l_cal_etc_raw_cost_tab(i)/l_cal_etc_qty_tab(i);
3979             l_cal_bcost_rate_override_tab(i) := l_cal_etc_burdened_cost_tab(i)/l_cal_etc_qty_tab(i);
3980         ELSE
3981             l_cal_rcost_rate_override_tab(i) := NULL;
3982             l_cal_bcost_rate_override_tab(i) := NULL;
3983         END IF;
3984         -- Modified for IPM : Instead of extending the table size by 1 on
3985         -- each loop iteration, we now extend all at once before the loop.
3986         --l_cal_bill_rate_override_tab.extend;
3987         l_cal_bill_rate_override_tab(i) := NULL;
3988         IF l_fp_cols_rec_target.x_version_type = 'REVENUE' and l_rev_gen_method = 'C' THEN
3989             l_cal_bill_rate_override_tab(i) :=  l_cal_bcost_rate_override_tab(i);
3990             l_cal_etc_raw_cost_tab(i) := NULL;
3991             l_cal_etc_burdened_cost_tab(i) := NULL;
3992             l_cal_rcost_rate_override_tab(i) := NULL;
3993             l_cal_bcost_rate_override_tab(i) := NULL;
3994         END IF;
3995 
3996         -- Added in IPM :
3997         -- For the case given below, set bill rate override to 1
3998         -- so that revenue will equal quantity (and not be rederived).
3999         -- If the target is an ALL version, then also set the
4000         -- cost rate overrides to 0 so the Calculate API does not
4001         -- default them to 1 and then compute cost amounts.
4002 
4003         IF l_rev_only_src_txn_flag_tab(i) = 'Y' AND
4004            l_cal_rate_based_flag_tab(i) = 'N' AND
4005            l_target_version_type IN ('REVENUE','ALL') AND
4006            l_rev_gen_method = 'T' THEN
4007             l_cal_bill_rate_override_tab(i) := 1;
4008             IF l_target_version_type = 'ALL' THEN
4009                 l_cal_rcost_rate_override_tab(i) := 0;
4010                 l_cal_bcost_rate_override_tab(i) := 0;
4011             END IF;
4012         END IF;
4013 
4014 
4015         -- Bug 4216423: We now need to populate PA_FP_GEN_RATE_TMP with cost
4016         -- rates for both rate-based and non-rate based resources when generating
4017         -- work-based revenue for a Revenue-only target version.
4018 
4019         -- Added in IPM : When generating revenue-only, non-rate-based txns
4020         -- for ALL versions with work-based revenue accrual, do not use periodic
4021         -- source rates. Instead, populate the temp table with bill rate
4022         -- override as 1 and cost rate overrides as 0.
4023 
4024         IF  l_use_src_rates_flag = 'Y' AND
4025             NOT ( p_fp_cols_rec.x_version_type = 'REVENUE' AND l_rev_gen_method = 'T' ) AND
4026             NOT ( p_fp_cols_rec.x_version_type = 'ALL' AND l_rev_gen_method = 'T' AND
4027                   l_rev_only_src_txn_flag_tab(i) = 'Y' AND l_cal_rate_based_flag_tab(i) = 'N') THEN
4028 
4029            -- hr_utility.trace('==inside plan option same flag = Y  ');
4030             IF P_PA_DEBUG_MODE = 'Y' THEN
4031                 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
4032                     P_CALLED_MODE   => P_CALLED_MODE,
4033                     P_MSG           =>
4034                     'Before calling PA_FP_GEN_FCST_AMT_PUB1.POPULATE_GEN_RATE',
4035                     P_MODULE_NAME   => l_module_name);
4036             END IF;
4037             PA_FP_GEN_FCST_AMT_PUB1.POPULATE_GEN_RATE
4038                (P_SOURCE_RES_ASG_ID => l_cal_src_ra_id_tab(i),
4039                 P_TARGET_RES_ASG_ID => l_cal_ra_id_tab(i),
4040                 P_TXN_CURRENCY_CODE => l_cal_txn_currency_code_tab(i),
4041                 X_RETURN_STATUS     => x_return_status,
4042                 X_MSG_COUNT         => x_msg_count,
4043                 X_MSG_DATA          => x_msg_data);
4044             IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
4045                 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
4046             END IF;
4047             IF P_PA_DEBUG_MODE = 'Y' THEN
4048                 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
4049                     P_CALLED_MODE   => P_CALLED_MODE,
4050                     P_MSG           =>
4051                     'After calling PA_FP_GEN_FCST_AMT_PUB1.POPULATE_GEN_RATE: '||x_return_status,
4052                     P_MODULE_NAME   => l_module_name);
4053             END IF;
4054 
4055             /* Populate the period rates table for the Client Extension API */
4056 
4057             -- Bug 4320954: When we fetch data from and update data to the
4058             -- PA_FP_GEN_RATE_TMP table for the Client Extension API, we need
4059             -- to check both the target_res_asg_id AND the TXN_CURRENCY_CODE
4060             -- in the WHERE clause so that the plan currency is honored.
4061 
4062             SELECT /*+ INDEX(PA_FP_GEN_RATE_TMP,PA_FP_GEN_RATE_TMP_N1)*/
4063                    period_name,
4064                    raw_cost_rate,
4065                    burdened_cost_rate,
4066                    revenue_bill_rate
4067             BULK COLLECT
4068             INTO   l_ext_period_name_tab,
4069                    l_ext_raw_cost_rate_tab,
4070                    l_ext_burdened_cost_rate_tab,
4071                    l_ext_revenue_bill_rate_tab
4072             FROM   pa_fp_gen_rate_tmp
4073             WHERE  target_res_asg_id = l_cal_ra_id_tab(i)
4074             AND    txn_currency_code = l_cal_txn_currency_code_tab(i);
4075 
4076             l_input_period_rates_tbl.delete;
4077             FOR j IN 1..l_ext_period_name_tab.count LOOP
4078                 l_input_period_rates_tbl(j).period_name := l_ext_period_name_tab(j);
4079                 l_input_period_rates_tbl(j).raw_cost_rate := l_ext_raw_cost_rate_tab(j);
4080                 l_input_period_rates_tbl(j).burdened_cost_rate := l_ext_burdened_cost_rate_tab(j);
4081                 l_input_period_rates_tbl(j).revenue_bill_rate := l_ext_revenue_bill_rate_tab(j);
4082             END LOOP;
4083         ELSIF ( p_fp_cols_rec.x_version_type = 'REVENUE' AND l_rev_gen_method = 'T' ) THEN
4084             /* Populate the period rates table for the Client Extension API */
4085             l_input_period_rates_tbl.delete;
4086             l_input_period_rates_tbl(1).raw_cost_rate := l_cal_rcost_rate_override_tab(i);
4087             l_input_period_rates_tbl(1).burdened_cost_rate := l_cal_bcost_rate_override_tab(i);
4088 
4089             IF l_rev_only_src_txn_flag_tab(i) = 'Y' AND
4090                l_cal_rate_based_flag_tab(i) = 'N' THEN
4091                  l_input_period_rates_tbl(1).revenue_bill_rate := l_cal_bill_rate_override_tab(i);
4092             END IF;
4093 
4094         --  Added in IPM : This handles a corner case.
4095         ELSIF ( p_fp_cols_rec.x_version_type = 'ALL' AND l_rev_gen_method = 'T' AND
4096                  l_rev_only_src_txn_flag_tab(i) = 'Y' AND l_cal_rate_based_flag_tab(i) = 'N') THEN
4097 
4098             /* Populate the period rates table for the Client Extension API */
4099             l_input_period_rates_tbl.delete;
4100             l_input_period_rates_tbl(1).raw_cost_rate := l_cal_rcost_rate_override_tab(i);
4101             l_input_period_rates_tbl(1).burdened_cost_rate := l_cal_bcost_rate_override_tab(i);
4102             l_input_period_rates_tbl(1).revenue_bill_rate := l_cal_bill_rate_override_tab(i);
4103 
4104         END IF;
4105 
4106 
4107         /* ER 4376722: When the Target is a Revenue-only Forecast, we
4108          * generate quantity but not revenue for rate-based resources of
4109          * non-billable tasks. To do this, null out revenue amounts,
4110          * overrides, and possible periodic rates for rate-based
4111          * resources of non-billable tasks.
4112          * Note that we handle the case of non-rated-based resources
4113          * of non-billable tasks earlier in the code. */
4114 
4115         IF l_fp_cols_rec_target.x_version_type = 'REVENUE' THEN
4116             -- Null out revenue amounts for non-billable tasks
4117             IF l_billable_flag_tab(i) = 'N' AND
4118                l_cal_rate_based_flag_tab(i) = 'Y' THEN
4119 
4120                 l_cal_etc_revenue_tab(i) := NULL;
4121                 l_cal_bill_rate_override_tab(i) := NULL;
4122 
4123                 FOR j IN 1..l_input_period_rates_tbl.count LOOP
4124                     -- null out cost rates in case of Work-based revenue
4125                     l_input_period_rates_tbl(j).raw_cost_rate := NULL;
4126                     l_input_period_rates_tbl(j).burdened_cost_rate := NULL;
4127                     l_input_period_rates_tbl(j).revenue_bill_rate := NULL;
4128                 END LOOP;
4129             END IF;
4130         END IF; -- ER 4376722 billability logic for REVENUE Forecast
4131 
4132 
4133         /* ER 4376722: When the Target is a Cost and Revenue together
4134          * version, we do not generate revenue for non-billable tasks.
4135          * To do this, null out revenue amounts, overrides, and possible
4136          * periodic rates for non-billable tasks. Since we call the
4137          * Client Extension, it's possible for revenue to be overriden
4138          * for non-billable tasks. */
4139 
4140         IF l_fp_cols_rec_target.x_version_type = 'ALL' THEN
4141             -- Null out revenue amounts for non-billable tasks
4142             IF l_billable_flag_tab(i) = 'N' THEN
4143 
4144                 l_cal_etc_revenue_tab(i) := NULL;
4145                 l_cal_bill_rate_override_tab(i) := NULL;
4146 
4147                 FOR j IN 1..l_input_period_rates_tbl.count LOOP
4148                     l_input_period_rates_tbl(j).revenue_bill_rate := NULL;
4149                 END LOOP;
4150             END IF;
4151         END IF; -- ER 4376722 billability logic for ALL versions
4152 
4153 
4154         IF P_PA_DEBUG_MODE = 'Y' THEN
4155             PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
4156                 P_CALLED_MODE   => P_CALLED_MODE,
4157                 P_MSG           =>
4158                 'Before calling pa_fp_fcst_gen_client_ext.fcst_gen_client_extn',
4159                 P_MODULE_NAME   => l_module_name);
4160         END IF;
4161         /*For client_extn, many attributes are passed as NULL is because
4162           this API is still under developmen and some parameters are not
4163           available.Null values will be replaced later*/
4164         /* Call PA_FP_GEN_FCST_AMT_PUB1.POPULATE_GEN_RATE to populate
4165            pa_fp_gen_rate_tmp, which is used to populate input parameter
4166            P_PERIOD_RATES_TBL */
4167 
4168         -- hr_utility.trace('==before calling client extn api ');
4169 
4170         --This code has been commented due to bug 5726785 where the client extension
4171  	 --call has been made be passing the existing and also the periodic level amounts.
4172 
4173  	 /*        PA_FP_FCST_GEN_CLIENT_EXT.FCST_GEN_CLIENT_EXTN
4174            (P_PROJECT_ID                => P_PROJECT_ID,
4175             P_BUDGET_VERSION_ID         => P_BUDGET_VERSION_ID,
4176             P_RESOURCE_ASSIGNMENT_ID    => l_cal_ra_id_tab(i),
4177             P_TASK_ID                   => l_cal_task_id_tab(i),
4178             P_TASK_PERCENT_COMPLETE     => NULL,
4179             P_PROJECT_PERCENT_COMPLETE  => NULL,
4180             P_RESOURCE_LIST_MEMBER_ID   => l_cal_rlm_id_tab(i),
4181             P_UNIT_OF_MEASURE           => l_cal_unit_of_measure_tab(i), -- NEW PARAM
4182             P_TXN_CURRENCY_CODE         => l_cal_txn_currency_code_tab(i),
4183             P_ETC_QTY                   => l_cal_etc_qty_tab(i),
4184             P_ETC_RAW_COST              => l_cal_etc_raw_cost_tab(i),
4185             P_ETC_BURDENED_COST         => l_cal_etc_burdened_cost_tab(i),
4186             P_ETC_REVENUE               => l_cal_etc_revenue_tab(i),
4187             P_ETC_SOURCE                => NULL,
4188             P_ETC_GEN_METHOD            => l_cal_etc_method_code_tab(i),
4189             P_ACTUAL_THRU_DATE          => P_ACTUALS_THRU_DATE,
4190             P_ETC_START_DATE            => P_ACTUALS_THRU_DATE+1,
4191             P_ETC_END_DATE              => NULL,
4192             P_PLANNED_WORK_QTY          => NULL,
4193             P_ACTUAL_WORK_QTY           => NULL,
4194             P_ACTUAL_QTY                => NULL,
4195             P_ACTUAL_RAW_COST           => NULL,
4196             P_ACTUAL_BURDENED_COST      => NULL,
4197             P_ACTUAL_REVENUE            => NULL,
4198             P_PERIOD_RATES_TBL          => l_input_period_rates_tbl, --  NEW PARAM
4199             X_ETC_QTY                   => l_fcst_etc_qty,
4200             X_ETC_RAW_COST              => l_fcst_etc_raw_cost,
4201             X_ETC_BURDENED_COST         => l_fcst_etc_burdened_cost,
4202             X_ETC_REVENUE               => l_fcst_etc_revenue,
4203             X_PERIOD_RATES_TBL          => l_period_rates_tbl, -- NEW PARAM
4204             X_RETURN_STATUS             => x_return_status,
4205             X_MSG_DATA                  => x_msg_data,
4206             X_MSG_COUNT                 => x_msg_count);
4207 
4208        -- hr_utility.trace('==after calling client extn api ');
4209 
4210         IF P_PA_DEBUG_MODE = 'Y' THEN
4211             PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
4212                 P_CALLED_MODE   => P_CALLED_MODE,
4213                 P_MSG           =>
4214                 'After calling pa_fp_fcst_gen_client_ext.fcst_gen_client_extn: '
4215                                 ||x_return_status,
4216                 P_MODULE_NAME   => l_module_name);
4217         END IF;
4218         IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
4219             RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
4220         END IF; */
4221 
4222 	-- Code in client extn kept here to avoid further changes in code after client extn.
4223 	/* bug fix 5726773 : commenting out unecessary client-extension related code */
4224 	/*
4225  	         l_fcst_etc_qty := l_cal_etc_qty_tab(i);
4226  	         l_fcst_etc_raw_cost := l_cal_etc_raw_cost_tab(i);
4227  	         l_fcst_etc_burdened_cost := l_cal_etc_burdened_cost_tab(i);
4228  	         l_fcst_etc_revenue := l_cal_etc_revenue_tab(i);
4229 
4230  	         IF l_input_period_rates_tbl.count > 0 and
4231  	            l_period_rates_tbl.count = 0 THEN
4232  	         FOR j IN 1..l_input_period_rates_tbl.count LOOP
4233  	             l_period_rates_tbl(j).period_name := l_input_period_rates_tbl(j).period_name;
4234  	             l_period_rates_tbl(j).raw_cost_rate := l_input_period_rates_tbl(j).raw_cost_rate;
4235  	             l_period_rates_tbl(j).burdened_cost_rate := l_input_period_rates_tbl(j).burdened_cost_rate;
4236  	             l_period_rates_tbl(j).revenue_bill_rate := l_input_period_rates_tbl(j).revenue_bill_rate;
4237  	         END LOOP;
4238 		 END IF;
4239  	 */
4240 	/* end bug fix 5726773 */
4241 	 -- Code in client extn kept here to avoid further changes in code after client extn.
4242 
4243         -- Bug 3968748: We need to populate the PA_FP_GEN_RATE_TMP table with
4244         -- burdened cost rates for non-rate-based resources for Calculate API
4245         -- when generating work-based revenue for a Revenue-only target version.
4246 
4247         -- Bug 4216423: We now need to populate PA_FP_GEN_RATE_TMP with cost
4248         -- rates for both rate-based and non-rate based resources when generating
4249         -- work-based revenue for a Revenue-only target version.
4250 
4251         IF  l_use_src_rates_flag = 'Y' OR
4252             ( p_fp_cols_rec.x_version_type = 'REVENUE' AND l_rev_gen_method = 'T' ) OR
4253             -- Added Condition for IPM
4254             ( p_fp_cols_rec.x_version_type = 'ALL' AND l_rev_gen_method = 'T' AND
4255               l_rev_only_src_txn_flag_tab(i) = 'Y' AND l_cal_rate_based_flag_tab(i) = 'N') THEN
4256 
4257             -- Bug 4320954: When we fetch data from and update data to the
4258             -- PA_FP_GEN_RATE_TMP table for the Client Extension API, we need
4259             -- to check both the target_res_asg_id AND the TXN_CURRENCY_CODE
4260             -- in the WHERE clause so that the plan currency is honored.
4261 
4262             DELETE /*+ INDEX(PA_FP_GEN_RATE_TMP,PA_FP_GEN_RATE_TMP_N1)*/
4263             FROM   pa_fp_gen_rate_tmp
4264             WHERE target_res_asg_id = l_cal_ra_id_tab(i)
4265             AND   txn_currency_code = l_cal_txn_currency_code_tab(i);
4266 
4267             l_ext_period_name_tab.delete;
4268             l_ext_raw_cost_rate_tab.delete;
4269             l_ext_burdened_cost_rate_tab.delete;
4270             l_ext_revenue_bill_rate_tab.delete;
4271 
4272 	    /* bug fix 5726773: Use l_input_period_rates_tbl instead of l_period_rates_tbl */
4273 	    FOR j IN 1..l_input_period_rates_tbl.count LOOP
4274 		l_ext_period_name_tab(j) := l_input_period_rates_tbl(j).period_name;
4275 		l_ext_raw_cost_rate_tab(j) := l_input_period_rates_tbl(j).raw_cost_rate;
4276 		l_ext_burdened_cost_rate_tab(j) := l_input_period_rates_tbl(j).burdened_cost_rate;
4277                 l_ext_revenue_bill_rate_tab(j) := l_input_period_rates_tbl(j).revenue_bill_rate;
4278 	    END LOOP;
4279 
4280 	    FORALL j IN 1..l_ext_period_name_tab.count
4281 	        INSERT INTO PA_FP_GEN_RATE_TMP
4282 	             ( SOURCE_RES_ASG_ID,
4283 	               TXN_CURRENCY_CODE,
4284 	               PERIOD_NAME,
4285 	               RAW_COST_RATE,
4286 	               BURDENED_COST_RATE,
4287 	               REVENUE_BILL_RATE,
4288 	               TARGET_RES_ASG_ID )
4289 	        VALUES
4290 	             ( l_cal_src_ra_id_tab(i),
4291 	               l_cal_txn_currency_code_tab(i),
4292                        l_ext_period_name_tab(j),
4293                        l_ext_raw_cost_rate_tab(j),
4294                        l_ext_burdened_cost_rate_tab(j),
4295                        l_ext_revenue_bill_rate_tab(j),
4296 	               l_cal_ra_id_tab(i) );
4297         END IF;
4298 
4299        /* hr_utility.trace('==etc qty aft client extn api  '||l_fcst_etc_qty);
4300        hr_utility.trace('==etc cost aft client extn api '||l_fcst_etc_raw_cost);
4301        hr_utility.trace('==etc bd cost aft client extn api '||l_fcst_etc_burdened_cost);
4302        hr_utility.trace('==etc rev  aft client extn api '||l_fcst_etc_revenue);  */
4303 
4304  /* bug fix 5726773 : commenting out unecessary client-extension related code */
4305  	 /*
4306         l_cal_etc_qty_tab(i)           := l_fcst_etc_qty;
4307         l_cal_etc_raw_cost_tab(i)      := l_fcst_etc_raw_cost;
4308         l_cal_etc_burdened_cost_tab(i) := l_fcst_etc_burdened_cost;
4309         l_cal_etc_revenue_tab(i)       := l_fcst_etc_revenue;
4310 	*/
4311 /* end bug fix 5726773 */
4312 
4313         IF (l_use_src_rates_flag = 'Y' OR
4314            (p_fp_cols_rec.x_version_type = 'REVENUE' AND l_rev_gen_method = 'T'))
4315            AND l_cal_rate_based_flag_tab(i) = 'Y' THEN
4316 		   /* Adding an if condition for bug#12377838.
4317 		      For a resources which do not have the actual amounts, the calculate api is not being invoked.
4318 			  So, when the raw cost and burdened cost are being assigned to null value, those values are
4319 			  not getting populated. So, added an extra condition to not to make null the raw cost and
4320 			  burdened cost.
4321 		   */
4322 		   IF (P_FP_COLS_REC.X_TIME_PHASED_CODE <> 'N' or p_fp_cols_rec.x_version_type = 'REVENUE') THEN  -- Added for bug#12377838
4323 				l_cal_etc_raw_cost_tab(i)      := NULL;
4324 				l_cal_etc_burdened_cost_tab(i) := NULL;
4325 				l_cal_etc_revenue_tab(i)       := NULL;
4326 
4327 				l_cal_rcost_rate_override_tab(i) := NULL;
4328 				l_cal_bcost_rate_override_tab(i) := NULL;
4329 			END IF;
4330         END IF;
4331 
4332         /*Bug fix: 4258968: for none rate based resources, bill markup should be applied
4333           on top of raw cost, not revenue. So,nullify revenue here*/
4334 
4335         IF (p_fp_cols_rec.x_version_type = 'REVENUE' OR p_fp_cols_rec.x_version_type = 'ALL')
4336            AND l_rev_gen_method = 'T'
4337            AND l_cal_rate_based_flag_tab(i) = 'N' THEN
4338             l_cal_etc_revenue_tab(i)        := NULL;
4339             l_cal_bill_rate_override_tab(i) := NULL;
4340         END IF;
4341 
4342         /* Start bug 3826548
4343            The following code has been added as a short term fix only.
4344            The Calculate API expects the total amounts for populating the
4345            budget lines for the ETC periods. Inside the Calculate API, they
4346            derived the actual amounts and subtract it from the passed total
4347            amounts. This fix is being patched for only testing the forecast
4348            generation process with the following assumptions.
4349 
4350            1. There is going to be only one txn currency for the actual txn
4351               for the planning resource. - Actual amt currency.
4352            2. ETC source - Work Plan/Financial Plan - The Plan amount for the
4353               planning resource should be planned in only one txn currency.
4354               (For Work plan, it is always going to be only one txn currency.
4355                But, this may change in the future.) - Plan amt currency.
4356            3. The Actual amt currency and the Plan amt currency should be same.
4357 
4358           The above fix will not cover all the cases. If we are going to have
4359           actual txn amounts in multiple currencies or if the ETC source total
4360           plan amount is going to be planned in multiple currencies, we will
4361           generate the ETC amount in Project Currency. In this case, if we  have
4362           three different actual txn currencies and one planning currency for the
4363           planning currency (which is different from the actual txn currencies),
4364           then the actual amount cannot be derived from the budget lines for the
4365           target version. B/c, the Calculate/Spread API gets the actual amounts
4366           based on the txn currency passed from the fcst gen code. In this case,
4367           we wont get any amounts.
4368 
4369           The fcst gen process will not give better performance results. B/c,
4370           from the fcst gen process, we are going to add the actual amount by
4371           reading the budget line data. Then, the Calculate/Spread API is going
4372           to select the same data and subtract the amounts from the total amount.
4373 
4374           Permanent Fix : The 'Calculate/Spread' API should spread only the amount
4375           passed from the fcst generation process and should not manipulate the
4376           data in any way. We have the p_calling_module parameter and this
4377           parameter should be used to avoid any manipulation to the passed data.
4378 
4379           If we go with the above strategy then the following code to select the
4380           actual amount (and adding the actual amount to the ETC amounts) should be
4381           removed and the changes should be made in the
4382           Calculate API/Spread API.
4383 
4384           If we are going to address this issue using a different strategy then
4385           the code changes should be made in Fcst gen/Calculate/Spread API.
4386 
4387           End bug 3826548
4388         */
4389 
4390         /* bug fix start */
4391 
4392         -- Bug 4211776, 4194849: Commented out logic for addition of actuals.
4393 /*
4394         SELECT sum(init_quantity),
4395                sum(txn_init_raw_cost),
4396                sum(txn_init_burdened_cost),
4397                sum(txn_init_revenue)
4398           INTO l_init_qty,
4399                l_init_raw_cost,
4400                l_init_burdened_cost,
4401                l_init_revenue
4402         FROM pa_budget_lines
4403         WHERE resource_assignment_id = l_cal_ra_id_tab(i)
4404               AND txn_currency_code = l_cal_txn_currency_code_tab(i);
4405 
4406         l_cal_etc_qty_tab(i) := NVL(l_cal_etc_qty_tab(i),0) +
4407                                 NVL(l_init_qty,0);
4408 
4409         IF p_fp_cols_rec.x_version_type = 'COST' THEN
4410             l_cal_etc_raw_cost_tab(i) := NVL(l_cal_etc_raw_cost_tab(i),0)  +
4411                                          NVL(l_init_raw_cost,0);
4412             l_cal_etc_burdened_cost_tab(i) := NVL(l_cal_etc_burdened_cost_tab(i),0) +
4413                                               NVL(l_init_burdened_cost,0);
4414         ELSIF p_fp_cols_rec.x_version_type = 'REVENUE' THEN
4415             l_cal_etc_revenue_tab(i) := NVL(l_cal_etc_revenue_tab(i),0) +
4416                                         NVL(l_init_revenue,0);
4417         ELSIF p_fp_cols_rec.x_version_type = 'ALL' THEN
4418             l_cal_etc_raw_cost_tab(i) := NVL(l_cal_etc_raw_cost_tab(i),0) +
4419                                          NVL(l_init_raw_cost,0);
4420             l_cal_etc_burdened_cost_tab(i) := NVL(l_cal_etc_burdened_cost_tab(i),0) +
4421                                               NVL(l_init_burdened_cost,0);
4422             l_cal_etc_revenue_tab(i) := NVL(l_cal_etc_revenue_tab(i),0) +
4423                                         NVL(l_init_revenue,0);
4424         END IF;
4425 */
4426 
4427        /* bug fix end */
4428          --hr_utility.trace('==Before calculate, l_cal_ra_id_tab('||i||'):'||l_cal_ra_id_tab(i));
4429          --hr_utility.trace('==Before calculate, l_cal_txn_currency_code_tab('||i||'):'||l_cal_txn_currency_code_tab(i));
4430          --hr_utility.trace('==Before calculate, l_cal_etc_qty_tab('||i||'):'||l_cal_etc_qty_tab(i));
4431          --hr_utility.trace('==Before calculate, l_cal_etc_raw_cost_tab('||i||'):'||l_cal_etc_raw_cost_tab(i));
4432          --hr_utility.trace('==Before calculate, l_cal_etc_burdened_cost_tab('||i||'):'||l_cal_etc_burdened_cost_tab(i));
4433          --hr_utility.trace('==Before calculate, l_cal_etc_revenue_tab('||i||'):'||l_cal_etc_revenue_tab(i));
4434          --hr_utility.trace('==Before calculate, l_cal_rcost_rate_override_tab('||i||'):'||l_cal_rcost_rate_override_tab(i));
4435          --hr_utility.trace('==Before calculate, l_cal_bcost_rate_override_tab('||i||'):'||l_cal_bcost_rate_override_tab(i));
4436          --hr_utility.trace('==Before calculate, l_cal_bill_rate_override_tab('||i||'):'||l_cal_bill_rate_override_tab(i));
4437          -- dbms_output.put_line('==Before calculate, l_cal_ra_id_tab('||i||'):'||l_cal_ra_id_tab(i));
4438          --dbms_output.put_line('==Before calculate, l_cal_txn_currency_code_tab('||i||'):'||l_cal_txn_currency_code_tab(i));
4439          --dbms_output.put_line('==Before calculate, l_cal_etc_qty_tab('||i||'):'||l_cal_etc_qty_tab(i));
4440          --dbms_output.put_line('==Before calculate, l_cal_etc_raw_cost_tab('||i||'):'||l_cal_etc_raw_cost_tab(i));
4441          --dbms_output.put_line('==Before calculate, l_cal_etc_burdened_cost_tab('||i||'):'||l_cal_etc_burdened_cost_tab(i));
4442 
4443     -- Added in IPM: The continue_loop Exception is used within the
4444     -- loop to skip further processing of the current planning txn.
4445     EXCEPTION
4446         WHEN CONTINUE_LOOP THEN
4447             l_dummy := 1;
4448         WHEN OTHERS THEN
4449             RAISE;
4450     END;
4451     END LOOP;
4452 
4453 
4454     -- Added in IPM. If there are any pl/sql table records that need to
4455     -- be removed, use a separate set of _tmp_ tables to filter them out.
4456 
4457     IF l_remove_records_flag = 'Y' THEN
4458 
4459         -- 0. Clear out any data in the _tmp_ tables.
4460         l_cal_src_ra_id_tab_tmp.delete;
4461         l_cal_ra_id_tab_tmp.delete;
4462         l_cal_txn_curr_code_tab_tmp.delete;
4463         l_cal_rate_based_flag_tab_tmp.delete;
4464         l_cal_rlm_id_tab_tmp.delete;
4465 		l_cal_cbs_id_tab_tmp.delete; --bug#16791711
4466         l_cal_task_id_tab_tmp.delete;
4467         l_cal_unit_of_measure_tab_tmp.delete;
4468         l_cal_etc_method_code_tab_tmp.delete;
4469         l_cal_etc_qty_tab_tmp.delete;
4470         l_cal_etc_raw_cost_tab_tmp.delete;
4471         l_cal_etc_brdn_cost_tab_tmp.delete;
4472         l_cal_etc_revenue_tab_tmp.delete;
4473         l_billable_flag_tab_tmp.delete;
4474         l_cal_rcost_rate_ovrd_tab_tmp.delete;
4475         l_cal_bcost_rate_ovrd_tab_tmp.delete;
4476         l_cal_bill_rate_ovrd_tab_tmp.delete;
4477 
4478         -- 1. Copy records into _tmp_ tables
4479         l_index := 1;
4480         FOR i in 1..l_cal_ra_id_tab.count LOOP
4481             IF l_remove_record_flag_tab(i) <> 'Y' THEN
4482 
4483                 l_cal_src_ra_id_tab_tmp.extend;
4484                 l_cal_ra_id_tab_tmp.extend;
4485                 l_cal_txn_curr_code_tab_tmp.extend;
4486                 l_cal_rate_based_flag_tab_tmp.extend;
4487                 l_cal_rlm_id_tab_tmp.extend;
4488 				l_cal_cbs_id_tab_tmp.extend; --bug#16791711
4489                 l_cal_task_id_tab_tmp.extend;
4490                 l_cal_unit_of_measure_tab_tmp.extend;
4491                 l_cal_etc_method_code_tab_tmp.extend;
4492                 l_cal_etc_qty_tab_tmp.extend;
4493                 l_cal_etc_raw_cost_tab_tmp.extend;
4494                 l_cal_etc_brdn_cost_tab_tmp.extend;
4495                 l_cal_etc_revenue_tab_tmp.extend;
4496                 l_billable_flag_tab_tmp.extend;
4497                 l_cal_rcost_rate_ovrd_tab_tmp.extend;
4498                 l_cal_bcost_rate_ovrd_tab_tmp.extend;
4499                 l_cal_bill_rate_ovrd_tab_tmp.extend;
4500 
4501                 l_cal_src_ra_id_tab_tmp(l_index) := l_cal_src_ra_id_tab(i);
4502                 l_cal_ra_id_tab_tmp(l_index) := l_cal_ra_id_tab(i);
4503                 l_cal_txn_curr_code_tab_tmp(l_index) := l_cal_txn_currency_code_tab(i);
4504                 l_cal_rate_based_flag_tab_tmp(l_index) := l_cal_rate_based_flag_tab(i);
4505                 l_cal_rlm_id_tab_tmp(l_index) := l_cal_rlm_id_tab(i);
4506 				l_cal_cbs_id_tab_tmp(l_index) := l_cal_cbs_id_tab(i);--bug#16791711
4507                 l_cal_task_id_tab_tmp(l_index) := l_cal_task_id_tab(i);
4508                 l_cal_unit_of_measure_tab_tmp(l_index) := l_cal_unit_of_measure_tab(i);
4509                 l_cal_etc_method_code_tab_tmp(l_index) := l_cal_etc_method_code_tab(i);
4510                 l_cal_etc_qty_tab_tmp(l_index) := l_cal_etc_qty_tab(i);
4511                 l_cal_etc_raw_cost_tab_tmp(l_index) := l_cal_etc_raw_cost_tab(i);
4512                 l_cal_etc_brdn_cost_tab_tmp(l_index) := l_cal_etc_burdened_cost_tab(i);
4513                 l_cal_etc_revenue_tab_tmp(l_index) := l_cal_etc_revenue_tab(i);
4514                 l_billable_flag_tab_tmp(l_index) := l_billable_flag_tab(i);
4515                 l_cal_rcost_rate_ovrd_tab_tmp(l_index) := l_cal_rcost_rate_override_tab(i);
4516                 l_cal_bcost_rate_ovrd_tab_tmp(l_index) := l_cal_bcost_rate_override_tab(i);
4517                 l_cal_bill_rate_ovrd_tab_tmp(l_index) := l_cal_bill_rate_override_tab(i);
4518 
4519                 l_index := l_index + 1;
4520             END IF;
4521         END LOOP;
4522 
4523         -- 2. Copy records from _tmp_ tables back to non-temporary tables.
4524         l_cal_src_ra_id_tab := l_cal_src_ra_id_tab_tmp;
4525         l_cal_ra_id_tab := l_cal_ra_id_tab_tmp;
4526         l_cal_txn_currency_code_tab := l_cal_txn_curr_code_tab_tmp;
4527         l_cal_rate_based_flag_tab := l_cal_rate_based_flag_tab_tmp;
4528         l_cal_rlm_id_tab := l_cal_rlm_id_tab_tmp;
4529 		l_cal_cbs_id_tab := l_cal_cbs_id_tab_tmp;--bug#16791711
4530         l_cal_task_id_tab := l_cal_task_id_tab_tmp;
4531         l_cal_unit_of_measure_tab := l_cal_unit_of_measure_tab_tmp;
4532         l_cal_etc_method_code_tab := l_cal_etc_method_code_tab_tmp;
4533         l_cal_etc_qty_tab := l_cal_etc_qty_tab_tmp;
4534         l_cal_etc_raw_cost_tab := l_cal_etc_raw_cost_tab_tmp;
4535         l_cal_etc_burdened_cost_tab := l_cal_etc_brdn_cost_tab_tmp;
4536         l_cal_etc_revenue_tab := l_cal_etc_revenue_tab_tmp;
4537         l_billable_flag_tab := l_billable_flag_tab_tmp;
4538         l_cal_rcost_rate_override_tab := l_cal_rcost_rate_ovrd_tab_tmp;
4539         l_cal_bcost_rate_override_tab := l_cal_bcost_rate_ovrd_tab_tmp;
4540         l_cal_bill_rate_override_tab := l_cal_bill_rate_ovrd_tab_tmp;
4541 
4542     END IF; -- IF l_remove_records_flag = 'Y' THEN
4543 
4544     -- End IPM filtering logic.
4545 
4546     /*********************************************************************
4547  	   ER 5726773: Commenting out logic that filters out planning
4548  	               transaction records with: (total plan quantity <= 0).
4549 
4550     -- Bug 4654157 and 4670253 : Before calling the Calculate API, we should ensure that only
4551     -- target resources with Total Plan Quantity >= 0 are passed. Total Plan Quantity
4552     -- is the sum of Actual Quantity (from target budget lines) + ETC Quantity.
4553 
4554     l_index := 1;
4555 
4556     l_cal_ra_id_tab_tmp.delete;
4557     l_cal_txn_curr_code_tab_tmp.delete;
4558     l_cal_rate_based_flag_tab_tmp.delete;
4559     l_cal_rlm_id_tab_tmp.delete;
4560     l_cal_task_id_tab_tmp.delete;
4561     l_cal_unit_of_measure_tab_tmp.delete;
4562     l_cal_etc_method_code_tab_tmp.delete;
4563     l_cal_etc_qty_tab_tmp.delete;
4564     l_cal_etc_raw_cost_tab_tmp.delete;
4565     l_cal_etc_brdn_cost_tab_tmp.delete;
4566     l_cal_etc_revenue_tab_tmp.delete;
4567     l_cal_rcost_rate_ovrd_tab_tmp.delete;
4568     l_cal_bcost_rate_ovrd_tab_tmp.delete;
4569     l_cal_bill_rate_ovrd_tab_tmp.delete;
4570 
4571     FOR i in 1..l_cal_ra_id_tab.count LOOP
4572 	-- Bug 4670253: Added NVL around actual quantity sum to
4573         -- ensure that l_init_qty is not null.
4574         BEGIN
4575             SELECT nvl(sum(nvl(init_quantity,0)),0)
4576             INTO   l_init_qty
4577             FROM   pa_budget_lines
4578             WHERE  resource_assignment_id = l_cal_ra_id_tab(i)
4579             AND    txn_currency_code = l_cal_txn_currency_code_tab(i);
4580         EXCEPTION
4581             WHEN NO_DATA_FOUND THEN
4582                 l_init_qty := 0;
4583         END;
4584 
4585         l_total_plan_qty := l_init_qty + nvl(l_cal_etc_qty_tab(i),0);
4586 
4587         IF nvl(l_total_plan_qty,0) > 0 THEN
4588 	    l_cal_ra_id_tab_tmp.EXTEND;
4589 	    l_cal_txn_curr_code_tab_tmp.EXTEND;
4590 	    l_cal_rate_based_flag_tab_tmp.EXTEND;
4591 	    l_cal_rlm_id_tab_tmp.EXTEND;
4592 	    l_cal_task_id_tab_tmp.EXTEND;
4593 	    l_cal_unit_of_measure_tab_tmp.EXTEND;
4594 	    l_cal_etc_method_code_tab_tmp.EXTEND;
4595 	    l_cal_etc_qty_tab_tmp.EXTEND;
4596 	    l_cal_etc_raw_cost_tab_tmp.EXTEND;
4597 	    l_cal_etc_brdn_cost_tab_tmp.EXTEND;
4598 	    l_cal_etc_revenue_tab_tmp.EXTEND;
4599 	    l_cal_rcost_rate_ovrd_tab_tmp.EXTEND;
4600 	    l_cal_bcost_rate_ovrd_tab_tmp.EXTEND;
4601 	    l_cal_bill_rate_ovrd_tab_tmp.EXTEND;
4602 
4603 	    l_cal_ra_id_tab_tmp(l_index) := l_cal_ra_id_tab(i);
4604 	    l_cal_txn_curr_code_tab_tmp(l_index) := l_cal_txn_currency_code_tab(i);
4605 	    l_cal_rate_based_flag_tab_tmp(l_index) := l_cal_rate_based_flag_tab(i);
4606 	    l_cal_rlm_id_tab_tmp(l_index) := l_cal_rlm_id_tab(i);
4607 	    l_cal_task_id_tab_tmp(l_index) := l_cal_task_id_tab(i);
4608 	    l_cal_unit_of_measure_tab_tmp(l_index) := l_cal_unit_of_measure_tab(i);
4609 	    l_cal_etc_method_code_tab_tmp(l_index) := l_cal_etc_method_code_tab(i);
4610 	    l_cal_etc_qty_tab_tmp(l_index) := l_cal_etc_qty_tab(i);
4611 	    l_cal_etc_raw_cost_tab_tmp(l_index) := l_cal_etc_raw_cost_tab(i);
4612 	    l_cal_etc_brdn_cost_tab_tmp(l_index) := l_cal_etc_burdened_cost_tab(i);
4613 	    l_cal_etc_revenue_tab_tmp(l_index) := l_cal_etc_revenue_tab(i);
4614 	    l_cal_rcost_rate_ovrd_tab_tmp(l_index) := l_cal_rcost_rate_override_tab(i);
4615 	    l_cal_bcost_rate_ovrd_tab_tmp(l_index) := l_cal_bcost_rate_override_tab(i);
4616 	    l_cal_bill_rate_ovrd_tab_tmp(l_index) := l_cal_bill_rate_override_tab(i);
4617 
4618             l_index := l_index + 1;
4619         END IF; -- l_total_plan_qty > 0
4620 
4621     END LOOP; -- FOR i in 1..l_cal_ra_id_tab.count LOOP
4622 
4623     l_cal_ra_id_tab := l_cal_ra_id_tab_tmp;
4624     l_cal_txn_currency_code_tab := l_cal_txn_curr_code_tab_tmp;
4625     l_cal_rate_based_flag_tab := l_cal_rate_based_flag_tab_tmp;
4626     l_cal_rlm_id_tab := l_cal_rlm_id_tab_tmp;
4627     l_cal_task_id_tab := l_cal_task_id_tab_tmp;
4628     l_cal_unit_of_measure_tab := l_cal_unit_of_measure_tab_tmp;
4629     l_cal_etc_method_code_tab := l_cal_etc_method_code_tab_tmp;
4630     l_cal_etc_qty_tab := l_cal_etc_qty_tab_tmp;
4631     l_cal_etc_raw_cost_tab := l_cal_etc_raw_cost_tab_tmp;
4632     l_cal_etc_burdened_cost_tab := l_cal_etc_brdn_cost_tab_tmp;
4633     l_cal_etc_revenue_tab := l_cal_etc_revenue_tab_tmp;
4634     l_cal_rcost_rate_override_tab := l_cal_rcost_rate_ovrd_tab_tmp;
4635     l_cal_bcost_rate_override_tab := l_cal_bcost_rate_ovrd_tab_tmp;
4636     l_cal_bill_rate_override_tab := l_cal_bill_rate_ovrd_tab_tmp;
4637 
4638     -- End Bug Fix 4654157 and 4670253
4639 
4640     ER 5726773: End of commented out section.
4641 *********************************************************************/
4642 
4643     IF P_FP_COLS_REC.X_TIME_PHASED_CODE='N' AND
4644        ( p_fp_cols_rec.x_version_type = 'COST' OR
4645          ( p_fp_cols_rec.x_version_type = 'REVENUE' AND
4646            l_rev_gen_method IN ('C','E') ) ) THEN
4647 
4648         FOR i in 1..l_cal_ra_id_tab.count LOOP
4649             SELECT  planning_start_date,
4650                     planning_end_date
4651             INTO    l_start_date,
4652                     l_end_date
4653             FROM    pa_resource_assignments
4654             WHERE   resource_assignment_id = l_cal_ra_id_tab(i);
4655 
4656             /*Start of the rounding handing*/
4657             IF l_cal_rate_based_flag_tab(i) = 'Y' THEN
4658                 l_cal_etc_qty_tab(i) := pa_fin_plan_utils2.round_quantity
4659                                 (p_quantity => l_cal_etc_qty_tab(i));
4660             ELSE
4661                 l_cal_etc_qty_tab(i) :=  pa_currency.round_trans_currency_amt1
4662                                 (x_amount       => l_cal_etc_qty_tab(i),
4663                                  x_curr_Code    => l_cal_txn_currency_code_tab(i));
4664             END IF;
4665             l_cal_etc_raw_cost_tab(i) := pa_currency.round_trans_currency_amt1
4666                     (x_amount       => l_cal_etc_raw_cost_tab(i),
4667                      x_curr_Code    => l_cal_txn_currency_code_tab(i));
4668             l_cal_etc_burdened_cost_tab(i) := pa_currency.round_trans_currency_amt1
4669                     (x_amount       => l_cal_etc_burdened_cost_tab(i),
4670                      x_curr_Code    => l_cal_txn_currency_code_tab(i));
4671             /*End of the rounding handling*/
4672 
4673 	    /*dbms_output.put_line('ra_id = ' || l_cal_ra_id_tab(i) ||
4674 	                         ',qty = ' || l_cal_etc_qty_tab(i) ||
4675 	                         ', rc = ' || l_cal_etc_raw_cost_tab(i) ||
4676 	                         ', bc = ' || l_cal_etc_burdened_cost_tab(i));*/
4677 
4678             l_amt_dtls_tbl.delete;
4679             l_amt_dtls_tbl(1).period_name := null;
4680             l_amt_dtls_tbl(1).start_date := l_start_date;
4681             l_amt_dtls_tbl(1).end_date := l_end_date;
4682             l_amt_dtls_tbl(1).quantity := l_cal_etc_qty_tab(i);
4683             l_amt_dtls_tbl(1).txn_raw_cost := l_cal_etc_raw_cost_tab(i);
4684             l_amt_dtls_tbl(1).txn_burdened_cost := l_cal_etc_burdened_cost_tab(i);
4685             l_amt_dtls_tbl(1).txn_revenue := null;
4686             l_amt_dtls_tbl(1).project_raw_cost := null;
4687             l_amt_dtls_tbl(1).project_burdened_cost := null;
4688             l_amt_dtls_tbl(1).project_revenue := null;
4689             l_amt_dtls_tbl(1).project_func_raw_cost := null;
4690             l_amt_dtls_tbl(1).project_func_burdened_cost := null;
4691             l_amt_dtls_tbl(1).project_func_revenue := null;
4692 
4693             -- ER 4376722: Note that we do not need to check task billability
4694             -- at this point; the billability logic performed upstream should
4695             -- be sufficient. The IF statement below is the only point within
4696             -- this None timephase logic block where Revenue is updated by an
4697             -- assignment. However, the assignment statement is safe, because
4698             -- the billable_flag cannot be 'N' at this point - if it were 'N',
4699             -- then the billability logic upstream would have removed the
4700             -- current record from the pl/sql tables.
4701 
4702             -- if then introduced for bug 4232253
4703             IF p_fp_cols_rec.x_version_type = 'REVENUE' AND
4704                l_cal_rate_based_flag_tab(i) = 'N' THEN
4705                 -- Earlier, l_cal_etc_qty value has been set to raw cost or
4706                 -- burdened cost based on the revenue accrual method.
4707                 l_amt_dtls_tbl(1).txn_revenue :=  l_amt_dtls_tbl(1).quantity;
4708             END IF;
4709 
4710             IF P_PA_DEBUG_MODE = 'Y' THEN
4711                 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
4712                     P_CALLED_MODE   => P_CALLED_MODE,
4713                     P_MSG           => 'Before calling PA_FP_MAINTAIN_ACTUAL_PUB.'||
4714                                        'MAINTAIN_ACTUAL_AMT_RA',
4715                     P_MODULE_NAME   => l_module_name);
4716             END IF;
4717             PA_FP_MAINTAIN_ACTUAL_PUB.MAINTAIN_ACTUAL_AMT_RA (
4718                 P_PROJECT_ID                => P_PROJECT_ID,
4719                 P_BUDGET_VERSION_ID         => P_BUDGET_VERSION_ID,
4720                 P_RESOURCE_ASSIGNMENT_ID    => l_cal_ra_id_tab(i),
4721                 P_TXN_CURRENCY_CODE         => l_cal_txn_currency_code_tab(i),
4722                 P_AMT_DTLS_REC_TAB          => l_amt_dtls_tbl,
4723                 P_CALLING_CONTEXT           => 'FP_GEN_FCST_COPY_ACTUAL',
4724                 P_TXN_AMT_TYPE_CODE         => 'PLANNING_TXN',
4725                 X_RETURN_STATUS             => x_return_Status,
4726                 X_MSG_COUNT                 => x_msg_count,
4727                 X_MSG_DATA                  => x_msg_data );
4728             IF P_PA_DEBUG_MODE = 'Y' THEN
4729                 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
4730                     P_CALLED_MODE   => P_CALLED_MODE,
4731                     P_MSG           => 'After calling PA_FP_MAINTAIN_ACTUAL_PUB.'||
4732                                        'MAINTAIN_ACTUAL_AMT_RA: '||x_return_status,
4733                     P_MODULE_NAME   => l_module_name);
4734             END IF;
4735             IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
4736                 raise PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
4737             END IF;
4738         END LOOP;
4739         IF p_pa_debug_mode = 'Y' THEN
4740             PA_DEBUG.Reset_Curr_Function;
4741         END IF;
4742         -- RETURN;  --bug#13330980
4743     END IF;
4744 
4745     /*
4746         select count(*) into l_count from
4747         pa_budget_lines where budget_version_id = P_BUDGET_VERSION_ID;
4748 
4749     hr_utility.trace('==before calculate=== no of bdgt lines'||
4750              l_count );
4751     Initializing every pl sql table to null for calling calculate API */
4752 
4753     FOR i in 1..l_cal_ra_id_tab.count LOOP
4754             l_delete_budget_lines_tab.extend;
4755             l_spread_amts_flag_tab.extend;
4756             l_txn_currency_override_tab.extend;
4757             l_addl_qty_tab.extend;
4758             l_addl_raw_cost_tab.extend;
4759             l_addl_burdened_cost_tab.extend;
4760             l_addl_revenue_tab.extend;
4761             l_raw_cost_rate_tab.extend;
4762             l_b_cost_rate_tab.extend;
4763             l_bill_rate_tab.extend;
4764             l_line_start_date_tab.extend;
4765             l_line_end_date_tab.extend;
4766 
4767             l_delete_budget_lines_tab(i)    :=  Null;
4768             l_spread_amts_flag_tab(i)       :=  'Y';
4769             l_txn_currency_override_tab(i)  :=  Null;
4770             l_addl_qty_tab(i)               :=  Null;
4771             l_addl_raw_cost_tab(i)          :=  Null;
4772             l_addl_burdened_cost_tab(i)     :=  Null;
4773             l_addl_revenue_tab(i)           :=  Null;
4774             l_raw_cost_rate_tab(i)          :=  Null;
4775             l_b_cost_rate_tab(i)            :=  Null;
4776             l_bill_rate_tab(i)              :=  Null;
4777             l_line_start_date_tab(i)        :=  Null;
4778             l_line_end_date_tab(i)          :=  Null;
4779             -- --dbms_output.put_line('----'||i||'-----');
4780             -- --dbms_output.put_line(l_resource_assignment_id_tab(i));
4781             -- --dbms_output.put_line(l_quantity_tab(i));
4782     END LOOP;
4783     l_refresh_rates_flag := 'N';
4784     l_refresh_conv_rates_flag := 'N';
4785     l_spread_required_flag := 'Y';
4786     l_conv_rates_required_flag := 'Y';
4787     l_raTxn_rollup_api_call_flag := 'N'; -- Added for IPM new entity ER
4788 
4789     -- Bug 3991151: Before calling the Calculate API, we need to copy source
4790     -- attributes (including the spread_curve_id) to target resources where
4791     -- applicable.
4792 
4793     /* Populate target ra_ids in tmp1 for COPY_SRC_ATTRS_TO_TARGET_FCST */
4794     DELETE pa_res_list_map_tmp1;
4795     FORALL i in 1..l_cal_ra_id_tab.count
4796         INSERT INTO pa_res_list_map_tmp1
4797                ( txn_resource_assignment_id )
4798         VALUES ( l_cal_ra_id_tab(i) );
4799 
4800     IF p_pa_debug_mode = 'Y' THEN
4801         PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG
4802             ( p_msg         => 'Before calling PA_FP_GEN_PUB.' ||
4803                                'COPY_SRC_ATTRS_TO_TARGET_FCST',
4804               p_module_name => l_module_name,
4805               p_log_level   => 5 );
4806     END IF;
4807     PA_FP_GEN_PUB.COPY_SRC_ATTRS_TO_TARGET_FCST
4808         ( P_FP_COLS_REC    => p_fp_cols_rec,
4809           X_RETURN_STATUS  => x_return_status,
4810           X_MSG_COUNT      => x_msg_count,
4811           X_MSG_DATA       => x_msg_data );
4812     IF p_pa_debug_mode = 'Y' THEN
4813         PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG
4814             ( p_msg         => 'Status after calling PA_FP_GEN_PUB.' ||
4815                                'COPY_SRC_ATTRS_TO_TARGET_FCST: ' ||
4816                                x_return_status,
4817               p_module_name => l_module_name,
4818               p_log_level   => 5 );
4819     END IF;
4820     IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
4821         RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
4822     END IF;
4823     -- Bug 3991151: End changes.
4824 
4825     IF P_PA_DEBUG_MODE = 'Y' THEN
4826         PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
4827             P_CALLED_MODE   => P_CALLED_MODE,
4828             P_MSG           => 'Before calling PA_FP_CALC_PLAN_PKG.calculate',
4829             P_MODULE_NAME   => l_module_name);
4830     END IF;
4831     /* select etc_start_date into l_date from
4832        pa_budget_versions where budget_version_id = P_BUDGET_VERSION_ID;
4833 
4834     hr_utility.trace('==before calculate=== etc start date '||
4835              to_char(l_date,'dd-mon-yyyy') );
4836     hr_utility.trace('==Entering Calculate=================='); */
4837 
4838     /* p_calling module parameter added for bug 3796136  to
4839        spread ETC amount only after the actual thru period end date
4840        and update the planning end date in res asg table.
4841        This logic is handled in the calculate API based on this
4842        new parameter. */
4843 
4844     PA_FP_CALC_PLAN_PKG.calculate(
4845         p_calling_module                => 'FORECAST_GENERATION',
4846         P_PROJECT_ID                    => P_PROJECT_ID,
4847         P_BUDGET_VERSION_ID             => P_BUDGET_VERSION_ID,
4848         P_REFRESH_RATES_FLAG            => l_refresh_rates_flag,
4849         P_REFRESH_CONV_RATES_FLAG       => l_refresh_conv_rates_flag,
4850         P_SPREAD_REQUIRED_FLAG          => l_spread_required_flag,
4851         P_CONV_RATES_REQUIRED_FLAG      => l_conv_rates_required_flag,
4852         P_ROLLUP_REQUIRED_FLAG          => 'N',
4853         --P_MASS_ADJUST_FLAG
4854         --P_QUANTITY_ADJ_PCT
4855         --P_COST_RATE_ADJ_PCT
4856         --P_BURDENED_RATE_ADJ_PCT
4857         --P_BILL_RATE_ADJ_PCT
4858         P_SOURCE_CONTEXT                => l_source_context,
4859         P_RESOURCE_ASSIGNMENT_TAB       => l_cal_ra_id_tab,
4860         P_DELETE_BUDGET_LINES_TAB       => l_delete_budget_lines_tab,
4861         P_SPREAD_AMTS_FLAG_TAB          => l_spread_amts_flag_tab,
4862         P_TXN_CURRENCY_CODE_TAB         => l_cal_txn_currency_code_tab,
4863         P_TXN_CURRENCY_OVERRIDE_TAB     => l_txn_currency_override_tab,
4864         P_TOTAL_QTY_TAB                 => l_cal_etc_qty_tab,
4865         P_ADDL_QTY_TAB                  => l_addl_qty_tab,
4866         P_TOTAL_RAW_COST_TAB            => l_cal_etc_raw_cost_tab,
4867         P_ADDL_RAW_COST_TAB             => l_addl_raw_cost_tab,
4868         P_TOTAL_BURDENED_COST_TAB       => l_cal_etc_burdened_cost_tab,
4869         P_ADDL_BURDENED_COST_TAB        => l_addl_burdened_cost_tab,
4870         P_TOTAL_REVENUE_TAB             => l_cal_etc_revenue_tab,
4871         P_ADDL_REVENUE_TAB              => l_addl_revenue_tab,
4872         P_RAW_COST_RATE_TAB             => l_raw_cost_rate_tab,
4873         P_RW_COST_RATE_OVERRIDE_TAB     => l_cal_rcost_rate_override_tab,
4874         P_B_COST_RATE_TAB               => l_b_cost_rate_tab,
4875         P_B_COST_RATE_OVERRIDE_TAB      => l_cal_bcost_rate_override_tab,
4876         P_BILL_RATE_TAB                 => l_bill_rate_tab,
4877         P_BILL_RATE_OVERRIDE_TAB        => l_cal_bill_rate_override_tab,
4878         P_LINE_START_DATE_TAB           => l_line_start_date_tab,
4879         P_LINE_END_DATE_TAB             => l_line_start_date_tab,
4880         P_RATXN_ROLLUP_API_CALL_FLAG    => l_raTxn_rollup_api_call_flag,
4881         X_RETURN_STATUS                 => x_return_status,
4882         X_MSG_COUNT                     => x_msg_count,
4883         X_MSG_DATA                      => x_msg_data );
4884 
4885     -- hr_utility.trace('==Leaving Calculate==================:'||x_return_status);
4886 
4887     IF P_PA_DEBUG_MODE = 'Y' THEN
4888         PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
4889             P_CALLED_MODE   => P_CALLED_MODE,
4890             P_MSG           => 'After calling PA_FP_CALC_PLAN_PKG.calculate: '||
4891                                x_return_status,
4892             P_MODULE_NAME   => l_module_name);
4893     END IF;
4894     IF X_RETURN_STATUS <> FND_API.G_RET_STS_SUCCESS THEN
4895         RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
4896     END IF;
4897 
4898     IF p_pa_debug_mode = 'Y' THEN
4899         PA_DEBUG.Reset_Curr_Function;
4900     END IF;
4901     X_RETURN_STATUS := FND_API.G_RET_STS_SUCCESS;
4902 EXCEPTION
4903      WHEN PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc THEN
4904           --dbms_output.put_line('--INSIDE  PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc');
4905           l_msg_count := FND_MSG_PUB.count_msg;
4906           IF l_msg_count = 1 THEN
4907               PA_INTERFACE_UTILS_PUB.get_messages
4908                  (p_encoded        => FND_API.G_TRUE
4909                   ,p_msg_index      => 1
4910                   ,p_msg_count      => l_msg_count
4911                   ,p_msg_data       => l_msg_data
4912                   ,p_data           => l_data
4913                   ,p_msg_index_out  => l_msg_index_out);
4914                  x_msg_data  := l_data;
4915                  x_msg_count := l_msg_count;
4916           ELSE
4917                 x_msg_count := l_msg_count;
4918           END IF;
4919           ROLLBACK;
4920 
4921           x_return_status := FND_API.G_RET_STS_ERROR;
4922           IF P_PA_DEBUG_MODE = 'Y' THEN
4923             PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
4924                 P_CALLED_MODE   => P_CALLED_MODE,
4925                 P_MSG           => 'Invalid Arguments Passed',
4926                 P_MODULE_NAME   => l_module_name);
4927           PA_DEBUG.Reset_Curr_Function;
4928           END IF;
4929           RAISE;
4930 
4931       WHEN OTHERS THEN
4932            x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4933            x_msg_data      := SUBSTR(SQLERRM,1,240);
4934            FND_MSG_PUB.add_exc_msg
4935              ( p_pkg_name       => 'PA_FP_GEN_FCST_AMT_PUB'
4936               ,p_procedure_name => 'GEN_FCST_TASK_LEVEL_AMT');
4937            IF P_PA_DEBUG_MODE = 'Y' THEN
4938                 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
4939                     P_CALLED_MODE   => P_CALLED_MODE,
4940                     P_MSG           => 'Unexpected Error'||substr(sqlerrm, 1, 240),
4941                     P_MODULE_NAME   => l_module_name);
4942                 PA_DEBUG.Reset_Curr_Function;
4943            END IF;
4944            RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4945 END  GEN_FCST_TASK_LEVEL_AMT;
4946 
4947 PROCEDURE MAINTAIN_RES_ASG(
4948                 P_PROJECT_ID         IN          PA_PROJECTS_ALL.PROJECT_ID%TYPE,
4949                 P_BUDGET_VERSION_ID  IN          PA_BUDGET_VERSIONS.BUDGET_VERSION_ID%TYPE,
4950                 P_FP_COLS_REC        IN          PA_FP_GEN_AMOUNT_UTILS.FP_COLS,
4951                 X_RETURN_STATUS      OUT  NOCOPY VARCHAR2,
4952                 X_MSG_COUNT          OUT  NOCOPY NUMBER,
4953                 X_MSG_DATA           OUT  NOCOPY VARCHAR2)
4954 IS
4955 l_module_name          VARCHAR2(200) := 'pa.plsql.pa_fp_gen_fcst_amt_pub.maintain_res_asg';
4956 
4957 l_msg_count                     NUMBER;
4958 l_msg_data                      VARCHAR2(2000);
4959 l_data                          VARCHAR2(2000);
4960 l_msg_index_out                 NUMBER:=0;
4961 
4962 l_count                         number;
4963 BEGIN
4964     X_RETURN_STATUS := FND_API.G_RET_STS_SUCCESS;
4965     X_MSG_COUNT := 0;
4966     IF p_pa_debug_mode = 'Y' THEN
4967           pa_debug.set_curr_function( p_function     => 'MAINTAIN_RES_ASG',
4968                                       p_debug_mode   =>  p_pa_debug_mode);
4969     END IF;
4970 
4971     DELETE FROM PA_FP_PLANNING_RES_TMP1;
4972     IF P_FP_COLS_REC.X_FIN_PLAN_LEVEL_CODE = 'L' THEN
4973     -- hr_utility.trace('inside lowest task in maintain res asg :');
4974     /* PA_FP_PLANNING_RES_TMP1 will have res asg id column with
4975        > 0 value - actual res asg id from WP or FP budget version
4976        source, all negative res asg values are inserted either for
4977        tasks with etc source as WORK_QUANTITY or the etc is NONE or NULL. */
4978         INSERT INTO PA_FP_PLANNING_RES_TMP1 (
4979                 TASK_ID,
4980                 RESOURCE_LIST_MEMBER_ID,
4981 				CBS_ELEMENT_ID,--bug#16791711
4982                 RESOURCE_ASSIGNMENT_ID,
4983                 planning_start_date,
4984                 planning_end_date )
4985         (SELECT MAPPED_FIN_TASK_ID,
4986                 TARGET_RLM_ID,
4987 				CBS_ELEMENT_ID,--bug#16791711
4988                 to_number(NULL),
4989                 min(planning_start_date),
4990                 max(planning_end_date)
4991         FROM PA_FP_CALC_AMT_TMP1
4992         GROUP BY mapped_fin_task_id,TARGET_RLM_ID,CBS_ELEMENT_ID,to_number(NULL));
4993     ELSIF P_FP_COLS_REC.X_FIN_PLAN_LEVEL_CODE = 'P' THEN
4994     -- hr_utility.trace('inside proj    lvl in maintain res asg :');
4995         INSERT INTO PA_FP_PLANNING_RES_TMP1 (
4996                 TASK_ID,
4997                 RESOURCE_LIST_MEMBER_ID,
4998 				CBS_ELEMENT_ID,--bug#16791711
4999                 RESOURCE_ASSIGNMENT_ID,
5000                 planning_start_date,
5001                 planning_end_date )
5002         (SELECT 0,
5003                 TARGET_RLM_ID,
5004 				CBS_ELEMENT_ID,--bug#16791711
5005                 to_number(NULL),
5006                 min(planning_start_date),
5007                 max(planning_end_date)
5008         FROM PA_FP_CALC_AMT_TMP1
5009                 group by 0, TARGET_RLM_ID,CBS_ELEMENT_ID,
5010                 to_number(NULL) );
5011     ELSIF P_FP_COLS_REC.X_FIN_PLAN_LEVEL_CODE = 'T' THEN
5012     -- hr_utility.trace('inside top task in maintain res asg :');
5013         INSERT INTO PA_FP_PLANNING_RES_TMP1 (
5014                 TASK_ID,
5015                 RESOURCE_LIST_MEMBER_ID,
5016 				CBS_ELEMENT_ID,--bug#16791711
5017                 RESOURCE_ASSIGNMENT_ID,
5018                 planning_start_date,
5019                 planning_end_date )
5020         (SELECT MAPPED_FIN_TASK_ID,
5021                 TARGET_RLM_ID,
5022 				CBS_ELEMENT_ID,--bug#16791711
5023                 to_number(NULL),
5024                 min(planning_start_date),
5025                 max(planning_end_date)
5026         FROM PA_FP_CALC_AMT_TMP1 group by
5027         mapped_fin_task_id,TARGET_RLM_ID,CBS_ELEMENT_ID,
5028                 to_number(NULL) );
5029     END IF;
5030     -- select count(*) into l_count from PA_FP_PLANNING_RES_TMP1;
5031     -- hr_utility.trace('in maintain res asg plan res tmp1 count :'||l_count);
5032     IF P_PA_DEBUG_MODE = 'Y' THEN
5033             PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
5034                 P_MSG           => 'Before calling pa_fp_copy_actuals_pub.create_res_asg',
5035                 P_MODULE_NAME   => l_module_name,
5036                 p_log_level => 5);
5037     END IF;
5038     PA_FP_COPY_ACTUALS_PUB.CREATE_RES_ASG (
5039                 P_PROJECT_ID            => P_PROJECT_ID,
5040                 P_BUDGET_VERSION_ID     => P_BUDGET_VERSION_ID,
5041                 P_FP_COLS_REC           => P_FP_COLS_REC,
5042                 P_CALLING_PROCESS       => 'FORECAST_GENERATION',
5043                 X_RETURN_STATUS         => x_return_status,
5044                 X_MSG_COUNT             => x_msg_count,
5045                 X_MSG_DATA              => x_msg_data );
5046     IF P_PA_DEBUG_MODE = 'Y' THEN
5047             PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
5048                 P_MSG           => 'After calling create_res_asg,return status is: '||x_return_status,
5049                 P_MODULE_NAME   => l_module_name,
5050                 p_log_level => 5);
5051     END IF;
5052     IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
5053         raise PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
5054     END IF;
5055 
5056     IF P_PA_DEBUG_MODE = 'Y' THEN
5057             PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
5058                 P_MSG           => 'Before calling pa_fp_copy_actuals_pub.update_res_asg',
5059                 P_MODULE_NAME   => l_module_name,
5060                 p_log_level => 5);
5061     END IF;
5062     PA_FP_COPY_ACTUALS_PUB.UPDATE_RES_ASG (
5063                 P_PROJECT_ID            => P_PROJECT_ID,
5064                 P_BUDGET_VERSION_ID     => P_BUDGET_VERSION_ID,
5065                 P_FP_COLS_REC           => P_FP_COLS_REC,
5066                 P_CALLING_PROCESS       => 'FORECAST_GENERATION',
5067                 X_RETURN_STATUS         => x_return_status,
5068                 X_MSG_COUNT             => x_msg_count,
5069                 X_MSG_DATA              => x_msg_data );
5070     IF P_PA_DEBUG_MODE = 'Y' THEN
5071             PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
5072                 P_MSG           => 'After calling update_res_asg,return status is: '||x_return_status,
5073                 P_MODULE_NAME   => l_module_name,
5074                 p_log_level => 5);
5075     END IF;
5076     IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
5077         raise PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
5078     END IF;
5079 
5080     IF p_pa_debug_mode = 'Y' THEN
5081         PA_DEBUG.Reset_Curr_Function;
5082     END IF;
5083 EXCEPTION
5084      WHEN PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc THEN
5085           l_msg_count := FND_MSG_PUB.count_msg;
5086           IF l_msg_count = 1 THEN
5087               PA_INTERFACE_UTILS_PUB.get_messages
5088                  (p_encoded        => FND_API.G_TRUE
5089                   ,p_msg_index      => 1
5090                   ,p_msg_count      => l_msg_count
5091                   ,p_msg_data       => l_msg_data
5092                   ,p_data           => l_data
5093                   ,p_msg_index_out  => l_msg_index_out);
5094                  x_msg_data  := l_data;
5095                  x_msg_count := l_msg_count;
5096           ELSE
5097                 x_msg_count := l_msg_count;
5098           END IF;
5099           ROLLBACK;
5100 
5101           x_return_status := FND_API.G_RET_STS_ERROR;
5102           IF P_PA_DEBUG_MODE = 'Y' THEN
5103             PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
5104                 P_MSG           => 'Invalid Arguments Passed',
5105                 P_MODULE_NAME   => l_module_name,
5106                 p_log_level => 5);
5107           PA_DEBUG.Reset_Curr_Function;
5108           END IF;
5109           RAISE;
5110 
5111       WHEN OTHERS THEN
5112            x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5113            x_msg_data      := SUBSTR(SQLERRM,1,240);
5114            FND_MSG_PUB.add_exc_msg
5115              ( p_pkg_name       => 'PA_FP_GEN_FCST_AMT_PUB'
5116               ,p_procedure_name => 'MAINTAIN_RES_ASG');
5117            IF P_PA_DEBUG_MODE = 'Y' THEN
5118             PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
5119                 P_MSG           => 'Unexpected Error'||substr(sqlerrm, 1, 240),
5120                 P_MODULE_NAME   => l_module_name,
5121                 p_log_level => 5);
5122                 PA_DEBUG.Reset_Curr_Function;
5123            END IF;
5124            RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5125 END MAINTAIN_RES_ASG;
5126 
5127 
5128 /**
5129  * This procedure updates pa_budget_lines.other_rejection_code
5130  * for the purpose of signalling ETC revenue amount calculation
5131  * errors. See bug 5203622.
5132  *
5133  * Pre-Conditions:
5134  * 1. At this point, other_rejection_code values should be stored
5135  *    in the txn_currency_code column of the pa_fp_calc_amt_tmp2
5136  *    table for planning txns with ETC revenue calculation errors.
5137  *
5138  *    Note: The etc_currency_code column (not txn_currency_code)
5139  *    to store the currency for ETC records in pa_fp_calc_amt_tmp2.
5140  *
5141  * Also worth noting is that this procedure is package-private.
5142  */
5143 PROCEDURE UPD_REV_CALCULATION_ERR
5144           (P_PROJECT_ID              IN          PA_PROJECTS_ALL.PROJECT_ID%TYPE,
5145            P_BUDGET_VERSION_ID       IN          PA_BUDGET_VERSIONS.BUDGET_VERSION_ID%TYPE,
5146            P_FP_COLS_REC             IN          PA_FP_GEN_AMOUNT_UTILS.FP_COLS,
5147            P_ETC_START_DATE          IN          DATE,
5148            P_CALLED_MODE             IN          VARCHAR2 DEFAULT 'SELF_SERVICE',
5149            X_RETURN_STATUS           OUT  NOCOPY VARCHAR2,
5150            X_MSG_COUNT               OUT  NOCOPY NUMBER,
5151            X_MSG_DATA                OUT  NOCOPY VARCHAR2 )
5152 IS
5153     l_package_name                 VARCHAR2(30) := 'PA_FP_GEN_FCST_AMT_PUB';
5154     l_procedure_name               VARCHAR2(30) := 'UPD_REV_CALCULATION_ERR';
5155     l_module_name                  VARCHAR2(100);
5156 
5157     l_log_level                    NUMBER := 5;
5158     l_msg_count                    NUMBER;
5159     l_data                         VARCHAR2(1000);
5160     l_msg_data                     VARCHAR2(1000);
5161     l_msg_index_out                NUMBER;
5162 BEGIN
5163     l_module_name := 'pa.plsql.' || l_package_name || '.' || l_procedure_name;
5164 
5165     x_return_status := FND_API.G_RET_STS_SUCCESS;
5166     x_msg_count := 0;
5167 
5168     IF p_pa_debug_mode = 'Y' THEN
5169         PA_DEBUG.SET_CURR_FUNCTION( p_function   => l_procedure_name,
5170                                     p_debug_mode => p_pa_debug_mode );
5171     END IF;
5172 
5173     -- Print values of Input Parameters to debug log
5174     IF p_pa_debug_mode = 'Y' THEN
5175         PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG
5176             ( p_msg         => 'Input Parameters for '
5177                                || l_module_name || '():',
5178               p_called_mode => p_called_mode,
5179               p_module_name => l_module_name,
5180               p_log_level   => l_log_level );
5181         PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG
5182             ( p_msg         => 'P_PROJECT_ID:['||p_project_id||']',
5183               p_called_mode => p_called_mode,
5184               p_module_name => l_module_name,
5185               p_log_level   => l_log_level );
5186         PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG
5187             ( p_msg         => 'P_BUDGET_VERSION_ID:['||p_budget_version_id||']',
5188               p_called_mode => p_called_mode,
5189               p_module_name => l_module_name,
5190               p_log_level   => l_log_level );
5191         PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG
5192             ( p_msg         => 'P_ETC_START_DATE:['||p_etc_start_date||']',
5193               p_called_mode => p_called_mode,
5194               p_module_name => l_module_name,
5195               p_log_level   => l_log_level );
5196     END IF; -- IF p_pa_debug_mode = 'Y' THEN
5197 
5198     -- Validate input parameters
5199     IF p_project_id is NULL OR
5200        p_budget_version_id is NULL OR
5201        p_etc_start_date is NULL THEN
5202         IF p_pa_debug_mode = 'Y' THEN
5203             PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG
5204                 ( p_msg         => 'Input Parameter Validation FAILED',
5205                   p_called_mode => p_called_mode,
5206                   p_module_name => l_module_name,
5207                   p_log_level   => l_log_level );
5208             PA_DEBUG.RESET_CURR_FUNCTION;
5209         END IF;
5210         RETURN;
5211     END IF;
5212 
5213     -- Update pa_budget_lines with any other_rejection_codes stored
5214     -- in the txn_currency_code column of the task level selection
5215     -- forecast generation processing table pa_fp_calc_amt_tmp2.
5216 
5217     UPDATE pa_budget_lines bl
5218     SET    bl.other_rejection_code =
5219          ( SELECT tmp2.txn_currency_code
5220            FROM   pa_fp_calc_amt_tmp2 tmp2
5221            WHERE  tmp2.transaction_source_code = 'ETC'
5222            AND    tmp2.txn_currency_code is not null
5223            AND    bl.resource_assignment_id = tmp2.target_res_asg_id
5224            AND    bl.txn_currency_code = tmp2.etc_currency_code )
5225     WHERE bl.budget_version_id = p_budget_version_id
5226     AND   nvl(bl.quantity,0) <> nvl(bl.init_quantity,0) -- ETC lines only
5227     AND EXISTS
5228          ( SELECT null
5229            FROM   pa_fp_calc_amt_tmp2 tmp2
5230            WHERE  tmp2.transaction_source_code = 'ETC'
5231            AND    tmp2.txn_currency_code is not null
5232            AND    bl.resource_assignment_id = tmp2.target_res_asg_id
5233            AND    bl.txn_currency_code = tmp2.etc_currency_code );
5234 
5235     IF p_pa_debug_mode = 'Y' THEN
5236         PA_DEBUG.RESET_CURR_FUNCTION;
5237     END IF;
5238 EXCEPTION
5239     WHEN PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc THEN
5240         l_msg_count := FND_MSG_PUB.count_msg;
5241         IF l_msg_count = 1 THEN
5242             PA_INTERFACE_UTILS_PUB.GET_MESSAGES
5243                 ( p_encoded        => FND_API.G_TRUE,
5244                   p_msg_index      => 1,
5245                   p_msg_count      => l_msg_count,
5246                   p_msg_data       => l_msg_data,
5247                   p_data           => l_data,
5248                   p_msg_index_out  => l_msg_index_out);
5249             x_msg_data := l_data;
5250             x_msg_count := l_msg_count;
5251         ELSE
5252             x_msg_count := l_msg_count;
5253         END IF;
5254 
5255         ROLLBACK;
5256         x_return_status := FND_API.G_RET_STS_ERROR;
5257 
5258         IF p_pa_debug_mode = 'Y' THEN
5259            PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG
5260             (p_msg         => 'Invalid Arguments Passed',
5261              p_module_name => l_module_name,
5262              p_log_level   => 5);
5263             PA_DEBUG.RESET_CURR_FUNCTION;
5264         END IF;
5265         RAISE;
5266     WHEN OTHERS THEN
5267         ROLLBACK;
5268         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5269         x_msg_count     := 1;
5270         x_msg_data      := substr(sqlerrm,1,240);
5271         FND_MSG_PUB.ADD_EXC_MSG
5272                    ( p_pkg_name        => l_package_name,
5273                      p_procedure_name  => l_procedure_name,
5274                      p_error_text      => substr(sqlerrm,1,240));
5275 
5276         IF p_pa_debug_mode = 'Y' THEN
5277            PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG
5278             (p_msg         => 'Unexpected Error'||substr(sqlerrm, 1, 240),
5279              p_module_name => l_module_name,
5280              p_log_level   => 5);
5281             PA_DEBUG.RESET_CURR_FUNCTION;
5282         END IF;
5283         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5284 
5285 END UPD_REV_CALCULATION_ERR;
5286 
5287 
5288 END PA_FP_GEN_FCST_AMT_PUB;