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