DBA Data[Home] [Help]

PACKAGE BODY: APPS.PA_FP_WP_GEN_BUDGET_AMT_PUB

Source


1 PACKAGE body PA_FP_WP_GEN_BUDGET_AMT_PUB as
2 /* $Header: PAFPWPGB.pls 120.17.12020000.2 2013/05/23 07:44:33 bpottipa ship $ */
3 P_PA_DEBUG_MODE varchar2(1) := NVL(FND_PROFILE.value('PA_DEBUG_MODE'), 'N');
4 
5 PROCEDURE GENERATE_WP_BUDGET_AMT
6           (P_PROJECT_ID                   IN           PA_PROJ_FP_OPTIONS.PROJECT_ID%TYPE,
7            P_BUDGET_VERSION_ID            IN           PA_BUDGET_VERSIONS.BUDGET_VERSION_ID%TYPE,
8            P_PLAN_CLASS_CODE              IN           PA_FIN_PLAN_TYPES_B.PLAN_CLASS_CODE%TYPE,
9            P_GEN_SRC_CODE                 IN           PA_PROJ_FP_OPTIONS.GEN_ALL_SRC_CODE%TYPE,
10            P_COST_PLAN_TYPE_ID            IN           PA_PROJ_FP_OPTIONS.GEN_SRC_COST_PLAN_TYPE_ID%TYPE,
11            P_COST_VERSION_ID              IN           PA_BUDGET_VERSIONS.BUDGET_VERSION_ID%TYPE,
12            P_RETAIN_MANUAL_FLAG           IN           VARCHAR2,
13            P_CALLED_MODE                  IN           VARCHAR2,
14            P_INC_CHG_DOC_FLAG             IN           VARCHAR2,
15            P_INC_BILL_EVENT_FLAG          IN           VARCHAR2,
16            P_INC_OPEN_COMMIT_FLAG         IN           VARCHAR2,
17            P_CI_ID_TAB                    IN           PA_PLSQL_DATATYPES.IdTabTyp,
18            P_INIT_MSG_FLAG                IN           VARCHAR2,
19            P_COMMIT_FLAG                  IN           VARCHAR2,
20            P_CALLING_CONTEXT              IN           VARCHAR2,
21            P_ETC_PLAN_TYPE_ID             IN           PA_PROJ_FP_OPTIONS.FIN_PLAN_TYPE_ID%TYPE,
22            P_ETC_PLAN_VERSION_ID          IN           PA_PROJ_FP_OPTIONS.FIN_PLAN_VERSION_ID%TYPE,
23            P_ETC_PLAN_VERSION_NAME        IN           PA_BUDGET_VERSIONS.VERSION_NAME%TYPE,
24            P_ACTUALS_THRU_DATE            IN           PA_PERIODS_ALL.END_DATE%TYPE,
25            PX_DELETED_RES_ASG_ID_TAB      IN  OUT NOCOPY  PA_PLSQL_DATATYPES.IdTabTyp,
26            PX_GEN_RES_ASG_ID_TAB          IN  OUT NOCOPY  PA_PLSQL_DATATYPES.IdTabTyp,
27            X_RETURN_STATUS                OUT NOCOPY   VARCHAR2,
28            X_MSG_COUNT                    OUT NOCOPY   NUMBER,
29            X_MSG_DATA                     OUT NOCOPY   VARCHAR2)
30 IS
31     l_module_name VARCHAR2(100) := 'pa.plsql.PA_FP_WP_GEN_BUDGET_AMT_PUB.GENERATE_WP_BUDGET_AMT';
32     l_fp_cols_rec_source           PA_FP_GEN_AMOUNT_UTILS.FP_COLS;
33     l_fp_cols_rec_target           PA_FP_GEN_AMOUNT_UTILS.FP_COLS;
34     l_wp_ptype_id                  Number;
35     l_wp_status                    VARCHAR2(20);
36     l_wp_id                        Number := NULL;
37     l_source_id                    Number;
38     l_gen_src_code                 VARCHAR2(100);
39     l_gen_src_plan_ver_code        VARCHAR2(100);
40     l_proj_resource_id             PA_PLSQL_DATATYPES.IdTabTyp;
41 
42     /* Source Code constants */
43     lc_WorkPlanSrcCode             CONSTANT PA_PROJ_FP_OPTIONS.GEN_COST_SRC_CODE%TYPE
44                                        := 'WORKPLAN_RESOURCES';
45     lc_FinancialPlanSrcCode        CONSTANT PA_PROJ_FP_OPTIONS.GEN_COST_SRC_CODE%TYPE
46                                        := 'FINANCIAL_PLAN';
47 
48     l_fp_options_id                pa_proj_fp_options.proj_fp_options_id%TYPE;
49     l_gen_src_plan_ver_cod         VARCHAR2(100);
50     l_msg_count                    NUMBER;
51     l_msg_data                     VARCHAR2(2000);
52     l_data                         VARCHAR2(2000);
53     l_msg_index_out                NUMBER;
54 
55     l_stru_sharing_code            pa_projects_all.STRUCTURE_SHARING_CODE%TYPE;
56 
57     /* Flag parameters for calling Calculate API */
58     l_calculate_api_code           VARCHAR2(30);
59     l_refresh_rates_flag           VARCHAR2(1);
60     l_refresh_conv_rates_flag      VARCHAR2(1);
61     l_spread_required_flag         VARCHAR2(1);
62     l_conv_rates_required_flag     VARCHAR2(1);
63     l_rollup_required_flag         VARCHAR2(1);
64     l_raTxn_rollup_api_call_flag   VARCHAR2(1); -- Added for IPM new entity ER
65 
66     /* Local PL/SQL table used for calling Calculate API */
67     l_source_context               pa_fp_res_assignments_tmp.source_context%TYPE :='RESOURCE_ASSIGNMENT';
68     l_delete_budget_lines_tab      SYSTEM.pa_varchar2_1_tbl_type:=SYSTEM.pa_varchar2_1_tbl_type();
69     l_spread_amts_flag_tab         SYSTEM.pa_varchar2_1_tbl_type:=SYSTEM.pa_varchar2_1_tbl_type();
70     l_txn_currency_code_tab        SYSTEM.pa_varchar2_15_tbl_type:=SYSTEM.pa_varchar2_15_tbl_type();
71     l_txn_currency_override_tab    SYSTEM.pa_varchar2_15_tbl_type:=SYSTEM.pa_varchar2_15_tbl_type();
72     l_addl_qty_tab                 SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
73     l_src_raw_cost_tab             SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
74     l_addl_raw_cost_tab            SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
75     l_src_brdn_cost_tab            SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
76     l_addl_burdened_cost_tab       SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
77     l_src_revenue_tab              SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
78     l_addl_revenue_tab             SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
79     l_raw_cost_rate_tab            SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
80     l_b_cost_rate_tab              SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
81     l_b_cost_rate_override_tab     SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
82     l_bill_rate_tab                SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
83     l_line_start_date_tab          SYSTEM.pa_date_tbl_type:=SYSTEM.pa_date_tbl_type();
84     l_line_end_date_tab            SYSTEM.pa_date_tbl_type:=SYSTEM.pa_date_tbl_type();
85 
86     l_tgt_res_asg_id_tab           SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
87     l_tgt_rate_based_flag_tab      SYSTEM.pa_varchar2_1_tbl_type:=SYSTEM.pa_varchar2_1_tbl_type();
88     l_start_date_tab               pa_plsql_datatypes.DateTabTyp;
89     l_txn_currency_code            pa_plsql_datatypes.Char15TabTyp;
90     l_end_date_tab                 pa_plsql_datatypes.DateTabTyp;
91     l_periiod_name_tab             pa_plsql_datatypes.Char30TabTyp;
92     l_cost_rate_override_tab       SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
93     l_bill_rate_override_tab       SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
94     l_src_quantity_tab             SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
95 
96     l_sysdate_trunc                DATE;
97     l_txn_currency_flag            VARCHAR2(1) := 'Y';
98 
99     -- Bug 4115015: We should not query the cost/revenue amount columns
100     -- directly since they store rounded amounts, whereas we need unrounded
101     -- amounts to accurately compute override rates. Instead, we should
102     -- multiply the quantity by appropriate rate multipliers to compute
103     -- the unrounded cost/revenue amounts.
104 
105     -- ER 4376722: To carry out the Task Billability logic, we need to
106     -- modify the cursors to fetch the task billable_flag for each target
107     -- resource. Since ra.task_id can be NULL or 0, we take the outer
108     -- join: NVL(ra.task_id,0) = ta.task_id (+). By default, tasks are
109     -- billable, so we SELECT NVL(ta.billable_flag,'Y').
110 
111     /*when multi currency is not enabled, then take project currency and amts,
112       when multi currency is enabled, then take transaction currency and amts,
113       when target is approved budget version, then take projfunc currency and amts.
114       Don't pick up amounts for budget lines with non-null rejection codes. */
115     CURSOR budget_line_src_to_cal
116         (c_proj_currency_code PA_PROJECTS_ALL.PROJECT_CURRENCY_CODE%TYPE ,
117          c_projfunc_currency_code PA_PROJECTS_ALL.PROJECT_CURRENCY_CODE%TYPE) IS
118 
119     SELECT /*+ INDEX(tmp4,PA_RES_LIST_MAP_TMP4_N2)*/
120            ra.resource_assignment_id,
121            ra.rate_based_flag,
122            decode(l_txn_currency_flag,
123                   'Y', sbl.txn_currency_code,
124                   'N', c_proj_currency_code,
125                   'A', c_projfunc_currency_code),
126            sum(quantity),
127            /*
128            sum(decode(l_txn_currency_flag,
129                       'Y', sbl.quantity *
130                            NVL(sbl.txn_cost_rate_override,sbl.txn_standard_cost_rate),   --sbl.txn_raw_cost
131                       'N', sbl.quantity * NVL(sbl.project_cost_exchange_rate,1) *
132                            NVL(sbl.txn_cost_rate_override,sbl.txn_standard_cost_rate),   --sbl.project_raw_cost
133                       'A', sbl.quantity * NVL(sbl.projfunc_cost_exchange_rate,1) *
134                            NVL(sbl.txn_cost_rate_override,sbl.txn_standard_cost_rate))), --sbl.raw_cost
135            sum(decode(l_txn_currency_flag,
136                       'Y', sbl.quantity *
137                            NVL(sbl.burden_cost_rate_override,sbl.burden_cost_rate),   --sbl.txn_burdened_cost
138                       'N', sbl.quantity * NVL(sbl.project_cost_exchange_rate,1) *
139                            NVL(sbl.burden_cost_rate_override,sbl.burden_cost_rate),   --sbl.project_burdened_cost
140                       'A', sbl.quantity * NVL(sbl.projfunc_cost_exchange_rate,1) *
141                            NVL(sbl.burden_cost_rate_override,sbl.burden_cost_rate))), --sbl.burdened_cost
142            sum(decode(l_txn_currency_flag,
143                       'Y', sbl.quantity *
144                            NVL(sbl.txn_bill_rate_override,sbl.txn_standard_bill_rate),   --sbl.txn_revenue
145                       'N', sbl.quantity * NVL(sbl.project_cost_exchange_rate,1) *
146                            NVL(sbl.txn_bill_rate_override,sbl.txn_standard_bill_rate),   --sbl.project_revenue
147                       'A', sbl.quantity * NVL(sbl.projfunc_cost_exchange_rate,1) *
148                            NVL(sbl.txn_bill_rate_override,sbl.txn_standard_bill_rate))), --sbl.revenue */
149            -- Bug 8937993. Need to pull use source rates for only the plannned quantity.
150            sum(decode(l_txn_currency_flag,
151                       'Y', (((sbl.quantity - nvl(sbl.init_quantity,0)) *
152                            NVL(sbl.txn_cost_rate_override,sbl.txn_standard_cost_rate))
153                            + NVL(sbl.txn_init_raw_cost,0)),   																							--sbl.txn_raw_cost
154                       'N', ((((sbl.quantity - nvl(sbl.init_quantity,0)) *
155                            NVL(sbl.txn_cost_rate_override,sbl.txn_standard_cost_rate))
156                            + NVL(sbl.txn_init_raw_cost,0)) * NVL(sbl.project_cost_exchange_rate,1)) ,   		--sbl.project_raw_cost
157                       'A', ((((sbl.quantity - nvl(sbl.init_quantity,0)) *
158                            NVL(sbl.txn_cost_rate_override,sbl.txn_standard_cost_rate))
159                            + NVL(sbl.txn_init_raw_cost,0)) * NVL(sbl.projfunc_cost_exchange_rate,1))
160                            )), 																																							--sbl.raw_cost
161            sum(decode(l_txn_currency_flag,
162                       'Y', (((sbl.quantity - nvl(sbl.init_quantity,0)) *
163                            NVL(sbl.burden_cost_rate_override,sbl.burden_cost_rate))
164                            + NVL(sbl.txn_init_burdened_cost,0)),   																					--sbl.txn_burdened_cost
165                       'N', ((((sbl.quantity - nvl(sbl.init_quantity,0))  *
166                            NVL(sbl.burden_cost_rate_override,sbl.burden_cost_rate))
167                            + NVL(sbl.txn_init_burdened_cost,0)) * NVL(sbl.project_cost_exchange_rate,1)),   --sbl.project_burdened_cost
168                       'A', ((((sbl.quantity - nvl(sbl.init_quantity,0)) *
169                            NVL(sbl.burden_cost_rate_override,sbl.burden_cost_rate))
170                            + NVL(sbl.txn_init_burdened_cost,0)) * NVL(sbl.projfunc_cost_exchange_rate,1))
171                            )), 																																							 --sbl.burdened_cost
172            sum(decode(l_txn_currency_flag,
173                       'Y', (((sbl.quantity - nvl(sbl.init_quantity,0)) *
174                            NVL(sbl.txn_bill_rate_override,sbl.txn_standard_bill_rate))
175                            + NVL(sbl.txn_init_revenue,0)),   																								 --sbl.txn_revenue
176                       'N', ((((sbl.quantity - nvl(sbl.init_quantity,0)) *
177                            NVL(sbl.txn_bill_rate_override,sbl.txn_standard_bill_rate))
178                            + NVL(sbl.txn_init_revenue,0)) * NVL(sbl.project_cost_exchange_rate,1)) ,   			 --sbl.project_revenue
179                       'A', ((((sbl.quantity - nvl(sbl.init_quantity,0))  *
180                            NVL(sbl.txn_bill_rate_override,sbl.txn_standard_bill_rate))
181                            + NVL(sbl.txn_init_revenue,0)) * NVL(sbl.projfunc_cost_exchange_rate,1))
182                            )),
183            NULL,
184            NULL,
185            NULL,
186            NVL(ta.billable_flag,'Y')                       /* Added for ER 4376722 */
187     FROM pa_res_list_map_tmp4 tmp4,
188          pa_budget_lines sbl,
189          pa_resource_assignments ra,
190          pa_tasks ta                                       /* Added for ER 4376722 */
191     WHERE tmp4.txn_source_id = sbl.resource_assignment_id
192           and sbl.budget_version_id = l_source_id
193           and tmp4.txn_resource_assignment_id = ra.resource_assignment_id
194           and ra.budget_version_id = p_budget_version_id
195           and sbl.cost_rejection_code is null
196           and sbl.revenue_rejection_code is null
197           and sbl.burden_rejection_code is null
198           and sbl.other_rejection_code is null
199           and sbl.pc_cur_conv_rejection_code is null
200           and sbl.pfc_cur_conv_rejection_code is null
201           and NVL(ra.task_id,0) = ta.task_id (+)           /* Added for ER 4376722 */
202           --and ta.project_id = P_PROJECT_ID               /* Added for ER 4376722 */
203           and ra.project_id = P_PROJECT_ID                 /* Added for Bug 4543795 */
204     GROUP BY ra.resource_assignment_id,
205              ra.rate_based_flag,
206              decode(l_txn_currency_flag,
207                   'Y', sbl.txn_currency_code,
208                   'N', c_proj_currency_code,
209                   'A', c_projfunc_currency_code),
210              NULL,
211              NULL,
212              NULL,
213              NVL(ta.billable_flag,'Y');                    /* Added for ER 4376722 */
214 
215       /* Added for bug #4938603 */
216        CURSOR fcst_bdgt_line_actual_qty
217            (c_res_asgn_id       PA_RESOURCE_ASSIGNMENTS.RESOURCE_ASSIGNMENT_ID%TYPE,
218             c_txn_currency_code PA_PROJECTS_ALL.PROJECT_CURRENCY_CODE%TYPE
219            ) IS
220        SELECT sum(nvl(init_quantity,0))
221          FROM pa_budget_lines
222         WHERE resource_assignment_id = c_res_asgn_id
223           AND txn_currency_code = c_txn_currency_code;
224 
225        l_total_plan_qty               NUMBER;
226        l_init_qty                     NUMBER;
227 
228     /* String constants for valid Calling Context values */
229     lc_BudgetGeneration            CONSTANT VARCHAR2(30) := 'BUDGET_GENERATION';
230     lc_ForecastGeneration          CONSTANT VARCHAR2(30) := 'FORECAST_GENERATION';
231 
232     /* Local copy of the Calling Context that will be checked instead of p_calling_context */
233     l_calling_context              VARCHAR2(30);
234 
235     /* Pro-rate API variables */
236     l_mapped_src_res_asg_id_tab    PA_PLSQL_DATATYPES.IdTabTyp;
237     l_prorated_quantity            PA_BUDGET_LINES.QUANTITY%TYPE;
238     l_prorated_txn_raw_cost        PA_BUDGET_LINES.TXN_RAW_COST%TYPE;
239     l_prorated_txn_burdened_cost   PA_BUDGET_LINES.TXN_BURDENED_COST%TYPE;
240     l_prorated_txn_revenue         PA_BUDGET_LINES.TXN_REVENUE%TYPE;
241     l_prorated_proj_raw_cost       PA_BUDGET_LINES.PROJECT_RAW_COST%TYPE;
242     l_prorated_proj_burdened_cost  PA_BUDGET_LINES.PROJECT_BURDENED_COST%TYPE;
243     l_prorated_proj_revenue        PA_BUDGET_LINES.PROJECT_REVENUE%TYPE;
244 
245     /* This cursor is the revenue forecast generation analogue of the cursor
246      * budget_line_src_to_cal. As such, changes to that cursor should likely be
247      * mirorred here. See comments above the other cursor for more info.
248      * This cursor differs from the other one in that it only picks up source
249      * data with starting date after the forecast's actuals through period. */
250     CURSOR fcst_budget_line_src_to_cal
251         (c_proj_currency_code PA_PROJECTS_ALL.PROJECT_CURRENCY_CODE%TYPE,
252          c_projfunc_currency_code PA_PROJECTS_ALL.PROJECT_CURRENCY_CODE%TYPE,
253          c_src_time_phased_code PA_PROJ_FP_OPTIONS.COST_TIME_PHASED_CODE%TYPE) IS
254     SELECT /*+ INDEX(tmp4,PA_RES_LIST_MAP_TMP4_N2)*/
255            ra.resource_assignment_id,
256            ra.rate_based_flag,
257            decode(l_txn_currency_flag,
258                   'Y', sbl.txn_currency_code,
259                   'N', c_proj_currency_code,
260                   'A', c_projfunc_currency_code),
261            sum(quantity),
262            sum(decode(l_txn_currency_flag,
263                       'Y', sbl.quantity *
264                            NVL(sbl.txn_cost_rate_override,sbl.txn_standard_cost_rate),   --sbl.txn_raw_cost
265                       'N', sbl.quantity * NVL(sbl.project_cost_exchange_rate,1) *
266                            NVL(sbl.txn_cost_rate_override,sbl.txn_standard_cost_rate),   --sbl.project_raw_cost
267                       'A', sbl.quantity * NVL(sbl.projfunc_cost_exchange_rate,1) *
268                            NVL(sbl.txn_cost_rate_override,sbl.txn_standard_cost_rate))), --sbl.raw_cost
269            sum(decode(l_txn_currency_flag,
270                       'Y', sbl.quantity *
271                            NVL(sbl.burden_cost_rate_override,sbl.burden_cost_rate),   --sbl.txn_burdened_cost
272                       'N', sbl.quantity * NVL(sbl.project_cost_exchange_rate,1) *
273                            NVL(sbl.burden_cost_rate_override,sbl.burden_cost_rate),   --sbl.project_burdened_cost
274                       'A', sbl.quantity * NVL(sbl.projfunc_cost_exchange_rate,1) *
275                            NVL(sbl.burden_cost_rate_override,sbl.burden_cost_rate))), --sbl.burdened_cost
276            sum(decode(l_txn_currency_flag,
277                       'Y', sbl.quantity *
278                            NVL(sbl.txn_bill_rate_override,sbl.txn_standard_bill_rate),   --sbl.txn_revenue
279                       'N', sbl.quantity * NVL(sbl.project_cost_exchange_rate,1) *
280                            NVL(sbl.txn_bill_rate_override,sbl.txn_standard_bill_rate),   --sbl.project_revenue
281                       'A', sbl.quantity * NVL(sbl.projfunc_cost_exchange_rate,1) *
282                            NVL(sbl.txn_bill_rate_override,sbl.txn_standard_bill_rate))), --sbl.revenue
283            NULL,
284            NULL,
285            NULL,
286            NVL(ta.billable_flag,'Y')                       /* Added for ER 4376722 */
287     FROM pa_res_list_map_tmp4 tmp4,
288          pa_budget_lines sbl,
289          pa_resource_assignments ra,
290          pa_tasks ta                                       /* Added for ER 4376722 */
291     WHERE tmp4.txn_source_id = sbl.resource_assignment_id
292           and sbl.budget_version_id = l_source_id
293           and tmp4.txn_resource_assignment_id = ra.resource_assignment_id
294           and ra.budget_version_id = p_budget_version_id
295           and sbl.start_date > decode( c_src_time_phased_code,
296                                        'N', sbl.start_date-1, P_ACTUALS_THRU_DATE )
297           and sbl.cost_rejection_code is null
298           and sbl.revenue_rejection_code is null
299           and sbl.burden_rejection_code is null
300           and sbl.other_rejection_code is null
301           and sbl.pc_cur_conv_rejection_code is null
302           and sbl.pfc_cur_conv_rejection_code is null
303           and NVL(ra.task_id,0) = ta.task_id (+)           /* Added for ER 4376722 */
304           --and ta.project_id = P_PROJECT_ID               /* Added for ER 4376722 */
305           and ra.project_id = P_PROJECT_ID                 /* Added for Bug 4543795 */
306     GROUP BY ra.resource_assignment_id,
307              ra.rate_based_flag,
308              decode(l_txn_currency_flag,
309                   'Y', sbl.txn_currency_code,
310                   'N', c_proj_currency_code,
311                   'A', c_projfunc_currency_code),
312              NULL,
313              NULL,
314              NULL,
315              NVL(ta.billable_flag,'Y');                    /* Added for ER 4376722 */
316 
317     -- Bug 4192970: Added extra cursor for Forecast Generation context when
318     -- Source time phasing is None. When Source time phasing is PA or GL,
319     -- use the fcst_budget_line_src_to_cal cursor. For more comments/details,
320     -- please see the other cursor.
321     CURSOR fcst_bdgt_line_src_to_cal_none
322         (c_proj_currency_code PA_PROJECTS_ALL.PROJECT_CURRENCY_CODE%TYPE,
323          c_projfunc_currency_code PA_PROJECTS_ALL.PROJECT_CURRENCY_CODE%TYPE,
324          c_src_time_phased_code PA_PROJ_FP_OPTIONS.COST_TIME_PHASED_CODE%TYPE) IS
325     SELECT /*+ INDEX(tmp4,PA_RES_LIST_MAP_TMP4_N2)*/
326            ra.resource_assignment_id,
327            ra.rate_based_flag,
328            decode(l_txn_currency_flag,
329                   'Y', sbl.txn_currency_code,
330                   'N', c_proj_currency_code,
331                   'A', c_projfunc_currency_code),
332            sum(sbl.quantity-NVL(sbl.init_quantity,0)),
333            sum(decode(l_txn_currency_flag,
334                       'Y', (sbl.quantity-NVL(sbl.init_quantity,0)) *
335                            NVL(sbl.txn_cost_rate_override,sbl.txn_standard_cost_rate),   --sbl.txn_raw_cost
336                       'N', (sbl.quantity-NVL(sbl.init_quantity,0)) * NVL(sbl.project_cost_exchange_rate,1) *
337                            NVL(sbl.txn_cost_rate_override,sbl.txn_standard_cost_rate),   --sbl.project_raw_cost
338                       'A', (sbl.quantity-NVL(sbl.init_quantity,0)) * NVL(sbl.projfunc_cost_exchange_rate,1) *
339                            NVL(sbl.txn_cost_rate_override,sbl.txn_standard_cost_rate))), --sbl.raw_cost
340            sum(decode(l_txn_currency_flag,
341                       'Y', (sbl.quantity-NVL(sbl.init_quantity,0)) *
342                            NVL(sbl.burden_cost_rate_override,sbl.burden_cost_rate),   --sbl.txn_burdened_cost
343                       'N', (sbl.quantity-NVL(sbl.init_quantity,0)) * NVL(sbl.project_cost_exchange_rate,1) *
344                            NVL(sbl.burden_cost_rate_override,sbl.burden_cost_rate),   --sbl.project_burdened_cost
345                       'A', (sbl.quantity-NVL(sbl.init_quantity,0)) * NVL(sbl.projfunc_cost_exchange_rate,1) *
346                            NVL(sbl.burden_cost_rate_override,sbl.burden_cost_rate))), --sbl.burdened_cost
347            sum(decode(l_txn_currency_flag,
348                       'Y', (sbl.quantity-NVL(sbl.init_quantity,0)) *
349                            NVL(sbl.txn_bill_rate_override,sbl.txn_standard_bill_rate),   --sbl.txn_revenue
350                       'N', (sbl.quantity-NVL(sbl.init_quantity,0)) * NVL(sbl.project_cost_exchange_rate,1) *
351                            NVL(sbl.txn_bill_rate_override,sbl.txn_standard_bill_rate),   --sbl.project_revenue
352                       'A', (sbl.quantity-NVL(sbl.init_quantity,0)) * NVL(sbl.projfunc_cost_exchange_rate,1) *
353                            NVL(sbl.txn_bill_rate_override,sbl.txn_standard_bill_rate))), --sbl.revenue
354            NULL,
355            NULL,
356            NULL,
357            NVL(ta.billable_flag,'Y')                       /* Added for ER 4376722 */
358     FROM pa_res_list_map_tmp4 tmp4,
359          pa_budget_lines sbl,
360          pa_resource_assignments ra,
361          pa_tasks ta                                       /* Added for ER 4376722 */
362     WHERE tmp4.txn_source_id = sbl.resource_assignment_id
363           and sbl.budget_version_id = l_source_id
364           and tmp4.txn_resource_assignment_id = ra.resource_assignment_id
365           and ra.budget_version_id = p_budget_version_id
366           and sbl.cost_rejection_code is null
367           and sbl.revenue_rejection_code is null
368           and sbl.burden_rejection_code is null
369           and sbl.other_rejection_code is null
370           and sbl.pc_cur_conv_rejection_code is null
371           and sbl.pfc_cur_conv_rejection_code is null
372           and NVL(sbl.quantity,0) <> NVL(sbl.init_quantity,0)
373           and NVL(ra.task_id,0) = ta.task_id (+)           /* Added for ER 4376722 */
374           --and ta.project_id = P_PROJECT_ID               /* Added for ER 4376722 */
375           and ra.project_id = P_PROJECT_ID                 /* Added for Bug 4543795 */
376     GROUP BY ra.resource_assignment_id,
377              ra.rate_based_flag,
378              decode(l_txn_currency_flag,
379                   'Y', sbl.txn_currency_code,
380                   'N', c_proj_currency_code,
381                   'A', c_projfunc_currency_code),
382              NULL,
383              NULL,
384              NULL,
385              NVL(ta.billable_flag,'Y');                    /* Added for ER 4376722 */
386 
387     l_res_class_id_tab             pa_plsql_datatypes.IdTabTyp;
388     l_res_asg_id_tmp_tab           pa_plsql_datatypes.IdTabTyp;
389     l_res_class_code_tab           PA_PLSQL_DATATYPES.Char30TabTyp;
390     l_count number;
391     l_count1 number;
392     l_count2 number;
393 
394     l_versioning_enabled           varchar2(10);
395     l_version_type                 varchar2(50);
396 
397     l_rev_gen_method               VARCHAR2(3);
398     l_res_asg_uom_update_tab       pa_plsql_datatypes.IdTabTyp;
399 
400     l_wp_track_cost_flag           VARCHAR2(1);
401     tmp_flag                       varchar2(1);
402     tmp_rlm_tab                    pa_plsql_datatypes.IdTabTyp;
403     tmp_task_tab                   pa_plsql_datatypes.IdTabTyp;
404     tmp_ra_tab                     pa_plsql_datatypes.IdTabTyp;
405     l_uncategorized_flag           pa_resource_lists_all_bg.uncategorized_flag%type;
406 
407     l_appr_cost_plan_type_flag     PA_BUDGET_VERSIONS.APPROVED_COST_PLAN_TYPE_FLAG%TYPE;
408     l_appr_rev_plan_type_flag      PA_BUDGET_VERSIONS.APPROVED_COST_PLAN_TYPE_FLAG%TYPE;
409     l_source_version_type          PA_BUDGET_VERSIONS.VERSION_TYPE%TYPE;
410     l_target_version_type          PA_BUDGET_VERSIONS.VERSION_TYPE%TYPE;
411     l_dummy                        NUMBER;
412 
413     --Local pl/sql table to call Map_Rlmi_Rbs api
414     l_TXN_SOURCE_ID_tab            PA_PLSQL_DATATYPES.IdTabTyp;
415     l_TXN_SOURCE_TYPE_CODE_tab     PA_PLSQL_DATATYPES.Char30TabTyp;
416     l_PERSON_ID_tab                PA_PLSQL_DATATYPES.IdTabTyp;
417     l_JOB_ID_tab                   PA_PLSQL_DATATYPES.IdTabTyp;
418     l_ORGANIZATION_ID_tab          PA_PLSQL_DATATYPES.IdTabTyp;
419     l_VENDOR_ID_tab                PA_PLSQL_DATATYPES.IdTabTyp;
420     l_EXPENDITURE_TYPE_tab         PA_PLSQL_DATATYPES.Char30TabTyp;
421     l_EVENT_TYPE_tab               PA_PLSQL_DATATYPES.Char30TabTyp;
422     l_NON_LABOR_RESOURCE_tab       PA_PLSQL_DATATYPES.Char20TabTyp;
423     l_EXPENDITURE_CATEGORY_tab     PA_PLSQL_DATATYPES.Char30TabTyp;
424     l_REVENUE_CATEGORY_CODE_tab    PA_PLSQL_DATATYPES.Char30TabTyp;
425     l_NLR_ORGANIZATION_ID_tab      PA_PLSQL_DATATYPES.IdTabTyp;
426     l_EVENT_CLASSIFICATION_tab     PA_PLSQL_DATATYPES.Char30TabTyp;
427     l_SYS_LINK_FUNCTION_tab        PA_PLSQL_DATATYPES.Char30TabTyp;
428     l_PROJECT_ROLE_ID_tab          PA_PLSQL_DATATYPES.IdTabTyp;
429     l_RESOURCE_CLASS_CODE_tab      PA_PLSQL_DATATYPES.Char30TabTyp;
430     l_MFC_COST_TYPE_ID_tab         PA_PLSQL_DATATYPES.IDTabTyp;
431     l_RESOURCE_CLASS_FLAG_tab      PA_PLSQL_DATATYPES.Char1TabTyp;
432     l_FC_RES_TYPE_CODE_tab         PA_PLSQL_DATATYPES.Char30TabTyp;
433     l_INVENTORY_ITEM_ID_tab        PA_PLSQL_DATATYPES.IDTabTyp;
434     l_ITEM_CATEGORY_ID_tab         PA_PLSQL_DATATYPES.IDTabTyp;
435     l_PERSON_TYPE_CODE_tab         PA_PLSQL_DATATYPES.Char30TabTyp;
436     l_BOM_RESOURCE_ID_tab          PA_PLSQL_DATATYPES.IDTabTyp;
437     l_NAMED_ROLE_tab               PA_PLSQL_DATATYPES.Char80TabTyp;
438     l_INCURRED_BY_RES_FLAG_tab     PA_PLSQL_DATATYPES.Char1TabTyp;
439     l_RATE_BASED_FLAG_tab          PA_PLSQL_DATATYPES.Char1TabTyp;
440     l_TXN_TASK_ID_tab              PA_PLSQL_DATATYPES.IdTabTyp;
441     l_TXN_WBS_ELEMENT_VER_ID_tab   PA_PLSQL_DATATYPES.IdTabTyp;
442     l_TXN_RBS_ELEMENT_ID_tab       PA_PLSQL_DATATYPES.IdTabTyp;
443 	l_CBS_ELEMENT_ID_tab       	   PA_PLSQL_DATATYPES.IdTabTyp; --bug#16827157
444     l_TXN_PLAN_START_DATE_tab      PA_PLSQL_DATATYPES.DateTabTyp;
445     l_TXN_PLAN_END_DATE_tab        PA_PLSQL_DATATYPES.DateTabTyp;
446 
447     --out param from PA_RLMI_RBS_MAP_PUB.MAP_RLMI_RBS
448     l_map_txn_source_id_tab        PA_PLSQL_DATATYPES.IdTabTyp;
449     l_map_rlm_id_tab               PA_PLSQL_DATATYPES.IdTabTyp;
450     l_map_rbs_element_id_tab       PA_PLSQL_DATATYPES.IdTabTyp;
451     l_map_txn_accum_header_id_tab  PA_PLSQL_DATATYPES.IdTabTyp;
452 
453     l_etc_start_date               DATE;
454 
455     l_calc_qty_tmp     NUMBER;
456     l_calc_tmp_rev     NUMBER;
457 
458     /* Bug 3968748: PL/SQL tables for populating PA_FP_GEN_RATE_TMP */
459     l_nrb_ra_id_tab                PA_PLSQL_DATATYPES.IdTabTyp;
460     l_nrb_txn_curr_code_tab        PA_PLSQL_DATATYPES.Char30TabTyp;
461     l_nrb_bcost_rate_tab           PA_PLSQL_DATATYPES.NumTabTyp;
462     l_nrb_rcost_rate_tab           PA_PLSQL_DATATYPES.NumTabTyp;
463     l_index                        NUMBER;
464 
465     /* Variables Added for ER 4376722 */
466     l_billable_flag_tab            SYSTEM.pa_varchar2_1_tbl_type:=SYSTEM.pa_varchar2_1_tbl_type();
467 
468     -- This index is used to track the running index of the _tmp_ tables
469     l_tmp_index                    NUMBER;
470 
471     -- These _tmp_ tables will be used for removing non-billable tasks.
472     l_tmp_tgt_res_asg_id_tab       SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
473     l_tmp_tgt_rate_based_flag_tab  SYSTEM.pa_varchar2_1_tbl_type:=SYSTEM.pa_varchar2_1_tbl_type();
474     l_tmp_txn_currency_code_tab    SYSTEM.pa_varchar2_15_tbl_type:=SYSTEM.pa_varchar2_15_tbl_type();
475     l_tmp_src_quantity_tab         SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
476     l_tmp_src_raw_cost_tab         SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
477     l_tmp_src_brdn_cost_tab        SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
478     l_tmp_src_revenue_tab          SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
479     l_tmp_cost_rate_override_tab   SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
480     l_tmp_b_cost_rate_override_tab SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
481     l_tmp_bill_rate_override_tab   SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
482     l_tmp_billable_flag_tab        SYSTEM.pa_varchar2_1_tbl_type:=SYSTEM.pa_varchar2_1_tbl_type();
483 
484     -- Added in IPM to track if a record in the existing set of
485     -- pl/sql tables needs to be removed.
486     l_remove_record_flag_tab       PA_PLSQL_DATATYPES.Char1TabTyp;
487     l_remove_records_flag          VARCHAR2(1);
488 
489 BEGIN
490     IF P_PA_DEBUG_MODE = 'Y' THEN
491         pa_debug.set_curr_function( p_function   => 'GENERATE_WP_BUDGET_AMT',
492                                     p_debug_mode => p_pa_debug_mode );
493     END IF;
494     --hr_utility.trace_on(null,'mftest');
495     --hr_utility.trace('==BEGIN==');
496 
497     x_return_status := FND_API.G_RET_STS_SUCCESS;
498     x_msg_count := 0;
499 
500     --l_rev_gen_method := PA_FP_GEN_FCST_PG_PKG.GET_REV_GEN_METHOD(p_project_id); Bug 5462471
501 
502     l_wp_track_cost_flag :=
503         NVL( PA_FP_WP_GEN_AMT_UTILS.GET_WP_TRACK_COST_AMT_FLAG(p_project_id), 'N' );
504 
505     select trunc(sysdate) into l_sysdate_trunc from dual;
506 
507     IF p_init_msg_flag = 'Y' THEN
508         FND_MSG_PUB.initialize;
509     END IF;
510 
511     /* Set the local calling context to p_calling_context if it is a valid value.
512      * Otherwise, default l_calling_context to budget generation. */
513     IF p_calling_context = lc_BudgetGeneration OR
514        p_calling_context = lc_ForecastGeneration THEN
515         l_calling_context := p_calling_context;
516     ELSE
517         l_calling_context := lc_BudgetGeneration;
518     END IF;
519 
520     IF P_PROJECT_ID is null or p_budget_version_id is null THEN
521         PA_UTILS.ADD_MESSAGE(p_app_short_name => 'PA',
522                              p_msg_name       => 'PA_FP_INV_PARAM_PASSED');
523         RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
524     END IF;
525 
526     IF P_PA_DEBUG_MODE = 'Y' THEN
527         pa_fp_gen_amount_utils.fp_debug
528             ( p_called_mode => p_called_mode,
529               p_msg         => 'Before calling PA_FP_GEN_AMOUNT_UTILS.GET_PLAN_VERSION_DTLS',
530               p_module_name => l_module_name,
531               p_log_level   => 5 );
532     END IF;
533     /*Calling the UTIL API to get the target financial plan info l_fp_cols_rec_target*/
534     PA_FP_GEN_AMOUNT_UTILS.GET_PLAN_VERSION_DTLS
535         ( P_PROJECT_ID         => P_PROJECT_ID,
536           P_BUDGET_VERSION_ID  => P_BUDGET_VERSION_ID,
537           X_FP_COLS_REC        => l_fp_cols_rec_target,
538           X_RETURN_STATUS      => x_return_status,
539           X_MSG_COUNT          => x_msg_count,
540           X_MSG_DATA           => x_msg_data );
541     IF P_PA_DEBUG_MODE = 'Y' THEN
542         pa_fp_gen_amount_utils.fp_debug
543             ( p_called_mode => p_called_mode,
544               p_msg         => 'Status after calling
545                                PA_FP_GEN_AMOUNT_UTILS.GET_PLAN_VERSION_DTLS: '
546                                ||x_return_status,
547               p_module_name => l_module_name,
548               p_log_level   => 5 );
549     END IF;
550     IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
551         raise PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
552     END IF;
553 
554     l_rev_gen_method := nvl(l_fp_cols_rec_target.x_revenue_derivation_method,PA_FP_GEN_FCST_PG_PKG.GET_REV_GEN_METHOD(p_project_id)); --Bug 5462471
555 
556     IF l_calling_context = lc_BudgetGeneration THEN
557         l_gen_src_code := l_fp_cols_rec_target.x_gen_src_code;
558     ELSIF  l_calling_context = lc_ForecastGeneration THEN
559         l_gen_src_code := l_fp_cols_rec_target.x_gen_etc_src_code;
560     END IF;
561 
562     l_stru_sharing_code := PA_PROJECT_STRUCTURE_UTILS.get_Structure_sharing_code(
563         p_project_id=> p_project_id );
564         -- SHARE_FULL
565         -- SHARE_PARTIAL
566         -- SPLIT_NO_MAPPING
567         -- SPLILT_MAPPING
568     -- dbms_output.put_line('proj id           '||p_project_id );
569     -- dbms_output.put_line('bv   id           '||p_budget_version_id );
570     -- dbms_output.put_line('stru sharing code '||l_stru_sharing_code );
571     IF l_stru_sharing_code is null
572         AND  PA_PROJECT_STRUCTURE_UTILS.check_financial_enabled( p_project_id )= 'Y'
573         AND  l_gen_src_code = 'WORKPLAN_RESOURCES' THEN
574         PA_UTILS.ADD_MESSAGE( p_app_short_name => 'PA',
575                               p_msg_name       => 'PA_ONLY_FIN_STRUCT');
576         raise PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
577     END IF;
578     /**SRC WORKPLAN VER CODE: CURRENT_WORKING; LAST_PUBLISHED; BASELINED.
579       *SRC FINPLAN VER CODE:  CURRENT_WORKING;
580       *                       CURRENT_BASELINED; ORIGINAL_BASELINED;
581       *                       CURRENT_APPROVED; ORIGINAL_APPROVED.**/
582 
583 
584         --dbms_output.put_line('src code val :'||l_gen_src_code );
585 
586     /* In the context of budget generation, it is necessary to derive values
587      * for l_source_id and l_wp_id.
588      * In the context of forecast generation, l_source_id is passed in as
589      * p_etc_plan_version_id. Furthermore, currently, this API only supports
590      * forecast generation when the target is revenue-only and the source is
591      * a cost or cost-and-revenue forecast. Hence l_wp_id can be left as NULL. */
592 
593     IF l_calling_context = lc_BudgetGeneration THEN
594 	IF (l_gen_src_code = 'WORKPLAN_RESOURCES') THEN
595 	    /*Get latest published/current working/baselined work plan version id*/
596 	    IF l_fp_cols_rec_target.x_gen_src_wp_version_id is not NULL THEN
597 		l_source_id := l_fp_cols_rec_target.x_gen_src_wp_version_id;
598 		/* the x_gen_src_wp_version_id is the budget version id
599 		   corresponding to the work plan structure version id selected
600 		   as the source for the budget generation when the budget
601 		   generation source is Work plan. */
602 		SELECT project_structure_version_id
603                 INTO   l_wp_id
604                 FROM   pa_budget_versions
605                 WHERE  budget_version_id = l_source_id;
606 	    ELSE
607 		l_versioning_enabled :=
608 		    PA_WORKPLAN_ATTR_UTILS.CHECK_WP_VERSIONING_ENABLED(p_project_id);
609 		IF l_versioning_enabled = 'Y' THEN
610 		    l_wp_status := l_fp_cols_rec_target.x_gen_src_wp_ver_code;
611 		    --dbms_output.put_line('ver code val :'||l_wp_status );
612 		    IF (l_wp_status = 'LAST_PUBLISHED') THEN
613 			l_wp_id := PA_PROJECT_STRUCTURE_UTILS.GET_LATEST_WP_VERSION
614 				       ( P_PROJECT_ID => p_project_id );
615 			IF l_wp_id is null THEN
616 			    PA_UTILS.ADD_MESSAGE
617 				( p_app_short_name => 'PA',
618 				  p_msg_name       => 'PA_LATEST_WPID_NULL');
619 			    raise PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
620 			END IF;
621 		    ELSIF (l_wp_status = 'CURRENT_WORKING') THEN
622 			--dbms_output.put_line('inside cw  chk  :');
623 	                l_wp_id := PA_PROJECT_STRUCTURE_UTILS.GET_CURRENT_WORKING_VER_ID
624                                        ( P_PROJECT_ID => p_project_id);
625                         IF l_wp_id is null THEN
626                             --dbms_output.put_line('cw id is null  calling latest pub  :');
627                             l_wp_id := PA_PROJECT_STRUCTURE_UTILS.GET_LATEST_WP_VERSION
628                                            ( P_PROJECT_ID => p_project_id );
629                         END IF;
630                         --dbms_output.put_line('wp id value : '||l_wp_id);
631                         IF l_wp_id is null THEN
632                             PA_UTILS.ADD_MESSAGE
633                                 ( p_app_short_name => 'PA',
634                                   p_msg_name       => 'PA_CW_WPID_NULL');
635                             raise PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
636                         END IF;
637                     -- Bug 4426511: Changed 'BASELINE', which was INCORRECT, to 'BASELINED'.
638                     ELSIF (l_wp_status = 'BASELINED') THEN
639                         l_wp_id := PA_PROJECT_STRUCTURE_UTILS.GET_BASELINE_STRUCT_VER
640                                        ( P_PROJECT_ID => p_project_id );
641                         IF l_wp_id is null THEN
642                             PA_UTILS.ADD_MESSAGE
643                                 ( p_app_short_name => 'PA',
644                                   p_msg_name       => 'PA_BASELINED_WPID_NULL');
645                             raise PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
646                         END IF;
647                     END IF;
648                 ELSE
649                     l_wp_id := PA_PROJECT_STRUCTURE_UTILS.GET_LATEST_WP_VERSION
650                                    ( P_PROJECT_ID => p_project_id );
651                     IF l_wp_id is null THEN
652                         PA_UTILS.ADD_MESSAGE
653                             ( p_app_short_name => 'PA',
654                               p_msg_name       => 'PA_LATEST_WPID_NULL');
655                         raise PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
656                     END IF;
657                 END IF;
658                 /*Get the budget version id for the requried work plan version id
659                  *SOURCE: work plan budget version id: l_source_id
660                  *TARGET: financial budget version id: P_BUDGET_VERSION_ID*/
661 
662                 l_source_id := Pa_Fp_wp_gen_amt_utils.get_wp_version_id
663                                    ( p_project_id      => p_project_id,
664                                      p_plan_type_id    => l_wp_ptype_id,
665                                      p_proj_str_ver_id => l_wp_id );
666             END IF;
667 
668              --dbms_output.put_line('l_source_id:    '||l_source_id );
669              --l_txn_currency_flag := '1';
670 
671              l_version_type := l_fp_cols_rec_target.x_version_type;
672             /*As of now, we have the l_wp_id as wp struct version id
673              * l_source_id as wp fin version id
674              * Now, we need to update back to pa_proj_fp_options*/
675             IF l_version_type = 'COST' THEN
676                 UPDATE PA_PROJ_FP_OPTIONS
677                 SET    GEN_SRC_COST_WP_VERSION_ID = l_source_id
678                 WHERE  fin_plan_version_id = P_BUDGET_VERSION_ID;
679             ELSIF l_version_type = 'ALL' THEN
680                 UPDATE PA_PROJ_FP_OPTIONS
681                 SET    GEN_SRC_ALL_WP_VERSION_ID = l_source_id
682                 WHERE  fin_plan_version_id = P_BUDGET_VERSION_ID;
683             ELSIF l_version_type = 'REVENUE' THEN
684                 UPDATE PA_PROJ_FP_OPTIONS
685                 SET    GEN_SRC_REV_WP_VERSION_ID = l_source_id
686                 WHERE  fin_plan_version_id = P_BUDGET_VERSION_ID;
687             END IF;
688 
689             /*project structure version id is populated when create new version.
690             IF ( l_stru_sharing_code = 'SHARE_FULL' OR
691                  l_stru_sharing_code = 'SHARE_PARTIAL' ) AND
692                l_fp_cols_rec_target.X_FIN_PLAN_LEVEL_CODE <> 'P' THEN
693                 UPDATE PA_BUDGET_VERSIONS
694                 SET    project_structure_version_id = l_wp_id
695                 WHERE  budget_version_id = P_BUDGET_VERSION_ID;
696             END IF;*/
697         ELSIF (l_gen_src_code = 'FINANCIAL_PLAN') THEN
698             IF l_fp_cols_rec_target.x_gen_src_plan_version_id IS NOT NULL THEN
699                 l_source_id := l_fp_cols_rec_target.x_gen_src_plan_version_id;
700             ELSE
701                 l_gen_src_plan_ver_code :=  l_fp_cols_rec_target.X_GEN_SRC_PLAN_VER_CODE;
702                 IF l_gen_src_plan_ver_code = 'CURRENT_BASELINED'
703                    OR l_gen_src_plan_ver_code = 'ORIGINAL_BASELINED'
704                    OR l_gen_src_plan_ver_code = 'CURRENT_APPROVED'
705                    OR l_gen_src_plan_ver_code = 'ORIGINAL_APPROVED' THEN
706                    /*Get the current baselined or original baselined version*/
707                     IF P_PA_DEBUG_MODE = 'Y' THEN
708                        pa_fp_gen_amount_utils.fp_debug
709                            ( p_called_mode => p_called_mode,
710                              p_msg         => 'Before calling
711                                               pa_fp_gen_amount_utils.Get_Curr_Original_Version_Info',
712                              p_module_name => l_module_name,
713                              p_log_level   => 5 );
714                     END IF;
715                     pa_fp_gen_amount_utils.Get_Curr_Original_Version_Info(
716                         p_project_id                => P_PROJECT_ID,
717                         p_fin_plan_type_id          => l_fp_cols_rec_target.X_GEN_SRC_PLAN_TYPE_ID,
718                         p_version_type              => 'COST',
719                         p_status_code               => l_gen_src_plan_ver_code,
720                         x_fp_options_id             => l_fp_options_id,
721                         x_fin_plan_version_id       => l_source_id,
722                         x_return_status             => x_return_status,
723                         x_msg_count                 => x_msg_count,
724                         x_msg_data                  => x_msg_data );
725                     IF P_PA_DEBUG_MODE = 'Y' THEN
726                        pa_fp_gen_amount_utils.fp_debug
727                            ( p_called_mode => p_called_mode,
728                              p_msg         => 'Status after calling
729                                                pa_fp_gen_amount_utils.Get_Curr_Original_Version_Info'
730                                                ||x_return_status,
731                              p_module_name => l_module_name,
732                              p_log_level   => 5 );
733                     END IF;
734                     IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
735                         raise PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
736                     END IF;
737 
738                 ELSIF l_gen_src_plan_ver_code = 'CURRENT_WORKING' THEN
739                    /*Get the current working version*/
740                     IF P_PA_DEBUG_MODE = 'Y' THEN
741                         pa_fp_gen_amount_utils.fp_debug
742                             ( p_called_mode => p_called_mode,
743                               p_msg         => 'Before calling
744                                                 pa_fin_plan_utils.Get_Curr_Working_Version_Info',
745                               p_module_name => l_module_name,
746                               p_log_level   => 5 );
747                     END IF;
748                     pa_fin_plan_utils.Get_Curr_Working_Version_Info
749                         ( p_project_id                => P_PROJECT_ID,
750                           p_fin_plan_type_id          => l_fp_cols_rec_target.X_GEN_SRC_PLAN_TYPE_ID,
751                           p_version_type              => 'COST',
752                           x_fp_options_id             => l_fp_options_id,
753                           x_fin_plan_version_id       => l_source_id,
754                           x_return_status             => x_return_status,
755                           x_msg_count                 => x_msg_count,
756                           x_msg_data                  => x_msg_data );
757                     IF P_PA_DEBUG_MODE = 'Y' THEN
758                         pa_fp_gen_amount_utils.fp_debug
759                             ( p_called_mode => p_called_mode,
760                               p_msg         => 'Status after calling
761                                                pa_fin_plan_utils.Get_Curr_Working_Version_Info'
762                                                ||x_return_status,
763                               p_module_name => l_module_name,
764                               p_log_level   => 5 );
765                     END IF;
766                     IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
767                         raise PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
768                     END IF;
769                  ELSE
770                      l_dummy := 1;
771                  END IF;
772             END IF;
773             --dbms_output.put_line('==l_source_id:'||l_source_id);
774 
775             l_version_type := l_fp_cols_rec_target.x_version_type;
776             /*As of now, we have l_source_id as fin version id
777              * Now, we need to update back to pa_proj_fp_options*/
778             IF l_version_type = 'COST' THEN
779                 UPDATE PA_PROJ_FP_OPTIONS
780                 SET GEN_SRC_COST_PLAN_VERSION_ID = l_source_id
781                 WHERE fin_plan_version_id = P_BUDGET_VERSION_ID;
782             ELSIF l_version_type = 'ALL' THEN
783                 UPDATE PA_PROJ_FP_OPTIONS
784                 SET GEN_SRC_ALL_PLAN_VERSION_ID = l_source_id
785                 WHERE fin_plan_version_id = P_BUDGET_VERSION_ID;
786             ELSIF l_version_type = 'REVENUE' THEN
787                 UPDATE PA_PROJ_FP_OPTIONS
788                 SET GEN_SRC_REV_PLAN_VERSION_ID = l_source_id
789                 WHERE fin_plan_version_id = P_BUDGET_VERSION_ID;
790             END IF;
791         END IF; -- end gen_src_code-based logic
792 
793 	IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
794 	    raise PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
795 	END IF;
796 	IF l_source_id IS NULL THEN
797 	    PA_UTILS.ADD_MESSAGE( p_app_short_name => 'PA',
798 				  p_msg_name       => 'PA_SRC_FP_VER_NULL');
799 	    raise PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
800 	END IF;
801     ELSIF l_calling_context = lc_ForecastGeneration THEN
802 	l_source_id := p_etc_plan_version_id;
803     END IF; -- context-based l_source_id, l_wp_id logic.
804 
805 
806     /*Calling the UTIL API to get the source info l_fp_cols_rec_source*/
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         => 'Before calling
811                                PA_FP_GEN_AMOUNT_UTILS.GET_PLAN_VERSION_DTLS',
812               p_module_name => l_module_name,
813               p_log_level   => 5 );
814     END IF;
815     PA_FP_GEN_AMOUNT_UTILS.GET_PLAN_VERSION_DTLS
816         ( P_PROJECT_ID                 => P_PROJECT_ID,
817           P_BUDGET_VERSION_ID          => l_source_id,
818           X_FP_COLS_REC                => l_fp_cols_rec_source,
819           X_RETURN_STATUS              => x_return_status,
820           X_MSG_COUNT                  => x_msg_count,
821           X_MSG_DATA                   => x_msg_data );
822     IF P_PA_DEBUG_MODE = 'Y' THEN
823         pa_fp_gen_amount_utils.fp_debug
824             ( p_called_mode => p_called_mode,
825               p_msg         => 'Status after calling
826                                PA_FP_GEN_AMOUNT_UTILS.GET_PLAN_VERSION_DTLS: '
827                                ||x_return_status,
828               p_module_name => l_module_name,
829               p_log_level   => 5 );
830     END IF;
831 
832     IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
833         raise PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
834     END IF;
835 
836     /*By now, we have both source budget version id (l_source_id)
837      *                 and target budget version id (p_budget_version_id)*/
838     /*source multi currency flag     target multi currency flag currency code used
839         N                               N                               proj
840         Y                               N                               proj
841         N                               Y                               txn
842         Y                               Y                               txn
843       l_txn_currency_flag is 'Y' means we use txn_currency_code
844       l_txn_currency_flag is 'N' means we use proj_currency_code
845       l_txn_currency_flag is 'A' means we use projfunc_currency_code
846      */
847 
848     SELECT NVL(APPROVED_COST_PLAN_TYPE_FLAG, 'N'),
849            NVL(APPROVED_REV_PLAN_TYPE_FLAG, 'N')
850            INTO
851            l_appr_cost_plan_type_flag,
852            l_appr_rev_plan_type_flag
853     FROM PA_BUDGET_VERSIONS
854     WHERE BUDGET_VERSION_ID = P_BUDGET_VERSION_ID;
855 
856     /* When the Calling Context is Forecast generation and we set l_txn_currency_flag
857      * to 'A', we are really considering the case when the Source version is a Cost
858      * forecast and the Target version is Revenue because this is the only case in
859      * which we call this procedure from the forecast generation wrapper API. If this
860      * premise changes, then this condition will need to be modified accordingly. */
861 
862     IF ((l_fp_cols_rec_target.x_version_type = 'ALL' OR
863          l_fp_cols_rec_target.x_version_type = 'REVENUE') AND
864         (l_appr_cost_plan_type_flag = 'Y' OR l_appr_rev_plan_type_flag = 'Y')) OR
865         (l_calling_context = lc_BudgetGeneration AND l_rev_gen_method = 'C' AND
866          l_fp_cols_rec_target.x_version_type = 'REVENUE') OR
867         l_calling_context = lc_ForecastGeneration THEN
868         l_txn_currency_flag := 'A';
869     ELSIF l_fp_cols_rec_target.x_plan_in_multi_curr_flag = 'N' THEN
870         l_txn_currency_flag := 'N';
871     END IF;
872 
873     --hr_utility.trace('l_fp_cols_rec_target.x_plan_in_multi_curr_flag:'||l_fp_cols_rec_target.x_plan_in_multi_curr_flag);
874     --hr_utility.trace('l_fp_cols_rec_target.x_project_currency_code:'||l_fp_cols_rec_target.x_project_currency_code);
875 
876     /* Bug 4119258 : The Copy Actuals API should be called before the
877        resource mapping logic. Otherwise, the tmp table data will get deleted
878        and no amounts will be carried over to the target version from the
879        generation source.  */
880 
881     -- Bug 4114589: Moved from beginning of GENERATE_FCST_AMT_WRP to several
882     -- places - this being one of them. The Copy Actuals API call is placed
883     -- after calls to CREATE_RES_ASG and UPDATE_RES_ASG so that planning dates
884     -- from the source are honored when possible, since resources created by
885     -- the Copy Actuals API use task/project-level default dates.
886     IF l_calling_context = lc_ForecastGeneration THEN
887         IF p_pa_debug_mode = 'Y' THEN
888             PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
889                 P_CALLED_MODE       => P_CALLED_MODE,
890                 P_MSG               => 'Before calling pa_fp_copy_actuals_pub.copy_actuals',
891                 P_MODULE_NAME       => l_module_name);
892         END IF;
893         PA_FP_COPY_ACTUALS_PUB.COPY_ACTUALS
894               (P_PROJECT_ID               => P_PROJECT_ID,
895                P_BUDGET_VERSION_ID        => P_BUDGET_VERSION_ID,
896                P_FP_COLS_REC              => l_fp_cols_rec_target,
897                P_END_DATE                 => P_ACTUALS_THRU_DATE,
898                P_INIT_MSG_FLAG            => 'N',
899                P_COMMIT_FLAG              => 'N',
900                X_RETURN_STATUS            => X_RETURN_STATUS,
901                X_MSG_COUNT                => X_MSG_COUNT,
902                X_MSG_DATA                 => X_MSG_DATA);
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_copy_actuals_pub.copy_actuals:'
907                                        ||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     END IF;
914 
915     /*populating tmp1 with PA_RESOURCE_ASSIGNMENTS*/
916 IF l_fp_cols_rec_source.x_resource_list_id <>
917    l_fp_cols_rec_target.x_resource_list_id THEN
918     DELETE FROM PA_RES_LIST_MAP_TMP1;
919     DELETE from pa_res_list_map_tmp4;
920 
921     -- Bug 3962468: Previously, the code was pulling data for target resource assignments.
922     --              Changed query to get source (l_source_id) resource assignments instead.
923 
924                         SELECT        PERSON_ID,
925                                       JOB_ID,
926                                       ORGANIZATION_ID,
927                                       EXPENDITURE_TYPE,
928                                       EVENT_TYPE,
929                                       NON_LABOR_RESOURCE,
930                                       EXPENDITURE_CATEGORY,
931                                       REVENUE_CATEGORY_CODE,
932                                       NVL(INCUR_BY_ROLE_ID, PROJECT_ROLE_ID),
933                                       NVL(INCUR_BY_RES_CLASS_CODE,RESOURCE_CLASS_CODE),
934                                       MFC_COST_TYPE_ID,
935                                       RESOURCE_CLASS_FLAG,
936                                       FC_RES_TYPE_CODE,
937                                       INVENTORY_ITEM_ID,
938                                       ITEM_CATEGORY_ID,
939                                       PERSON_TYPE_CODE,
940                                       BOM_RESOURCE_ID,
941                                       NAMED_ROLE,
942                                       INCURRED_BY_RES_FLAG,
943                                       resource_assignment_id, --TXN_SOURCE_ID,
944                                       'RES_ASSIGNMENT', --TXN_SOURCE_TYPE_CODE,
945                                       TASK_ID,
946                                       NULL, --TXN_WBS_ELEMENT_VERSION_ID,
947                                       RBS_ELEMENT_ID,
948                                       nvl(PLANNING_START_DATE,l_sysdate_trunc),
949                                       nvl(PLANNING_END_DATE,l_sysdate_trunc),
950                                       RATE_BASED_FLAG,
951                                       SUPPLIER_ID,
952 									  CBS_ELEMENT_ID--bug#16827157
953                         BULK  COLLECT
954                         INTO          l_PERSON_ID_tab,
955                                       l_JOB_ID_tab,
956                                       l_ORGANIZATION_ID_tab,
957                                       l_EXPENDITURE_TYPE_tab,
958                                       l_EVENT_TYPE_tab,
959                                       l_NON_LABOR_RESOURCE_tab,
960                                       l_EXPENDITURE_CATEGORY_tab,
961                                       l_REVENUE_CATEGORY_CODE_tab,
962                                       l_PROJECT_ROLE_ID_tab,
963                                       l_RESOURCE_CLASS_CODE_tab,
964                                       l_MFC_COST_TYPE_ID_tab,
965                                       l_RESOURCE_CLASS_FLAG_tab,
966                                       l_FC_RES_TYPE_CODE_tab,
967                                       l_INVENTORY_ITEM_ID_tab,
968                                       l_ITEM_CATEGORY_ID_tab,
969                                       l_PERSON_TYPE_CODE_tab,
970                                       l_BOM_RESOURCE_ID_tab,
971                                       l_NAMED_ROLE_tab,
972                                       l_INCURRED_BY_RES_FLAG_tab,
973                                       l_TXN_SOURCE_ID_tab,
974                                       l_TXN_SOURCE_TYPE_CODE_tab,
975                                       l_TXN_TASK_ID_tab,
976                                       l_TXN_WBS_ELEMENT_VER_ID_tab,
977                                       l_TXN_RBS_ELEMENT_ID_tab,
978                                       l_TXN_PLAN_START_DATE_tab,
979                                       l_TXN_PLAN_END_DATE_tab,
980                                       l_RATE_BASED_FLAG_tab,
981                                       l_VENDOR_ID_tab,
982 									  l_CBS_ELEMENT_ID_tab --bug#16827157
983                         FROM          PA_RESOURCE_ASSIGNMENTS ra
984                         WHERE         ra.budget_version_id = l_source_id;
985     IF l_TXN_SOURCE_ID_tab.count = 0 THEN
986        IF P_PA_DEBUG_MODE = 'Y' THEN
987            PA_DEBUG.RESET_CURR_FUNCTION;
988        END IF;
989        RETURN;
990     END IF;
991 
992     FOR j IN 1..l_TXN_SOURCE_ID_tab.count LOOP
993              l_NLR_ORGANIZATION_ID_tab(j) := null;
994              l_EVENT_CLASSIFICATION_tab(j):= null;
995              l_SYS_LINK_FUNCTION_tab(j)   := null;
996     END LOOP;
997 
998     IF P_PA_DEBUG_MODE = 'Y' THEN
999         PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
1000             P_MSG           => 'Before calling PA_RLMI_RBS_MAP_PUB.MAP_RLMI_RBS',
1001             P_MODULE_NAME   => l_module_name);
1002     END IF;
1003     -- Bug 3962468: Changed P_RESOURCE_LIST_ID parameter from
1004     -- l_fp_cols_rec_source.x_resource_list_id to
1005     -- l_fp_cols_rec_target.x_resource_list_id.
1006     PA_RLMI_RBS_MAP_PUB.MAP_RLMI_RBS (
1007          P_PROJECT_ID                   => p_project_id,
1008          P_BUDGET_VERSION_ID            => NULL,
1009          P_RESOURCE_LIST_ID             => l_fp_cols_rec_target.x_resource_list_id,
1010          P_RBS_VERSION_ID               => NULL,
1011          P_CALLING_PROCESS              => 'BUDGET_GENERATION',
1012          P_CALLING_CONTEXT              => 'PLSQL',
1013          P_PROCESS_CODE                 => 'RES_MAP',
1014          P_CALLING_MODE                 => 'PLSQL_TABLE',
1015          P_INIT_MSG_LIST_FLAG           => 'N',
1016          P_COMMIT_FLAG                  => 'N',
1017          P_TXN_SOURCE_ID_TAB            => l_TXN_SOURCE_ID_tab,
1018          P_TXN_SOURCE_TYPE_CODE_TAB     => l_TXN_SOURCE_TYPE_CODE_tab,
1019          P_PERSON_ID_TAB                => l_PERSON_ID_tab,
1020          P_JOB_ID_TAB                   => l_JOB_ID_tab,
1021          P_ORGANIZATION_ID_TAB          => l_ORGANIZATION_ID_tab,
1022          P_VENDOR_ID_TAB                => l_VENDOR_ID_tab,
1023          P_EXPENDITURE_TYPE_TAB         => l_EXPENDITURE_TYPE_tab,
1024          P_EVENT_TYPE_TAB               => l_EVENT_TYPE_tab,
1025          P_NON_LABOR_RESOURCE_TAB       => l_NON_LABOR_RESOURCE_tab,
1026          P_EXPENDITURE_CATEGORY_TAB     => l_EXPENDITURE_CATEGORY_tab,
1027          P_REVENUE_CATEGORY_CODE_TAB    =>l_REVENUE_CATEGORY_CODE_tab,
1028          P_NLR_ORGANIZATION_ID_TAB      =>l_NLR_ORGANIZATION_ID_tab,
1029          P_EVENT_CLASSIFICATION_TAB     => l_EVENT_CLASSIFICATION_tab,
1030          P_SYS_LINK_FUNCTION_TAB        => l_SYS_LINK_FUNCTION_tab,
1031          P_PROJECT_ROLE_ID_TAB          => l_PROJECT_ROLE_ID_tab,
1032          P_RESOURCE_CLASS_CODE_TAB      => l_RESOURCE_CLASS_CODE_tab,
1033          P_MFC_COST_TYPE_ID_TAB         => l_MFC_COST_TYPE_ID_tab,
1034          P_RESOURCE_CLASS_FLAG_TAB      => l_RESOURCE_CLASS_FLAG_tab,
1035          P_FC_RES_TYPE_CODE_TAB         => l_FC_RES_TYPE_CODE_tab,
1036          P_INVENTORY_ITEM_ID_TAB        => l_INVENTORY_ITEM_ID_tab,
1037          P_ITEM_CATEGORY_ID_TAB         => l_ITEM_CATEGORY_ID_tab,
1038          P_PERSON_TYPE_CODE_TAB         => l_PERSON_TYPE_CODE_tab,
1039          P_BOM_RESOURCE_ID_TAB          =>l_BOM_RESOURCE_ID_tab,
1040          P_NAMED_ROLE_TAB               =>l_NAMED_ROLE_tab,
1041          P_INCURRED_BY_RES_FLAG_TAB     =>l_INCURRED_BY_RES_FLAG_tab,
1042          P_RATE_BASED_FLAG_TAB          =>l_RATE_BASED_FLAG_tab,
1043          P_TXN_TASK_ID_TAB              =>l_TXN_TASK_ID_tab,
1044          P_TXN_WBS_ELEMENT_VER_ID_TAB   => l_TXN_WBS_ELEMENT_VER_ID_tab,
1045          P_TXN_RBS_ELEMENT_ID_TAB       => l_TXN_RBS_ELEMENT_ID_tab,
1046 		 P_CBS_ELEMENT_ID_TAB       	=> l_CBS_ELEMENT_ID_tab,  --bug#16827157
1047          P_TXN_PLAN_START_DATE_TAB      => l_TXN_PLAN_START_DATE_tab,
1048          P_TXN_PLAN_END_DATE_TAB        => l_TXN_PLAN_END_DATE_tab,
1049          X_TXN_SOURCE_ID_TAB            =>l_map_txn_source_id_tab,
1050          X_RES_LIST_MEMBER_ID_TAB       =>l_map_rlm_id_tab,
1051          X_RBS_ELEMENT_ID_TAB           =>l_map_rbs_element_id_tab,
1052          X_TXN_ACCUM_HEADER_ID_TAB      =>l_map_txn_accum_header_id_tab,
1053          X_RETURN_STATUS                => x_return_status,
1054          X_MSG_COUNT                    => x_msg_count,
1055          X_MSG_DATA                     => x_msg_data );
1056     IF P_PA_DEBUG_MODE = 'Y' THEN
1057         PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
1058             P_MSG           => 'After calling PA_RLMI_RBS_MAP_PUB.MAP_RLMI_RBS: '||
1059                                x_return_status,
1060             P_MODULE_NAME   => l_module_name);
1061     END IF;
1062 
1063     SELECT /*+ INDEX(PA_RES_LIST_MAP_TMP4,PA_RES_LIST_MAP_TMP4_N1)*/
1064            count(*) INTO l_count1
1065     FROM PA_RES_LIST_MAP_TMP4
1066     WHERE RESOURCE_LIST_MEMBER_ID IS NULL AND rownum=1;
1067     IF l_count1 > 0 THEN
1068         PA_UTILS.ADD_MESSAGE
1069             (p_app_short_name => 'PA',
1070              p_msg_name       => 'PA_INVALID_MAPPING_ERR');
1071         RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
1072     END IF;
1073     --@@
1074          IF P_PA_DEBUG_MODE = 'Y' THEN
1075          tmp_rlm_tab.delete;
1076          select distinct resource_list_member_id,txn_task_id
1077          bulk collect into tmp_rlm_tab, tmp_task_tab
1078          from PA_RES_LIST_MAP_TMP4;
1079          for i in 1..tmp_rlm_tab.count loop
1080              pa_fp_gen_amount_utils.fp_debug
1081                   (p_called_mode => p_called_mode,
1082                    p_msg         => 'after res mapping, @@rlm in tmp4:'||tmp_rlm_tab(i)
1083                                     ||'; @@task in tmp4:'||tmp_task_tab(i),
1084                    p_module_name => l_module_name,
1085                    p_log_level   => 5);
1086            begin
1087              --dbms_output.put_line('@@rlm in tmp4:'||tmp_rlm_tab(i));
1088              select 'Y' into tmp_flag from PA_RESource_list_members
1089              where resource_list_member_id = tmp_rlm_tab(i);
1090              --dbms_output.put_line('@@exist in rlm? '||tmp_flag);
1091              IF P_PA_DEBUG_MODE = 'Y' THEN
1092                 pa_fp_gen_amount_utils.fp_debug
1093                   (p_called_mode => p_called_mode,
1094                    p_msg         => 'after res mapping, @@rlm in tmp4:'||tmp_rlm_tab(i)||
1095                                     '@@exist in rlm?'||tmp_flag,
1096                    p_module_name => l_module_name,
1097                    p_log_level   => 5);
1098              END IF;
1099            exception
1100              when no_data_found then
1101              --dbms_output.put_line('@@exist in rlm? '||'N');
1102              IF P_PA_DEBUG_MODE = 'Y' THEN
1103                 pa_fp_gen_amount_utils.fp_debug
1104                   (p_called_mode => p_called_mode,
1105                    p_msg         => 'after res mapping, @@rlm in tmp4:'||tmp_rlm_tab(i)||
1106                                     '@@exist in rlm?'||'N',
1107                    p_module_name => l_module_name,
1108                    p_log_level   => 5);
1109              END IF;
1110            end;
1111          end loop;
1112          END IF;
1113     --@@
1114 
1115     /*Calling CREATE_RES_ASG API to populate missing resouce assignments for target budget version*/
1116 
1117     -- select count(*) into l_count from pa_resource_assignments where
1118     -- budget_version_id = p_budget_version_id;
1119     -- dbms_output.put_line('before calling cre res asg api: res_assign has: '||l_count);
1120 ELSE
1121 
1122     DELETE from PA_RES_LIST_MAP_TMP4;
1123     INSERT INTO PA_RES_LIST_MAP_TMP4( PERSON_ID,
1124                                       JOB_ID,
1125                                       ORGANIZATION_ID,
1126                                       VENDOR_ID,
1127                                       EXPENDITURE_TYPE,
1128                                       EVENT_TYPE,
1129                                       NON_LABOR_RESOURCE,
1130                                       EXPENDITURE_CATEGORY,
1131                                       REVENUE_CATEGORY,
1132                                       -- NON_LABOR_RESOURCE_ORG_ID,
1133                                       PROJECT_ROLE_ID,
1134                                       RESOURCE_TYPE_CODE,
1135                                       RESOURCE_CLASS_CODE,
1136                                       MFC_COST_TYPE_ID,
1137                                       RESOURCE_CLASS_FLAG,
1138                                       FC_RES_TYPE_CODE,
1139                                       --BOM_LABOR_RESOURCE_ID,
1140                                       --BOM_EQUIP_RESOURCE_ID,
1141                                       INVENTORY_ITEM_ID,
1142                                       ITEM_CATEGORY_ID,
1143                                       PERSON_TYPE_CODE,
1144                                       BOM_RESOURCE_ID,
1145                                       NAMED_ROLE,
1146                                       INCURRED_BY_RES_FLAG,
1147                                       TXN_TRACK_AS_LABOR_FLAG,
1148                                       TXN_SOURCE_ID,
1149                                       TXN_SOURCE_TYPE_CODE,
1150                                       TXN_TASK_ID,
1151                                       TXN_WBS_ELEMENT_VERSION_ID,
1152                                       TXN_RBS_ELEMENT_ID,
1153                                       TXN_PLANNING_START_DATE,
1154                                       TXN_PLANNING_END_DATE,
1155                                       TXN_SP_FIXED_DATE,
1156                                       TXN_RESOURCE_LIST_MEMBER_ID,
1157                                       TXN_RATE_BASED_FLAG,
1158                                       RESOURCE_LIST_MEMBER_ID,
1159 									  CBS_ELEMENT_ID--bug#16827157
1160                                       )
1161   SELECT                              PERSON_ID,
1162                                       JOB_ID,
1163                                       ORGANIZATION_ID,
1164                                       SUPPLIER_ID, --VENDOR_ID,
1165                                       EXPENDITURE_TYPE,
1166                                       EVENT_TYPE,
1167                                       NON_LABOR_RESOURCE,
1168                                       EXPENDITURE_CATEGORY,
1169                                       REVENUE_CATEGORY_CODE, --REVENUE_CATEGORY,
1170                                       -- NON_LABOR_RESOURCE, --NON_LABOR_RESOURCE_ORG_ID,
1171                                       NVL(INCUR_BY_ROLE_ID, PROJECT_ROLE_ID),
1172                                       RES_TYPE_CODE, --RESOURCE_TYPE_CODE,
1173                                       NVL(INCUR_BY_RES_CLASS_CODE,RESOURCE_CLASS_CODE),
1174                                       MFC_COST_TYPE_ID,
1175                                       RESOURCE_CLASS_FLAG,
1176                                       FC_RES_TYPE_CODE,
1177                                       --BOM_LABOR_RESOURCE_ID,
1178                                       --BOM_EQUIP_RESOURCE_ID,
1179                                       INVENTORY_ITEM_ID,
1180                                       ITEM_CATEGORY_ID,
1181                                       PERSON_TYPE_CODE,
1182                                       BOM_RESOURCE_ID,
1183                                       NAMED_ROLE,
1184                                       INCURRED_BY_RES_FLAG,
1185                                       TRACK_AS_LABOR_FLAG,
1186                                       resource_assignment_id, --TXN_SOURCE_ID,
1187                                       'RES_ASSIGNMENT', --TXN_SOURCE_TYPE_CODE,
1188                                       TASK_ID,
1189                                       NULL, --TXN_WBS_ELEMENT_VERSION_ID,
1190                                       RBS_ELEMENT_ID,
1191                                       nvl(PLANNING_START_DATE,l_sysdate_trunc),
1192                                       nvl(PLANNING_END_DATE,l_sysdate_trunc),
1193                                       SP_FIXED_DATE,
1194                                       RESOURCE_LIST_MEMBER_ID,
1195                                       RATE_BASED_FLAG,
1196                                       RESOURCE_LIST_MEMBER_ID,
1197 									  CBS_ELEMENT_ID--bug#16827157
1198     FROM PA_RESOURCE_ASSIGNMENTS ra
1199     WHERE ra.budget_version_id = l_source_id;
1200     IF sql%rowcount = 0 THEN
1201         IF P_PA_DEBUG_MODE = 'Y' THEN
1202             PA_DEBUG.RESET_CURR_FUNCTION;
1203         END IF;
1204         RETURN;
1205     END IF;
1206 END IF;
1207 
1208     IF P_PA_DEBUG_MODE = 'Y' THEN
1209         pa_fp_gen_amount_utils.fp_debug
1210             ( p_called_mode => p_called_mode,
1211               p_msg         => 'Before calling
1212                                pa_fp_gen_budget_amt_pub.create_res_asg',
1213               p_module_name => l_module_name,
1214               p_log_level   => 5 );
1215     END IF;
1216     PA_FP_GEN_BUDGET_AMT_PUB.CREATE_RES_ASG
1217         ( P_PROJECT_ID            => P_PROJECT_ID,
1218           P_BUDGET_VERSION_ID     => P_BUDGET_VERSION_ID,
1219           P_STRU_SHARING_CODE     => l_stru_sharing_code,
1220           P_GEN_SRC_CODE          => l_gen_src_code,
1221           P_FP_COLS_REC           => l_fp_cols_rec_target,
1222           P_WP_STRUCTURE_VER_ID   => l_wp_id,
1223           X_RETURN_STATUS         => x_return_status,
1224           X_MSG_COUNT             => x_msg_count,
1225           X_MSG_DATA              => x_msg_data );
1226 
1227     -- select count(*) into l_count1 from PA_RES_LIST_MAP_TMP4;
1228     -- dbms_output.put_line('after calling  cre res asg api, tmp4 has: '||l_count1);
1229     IF P_PA_DEBUG_MODE = 'Y' THEN
1230         pa_fp_gen_amount_utils.fp_debug
1231             ( p_called_mode => p_called_mode,
1232               p_msg         => 'Status after calling
1233                                pa_fp_gen_budget_amt_pub.create_res_asg: '
1234                                ||x_return_status,
1235               p_module_name => l_module_name,
1236               p_log_level   => 5 );
1237     END IF;
1238     IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
1239         raise PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
1240     END IF;
1241     /*
1242          IF P_PA_DEBUG_MODE = 'Y' THEN
1243          tmp_rlm_tab.delete;
1244          tmp_task_tab.delete;
1245          tmp_ra_tab.delete;
1246          select resource_list_member_id, task_id, resource_assignment_id
1247          bulk collect into tmp_rlm_tab, tmp_task_tab, tmp_ra_tab
1248          from PA_RESOURCE_ASSIGNMENTS
1249          where budget_version_id = P_BUDGET_VERSION_ID;
1250          for i in 1..tmp_ra_tab.count loop
1251                 pa_fp_gen_amount_utils.fp_debug
1252                   (p_called_mode => p_called_mode,
1253                    p_msg         => 'after create res asg, rlm in RA:'||tmp_rlm_tab(i)
1254                                     ||'; task in RA:'||tmp_task_tab(i)
1255                                     ||'; ra id in RA:'||tmp_ra_tab(i),
1256                    p_module_name => l_module_name,
1257                    p_log_level   => 5);
1258          end loop;
1259          END IF;
1260     */
1261 
1262     -- select count(*) into l_count from pa_resource_assignments where
1263     -- budget_version_id = p_budget_version_id;
1264     -- dbms_output.put_line('after calling cre res asg api: res_assign has: '||l_count);
1265     -- dbms_output.put_line('--------------');
1266 
1267   --     select count(*) into l_count from pa_resource_assignments where
1268   --          budget_version_id = p_budget_version_id;
1269   --  dbms_output.put_line('before calling upd res asg api: res assign has: '||l_count);
1270 
1271     /*Calling UPDATE_RES_ASG API to update resource_assignment_id in tmp4 for target budget version*/
1272     IF P_PA_DEBUG_MODE = 'Y' THEN
1273         pa_fp_gen_amount_utils.fp_debug
1274             ( p_called_mode => p_called_mode,
1275               p_msg         => 'Before calling
1276                                PA_FP_GEN_BUDGET_AMT_PUB.UPDATE_RES_ASG',
1277               p_module_name => l_module_name,
1278               p_log_level   => 5 );
1279     END IF;
1280     PA_FP_GEN_BUDGET_AMT_PUB.UPDATE_RES_ASG
1281         ( P_PROJECT_ID         => P_PROJECT_ID,
1282           P_BUDGET_VERSION_ID  => P_BUDGET_VERSION_ID,
1283           P_STRU_SHARING_CODE  => l_stru_sharing_code,
1284           P_GEN_SRC_CODE       => l_gen_src_code,
1285           P_FP_COLS_REC        => l_fp_cols_rec_target,
1286           P_WP_STRUCTURE_VER_ID=> l_wp_id,
1287           X_RETURN_STATUS      => x_return_status,
1288           X_MSG_COUNT          => x_msg_count,
1289           X_MSG_DATA           => x_msg_data );
1290 
1291     --select count(*) into l_count1 from PA_RES_LIST_MAP_TMP4
1292     --where TXN_RESOURCE_ASSIGNMENT_ID is not null;
1293     --hr_utility.trace('aft call update_res_asg, tmp4 with not null txn_res_asg_id '||l_count1);
1294 
1295     --  select count(*) into l_count from pa_resource_assignments where
1296     --        budget_version_id = p_budget_version_id;
1297     -- dbms_output.put_line('after calling upd res asg api: res assign has: '||l_count);
1298     IF P_PA_DEBUG_MODE = 'Y' THEN
1299         pa_fp_gen_amount_utils.fp_debug
1300             ( p_called_mode => p_called_mode,
1301               p_msg         => 'Status after calling
1302                                PA_FP_GEN_BUDGET_AMT_PUB.UPDATE_RES_ASG: '
1303                               ||x_return_status,
1304               p_module_name => l_module_name,
1305               p_log_level   => 5 );
1306     END IF;
1307     IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
1308         raise PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
1309     END IF;
1310 
1311  /*  Bug 4057932 When structure is not fully shared source res/target resource mapping will not be one on one. In this case, rate based flag update is not happening correctly This code fixes the issue */
1312 
1313         -- SQL Repository Bug 4884824; SQL ID 14903770
1314         -- Fixed Full Index Scan violation by replacing
1315         -- existing hint with leading hint.
1316         SELECT /*+ LEADING(tmp) */
1317                DISTINCT txn_resource_assignment_id
1318         BULK COLLECT
1319         INTO l_tgt_res_asg_id_tab
1320         FROM pa_res_list_map_tmp4 tmp, pa_resource_assignments ra
1321         WHERE tmp.txn_resource_assignment_id = ra.resource_assignment_id
1322           AND ra.rate_based_flag = 'Y'
1323           AND tmp.txn_rate_based_flag = 'N';
1324 
1325         IF l_tgt_res_asg_id_tab.count <> 0 THEN
1326             FORALL i IN 1..l_tgt_res_asg_id_tab.count
1327                 UPDATE pa_resource_assignments
1328                 SET rate_based_flag = 'N',
1329                     unit_of_measure = 'DOLLARS'
1330                 WHERE resource_assignment_id = l_tgt_res_asg_id_tab(i);
1331 
1332             l_tgt_res_asg_id_tab.delete;
1333 
1334         END IF;
1335 
1336     /*
1337          IF P_PA_DEBUG_MODE = 'Y' THEN
1338          tmp_rlm_tab.delete;
1339          tmp_task_tab.delete;
1340          tmp_ra_tab.delete;
1341          select distinct resource_list_member_id,txn_task_id,txn_resource_assignment_id
1342          bulk collect into tmp_rlm_tab, tmp_task_tab, tmp_ra_tab
1343          from PA_RES_LIST_MAP_TMP4;
1344          for i in 1..tmp_rlm_tab.count loop
1345              pa_fp_gen_amount_utils.fp_debug
1346                   (p_called_mode => p_called_mode,
1347                    p_msg         => 'after update res asg, @@rlm in tmp4:'||tmp_rlm_tab(i)
1348                                     ||'; @@task in tmp4:'||tmp_task_tab(i)
1349                                     ||'; @@ra id in tmp4:'||tmp_ra_tab(i),
1350                    p_module_name => l_module_name,
1351                    p_log_level   => 5);
1352          end loop;
1353          END IF;
1354     */
1355 
1356 
1357     /* Before generation of target budget lines, we need to ensure that
1358      * previously generated budget lines are deleted. If the Retain Manually
1359      * Added Plan Lines flag is 'N', then the wrapper API will have already
1360      * cleared all budget lines for us. However, if the flag is 'Y', then we
1361      * must Delete (non-actuals) budget lines for resources that are not
1362      * manually added/edited.  */
1363     IF p_retain_manual_flag = 'Y' THEN
1364         IF l_calling_context = lc_BudgetGeneration THEN
1365             DELETE FROM pa_budget_lines bl
1366             WHERE budget_version_id = p_budget_version_id
1367             AND EXISTS
1368                 ( SELECT /*+ INDEX(tmp,PA_RES_LIST_MAP_TMP4_N2)*/ 1
1369                   FROM   pa_res_list_map_tmp4 tmp
1370                   WHERE  tmp.txn_resource_assignment_id = bl.resource_assignment_id
1371                   AND    rownum = 1 );
1372         ELSIF l_calling_context = lc_ForecastGeneration THEN
1373             l_etc_start_date := PA_FP_GEN_AMOUNT_UTILS.GET_ETC_START_DATE
1374                                     ( p_budget_version_id );
1375             IF l_fp_cols_rec_target.x_time_phased_code IN ('P','G') THEN
1376                 DELETE FROM pa_budget_lines bl
1377                 WHERE budget_version_id = p_budget_version_id
1378                 AND EXISTS
1379                     ( SELECT /*+ INDEX(tmp,PA_RES_LIST_MAP_TMP4_N2)*/ 1
1380                       FROM   pa_res_list_map_tmp4 tmp
1381                       WHERE  tmp.txn_resource_assignment_id = bl.resource_assignment_id
1382                       AND    rownum = 1 )
1383                 AND bl.start_date >= l_etc_start_date;
1384              END IF;
1385         END IF;
1386     END IF; -- end budget line deletion
1387 
1388     /**Populating target budget lines by summing up the values.
1389       *unique identifiers for pa_budget_lines:
1390       *1.resource_assignment_id : corresponds to one budget_version_id;
1391       *=one planning element;  rlmID from pa_resource_assignment
1392       *2.currency
1393       *3.start_date**/
1394     --hr_utility.trace('source ver:'||l_fp_cols_rec_source.X_BUDGET_VERSION_ID);
1395     --hr_utility.trace('target ver:'||l_fp_cols_rec_target.X_BUDGET_VERSION_ID);
1396     --hr_utility.trace('source:'||l_fp_cols_rec_source.X_TIME_PHASED_CODE);
1397     --hr_utility.trace('target:'||l_fp_cols_rec_target.X_TIME_PHASED_CODE);
1398     --hr_utility.trace('source bv id:'||l_fp_cols_rec_source.X_budget_version_id);
1399     --hr_utility.trace('source rl id:'||l_fp_cols_rec_source.X_resource_list_id);
1400     --hr_utility.trace('source rl id:'||l_fp_cols_rec_source.X_time_phased_code);
1401     --hr_utility.trace('target bv id:'||l_fp_cols_rec_target.X_budget_version_id);
1402     --hr_utility.trace('target rl id:'||l_fp_cols_rec_target.X_resource_list_id);
1403     --hr_utility.trace('source rl id:'||l_fp_cols_rec_source.X_resource_list_id);
1404 
1405     SELECT NVL(UNCATEGORIZED_FLAG,'N') into l_uncategorized_flag
1406     FROM pa_resource_lists_all_bg
1407     WHERE resource_list_id = l_fp_cols_rec_target.X_resource_list_id;
1408 
1409     -- ER 4376722: Consolidated update of UOM and rate_based_flag for
1410     -- cost-based Revenue generation within the this API before any
1411     -- cursor is called. This ensures that values in the rate_base_flag
1412     -- pl/sql tables are accurate. Before this change, an identical
1413     -- update was done in MAINTAIN_BUDGET_LINES as well as in this API
1414     -- after cursors were used and generation logic was performed.
1415 
1416     IF l_fp_cols_rec_target.x_version_type = 'REVENUE' and
1417        l_rev_gen_method = 'C' THEN
1418         l_res_asg_uom_update_tab.DELETE;
1419         SELECT DISTINCT txn_resource_assignment_id
1420         BULK COLLECT INTO l_res_asg_uom_update_tab
1421         FROM pa_res_list_map_tmp4;
1422 
1423         FORALL i IN 1..l_res_asg_uom_update_tab.count
1424             UPDATE pa_resource_assignments
1425                SET unit_of_measure = 'DOLLARS',
1426                    rate_based_flag = 'N'
1427              WHERE resource_assignment_id = l_res_asg_uom_update_tab(i);
1428     END IF;
1429 
1430     /*When time phases are same, always take periodic amounts from the source*/
1431     IF l_fp_cols_rec_source.X_TIME_PHASED_CODE =
1432        l_fp_cols_rec_target.X_TIME_PHASED_CODE
1433     THEN
1434         /*API to populating from Source budget lines table to Target budget lines table*/
1435         IF P_PA_DEBUG_MODE = 'Y' THEN
1436             pa_fp_gen_amount_utils.fp_debug
1437                 ( p_called_mode => p_called_mode,
1438                   p_msg         => 'Before calling
1439                                    PA_FP_WP_GEN_BUDGET_AMT_PUB.MAINTAIN_BUDGET_LINES',
1440                   p_module_name => l_module_name,
1441                   p_log_level   => 5 );
1442         END IF;
1443         PA_FP_WP_GEN_BUDGET_AMT_PUB.MAINTAIN_BUDGET_LINES
1444             ( P_PROJECT_ID            => P_PROJECT_ID,
1445               P_SOURCE_BV_ID          => l_source_id,
1446               P_TARGET_BV_ID          => P_BUDGET_VERSION_ID,
1447               P_CALLING_CONTEXT       => l_calling_context,
1448               P_ACTUALS_THRU_DATE     => P_ACTUALS_THRU_DATE,
1449               P_RETAIN_MANUAL_FLAG    => P_RETAIN_MANUAL_FLAG,
1450               X_RETURN_STATUS         => x_return_Status,
1451               X_MSG_COUNT             => x_msg_count,
1452               X_MSG_DATA              => x_msg_data );
1453         IF P_PA_DEBUG_MODE = 'Y' THEN
1454             pa_fp_gen_amount_utils.fp_debug
1455                 ( p_called_mode => p_called_mode,
1456                   p_msg         => 'Status after calling
1457                                    PA_FP_WP_GEN_BUDGET_AMT_PUB.MAINTAIN_BUDGET_LINES: '
1458                                   ||x_return_status,
1459                   p_module_name => l_module_name,
1460                   p_log_level   => 5 );
1461         END IF;
1462         IF x_return_Status <> FND_API.G_RET_STS_SUCCESS THEN
1463             raise PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
1464         END IF;
1465 
1466         -- Bug 4686742: Logic has been added to call Calculate inside the
1467         -- MAINTAIN_BUDGET_LINE API when the Target is a Work-based Revenue
1468         -- Forecast. Hence, processing is complete, so just return.
1469 
1470         IF l_calling_context = lc_ForecastGeneration AND
1471            l_fp_cols_rec_target.x_version_type = 'REVENUE' AND
1472            l_rev_gen_method = 'T' THEN
1473             IF P_PA_DEBUG_MODE = 'Y' THEN
1474                 PA_DEBUG.RESET_CURR_FUNCTION;
1475             END IF;
1476             RETURN;
1477         END IF;
1478 
1479         /*We need to sum up the quantity and amount to pass to calculate API*/
1480         SELECT bl.resource_assignment_id,
1481                ra.rate_based_flag,
1482                bl.txn_currency_code,
1483                sum(bl.quantity),
1484                sum(bl.txn_raw_cost),
1485                sum(bl.txn_burdened_cost),
1486                sum(bl.txn_revenue),
1487                null, --bl.txn_cost_rate_override
1488                null, --bl.burden_cost_rate_override
1489                null  --bl.txn_bill_rate_override
1490         BULK COLLECT
1491         INTO  l_tgt_res_asg_id_tab,
1492               l_tgt_rate_based_flag_tab,
1493               l_txn_currency_code_tab,
1494               l_src_quantity_tab,
1495               l_src_raw_cost_tab,
1496               l_src_brdn_cost_tab,
1497               l_src_revenue_tab,
1498               l_cost_rate_override_tab,
1499               l_b_cost_rate_override_tab,
1500               l_bill_rate_override_tab
1501         FROM  pa_Budget_lines bl,
1502               pa_resource_assignments ra
1503         WHERE bl.budget_version_id = p_budget_version_id
1504               AND ra.budget_version_id = p_budget_version_id
1505               AND bl.resource_assignment_id = ra.resource_assignment_id
1506               AND EXISTS (SELECT /*+ INDEX(tmp4,PA_RES_LIST_MAP_TMP4_N2)*/ 1
1507                           FROM pa_res_list_map_tmp4 tmp4
1508                           WHERE ra.resource_assignment_id = tmp4.txn_resource_assignment_id
1509                                 AND rownum = 1)
1510               and bl.cost_rejection_code is null
1511               and bl.revenue_rejection_code is null
1512               and bl.burden_rejection_code is null
1513               and bl.other_rejection_code is null
1514               and bl.pc_cur_conv_rejection_code is null
1515               and bl.pfc_cur_conv_rejection_code is null
1516         GROUP BY bl.resource_assignment_id,
1517                  ra.rate_based_flag,
1518                  bl.txn_currency_code,
1519                  null, --bl.txn_cost_rate_override
1520                  null, --bl.burden_cost_rate_override
1521                  null; --bl.txn_bill_rate_override
1522 
1523         /*bug: 3804791 and 3831190*/
1524         IF l_fp_cols_rec_target.x_version_type = 'REVENUE' and l_rev_gen_method = 'C' THEN
1525             /* updating the spread curve id to NULL as we are going to carry over
1526                the spread from the source version to the target version even though the
1527                target version resource list is different from the source. This will happen only
1528                when the target resource list is 'None'. */
1529             IF (l_fp_cols_rec_source.X_resource_list_id <>
1530                l_fp_cols_rec_target.X_resource_list_id AND
1531                l_uncategorized_flag = 'Y') THEN
1532                 FORALL i IN 1..l_tgt_res_asg_id_tab.count
1533                     UPDATE PA_RESOURCE_ASSIGNMENTS
1534                     SET SPREAD_CURVE_ID = NULL,
1535                         SP_FIXED_DATE = NULL
1536                     WHERE resource_assignment_id = l_tgt_res_asg_id_tab(i);
1537             END IF;
1538 
1539             /* Bug Fix (Internal testing): We need to sync up the planning dates
1540              * before leaving this flow since it is not handled by the forecast
1541              * generation flow, and is normally handled by the Calculate API in
1542              * the budget generation flow. */
1543             IF p_pa_debug_mode = 'Y' THEN
1544                 pa_fp_gen_amount_utils.fp_debug
1545                     ( p_msg         => 'Before calling
1546                                         pa_fp_maintain_actual_pub.sync_up_planning_dates',
1547                       p_module_name => l_module_name,
1548                       p_log_level   => 5 );
1549             END IF;
1550             PA_FP_MAINTAIN_ACTUAL_PUB.SYNC_UP_PLANNING_DATES
1551 		( P_BUDGET_VERSION_ID => p_budget_version_id,
1552 		  X_RETURN_STATUS     => x_return_Status,
1553 		  X_MSG_COUNT         => x_msg_count,
1554 		  X_MSG_DATA          => x_msg_data );
1555 	    IF p_pa_debug_mode = 'Y' THEN
1556 		pa_fp_gen_amount_utils.fp_debug
1557 		    ( p_msg         => 'Status after calling
1558 			  	        pa_fp_maintain_actual_pub.sync_up_planning_dates'
1559 				        ||x_return_status,
1560 	 	      p_module_name => l_module_name,
1561 		      p_log_level   => 5 );
1562 	    END IF;
1563 
1564             IF P_PA_DEBUG_MODE = 'Y' THEN
1565                 PA_DEBUG.RESET_CURR_FUNCTION;
1566             END IF;
1567             RETURN;
1568         END IF; /*end bug: 3804791 and 3831190*/
1569     /**times phases or res list for source and target are different**/
1570     ELSE
1571         -- dbms_output.put_line('Time phase are different');
1572 
1573         /* Fetch data from the appropriate cursor based on the Calling Context:
1574          *   'BUDGET_GENERATION'   => use the budget_line_src_to_cal cursor.
1575          *   'FORECAST_GENERATION' => use the fcst_budget_line_src_to_cal cursor. */
1576         IF l_calling_context = lc_BudgetGeneration  THEN
1577             OPEN budget_line_src_to_cal
1578                 (l_fp_cols_rec_target.x_project_currency_code,
1579                  l_fp_cols_rec_target.x_projfunc_currency_code);
1580             FETCH budget_line_src_to_cal
1581             BULK COLLECT
1582             INTO l_tgt_res_asg_id_tab,
1583                  l_tgt_rate_based_flag_tab,
1584                  l_txn_currency_code_tab,
1585                  l_src_quantity_tab,
1586                  l_src_raw_cost_tab,
1587                  l_src_brdn_cost_tab,
1588                  l_src_revenue_tab,
1589                  l_cost_rate_override_tab,
1590                  l_b_cost_rate_override_tab,
1591                  l_bill_rate_override_tab,
1592                  l_billable_flag_tab;
1593             CLOSE budget_line_src_to_cal;
1594         ELSIF l_calling_context = lc_ForecastGeneration AND
1595               l_fp_cols_rec_source.x_time_phased_code IN ('P','G') THEN
1596             OPEN fcst_budget_line_src_to_cal
1597                  (l_fp_cols_rec_target.x_project_currency_code,
1598                   l_fp_cols_rec_target.x_projfunc_currency_code,
1599                   l_fp_cols_rec_source.x_time_phased_code);
1600             FETCH fcst_budget_line_src_to_cal
1601             BULK COLLECT
1602             INTO l_tgt_res_asg_id_tab,
1603                  l_tgt_rate_based_flag_tab,
1604                  l_txn_currency_code_tab,
1605                  l_src_quantity_tab,
1606                  l_src_raw_cost_tab,
1607                  l_src_brdn_cost_tab,
1608                  l_src_revenue_tab,
1609                  l_cost_rate_override_tab,
1610                  l_b_cost_rate_override_tab,
1611                  l_bill_rate_override_tab,
1612                  l_billable_flag_tab;
1613             CLOSE fcst_budget_line_src_to_cal;
1614 
1615             /* Get the pro-rated amounts (if any) for each resource assignment, and
1616              * add them back into the corresponding PL/SQL tables.
1617              * Note that we currently only support the case when source time phasing
1618              * is GL and target time phasing is PA (or vise versa). */
1619 
1620             IF (l_fp_cols_rec_source.X_TIME_PHASED_CODE = 'G'
1621                 AND l_fp_cols_rec_target.X_TIME_PHASED_CODE = 'P') OR
1622                (l_fp_cols_rec_source.X_TIME_PHASED_CODE = 'P'
1623                 AND l_fp_cols_rec_target.X_TIME_PHASED_CODE = 'G') THEN
1624 
1625                 FOR i in 1..l_tgt_res_asg_id_tab.count LOOP
1626                     /* Get source resource assignments that map to the current target
1627                      * resource assignment into l_mapped_src_res_asg_id_tab. */
1628                     l_mapped_src_res_asg_id_tab.delete;
1629 
1630                     SELECT /*+ INDEX(tmp,PA_RES_LIST_MAP_TMP4_N2)*/
1631                            tmp.txn_source_id BULK COLLECT INTO l_mapped_src_res_asg_id_tab
1632                       FROM pa_res_list_map_tmp4 tmp
1633                      WHERE tmp.txn_resource_assignment_id = l_tgt_res_asg_id_tab(i);
1634 
1635                     /* API to get pro-rated amounts for the first source period, which may
1636                      * be passed by during source data collection if the target's actual through
1637                      * date falls between the start and end dates of the first source period. */
1638                     IF P_PA_DEBUG_MODE = 'Y' THEN
1639                         PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG
1640                             ( p_called_mode => p_called_mode,
1641                               p_msg         => 'Before calling ' ||
1642                                                'PA_FP_GEN_PUB.PRORATE_UNALIGNED_PERIOD_AMTS',
1643                               p_module_name => l_module_name,
1644                               p_log_level   => 5 );
1645                     END IF;
1646                     PA_FP_GEN_PUB.PRORATE_UNALIGNED_PERIOD_AMTS
1647                         ( P_SRC_RES_ASG_ID_TAB    => l_mapped_src_res_asg_id_tab,
1648                           P_TARGET_RES_ASG_ID     => l_tgt_res_asg_id_tab(i),
1649                           P_CURRENCY_CODE         => l_txn_currency_code_tab(i),
1650                           P_CURRENCY_CODE_FLAG    => l_txn_currency_flag,
1651                           P_ACTUAL_THRU_DATE      => p_actuals_thru_date,
1652                           X_QUANTITY              => l_prorated_quantity,
1653                           X_TXN_RAW_COST          => l_prorated_txn_raw_cost,
1654                           X_TXN_BURDENED_COST     => l_prorated_txn_burdened_cost,
1655                           X_TXN_REVENUE           => l_prorated_txn_revenue,
1656                           X_PROJ_RAW_COST         => l_prorated_proj_raw_cost,
1657                           X_PROJ_BURDENED_COST    => l_prorated_proj_burdened_cost,
1658                           X_PROJ_REVENUE          => l_prorated_proj_revenue,
1659                           X_RETURN_STATUS         => x_return_Status,
1660                           X_MSG_COUNT             => x_msg_count,
1661                           X_MSG_DATA              => x_msg_data );
1662                     IF P_PA_DEBUG_MODE = 'Y' THEN
1663                         PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG
1664                             ( p_called_mode => p_called_mode,
1665                               p_msg         => 'Status after calling ' ||
1666                                                'PA_FP_GEN_PUB.PRORATE_UNALIGNED_PERIOD_AMTS: ' ||
1667                                                x_return_status,
1668                               p_module_name => l_module_name,
1669                               p_log_level   => 5 );
1670                     END IF;
1671                     IF x_return_Status <> FND_API.G_RET_STS_SUCCESS THEN
1672                         raise PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
1673                     END IF;
1674 
1675                     /* Add pro-rated txn amounts to the amount tables for current resource assignment */
1676                     /* For now, we do not make use of the amounts in project currency. */
1677                     l_src_quantity_tab(i)  := l_src_quantity_tab(i)  + l_prorated_quantity;
1678                     l_src_raw_cost_tab(i)  := l_src_raw_cost_tab(i)  + l_prorated_txn_raw_cost;
1679                     l_src_brdn_cost_tab(i) := l_src_brdn_cost_tab(i) + l_prorated_txn_burdened_cost;
1680                     l_src_revenue_tab(i)   := l_src_revenue_tab(i)   + l_prorated_txn_revenue;
1681                 END LOOP;
1682             END IF; -- timephase PA/GL check
1683 
1684         ELSIF l_calling_context = lc_ForecastGeneration AND
1685               l_fp_cols_rec_source.x_time_phased_code = 'N' THEN
1686             OPEN fcst_bdgt_line_src_to_cal_none
1687                  (l_fp_cols_rec_target.x_project_currency_code,
1688                   l_fp_cols_rec_target.x_projfunc_currency_code,
1689                   l_fp_cols_rec_source.x_time_phased_code);
1690             FETCH fcst_bdgt_line_src_to_cal_none
1691             BULK COLLECT
1692             INTO l_tgt_res_asg_id_tab,
1693                  l_tgt_rate_based_flag_tab,
1694                  l_txn_currency_code_tab,
1695                  l_src_quantity_tab,
1696                  l_src_raw_cost_tab,
1697                  l_src_brdn_cost_tab,
1698                  l_src_revenue_tab,
1699                  l_cost_rate_override_tab,
1700                  l_b_cost_rate_override_tab,
1701                  l_bill_rate_override_tab,
1702                  l_billable_flag_tab;
1703             CLOSE fcst_bdgt_line_src_to_cal_none;
1704         END IF; -- context-based data fetching
1705 
1706         -- Bug 3968616: Moved retain manually-edited lines logic from outside the logic
1707         -- block handling pl/sql data population to inside the Else block so that it is
1708         -- only executed when source and target planning options do not match.
1709         -- Update 12/2/04: We have changed the retain lines logic so that mapping to
1710         -- manually-edited resources are removed from the tmp4 table. As a result, the
1711         -- previous logic mentioned above has been removed.
1712 
1713         -- Old budget line deletion logic was here.
1714 
1715         /*Please refer to document: How to derive the rate*/
1716         l_source_version_type := l_fp_cols_rec_source.x_version_type;
1717         l_target_version_type := l_fp_cols_rec_target.x_version_type;
1718 
1719     /* ER 4376722:
1720      * When the Target is a Revenue-only Budget:
1721      * A) Do not generate quantity or amounts for non-billable tasks.
1722      * When the Target is a Revenue-only Forecast:
1723      * B) Do not generate quantity or amounts for non-rate-based
1724      *    resources of non-billable tasks.
1725      * C) Generate quantity but not amounts for rate-based resources
1726      *    of non-billable tasks.
1727      *
1728      * The simple algorithm to do (A) and (B) is as follows:
1729      * 0. Clear out any data in the _tmp_ tables.
1730      * 1. Copy records into _tmp_ tables for
1731      * a) billable tasks when the context is Budget Generation
1732      * b) billable tasks when the context is Forecast Generation
1733      * c) rate-based resources of non-billable tasks when the
1734      *    context is Forecast Generation
1735      * 2. Copy records from _tmp_ tables back to non-temporary tables.
1736      *
1737      * The result is that, afterwards, we do not process non-billable
1738      * task records in the Budget Generation context, and we do not
1739      * process non-rate-based resources of non-billable tasks in the
1740      * Forecast Generation Context. Hence, quantity and amounts for
1741      * those resources will not be generated.
1742      *
1743      * Note that case (C) is handled later at the end of the
1744      * Forecast Generation logic.
1745      **/
1746 
1747     IF l_target_version_type = 'REVENUE' THEN
1748 
1749         -- 0. Clear out any data in the _tmp_ tables.
1750         l_tmp_tgt_res_asg_id_tab.delete;
1751         l_tmp_tgt_rate_based_flag_tab.delete;
1752         l_tmp_txn_currency_code_tab.delete;
1753         l_tmp_src_quantity_tab.delete;
1754         l_tmp_src_raw_cost_tab.delete;
1755         l_tmp_src_brdn_cost_tab.delete;
1756         l_tmp_src_revenue_tab.delete;
1757         l_tmp_cost_rate_override_tab.delete;
1758         l_tmp_b_cost_rate_override_tab.delete;
1759         l_tmp_bill_rate_override_tab.delete;
1760         l_tmp_billable_flag_tab.delete;
1761 
1762         -- 1. Copy records into _tmp_ tables for
1763         -- a) billable tasks when the context is Budget Generation
1764         -- b) billable tasks when the context is Forecast Generation
1765         -- c) rate-based resources of non-billable tasks when the
1766         --    context is Forecast Generation
1767         l_tmp_index := 0;
1768         FOR i IN 1..l_tgt_res_asg_id_tab.count LOOP
1769             IF ( l_calling_context = lc_BudgetGeneration AND
1770                  l_billable_flag_tab(i) = 'Y' ) OR
1771                ( l_calling_context = lc_ForecastGeneration AND
1772                  ( l_billable_flag_tab(i) = 'Y' OR
1773                  ( l_billable_flag_tab(i) = 'N' AND l_tgt_rate_based_flag_tab(i) = 'Y' ))) THEN
1774 
1775                 l_tmp_tgt_res_asg_id_tab.extend;
1776                 l_tmp_tgt_rate_based_flag_tab.extend;
1777                 l_tmp_txn_currency_code_tab.extend;
1778                 l_tmp_src_quantity_tab.extend;
1779                 l_tmp_src_raw_cost_tab.extend;
1780                 l_tmp_src_brdn_cost_tab.extend;
1781                 l_tmp_src_revenue_tab.extend;
1782                 l_tmp_cost_rate_override_tab.extend;
1783                 l_tmp_b_cost_rate_override_tab.extend;
1784                 l_tmp_bill_rate_override_tab.extend;
1785                 l_tmp_billable_flag_tab.extend;
1786 
1787                 l_tmp_index := l_tmp_index + 1;
1788                 l_tmp_tgt_res_asg_id_tab(l_tmp_index)       := l_tgt_res_asg_id_tab(i);
1789                 l_tmp_tgt_rate_based_flag_tab(l_tmp_index)  := l_tgt_rate_based_flag_tab(i);
1790                 l_tmp_txn_currency_code_tab(l_tmp_index)    := l_txn_currency_code_tab(i);
1791                 l_tmp_src_quantity_tab(l_tmp_index)         := l_src_quantity_tab(i);
1792                 l_tmp_src_raw_cost_tab(l_tmp_index)         := l_src_raw_cost_tab(i);
1793                 l_tmp_src_brdn_cost_tab(l_tmp_index)        := l_src_brdn_cost_tab(i);
1794                 l_tmp_src_revenue_tab(l_tmp_index)          := l_src_revenue_tab(i);
1795                 l_tmp_cost_rate_override_tab(l_tmp_index)   := l_cost_rate_override_tab(i);
1796                 l_tmp_b_cost_rate_override_tab(l_tmp_index) := l_b_cost_rate_override_tab(i);
1797                 l_tmp_bill_rate_override_tab(l_tmp_index)   := l_bill_rate_override_tab(i);
1798                 l_tmp_billable_flag_tab(l_tmp_index)        := l_billable_flag_tab(i);
1799             END IF;
1800         END LOOP;
1801 
1802         -- 2. Copy records from _tmp_ tables back to non-temporary tables.
1803         l_tgt_res_asg_id_tab       := l_tmp_tgt_res_asg_id_tab;
1804         l_tgt_rate_based_flag_tab  := l_tmp_tgt_rate_based_flag_tab;
1805         l_txn_currency_code_tab    := l_tmp_txn_currency_code_tab;
1806         l_src_quantity_tab         := l_tmp_src_quantity_tab;
1807         l_src_raw_cost_tab         := l_tmp_src_raw_cost_tab;
1808         l_src_brdn_cost_tab        := l_tmp_src_brdn_cost_tab;
1809         l_src_revenue_tab          := l_tmp_src_revenue_tab;
1810         l_cost_rate_override_tab   := l_tmp_cost_rate_override_tab;
1811         l_b_cost_rate_override_tab := l_tmp_b_cost_rate_override_tab;
1812         l_bill_rate_override_tab   := l_tmp_bill_rate_override_tab;
1813         l_billable_flag_tab        := l_tmp_billable_flag_tab;
1814 
1815     END IF; -- ER 4376722 billability logic for REVENUE versions
1816 
1817     l_remove_records_flag := 'N';
1818     -- Initialize l_remove_record_flag_tab
1819     FOR i in 1..l_tgt_res_asg_id_tab.count LOOP
1820         l_remove_record_flag_tab(i) := 'N';
1821     END LOOP;
1822 
1823     /* We split up the generation logic here based on whether the Calling Context
1824      * indicates we are performing budget generation or forecast generation. */
1825     IF l_calling_context = lc_BudgetGeneration THEN
1826         IF l_source_version_type = 'COST' AND l_target_version_type = 'COST' THEN
1827             FOR i in 1..l_tgt_res_asg_id_tab.count LOOP
1828                 IF l_tgt_rate_based_flag_tab(i) = 'N' AND
1829                    NOT( l_wp_track_cost_flag = 'N' AND
1830                         l_gen_src_code = lc_WorkPlanSrcCode ) THEN
1831                     l_src_quantity_tab(i):= l_src_raw_cost_tab(i);
1832                 END IF;
1833                 IF l_src_quantity_tab(i) <> 0 THEN
1834                     l_cost_rate_override_tab(i) := l_src_raw_cost_tab(i) / l_src_quantity_tab(i);
1835                     l_b_cost_rate_override_tab(i) := l_src_brdn_cost_tab(i) / l_src_quantity_tab(i);
1836                     IF l_tgt_rate_based_flag_tab(i) = 'N' THEN
1837                         l_cost_rate_override_tab(i) := 1;
1838                     END IF;
1839                 END IF;
1840             END LOOP;
1841         ELSIF l_source_version_type = 'COST' AND
1842               l_target_version_type = 'REVENUE' AND
1843               l_rev_gen_method = 'T' THEN
1844             FOR i in 1..l_tgt_res_asg_id_tab.count LOOP
1845                 IF l_tgt_rate_based_flag_tab(i) = 'N' AND
1846                    NOT( l_wp_track_cost_flag = 'N' AND
1847                         l_gen_src_code = lc_WorkPlanSrcCode ) THEN
1848                     l_src_quantity_tab(i):= l_src_raw_cost_tab(i); --???
1849 
1850                     -- Bug 4568011: Commented out revenue and bill rate override
1851                     -- pl/sql table assignments so that the Calculate API will
1852                     -- compute revenue amounts.
1853                     -- l_src_revenue_tab(i) := l_src_raw_cost_tab(i);
1854                     -- l_bill_rate_override_tab(i) := 1;
1855                 END IF;
1856                 IF l_src_quantity_tab(i) <> 0 THEN
1857                     l_cost_rate_override_tab(i) := l_src_raw_cost_tab(i) / l_src_quantity_tab(i);
1858                     l_b_cost_rate_override_tab(i) := l_src_brdn_cost_tab(i) / l_src_quantity_tab(i);
1859                     IF l_tgt_rate_based_flag_tab(i) = 'N' THEN
1860                         l_cost_rate_override_tab(i) := 1;
1861                     END IF;
1862                 END IF;
1863                 l_src_raw_cost_tab(i) := NULL;
1864                 l_src_brdn_cost_tab(i) := NULL;
1865             END LOOP;
1866         ELSIF l_source_version_type = 'COST' AND
1867               l_target_version_type = 'REVENUE' AND
1868               l_rev_gen_method = 'C' THEN
1869             FOR i in 1..l_tgt_res_asg_id_tab.count LOOP
1870                 l_src_quantity_tab(i):= l_src_brdn_cost_tab(i);
1871                 l_src_revenue_tab(i) := l_src_brdn_cost_tab(i);
1872                 l_src_raw_cost_tab(i) := NULL;
1873                 l_src_brdn_cost_tab(i) := NULL;
1874                 l_bill_rate_override_tab(i) := 1;
1875             END LOOP;
1876         ELSIF l_source_version_type = 'COST' AND
1877               l_target_version_type = 'REVENUE' AND
1878               l_rev_gen_method = 'E' THEN
1879             /*Revenue is only based on billing events, which is handled seperately*/
1880             l_dummy := 1;
1881             IF P_PA_DEBUG_MODE = 'Y' THEN
1882                 PA_DEBUG.RESET_CURR_FUNCTION;
1883             END IF;
1884             RETURN;
1885         ELSIF l_source_version_type = 'COST' AND
1886               l_target_version_type = 'ALL' AND
1887               l_rev_gen_method = 'T' THEN
1888             FOR i in 1..l_tgt_res_asg_id_tab.count LOOP
1889                 IF l_tgt_rate_based_flag_tab(i) = 'N' AND
1890                    NOT( l_wp_track_cost_flag = 'N' AND
1891                         l_gen_src_code = lc_WorkPlanSrcCode ) THEN
1892                     l_dummy := 1; --l_src_quantity_tab(i):= l_src_raw_cost_tab(i);
1893                 END IF;
1894                 IF l_src_quantity_tab(i) <> 0 THEN
1895                     l_cost_rate_override_tab(i) := l_src_raw_cost_tab(i) / l_src_quantity_tab(i);
1896                     l_b_cost_rate_override_tab(i) := l_src_brdn_cost_tab(i) / l_src_quantity_tab(i);
1897                     IF l_tgt_rate_based_flag_tab(i) = 'N' THEN
1898                         l_cost_rate_override_tab(i) := 1;
1899                     END IF;
1900                 END IF;
1901             END LOOP;
1902         ELSIF l_source_version_type = 'COST' AND
1903               l_target_version_type = 'ALL' AND
1904               l_rev_gen_method = 'C' THEN
1905             FOR i in 1..l_tgt_res_asg_id_tab.count LOOP
1906                 IF l_tgt_rate_based_flag_tab(i) = 'N' AND
1907                    NOT( l_wp_track_cost_flag = 'N' AND
1908                         l_gen_src_code = lc_WorkPlanSrcCode ) THEN
1909                     l_src_quantity_tab(i):= l_src_raw_cost_tab(i);
1910                 END IF;
1911                 IF l_src_quantity_tab(i) <> 0 THEN
1912                     l_cost_rate_override_tab(i) := l_src_raw_cost_tab(i) / l_src_quantity_tab(i);
1913                     l_b_cost_rate_override_tab(i) := l_src_brdn_cost_tab(i) / l_src_quantity_tab(i);
1914                     IF l_tgt_rate_based_flag_tab(i) = 'N' THEN
1915                         l_cost_rate_override_tab(i) := 1;
1916                     END IF;
1917                 END IF;
1918             END LOOP;
1919         ELSIF l_source_version_type = 'COST' AND
1920               l_target_version_type = 'ALL' AND
1921               l_rev_gen_method = 'E' THEN
1922             FOR i in 1..l_tgt_res_asg_id_tab.count LOOP
1923                 IF l_tgt_rate_based_flag_tab(i) = 'N' AND
1924                    NOT( l_wp_track_cost_flag = 'N' AND
1925                         l_gen_src_code = lc_WorkPlanSrcCode ) THEN
1926                     l_src_quantity_tab(i):= l_src_raw_cost_tab(i);
1927                 END IF;
1928                 IF l_src_quantity_tab(i) <> 0 THEN
1929                     l_cost_rate_override_tab(i) := l_src_raw_cost_tab(i) / l_src_quantity_tab(i);
1930                     l_b_cost_rate_override_tab(i) := l_src_brdn_cost_tab(i) / l_src_quantity_tab(i);
1931                     IF l_tgt_rate_based_flag_tab(i) = 'N' THEN
1932                         l_cost_rate_override_tab(i) := 1;
1933                     END IF;
1934                 END IF;
1935             END LOOP;
1936             /*Revenue is only based on billing events, which is handled seperately*/
1937 ---============================================================================
1938         ELSIF l_source_version_type = 'REVENUE' AND
1939               l_target_version_type = 'COST' THEN
1940             FOR i in 1..l_tgt_res_asg_id_tab.count LOOP
1941                 IF  l_tgt_rate_based_flag_tab(i) = 'N' THEN
1942                     l_src_quantity_tab(i):= l_src_revenue_tab(i); --???
1943                 END IF;
1944                 l_src_revenue_tab(i) := NULL;
1945             END LOOP;
1946         ELSIF l_source_version_type = 'REVENUE' AND
1947               l_target_version_type = 'REVENUE' AND
1948               l_rev_gen_method = 'T' THEN
1949             FOR i in 1..l_tgt_res_asg_id_tab.count LOOP
1950                 IF  l_tgt_rate_based_flag_tab(i) = 'N' THEN
1951                     l_src_quantity_tab(i):= l_src_revenue_tab(i);
1952                 END IF;
1953                 IF l_src_quantity_tab(i) <> 0 THEN
1954                     l_bill_rate_override_tab(i) := l_src_revenue_tab(i) / l_src_quantity_tab(i);
1955                 END IF;
1956             END LOOP;
1957         ELSIF l_source_version_type = 'REVENUE' AND
1958               l_target_version_type = 'REVENUE' AND
1959               l_rev_gen_method = 'C' THEN
1960             /*This is invalid operation, had been handled at the beginning of process*/
1961             l_dummy := 1;
1962             IF P_PA_DEBUG_MODE = 'Y' THEN
1963                 PA_DEBUG.RESET_CURR_FUNCTION;
1964             END IF;
1965             RETURN;
1966         ELSIF l_source_version_type = 'REVENUE' AND
1967               l_target_version_type = 'REVENUE' AND
1968               l_rev_gen_method = 'E' THEN
1969             /*Revenue is only based on billing events, which is handled seperately*/
1970             l_dummy := 1;
1971             IF P_PA_DEBUG_MODE = 'Y' THEN
1972                 PA_DEBUG.RESET_CURR_FUNCTION;
1973             END IF;
1974             RETURN;
1975         ELSIF l_source_version_type = 'REVENUE' AND
1976               l_target_version_type = 'ALL' AND
1977               l_rev_gen_method = 'T' THEN
1978             FOR i in 1..l_tgt_res_asg_id_tab.count LOOP
1979                 IF  l_tgt_rate_based_flag_tab(i) = 'N' THEN
1980                     l_src_quantity_tab(i):= l_src_revenue_tab(i);
1981                 END IF;
1982                 IF l_src_quantity_tab(i) <> 0 THEN
1983                     l_bill_rate_override_tab(i) := l_src_revenue_tab(i)/l_src_quantity_tab(i);
1984                 END IF;
1985             END LOOP;
1986         ELSIF l_source_version_type = 'REVENUE' AND
1987               l_target_version_type = 'ALL' AND
1988               l_rev_gen_method = 'C' THEN
1989             /*This is invalid operation, had been handled at the beginning of process*/
1990             l_dummy := 1;
1991             IF P_PA_DEBUG_MODE = 'Y' THEN
1992                 PA_DEBUG.RESET_CURR_FUNCTION;
1993             END IF;
1994             RETURN;
1995         ELSIF l_source_version_type = 'REVENUE' AND
1996               l_target_version_type = 'ALL' AND
1997               l_rev_gen_method = 'E' THEN
1998             FOR i in 1..l_tgt_res_asg_id_tab.count LOOP
1999                 IF  l_tgt_rate_based_flag_tab(i) = 'N' THEN
2000                     l_src_quantity_tab(i):= l_src_revenue_tab(i); --???
2001                 END IF;
2002             l_src_revenue_tab(i) := NULL;
2003             END LOOP;
2004             /*Revenue is only based on billing events, which is handled seperately*/
2005 --============================================================================
2006         ELSIF l_source_version_type = 'ALL' AND l_target_version_type = 'COST' THEN
2007             FOR i in 1..l_tgt_res_asg_id_tab.count LOOP
2008                 IF l_tgt_rate_based_flag_tab(i) = 'N' THEN
2009                     l_src_quantity_tab(i):= l_src_raw_cost_tab(i);
2010                 END IF;
2011                 l_src_revenue_tab(i) := NULL;
2012                 IF l_src_quantity_tab(i) <> 0 THEN
2013                     l_cost_rate_override_tab(i) := l_src_raw_cost_tab(i) / l_src_quantity_tab(i);
2014                     l_b_cost_rate_override_tab(i) := l_src_brdn_cost_tab(i) / l_src_quantity_tab(i);
2015                 ELSE -- Added for IPM
2016                     l_remove_record_flag_tab(i) := 'Y';
2017                     l_remove_records_flag := 'Y';
2018                 END IF;
2019             END LOOP;
2020         ELSIF l_source_version_type = 'ALL' AND
2021               l_target_version_type = 'REVENUE' AND
2022               l_rev_gen_method = 'T' THEN
2023             FOR i in 1..l_tgt_res_asg_id_tab.count LOOP
2024 
2025                 -- Bug 4568011: When Source revenue amounts exist, the
2026                 -- Calculate API should honor those amounts instead of
2027                 -- computing revenue amounts. For this to happen, the
2028                 -- REVENUE_BILL_RATE column of the PA_FP_GEN_RATE_TMP
2029                 -- table needs to be populated with the bill rate override.
2030                 -- Likewise, when Source revenue amounts do not exist,
2031                 -- the Calculate API should compute revenue amounts. In
2032                 -- this case, the bill rate override should be NULL.
2033 
2034                 IF l_tgt_rate_based_flag_tab(i) = 'N' THEN
2035                     IF l_src_revenue_tab(i) IS NOT NULL THEN
2036                         l_src_quantity_tab(i):= l_src_revenue_tab(i);
2037                     ELSE
2038                         l_src_quantity_tab(i):= l_src_raw_cost_tab(i);
2039                     END IF;
2040                 END IF;
2041                 IF l_src_quantity_tab(i) <> 0 THEN
2042                     l_cost_rate_override_tab(i) := l_src_raw_cost_tab(i) / l_src_quantity_tab(i);
2043                     l_b_cost_rate_override_tab(i) := l_src_brdn_cost_tab(i) / l_src_quantity_tab(i);
2044                     l_bill_rate_override_tab(i) := l_src_revenue_tab(i) / l_src_quantity_tab(i);
2045                 ELSE -- Added for IPM
2046                     l_remove_record_flag_tab(i) := 'Y';
2047                     l_remove_records_flag := 'Y';
2048                 END IF;
2049                 l_src_raw_cost_tab(i) := NULL;
2050                 l_src_brdn_cost_tab(i) := NULL;
2051             END LOOP;
2052        ELSIF l_source_version_type = 'ALL' AND
2053               l_target_version_type = 'REVENUE' AND
2054               l_rev_gen_method = 'C' THEN
2055             FOR i in 1..l_tgt_res_asg_id_tab.count LOOP
2056                 l_src_quantity_tab(i):= l_src_brdn_cost_tab(i);
2057                 l_src_revenue_tab(i) := l_src_brdn_cost_tab(i);
2058                 l_src_raw_cost_tab(i) := NULL;
2059                 l_src_brdn_cost_tab(i) := NULL;
2060                 l_bill_rate_override_tab(i) := 1;
2061                 -- Added for IPM
2062                 IF nvl(l_src_quantity_tab(i),0) = 0 THEN
2063                     l_remove_record_flag_tab(i) := 'Y';
2064                     l_remove_records_flag := 'Y';
2065                 END IF;
2066             END LOOP;
2067         ELSIF l_source_version_type = 'ALL' AND
2068               l_target_version_type = 'REVENUE' AND
2069               l_rev_gen_method = 'E' THEN
2070             /*Revenue is only based on billing events, which is handled seperately*/
2071             l_dummy := 1;
2072             IF P_PA_DEBUG_MODE = 'Y' THEN
2073                 PA_DEBUG.RESET_CURR_FUNCTION;
2074             END IF;
2075             RETURN;
2076         ELSIF l_source_version_type = 'ALL' AND
2077               l_target_version_type = 'ALL' AND
2078               l_rev_gen_method = 'T' THEN
2079             FOR i in 1..l_tgt_res_asg_id_tab.count LOOP
2080                 IF l_tgt_rate_based_flag_tab(i) = 'N' THEN
2081                     -- Modified for IPM
2082                     IF nvl(l_src_raw_cost_tab(i),0) = 0 THEN
2083                         -- Source is a revenue-only txn (qty = rev).
2084                         l_src_quantity_tab(i):= l_src_revenue_tab(i);
2085                     ELSE
2086                         l_src_quantity_tab(i):= l_src_raw_cost_tab(i);
2087                     END IF;
2088                 END IF;
2089                 IF l_src_quantity_tab(i) <> 0 THEN
2090                     l_cost_rate_override_tab(i) := l_src_raw_cost_tab(i) / l_src_quantity_tab(i);
2091                     l_b_cost_rate_override_tab(i) := l_src_brdn_cost_tab(i) / l_src_quantity_tab(i);
2092                     l_bill_rate_override_tab(i) := l_src_revenue_tab(i) / l_src_quantity_tab(i);
2093                 ELSE -- Added for IPM
2094                     l_remove_record_flag_tab(i) := 'Y';
2095                     l_remove_records_flag := 'Y';
2096                 END IF;
2097              END LOOP;
2098         ELSIF l_source_version_type = 'ALL' AND
2099               l_target_version_type = 'ALL' AND
2100               l_rev_gen_method = 'C' THEN
2101             FOR i in 1..l_tgt_res_asg_id_tab.count LOOP
2102                 IF l_tgt_rate_based_flag_tab(i) = 'N' THEN
2103                     -- Modified for IPM
2104                     IF nvl(l_src_raw_cost_tab(i),0) = 0 THEN
2105                         -- Source is a revenue-only txn (qty = rev).
2106                         -- Do not generate cost from a revenue amount.
2107                         -- Nulling out qty will cause the record to be skipped.
2108                         l_src_quantity_tab(i):= null;
2109                     ELSE
2110                         l_src_quantity_tab(i):= l_src_raw_cost_tab(i);
2111                     END IF;
2112                 END IF;
2113                 l_src_revenue_tab(i) := l_src_brdn_cost_tab(i);
2114                 IF l_src_quantity_tab(i) <> 0 THEN
2115                     l_cost_rate_override_tab(i) := l_src_raw_cost_tab(i) / l_src_quantity_tab(i);
2116                     l_b_cost_rate_override_tab(i) := l_src_brdn_cost_tab(i) / l_src_quantity_tab(i);
2117                     l_bill_rate_override_tab(i) := l_src_revenue_tab(i) / l_src_quantity_tab(i);
2118                 ELSE -- Added for IPM
2119                     l_remove_record_flag_tab(i) := 'Y';
2120                     l_remove_records_flag := 'Y';
2121                 END IF;
2122             END LOOP;
2123         ELSIF l_source_version_type = 'ALL' AND
2124               l_target_version_type = 'ALL' AND
2125               l_rev_gen_method = 'E' THEN
2126             FOR i in 1..l_tgt_res_asg_id_tab.count LOOP
2127                 IF  l_tgt_rate_based_flag_tab(i) = 'N' THEN
2128                     -- Modified for IPM
2129                     IF nvl(l_src_raw_cost_tab(i),0) = 0 THEN
2130                         -- Source is a revenue-only txn (qty = rev).
2131                         -- Do not double count the revenue amount.
2132                         -- Nulling out qty will cause the record to be skipped.
2133                         l_src_quantity_tab(i):= null;
2134                     ELSE
2135                         l_src_quantity_tab(i):= l_src_raw_cost_tab(i);
2136                     END IF;
2137                 END IF;
2138                 IF l_src_quantity_tab(i) <> 0 THEN
2139                     l_cost_rate_override_tab(i) := l_src_raw_cost_tab(i) / l_src_quantity_tab(i);
2140                     l_b_cost_rate_override_tab(i) := l_src_brdn_cost_tab(i) / l_src_quantity_tab(i);
2141                 ELSE -- Added for IPM
2142                     l_remove_record_flag_tab(i) := 'Y';
2143                     l_remove_records_flag := 'Y';
2144                 END IF;
2145                 /* When generation is Event-based, we get revenues from the billing events. If we
2146                  * include revenues from the source, revenues will be double counted. Therefore,
2147                  * we set source revenue amounts to NULL so calculate API doesn't include. */
2148                 l_src_revenue_tab(i) := NULL;
2149             END LOOP;
2150             /*Revenue is only based on billing events, which is handled seperately.*/
2151         END IF;
2152         /*End refer to document: How to derive the rate*/
2153 
2154     /* Revenue forecast generation logic */
2155     ELSIF l_calling_context = lc_ForecastGeneration THEN
2156         IF l_source_version_type = 'COST' AND
2157            l_target_version_type = 'REVENUE' AND
2158            l_rev_gen_method = 'T' THEN
2159             FOR i in 1..l_tgt_res_asg_id_tab.count LOOP
2160                 IF l_tgt_rate_based_flag_tab(i) = 'N' THEN
2161                     /* currently using raw cost instead of burden cost to mimic budget generation logic */
2162                     l_src_quantity_tab(i)  := l_src_raw_cost_tab(i); --???
2163 
2164                     -- Bug 4568011: Commented out revenue and bill rate override
2165                     -- pl/sql table assignments so that the Calculate API will
2166                     -- compute revenue amounts.
2167                     -- l_src_revenue_tab(i)   := l_src_raw_cost_tab(i);
2168                     -- l_bill_rate_override_tab(i) := 1;
2169                 END IF;
2170                 IF l_src_quantity_tab(i) <> 0 THEN
2171                     l_cost_rate_override_tab(i) := l_src_raw_cost_tab(i) / l_src_quantity_tab(i);
2172                     l_b_cost_rate_override_tab(i) := l_src_brdn_cost_tab(i) / l_src_quantity_tab(i);
2173                 END IF;
2174                 l_src_raw_cost_tab(i)  := NULL;
2175                 l_src_brdn_cost_tab(i) := NULL;
2176             END LOOP;
2177         ELSIF l_source_version_type = 'COST' AND
2178               l_target_version_type = 'REVENUE' AND
2179               l_rev_gen_method = 'C' THEN
2180             FOR i in 1..l_tgt_res_asg_id_tab.count LOOP
2181                 l_src_quantity_tab(i)  := l_src_brdn_cost_tab(i);
2182                 l_src_revenue_tab(i)   := l_src_brdn_cost_tab(i);
2183                 l_src_raw_cost_tab(i)  := NULL;
2184                 l_src_brdn_cost_tab(i) := NULL;
2185                 l_bill_rate_override_tab(i) := 1;
2186             END LOOP;
2187         ELSIF l_source_version_type = 'COST' AND
2188               l_target_version_type = 'REVENUE' AND
2189               l_rev_gen_method = 'E' THEN
2190             /* This stub is here for completeness in the flow of the generation logic.
2191              * We do nothing here because the wrapper API does not call this procedure
2192              * in the case of Event-based revenue generation. Hence, we should never
2193              * arrive here in a valid code path. */
2194             l_dummy := 1;
2195         ELSIF l_source_version_type = 'ALL' AND
2196               l_target_version_type = 'REVENUE' AND
2197               l_rev_gen_method = 'T' THEN
2198             FOR i in 1..l_tgt_res_asg_id_tab.count LOOP
2199 
2200                 -- Bug 4568011: When Source revenue amounts exist, the
2201                 -- Calculate API should honor those amounts instead of
2202                 -- computing revenue amounts. For this to happen, the
2203                 -- REVENUE_BILL_RATE column of the PA_FP_GEN_RATE_TMP
2204                 -- table needs to be populated with the bill rate override.
2205                 -- Likewise, when Source revenue amounts do not exist,
2206                 -- the Calculate API should compute revenue amounts. In
2207                 -- this case, the bill rate override should be NULL.
2208 
2209                 IF l_tgt_rate_based_flag_tab(i) = 'N' THEN
2210                     IF l_src_revenue_tab(i) IS NOT NULL THEN
2211                         l_src_quantity_tab(i):= l_src_revenue_tab(i);
2212                     ELSE
2213                         l_src_quantity_tab(i):= l_src_raw_cost_tab(i);
2214                     END IF;
2215                 END IF;
2216                 IF l_src_quantity_tab(i) <> 0 THEN
2217                     l_cost_rate_override_tab(i) := l_src_raw_cost_tab(i) / l_src_quantity_tab(i);
2218                     l_b_cost_rate_override_tab(i) := l_src_brdn_cost_tab(i) / l_src_quantity_tab(i);
2219                     l_bill_rate_override_tab(i) := l_src_revenue_tab(i) / l_src_quantity_tab(i);
2220                 ELSE -- Added for IPM
2221                     l_remove_record_flag_tab(i) := 'Y';
2222                     l_remove_records_flag := 'Y';
2223                 END IF;
2224                 l_src_raw_cost_tab(i)  := NULL;
2225                 l_src_brdn_cost_tab(i) := NULL;
2226             END LOOP;
2227         ELSIF l_source_version_type = 'ALL' AND
2228               l_target_version_type = 'REVENUE' AND
2229               l_rev_gen_method = 'C' THEN
2230             FOR i in 1..l_tgt_res_asg_id_tab.count LOOP
2231                 l_src_quantity_tab(i)  := l_src_brdn_cost_tab(i);
2232                 l_src_revenue_tab(i)   := l_src_brdn_cost_tab(i);
2233                 l_src_raw_cost_tab(i)  := NULL;
2234                 l_src_brdn_cost_tab(i) := NULL;
2235                 l_bill_rate_override_tab(i) := 1;
2236                 -- Added for IPM
2237                 IF nvl(l_src_quantity_tab(i),0) = 0 THEN
2238                     l_remove_record_flag_tab(i) := 'Y';
2239                     l_remove_records_flag := 'Y';
2240                 END IF;
2241             END LOOP;
2242         ELSIF l_source_version_type = 'ALL' AND
2243               l_target_version_type = 'REVENUE' AND
2244               l_rev_gen_method = 'E' THEN
2245             /* This stub is here for completeness in the flow of the generation logic.
2246              * We do nothing here because the wrapper API does not call this procedure
2247              * in the case of Event-based revenue generation. Hence, we should never
2248              * arrive here in a valid code path. */
2249             l_dummy := 1;
2250         END IF; -- revenue forecast logic
2251 
2252     END IF; -- context-based generation logic
2253 
2254 
2255     /* ER 4376722: When the Target is a Revenue-only Forecast, we
2256      * generate quantity but not revenue for rate-based resources of
2257      * non-billable tasks. To do this, null out revenue amounts and
2258      * rate overrides for rate-based resources of non-billable tasks.
2259      * Note that we handle the case of non-rated-based resources
2260      * of non-billable tasks earlier in the code. */
2261 
2262     IF l_target_version_type = 'REVENUE' AND
2263        l_calling_context = lc_ForecastGeneration THEN
2264         FOR i IN 1..l_tgt_res_asg_id_tab.count LOOP
2265             IF l_billable_flag_tab(i) = 'N' AND
2266                l_tgt_rate_based_flag_tab(i) = 'Y' THEN
2267                 l_src_revenue_tab(i) := NULL;
2268                 l_bill_rate_override_tab(i) := NULL;
2269                 -- null out cost rate overrides in case of Work-based revenue
2270                 l_cost_rate_override_tab(i) := NULL;
2271                 l_b_cost_rate_override_tab(i) := NULL;
2272             END IF;
2273         END LOOP;
2274     END IF; -- ER 4376722 billability logic for REVENUE Forecast
2275 
2276     /* ER 4376722: When the Target is a Cost and Revenue together
2277      * version, we do not generate revenue for non-billable tasks.
2278      * To do this, simply null out revenue amounts for non-billable
2279      * tasks. The result is that revenue amounts for non-billable
2280      * tasks will not be written to the budget lines. */
2281 
2282     IF l_target_version_type = 'ALL' THEN
2283         -- Null out revenue amounts for non-billable tasks
2284         FOR i in 1..l_tgt_res_asg_id_tab.count LOOP
2285             IF l_billable_flag_tab(i) = 'N' THEN
2286 	        l_src_revenue_tab(i) := null;
2287 	        l_bill_rate_override_tab(i) := null;
2288 
2289                 -- IPM: If the current txn has only revenue amounts,
2290                 -- then process using the rules for revenue-only versions.
2291                 IF ( l_calling_context = lc_BudgetGeneration AND
2292                      nvl(l_src_raw_cost_tab(i),0) = 0 ) OR
2293                    ( l_calling_context = lc_ForecastGeneration AND
2294                      nvl(l_src_raw_cost_tab(i),0) = 0 AND
2295                      l_tgt_rate_based_flag_tab(i) = 'N' ) THEN
2296                     -- Skip over the record in this case so that
2297                     -- cost is not generated from a revenue amount.
2298                     l_remove_record_flag_tab(i) := 'Y';
2299                     l_remove_records_flag := 'Y';
2300                 END IF; -- revenue-only txn logic
2301             END IF;
2302         END LOOP;
2303     END IF; -- ER 4376722 billability logic for ALL versions
2304 
2305     -- Added in IPM. If there are any pl/sql table records that need to
2306     -- be removed, use a separate set of _tmp_ tables to filter them out.
2307 
2308     IF l_remove_records_flag = 'Y' THEN
2309 
2310         -- 0. Clear out any data in the _tmp_ tables.
2311         l_tmp_tgt_res_asg_id_tab.delete;
2312         l_tmp_tgt_rate_based_flag_tab.delete;
2313         l_tmp_txn_currency_code_tab.delete;
2314         l_tmp_src_quantity_tab.delete;
2315         l_tmp_src_raw_cost_tab.delete;
2316         l_tmp_src_brdn_cost_tab.delete;
2317         l_tmp_src_revenue_tab.delete;
2318         l_tmp_cost_rate_override_tab.delete;
2319         l_tmp_b_cost_rate_override_tab.delete;
2320         l_tmp_bill_rate_override_tab.delete;
2321         l_tmp_billable_flag_tab.delete;
2322 
2323         -- 1. Copy records into _tmp_ tables
2324         l_tmp_index := 0;
2325         FOR i IN 1..l_tgt_res_asg_id_tab.count LOOP
2326             IF l_remove_record_flag_tab(i) <> 'Y' THEN
2327                 l_tmp_tgt_res_asg_id_tab.extend;
2328                 l_tmp_tgt_rate_based_flag_tab.extend;
2329                 l_tmp_txn_currency_code_tab.extend;
2330                 l_tmp_src_quantity_tab.extend;
2331                 l_tmp_src_raw_cost_tab.extend;
2332                 l_tmp_src_brdn_cost_tab.extend;
2333                 l_tmp_src_revenue_tab.extend;
2334                 l_tmp_cost_rate_override_tab.extend;
2335                 l_tmp_b_cost_rate_override_tab.extend;
2336                 l_tmp_bill_rate_override_tab.extend;
2337                 l_tmp_billable_flag_tab.extend;
2338 
2339                 l_tmp_index := l_tmp_index + 1;
2340                 l_tmp_tgt_res_asg_id_tab(l_tmp_index)       := l_tgt_res_asg_id_tab(i);
2341                 l_tmp_tgt_rate_based_flag_tab(l_tmp_index)  := l_tgt_rate_based_flag_tab(i);
2342                 l_tmp_txn_currency_code_tab(l_tmp_index)    := l_txn_currency_code_tab(i);
2343                 l_tmp_src_quantity_tab(l_tmp_index)         := l_src_quantity_tab(i);
2344                 l_tmp_src_raw_cost_tab(l_tmp_index)         := l_src_raw_cost_tab(i);
2345                 l_tmp_src_brdn_cost_tab(l_tmp_index)        := l_src_brdn_cost_tab(i);
2346                 l_tmp_src_revenue_tab(l_tmp_index)          := l_src_revenue_tab(i);
2347                 l_tmp_cost_rate_override_tab(l_tmp_index)   := l_cost_rate_override_tab(i);
2348                 l_tmp_b_cost_rate_override_tab(l_tmp_index) := l_b_cost_rate_override_tab(i);
2349                 l_tmp_bill_rate_override_tab(l_tmp_index)   := l_bill_rate_override_tab(i);
2350                 l_tmp_billable_flag_tab(l_tmp_index)        := l_billable_flag_tab(i);
2351             END IF;
2352         END LOOP;
2353 
2354         -- 2. Copy records from _tmp_ tables back to non-temporary tables.
2355         l_tgt_res_asg_id_tab       := l_tmp_tgt_res_asg_id_tab;
2356         l_tgt_rate_based_flag_tab  := l_tmp_tgt_rate_based_flag_tab;
2357         l_txn_currency_code_tab    := l_tmp_txn_currency_code_tab;
2358         l_src_quantity_tab         := l_tmp_src_quantity_tab;
2359         l_src_raw_cost_tab         := l_tmp_src_raw_cost_tab;
2360         l_src_brdn_cost_tab        := l_tmp_src_brdn_cost_tab;
2361         l_src_revenue_tab          := l_tmp_src_revenue_tab;
2362         l_cost_rate_override_tab   := l_tmp_cost_rate_override_tab;
2363         l_b_cost_rate_override_tab := l_tmp_b_cost_rate_override_tab;
2364         l_bill_rate_override_tab   := l_tmp_bill_rate_override_tab;
2365         l_billable_flag_tab        := l_tmp_billable_flag_tab;
2366 
2367     END IF; -- IPM record removal logic
2368 
2369    /*********************************************************************
2370  	   ER 5726773: Commenting out logic that filters out planning
2371  	                transaction records with: (total plan quantity <= 0).
2372 
2373  	--   Bug #4938603: Adding code to filter out records with
2374 	--    total plan quantity < 0
2375 
2376     -- 0. Clear out any data in the _tmp_ tables.
2377     l_tmp_tgt_res_asg_id_tab.delete;
2378     l_tmp_tgt_rate_based_flag_tab.delete;
2379     l_tmp_txn_currency_code_tab.delete;
2380     l_tmp_src_quantity_tab.delete;
2381     l_tmp_src_raw_cost_tab.delete;
2382     l_tmp_src_brdn_cost_tab.delete;
2383     l_tmp_src_revenue_tab.delete;
2384     l_tmp_cost_rate_override_tab.delete;
2385     l_tmp_b_cost_rate_override_tab.delete;
2386     l_tmp_bill_rate_override_tab.delete;
2387     l_tmp_billable_flag_tab.delete;
2388 
2389     l_tmp_index := 0;
2390     -- 1. Copy records into _tmp_ tables for
2391     FOR i IN 1..l_tgt_res_asg_id_tab.count LOOP
2392         IF (l_calling_context = lc_BudgetGeneration) THEN
2393             l_total_plan_qty := nvl(l_src_quantity_tab(i),0);
2394         ELSIF (l_calling_context = lc_ForecastGeneration) THEN
2395             OPEN fcst_bdgt_line_actual_qty(l_tgt_res_asg_id_tab(i),l_txn_currency_code_tab(i));
2396             FETCH fcst_bdgt_line_actual_qty INTO l_init_qty ;
2397             CLOSE fcst_bdgt_line_actual_qty;
2398             l_total_plan_qty := nvl(l_init_qty,0) + nvl(l_src_quantity_tab(i),0);
2399         END IF;
2400         IF l_total_plan_qty > 0 THEN
2401             l_tmp_tgt_res_asg_id_tab.extend;
2402             l_tmp_tgt_rate_based_flag_tab.extend;
2403             l_tmp_txn_currency_code_tab.extend;
2404             l_tmp_src_quantity_tab.extend;
2405             l_tmp_src_raw_cost_tab.extend;
2406             l_tmp_src_brdn_cost_tab.extend;
2407             l_tmp_src_revenue_tab.extend;
2408             l_tmp_cost_rate_override_tab.extend;
2409             l_tmp_b_cost_rate_override_tab.extend;
2410             l_tmp_bill_rate_override_tab.extend;
2411             l_tmp_billable_flag_tab.extend;
2412 
2413             l_tmp_index := l_tmp_index + 1;
2414             l_tmp_tgt_res_asg_id_tab(l_tmp_index)       := l_tgt_res_asg_id_tab(i);
2415             l_tmp_tgt_rate_based_flag_tab(l_tmp_index)  := l_tgt_rate_based_flag_tab(i);
2416             l_tmp_txn_currency_code_tab(l_tmp_index)    := l_txn_currency_code_tab(i);
2417             l_tmp_src_quantity_tab(l_tmp_index)         := l_src_quantity_tab(i);
2418             l_tmp_src_raw_cost_tab(l_tmp_index)         := l_src_raw_cost_tab(i);
2419             l_tmp_src_brdn_cost_tab(l_tmp_index)        := l_src_brdn_cost_tab(i);
2420             l_tmp_src_revenue_tab(l_tmp_index)          := l_src_revenue_tab(i);
2421             l_tmp_cost_rate_override_tab(l_tmp_index)   := l_cost_rate_override_tab(i);
2422             l_tmp_b_cost_rate_override_tab(l_tmp_index) := l_b_cost_rate_override_tab(i);
2423             l_tmp_bill_rate_override_tab(l_tmp_index)   := l_bill_rate_override_tab(i);
2424             l_tmp_billable_flag_tab(l_tmp_index)        := l_billable_flag_tab(i);
2425         END IF;
2426     END LOOP;
2427 
2428     -- 2. Copy records from _tmp_ tables back to non-temporary tables.
2429     l_tgt_res_asg_id_tab       := l_tmp_tgt_res_asg_id_tab;
2430     l_tgt_rate_based_flag_tab  := l_tmp_tgt_rate_based_flag_tab;
2431     l_txn_currency_code_tab    := l_tmp_txn_currency_code_tab;
2432     l_src_quantity_tab         := l_tmp_src_quantity_tab;
2433     l_src_raw_cost_tab         := l_tmp_src_raw_cost_tab;
2434     l_src_brdn_cost_tab        := l_tmp_src_brdn_cost_tab;
2435     l_src_revenue_tab          := l_tmp_src_revenue_tab;
2436     l_cost_rate_override_tab   := l_tmp_cost_rate_override_tab;
2437     l_b_cost_rate_override_tab := l_tmp_b_cost_rate_override_tab;
2438     l_bill_rate_override_tab   := l_tmp_bill_rate_override_tab;
2439     l_billable_flag_tab        := l_tmp_billable_flag_tab;
2440 
2441     -- End of code for #4938603
2442 
2443    ER 5726773: End of commented out section.
2444  *********************************************************************/
2445 
2446     -- ER 4376722: Consolidated update of UOM and rate_based_flag for
2447     -- cost-based Revenue generation within the this API before any
2448     -- cursor is called. This ensures that values in the rate_base_flag
2449     -- pl/sql tables are accurate. Before this change, an identical
2450     -- update was done in MAINTAIN_BUDGET_LINES as well as in this API
2451     -- after cursors were used and generation logic was performed.
2452 
2453 /******************** Commented Out *********************
2454     IF l_fp_cols_rec_target.x_version_type = 'REVENUE' and
2455        l_rev_gen_method = 'C' THEN
2456         l_res_asg_uom_update_tab.DELETE;
2457         SELECT DISTINCT txn_resource_assignment_id
2458         BULK COLLECT INTO l_res_asg_uom_update_tab
2459         FROM pa_res_list_map_tmp4;
2460 
2461         FORALL i IN 1..l_res_asg_uom_update_tab.count
2462             UPDATE pa_resource_assignments
2463                SET unit_of_measure = 'DOLLARS',
2464                    rate_based_flag = 'N'
2465              WHERE resource_assignment_id = l_res_asg_uom_update_tab(i);
2466     END IF;
2467 ******************** End Commenting **********************/
2468 
2469     -- Bug 3968748: We need to populate the PA_FP_GEN_RATE_TMP table with
2470     -- burdened cost rates for non-rate-based resources for Calculate API
2471     -- when generating work-based revenue for a Revenue-only target version.
2472 
2473     -- Bug 4216423: We now need to populate PA_FP_GEN_RATE_TMP with cost
2474     -- rates for both rate-based and non-rate based resources when generating
2475     -- work-based revenue for a Revenue-only target version.
2476 
2477     /* ER 4376722: Note that we do not need to modify the logic for populating
2478      * PA_FP_GEN_RATE_TMP here, since we already removed pl/sql table records
2479      * for non-billable tasks earlier in the code for Revenue-only target versions. */
2480 
2481     -- Bug 4568011: Added REVENUE_BILL_RATE to list of inserted columns.
2482     -- When the value is non-null, the Calculate API will honor the given
2483     -- bill rate instead of computing revenue amounts.
2484 
2485     IF l_fp_cols_rec_target.x_version_type = 'REVENUE' AND l_rev_gen_method = 'T' THEN
2486         DELETE pa_fp_gen_rate_tmp;
2487         /* For summary level calculation, we should leave period_name NULL */
2488         FORALL i IN 1..l_tgt_res_asg_id_tab.count
2489             INSERT INTO pa_fp_gen_rate_tmp
2490                    ( TARGET_RES_ASG_ID,
2491                      TXN_CURRENCY_CODE,
2492                      RAW_COST_RATE,
2493                      BURDENED_COST_RATE,
2494                      REVENUE_BILL_RATE )            /* Added for Bug 4568011 */
2495             VALUES ( l_tgt_res_asg_id_tab(i),
2496                      l_txn_currency_code_tab(i),
2497                      l_cost_rate_override_tab(i),
2498                      l_b_cost_rate_override_tab(i),
2499                      l_bill_rate_override_tab(i) ); /* Added for Bug 4568011 */
2500     END IF;
2501 
2502   END IF;
2503   /* end if for source and target time phase and res list chk */
2504 
2505 -- ER 5726773: Pass cost amounts as Null instead of 0 for
2506  	     -- non-rate-based, revenue-only txns in Cost-and-Revenue-together
2507  	     -- versions to avoid such txns disappearing during generation.
2508  	     IF l_target_version_type = 'ALL' THEN
2509  	         FOR i in 1..l_tgt_res_asg_id_tab.count LOOP
2510  	             IF l_tgt_rate_based_flag_tab(i) = 'N' AND
2511  	                nvl(l_src_raw_cost_tab(i),0) = 0 AND
2512  	                nvl(l_src_revenue_tab(i),0) <> 0 THEN
2513  	                 l_src_raw_cost_tab(i) := null;
2514  	                 l_src_brdn_cost_tab(i) := null;
2515  	             END IF;
2516  	         END LOOP;
2517  	     END IF;
2518 
2519     --hr_utility.trace('??l_tgt_res_asg_id_tab.count:'|| l_tgt_res_asg_id_tab.count);
2520     --hr_utility.trace('??l_src_revenue_tab.count:'||l_src_revenue_tab.count);
2521     /*Initializing every pl/sql table to null*/
2522     FOR i in 1 .. l_tgt_res_asg_id_tab.count LOOP
2523         l_delete_budget_lines_tab.extend;
2524         l_spread_amts_flag_tab.extend;
2525         l_txn_currency_override_tab.extend;
2526         l_addl_qty_tab.extend;
2527         l_addl_raw_cost_tab.extend;
2528         l_addl_burdened_cost_tab.extend;
2529         l_addl_revenue_tab.extend;
2530         l_raw_cost_rate_tab.extend;
2531         l_b_cost_rate_tab.extend;
2532         l_bill_rate_tab.extend;
2533         l_line_start_date_tab.extend;
2534         l_line_end_date_tab.extend;
2535 
2536         l_delete_budget_lines_tab(i)    :=  Null;
2537         l_spread_amts_flag_tab(i)       :=  'Y';
2538         l_txn_currency_override_tab(i)  :=  Null;
2539         l_addl_qty_tab(i)               :=  Null;
2540         l_addl_raw_cost_tab(i)          :=  Null;
2541         l_addl_burdened_cost_tab(i)     :=  Null;
2542         l_addl_revenue_tab(i)           :=  Null;
2543         l_raw_cost_rate_tab(i)          :=  Null;
2544         l_b_cost_rate_tab(i)            :=  Null;
2545         l_bill_rate_tab(i)              :=  Null;
2546         l_line_start_date_tab(i)        :=  Null;
2547         l_line_end_date_tab(i)          :=  Null;
2548 
2549         --hr_utility.trace('----'||i||'-----');
2550         --hr_utility.trace('ra:'||l_tgt_res_asg_id_tab(i));
2551         --hr_utility.trace('rate based flag:'||l_tgt_rate_based_flag_tab(i));
2552         --hr_utility.trace('txn currency:'||l_txn_currency_code_tab(i));
2553         --hr_utility.trace('qty:'||l_src_quantity_tab(i));
2554         --hr_utility.trace('cost rate override:'||l_cost_rate_override_tab(i));
2555         --hr_utility.trace('bill rate override:'||l_bill_rate_override_tab(i));
2556         --hr_utility.trace('total brdn:'||l_src_brdn_cost_tab(i));
2557         --hr_utility.trace('total raw:'||l_src_raw_cost_tab(i));
2558         --hr_utility.trace('total_rev:'||l_src_revenue_tab(i));
2559     END LOOP;
2560 
2561     IF l_fp_cols_rec_target.x_version_type = 'REVENUE'
2562        AND l_rev_gen_method = 'C'
2563        AND l_wp_track_cost_flag <> 'Y' THEN
2564         delete from pa_fp_calc_amt_tmp2;
2565         FORALL i IN 1..l_tgt_res_asg_id_tab.count
2566             INSERT INTO pa_fp_calc_amt_tmp2(
2567             resource_assignment_id,
2568             txn_currency_code,
2569             TOTAL_PLAN_QUANTITY)
2570             VALUES(
2571             l_tgt_res_asg_id_tab(i),
2572             l_txn_currency_code_tab(i),
2573             l_src_quantity_tab(i));
2574         IF P_PA_DEBUG_MODE = 'Y' THEN
2575             PA_DEBUG.RESET_CURR_FUNCTION;
2576         END IF;
2577         RETURN;
2578     END IF;
2579 
2580     /* Get the api code for the Calculate API call. */
2581     IF p_pa_debug_mode = 'Y' THEN
2582         PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG
2583             ( p_called_mode => p_called_mode,
2584               p_msg         => 'Before calling ' ||
2585                                'PA_FP_WP_GEN_BUDGET_AMT_PUB.GET_CALC_API_FLAG_PARAMS',
2586               p_module_name => l_module_name,
2587               p_log_level   => 5 );
2588     END IF;
2589     PA_FP_WP_GEN_BUDGET_AMT_PUB.GET_CALC_API_FLAG_PARAMS
2590        ( P_PROJECT_ID          => p_project_id,
2591          P_FP_COLS_REC_SOURCE  => l_fp_cols_rec_source,
2592          P_FP_COLS_REC_TARGET  => l_fp_cols_rec_target,
2593          P_CALLING_CONTEXT     => l_calling_context,
2594          X_CALCULATE_API_CODE  => l_calculate_api_code,
2595          X_RETURN_STATUS       => x_return_status,
2596          X_MSG_COUNT           => x_msg_count,
2597          X_MSG_DATA            => x_msg_data );
2598     IF p_pa_debug_mode = 'Y' THEN
2599         PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG
2600             ( p_called_mode => p_called_mode,
2601               p_msg         => 'Status after calling ' ||
2602                                'PA_FP_WP_GEN_BUDGET_AMT_PUB.GET_CALC_API_FLAG_PARAMS: ' ||
2603                                x_return_status,
2604               p_module_name => l_module_name,
2605               p_log_level   => 5 );
2606     END IF;
2607     IF x_return_Status <> FND_API.G_RET_STS_SUCCESS THEN
2608         RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
2609     END IF;
2610 
2611     /* Parse l_calculate_api_code to get the flag parameters for Calculate API */
2612     l_refresh_rates_flag         := SUBSTR(l_calculate_api_code,1,1);
2613     l_refresh_conv_rates_flag    := SUBSTR(l_calculate_api_code,2,1);
2614     l_spread_required_flag       := SUBSTR(l_calculate_api_code,3,1);
2615     l_conv_rates_required_flag   := SUBSTR(l_calculate_api_code,4,1);
2616     -- Bug 4149684: Added p_rollup_required_flag to parameter list of Calculate API with
2617     -- value 'N' so that calling PJI rollup api is bypassed for increased performance.
2618     l_rollup_required_flag       := 'N';
2619     l_raTxn_rollup_api_call_flag := 'N'; -- Added for IPM new entity ER
2620 
2621     /* Following part is commented out for bug 4297552
2622        For the context Forecast Generation, the total amounts should be passed
2623        to 'Calculate'. Actual plus the ETC amount. Currently, this API is called only when
2624        the plan version is a Revenue only Forecast version.
2625     IF p_calling_context = lc_ForecastGeneration THEN
2626        FOR k IN 1 .. l_tgt_res_asg_id_tab.COUNT LOOP
2627            BEGIN
2628               SELECT sum(init_quantity),sum(init_revenue) into
2629               l_calc_qty_tmp, l_calc_tmp_rev FROM
2630               pa_budget_lines where
2631               resource_assignment_id = l_tgt_res_asg_id_tab(k) AND
2632               txn_currency_code = l_txn_currency_code_tab(k);
2633            EXCEPTION
2634            WHEN NO_DATA_FOUND THEN
2635                 l_calc_qty_tmp := 0;
2636                 l_calc_tmp_rev := 0;
2637            END;
2638            l_src_quantity_tab(k) := nvl(l_src_quantity_tab(k),0) + nvl(l_calc_qty_tmp,0);
2639            l_src_revenue_tab(k)  := nvl(l_src_revenue_tab(k),0)  + nvl(l_calc_tmp_rev,0);
2640        END LOOP;
2641     END IF; */
2642 
2643     --hr_utility.trace('bef calling calculate api:'||x_return_status);
2644     /*Calling the calculate API*/
2645     IF P_PA_DEBUG_MODE = 'Y' THEN
2646             pa_fp_gen_amount_utils.fp_debug
2647              (p_called_mode => p_called_mode,
2648               p_msg         => 'Before calling
2649                                PA_FP_CALC_PLAN_PKG.calculate',
2650               p_module_name => l_module_name,
2651               p_log_level   => 5);
2652     END IF;
2653     PA_FP_CALC_PLAN_PKG.calculate(
2654                        p_project_id                    => P_PROJECT_ID,
2655                        p_budget_version_id             => P_BUDGET_VERSION_ID,
2656                        p_refresh_rates_flag            => l_refresh_rates_flag,
2657                        p_refresh_conv_rates_flag       => l_refresh_conv_rates_flag,
2658                        p_spread_required_flag          => l_spread_required_flag,
2659                        p_conv_rates_required_flag      => l_conv_rates_required_flag,
2660                        p_rollup_required_flag          => l_rollup_required_flag,
2661                        p_source_context                => l_source_context,
2662                        p_resource_assignment_tab       => l_tgt_res_asg_id_tab,
2663                        p_delete_budget_lines_tab       => l_delete_budget_lines_tab,
2664                        p_spread_amts_flag_tab          => l_spread_amts_flag_tab,
2665                        p_txn_currency_code_tab         => l_txn_currency_code_tab,
2666                        p_txn_currency_override_tab     => l_txn_currency_override_tab,
2667                        p_total_qty_tab                 => l_src_quantity_tab,
2668                        p_addl_qty_tab                  => l_addl_qty_tab,
2669                        p_total_raw_cost_tab            => l_src_raw_cost_tab,
2670                        p_addl_raw_cost_tab             => l_addl_raw_cost_tab,
2671                        p_total_burdened_cost_tab       => l_src_brdn_cost_tab,
2672                        p_addl_burdened_cost_tab        => l_addl_burdened_cost_tab,
2673                        p_total_revenue_tab             => l_src_revenue_tab,
2674                        p_addl_revenue_tab              => l_addl_revenue_tab,
2675                        p_raw_cost_rate_tab             => l_raw_cost_rate_tab,
2676                        p_rw_cost_rate_override_tab     => l_cost_rate_override_tab,
2677                        p_b_cost_rate_tab               => l_b_cost_rate_tab,
2678                        p_b_cost_rate_override_tab      => l_b_cost_rate_override_tab,
2679                        p_bill_rate_tab                 => l_bill_rate_tab,
2680                        p_bill_rate_override_tab        => l_bill_rate_override_tab,
2681                        p_line_start_date_tab           => l_line_start_date_tab,
2682                        p_line_end_date_tab             => l_line_end_date_tab,
2683                        p_calling_module                => l_calling_context,
2684                        p_raTxn_rollup_api_call_flag    => l_raTxn_rollup_api_call_flag,
2685                        x_return_status                 => x_return_status,
2686                        x_msg_count                     => x_msg_count,
2687                        x_msg_data                      => x_msg_data);
2688     --hr_utility.trace('aft calling calculate api: '||x_return_status);
2689 
2690     IF P_PA_DEBUG_MODE = 'Y' THEN
2691             pa_fp_gen_amount_utils.fp_debug
2692              (p_called_mode => p_called_mode,
2693               p_msg         => 'Status after calling
2694                               PA_FP_CALC_PLAN_PKG.calculate: '
2695                               ||x_return_status,
2696               p_module_name => l_module_name,
2697               p_log_level   => 5);
2698     END IF;
2699     IF x_return_status  <> FND_API.G_RET_STS_SUCCESS THEN
2700         raise PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
2701     END IF;
2702     IF p_commit_flag = 'Y' THEN
2703        COMMIT;
2704     END IF;
2705     IF P_PA_DEBUG_MODE = 'Y' THEN
2706         PA_DEBUG.RESET_CURR_FUNCTION;
2707     END IF;
2708 EXCEPTION
2709     WHEN PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc THEN
2710 
2711         l_msg_count := FND_MSG_PUB.count_msg;
2712         IF l_msg_count = 1 THEN
2713             PA_INTERFACE_UTILS_PUB.get_messages
2714                 ( p_encoded        => FND_API.G_TRUE,
2715                   p_msg_index      => 1,
2716                   p_msg_count      => l_msg_count,
2717                   p_msg_data       => l_msg_data,
2718                   p_data           => l_data,
2719                   p_msg_index_out  => l_msg_index_out);
2720             x_msg_data := l_data;
2721             x_msg_count := l_msg_count;
2722         ELSE
2723             x_msg_count := l_msg_count;
2724         END IF;
2725 
2726         ROLLBACK;
2727 
2728         x_return_status := FND_API.G_RET_STS_ERROR;
2729 
2730         IF P_PA_DEBUG_MODE = 'Y' THEN
2731             pa_fp_gen_amount_utils.fp_debug
2732                 ( p_called_mode => p_called_mode,
2733                   p_msg         => 'Invalid Arguments Passed',
2734                   p_module_name => l_module_name,
2735                   p_log_level   => 5 );
2736             PA_DEBUG.RESET_CURR_FUNCTION;
2737         END IF;
2738         RAISE;
2739 
2740     WHEN OTHERS THEN
2741         rollback;
2742         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2743         x_msg_count     := 1;
2744         x_msg_data      := substr(sqlerrm,1,240);
2745         -- dbms_output.put_line('error msg :'||x_msg_data);
2746         FND_MSG_PUB.add_exc_msg
2747             ( p_pkg_name        => 'PA_FP_WP_GEN_BUDGET_AMT_PUB',
2748               p_procedure_name  => 'GENERATE_WP_BUDGET_AMT',
2749               p_error_text      => substr(sqlerrm,1,240));
2750         IF P_PA_DEBUG_MODE = 'Y' THEN
2751             pa_fp_gen_amount_utils.fp_debug
2752                 ( p_called_mode => p_called_mode,
2753                   p_msg         => 'Unexpected Error'||substr(sqlerrm, 1, 240),
2754                   p_module_name => l_module_name,
2755                   p_log_level   => 5);
2756             PA_DEBUG.RESET_CURR_FUNCTION;
2757         END IF;
2758         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2759 
2760 END GENERATE_WP_BUDGET_AMT;
2761 
2762 
2763 PROCEDURE MAINTAIN_BUDGET_LINES
2764           (P_PROJECT_ID                   IN           PA_PROJ_FP_OPTIONS.PROJECT_ID%TYPE,
2765            P_SOURCE_BV_ID                 IN           PA_BUDGET_VERSIONS.BUDGET_VERSION_ID%TYPE,
2766            P_TARGET_BV_ID                 IN           PA_BUDGET_VERSIONS.BUDGET_VERSION_ID%TYPE,
2767            P_CALLING_CONTEXT              IN           VARCHAR2,
2768            P_ACTUALS_THRU_DATE            IN           PA_PERIODS_ALL.END_DATE%TYPE,
2769            P_RETAIN_MANUAL_FLAG           IN           VARCHAR2,
2770            X_RETURN_STATUS                OUT NOCOPY   VARCHAR2,
2771            X_MSG_COUNT                    OUT NOCOPY   NUMBER,
2772            X_MSG_DATA                     OUT NOCOPY   VARCHAR2)
2773 IS
2774     l_module_name VARCHAR2(100) := 'pa.plsql.PA_FP_WP_GEN_BUDGET_AMT_PUB.MAINTAIN_BUDGET_LINES';
2775     l_txn_currency_flag            VARCHAR2(1):='Y';
2776 
2777     /* String constants for valid Calling Context values */
2778     lc_BudgetGeneration            CONSTANT VARCHAR2(30) := 'BUDGET_GENERATION';
2779     lc_ForecastGeneration          CONSTANT VARCHAR2(30) := 'FORECAST_GENERATION';
2780 
2781     /* Source Code constants */
2782     lc_WorkPlanSrcCode             CONSTANT PA_PROJ_FP_OPTIONS.GEN_COST_SRC_CODE%TYPE
2783                                        := 'WORKPLAN_RESOURCES';
2784     lc_FinancialPlanSrcCode        CONSTANT PA_PROJ_FP_OPTIONS.GEN_COST_SRC_CODE%TYPE
2785                                        := 'FINANCIAL_PLAN';
2786 
2787     /* Local copy of the Calling Context that will be checked instead of p_calling_context */
2788     l_calling_context              VARCHAR2(30);
2789 
2790     -- Bug 4115015: We need unrounded amounts to accurately compute
2791     -- override rates. Therefore, we have added an extra set of txn
2792     -- amounts prefixed by "_unrounded". Unrounded amounts are computed
2793     -- by multiplying quantity by the appropriate rate multipliers.
2794 
2795     -- ER 4376722: To carry out the Task Billability logic, we need to
2796     -- modify the cursors to fetch the task billable_flag for each target
2797     -- resource. Since ra.task_id can be NULL or 0, we take the outer
2798     -- join: NVL(ra.task_id,0) = ta.task_id (+). By default, tasks are
2799     -- billable, so we SELECT NVL(ta.billable_flag,'Y').
2800 
2801     /*when multi currency is not enabled, then take project currency and amts,
2802       when multi currency is enabled, then take transaction currency and amts,
2803       when target is approved budget version, then take projfunc currency and amts.
2804       Don't pick up amounts for budget lines with non-null rejection codes. */
2805     CURSOR budget_line_src_tgt(c_proj_currency_code PA_PROJECTS_ALL.PROJECT_CURRENCY_CODE%TYPE,
2806                                c_projfunc_currency_code PA_PROJECTS_ALL.PROJECT_CURRENCY_CODE%TYPE) IS
2807     SELECT /*+ INDEX(tmp4,PA_RES_LIST_MAP_TMP4_N2)*/
2808            ra.resource_assignment_id,
2809            ra.rate_based_flag,
2810            sbl.start_date,
2811            sbl.end_date,
2812            sbl.period_name,
2813            decode(l_txn_currency_flag,
2814                  'Y', sbl.txn_currency_code,
2815                  'N', c_proj_currency_code,
2816                  'A', c_projfunc_currency_code),
2817            sum(sbl.quantity),
2818            sum(decode(l_txn_currency_flag,
2819                       'Y', sbl.txn_raw_cost,
2820                       'N', sbl.project_raw_cost,
2821                       'A', sbl.raw_cost)),
2822            sum(decode(l_txn_currency_flag,
2823                       'Y', sbl.txn_burdened_cost,
2824                       'N', sbl.project_burdened_cost,
2825                       'A', sbl.burdened_cost)),
2826            sum(decode(l_txn_currency_flag,
2827                       'Y', sbl.txn_revenue,
2828                       'N', sbl.project_revenue,
2829                       'A', sbl.revenue)),
2830            /*
2831            sum(decode(l_txn_currency_flag,
2832                       'Y', sbl.quantity *
2833                            NVL(sbl.txn_cost_rate_override,sbl.txn_standard_cost_rate),   --sbl.txn_raw_cost
2834                       'N', sbl.quantity * NVL(sbl.project_cost_exchange_rate,1) *
2835                            NVL(sbl.txn_cost_rate_override,sbl.txn_standard_cost_rate),   --sbl.project_raw_cost
2836                       'A', sbl.quantity * NVL(sbl.projfunc_cost_exchange_rate,1) *
2837                            NVL(sbl.txn_cost_rate_override,sbl.txn_standard_cost_rate))), --sbl.raw_cost
2838            sum(decode(l_txn_currency_flag,
2839                       'Y', sbl.quantity *
2840                            NVL(sbl.burden_cost_rate_override,sbl.burden_cost_rate),   --sbl.txn_burdened_cost
2841                       'N', sbl.quantity * NVL(sbl.project_cost_exchange_rate,1) *
2842                            NVL(sbl.burden_cost_rate_override,sbl.burden_cost_rate),   --sbl.project_burdened_cost
2843                       'A', sbl.quantity * NVL(sbl.projfunc_cost_exchange_rate,1) *
2844                            NVL(sbl.burden_cost_rate_override,sbl.burden_cost_rate))), --sbl.burdened_cost
2845            sum(decode(l_txn_currency_flag,
2846                       'Y', sbl.quantity *
2847                            NVL(sbl.txn_bill_rate_override,sbl.txn_standard_bill_rate),   --sbl.txn_revenue
2848                       'N', sbl.quantity * NVL(sbl.project_cost_exchange_rate,1) *
2849                            NVL(sbl.txn_bill_rate_override,sbl.txn_standard_bill_rate),   --sbl.project_revenue
2850                       'A', sbl.quantity * NVL(sbl.projfunc_cost_exchange_rate,1) *
2851                            NVL(sbl.txn_bill_rate_override,sbl.txn_standard_bill_rate))), --sbl.revenue */
2852            -- Bug 8937993. Need to pull use source rates for only the plannned quantity.
2853            sum(decode(l_txn_currency_flag,
2854                       'Y', (((sbl.quantity - nvl(sbl.init_quantity,0)) *
2855                            NVL(sbl.txn_cost_rate_override,sbl.txn_standard_cost_rate))
2856                            + NVL(sbl.txn_init_raw_cost,0)),   																							--sbl.txn_raw_cost
2857                       'N', ((((sbl.quantity - nvl(sbl.init_quantity,0)) *
2858                            NVL(sbl.txn_cost_rate_override,sbl.txn_standard_cost_rate))
2859                            + NVL(sbl.txn_init_raw_cost,0)) * NVL(sbl.project_cost_exchange_rate,1)) ,   		--sbl.project_raw_cost
2860                       'A', ((((sbl.quantity - nvl(sbl.init_quantity,0)) *
2861                            NVL(sbl.txn_cost_rate_override,sbl.txn_standard_cost_rate))
2862                            + NVL(sbl.txn_init_raw_cost,0)) * NVL(sbl.projfunc_cost_exchange_rate,1))
2863                            )), 																																							--sbl.raw_cost
2864            sum(decode(l_txn_currency_flag,
2865                       'Y', (((sbl.quantity - nvl(sbl.init_quantity,0)) *
2866                            NVL(sbl.burden_cost_rate_override,sbl.burden_cost_rate))
2867                            + NVL(sbl.txn_init_burdened_cost,0)),   																					--sbl.txn_burdened_cost
2868                       'N', ((((sbl.quantity - nvl(sbl.init_quantity,0))  *
2869                            NVL(sbl.burden_cost_rate_override,sbl.burden_cost_rate))
2870                            + NVL(sbl.txn_init_burdened_cost,0)) * NVL(sbl.project_cost_exchange_rate,1)),   --sbl.project_burdened_cost
2871                       'A', ((((sbl.quantity - nvl(sbl.init_quantity,0)) *
2872                            NVL(sbl.burden_cost_rate_override,sbl.burden_cost_rate))
2873                            + NVL(sbl.txn_init_burdened_cost,0)) * NVL(sbl.projfunc_cost_exchange_rate,1))
2874                            )), 																																							 --sbl.burdened_cost
2875            sum(decode(l_txn_currency_flag,
2876                       'Y', (((sbl.quantity - nvl(sbl.init_quantity,0)) *
2877                            NVL(sbl.txn_bill_rate_override,sbl.txn_standard_bill_rate))
2878                            + NVL(sbl.txn_init_revenue,0)),   																								 --sbl.txn_revenue
2879                       'N', ((((sbl.quantity - nvl(sbl.init_quantity,0)) *
2880                            NVL(sbl.txn_bill_rate_override,sbl.txn_standard_bill_rate))
2881                            + NVL(sbl.txn_init_revenue,0)) * NVL(sbl.project_cost_exchange_rate,1)) ,   			 --sbl.project_revenue
2882                       'A', ((((sbl.quantity - nvl(sbl.init_quantity,0))  *
2883                            NVL(sbl.txn_bill_rate_override,sbl.txn_standard_bill_rate))
2884                            + NVL(sbl.txn_init_revenue,0)) * NVL(sbl.projfunc_cost_exchange_rate,1))
2885                            )),
2886            sum(sbl.project_raw_cost),
2887            sum(sbl.project_burdened_cost),
2888            sum(sbl.project_revenue),
2889            sum(sbl.raw_cost),
2890            sum(sbl.burdened_cost),
2891            sum(sbl.revenue),
2892            NULL,
2893            NULL,
2894            NULL,
2895            NVL(ta.billable_flag,'Y'),                      /* Added for ER 4376722 */
2896            avg(sbl.txn_markup_percent)                     /* Added for Bug 5166047 */
2897     FROM pa_res_list_map_tmp4 tmp4,
2898          pa_budget_lines sbl,
2899          pa_resource_assignments ra,
2900          pa_tasks ta                                       /* Added for ER 4376722 */
2901     WHERE tmp4.txn_source_id = sbl.resource_assignment_id
2902           and sbl.budget_version_id = p_source_bv_id
2903           and tmp4.txn_resource_assignment_id = ra.resource_assignment_id
2904           and ra.budget_version_id = p_target_bv_id
2905           and sbl.cost_rejection_code is null
2906           and sbl.revenue_rejection_code is null
2907           and sbl.burden_rejection_code is null
2908           and sbl.other_rejection_code is null
2909           and sbl.pc_cur_conv_rejection_code is null
2910           and sbl.pfc_cur_conv_rejection_code is null
2911           and NVL(ra.task_id,0) = ta.task_id (+)           /* Added for ER 4376722 */
2912           --and ta.project_id = P_PROJECT_ID               /* Added for ER 4376722 */
2913           and ra.project_id = P_PROJECT_ID                 /* Added for Bug 4543795 */
2914     GROUP BY ra.resource_assignment_id,
2915              ra.rate_based_flag,
2916              sbl.start_date,
2917              sbl.end_date,
2918              sbl.period_name,
2919              decode(l_txn_currency_flag,
2920                  'Y', sbl.txn_currency_code,
2921                  'N', c_proj_currency_code,
2922                  'A', c_projfunc_currency_code),
2923              NULL,
2924              NULL,
2925              NULL,
2926              NVL(ta.billable_flag,'Y');                    /* Added for ER 4376722 */
2927 
2928     --Start Changes Bug 6411406
2929     -- Created this cursor for non time phased scenario while generation of budget line.
2930     CURSOR budget_line_src_tgt_none(c_proj_currency_code PA_PROJECTS_ALL.PROJECT_CURRENCY_CODE%TYPE,
2931                                     c_projfunc_currency_code PA_PROJECTS_ALL.PROJECT_CURRENCY_CODE%TYPE) IS
2932     SELECT /*+ INDEX(tmp4,PA_RES_LIST_MAP_TMP4_N2)*/
2933            ra.resource_assignment_id,
2934            ra.rate_based_flag,
2935            ra.planning_start_date,
2936            ra.planning_end_date,
2937            null,
2938            decode(l_txn_currency_flag,
2939                  'Y', sbl.txn_currency_code,
2940                  'N', c_proj_currency_code,
2941                  'A', c_projfunc_currency_code),
2942            sum(sbl.quantity),
2943            sum(decode(l_txn_currency_flag,
2944                       'Y', sbl.txn_raw_cost,
2945                       'N', sbl.project_raw_cost,
2946                       'A', sbl.raw_cost)),
2947            sum(decode(l_txn_currency_flag,
2948                       'Y', sbl.txn_burdened_cost,
2949                       'N', sbl.project_burdened_cost,
2950                       'A', sbl.burdened_cost)),
2951            sum(decode(l_txn_currency_flag,
2952                       'Y', sbl.txn_revenue,
2953                       'N', sbl.project_revenue,
2954                       'A', sbl.revenue)),
2955            sum(decode(l_txn_currency_flag,
2956                       'Y', sbl.quantity *
2957                            NVL(sbl.txn_cost_rate_override,sbl.txn_standard_cost_rate),
2958                       'N', sbl.quantity * NVL(sbl.project_cost_exchange_rate,1) *
2959                            NVL(sbl.txn_cost_rate_override,sbl.txn_standard_cost_rate),
2960                       'A', sbl.quantity * NVL(sbl.projfunc_cost_exchange_rate,1) *
2961                            NVL(sbl.txn_cost_rate_override,sbl.txn_standard_cost_rate))),
2962            sum(decode(l_txn_currency_flag,
2963                       'Y', sbl.quantity *
2964                            NVL(sbl.burden_cost_rate_override,sbl.burden_cost_rate),
2965                       'N', sbl.quantity * NVL(sbl.project_cost_exchange_rate,1) *
2966                            NVL(sbl.burden_cost_rate_override,sbl.burden_cost_rate),
2967                       'A', sbl.quantity * NVL(sbl.projfunc_cost_exchange_rate,1) *
2968                            NVL(sbl.burden_cost_rate_override,sbl.burden_cost_rate))),
2969            sum(decode(l_txn_currency_flag,
2970                       'Y', sbl.quantity *
2971                            NVL(sbl.txn_bill_rate_override,sbl.txn_standard_bill_rate),
2972                       'N', sbl.quantity * NVL(sbl.project_cost_exchange_rate,1) *
2973                            NVL(sbl.txn_bill_rate_override,sbl.txn_standard_bill_rate),
2974                       'A', sbl.quantity * NVL(sbl.projfunc_cost_exchange_rate,1) *
2975                            NVL(sbl.txn_bill_rate_override,sbl.txn_standard_bill_rate))),
2976            sum(sbl.project_raw_cost),
2977            sum(sbl.project_burdened_cost),
2978            sum(sbl.project_revenue),
2979            sum(sbl.raw_cost),
2980            sum(sbl.burdened_cost),
2981            sum(sbl.revenue),
2982            NULL,
2983            NULL,
2984            NULL,
2985            NVL(ta.billable_flag,'Y'),
2986            avg(sbl.txn_markup_percent) -- Bug #13552225
2987     FROM pa_res_list_map_tmp4 tmp4,
2988          pa_budget_lines sbl,
2989          pa_resource_assignments ra,
2990          pa_tasks ta
2991     WHERE tmp4.txn_source_id = sbl.resource_assignment_id
2992           and sbl.budget_version_id = p_source_bv_id
2993           and tmp4.txn_resource_assignment_id = ra.resource_assignment_id
2994           and ra.budget_version_id = p_target_bv_id
2995           and sbl.cost_rejection_code is null
2996           and sbl.revenue_rejection_code is null
2997           and sbl.burden_rejection_code is null
2998           and sbl.other_rejection_code is null
2999           and sbl.pc_cur_conv_rejection_code is null
3000           and sbl.pfc_cur_conv_rejection_code is null
3001           and NVL(ra.task_id,0) = ta.task_id (+)
3002           and ra.project_id = P_PROJECT_ID
3003     GROUP BY ra.resource_assignment_id,
3004              ra.rate_based_flag,
3005              ra.planning_start_date,
3006              ra.planning_end_date,
3007              NULL,
3008              decode(l_txn_currency_flag,
3009                  'Y', sbl.txn_currency_code,
3010                  'N', c_proj_currency_code,
3011                  'A', c_projfunc_currency_code),
3012              NULL,
3013              NULL,
3014              NULL,
3015              NVL(ta.billable_flag,'Y');
3016     --End Changes Bug 6411406
3017 
3018 
3019     /* This cursor is the revenue forecast generation analogue of the cursor
3020      * budget_line_src_tgt. As such, changes to that cursor should likely be
3021      * mirorred here. See comments above the other cursor for more info.
3022      * This cursor differs from the other one in that it only picks up source
3023      * data with starting date after the forecast's actuals through period. */
3024     CURSOR fcst_budget_line_src_tgt
3025                (c_proj_currency_code PA_PROJECTS_ALL.PROJECT_CURRENCY_CODE%TYPE,
3026                 c_projfunc_currency_code PA_PROJECTS_ALL.PROJECT_CURRENCY_CODE%TYPE,
3027                 c_src_time_phased_code PA_PROJ_FP_OPTIONS.COST_TIME_PHASED_CODE%TYPE) IS
3028     SELECT /*+ INDEX(tmp4,PA_RES_LIST_MAP_TMP4_N2)*/
3029            ra.resource_assignment_id,
3030            ra.rate_based_flag,
3031            sbl.start_date,
3032            sbl.end_date,
3033            sbl.period_name,
3034            decode(l_txn_currency_flag,
3035                  'Y', sbl.txn_currency_code,
3036                  'N', c_proj_currency_code,
3037                  'A', c_projfunc_currency_code),
3038            sum(sbl.quantity),
3039            sum(decode(l_txn_currency_flag,
3040                       'Y', sbl.txn_raw_cost,
3041                       'N', sbl.project_raw_cost,
3042                       'A', sbl.raw_cost)),
3043            sum(decode(l_txn_currency_flag,
3044                       'Y', sbl.txn_burdened_cost,
3045                       'N', sbl.project_burdened_cost,
3046                       'A', sbl.burdened_cost)),
3047            sum(decode(l_txn_currency_flag,
3048                       'Y', sbl.txn_revenue,
3049                       'N', sbl.project_revenue,
3050                       'A', sbl.revenue)),
3051            sum(decode(l_txn_currency_flag,
3052                       'Y', sbl.quantity *
3053                            NVL(sbl.txn_cost_rate_override,sbl.txn_standard_cost_rate),   --sbl.txn_raw_cost
3054                       'N', sbl.quantity * NVL(sbl.project_cost_exchange_rate,1) *
3055                            NVL(sbl.txn_cost_rate_override,sbl.txn_standard_cost_rate),   --sbl.project_raw_cost
3056                       'A', sbl.quantity * NVL(sbl.projfunc_cost_exchange_rate,1) *
3057                            NVL(sbl.txn_cost_rate_override,sbl.txn_standard_cost_rate))), --sbl.raw_cost
3058            sum(decode(l_txn_currency_flag,
3059                       'Y', sbl.quantity *
3060                            NVL(sbl.burden_cost_rate_override,sbl.burden_cost_rate),   --sbl.txn_burdened_cost
3061                       'N', sbl.quantity * NVL(sbl.project_cost_exchange_rate,1) *
3062                            NVL(sbl.burden_cost_rate_override,sbl.burden_cost_rate),   --sbl.project_burdened_cost
3063                       'A', sbl.quantity * NVL(sbl.projfunc_cost_exchange_rate,1) *
3064                            NVL(sbl.burden_cost_rate_override,sbl.burden_cost_rate))), --sbl.burdened_cost
3065            sum(decode(l_txn_currency_flag,
3066                       'Y', sbl.quantity *
3067                            NVL(sbl.txn_bill_rate_override,sbl.txn_standard_bill_rate),   --sbl.txn_revenue
3068                       'N', sbl.quantity * NVL(sbl.project_cost_exchange_rate,1) *
3069                            NVL(sbl.txn_bill_rate_override,sbl.txn_standard_bill_rate),   --sbl.project_revenue
3070                       'A', sbl.quantity * NVL(sbl.projfunc_cost_exchange_rate,1) *
3071                            NVL(sbl.txn_bill_rate_override,sbl.txn_standard_bill_rate))), --sbl.revenue
3072            sum(sbl.project_raw_cost),
3073            sum(sbl.project_burdened_cost),
3074            sum(sbl.project_revenue),
3075            sum(sbl.raw_cost),
3076            sum(sbl.burdened_cost),
3077            sum(sbl.revenue),
3078            NULL,
3079            NULL,
3080            NULL,
3081            NVL(ta.billable_flag,'Y'),                      /* Added for ER 4376722 */
3082            avg(sbl.txn_markup_percent)                     /* Added for Bug 5166047 */
3083     FROM pa_res_list_map_tmp4 tmp4,
3084          pa_budget_lines sbl,
3085          pa_resource_assignments ra,
3086          pa_tasks ta                                       /* Added for ER 4376722 */
3087     WHERE tmp4.txn_source_id = sbl.resource_assignment_id
3088           and sbl.budget_version_id = p_source_bv_id
3089           and tmp4.txn_resource_assignment_id = ra.resource_assignment_id
3090           and ra.budget_version_id = p_target_bv_id
3091           and sbl.start_date > decode( c_src_time_phased_code,
3092                                        'N', sbl.start_date-1, P_ACTUALS_THRU_DATE )
3093           and sbl.cost_rejection_code is null
3094           and sbl.revenue_rejection_code is null
3095           and sbl.burden_rejection_code is null
3096           and sbl.other_rejection_code is null
3097           and sbl.pc_cur_conv_rejection_code is null
3098           and sbl.pfc_cur_conv_rejection_code is null
3099           and NVL(ra.task_id,0) = ta.task_id (+)           /* Added for ER 4376722 */
3100           --and ta.project_id = P_PROJECT_ID               /* Added for ER 4376722 */
3101           and ra.project_id = P_PROJECT_ID                 /* Added for Bug 4543795 */
3102     GROUP BY ra.resource_assignment_id,
3103              ra.rate_based_flag,
3104              sbl.start_date,
3105              sbl.end_date,
3106              sbl.period_name,
3107              decode(l_txn_currency_flag,
3108                  'Y', sbl.txn_currency_code,
3109                  'N', c_proj_currency_code,
3110                  'A', c_projfunc_currency_code),
3111              NULL,
3112              NULL,
3113              NULL,
3114              NVL(ta.billable_flag,'Y');                    /* Added for ER 4376722 */
3115 
3116     -- Bug 4192970: Added extra cursor for Forecast Generation context when
3117     -- Source time phasing is None. When Source time phasing is PA or GL,
3118     -- use the fcst_budget_line_src_tgt cursor. For more comments/details,
3119     -- please see the other cursor.
3120 
3121     CURSOR fcst_budget_line_src_tgt_none
3122                (c_proj_currency_code PA_PROJECTS_ALL.PROJECT_CURRENCY_CODE%TYPE,
3123                 c_projfunc_currency_code PA_PROJECTS_ALL.PROJECT_CURRENCY_CODE%TYPE,
3124                 c_src_time_phased_code PA_PROJ_FP_OPTIONS.COST_TIME_PHASED_CODE%TYPE) IS
3125     SELECT /*+ INDEX(tmp4,PA_RES_LIST_MAP_TMP4_N2)*/
3126            ra.resource_assignment_id,
3127            ra.rate_based_flag,
3128            sbl.start_date,
3129            sbl.end_date,
3130            sbl.period_name,
3131            decode(l_txn_currency_flag,
3132                  'Y', sbl.txn_currency_code,
3133                  'N', c_proj_currency_code,
3134                  'A', c_projfunc_currency_code),
3135            sum(sbl.quantity-NVL(sbl.init_quantity,0)),
3136            sum(decode(l_txn_currency_flag,
3137                       'Y', sbl.txn_raw_cost - NVL(sbl.txn_init_raw_cost,0),
3138                       'N', sbl.project_raw_cost - NVL(sbl.project_init_raw_cost,0),
3139                       'A', sbl.raw_cost - NVL(sbl.init_raw_cost,0))),
3140            sum(decode(l_txn_currency_flag,
3141                       'Y', sbl.txn_burdened_cost - NVL(sbl.txn_init_burdened_cost,0),
3142                       'N', sbl.project_burdened_cost - NVL(sbl.project_init_burdened_cost,0),
3143                       'A', sbl.burdened_cost - NVL(sbl.init_burdened_cost,0))),
3144            sum(decode(l_txn_currency_flag,
3145                       'Y', sbl.txn_revenue - NVL(sbl.txn_init_revenue,0),
3146                       'N', sbl.project_revenue - NVL(sbl.project_init_revenue,0),
3147                       'A', sbl.revenue - NVL(sbl.init_revenue,0))),
3148            sum(decode(l_txn_currency_flag,
3149                       'Y', (sbl.quantity-NVL(sbl.init_quantity,0)) *
3150                            NVL(sbl.txn_cost_rate_override,sbl.txn_standard_cost_rate),   --sbl.txn_raw_cost
3151                       'N', (sbl.quantity-NVL(sbl.init_quantity,0)) * NVL(sbl.project_cost_exchange_rate,1) *
3152                            NVL(sbl.txn_cost_rate_override,sbl.txn_standard_cost_rate),   --sbl.project_raw_cost
3153                       'A', (sbl.quantity-NVL(sbl.init_quantity,0)) * NVL(sbl.projfunc_cost_exchange_rate,1) *
3154                            NVL(sbl.txn_cost_rate_override,sbl.txn_standard_cost_rate))), --sbl.raw_cost
3155            sum(decode(l_txn_currency_flag,
3156                       'Y', (sbl.quantity-NVL(sbl.init_quantity,0)) *
3157                            NVL(sbl.burden_cost_rate_override,sbl.burden_cost_rate),   --sbl.txn_burdened_cost
3158                       'N', (sbl.quantity-NVL(sbl.init_quantity,0)) * NVL(sbl.project_cost_exchange_rate,1) *
3159                            NVL(sbl.burden_cost_rate_override,sbl.burden_cost_rate),   --sbl.project_burdened_cost
3160                       'A', (sbl.quantity-NVL(sbl.init_quantity,0)) * NVL(sbl.projfunc_cost_exchange_rate,1) *
3161                            NVL(sbl.burden_cost_rate_override,sbl.burden_cost_rate))), --sbl.burdened_cost
3162            sum(decode(l_txn_currency_flag,
3163                       'Y', (sbl.quantity-NVL(sbl.init_quantity,0)) *
3164                            NVL(sbl.txn_bill_rate_override,sbl.txn_standard_bill_rate),   --sbl.txn_revenue
3165                       'N', (sbl.quantity-NVL(sbl.init_quantity,0)) * NVL(sbl.project_cost_exchange_rate,1) *
3166                            NVL(sbl.txn_bill_rate_override,sbl.txn_standard_bill_rate),   --sbl.project_revenue
3167                       'A', (sbl.quantity-NVL(sbl.init_quantity,0)) * NVL(sbl.projfunc_cost_exchange_rate,1) *
3168                            NVL(sbl.txn_bill_rate_override,sbl.txn_standard_bill_rate))), --sbl.revenue
3169            sum(sbl.project_raw_cost - NVL(sbl.project_init_raw_cost,0)),
3170            sum(sbl.project_burdened_cost - NVL(sbl.project_init_burdened_cost,0)),
3171            sum(sbl.project_revenue - NVL(sbl.project_init_revenue,0)),
3172            sum(sbl.raw_cost - NVL(sbl.init_raw_cost,0)),
3173            sum(sbl.burdened_cost - NVL(sbl.init_burdened_cost,0)),
3174            sum(sbl.revenue - NVL(sbl.init_revenue,0)),
3175            NULL,
3176            NULL,
3177            NULL,
3178            NVL(ta.billable_flag,'Y'),                      /* Added for ER 4376722 */
3179            avg(sbl.txn_markup_percent)                     /* Added for Bug 5166047 */
3180     FROM pa_res_list_map_tmp4 tmp4,
3181          pa_budget_lines sbl,
3182          pa_resource_assignments ra,
3183          pa_tasks ta                                       /* Added for ER 4376722 */
3184     WHERE tmp4.txn_source_id = sbl.resource_assignment_id
3185           and sbl.budget_version_id = p_source_bv_id
3186           and tmp4.txn_resource_assignment_id = ra.resource_assignment_id
3187           and ra.budget_version_id = p_target_bv_id
3188           and sbl.cost_rejection_code is null
3189           and sbl.revenue_rejection_code is null
3190           and sbl.burden_rejection_code is null
3191           and sbl.other_rejection_code is null
3192           and sbl.pc_cur_conv_rejection_code is null
3193           and sbl.pfc_cur_conv_rejection_code is null
3194           and NVL(sbl.quantity,0) <> NVL(sbl.init_quantity,0)
3195 	  and NVL(ra.task_id,0) = ta.task_id (+)           /* Added for ER  4376722 */
3196           --and ta.project_id = P_PROJECT_ID               /* Added for ER  4376722 */
3197           and ra.project_id = P_PROJECT_ID                 /* Added for Bug 4543795 */
3198     GROUP BY ra.resource_assignment_id,
3199              ra.rate_based_flag,
3200              sbl.start_date,
3201              sbl.end_date,
3202              sbl.period_name,
3203              decode(l_txn_currency_flag,
3204                  'Y', sbl.txn_currency_code,
3205                  'N', c_proj_currency_code,
3206                  'A', c_projfunc_currency_code),
3207              NULL,
3208              NULL,
3209              NULL,
3210              NVL(ta.billable_flag,'Y');                    /* Added for ER 4376722 */
3211 
3212     /* Added for bug #4938603 */
3213     CURSOR fcst_bdgt_line_actual_qty
3214         (c_res_asgn_id       PA_RESOURCE_ASSIGNMENTS.RESOURCE_ASSIGNMENT_ID%TYPE,
3215          c_txn_currency_code PA_PROJECTS_ALL.PROJECT_CURRENCY_CODE%TYPE
3216         ) IS
3217     SELECT sum(nvl(init_quantity,0))
3218       FROM pa_budget_lines
3219      WHERE resource_assignment_id = c_res_asgn_id
3220        AND txn_currency_code = c_txn_currency_code;
3221 
3222     /* Additional types and variables added for Bug 4938603 */
3223     TYPE Char15ToNum
3224     IS TABLE OF NUMBER INDEX BY PA_BUDGET_LINES.TXN_CURRENCY_CODE%TYPE;
3225 
3226     TYPE NumToChar15ToNum
3227     IS TABLE OF Char15ToNum INDEX BY BINARY_INTEGER;
3228 
3229     ra_id_tab                      NumToChar15ToNum;
3230     new_currency_tab               Char15ToNum;
3231     l_ra_id                        NUMBER;
3232     l_currency                     PA_BUDGET_LINES.TXN_CURRENCY_CODE%TYPE;
3233     n_index                        NUMBER;
3234     s_index                        PA_BUDGET_LINES.TXN_CURRENCY_CODE%TYPE;
3235     l_total_plan_qty               NUMBER;
3236     l_init_qty                     NUMBER;
3237 
3238     l_tgt_res_asg_id_tab           pa_plsql_datatypes.IdTabTyp;
3239     l_tgt_rate_based_flag_tab      pa_plsql_datatypes.Char15TabTyp;
3240     l_start_date_tab               pa_plsql_datatypes.DateTabTyp;
3241     l_txn_currency_code_tab        pa_plsql_datatypes.Char15TabTyp;
3242     l_end_date_tab                 pa_plsql_datatypes.DateTabTyp;
3243     l_periiod_name_tab             pa_plsql_datatypes.Char30TabTyp;
3244     l_src_quantity_tab             pa_plsql_datatypes.NumTabTyp;
3245     l_txn_raw_cost_tab             pa_plsql_datatypes.NumTabTyp;
3246     l_txn_brdn_cost_tab            pa_plsql_datatypes.NumTabTyp;
3247     l_txn_revenue_tab              pa_plsql_datatypes.NumTabTyp;
3248 
3249     /* Bug 4115015: We use unrounded txn amounts for computing overrides. */
3250     l_override_quantity            NUMBER;
3251     l_unrounded_txn_raw_cost_tab   pa_plsql_datatypes.NumTabTyp;
3252     l_unrounded_txn_brdn_cost_tab  pa_plsql_datatypes.NumTabTyp;
3253     l_unrounded_txn_revenue_tab    pa_plsql_datatypes.NumTabTyp;
3254 
3255     l_pfc_brdn_cost_tab            pa_plsql_datatypes.NumTabTyp;
3256     l_pfc_raw_cost_tab             pa_plsql_datatypes.NumTabTyp;
3257     l_pfc_revenue_tab              pa_plsql_datatypes.NumTabTyp;
3258 
3259     l_pc_brdn_cost_tab             pa_plsql_datatypes.NumTabTyp;
3260     l_pc_raw_cost_tab              pa_plsql_datatypes.NumTabTyp;
3261     l_pc_revenue_tab               pa_plsql_datatypes.NumTabTyp;
3262 
3263     l_cost_rate_override_tab       pa_plsql_datatypes.NumTabTyp;
3264     l_b_cost_rate_override_tab     pa_plsql_datatypes.NumTabTyp;
3265     l_bill_rate_override_tab       pa_plsql_datatypes.NumTabTyp;
3266 
3267     l_fp_cols_rec_source           PA_FP_GEN_AMOUNT_UTILS.FP_COLS;
3268     l_fp_cols_rec_target           PA_FP_GEN_AMOUNT_UTILS.FP_COLS;
3269 
3270     /* Variables for COMPARE_ETC_SRC_TARGET_FP_OPT API call */
3271     l_gen_src_code                 PA_PROJ_FP_OPTIONS.GEN_COST_SRC_CODE%TYPE;
3272     l_wp_src_plan_ver_id           PA_BUDGET_VERSIONS.BUDGET_VERSION_ID%TYPE;
3273     l_fp_src_plan_ver_id           PA_BUDGET_VERSIONS.BUDGET_VERSION_ID%TYPE;
3274     l_same_planning_options_flag   VARCHAR2(1);
3275 
3276     /* PL/SQL tables for copying source resource assignment attributes */
3277     l_task_id_tab                  PA_PLSQL_DATATYPES.IdTabTyp;
3278     l_res_list_member_id_tab       PA_PLSQL_DATATYPES.IdTabTyp;
3279 
3280     l_resource_class_flag_tab      PA_PLSQL_DATATYPES.Char15TabTyp;
3281     l_resource_class_code_tab      PA_PLSQL_DATATYPES.Char30TabTyp;
3282     l_res_type_code_tab            PA_PLSQL_DATATYPES.Char30TabTyp;
3283     l_person_id_tab                PA_PLSQL_DATATYPES.IdTabTyp;
3284     l_job_id_tab                   PA_PLSQL_DATATYPES.IdTabTyp;
3285     l_person_type_code_tab         PA_PLSQL_DATATYPES.Char30TabTyp;
3286     l_named_role_tab               PA_PLSQL_DATATYPES.Char80TabTyp;
3287     l_bom_resource_id_tab          PA_PLSQL_DATATYPES.IdTabTyp;
3288     l_non_labor_resource_tab       PA_PLSQL_DATATYPES.Char20TabTyp;
3289     l_inventory_item_id_tab        PA_PLSQL_DATATYPES.IdTabTyp;
3290     l_item_category_id_tab         PA_PLSQL_DATATYPES.IdTabTyp;
3291     l_project_role_id_tab          PA_PLSQL_DATATYPES.IdTabTyp;
3292     l_organization_id_tab          PA_PLSQL_DATATYPES.IdTabTyp;
3293     l_fc_res_type_code_tab         PA_PLSQL_DATATYPES.Char30TabTyp;
3294     l_expenditure_type_tab         PA_PLSQL_DATATYPES.Char30TabTyp;
3295     l_expenditure_category_tab     PA_PLSQL_DATATYPES.Char30TabTyp;
3296     l_event_type_tab               PA_PLSQL_DATATYPES.Char30TabTyp;
3297     l_revenue_category_code_tab    PA_PLSQL_DATATYPES.Char30TabTyp;
3298     l_supplier_id_tab              PA_PLSQL_DATATYPES.IdTabTyp;
3299     l_spread_curve_id_tab          PA_PLSQL_DATATYPES.IdTabTyp;
3300     l_etc_method_code_tab          PA_PLSQL_DATATYPES.Char30TabTyp;
3301     l_mfc_cost_type_id_tab         PA_PLSQL_DATATYPES.IdTabTyp;
3302     l_incurred_by_res_flag_tab     PA_PLSQL_DATATYPES.Char15TabTyp;
3303     l_incur_by_res_cls_code_tab    PA_PLSQL_DATATYPES.Char30TabTyp;
3304     l_incur_by_role_id_tab         PA_PLSQL_DATATYPES.IdTabTyp;
3305     l_unit_of_measure_tab          PA_PLSQL_DATATYPES.Char30TabTyp;
3306     l_rate_based_flag_tab          PA_PLSQL_DATATYPES.Char15TabTyp;
3307     -- IPM: Added table for copying source resource_rate_based_flag values.
3308     l_res_rate_based_flag_tab      PA_PLSQL_DATATYPES.Char15TabTyp;
3309     l_rate_expenditure_type_tab    PA_PLSQL_DATATYPES.Char30TabTyp;
3310     l_rate_func_curr_code_tab      PA_PLSQL_DATATYPES.Char30TabTyp;
3311     l_org_id_tab                   PA_PLSQL_DATATYPES.IdTabTyp;
3312 
3313     l_last_updated_by              PA_RESOURCE_ASSIGNMENTS.LAST_UPDATED_BY%TYPE
3314 				       := FND_GLOBAL.user_id;
3315     l_last_update_login            PA_RESOURCE_ASSIGNMENTS.LAST_UPDATE_LOGIN%TYPE
3316 				       := FND_GLOBAL.login_id;
3317 
3318     l_rev_gen_method               VARCHAR2(3);
3319     l_res_asg_uom_update_tab       pa_plsql_datatypes.IdTabTyp;
3320 
3321     l_appr_cost_plan_type_flag     PA_BUDGET_VERSIONS.APPROVED_COST_PLAN_TYPE_FLAG%TYPE;
3322     l_appr_rev_plan_type_flag      PA_BUDGET_VERSIONS.APPROVED_COST_PLAN_TYPE_FLAG%TYPE;
3323 
3324     /* Bug 3968748: PL/SQL tables for populating PA_FP_GEN_RATE_TMP */
3325     l_nrb_ra_id_tab                PA_PLSQL_DATATYPES.IdTabTyp;
3326     l_nrb_txn_curr_code_tab        PA_PLSQL_DATATYPES.Char30TabTyp;
3327     l_nrb_bcost_rate_tab           PA_PLSQL_DATATYPES.NumTabTyp;
3328     l_nrb_period_name_tab          PA_PLSQL_DATATYPES.Char30TabTyp;
3329     l_nrb_rcost_rate_tab           PA_PLSQL_DATATYPES.NumTabTyp;
3330     l_index                        NUMBER;
3331 
3332     l_msg_count number;
3333     l_data VARCHAR2(2000);
3334     l_msg_data VARCHAR2(2000);
3335     l_msg_index_out number;
3336 
3337     l_source_version_type          PA_BUDGET_VERSIONS.VERSION_TYPE%TYPE;
3338     l_target_version_type          PA_BUDGET_VERSIONS.VERSION_TYPE%TYPE;
3339     l_dummy                        NUMBER;
3340     l_wp_track_cost_flag           VARCHAR2(1);
3341 
3342     -- Variables added for Bug 4292083
3343     l_index_tab                    PA_PLSQL_DATATYPES.IdTabTyp;
3344     l_upd_index_tab                PA_PLSQL_DATATYPES.IdTabTyp;
3345     l_upd_index                    NUMBER;
3346     l_ins_index                    NUMBER;
3347     l_tab_index                    NUMBER;
3348     l_next_update                  NUMBER;
3349 
3350     -- pl/sql tables for when Target is None timephased Forecast
3351     l_ins_tgt_res_asg_id_tab       pa_plsql_datatypes.IdTabTyp;
3352     l_ins_start_date_tab           pa_plsql_datatypes.DateTabTyp;
3353     l_ins_txn_currency_code_tab    pa_plsql_datatypes.Char15TabTyp;
3354     l_ins_end_date_tab             pa_plsql_datatypes.DateTabTyp;
3355     l_ins_periiod_name_tab         pa_plsql_datatypes.Char30TabTyp;
3356     l_ins_src_quantity_tab         pa_plsql_datatypes.NumTabTyp;
3357     l_ins_txn_raw_cost_tab         pa_plsql_datatypes.NumTabTyp;
3358     l_ins_txn_brdn_cost_tab        pa_plsql_datatypes.NumTabTyp;
3359     l_ins_txn_revenue_tab          pa_plsql_datatypes.NumTabTyp;
3360     l_ins_pfc_revenue_tab          pa_plsql_datatypes.NumTabTyp;
3361     l_ins_pc_revenue_tab           pa_plsql_datatypes.NumTabTyp;
3362     l_ins_cost_rate_override_tab   pa_plsql_datatypes.NumTabTyp;
3363     l_ins_bcost_rate_override_tab  pa_plsql_datatypes.NumTabTyp;
3364     l_ins_bill_rate_override_tab   pa_plsql_datatypes.NumTabTyp;
3365 
3366     -- pl/sql tables for when Target is None timephased Forecast
3367     l_upd_tgt_res_asg_id_tab       pa_plsql_datatypes.IdTabTyp;
3368     l_upd_start_date_tab           pa_plsql_datatypes.DateTabTyp;
3369     l_upd_txn_currency_code_tab    pa_plsql_datatypes.Char15TabTyp;
3370     l_upd_end_date_tab             pa_plsql_datatypes.DateTabTyp;
3371     l_upd_periiod_name_tab         pa_plsql_datatypes.Char30TabTyp;
3372     l_upd_src_quantity_tab         pa_plsql_datatypes.NumTabTyp;
3373     l_upd_txn_raw_cost_tab         pa_plsql_datatypes.NumTabTyp;
3374     l_upd_txn_brdn_cost_tab        pa_plsql_datatypes.NumTabTyp;
3375     l_upd_txn_revenue_tab          pa_plsql_datatypes.NumTabTyp;
3376     l_upd_pfc_revenue_tab          pa_plsql_datatypes.NumTabTyp;
3377     l_upd_pc_revenue_tab           pa_plsql_datatypes.NumTabTyp;
3378     l_upd_cost_rate_override_tab   pa_plsql_datatypes.NumTabTyp;
3379     l_upd_bcost_rate_override_tab  pa_plsql_datatypes.NumTabTyp;
3380     l_upd_bill_rate_override_tab   pa_plsql_datatypes.NumTabTyp;
3381 
3382     /* Variables Added for ER 4376722 */
3383     l_billable_flag_tab            PA_PLSQL_DATATYPES.Char1TabTyp;
3384     /* Variables Added for Bug 5166047 */
3385     l_markup_percent_tab           PA_PLSQL_DATATYPES.NumTabTyp;
3386 
3387     -- This index is used to track the running index of the _tmp_ tables
3388     l_tmp_index                    NUMBER;
3389 
3390     -- These _tmp_ tables will be used for removing non-billable tasks.
3391     l_tmp_tgt_res_asg_id_tab       pa_plsql_datatypes.IdTabTyp;
3392     l_tmp_tgt_rate_based_flag_tab  pa_plsql_datatypes.Char15TabTyp;
3393     l_tmp_start_date_tab           pa_plsql_datatypes.DateTabTyp;
3394     l_tmp_end_date_tab             pa_plsql_datatypes.DateTabTyp;
3395     l_tmp_periiod_name_tab         pa_plsql_datatypes.Char30TabTyp;
3396     l_tmp_txn_currency_code_tab    pa_plsql_datatypes.Char15TabTyp;
3397     l_tmp_src_quantity_tab         pa_plsql_datatypes.NumTabTyp;
3398     l_tmp_txn_raw_cost_tab         pa_plsql_datatypes.NumTabTyp;
3399     l_tmp_txn_brdn_cost_tab        pa_plsql_datatypes.NumTabTyp;
3400     l_tmp_txn_revenue_tab          pa_plsql_datatypes.NumTabTyp;
3401     l_tmp_unr_txn_raw_cost_tab     pa_plsql_datatypes.NumTabTyp;
3402     l_tmp_unr_txn_brdn_cost_tab    pa_plsql_datatypes.NumTabTyp;
3403     l_tmp_unr_txn_revenue_tab      pa_plsql_datatypes.NumTabTyp;
3404     l_tmp_pc_raw_cost_tab          pa_plsql_datatypes.NumTabTyp;
3405     l_tmp_pc_brdn_cost_tab         pa_plsql_datatypes.NumTabTyp;
3406     l_tmp_pc_revenue_tab           pa_plsql_datatypes.NumTabTyp;
3407     l_tmp_pfc_raw_cost_tab         pa_plsql_datatypes.NumTabTyp;
3408     l_tmp_pfc_brdn_cost_tab        pa_plsql_datatypes.NumTabTyp;
3409     l_tmp_pfc_revenue_tab          pa_plsql_datatypes.NumTabTyp;
3410     l_tmp_cost_rate_override_tab   pa_plsql_datatypes.NumTabTyp;
3411     l_tmp_bcost_rate_override_tab  pa_plsql_datatypes.NumTabTyp;
3412     l_tmp_bill_rate_override_tab   pa_plsql_datatypes.NumTabTyp;
3413     l_tmp_billable_flag_tab        PA_PLSQL_DATATYPES.Char1TabTyp;
3414     l_tmp_markup_percent_tab       PA_PLSQL_DATATYPES.NumTabTyp; -- Added for Bug 5166047
3415 
3416     /* Flag parameters for calling Calculate API */
3417     l_refresh_rates_flag           VARCHAR2(1);
3418     l_refresh_conv_rates_flag      VARCHAR2(1);
3419     l_spread_required_flag         VARCHAR2(1);
3420     l_conv_rates_required_flag     VARCHAR2(1);
3421     l_rollup_required_flag         VARCHAR2(1);
3422     l_raTxn_rollup_api_call_flag   VARCHAR2(1); -- Added for IPM new entity ER
3423 
3424     /* Additional Calculate API parameters added for Bug 4686742 */
3425     l_source_context               pa_fp_res_assignments_tmp.source_context%TYPE;
3426     l_cal_tgt_res_asg_id_tab       SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
3427     l_cal_start_date_tab           SYSTEM.pa_date_tbl_type:=SYSTEM.pa_date_tbl_type();
3428     l_cal_txn_currency_code_tab    SYSTEM.pa_varchar2_15_tbl_type:=SYSTEM.pa_varchar2_15_tbl_type();
3429     l_cal_end_date_tab             SYSTEM.pa_date_tbl_type:=SYSTEM.pa_date_tbl_type();
3430     l_cal_src_quantity_tab         SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
3431     l_cal_txn_raw_cost_tab         SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
3432     l_cal_txn_brdn_cost_tab        SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
3433     l_cal_txn_revenue_tab          SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
3434     l_cal_cost_rate_override_tab   SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
3435     l_cal_bill_rate_override_tab   SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
3436     l_cal_b_cost_rate_override_tab SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
3437 
3438     l_raw_cost_rate_tab            SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
3439     l_b_cost_rate_tab              SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
3440     l_bill_rate_tab                SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
3441 
3442     -- IPM: Added local variable to pass variable values of the
3443     --      p_calling_module parameter of the MAINTAIN_DATA API.
3444     l_calling_module             VARCHAR2(30);
3445     l_count                      NUMBER;
3446 
3447     -- Added in IPM to track if a record in the existing set of
3448     -- pl/sql tables needs to be removed.
3449     l_remove_record_flag_tab       PA_PLSQL_DATATYPES.Char1TabTyp;
3450     l_remove_records_flag          VARCHAR2(1);
3451 
3452 BEGIN
3453     IF P_PA_DEBUG_MODE = 'Y' THEN
3454         pa_debug.set_curr_function( p_function   => 'MAINTAIN_BUDGET_LINES',
3455                                     p_debug_mode => p_pa_debug_mode );
3456     END IF;
3457 
3458     x_return_status := FND_API.G_RET_STS_SUCCESS;
3459     x_msg_count := 0;
3460 
3461     --l_rev_gen_method := PA_FP_GEN_FCST_PG_PKG.GET_REV_GEN_METHOD(p_project_id);
3462 
3463     l_wp_track_cost_flag :=
3464         NVL( PA_FP_WP_GEN_AMT_UTILS.GET_WP_TRACK_COST_AMT_FLAG(p_project_id), 'N' );
3465 
3466     /* Set the local calling context to p_calling_context if it is a valid value.
3467      * Otherwise, default l_calling_context to budget generation. */
3468     IF p_calling_context = lc_BudgetGeneration OR
3469        p_calling_context = lc_ForecastGeneration THEN
3470         l_calling_context := p_calling_context;
3471     ELSE
3472         l_calling_context := lc_BudgetGeneration;
3473     END IF;
3474 
3475     IF P_PA_DEBUG_MODE = 'Y' THEN
3476         pa_fp_gen_amount_utils.fp_debug
3477             ( p_msg         => 'Before calling
3478                                PA_FP_GEN_AMOUNT_UTILS.GET_PLAN_VERSION_DTLS',
3479               p_module_name => l_module_name,
3480               p_log_level   => 5 );
3481     END IF;
3482     PA_FP_GEN_AMOUNT_UTILS.GET_PLAN_VERSION_DTLS (
3483         P_PROJECT_ID                 => P_PROJECT_ID,
3484         P_BUDGET_VERSION_ID          => P_SOURCE_BV_ID,
3485         X_FP_COLS_REC                => l_fp_cols_rec_source,
3486         X_RETURN_STATUS              => x_return_status,
3487         X_MSG_COUNT                  => x_msg_count,
3488         X_MSG_DATA                   => x_msg_data );
3489     IF P_PA_DEBUG_MODE = 'Y' THEN
3490         pa_fp_gen_amount_utils.fp_debug
3491             ( p_msg         => 'Status after calling
3492                               PA_FP_GEN_AMOUNT_UTILS.GET_PLAN_VERSION_DTLS: '
3493                               ||x_return_status,
3494               p_module_name => l_module_name,
3495               p_log_level   => 5 );
3496     END IF;
3497     IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
3498         raise PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
3499     END IF;
3500 
3501     IF P_PA_DEBUG_MODE = 'Y' THEN
3502         pa_fp_gen_amount_utils.fp_debug
3503             ( p_msg         => 'Before calling
3504                                PA_FP_GEN_AMOUNT_UTILS.GET_PLAN_VERSION_DTLS',
3505               p_module_name => l_module_name,
3506               p_log_level   => 5 );
3507     END IF;
3508     PA_FP_GEN_AMOUNT_UTILS.GET_PLAN_VERSION_DTLS
3509         ( P_PROJECT_ID                 => P_PROJECT_ID,
3510           P_BUDGET_VERSION_ID          => P_TARGET_BV_ID,
3511           X_FP_COLS_REC                => l_fp_cols_rec_target,
3512           X_RETURN_STATUS              => x_return_status,
3513           X_MSG_COUNT                  => x_msg_count,
3514           X_MSG_DATA                 => x_msg_data );
3515     IF P_PA_DEBUG_MODE = 'Y' THEN
3516         pa_fp_gen_amount_utils.fp_debug
3517             ( p_msg         => 'Status after calling
3518                               PA_FP_GEN_AMOUNT_UTILS.GET_PLAN_VERSION_DTLS: '
3519                               ||x_return_status,
3520               p_module_name => l_module_name,
3521               p_log_level   => 5 );
3522     END IF;
3523     IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
3524         raise PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
3525     END IF;
3526 
3527     l_rev_gen_method := nvl(l_fp_cols_rec_target.x_revenue_derivation_method,PA_FP_GEN_FCST_PG_PKG.GET_REV_GEN_METHOD(p_project_id)); --Bug 5462471
3528 
3529     /* Get the same planning options flag via the COMPARE_ETC_SRC_TARGET_FP_OPT API */
3530     IF l_calling_context = lc_BudgetGeneration THEN
3531         l_gen_src_code := l_fp_cols_rec_target.x_gen_src_code;
3532     ELSIF  l_calling_context = lc_ForecastGeneration THEN
3533         l_gen_src_code := l_fp_cols_rec_target.x_gen_etc_src_code;
3534     END IF;
3535 
3536     IF l_gen_src_code = lc_WorkPlanSrcCode THEN
3537         l_wp_src_plan_ver_id := p_source_bv_id;
3538     ELSIF l_gen_src_code = lc_FinancialPlanSrcCode THEN
3539         l_fp_src_plan_ver_id := p_source_bv_id;
3540     END IF;
3541 
3542     IF p_pa_debug_mode = 'Y' THEN
3543         PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG
3544             ( p_msg         => 'Before calling ' ||
3545                                'PA_FP_FCST_GEN_AMT_UTILS.COMPARE_ETC_SRC_TARGET_FP_OPT',
3546               p_module_name => l_module_name,
3547               p_log_level   => 5 );
3548     END IF;
3549     PA_FP_FCST_GEN_AMT_UTILS.COMPARE_ETC_SRC_TARGET_FP_OPT
3550         ( P_PROJECT_ID                => p_project_id,
3551           P_WP_SRC_PLAN_VER_ID        => l_wp_src_plan_ver_id,
3552           P_FP_SRC_PLAN_VER_ID        => l_fp_src_plan_ver_id,
3553           P_FP_TARGET_PLAN_VER_ID     => p_target_bv_id,
3554           X_SAME_PLANNING_OPTION_FLAG => l_same_planning_options_flag,
3555           X_RETURN_STATUS             => x_return_status,
3556           X_MSG_COUNT                 => x_msg_count,
3557           X_MSG_DATA                  => x_msg_data );
3558     IF p_pa_debug_mode = 'Y' THEN
3559         PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG
3560             ( p_msg         => 'Status after calling ' ||
3561                                'PA_FP_FCST_GEN_AMT_UTILS.COMPARE_ETC_SRC_TARGET_FP_OPT: ' ||
3562                                x_return_status,
3563               p_module_name => l_module_name,
3564               p_log_level   => 5 );
3565     END IF;
3566     IF x_return_Status <> FND_API.G_RET_STS_SUCCESS THEN
3567         RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
3568     END IF;
3569 
3570     /* During Budget and Forecast Generation, when the planning options match between
3571      * the source and target, we need to copy the attributes from the source resource
3572      * assignments over to their target resource assignment counterparts. */
3573     IF l_same_planning_options_flag = 'Y' THEN
3574 
3575         /* Pick up the source resource assignment attributes.
3576          * The where clause of this query contains the Retain Manual Lines logic. */
3577         SELECT /*+ INDEX(TMP,PA_RES_LIST_MAP_TMP4_N3)*/
3578                TMP.TXN_RESOURCE_ASSIGNMENT_ID,
3579                RA.RESOURCE_CLASS_FLAG,
3580                RA.RESOURCE_CLASS_CODE,
3581                RA.RES_TYPE_CODE,
3582                RA.PERSON_ID,
3583                RA.JOB_ID,
3584                RA.PERSON_TYPE_CODE,
3585                RA.NAMED_ROLE,
3586                RA.BOM_RESOURCE_ID,
3587                RA.NON_LABOR_RESOURCE,
3588                RA.INVENTORY_ITEM_ID,
3589                RA.ITEM_CATEGORY_ID,
3590                RA.PROJECT_ROLE_ID,
3591                RA.ORGANIZATION_ID,
3592                RA.FC_RES_TYPE_CODE,
3593                RA.EXPENDITURE_TYPE,
3594                RA.EXPENDITURE_CATEGORY,
3595                RA.EVENT_TYPE,
3596                RA.REVENUE_CATEGORY_CODE,
3597                RA.SUPPLIER_ID,
3598                RA.SPREAD_CURVE_ID,
3599                RA.ETC_METHOD_CODE,
3600                RA.MFC_COST_TYPE_ID,
3601                RA.INCURRED_BY_RES_FLAG,
3602                RA.INCUR_BY_RES_CLASS_CODE,
3603                RA.INCUR_BY_ROLE_ID,
3604                RA.UNIT_OF_MEASURE,
3605                RA.RATE_BASED_FLAG,
3606                RA.RESOURCE_RATE_BASED_FLAG, -- Added for IPM ER
3607                RA.RATE_EXPENDITURE_TYPE,
3608                RA.RATE_EXP_FUNC_CURR_CODE,
3609                RA.RATE_EXPENDITURE_ORG_ID
3610 	BULK COLLECT
3611         INTO   l_tgt_res_asg_id_tab,
3612                l_resource_class_flag_tab,
3613                l_resource_class_code_tab,
3614                l_res_type_code_tab,
3615                l_person_id_tab,
3616                l_job_id_tab,
3617                l_person_type_code_tab,
3618                l_named_role_tab,
3619                l_bom_resource_id_tab,
3620                l_non_labor_resource_tab,
3621                l_inventory_item_id_tab,
3622                l_item_category_id_tab,
3623                l_project_role_id_tab,
3624                l_organization_id_tab,
3625                l_fc_res_type_code_tab,
3626                l_expenditure_type_tab,
3627                l_expenditure_category_tab,
3628                l_event_type_tab,
3629                l_revenue_category_code_tab,
3630                l_supplier_id_tab,
3631                l_spread_curve_id_tab,
3632                l_etc_method_code_tab,
3633                l_mfc_cost_type_id_tab,
3634                l_incurred_by_res_flag_tab,
3635                l_incur_by_res_cls_code_tab,
3636                l_incur_by_role_id_tab,
3637                l_unit_of_measure_tab,
3638                l_rate_based_flag_tab,
3639                l_res_rate_based_flag_tab, -- Added for IPM ER
3640                l_rate_expenditure_type_tab,
3641                l_rate_func_curr_code_tab,
3642                l_org_id_tab
3643         FROM   PA_RESOURCE_ASSIGNMENTS RA,
3644                PA_RES_LIST_MAP_TMP4 TMP
3645         WHERE  RA.budget_version_id = p_source_bv_id
3646         AND    RA.resource_assignment_id = TMP.txn_source_id;
3647 
3648         -- Bug 4621901: When the Target is a Revenue-only version and the Revenue
3649         -- Accrual Method is COST, we must enforce that UOM be 'DOLLARS' and the
3650         -- Rate Based Flag be 'N' even if the Source/Target Planning Options match.
3651 
3652         IF l_fp_cols_rec_target.x_version_type = 'REVENUE' AND
3653            l_rev_gen_method = 'C' THEN
3654             FOR i IN 1..l_unit_of_measure_tab.count LOOP
3655                 l_unit_of_measure_tab(i) := 'DOLLARS';
3656                 l_rate_based_flag_tab(i) := 'N';
3657             END LOOP;
3658         END IF;
3659 
3660         FORALL i IN 1..l_tgt_res_asg_id_tab.count
3661             UPDATE PA_RESOURCE_ASSIGNMENTS
3662             SET    RESOURCE_CLASS_FLAG         = l_resource_class_flag_tab(i),
3663                    RESOURCE_CLASS_CODE         = l_resource_class_code_tab(i),
3664                    RES_TYPE_CODE               = l_res_type_code_tab(i),
3665                    PERSON_ID                   = l_person_id_tab(i),
3666                    JOB_ID                      = l_job_id_tab(i),
3667                    PERSON_TYPE_CODE            = l_person_type_code_tab(i),
3668                    NAMED_ROLE                  = l_named_role_tab(i),
3669                    BOM_RESOURCE_ID             = l_bom_resource_id_tab(i),
3670                    NON_LABOR_RESOURCE          = l_non_labor_resource_tab(i),
3671                    INVENTORY_ITEM_ID           = l_inventory_item_id_tab(i),
3672                    ITEM_CATEGORY_ID            = l_item_category_id_tab(i),
3673                    PROJECT_ROLE_ID             = l_project_role_id_tab(i),
3674                    ORGANIZATION_ID             = l_organization_id_tab(i),
3675                    FC_RES_TYPE_CODE            = l_fc_res_type_code_tab(i),
3676                    EXPENDITURE_TYPE            = l_expenditure_type_tab(i),
3677                    EXPENDITURE_CATEGORY        = l_expenditure_category_tab(i),
3678                    EVENT_TYPE                  = l_event_type_tab(i),
3679                    REVENUE_CATEGORY_CODE       = l_revenue_category_code_tab(i),
3680                    SUPPLIER_ID                 = l_supplier_id_tab(i),
3681                    SPREAD_CURVE_ID             = l_spread_curve_id_tab(i),
3682                    ETC_METHOD_CODE             = l_etc_method_code_tab(i),
3683                    MFC_COST_TYPE_ID            = l_mfc_cost_type_id_tab(i),
3684                    INCURRED_BY_RES_FLAG        = l_incurred_by_res_flag_tab(i),
3685                    INCUR_BY_RES_CLASS_CODE     = l_incur_by_res_cls_code_tab(i),
3686                    INCUR_BY_ROLE_ID            = l_incur_by_role_id_tab(i),
3687                    UNIT_OF_MEASURE             = l_unit_of_measure_tab(i),
3688                    RATE_BASED_FLAG             = l_rate_based_flag_tab(i),
3689                    RESOURCE_RATE_BASED_FLAG    = l_res_rate_based_flag_tab(i), -- Added for IPM ER
3690                    RATE_EXPENDITURE_TYPE       = l_rate_expenditure_type_tab(i),
3691                    RATE_EXP_FUNC_CURR_CODE     = l_rate_func_curr_code_tab(i),
3692                    LAST_UPDATE_DATE            = sysdate,
3693                    LAST_UPDATED_BY             = l_last_updated_by,
3694                    LAST_UPDATE_LOGIN           = l_last_update_login,
3695                    RATE_EXPENDITURE_ORG_ID     = l_org_id_tab(i)
3696             WHERE  resource_assignment_id      = l_tgt_res_asg_id_tab(i);
3697 
3698         -- IPM: New Entity ER ------------------------------------------
3699         IF l_calling_context = lc_BudgetGeneration THEN
3700             l_calling_module := 'BUDGET_GENERATION';
3701         ELSIF l_calling_context = lc_ForecastGeneration THEN
3702             l_calling_module := 'FORECAST_GENERATION';
3703         END IF;
3704 
3705         IF l_fp_cols_rec_target.x_gen_ret_manual_line_flag = 'N' THEN
3706 
3707             -- Call the maintenance api in COPY mode
3708             IF p_pa_debug_mode = 'Y' THEN
3709                 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
3710                     P_MSG                   => 'Before calling PA_RES_ASG_CURRENCY_PUB.' ||
3711                                                'MAINTAIN_DATA',
3712                   --P_CALLED_MODE           => p_called_mode,
3713                     P_MODULE_NAME           => l_module_name);
3714             END IF;
3715             PA_RES_ASG_CURRENCY_PUB.MAINTAIN_DATA
3716                   ( P_FP_COLS_REC           => l_fp_cols_rec_target,
3717                     P_CALLING_MODULE        => l_calling_module,
3718                     P_COPY_FLAG             => 'Y',
3719                     P_SRC_VERSION_ID        => p_source_bv_id,
3720                     P_COPY_MODE             => 'COPY_OVERRIDES',
3721                     P_VERSION_LEVEL_FLAG    => 'Y',
3722                   --P_CALLED_MODE           => p_called_mode,
3723                     X_RETURN_STATUS         => x_return_status,
3724                     X_MSG_COUNT             => x_msg_count,
3725                     X_MSG_DATA              => x_msg_data );
3726             IF p_pa_debug_mode = 'Y' THEN
3727                 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
3728                     P_MSG                   => 'After calling PA_RES_ASG_CURRENCY_PUB.' ||
3729                                                'MAINTAIN_DATA: '||x_return_status,
3730                   --P_CALLED_MODE           => p_called_mode,
3731                     P_MODULE_NAME           => l_module_name);
3732             END IF;
3733             IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
3734                 raise PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
3735             END IF;
3736 
3737         ELSIF l_fp_cols_rec_target.x_gen_ret_manual_line_flag = 'Y' THEN
3738 
3739             DELETE pa_resource_asgn_curr_tmp;
3740 
3741             -- Note that while (txn_resource_assignment_id, txn_currency_code) pairs
3742             -- should be distinct in pa_res_list_map_tmp4 because of the one-to-one
3743             -- source/target mapping, (txn_resource_assignment_id) by itself is not
3744             -- guaranteed to be unique. Hence, the DISTINCT keyword is required in the
3745             -- query below.
3746 
3747             -- Also, as per the copy_table_records API specification, when calling
3748             -- the maintenance API in temp table Copy mode, only target ra_id values
3749             -- should be populated in the temp table.
3750 
3751 	    INSERT INTO pa_resource_asgn_curr_tmp
3752 	        ( resource_assignment_id )
3753 	    SELECT DISTINCT txn_resource_assignment_id
3754 	    FROM   pa_res_list_map_tmp4;
3755 
3756             -- Call the maintenance api in COPY mode
3757             IF p_pa_debug_mode = 'Y' THEN
3758                 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
3759                     P_MSG                   => 'Before calling PA_RES_ASG_CURRENCY_PUB.' ||
3760                                                'MAINTAIN_DATA',
3761                   --P_CALLED_MODE           => p_called_mode,
3762                     P_MODULE_NAME           => l_module_name);
3763             END IF;
3764             PA_RES_ASG_CURRENCY_PUB.MAINTAIN_DATA
3765                   ( P_FP_COLS_REC           => l_fp_cols_rec_target,
3766                     P_CALLING_MODULE        => l_calling_module,
3767                     P_COPY_FLAG             => 'Y',
3768                     P_SRC_VERSION_ID        => p_source_bv_id,
3769                     P_COPY_MODE             => 'COPY_OVERRIDES',
3770                     P_VERSION_LEVEL_FLAG    => 'N',
3771                   --P_CALLED_MODE           => p_called_mode,
3772                     X_RETURN_STATUS         => x_return_status,
3773                     X_MSG_COUNT             => x_msg_count,
3774                     X_MSG_DATA              => x_msg_data );
3775             IF p_pa_debug_mode = 'Y' THEN
3776                 PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
3777                     P_MSG                   => 'After calling PA_RES_ASG_CURRENCY_PUB.' ||
3778                                                'MAINTAIN_DATA: '||x_return_status,
3779                   --P_CALLED_MODE           => p_called_mode,
3780                     P_MODULE_NAME           => l_module_name);
3781             END IF;
3782             IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
3783                 raise PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
3784             END IF;
3785 
3786         END IF; -- l_fp_cols_rec_target.x_gen_ret_manual_line_flag check
3787 
3788         -- Ensure that non-billable tasks do not have bill rate overrides
3789         -- in the new entity table by re-Inserting new entity records with
3790         -- existing cost rate overrides but Null bill rate overrides for
3791         -- non-billable tasks.
3792 
3793         IF l_fp_cols_rec_source.x_version_type = 'ALL' AND
3794            l_fp_cols_rec_target.x_version_type IN ('REVENUE','ALL') THEN
3795 
3796             DELETE pa_resource_asgn_curr_tmp;
3797 
3798 	    -- Note: An outer join on pa_tasks is not needed in the query
3799 	    -- below because we are only interested in updating resources
3800 	    -- for non-billable tasks. Project-level tasks that require an
3801 	    -- outer join are always billable.
3802 	    INSERT INTO pa_resource_asgn_curr_tmp
3803 	        ( RESOURCE_ASSIGNMENT_ID,
3804 	          TXN_CURRENCY_CODE,
3805 	          TXN_RAW_COST_RATE_OVERRIDE,
3806 	          TXN_BURDEN_COST_RATE_OVERRIDE )
3807 	    SELECT rbc.resource_assignment_id,
3808 	           rbc.txn_currency_code,
3809 	           rbc.txn_raw_cost_rate_override,
3810 	           rbc.txn_burden_cost_rate_override
3811 	    FROM   pa_resource_asgn_curr rbc
3812 	    WHERE  rbc.budget_version_id = p_target_bv_id
3813 	    AND    rbc.txn_bill_rate_override IS NOT NULL
3814 	    AND EXISTS ( SELECT null
3815 	                 FROM   pa_res_list_map_tmp4 tmp4,
3816 	                        pa_resource_assignments ra,
3817 	                        pa_tasks ta
3818 	                 WHERE  rbc.resource_assignment_id = tmp4.txn_resource_assignment_id
3819 	                 AND    tmp4.txn_resource_assignment_id = ra.resource_assignment_id
3820 	                 AND    ra.task_id = ta.task_id
3821 	                 AND    NVL(ta.billable_flag,'Y') = 'N' );
3822 
3823             l_count := SQL%ROWCOUNT;
3824 
3825             IF l_count > 0 THEN
3826                 -- CALL the maintenance api in INSERT mode
3827                 IF p_pa_debug_mode = 'Y' THEN
3828                     PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
3829                         P_MSG                   => 'Before calling PA_RES_ASG_CURRENCY_PUB.' ||
3830                                                    'MAINTAIN_DATA',
3831                       --P_CALLED_MODE           => p_called_mode,
3832                         P_MODULE_NAME           => l_module_name);
3833                 END IF;
3834                 PA_RES_ASG_CURRENCY_PUB.MAINTAIN_DATA
3835                       ( P_FP_COLS_REC           => l_fp_cols_rec_target,
3836                         P_CALLING_MODULE        => l_calling_module,
3837                         P_VERSION_LEVEL_FLAG    => 'N',
3838                         P_ROLLUP_FLAG           => 'N', -- 'N' indicates Insert
3839                       --P_CALLED_MODE           => p_called_mode,
3840                         X_RETURN_STATUS         => x_return_status,
3841                         X_MSG_COUNT             => x_msg_count,
3842                         X_MSG_DATA              => x_msg_data );
3843                 IF p_pa_debug_mode = 'Y' THEN
3844                     PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
3845                         P_MSG                   => 'After calling PA_RES_ASG_CURRENCY_PUB.' ||
3846                                                    'MAINTAIN_DATA: '||x_return_status,
3847                       --P_CALLED_MODE           => p_called_mode,
3848                         P_MODULE_NAME           => l_module_name);
3849                 END IF;
3850                 IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
3851                     raise PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
3852                 END IF;
3853             END IF; -- IF l_count > 0 THEN
3854         END IF; -- logic to null out bill rate overrides for non-billable tasks
3855         -- END OF IPM: New Entity ER ------------------------------------------
3856 
3857     ELSIF l_same_planning_options_flag = 'N' THEN
3858 
3859         /* In this case, source and target timephase codes match, but one of the
3860          * other planning options do not. As a result, we will map source resources
3861          * to target resources. The budget lines created by this generation process
3862          * may therefore contain ammounts aggregated from source amounts, in which
3863          * case the target spread curve will no longer reflect budget line amounts.
3864          * Hence, we NULL out the spread_curve_id for the target resources. */
3865 
3866         UPDATE pa_resource_assignments
3867         SET    spread_curve_id = NULL,
3868                sp_fixed_date = NULL
3869         WHERE  budget_version_id = p_target_bv_id
3870         AND EXISTS
3871             ( SELECT /*+ INDEX(tmp,PA_RES_LIST_MAP_TMP4_N2)*/ 1
3872               FROM   pa_res_list_map_tmp4 tmp
3873               WHERE  tmp.txn_resource_assignment_id = resource_assignment_id
3874               AND    rownum = 1 );
3875 
3876     END IF; -- end updating resource assignment attributes
3877 
3878 
3879     /*source multi currency flag     target multi currency flag currency code used
3880         N                               N                               proj
3881         Y                               N                               proj
3882         N                               Y                               txn
3883         Y                               Y                               txn
3884       l_txn_currency_flag is 'Y' means we use txn_currency_code
3885       l_txn_currency_flag is 'N' means we use proj_currency_code
3886       l_txn_currency_flag is 'A' means we use projfunc_currency_code
3887      */
3888     SELECT NVL(APPROVED_COST_PLAN_TYPE_FLAG, 'N'),
3889            NVL(APPROVED_REV_PLAN_TYPE_FLAG, 'N')
3890            INTO
3891            l_appr_cost_plan_type_flag,
3892            l_appr_rev_plan_type_flag
3893     FROM PA_BUDGET_VERSIONS
3894     WHERE BUDGET_VERSION_ID = l_fp_cols_rec_target.x_budget_version_id;
3895 
3896     /* When the Calling Context is Forecast generation and we set l_txn_currency_flag
3897      * to 'A', we are really considering the case when the Source version is a Cost
3898      * forecast and the Target version is Revenue because this is the only case in
3899      * which we call this procedure from the forecast generation wrapper API. If this
3900      * premise changes, then this condition will need to be modified accordingly. */
3901     IF ((l_fp_cols_rec_target.x_version_type = 'ALL' OR
3902          l_fp_cols_rec_target.x_version_type = 'REVENUE') AND
3903         (l_appr_cost_plan_type_flag = 'Y' OR l_appr_rev_plan_type_flag = 'Y')) OR
3904         (l_calling_context = lc_BudgetGeneration AND l_rev_gen_method = 'C' AND
3905          l_fp_cols_rec_target.x_version_type = 'REVENUE') OR
3906         l_calling_context = lc_ForecastGeneration THEN
3907         l_txn_currency_flag := 'A';
3908     ELSIF l_fp_cols_rec_target.x_plan_in_multi_curr_flag = 'N' THEN
3909         l_txn_currency_flag := 'N';
3910     END IF;
3911 
3912     -- Bug 4057108: Order of pl/sql tables in the FETCH statement was reversed;
3913     -- pc tables now placed before pfc tables for both of the cursors below.
3914     /* Fetch data from the appropriate cursor based on the Calling Context:
3915      *   'BUDGET_GENERATION'   => use the budget_line_src_tgt cursor.
3916      *   'FORECAST_GENERATION' => use the fcst_budget_line_src_tgt cursor. */
3917     IF l_calling_context = lc_BudgetGeneration  THEN
3918                --Start Changes Bug 6411406
3919         IF l_fp_cols_rec_target.x_time_phased_code = 'N' THEN
3920           OPEN budget_line_src_tgt_none (l_fp_cols_rec_target.x_project_currency_code,
3921                                     l_fp_cols_rec_target.x_projfunc_currency_code);
3922           FETCH budget_line_src_tgt_none
3923           BULK COLLECT
3924           INTO l_tgt_res_asg_id_tab,
3925                l_tgt_rate_based_flag_tab,
3926                l_start_date_tab,
3927                l_end_date_tab,
3928                l_periiod_name_tab,
3929                l_txn_currency_code_tab,
3930                l_src_quantity_tab,
3931                l_txn_raw_cost_tab,
3932                l_txn_brdn_cost_tab,
3933                l_txn_revenue_tab,
3934                l_unrounded_txn_raw_cost_tab,
3935                l_unrounded_txn_brdn_cost_tab,
3936                l_unrounded_txn_revenue_tab,
3937                l_pc_raw_cost_tab,
3938                l_pc_brdn_cost_tab,
3939                l_pc_revenue_tab,
3940                l_pfc_raw_cost_tab,
3941                l_pfc_brdn_cost_tab,
3942                l_pfc_revenue_tab,
3943                l_cost_rate_override_tab,
3944                l_b_cost_rate_override_tab,
3945                l_bill_rate_override_tab,
3946                l_billable_flag_tab,
3947 		 l_markup_percent_tab; -- Bug #13552225
3948           CLOSE budget_line_src_tgt_none;
3949         ELSE
3950 
3951         OPEN budget_line_src_tgt (l_fp_cols_rec_target.x_project_currency_code,
3952                                   l_fp_cols_rec_target.x_projfunc_currency_code);
3953         FETCH budget_line_src_tgt
3954         BULK COLLECT
3955         INTO l_tgt_res_asg_id_tab,
3956              l_tgt_rate_based_flag_tab,
3957              l_start_date_tab,
3958              l_end_date_tab,
3959              l_periiod_name_tab,
3960              l_txn_currency_code_tab,
3961              l_src_quantity_tab,
3962              l_txn_raw_cost_tab,
3963              l_txn_brdn_cost_tab,
3964              l_txn_revenue_tab,
3965              l_unrounded_txn_raw_cost_tab,
3966              l_unrounded_txn_brdn_cost_tab,
3967              l_unrounded_txn_revenue_tab,
3968              l_pc_raw_cost_tab,
3969              l_pc_brdn_cost_tab,
3970              l_pc_revenue_tab,
3971              l_pfc_raw_cost_tab,
3972              l_pfc_brdn_cost_tab,
3973              l_pfc_revenue_tab,
3974              l_cost_rate_override_tab,
3975              l_b_cost_rate_override_tab,
3976              l_bill_rate_override_tab,
3977              l_billable_flag_tab,           /* Added for ER 4376722 */
3978              l_markup_percent_tab;          /* Added for Bug 5166047 */
3979         CLOSE budget_line_src_tgt;
3980 	END IF;
3981         --End Changes Bug 6411406
3982 
3983     ELSIF l_calling_context = lc_ForecastGeneration AND
3984           l_fp_cols_rec_source.x_time_phased_code IN ('P','G') THEN
3985         OPEN fcst_budget_line_src_tgt
3986              (l_fp_cols_rec_target.x_project_currency_code,
3987               l_fp_cols_rec_target.x_projfunc_currency_code,
3988               l_fp_cols_rec_source.x_time_phased_code);
3989         FETCH fcst_budget_line_src_tgt
3990         BULK COLLECT
3991         INTO l_tgt_res_asg_id_tab,
3992              l_tgt_rate_based_flag_tab,
3993              l_start_date_tab,
3994              l_end_date_tab,
3995              l_periiod_name_tab,
3996              l_txn_currency_code_tab,
3997              l_src_quantity_tab,
3998              l_txn_raw_cost_tab,
3999              l_txn_brdn_cost_tab,
4000              l_txn_revenue_tab,
4001              l_unrounded_txn_raw_cost_tab,
4002              l_unrounded_txn_brdn_cost_tab,
4003              l_unrounded_txn_revenue_tab,
4004              l_pc_raw_cost_tab,
4005              l_pc_brdn_cost_tab,
4006              l_pc_revenue_tab,
4007              l_pfc_raw_cost_tab,
4008              l_pfc_brdn_cost_tab,
4009              l_pfc_revenue_tab,
4010              l_cost_rate_override_tab,
4011              l_b_cost_rate_override_tab,
4012              l_bill_rate_override_tab,
4013              l_billable_flag_tab,           /* Added for ER 4376722 */
4014              l_markup_percent_tab;          /* Added for Bug 5166047 */
4015         CLOSE fcst_budget_line_src_tgt;
4016     ELSIF l_calling_context = lc_ForecastGeneration AND
4017           l_fp_cols_rec_source.x_time_phased_code = 'N' THEN
4018         OPEN fcst_budget_line_src_tgt_none
4019              (l_fp_cols_rec_target.x_project_currency_code,
4020               l_fp_cols_rec_target.x_projfunc_currency_code,
4021               l_fp_cols_rec_source.x_time_phased_code);
4022         FETCH fcst_budget_line_src_tgt_none
4023         BULK COLLECT
4024         INTO l_tgt_res_asg_id_tab,
4025              l_tgt_rate_based_flag_tab,
4026              l_start_date_tab,
4027              l_end_date_tab,
4028              l_periiod_name_tab,
4029              l_txn_currency_code_tab,
4030              l_src_quantity_tab,
4031              l_txn_raw_cost_tab,
4032              l_txn_brdn_cost_tab,
4033              l_txn_revenue_tab,
4034              l_unrounded_txn_raw_cost_tab,
4035              l_unrounded_txn_brdn_cost_tab,
4036              l_unrounded_txn_revenue_tab,
4037              l_pc_raw_cost_tab,
4038              l_pc_brdn_cost_tab,
4039              l_pc_revenue_tab,
4040              l_pfc_raw_cost_tab,
4041              l_pfc_brdn_cost_tab,
4042              l_pfc_revenue_tab,
4043              l_cost_rate_override_tab,
4044              l_b_cost_rate_override_tab,
4045              l_bill_rate_override_tab,
4046              l_billable_flag_tab,           /* Added for ER 4376722 */
4047              l_markup_percent_tab;          /* Added for Bug 5166047 */
4048         CLOSE fcst_budget_line_src_tgt_none;
4049     END IF; -- context-based data fetching
4050 
4051     -- Stop processing if no budget line data is fetched.
4052     IF l_tgt_res_asg_id_tab.count <= 0 THEN
4053         IF P_PA_DEBUG_MODE = 'Y' THEN
4054             PA_DEBUG.RESET_CURR_FUNCTION;
4055         END IF;
4056         RETURN;
4057     END IF; -- l_tgt_res_asg_id_tab.count <= 0
4058 
4059     /*Please refer to document: How to derive the rate*/
4060     l_source_version_type := l_fp_cols_rec_source.x_version_type;
4061     l_target_version_type := l_fp_cols_rec_target.x_version_type;
4062 
4063     /* ER 4376722:
4064      * When the Target is a Revenue-only Budget:
4065      * A) Do not generate quantity or amounts for non-billable tasks.
4066      * When the Target is a Revenue-only Forecast:
4067      * B) Do not generate quantity or amounts for non-rate-based
4068      *    resources of non-billable tasks.
4069      * C) Generate quantity but not amounts for rate-based resources
4070      *    of non-billable tasks.
4071      *
4072      * The simple algorithm to do (A) and (B) is as follows:
4073      * 0. Clear out any data in the _tmp_ tables.
4074      * 1. Copy records into _tmp_ tables for
4075      * a) billable tasks when the context is Budget Generation
4076      * b) billable tasks when the context is Forecast Generation
4077      * c) rate-based resources of non-billable tasks when the
4078      *    context is Forecast Generation
4079      * 2. Copy records from _tmp_ tables back to non-temporary tables.
4080      *
4081      * The result is that, afterwards, we do not process non-billable
4082      * task records in the Budget Generation context, and we do not
4083      * process non-rate-based resources of non-billable tasks in the
4084      * Forecast Generation Context. Hence, quantity and amounts for
4085      * those resources will not be generated.
4086      *
4087      * Note that case (C) is handled later at the end of the
4088      * Forecast Generation logic.
4089      **/
4090 
4091     IF l_target_version_type = 'REVENUE' THEN
4092 
4093         -- 0. Clear out any data in the _tmp_ tables.
4094 	l_tmp_tgt_res_asg_id_tab.delete;
4095 	l_tmp_tgt_rate_based_flag_tab.delete;
4096 	l_tmp_start_date_tab.delete;
4097 	l_tmp_end_date_tab.delete;
4098 	l_tmp_periiod_name_tab.delete;
4099 	l_tmp_txn_currency_code_tab.delete;
4100 	l_tmp_src_quantity_tab.delete;
4101 	l_tmp_txn_raw_cost_tab.delete;
4102 	l_tmp_txn_brdn_cost_tab.delete;
4103 	l_tmp_txn_revenue_tab.delete;
4104 	l_tmp_unr_txn_raw_cost_tab.delete;
4105 	l_tmp_unr_txn_brdn_cost_tab.delete;
4106 	l_tmp_unr_txn_revenue_tab.delete;
4107 	l_tmp_pc_raw_cost_tab.delete;
4108 	l_tmp_pc_brdn_cost_tab.delete;
4109 	l_tmp_pc_revenue_tab.delete;
4110 	l_tmp_pfc_raw_cost_tab.delete;
4111 	l_tmp_pfc_brdn_cost_tab.delete;
4112 	l_tmp_pfc_revenue_tab.delete;
4113 	l_tmp_cost_rate_override_tab.delete;
4114 	l_tmp_bcost_rate_override_tab.delete;
4115 	l_tmp_bill_rate_override_tab.delete;
4116 	l_tmp_billable_flag_tab.delete;
4117 	l_tmp_markup_percent_tab.delete; -- Added for Bug 5166047
4118 
4119         -- 1. Copy records into _tmp_ tables for
4120         -- a) billable tasks when the context is Budget Generation
4121         -- b) billable tasks when the context is Forecast Generation
4122         -- c) rate-based resources of non-billable tasks when the
4123         --    context is Forecast Generation
4124         l_tmp_index := 0;
4125         FOR i IN 1..l_tgt_res_asg_id_tab.count LOOP
4126             IF ( l_calling_context = lc_BudgetGeneration AND
4127                  l_billable_flag_tab(i) = 'Y' ) OR
4128                ( l_calling_context = lc_ForecastGeneration AND
4129                  ( l_billable_flag_tab(i) = 'Y' OR
4130                  ( l_billable_flag_tab(i) = 'N' AND l_tgt_rate_based_flag_tab(i) = 'Y' ))) THEN
4131 
4132                 l_tmp_index := l_tmp_index + 1;
4133                 l_tmp_tgt_res_asg_id_tab(l_tmp_index)      := l_tgt_res_asg_id_tab(i);
4134                 l_tmp_tgt_rate_based_flag_tab(l_tmp_index) := l_tgt_rate_based_flag_tab(i);
4135                 l_tmp_start_date_tab(l_tmp_index)          := l_start_date_tab(i);
4136                 l_tmp_end_date_tab(l_tmp_index)            := l_end_date_tab(i);
4137                 l_tmp_periiod_name_tab(l_tmp_index)        := l_periiod_name_tab(i);
4138                 l_tmp_txn_currency_code_tab(l_tmp_index)   := l_txn_currency_code_tab(i);
4139                 l_tmp_src_quantity_tab(l_tmp_index)        := l_src_quantity_tab(i);
4140                 l_tmp_txn_raw_cost_tab(l_tmp_index)        := l_txn_raw_cost_tab(i);
4141                 l_tmp_txn_brdn_cost_tab(l_tmp_index)       := l_txn_brdn_cost_tab(i);
4142                 l_tmp_txn_revenue_tab(l_tmp_index)         := l_txn_revenue_tab(i);
4143                 l_tmp_unr_txn_raw_cost_tab(l_tmp_index)    := l_unrounded_txn_raw_cost_tab(i);
4144                 l_tmp_unr_txn_brdn_cost_tab(l_tmp_index)   := l_unrounded_txn_brdn_cost_tab(i);
4145                 l_tmp_unr_txn_revenue_tab(l_tmp_index)     := l_unrounded_txn_revenue_tab(i);
4146                 l_tmp_pc_raw_cost_tab(l_tmp_index)         := l_pc_raw_cost_tab(i);
4147                 l_tmp_pc_brdn_cost_tab(l_tmp_index)        := l_pc_brdn_cost_tab(i);
4148                 l_tmp_pc_revenue_tab(l_tmp_index)          := l_pc_revenue_tab(i);
4149                 l_tmp_pfc_raw_cost_tab(l_tmp_index)        := l_pfc_raw_cost_tab(i);
4150                 l_tmp_pfc_brdn_cost_tab(l_tmp_index)       := l_pfc_brdn_cost_tab(i);
4151                 l_tmp_pfc_revenue_tab(l_tmp_index)         := l_pfc_revenue_tab(i);
4152                 l_tmp_cost_rate_override_tab(l_tmp_index)  := l_cost_rate_override_tab(i);
4153                 l_tmp_bcost_rate_override_tab(l_tmp_index) := l_b_cost_rate_override_tab(i);
4154                 l_tmp_bill_rate_override_tab(l_tmp_index)  := l_bill_rate_override_tab(i);
4155                 l_tmp_billable_flag_tab(l_tmp_index)       := l_billable_flag_tab(i);
4156                 l_tmp_markup_percent_tab(l_tmp_index)      := l_markup_percent_tab(i); -- Added for Bug 5166047
4157 
4158             END IF;
4159         END LOOP;
4160 
4161         -- 2. Copy records from _tmp_ tables back to non-temporary tables.
4162         l_tgt_res_asg_id_tab          := l_tmp_tgt_res_asg_id_tab;
4163         l_tgt_rate_based_flag_tab     := l_tmp_tgt_rate_based_flag_tab;
4164         l_start_date_tab              := l_tmp_start_date_tab;
4165         l_end_date_tab                := l_tmp_end_date_tab;
4166         l_periiod_name_tab            := l_tmp_periiod_name_tab;
4167         l_txn_currency_code_tab       := l_tmp_txn_currency_code_tab;
4168         l_src_quantity_tab            := l_tmp_src_quantity_tab;
4169         l_txn_raw_cost_tab            := l_tmp_txn_raw_cost_tab;
4170         l_txn_brdn_cost_tab           := l_tmp_txn_brdn_cost_tab;
4171         l_txn_revenue_tab             := l_tmp_txn_revenue_tab;
4172         l_unrounded_txn_raw_cost_tab  := l_tmp_unr_txn_raw_cost_tab;
4173         l_unrounded_txn_brdn_cost_tab := l_tmp_unr_txn_brdn_cost_tab;
4174         l_unrounded_txn_revenue_tab   := l_tmp_unr_txn_revenue_tab;
4175         l_pc_raw_cost_tab             := l_tmp_pc_raw_cost_tab;
4176         l_pc_brdn_cost_tab            := l_tmp_pc_brdn_cost_tab;
4177         l_pc_revenue_tab              := l_tmp_pc_revenue_tab;
4178         l_pfc_raw_cost_tab            := l_tmp_pfc_raw_cost_tab;
4179         l_pfc_brdn_cost_tab           := l_tmp_pfc_brdn_cost_tab;
4180         l_pfc_revenue_tab             := l_tmp_pfc_revenue_tab;
4181         l_cost_rate_override_tab      := l_tmp_cost_rate_override_tab;
4182         l_b_cost_rate_override_tab    := l_tmp_bcost_rate_override_tab;
4183         l_bill_rate_override_tab      := l_tmp_bill_rate_override_tab;
4184         l_billable_flag_tab           := l_tmp_billable_flag_tab;
4185         l_markup_percent_tab          := l_tmp_markup_percent_tab; -- Added for Bug 5166047
4186 
4187         -- Stop processing if no data remains (ie. all the tasks were non-billable).
4188         IF l_tgt_res_asg_id_tab.count <= 0 THEN
4189             IF P_PA_DEBUG_MODE = 'Y' THEN
4190                 PA_DEBUG.RESET_CURR_FUNCTION;
4191             END IF;
4192             RETURN;
4193         END IF; -- l_tgt_res_asg_id_tab.count <= 0
4194 
4195     END IF; -- ER 4376722 billability logic for REVENUE versions
4196 
4197     l_remove_records_flag := 'N';
4198     -- Initialize l_remove_record_flag_tab
4199     FOR i in 1..l_tgt_res_asg_id_tab.count LOOP
4200         l_remove_record_flag_tab(i) := 'N';
4201     END LOOP;
4202 
4203     /* We split up the generation logic here based on whether the Calling Context
4204      * indicates we are performing budget generation or forecast generation. */
4205     IF l_calling_context = lc_BudgetGeneration  THEN
4206         IF l_source_version_type = 'COST' AND l_target_version_type = 'COST' THEN
4207             FOR i in 1..l_tgt_res_asg_id_tab.count LOOP
4208                 l_override_quantity := l_src_quantity_tab(i);
4209                 IF l_tgt_rate_based_flag_tab(i) = 'N' AND
4210                    NOT( l_wp_track_cost_flag = 'N' AND
4211                         l_gen_src_code = lc_WorkPlanSrcCode ) THEN
4212                     l_src_quantity_tab(i):= l_txn_raw_cost_tab(i);
4213                     l_override_quantity := l_unrounded_txn_raw_cost_tab(i);
4214                 END IF;
4215                 IF l_override_quantity <> 0 THEN
4216                     l_cost_rate_override_tab(i)   := l_unrounded_txn_raw_cost_tab(i) / l_override_quantity;
4217                     l_b_cost_rate_override_tab(i) := l_unrounded_txn_brdn_cost_tab(i) / l_override_quantity;
4218                     IF l_tgt_rate_based_flag_tab(i) = 'N' THEN
4219                         l_cost_rate_override_tab(i) := 1;
4220                     END IF;
4221                 END IF;
4222             END LOOP;
4223         ELSIF l_source_version_type = 'COST' AND
4224               l_target_version_type = 'REVENUE' AND
4225               l_rev_gen_method = 'T' THEN
4226             FOR i in 1..l_tgt_res_asg_id_tab.count LOOP
4227                 l_override_quantity := l_src_quantity_tab(i);
4228                 IF l_tgt_rate_based_flag_tab(i) = 'N' AND
4229                    NOT( l_wp_track_cost_flag = 'N' AND
4230                         l_gen_src_code = lc_WorkPlanSrcCode ) THEN
4231                     l_src_quantity_tab(i):= l_txn_raw_cost_tab(i); --???
4232                     l_override_quantity := l_unrounded_txn_raw_cost_tab(i);
4233                     -- updated by dkuo
4234                     -- Bug 4568011: Commented out revenue and bill rate override
4235                     -- pl/sql table assignments so that the Calculate API will
4236                     -- compute revenue amounts.
4237                     -- l_txn_revenue_tab(i) := l_txn_raw_cost_tab(i);
4238                     -- l_bill_rate_override_tab(i) := 1;
4239                     -- l_pfc_revenue_tab(i) := l_pfc_raw_cost_tab(i);
4240                     -- l_pc_revenue_tab(i) := l_pc_raw_cost_tab(i);
4241                 END IF;
4242                 IF l_src_quantity_tab(i) <> 0 THEN
4243                     l_cost_rate_override_tab(i) := l_unrounded_txn_raw_cost_tab(i) / l_override_quantity;
4244                     l_b_cost_rate_override_tab(i) := l_unrounded_txn_brdn_cost_tab(i) / l_override_quantity;
4245                     IF l_tgt_rate_based_flag_tab(i) = 'N' THEN
4246                         l_cost_rate_override_tab(i) := 1;
4247                     END IF;
4248                 END IF;
4249                 l_txn_raw_cost_tab(i) := NULL;
4250                 l_txn_brdn_cost_tab(i) := NULL;
4251             END LOOP;
4252         ELSIF l_source_version_type = 'COST' AND
4253               l_target_version_type = 'REVENUE' AND
4254               l_rev_gen_method = 'C' THEN
4255             FOR i in 1..l_tgt_res_asg_id_tab.count LOOP
4256                 l_src_quantity_tab(i):= l_txn_brdn_cost_tab(i);
4257                 l_txn_revenue_tab(i) := l_txn_brdn_cost_tab(i);
4258                 l_txn_raw_cost_tab(i) := NULL;
4259                 l_txn_brdn_cost_tab(i) := NULL;
4260                 l_bill_rate_override_tab(i) := 1;
4261                 l_pfc_revenue_tab(i) := l_pfc_brdn_cost_tab(i);
4262                 l_pc_revenue_tab(i) := l_pc_brdn_cost_tab(i);
4263             END LOOP;
4264         ELSIF l_source_version_type = 'COST' AND
4265               l_target_version_type = 'REVENUE' AND
4266               l_rev_gen_method = 'E' THEN
4267             /*Revenue is only based on billing events, which is handled seperately*/
4268             l_dummy := 1;
4269             IF P_PA_DEBUG_MODE = 'Y' THEN
4270                 PA_DEBUG.RESET_CURR_FUNCTION;
4271             END IF;
4272             RETURN;
4273         ELSIF l_source_version_type = 'COST' AND
4274               l_target_version_type = 'ALL' AND
4275               l_rev_gen_method = 'T' THEN
4276             FOR i in 1..l_tgt_res_asg_id_tab.count LOOP
4277                 l_override_quantity := l_src_quantity_tab(i);
4278                 IF l_tgt_rate_based_flag_tab(i) = 'N' AND
4279                    NOT( l_wp_track_cost_flag = 'N' AND
4280                         l_gen_src_code = lc_WorkPlanSrcCode ) THEN
4281                     l_src_quantity_tab(i):= l_txn_raw_cost_tab(i);
4282                     l_override_quantity := l_unrounded_txn_raw_cost_tab(i);
4283                 END IF;
4284                 IF l_override_quantity <> 0 THEN
4285                     l_cost_rate_override_tab(i) := l_unrounded_txn_raw_cost_tab(i) / l_override_quantity;
4286                     l_b_cost_rate_override_tab(i) := l_unrounded_txn_brdn_cost_tab(i) / l_override_quantity;
4287                     IF l_tgt_rate_based_flag_tab(i) = 'N' THEN
4288                         l_cost_rate_override_tab(i) := 1;
4289                     END IF;
4290                 END IF;
4291             END LOOP;
4292         ELSIF l_source_version_type = 'COST' AND
4293               l_target_version_type = 'ALL' AND
4294               l_rev_gen_method = 'C' THEN
4295             FOR i in 1..l_tgt_res_asg_id_tab.count LOOP
4296                 l_override_quantity := l_src_quantity_tab(i);
4297                 IF l_tgt_rate_based_flag_tab(i) = 'N' AND
4298                    NOT( l_wp_track_cost_flag = 'N' AND
4299                         l_gen_src_code = lc_WorkPlanSrcCode ) THEN
4300                     l_src_quantity_tab(i):= l_txn_raw_cost_tab(i);
4301                     l_override_quantity := l_unrounded_txn_raw_cost_tab(i);
4302                 END IF;
4303                 IF l_override_quantity <> 0 THEN
4304                     l_cost_rate_override_tab(i) := l_unrounded_txn_raw_cost_tab(i) / l_override_quantity;
4305                     l_b_cost_rate_override_tab(i) := l_unrounded_txn_brdn_cost_tab(i) / l_override_quantity;
4306                     IF l_tgt_rate_based_flag_tab(i) = 'N' THEN
4307                         l_cost_rate_override_tab(i) := 1;
4308                     END IF;
4309                 END IF;
4310             END LOOP;
4311         ELSIF l_source_version_type = 'COST' AND
4312               l_target_version_type = 'ALL' AND
4313               l_rev_gen_method = 'E' THEN
4314             FOR i in 1..l_tgt_res_asg_id_tab.count LOOP
4315                 l_override_quantity := l_src_quantity_tab(i);
4316                 IF l_tgt_rate_based_flag_tab(i) = 'N' AND
4317                    NOT( l_wp_track_cost_flag = 'N' AND
4318                         l_gen_src_code = lc_WorkPlanSrcCode ) THEN
4319                     l_src_quantity_tab(i):= l_txn_raw_cost_tab(i);
4320                     l_override_quantity := l_unrounded_txn_raw_cost_tab(i);
4321                 END IF;
4322                 IF l_override_quantity <> 0 THEN
4323                     l_cost_rate_override_tab(i) := l_unrounded_txn_raw_cost_tab(i) / l_override_quantity;
4324                     l_b_cost_rate_override_tab(i) := l_unrounded_txn_brdn_cost_tab(i) / l_override_quantity;
4325                     IF l_tgt_rate_based_flag_tab(i) = 'N' THEN
4326                         l_cost_rate_override_tab(i) := 1;
4327                     END IF;
4328                 END IF;
4329             END LOOP;
4330             /*Revenue is only based on billing events, which is handled seperately*/
4331 ---============================================================================
4332         ELSIF l_source_version_type = 'REVENUE' AND l_target_version_type = 'COST' THEN
4333             FOR i in 1..l_tgt_res_asg_id_tab.count LOOP
4334                 IF  l_tgt_rate_based_flag_tab(i) = 'N' THEN
4335                     l_src_quantity_tab(i):= l_txn_revenue_tab(i); --???
4336                 END IF;
4337                 l_txn_revenue_tab(i) := NULL;
4338             END LOOP;
4339         ELSIF l_source_version_type = 'REVENUE' AND
4340               l_target_version_type = 'REVENUE' AND
4341               l_rev_gen_method = 'T' THEN
4342             FOR i in 1..l_tgt_res_asg_id_tab.count LOOP
4343                 l_override_quantity := l_src_quantity_tab(i);
4344                 IF  l_tgt_rate_based_flag_tab(i) = 'N' THEN
4345                     l_src_quantity_tab(i):= l_txn_revenue_tab(i);
4346                     l_override_quantity := l_unrounded_txn_revenue_tab(i);
4347                 END IF;
4348                 IF l_override_quantity <> 0 THEN
4349                     l_bill_rate_override_tab(i) := l_unrounded_txn_revenue_tab(i) / l_override_quantity;
4350                 END IF;
4351             END LOOP;
4352         ELSIF l_source_version_type = 'REVENUE' AND
4353               l_target_version_type = 'REVENUE' AND
4354               l_rev_gen_method = 'C' THEN
4355             /*This is invalid operation, had been handled at the beginning of process*/
4356             l_dummy := 1;
4357             IF P_PA_DEBUG_MODE = 'Y' THEN
4358                 PA_DEBUG.RESET_CURR_FUNCTION;
4359             END IF;
4360             RETURN;
4361         ELSIF l_source_version_type = 'REVENUE' AND
4362               l_target_version_type = 'REVENUE' AND
4363               l_rev_gen_method = 'E' THEN
4364             /*Revenue is only based on billing events, which is handled seperately*/
4365             l_dummy := 1;
4366             IF P_PA_DEBUG_MODE = 'Y' THEN
4367                 PA_DEBUG.RESET_CURR_FUNCTION;
4368             END IF;
4369             RETURN;
4370         ELSIF l_source_version_type = 'REVENUE' AND
4371               l_target_version_type = 'ALL' AND
4372               l_rev_gen_method = 'T' THEN
4373             FOR i in 1..l_tgt_res_asg_id_tab.count LOOP
4374                 l_override_quantity := l_src_quantity_tab(i);
4375                 IF  l_tgt_rate_based_flag_tab(i) = 'N' THEN
4376                     l_src_quantity_tab(i):= l_txn_revenue_tab(i);
4377                     l_override_quantity := l_unrounded_txn_revenue_tab(i);
4378                 END IF;
4379                 IF l_override_quantity <> 0 THEN
4380                     l_bill_rate_override_tab(i) := l_unrounded_txn_revenue_tab(i) / l_src_quantity_tab(i);
4381                 END IF;
4382             END LOOP;
4383         ELSIF l_source_version_type = 'REVENUE' AND
4384               l_target_version_type = 'ALL' AND
4385               l_rev_gen_method = 'C' THEN
4386             /*This is invalid operation, had been handled at the beginning of process*/
4387             l_dummy := 1;
4388             IF P_PA_DEBUG_MODE = 'Y' THEN
4389                 PA_DEBUG.RESET_CURR_FUNCTION;
4390             END IF;
4391             RETURN;
4392         ELSIF l_source_version_type = 'REVENUE' AND
4393               l_target_version_type = 'ALL' AND
4394               l_rev_gen_method = 'E' THEN
4395             FOR i in 1..l_tgt_res_asg_id_tab.count LOOP
4396                 IF  l_tgt_rate_based_flag_tab(i) = 'N' THEN
4397                     l_src_quantity_tab(i):= l_txn_revenue_tab(i); --???
4398                 END IF;
4399                 l_txn_revenue_tab(i) := NULL;
4400             END LOOP;
4401             /*Revenue is only based on billing events, which is handled seperately*/
4402 --============================================================================
4403         ELSIF l_source_version_type = 'ALL' AND l_target_version_type = 'COST' THEN
4404             FOR i in 1..l_tgt_res_asg_id_tab.count LOOP
4405                 l_override_quantity := l_src_quantity_tab(i);
4406                 IF l_tgt_rate_based_flag_tab(i) = 'N' THEN
4407                     l_src_quantity_tab(i):= l_txn_raw_cost_tab(i);
4408                     l_override_quantity := l_unrounded_txn_raw_cost_tab(i);
4409                 END IF;
4410                 l_txn_revenue_tab(i) := NULL;
4411                 IF l_override_quantity <> 0 THEN
4412                     l_cost_rate_override_tab(i) := l_unrounded_txn_raw_cost_tab(i) / l_override_quantity;
4413                     l_b_cost_rate_override_tab(i) := l_unrounded_txn_brdn_cost_tab(i) / l_override_quantity;
4414                 ELSE -- Added for IPM
4415                     l_remove_record_flag_tab(i) := 'Y';
4416                     l_remove_records_flag := 'Y';
4417                 END IF;
4418             END LOOP;
4419         ELSIF l_source_version_type = 'ALL' AND
4420               l_target_version_type = 'REVENUE' AND
4421               l_rev_gen_method = 'T' THEN
4422             FOR i in 1..l_tgt_res_asg_id_tab.count LOOP
4423 
4424                 -- Bug 4568011: When Source revenue amounts exist, the
4425                 -- Calculate API should honor those amounts instead of
4426                 -- computing revenue amounts. For this to happen, the
4427                 -- REVENUE_BILL_RATE column of the PA_FP_GEN_RATE_TMP
4428                 -- table needs to be populated with the bill rate override.
4429                 -- Likewise, when Source revenue amounts do not exist,
4430                 -- the Calculate API should compute revenue amounts. In
4431                 -- this case, the bill rate override should be NULL.
4432 
4433                 l_override_quantity := l_src_quantity_tab(i);
4434                 IF l_tgt_rate_based_flag_tab(i) = 'N' THEN
4435                     IF l_txn_revenue_tab(i) IS NOT NULL THEN
4436                         l_src_quantity_tab(i):= l_txn_revenue_tab(i);
4437                         l_override_quantity := l_unrounded_txn_revenue_tab(i);
4438                     ELSE
4439                         l_src_quantity_tab(i):= l_txn_raw_cost_tab(i);
4440                         l_override_quantity := l_unrounded_txn_raw_cost_tab(i);
4441                     END IF;
4442                 END IF;
4443                 l_txn_raw_cost_tab(i) := NULL;
4444                 l_txn_brdn_cost_tab(i) := NULL;
4445                 IF l_override_quantity <> 0 THEN
4446                     l_cost_rate_override_tab(i) := l_unrounded_txn_raw_cost_tab(i) / l_override_quantity;
4447                     l_b_cost_rate_override_tab(i) := l_unrounded_txn_brdn_cost_tab(i) / l_override_quantity;
4448                     l_bill_rate_override_tab(i) := l_unrounded_txn_revenue_tab(i) / l_override_quantity;
4449                 ELSE -- Added for IPM
4450                     l_remove_record_flag_tab(i) := 'Y';
4451                     l_remove_records_flag := 'Y';
4452                 END IF;
4453             END LOOP;
4454         ELSIF l_source_version_type = 'ALL' AND
4455               l_target_version_type = 'REVENUE' AND
4456               l_rev_gen_method = 'C' THEN
4457             FOR i in 1..l_tgt_res_asg_id_tab.count LOOP
4458                 l_src_quantity_tab(i):= l_txn_brdn_cost_tab(i);
4459                 l_txn_revenue_tab(i) := l_txn_brdn_cost_tab(i);
4460                 l_txn_raw_cost_tab(i) := NULL;
4461                 l_txn_brdn_cost_tab(i) := NULL;
4462                 l_bill_rate_override_tab(i) := 1;
4463                 l_pfc_revenue_tab(i) := l_pfc_brdn_cost_tab(i);
4464                 l_pc_revenue_tab(i) := l_pc_brdn_cost_tab(i);
4465                 -- Added for IPM
4466                 IF nvl(l_src_quantity_tab(i),0) = 0 THEN
4467                     l_remove_record_flag_tab(i) := 'Y';
4468                     l_remove_records_flag := 'Y';
4469                 END IF;
4470             END LOOP;
4471         ELSIF l_source_version_type = 'ALL' AND
4472               l_target_version_type = 'REVENUE' AND
4473               l_rev_gen_method = 'E' THEN
4474             /*Revenue is only based on billing events, which is handled seperately*/
4475             l_dummy := 1;
4476             IF P_PA_DEBUG_MODE = 'Y' THEN
4477                 PA_DEBUG.RESET_CURR_FUNCTION;
4478             END IF;
4479             RETURN;
4480         ELSIF l_source_version_type = 'ALL' AND
4481               l_target_version_type = 'ALL' AND
4482               l_rev_gen_method = 'T' THEN
4483             FOR i in 1..l_tgt_res_asg_id_tab.count LOOP
4484                 l_override_quantity := l_src_quantity_tab(i);
4485                 IF l_tgt_rate_based_flag_tab(i) = 'N' THEN
4486                     -- Modified for IPM
4487                     IF nvl(l_txn_raw_cost_tab(i),0) = 0 THEN
4488                         -- Source is a revenue-only txn (qty = rev).
4489                         l_src_quantity_tab(i):= l_txn_revenue_tab(i);
4490                         l_override_quantity := l_unrounded_txn_revenue_tab(i);
4491                     ELSE
4492                         l_src_quantity_tab(i):= l_txn_raw_cost_tab(i);
4493                         l_override_quantity := l_unrounded_txn_raw_cost_tab(i);
4494                     END IF;
4495                 END IF;
4496                 IF l_override_quantity <> 0 THEN
4497                     l_cost_rate_override_tab(i) := l_unrounded_txn_raw_cost_tab(i) / l_override_quantity;
4498                     l_b_cost_rate_override_tab(i) := l_unrounded_txn_brdn_cost_tab(i) / l_override_quantity;
4499                     l_bill_rate_override_tab(i) := l_unrounded_txn_revenue_tab(i) / l_override_quantity;
4500                 ELSE -- Added for IPM
4501                     l_remove_record_flag_tab(i) := 'Y';
4502                     l_remove_records_flag := 'Y';
4503                 END IF;
4504              END LOOP;
4505         ELSIF l_source_version_type = 'ALL' AND
4506               l_target_version_type = 'ALL' AND
4507               l_rev_gen_method = 'C' THEN
4508             FOR i in 1..l_tgt_res_asg_id_tab.count LOOP
4509                 l_override_quantity := l_src_quantity_tab(i);
4510                 IF l_tgt_rate_based_flag_tab(i) = 'N' THEN
4511                     -- Modified for IPM
4512                     IF nvl(l_txn_raw_cost_tab(i),0) = 0 THEN
4513                         -- Source is a revenue-only txn (qty = rev).
4514                         -- Do not generate cost from a revenue amount.
4515                         -- Nulling out qty will cause the record to be skipped.
4516                         l_src_quantity_tab(i):= null;
4517                         l_override_quantity := null;
4518                     ELSE
4519                         l_src_quantity_tab(i):= l_txn_raw_cost_tab(i);
4520                         l_override_quantity := l_unrounded_txn_raw_cost_tab(i);
4521                     END IF;
4522                 END IF;
4523                 l_txn_revenue_tab(i) := l_txn_brdn_cost_tab(i);
4524                 IF l_override_quantity <> 0 THEN
4525                     l_cost_rate_override_tab(i) := l_unrounded_txn_raw_cost_tab(i) / l_override_quantity;
4526                     l_b_cost_rate_override_tab(i) := l_unrounded_txn_brdn_cost_tab(i) / l_override_quantity;
4527                     l_bill_rate_override_tab(i) := l_unrounded_txn_revenue_tab(i) / l_override_quantity;
4528                 ELSE -- Added for IPM
4529                     l_remove_record_flag_tab(i) := 'Y';
4530                     l_remove_records_flag := 'Y';
4531                 END IF;
4532             END LOOP;
4533         ELSIF l_source_version_type = 'ALL' AND
4534               l_target_version_type = 'ALL' AND
4535               l_rev_gen_method = 'E' THEN
4536             FOR i in 1..l_tgt_res_asg_id_tab.count LOOP
4537                 l_override_quantity := l_src_quantity_tab(i);
4538                 IF  l_tgt_rate_based_flag_tab(i) = 'N' THEN
4539                     -- Modified for IPM
4540                     IF nvl(l_txn_raw_cost_tab(i),0) = 0 THEN
4541                         -- Source is a revenue-only txn (qty = rev).
4542                         -- Do not double count the revenue amount.
4543                         -- Nulling out qty will cause the record to be skipped.
4544                         l_src_quantity_tab(i):= null;
4545                         l_override_quantity := null;
4546                     ELSE
4547                         l_src_quantity_tab(i):= l_txn_raw_cost_tab(i);
4548                         l_override_quantity := l_unrounded_txn_raw_cost_tab(i);
4549                     END IF;
4550                 END IF;
4551                 IF l_override_quantity <> 0 THEN
4552                     l_cost_rate_override_tab(i) := l_unrounded_txn_raw_cost_tab(i) / l_override_quantity;
4553                     l_b_cost_rate_override_tab(i) := l_unrounded_txn_brdn_cost_tab(i) / l_override_quantity;
4554                 ELSE -- Added for IPM
4555                     l_remove_record_flag_tab(i) := 'Y';
4556                     l_remove_records_flag := 'Y';
4557                 END IF;
4558                 /* When generation is Event-based, we get revenues from the billing events. If we
4559                  * include revenues from the source, revenues will be double counted. Therefore,
4560                  * we set source revenue amounts to NULL so calculate API doesn't include. */
4561                 l_txn_revenue_tab(i) := NULL;
4562             END LOOP;
4563             /*Revenue is only based on billing events, which is handled seperately.*/
4564         END IF;
4565         /*End refer to document: How to derive the rate*/
4566     /* Revenue forecast generation logic */
4567     ELSIF l_calling_context = lc_ForecastGeneration THEN
4568         IF l_source_version_type = 'COST' AND
4569            l_target_version_type = 'REVENUE' AND
4570            l_rev_gen_method = 'T' THEN
4571             FOR i in 1..l_tgt_res_asg_id_tab.count LOOP
4572                 l_override_quantity := l_src_quantity_tab(i);
4573                 IF l_tgt_rate_based_flag_tab(i) = 'N' THEN
4574                     -- currently using budgeting logic's approach because of some bug possibility.
4575                     l_src_quantity_tab(i):= l_txn_raw_cost_tab(i); --???
4576                     l_override_quantity := l_unrounded_txn_raw_cost_tab(i);
4577 
4578                     -- Bug 4568011: Commented out revenue and bill rate override
4579                     -- pl/sql table assignments so that the Calculate API will
4580                     -- compute revenue amounts.
4581                     -- l_txn_revenue_tab(i) := l_txn_raw_cost_tab(i);
4582                     -- l_bill_rate_override_tab(i) := 1;
4583                     -- l_pfc_revenue_tab(i) := l_pfc_raw_cost_tab(i);
4584                     -- l_pc_revenue_tab(i) := l_pc_raw_cost_tab(i);
4585                 END IF;
4586                 IF l_override_quantity <> 0 THEN
4587                     l_cost_rate_override_tab(i) := l_unrounded_txn_raw_cost_tab(i) / l_override_quantity;
4588                     l_b_cost_rate_override_tab(i) := l_unrounded_txn_brdn_cost_tab(i) / l_override_quantity;
4589                 END IF;
4590                 l_txn_raw_cost_tab(i) := NULL;
4591                 l_txn_brdn_cost_tab(i) := NULL;
4592             END LOOP;
4593         ELSIF l_source_version_type = 'COST' AND
4594               l_target_version_type = 'REVENUE' AND
4595               l_rev_gen_method = 'C' THEN
4596             FOR i in 1..l_tgt_res_asg_id_tab.count LOOP
4597                 l_src_quantity_tab(i):= l_txn_brdn_cost_tab(i);
4598                 l_txn_revenue_tab(i) := l_txn_brdn_cost_tab(i);
4599                 l_txn_raw_cost_tab(i) := NULL;
4600                 l_txn_brdn_cost_tab(i) := NULL;
4601                 l_bill_rate_override_tab(i) := 1;
4602                 l_pfc_revenue_tab(i) := l_pfc_brdn_cost_tab(i);
4603                 l_pc_revenue_tab(i) := l_pc_brdn_cost_tab(i);
4604             END LOOP;
4605         ELSIF l_source_version_type = 'COST' AND
4606               l_target_version_type = 'REVENUE' AND
4607               l_rev_gen_method = 'E' THEN
4608             /* This stub is here for completeness in the flow of the generation logic.
4609              * We do nothing here because the wrapper API does not call this procedure
4610              * in the case of Event-based revenue generation. Hence, we should never
4611              * arrive here in a valid code path. */
4612             l_dummy := 1;
4613         ELSIF l_source_version_type = 'ALL' AND
4614               l_target_version_type = 'REVENUE' AND
4615               l_rev_gen_method = 'T' THEN
4616             FOR i in 1..l_tgt_res_asg_id_tab.count LOOP
4617 
4618                 -- Bug 4568011: When Source revenue amounts exist, the
4619                 -- Calculate API should honor those amounts instead of
4620                 -- computing revenue amounts. For this to happen, the
4621                 -- REVENUE_BILL_RATE column of the PA_FP_GEN_RATE_TMP
4622                 -- table needs to be populated with the bill rate override.
4623                 -- Likewise, when Source revenue amounts do not exist,
4624                 -- the Calculate API should compute revenue amounts. In
4625                 -- this case, the bill rate override should be NULL.
4626 
4627                 l_override_quantity := l_src_quantity_tab(i);
4628                 IF l_tgt_rate_based_flag_tab(i) = 'N' THEN
4629                     IF l_txn_revenue_tab(i) IS NOT NULL THEN
4630                         l_src_quantity_tab(i):= l_txn_revenue_tab(i);
4631                         l_override_quantity := l_unrounded_txn_revenue_tab(i);
4632                     ELSE
4633                         l_src_quantity_tab(i):= l_txn_raw_cost_tab(i);
4634                         l_override_quantity := l_unrounded_txn_raw_cost_tab(i);
4635                     END IF;
4636                 END IF;
4637                 l_txn_raw_cost_tab(i) := NULL;
4638                 l_txn_brdn_cost_tab(i) := NULL;
4639                 IF l_override_quantity <> 0 THEN
4640                     l_cost_rate_override_tab(i) := l_unrounded_txn_raw_cost_tab(i) / l_override_quantity;
4641                     l_b_cost_rate_override_tab(i) := l_unrounded_txn_brdn_cost_tab(i) / l_override_quantity;
4642                     l_bill_rate_override_tab(i) := l_unrounded_txn_revenue_tab(i) / l_override_quantity;
4643                 ELSE -- Added for IPM
4644                     l_remove_record_flag_tab(i) := 'Y';
4645                     l_remove_records_flag := 'Y';
4646                 END IF;
4647             END LOOP;
4648         ELSIF l_source_version_type = 'ALL' AND
4649               l_target_version_type = 'REVENUE' AND
4650               l_rev_gen_method = 'C' THEN
4651             FOR i in 1..l_tgt_res_asg_id_tab.count LOOP
4652                 l_src_quantity_tab(i):= l_txn_brdn_cost_tab(i);
4653                 l_txn_revenue_tab(i) := l_txn_brdn_cost_tab(i);
4654                 l_txn_raw_cost_tab(i) := NULL;
4655                 l_txn_brdn_cost_tab(i) := NULL;
4656                 l_bill_rate_override_tab(i) := 1;
4657                 l_pfc_revenue_tab(i) := l_pfc_brdn_cost_tab(i);
4658                 l_pc_revenue_tab(i) := l_pc_brdn_cost_tab(i);
4659                 -- Added for IPM
4660                 IF nvl(l_src_quantity_tab(i),0) = 0 THEN
4661                     l_remove_record_flag_tab(i) := 'Y';
4662                     l_remove_records_flag := 'Y';
4663                 END IF;
4664             END LOOP;
4665         ELSIF l_source_version_type = 'ALL' AND
4666               l_target_version_type = 'REVENUE' AND
4667               l_rev_gen_method = 'E' THEN
4668             /* This stub is here for completeness in the flow of the generation logic.
4669              * We do nothing here because the wrapper API does not call this procedure
4670              * in the case of Event-based revenue generation. Hence, we should never
4671              * arrive here in a valid code path. */
4672             l_dummy := 1;
4673         END IF;
4674     END IF; -- context-based generation logic
4675 
4676     /* ER 4376722: When the Target is a Revenue-only Forecast, we
4677      * generate quantity but not revenue for rate-based resources of
4678      * non-billable tasks. To do this, null out revenue amounts and
4679      * rate overrides for rate-based resources of non-billable tasks.
4680      * Note that we handle the case of non-rated-based resources
4681      * of non-billable tasks earlier in the code. */
4682 
4683     IF l_target_version_type = 'REVENUE' AND
4684        l_calling_context = lc_ForecastGeneration THEN
4685         FOR i IN 1..l_tgt_res_asg_id_tab.count LOOP
4686             IF l_billable_flag_tab(i) = 'N' AND
4687                l_tgt_rate_based_flag_tab(i) = 'Y' THEN
4688                 l_txn_revenue_tab(i) := null;
4689                 l_pfc_revenue_tab(i) := null;
4690                 l_pc_revenue_tab(i)  := null;
4691                 l_bill_rate_override_tab(i) := NULL;
4692                 l_markup_percent_tab(i) := NULL; -- Added for Bug 5166047
4693                 -- null out cost rate overrides in case of Work-based revenue
4694                 l_cost_rate_override_tab(i) := NULL;
4695                 l_b_cost_rate_override_tab(i) := NULL;
4696             END IF;
4697         END LOOP;
4698     END IF; -- ER 4376722 billability logic for REVENUE Forecast
4699 
4700     /* ER 4376722: When the Target is a Cost and Revenue together
4701      * version, we do not generate revenue for non-billable tasks.
4702      * To do this, simply null out revenue amounts for non-billable
4703      * tasks. The result is that revenue amounts for non-billable
4704      * tasks will not be written to the budget lines. */
4705 
4706     IF l_target_version_type = 'ALL' THEN
4707         -- Null out revenue amounts for non-billable tasks
4708         FOR i in 1..l_tgt_res_asg_id_tab.count LOOP
4709             IF l_billable_flag_tab(i) = 'N' THEN
4710                 l_txn_revenue_tab(i) := null;
4711                 l_pfc_revenue_tab(i) := null;
4712                 l_pc_revenue_tab(i)  := null;
4713                 l_bill_rate_override_tab(i) := null;
4714                 l_markup_percent_tab(i) := null; -- Added for Bug 5166047
4715 
4716                 -- IPM: If the current txn has only revenue amounts,
4717                 -- then process using the rules for revenue-only versions.
4718                 IF ( l_calling_context = lc_BudgetGeneration AND
4719                      nvl(l_txn_raw_cost_tab(i),0) = 0 ) OR
4720                    ( l_calling_context = lc_ForecastGeneration AND
4721                      nvl(l_txn_raw_cost_tab(i),0) = 0 AND
4722                      l_tgt_rate_based_flag_tab(i) = 'N' ) THEN
4723                     -- Skip over the record in this case so that
4724                     -- cost is not generated from a revenue amount.
4725                     l_remove_record_flag_tab(i) := 'Y';
4726                     l_remove_records_flag := 'Y';
4727                 END IF; -- revenue-only txn logic
4728             END IF;
4729         END LOOP;
4730     END IF; -- ER 4376722 billability logic for ALL versions
4731 
4732 
4733     -- Added in IPM. If there are any pl/sql table records that need to
4734     -- be removed, use a separate set of _tmp_ tables to filter them out.
4735 
4736      IF l_remove_records_flag = 'Y' THEN
4737 
4738         -- 0. Clear out any data in the _tmp_ tables.
4739 	l_tmp_tgt_res_asg_id_tab.delete;
4740 	l_tmp_tgt_rate_based_flag_tab.delete;
4741 	l_tmp_start_date_tab.delete;
4742 	l_tmp_end_date_tab.delete;
4743 	l_tmp_periiod_name_tab.delete;
4744 	l_tmp_txn_currency_code_tab.delete;
4745 	l_tmp_src_quantity_tab.delete;
4746 	l_tmp_txn_raw_cost_tab.delete;
4747 	l_tmp_txn_brdn_cost_tab.delete;
4748 	l_tmp_txn_revenue_tab.delete;
4749 	l_tmp_unr_txn_raw_cost_tab.delete;
4750 	l_tmp_unr_txn_brdn_cost_tab.delete;
4751 	l_tmp_unr_txn_revenue_tab.delete;
4752 	l_tmp_pc_raw_cost_tab.delete;
4753 	l_tmp_pc_brdn_cost_tab.delete;
4754 	l_tmp_pc_revenue_tab.delete;
4755 	l_tmp_pfc_raw_cost_tab.delete;
4756 	l_tmp_pfc_brdn_cost_tab.delete;
4757 	l_tmp_pfc_revenue_tab.delete;
4758 	l_tmp_cost_rate_override_tab.delete;
4759 	l_tmp_bcost_rate_override_tab.delete;
4760 	l_tmp_bill_rate_override_tab.delete;
4761 	l_tmp_billable_flag_tab.delete;
4762 	l_tmp_markup_percent_tab.delete; -- Added for Bug 5166047
4763 
4764         -- 1. Copy records into _tmp_ tables
4765         l_tmp_index := 0;
4766         FOR i IN 1..l_tgt_res_asg_id_tab.count LOOP
4767             IF l_remove_record_flag_tab(i) <> 'Y' THEN
4768 
4769                 l_tmp_index := l_tmp_index + 1;
4770                 l_tmp_tgt_res_asg_id_tab(l_tmp_index)      := l_tgt_res_asg_id_tab(i);
4771                 l_tmp_tgt_rate_based_flag_tab(l_tmp_index) := l_tgt_rate_based_flag_tab(i);
4772                 l_tmp_start_date_tab(l_tmp_index)          := l_start_date_tab(i);
4773                 l_tmp_end_date_tab(l_tmp_index)            := l_end_date_tab(i);
4774                 l_tmp_periiod_name_tab(l_tmp_index)        := l_periiod_name_tab(i);
4775                 l_tmp_txn_currency_code_tab(l_tmp_index)   := l_txn_currency_code_tab(i);
4776                 l_tmp_src_quantity_tab(l_tmp_index)        := l_src_quantity_tab(i);
4777                 l_tmp_txn_raw_cost_tab(l_tmp_index)        := l_txn_raw_cost_tab(i);
4778                 l_tmp_txn_brdn_cost_tab(l_tmp_index)       := l_txn_brdn_cost_tab(i);
4779                 l_tmp_txn_revenue_tab(l_tmp_index)         := l_txn_revenue_tab(i);
4780                 l_tmp_unr_txn_raw_cost_tab(l_tmp_index)    := l_unrounded_txn_raw_cost_tab(i);
4781                 l_tmp_unr_txn_brdn_cost_tab(l_tmp_index)   := l_unrounded_txn_brdn_cost_tab(i);
4782                 l_tmp_unr_txn_revenue_tab(l_tmp_index)     := l_unrounded_txn_revenue_tab(i);
4783                 l_tmp_pc_raw_cost_tab(l_tmp_index)         := l_pc_raw_cost_tab(i);
4784                 l_tmp_pc_brdn_cost_tab(l_tmp_index)        := l_pc_brdn_cost_tab(i);
4785                 l_tmp_pc_revenue_tab(l_tmp_index)          := l_pc_revenue_tab(i);
4786                 l_tmp_pfc_raw_cost_tab(l_tmp_index)        := l_pfc_raw_cost_tab(i);
4787                 l_tmp_pfc_brdn_cost_tab(l_tmp_index)       := l_pfc_brdn_cost_tab(i);
4788                 l_tmp_pfc_revenue_tab(l_tmp_index)         := l_pfc_revenue_tab(i);
4789                 l_tmp_cost_rate_override_tab(l_tmp_index)  := l_cost_rate_override_tab(i);
4790                 l_tmp_bcost_rate_override_tab(l_tmp_index) := l_b_cost_rate_override_tab(i);
4791                 l_tmp_bill_rate_override_tab(l_tmp_index)  := l_bill_rate_override_tab(i);
4792                 l_tmp_billable_flag_tab(l_tmp_index)       := l_billable_flag_tab(i);
4793                 l_tmp_markup_percent_tab(l_tmp_index)      := l_markup_percent_tab(i); -- Added for Bug 5166047
4794             END IF;
4795         END LOOP;
4796 
4797         -- 2. Copy records from _tmp_ tables back to non-temporary tables.
4798         l_tgt_res_asg_id_tab          := l_tmp_tgt_res_asg_id_tab;
4799         l_tgt_rate_based_flag_tab     := l_tmp_tgt_rate_based_flag_tab;
4800         l_start_date_tab              := l_tmp_start_date_tab;
4801         l_end_date_tab                := l_tmp_end_date_tab;
4802         l_periiod_name_tab            := l_tmp_periiod_name_tab;
4803         l_txn_currency_code_tab       := l_tmp_txn_currency_code_tab;
4804         l_src_quantity_tab            := l_tmp_src_quantity_tab;
4805         l_txn_raw_cost_tab            := l_tmp_txn_raw_cost_tab;
4806         l_txn_brdn_cost_tab           := l_tmp_txn_brdn_cost_tab;
4807         l_txn_revenue_tab             := l_tmp_txn_revenue_tab;
4808         l_unrounded_txn_raw_cost_tab  := l_tmp_unr_txn_raw_cost_tab;
4809         l_unrounded_txn_brdn_cost_tab := l_tmp_unr_txn_brdn_cost_tab;
4810         l_unrounded_txn_revenue_tab   := l_tmp_unr_txn_revenue_tab;
4811         l_pc_raw_cost_tab             := l_tmp_pc_raw_cost_tab;
4812         l_pc_brdn_cost_tab            := l_tmp_pc_brdn_cost_tab;
4813         l_pc_revenue_tab              := l_tmp_pc_revenue_tab;
4814         l_pfc_raw_cost_tab            := l_tmp_pfc_raw_cost_tab;
4815         l_pfc_brdn_cost_tab           := l_tmp_pfc_brdn_cost_tab;
4816         l_pfc_revenue_tab             := l_tmp_pfc_revenue_tab;
4817         l_cost_rate_override_tab      := l_tmp_cost_rate_override_tab;
4818         l_b_cost_rate_override_tab    := l_tmp_bcost_rate_override_tab;
4819         l_bill_rate_override_tab      := l_tmp_bill_rate_override_tab;
4820         l_billable_flag_tab           := l_tmp_billable_flag_tab;
4821         l_markup_percent_tab          := l_tmp_markup_percent_tab; -- Added for Bug 5166047
4822 
4823         -- Stop processing if no data remains (ie. all records removed).
4824         IF l_tgt_res_asg_id_tab.count <= 0 THEN
4825             IF P_PA_DEBUG_MODE = 'Y' THEN
4826                 PA_DEBUG.RESET_CURR_FUNCTION;
4827             END IF;
4828             RETURN;
4829         END IF; -- l_tgt_res_asg_id_tab.count <= 0
4830 
4831     END IF; -- IPM record removal logic
4832 
4833   /*********************************************************************
4834   ER 5726773: Commenting out logic that filters out planning
4835  	               transaction records with: (total plan quantity <= 0).
4836 
4837     -- Bug #4938603: Adding code to filter out records with
4838     --  total plan quantity < 0
4839     -- Sum quantity by (ra_id,currency)
4840     FOR i IN 1..l_tgt_res_asg_id_tab.count LOOP
4841         l_ra_id := l_tgt_res_asg_id_tab(i);
4842         l_currency := l_txn_currency_code_tab(i);
4843         IF ra_id_tab.EXISTS(l_ra_id) THEN
4844             IF ra_id_tab(l_ra_id).EXISTS(l_currency) THEN
4845                 -- Add source quantity to running total
4846                 ra_id_tab(l_ra_id)(l_currency) :=
4847                     ra_id_tab(l_ra_id)(l_currency) + nvl(l_src_quantity_tab(i),0);
4848             ELSE
4849                 -- Start the running total
4850                 ra_id_tab(l_ra_id)(l_currency) := nvl(l_src_quantity_tab(i),0);
4851             END IF;
4852         ELSE -- ra_id_tab(l_ra_id does not exist
4853             -- Assignment for pl/sql tables is BY VALUE, so it
4854             -- is okay to reuse new_currency_tab after deletion.
4855             new_currency_tab.DELETE;
4856             new_currency_tab(l_currency) := nvl(l_src_quantity_tab(i),0);
4857             ra_id_tab(l_ra_id) := new_currency_tab;
4858         END IF;
4859     END LOOP;
4860 
4861     -- For Forecasts, add total Actual Quantity to total ETC Quantity.
4862     -- Do a double loop over resource assignments and then currency.
4863     IF (l_calling_context = lc_ForecastGeneration) THEN
4864         IF ra_id_tab.count > 0 THEN
4865             n_index := ra_id_tab.FIRST;
4866             LOOP
4867              -- START LOOP BODY (n_index)
4868                 IF ra_id_tab(n_index).count > 0 THEN
4869                     s_index := ra_id_tab(n_index).FIRST;
4870                     LOOP
4871                         -- START LOOP BODY (s_index)
4872                         OPEN fcst_bdgt_line_actual_qty(n_index,s_index);
4873                         FETCH fcst_bdgt_line_actual_qty INTO l_init_qty;
4874                         CLOSE fcst_bdgt_line_actual_qty;
4875                         ra_id_tab(n_index)(s_index) :=
4876                             ra_id_tab(n_index)(s_index) + nvl(l_init_qty,0);
4877                   -- END LOOP BODY (s_index)
4878                      EXIT WHEN s_index = ra_id_tab(n_index).LAST;
4879                   -- Increment the loop iterator
4880                         s_index := ra_id_tab(n_index).NEXT(s_index);
4881                     END LOOP;
4882                 END IF; --IF ra_id_tab(n_index).count > 0 THEN
4883                 -- END LOOP BODY (n_index)
4884                 EXIT WHEN n_index = ra_id_tab.LAST;
4885                 -- Increment the loop iterator
4886                 n_index := ra_id_tab.NEXT(n_index);
4887             END LOOP;
4888         END IF; --IF ra_id_tab.count > 0 THEN
4889     END IF; --IF (l_calling_context = lc_ForecastGeneration) THEN
4890 
4891     -- 0. Clear out any data in the _tmp_ tables.
4892     l_tmp_tgt_res_asg_id_tab.delete;
4893     l_tmp_tgt_rate_based_flag_tab.delete;
4894     l_tmp_start_date_tab.delete;
4895     l_tmp_end_date_tab.delete;
4896     l_tmp_periiod_name_tab.delete;
4897     l_tmp_txn_currency_code_tab.delete;
4898     l_tmp_src_quantity_tab.delete;
4899     l_tmp_txn_raw_cost_tab.delete;
4900     l_tmp_txn_brdn_cost_tab.delete;
4901     l_tmp_txn_revenue_tab.delete;
4902     l_tmp_unr_txn_raw_cost_tab.delete;
4903     l_tmp_unr_txn_brdn_cost_tab.delete;
4904     l_tmp_unr_txn_revenue_tab.delete;
4905     l_tmp_pc_raw_cost_tab.delete;
4906     l_tmp_pc_brdn_cost_tab.delete;
4907     l_tmp_pc_revenue_tab.delete;
4908     l_tmp_pfc_raw_cost_tab.delete;
4909     l_tmp_pfc_brdn_cost_tab.delete;
4910     l_tmp_pfc_revenue_tab.delete;
4911     l_tmp_cost_rate_override_tab.delete;
4912     l_tmp_bcost_rate_override_tab.delete;
4913     l_tmp_bill_rate_override_tab.delete;
4914     l_tmp_billable_flag_tab.delete;
4915     l_tmp_markup_percent_tab.delete; -- Added for Bug 5166047
4916 
4917     l_tmp_index := 0;
4918     -- 1. Copy records into _tmp_ tables for
4919     FOR i IN 1..l_tgt_res_asg_id_tab.count LOOP
4920 
4921         IF ra_id_tab.EXISTS(l_tgt_res_asg_id_tab(i)) AND
4922            ra_id_tab(l_tgt_res_asg_id_tab(i)).EXISTS(l_txn_currency_code_tab(i)) AND
4923            ra_id_tab(l_tgt_res_asg_id_tab(i))(l_txn_currency_code_tab(i)) > 0 THEN
4924 
4925             l_tmp_index := l_tmp_index + 1;
4926             l_tmp_tgt_res_asg_id_tab(l_tmp_index)      := l_tgt_res_asg_id_tab(i);
4927             l_tmp_tgt_rate_based_flag_tab(l_tmp_index) := l_tgt_rate_based_flag_tab(i);
4928             l_tmp_start_date_tab(l_tmp_index)          := l_start_date_tab(i);
4929             l_tmp_end_date_tab(l_tmp_index)            := l_end_date_tab(i);
4930             l_tmp_periiod_name_tab(l_tmp_index)        := l_periiod_name_tab(i);
4931             l_tmp_txn_currency_code_tab(l_tmp_index)   := l_txn_currency_code_tab(i);
4932             l_tmp_src_quantity_tab(l_tmp_index)        := l_src_quantity_tab(i);
4933             l_tmp_txn_raw_cost_tab(l_tmp_index)        := l_txn_raw_cost_tab(i);
4934             l_tmp_txn_brdn_cost_tab(l_tmp_index)       := l_txn_brdn_cost_tab(i);
4935             l_tmp_txn_revenue_tab(l_tmp_index)         := l_txn_revenue_tab(i);
4936             l_tmp_unr_txn_raw_cost_tab(l_tmp_index)    := l_unrounded_txn_raw_cost_tab(i);
4937             l_tmp_unr_txn_brdn_cost_tab(l_tmp_index)   := l_unrounded_txn_brdn_cost_tab(i);
4938             l_tmp_unr_txn_revenue_tab(l_tmp_index)     := l_unrounded_txn_revenue_tab(i);
4939             l_tmp_pc_raw_cost_tab(l_tmp_index)         := l_pc_raw_cost_tab(i);
4940             l_tmp_pc_brdn_cost_tab(l_tmp_index)        := l_pc_brdn_cost_tab(i);
4941             l_tmp_pc_revenue_tab(l_tmp_index)          := l_pc_revenue_tab(i);
4942             l_tmp_pfc_raw_cost_tab(l_tmp_index)        := l_pfc_raw_cost_tab(i);
4943             l_tmp_pfc_brdn_cost_tab(l_tmp_index)       := l_pfc_brdn_cost_tab(i);
4944             l_tmp_pfc_revenue_tab(l_tmp_index)         := l_pfc_revenue_tab(i);
4945             l_tmp_cost_rate_override_tab(l_tmp_index)  := l_cost_rate_override_tab(i);
4946             l_tmp_bcost_rate_override_tab(l_tmp_index) := l_b_cost_rate_override_tab(i);
4947             l_tmp_bill_rate_override_tab(l_tmp_index)  := l_bill_rate_override_tab(i);
4948             l_tmp_billable_flag_tab(l_tmp_index)       := l_billable_flag_tab(i);
4949             l_tmp_markup_percent_tab(l_tmp_index)      := l_markup_percent_tab(i); -- Added for Bug 5166047
4950         END IF;
4951     END LOOP;
4952 
4953      -- 2. Copy records from _tmp_ tables back to non-temporary tables.
4954     l_tgt_res_asg_id_tab          := l_tmp_tgt_res_asg_id_tab;
4955     l_tgt_rate_based_flag_tab     := l_tmp_tgt_rate_based_flag_tab;
4956     l_start_date_tab              := l_tmp_start_date_tab;
4957     l_end_date_tab                := l_tmp_end_date_tab;
4958     l_periiod_name_tab            := l_tmp_periiod_name_tab;
4959     l_txn_currency_code_tab       := l_tmp_txn_currency_code_tab;
4960     l_src_quantity_tab            := l_tmp_src_quantity_tab;
4961     l_txn_raw_cost_tab            := l_tmp_txn_raw_cost_tab;
4962     l_txn_brdn_cost_tab           := l_tmp_txn_brdn_cost_tab;
4963     l_txn_revenue_tab             := l_tmp_txn_revenue_tab;
4964     l_unrounded_txn_raw_cost_tab  := l_tmp_unr_txn_raw_cost_tab;
4965     l_unrounded_txn_brdn_cost_tab := l_tmp_unr_txn_brdn_cost_tab;
4966     l_unrounded_txn_revenue_tab   := l_tmp_unr_txn_revenue_tab;
4967     l_pc_raw_cost_tab             := l_tmp_pc_raw_cost_tab;
4968     l_pc_brdn_cost_tab            := l_tmp_pc_brdn_cost_tab;
4969     l_pc_revenue_tab              := l_tmp_pc_revenue_tab;
4970     l_pfc_raw_cost_tab            := l_tmp_pfc_raw_cost_tab;
4971     l_pfc_brdn_cost_tab           := l_tmp_pfc_brdn_cost_tab;
4972     l_pfc_revenue_tab             := l_tmp_pfc_revenue_tab;
4973     l_cost_rate_override_tab      := l_tmp_cost_rate_override_tab;
4974     l_b_cost_rate_override_tab    := l_tmp_bcost_rate_override_tab;
4975     l_bill_rate_override_tab      := l_tmp_bill_rate_override_tab;
4976     l_billable_flag_tab           := l_tmp_billable_flag_tab;
4977     l_markup_percent_tab          := l_tmp_markup_percent_tab; -- Added for Bug 5166047
4978 
4979     -- End of code for #4938603
4980 
4981     ER 5726773: End of commented out section.
4982  *********************************************************************/
4983 
4984     -- ER 4376722: Consolidated update of UOM and rate_based_flag for
4985     -- cost-based Revenue generation within the GENERATE_WP_BUDGET_AMT
4986     -- API before any cursor is called. This ensures that the values
4987     -- in the rate_base_flag pl/sql tables are accurate. Before this
4988     -- change, an identical update was done in GENERATE_WP_BUDGET_AMT
4989     -- as well as in this API after cursors were used and generation
4990     -- logic was performed.
4991 
4992 /******************** Commented Out *********************
4993     IF l_fp_cols_rec_target.x_version_type = 'REVENUE' and l_rev_gen_method = 'C' THEN
4994         l_res_asg_uom_update_tab.DELETE;
4995         SELECT DISTINCT txn_resource_assignment_id
4996         BULK COLLECT INTO l_res_asg_uom_update_tab
4997         FROM pa_res_list_map_tmp4;
4998 
4999         FORALL i IN 1..l_res_asg_uom_update_tab.count
5000             UPDATE pa_resource_assignments
5001             SET unit_of_measure = 'DOLLARS',
5002                 rate_based_flag = 'N'
5003             WHERE resource_assignment_id = l_res_asg_uom_update_tab(i);
5004     END IF;
5005 ******************** End Commenting **********************/
5006 
5007     -- Bug 3968748: We need to populate the PA_FP_GEN_RATE_TMP table with
5008     -- burdened cost rates for non-rate-based resources for Calculate API
5009     -- when generating work-based revenue for a Revenue-only target version.
5010 
5011     -- Bug 4216423: We now need to populate PA_FP_GEN_RATE_TMP with cost
5012     -- rates for both rate-based and non-rate based resources when generating
5013     -- work-based revenue for a Revenue-only target version.
5014 
5015     /* ER 4376722: Note that we do not need to modify the logic for populating
5016      * PA_FP_GEN_RATE_TMP here, since we already removed pl/sql table records
5017      * for non-billable tasks earlier in the code for Revenue-only target versions. */
5018 
5019     -- Bug 4568011: Added REVENUE_BILL_RATE to list of inserted columns.
5020     -- When the value is non-null, the Calculate API will honor the given
5021     -- bill rate instead of computing revenue amounts.
5022 
5023     IF l_fp_cols_rec_target.x_version_type = 'REVENUE' AND l_rev_gen_method = 'T' THEN
5024         DELETE pa_fp_gen_rate_tmp;
5025         /* For periodic calculation, we should populate the period name. */
5026         FORALL i IN 1..l_tgt_res_asg_id_tab.count
5027             INSERT INTO pa_fp_gen_rate_tmp
5028                    ( TARGET_RES_ASG_ID,
5029                      TXN_CURRENCY_CODE,
5030                      PERIOD_NAME,
5031                      RAW_COST_RATE,
5032                      BURDENED_COST_RATE,
5033                      REVENUE_BILL_RATE )            /* Added for Bug 4568011 */
5034             VALUES ( l_tgt_res_asg_id_tab(i),
5035                      l_txn_currency_code_tab(i),
5036                      l_periiod_name_tab(i),
5037                      l_cost_rate_override_tab(i),
5038                      l_b_cost_rate_override_tab(i),
5039                      l_bill_rate_override_tab(i) ); /* Added for Bug 4568011 */
5040         -- Null out cost rate overrides
5041         FOR i IN 1..l_tgt_res_asg_id_tab.count LOOP
5042             l_cost_rate_override_tab(i) := NULL;
5043             l_b_cost_rate_override_tab(i) := NULL;
5044         END LOOP;
5045     END IF;
5046 
5047      /*
5048      hr_utility.trace('....................');
5049      hr_utility.trace('??before insert, l_tgt_res_asg_id_tab.count:'||l_tgt_res_asg_id_tab.count);
5050      for i in 1..l_tgt_res_asg_id_tab.count loop
5051      IF l_tgt_res_asg_id_tab(i) = 20705 THEN
5052      hr_utility.trace('==='||i||'==');
5053      hr_utility.trace('l_tgt_res_asg_id_tab('||i||'):'|| l_tgt_res_asg_id_tab(i));
5054      hr_utility.trace('l_txn_currency_code_tab('||i||'):'|| l_txn_currency_code_tab(i));
5055      hr_utility.trace('l_src_quantity_tab('||i||'):'||l_src_quantity_tab(i));
5056      hr_utility.trace('l_txn_brdn_cost_tab('||i||'):'||l_txn_brdn_cost_tab(i));
5057      hr_utility.trace('l_txn_revenue_tab('||i||'):'||l_txn_revenue_tab(i));
5058      END IF;
5059      end loop;*/
5060     --dbms_output.put_line('l_tgt_res_asg_id_tab.count:'||l_tgt_res_asg_id_tab.count);
5061 
5062     -- Note that l_tgt_res_asg_id_tab.count should be greater than 0
5063     -- at this point, since we checked this condition earlier. However,
5064     -- to be on the safe side, check once more to avoid unecessary work.
5065     IF l_tgt_res_asg_id_tab.count <= 0 THEN
5066         IF P_PA_DEBUG_MODE = 'Y' THEN
5067             PA_DEBUG.RESET_CURR_FUNCTION;
5068         END IF;
5069         RETURN;
5070     END IF; -- l_tgt_res_asg_id_tab.count <= 0
5071 
5072     /* Bug 4686742: BEGIN CODE FIX */
5073 
5074     -- Bug 4686742: When the Target is a Work-based Revenue-only Forecast,
5075     -- call the Calculate API in periodic mode instead of Inserting/Updating
5076     -- the budget lines now and calling the Calculate API at the resource
5077     -- level later when control returns to the GENERATE_WP_BUDGET_AMT API.
5078 
5079     IF l_calling_context = lc_ForecastGeneration AND
5080        l_fp_cols_rec_target.x_version_type = 'REVENUE' AND
5081        l_rev_gen_method = 'T' THEN
5082         /***** Commented for bug 5325254
5083         -- According to the VALIDATE_SUPPORT_CASES API (Case 3):
5084         --    Forecast generation from Workplan and/or Financial Plan when
5085         --    source is non-time phased is not supported.
5086         -- This check is not necessary as long as the validation api is
5087         -- working properly.
5088         --
5089         -- IMPORTANT NOTE: If we decide to support this case in the future,
5090         -- then additional logic (similar to that in GEN_COMMITMENT_AMOUNTS)
5091         -- will need to be written:
5092         -- a) Budget line data will need to be Inserted for Target (resource,
5093         --    txn currency) combinations without any actuals.
5094         -- b) Budget line quantities, revenues, and end dates will need to be
5095         --    Updated for Target (resource, txn currency) combinations with
5096         --    actuals.
5097         -- c) The Calculate API will need to be called with l_source_context
5098         --    as 'RESOURCE_ASSIGNMENT' and l_refresh_rates_flag as 'R'.
5099 
5100         IF l_fp_cols_rec_source.x_time_phased_code = 'N' THEN
5101             PA_UTILS.ADD_MESSAGE( p_app_short_name => 'PA',
5102                                   p_msg_name       => 'PA_WP_FP_NON_TIME_PHASED_ERR' );
5103             RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
5104         END IF;
5105         End of comments for bug 5325254.  *****/
5106 
5107         /* Following logic applies when Target timephase is PA/GL. */
5108 
5109         -- Copy budget line data into Calculate API table parameters
5110         FOR i IN 1..l_tgt_res_asg_id_tab.count LOOP
5111 
5112             l_raw_cost_rate_tab.EXTEND;
5113             l_b_cost_rate_tab.EXTEND;
5114             l_bill_rate_tab.EXTEND;
5115             l_cal_tgt_res_asg_id_tab.EXTEND;
5116             l_cal_start_date_tab.EXTEND;
5117             l_cal_txn_currency_code_tab.EXTEND;
5118             l_cal_end_date_tab.EXTEND;
5119             l_cal_src_quantity_tab.EXTEND;
5120             l_cal_txn_raw_cost_tab.EXTEND;
5121             l_cal_txn_brdn_cost_tab.EXTEND;
5122             l_cal_txn_revenue_tab.EXTEND;
5123             l_cal_cost_rate_override_tab.EXTEND;
5124             l_cal_bill_rate_override_tab.EXTEND;
5125             l_cal_b_cost_rate_override_tab.EXTEND;
5126 
5127             l_raw_cost_rate_tab(i)            := Null;
5128             l_b_cost_rate_tab(i)              := Null;
5129             l_bill_rate_tab(i)                := Null;
5130             l_cal_tgt_res_asg_id_tab(i)       := l_tgt_res_asg_id_tab(i);
5131             l_cal_start_date_tab(i)           := l_start_date_tab(i);
5132             l_cal_txn_currency_code_tab(i)    := l_txn_currency_code_tab(i);
5133             l_cal_end_date_tab(i)             := l_end_date_tab(i);
5134             l_cal_src_quantity_tab(i)         := l_src_quantity_tab(i);
5135             l_cal_txn_raw_cost_tab(i)         := l_txn_raw_cost_tab(i);
5136             l_cal_txn_brdn_cost_tab(i)        := l_txn_brdn_cost_tab(i);
5137             l_cal_txn_revenue_tab(i)          := l_txn_revenue_tab(i);
5138             l_cal_cost_rate_override_tab(i)   := l_cost_rate_override_tab(i);
5139             l_cal_bill_rate_override_tab(i)   := l_bill_rate_override_tab(i);
5140             l_cal_b_cost_rate_override_tab(i) := l_b_cost_rate_override_tab(i);
5141 
5142         END LOOP; -- FOR i IN 1..l_tgt_res_asg_id_tab.count LOOP
5143 
5144         -- Set default values for Calculate API flag parameters
5145         l_refresh_rates_flag         := 'N';
5146         l_refresh_conv_rates_flag    := 'N';
5147         l_spread_required_flag       := 'N';
5148         l_rollup_required_flag       := 'N';
5149         l_raTxn_rollup_api_call_flag := 'N'; -- Added for IPM new entity ER
5150 
5151         -- Note that when the source context is Budget Line, Calculate
5152         -- requires that budget lines do not already exist for the
5153         -- (resource, currency, period) combinations to be processed.
5154         -- We do not need to perform a DELETE here since we are only
5155         -- processing ETC lines, which should not exist at this point.
5156         l_source_context := 'BUDGET_LINE';
5157 
5158         --Calling the calculate API
5159         IF P_PA_DEBUG_MODE = 'Y' THEN
5160                 pa_fp_gen_amount_utils.fp_debug
5161                  (p_msg         => 'Before calling
5162                                    PA_FP_CALC_PLAN_PKG.calculate',
5163                   p_module_name => l_module_name,
5164                   p_log_level   => 5);
5165         END IF;
5166         PA_FP_CALC_PLAN_PKG.calculate(
5167                            p_project_id                    => P_PROJECT_ID,
5168                            p_budget_version_id             => P_TARGET_BV_ID,
5169                            p_refresh_rates_flag            => l_refresh_rates_flag,
5170                            p_refresh_conv_rates_flag       => l_refresh_conv_rates_flag,
5171                            p_spread_required_flag          => l_spread_required_flag,
5172                            p_rollup_required_flag          => l_rollup_required_flag,
5173                            p_source_context                => l_source_context,
5174                            p_resource_assignment_tab       => l_cal_tgt_res_asg_id_tab,
5175                            p_txn_currency_code_tab         => l_cal_txn_currency_code_tab,
5176                            p_total_qty_tab                 => l_cal_src_quantity_tab,
5177                            p_total_raw_cost_tab            => l_cal_txn_raw_cost_tab,
5178                            p_total_burdened_cost_tab       => l_cal_txn_brdn_cost_tab,
5179                            p_total_revenue_tab             => l_cal_txn_revenue_tab,
5180                            p_raw_cost_rate_tab             => l_raw_cost_rate_tab,
5181                            p_rw_cost_rate_override_tab     => l_cal_cost_rate_override_tab,
5182                            p_b_cost_rate_tab               => l_b_cost_rate_tab,
5183                            p_b_cost_rate_override_tab      => l_cal_b_cost_rate_override_tab,
5184                            p_bill_rate_tab                 => l_bill_rate_tab,
5185                            p_bill_rate_override_tab        => l_cal_bill_rate_override_tab,
5186                            p_line_start_date_tab           => l_cal_start_date_tab,
5187                            p_line_end_date_tab             => l_cal_end_date_tab,
5188                            p_calling_module                => l_calling_context,
5189                            p_raTxn_rollup_api_call_flag    => l_raTxn_rollup_api_call_flag, --Added for IPM new entity ER
5190                            x_return_status                 => x_return_status,
5191                            x_msg_count                     => x_msg_count,
5192                            x_msg_data                      => x_msg_data);
5193         --hr_utility.trace('aft calling calculate api: '||x_return_status);
5194         IF P_PA_DEBUG_MODE = 'Y' THEN
5195                 pa_fp_gen_amount_utils.fp_debug
5196                  (p_msg         => 'Status after calling
5197                                   PA_FP_CALC_PLAN_PKG.calculate: '
5198                                   ||x_return_status,
5199                   p_module_name => l_module_name,
5200                   p_log_level   => 5);
5201         END IF;
5202         IF x_return_status  <> FND_API.G_RET_STS_SUCCESS THEN
5203             raise PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
5204         END IF;
5205 
5206         IF P_PA_DEBUG_MODE = 'Y' THEN
5207             PA_DEBUG.RESET_CURR_FUNCTION;
5208         END IF;
5209         RETURN;
5210     END IF; -- Work-based Revenue Forecast logic
5211 
5212     /* Bug 4686742: END CODE FIX (note: more logic in GENERATE_WP_BUDGET_AMT) */
5213 
5214     -- Bug 5166047: At this point, we have carried around the average
5215     -- markup percent for each planning txn. And, the markup percent has
5216     -- been nulled out as needed for compliance with billability logic.
5217     -- The following conditions are required to honor source markup:
5218     -- 1. The source/target planning options must match.
5219     --    This guarantees that there is a 1-to-1 map between source
5220     --    and target txns, so that the average markup percent is in fact
5221     --    the actual markup percent.
5222     -- 2. The target version should have revenue amounts.
5223     -- 3. The revenue accrual method should be Work.
5224     --    Markup percent is not used for Cost or Event based revenue.
5225     -- When the above conditions are NOT met, null out the markup percent.
5226 
5227     IF NOT
5228      ( l_same_planning_options_flag = 'Y' AND
5229        l_target_version_type IN ('REVENUE','ALL') AND
5230        l_rev_gen_method = 'T' ) THEN
5231         FOR i IN 1..l_tgt_res_asg_id_tab.count LOOP
5232             l_markup_percent_tab(i) := null;
5233         END LOOP;
5234     END IF;
5235 
5236     -- Note for Bug 5166047:
5237     -- Since the Calculate API is called for Work-based Revenue-only Fcsts,
5238     -- and this API is only called in forecast generation for Revenue-only
5239     -- forecasts, the revenue accrual method must be Cost or Event at this point.
5240     -- Since markup should only be copied when the revenue accrual method is
5241     -- Work, we do not need to make further changes to the block below.
5242 
5243     IF l_calling_context = lc_ForecastGeneration  AND
5244        l_fp_cols_rec_target.x_time_phased_code = 'N' THEN
5245 
5246         -- Since bulk inserting the loop index variable i is syntactically
5247         -- not allowed, we populate an index table. This will give us the
5248         -- indices for resources that need to be inserted/updated.
5249         FOR i IN 1..l_tgt_res_asg_id_tab.count LOOP
5250             l_index_tab(i) := i;
5251         END LOOP;
5252 
5253         DELETE PA_FP_CALC_AMT_TMP2;
5254         -- The ETC_PLAN_QUANTITY is used to store the pl/sql table index.
5255         FORALL i IN 1..l_tgt_res_asg_id_tab.count
5256             INSERT INTO PA_FP_CALC_AMT_TMP2 (
5257                 ETC_PLAN_QUANTITY,
5258                 RESOURCE_ASSIGNMENT_ID,
5259                 TXN_CURRENCY_CODE )
5260              VALUES (
5261                 l_index_tab(i),
5262                 l_tgt_res_asg_id_tab(i),
5263                 l_txn_currency_code_tab(i) );
5264 
5265         /* Get indices for budget lines we need to UPDATE */
5266         SELECT /*+ INDEX(tmp,PA_FP_CALC_AMT_TMP2_N2)*/
5267                tmp.ETC_PLAN_QUANTITY
5268         BULK COLLECT INTO l_upd_index_tab
5269         FROM   pa_budget_lines bl,
5270                pa_fp_calc_amt_tmp2 tmp
5271         WHERE  bl.budget_version_id = P_TARGET_BV_ID
5272         AND    bl.resource_assignment_id = tmp.resource_assignment_id
5273         AND    bl.txn_currency_code = tmp.txn_currency_code
5274         ORDER BY tmp.ETC_PLAN_QUANTITY ASC;
5275 
5276         /* Separate budget line data into INSERT and UPDATE tables */
5277 
5278 	    -- These indexes are used for the insert/update pl/sql tables
5279 	    l_upd_index := 0;
5280 	    l_ins_index := 0;
5281 
5282 	    -- l_tab_index is the index into l_upd_index_tab
5283 	    l_tab_index := 1;
5284 	    -- This is index of the next entry in l_tgt_res_asg_id_tab that is an update
5285 	    l_next_update := 0;
5286 
5287 	    FOR i IN 1..l_tgt_res_asg_id_tab.count LOOP
5288 	        IF l_next_update < i AND l_tab_index <= l_upd_index_tab.count THEN
5289 	            l_next_update := l_upd_index_tab(l_tab_index);
5290 	            l_tab_index := l_tab_index + 1;
5291 	        END IF;
5292 	        IF i = l_next_update THEN
5293 	            -- Populate update pl/sql tables
5294 	            l_upd_index := l_upd_index + 1;
5295 	            l_upd_tgt_res_asg_id_tab(l_upd_index)      := l_tgt_res_asg_id_tab(i);
5296 	            l_upd_start_date_tab(l_upd_index)          := l_start_date_tab(i);
5297 	            l_upd_txn_currency_code_tab(l_upd_index)   := l_txn_currency_code_tab(i);
5298 	            l_upd_end_date_tab(l_upd_index)            := l_end_date_tab(i);
5299 	            l_upd_periiod_name_tab(l_upd_index)        := l_periiod_name_tab(i);
5300 	            l_upd_src_quantity_tab(l_upd_index)        := l_src_quantity_tab(i);
5301 	            l_upd_txn_raw_cost_tab(l_upd_index)        := l_txn_raw_cost_tab(i);
5302 	            l_upd_txn_brdn_cost_tab(l_upd_index)       := l_txn_brdn_cost_tab(i);
5303 	            l_upd_txn_revenue_tab(l_upd_index)         := l_txn_revenue_tab(i);
5304 	            l_upd_pfc_revenue_tab(l_upd_index)         := l_pfc_revenue_tab(i);
5305 	            l_upd_pc_revenue_tab(l_upd_index)          := l_pc_revenue_tab(i);
5306 	            l_upd_cost_rate_override_tab(l_upd_index)  := l_cost_rate_override_tab(i);
5307 	            l_upd_bcost_rate_override_tab(l_upd_index) := l_b_cost_rate_override_tab(i);
5308 	            l_upd_bill_rate_override_tab(l_upd_index)  := l_bill_rate_override_tab(i);
5309 	        ELSE
5310 	            -- Populate insert pl/sql tables
5311 	            l_ins_index := l_ins_index + 1;
5312 	            l_ins_tgt_res_asg_id_tab(l_ins_index)      := l_tgt_res_asg_id_tab(i);
5313 	            l_ins_start_date_tab(l_ins_index)          := l_start_date_tab(i);
5314 	            l_ins_txn_currency_code_tab(l_ins_index)   := l_txn_currency_code_tab(i);
5315 	            l_ins_end_date_tab(l_ins_index)            := l_end_date_tab(i);
5316 	            l_ins_periiod_name_tab(l_ins_index)        := l_periiod_name_tab(i);
5317 	            l_ins_src_quantity_tab(l_ins_index)        := l_src_quantity_tab(i);
5318 	            l_ins_txn_raw_cost_tab(l_ins_index)        := l_txn_raw_cost_tab(i);
5319 	            l_ins_txn_brdn_cost_tab(l_ins_index)       := l_txn_brdn_cost_tab(i);
5320 	            l_ins_txn_revenue_tab(l_ins_index)         := l_txn_revenue_tab(i);
5321 	            l_ins_pfc_revenue_tab(l_ins_index)         := l_pfc_revenue_tab(i);
5322 	            l_ins_pc_revenue_tab(l_ins_index)          := l_pc_revenue_tab(i);
5323 	            l_ins_cost_rate_override_tab(l_ins_index)  := l_cost_rate_override_tab(i);
5324 	            l_ins_bcost_rate_override_tab(l_ins_index) := l_b_cost_rate_override_tab(i);
5325 	            l_ins_bill_rate_override_tab(l_ins_index)  := l_bill_rate_override_tab(i);
5326 	        END IF;
5327 	    END LOOP;
5328 
5329         /* Now that we have insert/update tables populated, do Insert */
5330         FORALL i IN 1..l_ins_tgt_res_asg_id_tab.count
5331             INSERT INTO PA_BUDGET_LINES (
5332                 BUDGET_LINE_ID,
5333                 BUDGET_VERSION_ID,
5334                 RESOURCE_ASSIGNMENT_ID,
5335                 START_DATE,
5336                 TXN_CURRENCY_CODE,
5337                 TXN_RAW_COST,
5338                 TXN_BURDENED_COST,
5339                 TXN_REVENUE,
5340                 REVENUE,
5341                 PROJECT_REVENUE,
5342                 END_DATE,
5343                 PERIOD_NAME,
5344                 QUANTITY,
5345                 LAST_UPDATE_DATE,
5346                 LAST_UPDATED_BY,
5347                 CREATION_DATE,
5348                 CREATED_BY,
5349                 LAST_UPDATE_LOGIN,
5350                 PROJECT_CURRENCY_CODE,
5351                 PROJFUNC_CURRENCY_CODE,
5352                 TXN_COST_RATE_OVERRIDE,
5353                 BURDEN_COST_RATE_OVERRIDE,
5354                 TXN_BILL_RATE_OVERRIDE)
5355              VALUES (
5356                 pa_budget_lines_s.nextval,
5357                 P_TARGET_BV_ID,
5358                 l_ins_tgt_res_asg_id_tab(i),
5359                 l_ins_start_date_tab(i),
5360                 l_ins_txn_currency_code_tab(i),
5361                 l_ins_txn_raw_cost_tab(i),
5362                 l_ins_txn_brdn_cost_tab(i),
5363                 l_ins_txn_revenue_tab(i),
5364                 l_ins_pfc_revenue_tab(i),
5365                 l_ins_pc_revenue_tab(i),
5366                 l_ins_end_date_tab(i),
5367                 l_ins_periiod_name_tab(i),
5368                 l_ins_src_quantity_tab(i),
5369                 sysdate,
5370                 FND_GLOBAL.USER_ID,
5371                 sysdate,
5372                 FND_GLOBAL.USER_ID,
5373                 FND_GLOBAL.LOGIN_ID,
5374                 l_fp_cols_rec_target.X_PROJECT_CURRENCY_CODE,
5375                 l_fp_cols_rec_target.X_PROJFUNC_CURRENCY_CODE,
5376                 l_ins_cost_rate_override_tab(i),
5377                 l_ins_bcost_rate_override_tab(i),
5378                 l_ins_bill_rate_override_tab(i));
5379 
5380         IF l_upd_tgt_res_asg_id_tab.count > 0 THEN
5381             /* Now, go through the Update logic */
5382 
5383             IF l_rev_gen_method = 'C' AND
5384                l_fp_cols_rec_target.x_version_type = 'REVENUE' THEN
5385 
5386                 -- ER 4376722: Changed the update logic as follows.
5387                 -- Before: Set amount = NVL(actual amount,0) + update amount.
5388                 -- After:  If actual amount is null, then set amount = update amount.
5389                 --         If actual amount is not null, then
5390                 --            set amount = actual amount + NVL(update amount, 0)
5391                 --         The new logic preserves the non-null actual amounts.
5392                 -- This change is necessary in case update revenue is Null. Using the
5393                 -- old logic, we would set revenue to NVL(actual revenue,0) + Null,
5394                 -- which is just Null. In other words, the actual revenue would be lost.
5395                 -- Using the new logic, we would set revenue to actual revenue +
5396                 -- NVL(NULL,0) = actual revenue.
5397                 --
5398                 -- Also, modified range of iteration to use l_upd_tgt_res_asg_id_tab.count
5399                 -- instead of l_ins_tgt_res_asg_id_tab.count.
5400 
5401                 -- Add Actuals to Plan columns since Calculate API not called in this flow.
5402                 FORALL i IN 1..l_upd_tgt_res_asg_id_tab.count
5403                     UPDATE PA_BUDGET_LINES
5404                     SET    TXN_RAW_COST      =
5405                                DECODE(TXN_INIT_RAW_COST, null, l_upd_txn_raw_cost_tab(i),
5406                                       TXN_INIT_RAW_COST + NVL(l_upd_txn_raw_cost_tab(i),0)),
5407                            TXN_BURDENED_COST =
5408                                DECODE(TXN_INIT_BURDENED_COST, null, l_upd_txn_brdn_cost_tab(i),
5409                                       TXN_INIT_BURDENED_COST + NVL(l_upd_txn_brdn_cost_tab(i),0)),
5410                            TXN_REVENUE       =
5411 				   DECODE(TXN_INIT_REVENUE, null, l_upd_txn_revenue_tab(i),
5412 				          TXN_INIT_REVENUE + NVL(l_upd_txn_revenue_tab(i),0)),
5413                            REVENUE           =
5414 				   DECODE(INIT_REVENUE, null, l_upd_pfc_revenue_tab(i),
5415 				          INIT_REVENUE + NVL(l_upd_pfc_revenue_tab(i),0)),
5416                            PROJECT_REVENUE   =
5417 				   DECODE(PROJECT_INIT_REVENUE, null, l_upd_pc_revenue_tab(i),
5418 				          PROJECT_INIT_REVENUE + NVL(l_upd_pc_revenue_tab(i),0)),
5419                            QUANTITY          =
5420                                DECODE(INIT_QUANTITY, null, l_upd_src_quantity_tab(i),
5421                                       INIT_QUANTITY + NVL(l_upd_src_quantity_tab(i),0)),
5422                            START_DATE        = l_upd_start_date_tab(i),
5423                            END_DATE          = l_upd_end_date_tab(i),
5424                            PERIOD_NAME       = l_upd_periiod_name_tab(i),
5425                            LAST_UPDATE_DATE  = sysdate,
5426                            LAST_UPDATED_BY   = FND_GLOBAL.USER_ID,
5427                            LAST_UPDATE_LOGIN = FND_GLOBAL.LOGIN_ID,
5428                            TXN_COST_RATE_OVERRIDE    = l_upd_cost_rate_override_tab(i),
5429                            BURDEN_COST_RATE_OVERRIDE = l_upd_bcost_rate_override_tab(i),
5430                            TXN_BILL_RATE_OVERRIDE    = l_upd_bill_rate_override_tab(i)
5431                      WHERE budget_version_id = P_TARGET_BV_ID
5432                      AND   resource_assignment_id = l_upd_tgt_res_asg_id_tab(i)
5433                      AND   txn_currency_code = l_upd_txn_currency_code_tab(i);
5434             ELSE
5435                 -- ER 4376722: Modified range of iteration to use l_upd_tgt_res_asg_id_tab.count
5436                 -- instead of l_ins_tgt_res_asg_id_tab.count.
5437 
5438                 -- Set Plan columns to source plan amounts; Calculate API called in this flow.
5439                 FORALL i IN 1..l_upd_tgt_res_asg_id_tab.count
5440                     UPDATE PA_BUDGET_LINES
5441                     SET    TXN_RAW_COST      = l_upd_txn_raw_cost_tab(i),
5442                            TXN_BURDENED_COST = l_upd_txn_brdn_cost_tab(i),
5443                            TXN_REVENUE       = l_upd_txn_revenue_tab(i),
5444                            REVENUE           = l_upd_pfc_revenue_tab(i),
5445                            PROJECT_REVENUE   = l_upd_pc_revenue_tab(i),
5446                            QUANTITY          = l_upd_src_quantity_tab(i),
5447                            START_DATE        = l_upd_start_date_tab(i),
5448                            END_DATE          = l_upd_end_date_tab(i),
5449                            PERIOD_NAME       = l_upd_periiod_name_tab(i),
5450                            LAST_UPDATE_DATE  = sysdate,
5451                            LAST_UPDATED_BY   = FND_GLOBAL.USER_ID,
5452                            LAST_UPDATE_LOGIN = FND_GLOBAL.LOGIN_ID,
5453                            TXN_COST_RATE_OVERRIDE    = l_upd_cost_rate_override_tab(i),
5454                            BURDEN_COST_RATE_OVERRIDE = l_upd_bcost_rate_override_tab(i),
5455                            TXN_BILL_RATE_OVERRIDE    = l_upd_bill_rate_override_tab(i)
5456                      WHERE budget_version_id = P_TARGET_BV_ID
5457                      AND   resource_assignment_id = l_upd_tgt_res_asg_id_tab(i)
5458                      AND   txn_currency_code = l_upd_txn_currency_code_tab(i);
5459             END IF; -- Cost-based Revenue check
5460         END IF; -- Update logic
5461     ELSE
5462         FORALL i IN l_tgt_res_asg_id_tab.FIRST..l_tgt_res_asg_id_tab.LAST
5463             INSERT INTO PA_BUDGET_LINES (
5464                 BUDGET_LINE_ID,
5465                 BUDGET_VERSION_ID,
5466                 RESOURCE_ASSIGNMENT_ID,
5467                 START_DATE,
5468                 TXN_CURRENCY_CODE,
5469                 TXN_RAW_COST,
5470                 TXN_BURDENED_COST,
5471                 TXN_REVENUE,
5472                 REVENUE,
5473                 PROJECT_REVENUE,
5474                 END_DATE,
5475                 PERIOD_NAME,
5476                 QUANTITY,
5477                 LAST_UPDATE_DATE,
5478                 LAST_UPDATED_BY,
5479                 CREATION_DATE,
5480                 CREATED_BY,
5481                 LAST_UPDATE_LOGIN,
5482                 PROJECT_CURRENCY_CODE,
5483                 PROJFUNC_CURRENCY_CODE,
5484                 TXN_COST_RATE_OVERRIDE,
5485                 BURDEN_COST_RATE_OVERRIDE,
5486                 TXN_BILL_RATE_OVERRIDE,
5487                 TXN_MARKUP_PERCENT )        /* Added for Bug 5166047 */
5488              VALUES (
5489                 pa_budget_lines_s.nextval,
5490                 P_TARGET_BV_ID,
5491                 l_tgt_res_asg_id_tab(i),
5492                 l_start_date_tab(i),
5493                 l_txn_currency_code_tab(i),
5494                 l_txn_raw_cost_tab(i),
5495                 l_txn_brdn_cost_tab(i),
5496                 l_txn_revenue_tab(i),
5497                 l_pfc_revenue_tab(i),
5498                 l_pc_revenue_tab(i),
5499                 l_end_date_tab(i),
5500                 l_periiod_name_tab(i),
5501                 l_src_quantity_tab(i),
5502                 sysdate,
5503                 FND_GLOBAL.USER_ID,
5504                 sysdate,
5505                 FND_GLOBAL.USER_ID,
5506                 FND_GLOBAL.LOGIN_ID,
5507                 l_fp_cols_rec_target.X_PROJECT_CURRENCY_CODE,
5508                 l_fp_cols_rec_target.X_PROJFUNC_CURRENCY_CODE,
5509                 l_cost_rate_override_tab(i),
5510                 l_b_cost_rate_override_tab(i),
5511                 '', /* bug 7693017 */
5512                 l_markup_percent_tab(i));   /* Added for Bug 5166047 */
5513         IF P_PA_DEBUG_MODE = 'Y' THEN
5514             pa_fp_gen_amount_utils.fp_debug
5515                 ( p_msg         => 'After inserting into target budget lines',
5516                   p_module_name => l_module_name,
5517                   p_log_level   => 5 );
5518         END IF;
5519     END IF; -- (Forecast + None timephase) check
5520 
5521     -- IPM: New Entity ER ------------------------------------------
5522     -- Overview:
5523     -- The maintenance api (maintain_data) needs to be called to
5524     -- Rollup budget line amounts. This is required since budget
5525     -- lines are manually created before calling the Calculate API,
5526     -- which needs the rolled up amounts for its processing.
5527     -- This helps to avoid doubling of budget generation amounts
5528     -- when the source/target timephase codes are equal.
5529 
5530     IF l_calling_context = lc_BudgetGeneration THEN
5531         l_calling_module := 'BUDGET_GENERATION';
5532     ELSIF l_calling_context = lc_ForecastGeneration THEN
5533         l_calling_module := 'FORECAST_GENERATION';
5534     END IF;
5535 
5536     DELETE pa_resource_asgn_curr_tmp;
5537 
5538     INSERT INTO pa_resource_asgn_curr_tmp
5539         ( resource_assignment_id,
5540           txn_currency_code,
5541           txn_raw_cost_rate_override,
5542           txn_burden_cost_rate_override,
5543           txn_bill_rate_override )
5544     SELECT DISTINCT
5545            bl.resource_assignment_id,
5546            bl.txn_currency_code,
5547            rbc.txn_raw_cost_rate_override,
5548            rbc.txn_burden_cost_rate_override,
5549            rbc.txn_bill_rate_override
5550     FROM   pa_resource_assignments ra,
5551            pa_budget_lines bl,
5552            pa_resource_asgn_curr rbc,
5553            pa_res_list_map_tmp4 tmp4
5554     WHERE  ra.budget_version_id = p_target_bv_id
5555     AND    ra.project_id = p_project_id
5556     AND    ra.resource_assignment_id = tmp4.txn_resource_assignment_id
5557     AND    bl.resource_assignment_id = ra.resource_assignment_id
5558     AND    bl.resource_assignment_id = rbc.resource_assignment_id (+)
5559     AND    bl.txn_currency_code = rbc.txn_currency_code (+);
5560 
5561     -- Call the maintenance api in ROLLUP mode
5562     IF p_pa_debug_mode = 'Y' THEN
5563         PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
5564             P_MSG                   => 'Before calling PA_RES_ASG_CURRENCY_PUB.' ||
5565                                        'MAINTAIN_DATA',
5566           --P_CALLED_MODE           => p_called_mode,
5567             P_MODULE_NAME           => l_module_name);
5568     END IF;
5569     PA_RES_ASG_CURRENCY_PUB.MAINTAIN_DATA
5570           ( P_FP_COLS_REC           => l_fp_cols_rec_target,
5571             P_CALLING_MODULE        => l_calling_module,
5572             P_VERSION_LEVEL_FLAG    => 'N',
5573             P_ROLLUP_FLAG           => 'Y',
5574           --P_CALLED_MODE           => p_called_mode,
5575             X_RETURN_STATUS         => x_return_status,
5576             X_MSG_COUNT             => x_msg_count,
5577             X_MSG_DATA              => x_msg_data );
5578     IF p_pa_debug_mode = 'Y' THEN
5579         PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG(
5580             P_MSG                   => 'After calling PA_RES_ASG_CURRENCY_PUB.' ||
5581                                        'MAINTAIN_DATA: '||x_return_status,
5582           --P_CALLED_MODE           => p_called_mode,
5583             P_MODULE_NAME           => l_module_name);
5584     END IF;
5585     IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
5586         raise PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
5587     END IF;
5588     -- END OF IPM: New Entity ER ------------------------------------------
5589 
5590     IF P_PA_DEBUG_MODE = 'Y' THEN
5591         PA_DEBUG.RESET_CURR_FUNCTION;
5592     END IF;
5593 
5594  EXCEPTION
5595      WHEN PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc THEN
5596         l_msg_count := FND_MSG_PUB.count_msg;
5597         IF l_msg_count = 1 THEN
5598             PA_INTERFACE_UTILS_PUB.get_messages
5599                 ( p_encoded        => FND_API.G_TRUE,
5600                   p_msg_index      => 1,
5601                   p_msg_count      => l_msg_count,
5602                   p_msg_data       => l_msg_data,
5603                   p_data           => l_data,
5604                   p_msg_index_out  => l_msg_index_out);
5605             x_msg_data := l_data;
5606             x_msg_count := l_msg_count;
5607         ELSE
5608             x_msg_count := l_msg_count;
5609         END IF;
5610 
5611         ROLLBACK;
5612 
5613         x_return_status := FND_API.G_RET_STS_ERROR;
5614         IF P_PA_DEBUG_MODE = 'Y' THEN
5615             pa_fp_gen_amount_utils.fp_debug
5616                 ( p_msg         => 'Invalid Arguments Passed',
5617                   p_module_name => l_module_name,
5618                   p_log_level   => 5);
5619             PA_DEBUG.RESET_CURR_FUNCTION;
5620         END IF;
5621         RAISE;
5622     WHEN OTHERS THEN
5623         rollback;
5624         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5625         x_msg_count     := 1;
5626         x_msg_data      := substr(sqlerrm,1,240);
5627         FND_MSG_PUB.add_exc_msg
5628             ( p_pkg_name        => 'PA_FP_WP_GEN_BUDGET_AMT_PUB',
5629               p_procedure_name  => 'MAINTAIN_BUDGET_LINES',
5630               p_error_text      => substr(sqlerrm,1,240) );
5631 
5632         IF P_PA_DEBUG_MODE = 'Y' THEN
5633             pa_fp_gen_amount_utils.fp_debug
5634                 ( p_msg         => 'Unexpected Error'||substr(sqlerrm, 1, 240),
5635                   p_module_name => l_module_name,
5636                   p_log_level   => 5 );
5637             PA_DEBUG.RESET_CURR_FUNCTION;
5638         END IF;
5639         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5640 
5641 END MAINTAIN_BUDGET_LINES;
5642 
5643 
5644 /**
5645  * This procedure returns the flag parameters required by the Calculate API.
5646  * The flags are returned as a single string, x_calculate_api_code, which must
5647  * be parsed to retrieve individual flag values. The string is layed out as
5648  *    x_calculate_api_code = 'ABCD'
5649  * where
5650  *    A = x_refresh_rates_flag
5651  *    B = x_refresh_conv_rates_flag
5652  *    C = x_spread_required_flag
5653  *    D = x_conv_rates_required_flag
5654  * Thus, to retrieve the refresh rates flag, for example, use the expression
5655  *    l_refresh_rates_flag := SUBSTR(x_calculate_api_code,1,1);
5656  * and to retrieve the spread required flag, use the expression
5657  *    l_spread_required_flag := SUBSTR(x_calculate_api_code,3,1);
5658  * Note that each flag has value either 'Y' or 'N'.
5659  * Lastly, this description should be updated any time the layout of
5660  * x_calculate_api_code is modified.
5661  */
5662 PROCEDURE GET_CALC_API_FLAG_PARAMS
5663    (P_PROJECT_ID                   IN           PA_PROJECTS_ALL.PROJECT_ID%TYPE,
5664     P_FP_COLS_REC_SOURCE           IN           PA_FP_GEN_AMOUNT_UTILS.FP_COLS,
5665     P_FP_COLS_REC_TARGET           IN           PA_FP_GEN_AMOUNT_UTILS.FP_COLS,
5666     P_CALLING_CONTEXT              IN           VARCHAR2,
5667     X_CALCULATE_API_CODE           OUT NOCOPY   VARCHAR2,
5668     X_RETURN_STATUS                OUT NOCOPY   VARCHAR2,
5669     X_MSG_COUNT                    OUT NOCOPY   NUMBER,
5670     X_MSG_DATA                     OUT NOCOPY   VARCHAR2)
5671 IS
5672     l_module_name VARCHAR2(100) := 'PA.PLSQL.PA_FP_WP_GEN_BUDGET_AMT_PUB.'
5673                                    || 'GET_CALC_API_FLAG_PARAMS';
5674 
5675     l_uncategorized_flag           PA_RESOURCE_LISTS_ALL_BG.UNCATEGORIZED_FLAG%TYPE;
5676     l_wp_track_cost_flag           VARCHAR2(1);
5677 
5678     /* Time-phase determines if budget lines have been populated by generation code */
5679     l_same_time_phase_flag   VARCHAR2(1);
5680 
5681     /* Source Code constants */
5682     lc_WorkPlanSrcCode             CONSTANT PA_PROJ_FP_OPTIONS.GEN_COST_SRC_CODE%TYPE
5683                                        := 'WORKPLAN_RESOURCES';
5684     lc_FinancialPlanSrcCode        CONSTANT PA_PROJ_FP_OPTIONS.GEN_COST_SRC_CODE%TYPE
5685                                        := 'FINANCIAL_PLAN';
5686 
5687     /* String constants for valid Calling Context values */
5688     lc_BudgetGeneration            CONSTANT VARCHAR2(30) := 'BUDGET_GENERATION';
5689     lc_ForecastGeneration          CONSTANT VARCHAR2(30) := 'FORECAST_GENERATION';
5690 
5691     l_gen_src_code                 PA_PROJ_FP_OPTIONS.GEN_COST_SRC_CODE%TYPE;
5692     l_source_version_type          PA_BUDGET_VERSIONS.VERSION_TYPE%TYPE;
5693     l_target_version_type          PA_BUDGET_VERSIONS.VERSION_TYPE%TYPE;
5694     l_rev_gen_method               VARCHAR2(1);
5695 
5696     /* Local Calculate API flag parameters */
5697     l_refresh_rates_flag           VARCHAR2(1);
5698     l_refresh_conv_rates_flag      VARCHAR2(1);
5699     l_spread_required_flag         VARCHAR2(1);
5700     l_conv_rates_required_flag     VARCHAR2(1);
5701 
5702     l_count                        NUMBER;
5703     l_msg_count                    NUMBER;
5704     l_data                         VARCHAR2(1000);
5705     l_msg_data                     VARCHAR2(1000);
5706     l_msg_index_out                NUMBER;
5707 BEGIN
5708     x_return_status := FND_API.G_RET_STS_SUCCESS;
5709     x_msg_count := 0;
5710 
5711     IF p_pa_debug_mode = 'Y' THEN
5712         PA_DEBUG.SET_CURR_FUNCTION
5713             ( p_function   => 'GET_CALC_API_FLAG_PARAMS',
5714               p_debug_mode => p_pa_debug_mode );
5715     END IF;
5716 
5717     /* Check that the input parameters are not null */
5718     IF p_project_id IS NULL THEN
5719         PA_UTILS.ADD_MESSAGE
5720             ( p_app_short_name => 'PA',
5721               p_msg_name       => 'PA_FP_INV_PARAM_PASSED' );
5722         RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
5723     END IF;
5724 
5725     /* Initialize local variables */
5726     l_rev_gen_method := nvl(p_fp_cols_rec_target.x_revenue_derivation_method,PA_FP_GEN_FCST_PG_PKG.GET_REV_GEN_METHOD(p_project_id)); --Bug 5462471
5727     l_source_version_type := p_fp_cols_rec_source.x_version_type;
5728     l_target_version_type := p_fp_cols_rec_target.x_version_type;
5729 
5730     -- Bug 5705549: When l_rev_gen_method is null, only raise an error if the
5731     -- target version has revenue (i.e. version type is 'ALL' or 'REVENUE').
5732     IF l_source_version_type IS NULL OR
5733        l_target_version_type IS NULL OR
5734       (l_rev_gen_method IS NULL AND
5735        l_target_version_type IN ('ALL','REVENUE')) THEN
5736         PA_UTILS.ADD_MESSAGE
5737             ( p_app_short_name => 'PA',
5738               p_msg_name       => 'PA_FP_INV_PARAM_PASSED' );
5739         RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
5740     END IF;
5741 
5742     l_wp_track_cost_flag :=
5743         NVL( PA_FP_WP_GEN_AMT_UTILS.GET_WP_TRACK_COST_AMT_FLAG(p_project_id), 'N' );
5744 
5745     IF p_calling_context = lc_BudgetGeneration THEN
5746         l_gen_src_code := p_fp_cols_rec_target.x_gen_src_code;
5747     ELSIF  p_calling_context = lc_ForecastGeneration THEN
5748         l_gen_src_code := p_fp_cols_rec_target.x_gen_etc_src_code;
5749     END IF;
5750 
5751     /* Set the same time-phase flag */
5752     IF p_fp_cols_rec_source.x_time_phased_code =
5753        p_fp_cols_rec_target.x_time_phased_code THEN
5754         l_same_time_phase_flag := 'Y';
5755     ELSE
5756         l_same_time_phase_flag := 'N';
5757     END IF;
5758 
5759     /* Initialize Calculate API parameter flags.
5760      * Defaults are chosen to maximize the number of cases covered by default. */
5761     l_refresh_rates_flag := 'N';
5762     l_refresh_conv_rates_flag := 'N';
5763     l_spread_required_flag := 'N';
5764     l_conv_rates_required_flag := 'Y';
5765 
5766     IF l_same_time_phase_flag = 'N' THEN
5767         l_spread_required_flag := 'Y';
5768     END IF;
5769 
5770     IF l_wp_track_cost_flag = 'N' AND
5771        l_gen_src_code = lc_WorkPlanSrcCode AND
5772        l_same_time_phase_flag = 'Y' THEN
5773         l_refresh_rates_flag := 'Y';
5774     END IF;
5775 
5776     /* Scenarios with non-default parameter values */
5777     IF l_gen_src_code = lc_FinancialPlanSrcCode OR
5778        ( l_wp_track_cost_flag = 'Y' AND
5779          l_gen_src_code = lc_WorkPlanSrcCode ) THEN
5780         IF l_same_time_phase_flag = 'Y' THEN
5781             IF l_source_version_type = 'COST' AND
5782                l_target_version_type = 'REVENUE' AND
5783                l_rev_gen_method = 'T' THEN
5784                 l_refresh_rates_flag := 'Y';
5785             ELSIF l_source_version_type = 'COST' AND
5786                   l_target_version_type = 'ALL' AND
5787                   l_rev_gen_method = 'T' THEN
5788                 l_refresh_rates_flag := 'R';
5789             ELSIF l_source_version_type = 'REVENUE' AND
5790                   l_target_version_type = 'COST' THEN
5791                   /* l_rev_gen_method = 'T' THEN */ -- commented out for Bug 5705549
5792                 l_refresh_rates_flag := 'Y';
5793             ELSIF l_source_version_type = 'REVENUE' AND
5794                   l_target_version_type = 'ALL' AND
5795                   l_rev_gen_method = 'T' THEN
5796                 l_refresh_rates_flag := 'C';
5797             END IF;
5798         ELSE
5799             -- Bug 4024983: The partial refresh flag value R (Refresh revenue
5800             -- amt only) and C (Refresh cost amt only) should be used only when
5801             -- the budget lines are created by the generation process. When
5802             -- budget lines have not be created, we can pass the spread flag
5803             -- as 'Y' and the refresh rates flag as 'N'.
5804             IF l_source_version_type = 'COST' AND
5805                l_target_version_type = 'ALL' AND
5806                l_rev_gen_method = 'T' THEN
5807                 l_refresh_rates_flag := 'N'; --'R';
5808             ELSIF l_source_version_type = 'REVENUE' AND
5809                   l_target_version_type = 'ALL' AND
5810                   l_rev_gen_method = 'T' THEN
5811                 l_refresh_rates_flag := 'N'; --'C';
5812             END IF;
5813         END IF; -- l_same_time_phase_flag
5814     ELSIF ( l_wp_track_cost_flag = 'N' AND
5815             l_gen_src_code = lc_WorkPlanSrcCode ) THEN
5816         IF l_same_time_phase_flag = 'Y' THEN
5817             IF l_source_version_type = 'COST' AND
5818                l_target_version_type = 'ALL' AND
5819                l_rev_gen_method = 'C' THEN
5820                 l_refresh_rates_flag := 'C';
5821             ELSIF l_source_version_type = 'COST' AND
5822                   l_target_version_type = 'ALL' AND
5823                   l_rev_gen_method = 'E' THEN
5824                 l_refresh_rates_flag := 'C';
5825             END IF;
5826         ELSE
5827             IF l_source_version_type = 'COST' AND
5828                l_target_version_type = 'ALL' AND
5829                l_rev_gen_method = 'C' THEN
5830                 l_refresh_rates_flag := 'N'; --'C';
5831             ELSIF l_source_version_type = 'COST' AND
5832                   l_target_version_type = 'ALL' AND
5833                   l_rev_gen_method = 'E' THEN
5834                 l_refresh_rates_flag := 'N'; --'C';
5835            END IF;
5836         END IF; -- l_same_time_phase_flag
5837     END IF; -- l_wp_track_cost_flag
5838 
5839     /* The order in which the parameters are concatenated is important.
5840      * Reference the description at the top of this procedure for details.
5841      * None of the flags should be NULL, since that would alter the layout
5842      * of the return code. */
5843     x_calculate_api_code := l_refresh_rates_flag
5844                             || l_refresh_conv_rates_flag
5845                             || l_spread_required_flag
5846                             || l_conv_rates_required_flag;
5847    /* dbms_output.put_line(' l_refresh_rates_flag:' || l_refresh_rates_flag );
5848    dbms_output.put_line(' l_refresh_conv_rates_flag:' || l_refresh_conv_rates_flag );
5849    dbms_output.put_line(' l_spread_required_flag:' || l_spread_required_flag );
5850    dbms_output.put_line(' l_conv_rates_required_flag:' || l_conv_rates_required_flag );
5851    dbms_output.put_line('inside calc api code api :' || x_calculate_api_code );   */
5852     IF p_pa_debug_mode = 'Y' THEN
5853         PA_DEBUG.RESET_CURR_FUNCTION;
5854     END IF;
5855 EXCEPTION
5856     WHEN PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc THEN
5857         l_msg_count := FND_MSG_PUB.count_msg;
5858         IF l_msg_count = 1 THEN
5859             PA_INTERFACE_UTILS_PUB.GET_MESSAGES
5860                 ( p_encoded        => FND_API.G_TRUE,
5861                   p_msg_index      => 1,
5862                   p_msg_count      => l_msg_count,
5863                   p_msg_data       => l_msg_data,
5864                   p_data           => l_data,
5865                   p_msg_index_out  => l_msg_index_out );
5866             x_msg_data := l_data;
5867             x_msg_count := l_msg_count;
5868         ELSE
5869             x_msg_count := l_msg_count;
5870         END IF;
5871 
5872         ROLLBACK;
5873         x_return_status := FND_API.G_RET_STS_ERROR;
5874 
5875         IF p_pa_debug_mode = 'Y' THEN
5876             PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG
5877                 ( p_msg         => 'Invalid Arguments Passed',
5878                   p_module_name => l_module_name,
5879                   p_log_level   => 5 );
5880             PA_DEBUG.RESET_CURR_FUNCTION;
5881         END IF;
5882         RAISE;
5883     WHEN OTHERS THEN
5884         ROLLBACK;
5885         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5886         x_msg_count     := 1;
5887         x_msg_data      := substr(sqlerrm,1,240);
5888         FND_MSG_PUB.ADD_EXC_MSG
5889             ( p_pkg_name        => 'PA_FP_WP_GEN_BUDGET_AMT_PUB',
5890               p_procedure_name  => 'GET_CALC_API_FLAG_PARAMS',
5891               p_error_text      => substr(sqlerrm,1,240) );
5892 
5893         IF p_pa_debug_mode = 'Y' THEN
5894             PA_FP_GEN_AMOUNT_UTILS.FP_DEBUG
5895                 ( p_msg         => 'Unexpected Error'||substr(sqlerrm, 1, 240),
5896                   p_module_name => l_module_name,
5897                   p_log_level   => 5 );
5898             PA_DEBUG.RESET_CURR_FUNCTION;
5899         END IF;
5900         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5901 
5902 END GET_CALC_API_FLAG_PARAMS;
5903 
5904 END PA_FP_WP_GEN_BUDGET_AMT_PUB;