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