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;