1 PACKAGE BODY Pa_Fp_Control_Items_Utils AS
2 /* $Header: PAFPCIUB.pls 120.15.12020000.2 2012/07/19 09:36:22 admarath ship $ */
3 P_PA_DEBUG_MODE varchar2(1) := NVL(FND_PROFILE.value('PA_DEBUG_MODE'), 'N');
4 g_module_name VARCHAR2(100) := 'pa.plsql.PA_CONTROL_ITEM_UTILS';
5
6 --Bug 5845142. These variables are only for internal usage of check_valid_combo(for cvc) function
7 --and should not be used in other procedures/functions
8 l_cvc_project_id NUMBER;
9 l_cvc_app_cost_pt_rev_flag pa_proj_fp_options.approved_cost_plan_type_flag%TYPE;
10 l_cvc_app_cost_pt_pref_code pa_proj_fp_options.fin_plan_preference_code%TYPE;
11 --Bug 5845142
12
13 PROCEDURE Get_Fin_Plan_Dtls(p_project_id IN Pa_Projects_All.Project_Id%TYPE,
14 p_ci_id IN NUMBER,
15 x_fin_plan_type_id_cost OUT NOCOPY NUMBER, --File.Sql.39 bug 4440895
16 x_fin_plan_type_id_rev OUT NOCOPY NUMBER, --File.Sql.39 bug 4440895
17 x_fin_plan_type_id_all OUT NOCOPY NUMBER, --File.Sql.39 bug 4440895
18 x_fp_type_id_margin_code OUT NOCOPY NUMBER, --File.Sql.39 bug 4440895
19 x_margin_derived_from_code OUT NOCOPY VARCHAR2, --File.Sql.39 bug 4440895
20 x_report_labor_hours_code OUT NOCOPY VARCHAR2, --File.Sql.39 bug 4440895
21 x_fp_pref_code OUT NOCOPY VARCHAR2, --File.Sql.39 bug 4440895
22 x_project_currency_code OUT NOCOPY VARCHAR2, --File.Sql.39 bug 4440895
23 x_baseline_funding_flag OUT NOCOPY VARCHAR2, --File.Sql.39 bug 4440895
24 x_msg_data OUT NOCOPY VARCHAR2, --File.Sql.39 bug 4440895
25 x_msg_count OUT NOCOPY NUMBER, --File.Sql.39 bug 4440895
26 x_return_status OUT NOCOPY VARCHAR2, --File.Sql.39 bug 4440895
27 x_ci_type_class_code OUT NOCOPY VARCHAR2, --File.Sql.39 bug 4440895
28 x_no_of_ci_plan_versions OUT NOCOPY NUMBER, --File.Sql.39 bug 4440895
29 x_ci_est_qty OUT NOCOPY NUMBER, --File.Sql.39 bug 4440895
30 x_ci_planned_qty OUT NOCOPY NUMBER, --File.Sql.39 bug 4440895
31 x_baselined_planned_qty OUT NOCOPY NUMBER, --File.Sql.39 bug 4440895
32 x_ci_ver_plan_prc_code OUT NOCOPY pa_budget_versions.plan_processing_code%TYPE, --File.Sql.39 bug 4440895
33 x_request_id OUT NOCOPY pa_budget_versions.request_id%TYPE) IS --File.Sql.39 bug 4440895
34
35 l_no_of_app_plan_types NUMBER;
36 l_tmp_fin_plan_type_id NUMBER;
37 l_rev_budget_flag Pa_Project_Types_All.Allow_Rev_Budget_Entry_Flag%TYPE;
38 l_cost_budget_flag Pa_Project_Types_All.Allow_Cost_Budget_Entry_Flag%TYPE;
39 l_impact_type VARCHAR2(30); -- Bug 3734840
40 BEGIN
41 x_ci_est_qty := NULL;
42 x_ci_planned_qty := NULL;
43 x_baselined_planned_qty := NULL;
44
45 x_return_status := FND_API.G_RET_STS_SUCCESS;
46 x_msg_count := 0;
47 x_no_of_ci_plan_versions := 0;
48 x_margin_derived_from_code := 'B';
49 IF P_PA_DEBUG_MODE = 'Y' THEN
50 pa_debug.init_err_stack('PA_FP_CONTROL_ITEMS_UTILS.Get_Fin_Plan_Dtls');
51 END IF;
52 FND_MSG_PUB.initialize;
53
54 x_ci_est_qty := pa_fin_plan_utils.Get_Approved_Budget_Ver_Qty(
55 p_project_id => p_project_id,
56 p_version_code => 'CTRL_ITEM_VERSION',
57 p_quantity_type => 'ESTIMATED',
58 p_ci_id => p_ci_id );
59
60 x_ci_planned_qty := pa_fin_plan_utils.Get_Approved_Budget_Ver_Qty(
61 p_project_id => p_project_id,
62 p_version_code => 'CTRL_ITEM_VERSION',
63 p_quantity_type => 'PLANNED',
64 p_ci_id => p_ci_id );
65
66 x_baselined_planned_qty := pa_fin_plan_utils.Get_Approved_Budget_Ver_Qty(
67 p_project_id => p_project_id,
68 p_version_code => 'CURRENT_BASELINED_VERSION',
69 p_quantity_type => 'PLANNED',
70 p_ci_id => NULL );
71
72 BEGIN
73 SELECT Project_Currency_Code, NVL(Baseline_Funding_Flag,'N')
74 INTO
75 x_project_currency_code,
76 x_baseline_funding_flag
77 FROM
78 Pa_Projects_All WHERE Project_Id = p_project_id;
79 EXCEPTION
80 WHEN NO_DATA_FOUND THEN
81 x_baseline_funding_flag := 'N';
82 END;
83
84 x_ci_type_class_code := Pa_Control_Items_Utils.GetCiTypeClassCode(p_ci_id);
85
86 SELECT COUNT(*) INTO x_no_of_ci_plan_versions FROM pa_budget_Versions
87 WHERE project_id = p_project_id AND
88 nvl(ci_id,-1) = p_ci_id;
89
90 SELECT COUNT(*) INTO l_no_of_app_plan_types FROM Pa_Proj_Fp_Options
91 WHERE
92 Project_Id = p_project_id AND
93 Fin_Plan_Option_Level_Code = 'PLAN_TYPE' AND
94 ( NVL(Approved_Cost_Plan_Type_Flag ,'N') = 'Y' OR
95 NVL(Approved_Rev_Plan_Type_Flag ,'N') = 'Y' ) ;
96 IF l_no_of_app_plan_types = 1 THEN
97 SELECT Fin_Plan_Preference_Code,
98 Report_Labor_Hrs_From_Code,
99 Fin_Plan_Type_Id
100 INTO
101 x_fp_pref_code,
102 x_report_labor_hours_code,
103 l_tmp_fin_plan_type_id
104 FROM Pa_Proj_Fp_Options WHERE
105 Project_Id = p_project_id AND
106 Fin_Plan_Option_Level_Code = 'PLAN_TYPE' AND
107 ( NVL(Approved_Cost_Plan_Type_Flag ,'N') = 'Y' OR
108 NVL(Approved_Rev_Plan_Type_Flag ,'N') = 'Y');
109
110 /* EnC changes start commented as it is returing wrong pref code
111 -- the following query is for rendering the direct cost region.bug#8395873
112 select --typ.cost_col_flag,
113 --typ.rev_col_flag,
114 --typ.DIR_COST_REG_FLAG,
115 -- typ.SUPP_COST_REG_FLAG,
116 decode(typ.DIR_REG_REV_COL_FLAG,'N','COST_ONLY','COST_AND_REV_SAME')
117 INTO
118 x_fp_pref_code
119 FROM pa_ci_types_b typ,pa_control_items ci
120 WHERE ci.ci_type_id = typ.ci_type_id
121 and ci.Project_Id = p_project_id
122 and ci.ci_id = p_ci_id
123 and typ.impact_budget_type_code in('DIRECT_COST_ENTRY');
124
125 EnC changes end */
126
127 IF x_fp_pref_code = 'COST_ONLY' THEN
128 x_fin_plan_type_id_cost := l_tmp_fin_plan_type_id;
129 x_baseline_funding_flag := 'N';
130 ELSIF x_fp_pref_code = 'REVENUE_ONLY' THEN
131 x_fin_plan_type_id_rev := l_tmp_fin_plan_type_id;
132 ELSIF x_fp_pref_code = 'COST_AND_REV_SAME' THEN
133 x_fin_plan_type_id_all := l_tmp_fin_plan_type_id;
134 ELSIF x_fp_pref_code = 'COST_AND_REV_SEP' THEN
135 x_fin_plan_type_id_all := l_tmp_fin_plan_type_id;
136 END IF;
137 x_fp_type_id_margin_code := l_tmp_fin_plan_type_id;
138
139 /* Bug 3734840- Getting the margin_derived from code from the cost CI version
140 * if it is already created or getting it from the plan type
141 */
142 l_impact_type := is_impact_exists(p_ci_id);
143 x_margin_derived_from_code := 'B'; /* Defaulting */
144
145 IF l_impact_type IN ('COST','BOTH') THEN
146 /* Bug 3755860- Handled np_data_found
147 */
148 BEGIN
149 SELECT Nvl(fpo.margin_derived_from_code, 'B'),
150 bv.plan_processing_code,
151 bv.request_id
152 INTO x_margin_derived_from_code,
153 x_ci_ver_plan_prc_code,
154 x_request_id
155 FROM pa_proj_fp_options fpo,
156 pa_budget_versions bv
157 WHERE bv.ci_id = p_ci_id
158 AND bv.version_type in ('COST','ALL')
159 AND fpo.fin_plan_version_id = bv.budget_version_id
160 AND bv.project_id = p_project_id;
161
162 EXCEPTION
163 WHEN NO_DATA_FOUND THEN
164 x_margin_derived_from_code := 'B';
165 END;
166
167 -- putting the following select the plan_processing_code and request_id
168 -- only for the CI version with revenue impact
169 ELSIF l_impact_type = 'REVENUE' THEN
170 SELECT bv.plan_processing_code,
171 bv.request_id
172 INTO x_ci_ver_plan_prc_code,
173 x_request_id
174 FROM pa_budget_versions bv
175 WHERE bv.ci_id = p_ci_id
176 AND bv.version_type = 'REVENUE'
177 AND bv.project_id = p_project_id;
178 ELSE
179 BEGIN
180 SELECT Nvl(fpo.margin_derived_from_code, 'B'),
181 bv.plan_processing_code,
182 bv.request_id
183 INTO x_margin_derived_from_code,
184 x_ci_ver_plan_prc_code,
185 x_request_id
186 FROM pa_proj_fp_options fpo,
187 pa_budget_versions bv
188 WHERE fpo.project_id = p_project_id
189 AND bv.current_working_flag = 'Y'
190 AND fpo.fin_plan_version_id = bv.budget_version_id
191 AND bv.approved_cost_plan_type_flag = 'Y';
192
193 EXCEPTION
194 WHEN NO_DATA_FOUND THEN
195 x_margin_derived_from_code := 'B';
196 END;
197 END IF;
198
199 ELSIF l_no_of_app_plan_types = 2 THEN
200
201 /* Bug 3734840- Getting the margin_derived from code from the cost CI version
202 * if it is already created or getting it from the plan type
203 */
204 l_impact_type := is_impact_exists(p_ci_id);
205 x_margin_derived_from_code := 'B'; /* Defaulting */
206
207 IF l_impact_type IN ('COST','BOTH') THEN
208 BEGIN
209 SELECT Nvl(fpo.margin_derived_from_code, 'B'),
210 bv.plan_processing_code,
211 bv.request_id
212 INTO x_margin_derived_from_code,
213 x_ci_ver_plan_prc_code,
214 x_request_id
215 FROM pa_proj_fp_options fpo,
216 pa_budget_versions bv
217 WHERE bv.ci_id = p_ci_id
218 AND bv.version_type in ('COST','ALL')
219 AND fpo.fin_plan_version_id = bv.budget_version_id
220 AND bv.project_id = p_project_id;
221
222 EXCEPTION
223 WHEN NO_DATA_FOUND THEN
224 x_margin_derived_from_code := 'B';
225 END;
226
227 -- putting the following select the plan_processing_code and request_id
228 -- only for the CI version with revenue impact
229 ELSIF l_impact_type = 'REVENUE' THEN
230 SELECT bv.plan_processing_code,
231 bv.request_id
232 INTO x_ci_ver_plan_prc_code,
233 x_request_id
234 FROM pa_budget_versions bv
235 WHERE bv.ci_id = p_ci_id
236 AND bv.version_type = 'REVENUE'
237 AND bv.project_id = p_project_id;
238
239 ELSE
240 BEGIN
241 SELECT Nvl(fpo.margin_derived_from_code, 'B'),
242 bv.plan_processing_code,
243 bv.request_id
244 INTO x_margin_derived_from_code,
245 x_ci_ver_plan_prc_code,
246 x_request_id
247 FROM pa_proj_fp_options fpo,
248 pa_budget_versions bv
249 WHERE fpo.project_id = p_project_id
250 AND bv.current_working_flag = 'Y'
251 AND fpo.fin_plan_version_id = bv.budget_version_id
252 AND bv.approved_cost_plan_type_flag = 'Y';
253
254 EXCEPTION
255 WHEN NO_DATA_FOUND THEN
256 x_margin_derived_from_code := 'B';
257 END;
258 END IF;
259
260 SELECT Fin_Plan_Preference_Code,
261 Report_Labor_Hrs_From_Code,
262 Fin_Plan_Type_Id
263 INTO
264 x_fp_pref_code,
265 x_report_labor_hours_code,
266 x_fin_plan_type_id_cost
267 FROM Pa_Proj_Fp_Options WHERE
268 Project_Id = p_project_id AND
269 Fin_Plan_Option_Level_Code = 'PLAN_TYPE' AND
270 NVL(Approved_Cost_Plan_Type_Flag ,'N') = 'Y';
271
272 /* if the no of approved plan types is 2, then the pref code is
273 assumed to be COST_AND_REV_SEP, because two edit button should be shown */
274
275 x_fp_pref_code := 'COST_AND_REV_SEP';
276
277
278 SELECT Fin_Plan_Type_Id INTO x_fin_plan_type_id_rev
279 FROM Pa_Proj_Fp_Options WHERE
280 Project_Id = p_project_id AND
281 Fin_Plan_Option_Level_Code = 'PLAN_TYPE' AND
282 NVL(Approved_Rev_Plan_Type_Flag ,'N') = 'Y';
283
284 x_fp_type_id_margin_code := x_fin_plan_type_id_cost;
285 ELSIF l_no_of_app_plan_types = 0 THEN
286 SELECT NVL(Allow_Rev_Budget_Entry_Flag ,'N'),
287 NVL(Allow_Cost_Budget_Entry_Flag,'N') INTO
288 l_rev_budget_flag,
289 l_cost_budget_flag FROM
290 Pa_Projects_All p, Pa_Project_Types_All pt WHERE
291 p.project_id = p_project_id AND
292 p.project_type = pt.project_type AND
293 -- MOAC changes
294 -- removing the nvl from org_id.
295 -- NVL(p.org_id,-99) = NVL(pt.org_id,-99);
296 p.org_id = pt.org_id;
297 IF l_rev_budget_flag = 'Y' AND l_cost_budget_flag = 'N' THEN
298 x_fp_pref_code := 'REVENUE_ONLY';
299 ELSIF l_rev_budget_flag = 'N' AND l_cost_budget_flag = 'Y' THEN
300 x_fp_pref_code := 'COST_ONLY';
301 ELSIF l_rev_budget_flag = 'Y' AND l_cost_budget_flag = 'Y' THEN
302 x_fp_pref_code := 'COST_AND_REV_SEP';
303 END IF;
304 END IF;
305 Pa_Debug.Reset_Err_Stack;
306 EXCEPTION
307 WHEN OTHERS THEN
308 FND_MSG_PUB.Add_Exc_Msg(
309 p_pkg_name => 'PA_FP_CONTROL_ITEMS_UTILS.Get_Fin_Plan_Dtls'
310 ,p_procedure_name => PA_DEBUG.G_Err_Stack);
311 IF P_PA_DEBUG_MODE = 'Y' THEN
312 pa_debug.write_file('Get_Fin_Plan_Dtls: ' || SQLERRM);
313 END IF;
314 pa_debug.reset_err_stack;
315 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
316 RAISE;
317 END Get_Fin_Plan_Dtls;
318
319
320 FUNCTION Is_Financial_Planning_Allowed(p_project_id NUMBER)
321 RETURN VARCHAR2 IS
322 l_fp_allowed_flag VARCHAR2(1) := 'N' ;
323 BEGIN
324 BEGIN
325 SELECT 'Y' INTO l_fp_allowed_flag FROM
326 Pa_Projects_All p,
327 Pa_Project_Types_All pt
328 WHERE
329 p.Project_Id = p_project_id AND
330 p.Project_Type = pt.Project_Type AND
331 -- MOAC changes
332 -- removing the nvl from org_id.
333 -- NVL(p.org_id,-99) = NVL(pt.org_id,-99) AND
334 p.org_id = pt.org_id AND
335 ( NVL(pt.ALLOW_COST_BUDGET_ENTRY_FLAG,'N') = 'Y' OR
336 NVL(pt.ALLOW_REV_BUDGET_ENTRY_FLAG,'N') = 'Y' );
337 RETURN l_fp_allowed_flag;
338 EXCEPTION
339 WHEN OTHERS THEN
340 l_fp_allowed_flag := 'N';
341 RETURN l_fp_allowed_flag;
342 END;
343 END Is_Financial_Planning_Allowed;
344
345 PROCEDURE GET_FINPLAN_CI_TYPE_NAME
346 (
347 p_ci_id IN NUMBER,
348 x_ci_type_name OUT NOCOPY VARCHAR2, --File.Sql.39 bug 4440895
349 x_msg_data OUT NOCOPY VARCHAR2, --File.Sql.39 bug 4440895
350 x_msg_count OUT NOCOPY NUMBER, --File.Sql.39 bug 4440895
351 x_return_status OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
352
353 )
354 IS
355 l_debug_mode VARCHAR2(30);
356
357 BEGIN
358
359 IF P_PA_DEBUG_MODE = 'Y' THEN
360 pa_debug.init_err_stack('PA_FP_CONTROL_ITEMS_UTILS.get_finplan_ci_type_name');
361 END IF;
362
363 fnd_profile.get('PA_DEBUG_MODE',l_debug_mode);
364 l_debug_mode := NVL(l_debug_mode, 'Y');
365
366 pa_debug.set_process('PLSQL','LOG',l_debug_mode);
367
368 SELECT
369 pacitl.name into x_ci_type_name
370 FROM pa_control_items paci, pa_ci_types_tl pacitl
371 WHERE
372 paci.ci_id = p_ci_id
373 and paci.ci_type_id = pacitl.ci_type_id
374 and pacitl.language = userenv('lang');
375
376 IF x_ci_type_name IS NULL THEN
377 pa_debug.g_err_stage := 'x_ci_type_name [ IS NULL ]';
378 IF P_PA_DEBUG_MODE = 'Y' THEN
379 pa_debug.write_file('GET_FINPLAN_CI_TYPE_NAME: ' || pa_debug.g_err_stage);
380 END IF;
381 END IF;
382 pa_debug.reset_err_stack;
383 EXCEPTION
384 WHEN NO_DATA_FOUND THEN
385 null;
386 WHEN OTHERS THEN
387 FND_MSG_PUB.add_exc_msg(
388 p_pkg_name => 'PA_FP_CONTROL_ITEMS_UTILS.get_finplan_ci_type_name'
389 ,p_procedure_name => PA_DEBUG.G_Err_Stack);
390 IF P_PA_DEBUG_MODE = 'Y' THEN
391 pa_debug.write_file('GET_FINPLAN_CI_TYPE_NAME: ' || SQLERRM);
392 END IF;
393 pa_debug.reset_err_stack;
394 END get_finplan_ci_type_name;
395
396 PROCEDURE get_fp_ci_agreement_dtls
397 (
398 p_project_id IN NUMBER,
399 p_ci_id IN NUMBER,
400 x_agreement_num OUT NOCOPY VARCHAR2, --File.Sql.39 bug 4440895
401 x_agreement_amount OUT NOCOPY NUMBER, --File.Sql.39 bug 4440895
402 x_agreement_currency_code OUT NOCOPY VARCHAR2, --File.Sql.39 bug 4440895
403 x_msg_data OUT NOCOPY VARCHAR2, --File.Sql.39 bug 4440895
404 x_msg_count OUT NOCOPY NUMBER, --File.Sql.39 bug 4440895
405 x_return_status OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
406 )
407 IS
408 l_debug_mode varchar2(30) := 'Y';
409
410 BEGIN
411 IF P_PA_DEBUG_MODE = 'Y' THEN
412 pa_debug.init_err_stack('get_fp_ci_agreement_dtls: ' || 'PA_FP_CONTROL_ITEMS_UTILS.get_fp_ci_agreement_dtls');
413 END IF;
414
415 fnd_profile.get('PA_DEBUG_MODE',l_debug_mode);
416 l_debug_mode := NVL(l_debug_mode, 'Y');
417 SELECT pg.agreement_num,
418 pg.amount,
419 pg.agreement_currency_code
420 INTO x_agreement_num,
421 x_agreement_amount,
422 x_agreement_currency_code
423 FROM pa_agreements_all pg, pa_budget_versions bv
424 WHERE
425 bv.project_id = p_project_id
426 and bv.ci_id = p_ci_id
427 and bv.agreement_id = pg.agreement_id
428 and bv.version_type in ('REVENUE','ALL'); -- Raja FP M Change Bug 3619687
429 --and rownum < 2;
430
431 IF x_agreement_num IS NULL THEN
432 pa_debug.g_err_stage := 'x_agreement_num [ IS NULL ]';
433 IF P_PA_DEBUG_MODE = 'Y' THEN
434 pa_debug.write_file('get_fp_ci_agreement_dtls: ' || pa_debug.g_err_stage);
435 END IF;
436 END IF;
437 IF x_agreement_amount IS NULL THEN
438 pa_debug.g_err_stage := 'x_agreement_amount [ IS NULL ]';
439 IF P_PA_DEBUG_MODE = 'Y' THEN
440 pa_debug.write_file('get_fp_ci_agreement_dtls: ' || pa_debug.g_err_stage);
441 END IF;
442 END IF;
443 IF x_agreement_currency_code IS NULL THEN
444 pa_debug.g_err_stage := 'x_agreement_currency_code [ IS NULL ]';
445 IF P_PA_DEBUG_MODE = 'Y' THEN
446 pa_debug.write_file('get_fp_ci_agreement_dtls: ' || pa_debug.g_err_stage);
447 END IF;
448 END IF;
449 pa_debug.reset_err_stack;
450 EXCEPTION
451 WHEN NO_DATA_FOUND THEN
452 null;
453 WHEN OTHERS THEN
454 FND_MSG_PUB.add_exc_msg(
455 p_pkg_name => 'PA_FP_CONTROL_ITEMS_UTILS.get_fp_ci_agreement_dtls'
456 ,p_procedure_name => PA_DEBUG.G_Err_Stack);
457 IF P_PA_DEBUG_MODE = 'Y' THEN
458 pa_debug.write_file('get_fp_ci_agreement_dtls: ' || SQLERRM);
459 END IF;
460 pa_debug.reset_err_stack;
461 END get_fp_ci_agreement_dtls;
462
463 /*********************************************************************
464 This procedure is called while merging change requests into
465 change orders or while merging change documents into
466 plan versions. This gives details about a version when a version
467 and project id is passed to it
468 ********************************************************************/
469
470 PROCEDURE FP_CI_GET_VERSION_DETAILS
471 (
472 p_project_id IN NUMBER,
473 p_budget_version_id IN pa_budget_versions.budget_version_id%TYPE,
474 x_fin_plan_pref_code OUT NOCOPY pa_proj_fp_options.fin_plan_preference_code%TYPE, --File.Sql.39 bug 4440895
475 x_multi_curr_flag OUT NOCOPY pa_proj_fp_options.plan_in_multi_curr_flag%TYPE, --File.Sql.39 bug 4440895
476 x_fin_plan_level_code OUT NOCOPY pa_proj_fp_options.all_fin_plan_level_code%TYPE, --File.Sql.39 bug 4440895
477 x_resource_list_id OUT NOCOPY pa_proj_fp_options.all_resource_list_id%TYPE, --File.Sql.39 bug 4440895
478 x_time_phased_code OUT NOCOPY pa_proj_fp_options.all_time_phased_code%TYPE, --File.Sql.39 bug 4440895
479 x_uncategorized_flag OUT NOCOPY pa_resource_lists_all_bg.uncategorized_flag%TYPE, --File.Sql.39 bug 4440895
480 x_group_res_type_id OUT NOCOPY pa_resource_lists_all_bg.group_resource_type_id%TYPE, --File.Sql.39 bug 4440895
481 x_version_type OUT NOCOPY pa_budget_versions.version_type%TYPE, --File.Sql.39 bug 4440895
482 x_ci_id OUT NOCOPY pa_budget_versions.ci_id%TYPE, --File.Sql.39 bug 4440895
483 x_return_status OUT NOCOPY VARCHAR2, --File.Sql.39 bug 4440895
484 x_msg_count OUT NOCOPY NUMBER, --File.Sql.39 bug 4440895
485 x_msg_data OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
486 )
487 IS
488
489 -- Local Variable Declaration
490 l_debug_mode VARCHAR2(30);
491
492 BEGIN
493 IF P_PA_DEBUG_MODE = 'Y' THEN
494 pa_debug.init_err_stack('PAFPCIUB.FP_CI_GET_VERSION_DETAILS');
495 END IF;
496 fnd_profile.get('PA_DEBUG_MODE',l_debug_mode);
497 l_debug_mode := NVL(l_debug_mode, 'Y');
498 pa_debug.set_process('PLSQL','LOG',l_debug_mode);
499 x_return_status := FND_API.G_RET_STS_SUCCESS;
500 x_msg_count := 0;
501 ----DBMS_OUTPUT.PUT_LINE('FP_CI_GET_VERSION_DETAILS - 1');
502 --Get the column values for this budget version id and project id combination
503 BEGIN
504 SELECT
505 po.fin_plan_preference_code,
506 po.plan_in_multi_curr_flag,
507 DECODE
508 (po.fin_plan_preference_code,
509 'COST_ONLY',po.cost_fin_plan_level_code,
510 'REVENUE_ONLY',po.revenue_fin_plan_level_code,
511 'COST_AND_REV_SAME',po.all_fin_plan_level_code,
512 'COST_AND_REV_SEP',
513 DECODE
514 (bv.version_type,
515 'COST',po.cost_fin_plan_level_code,
516 'REVENUE',po.revenue_fin_plan_level_code
517 )
518 ),
519 DECODE
520 (po.fin_plan_preference_code,
521 'COST_ONLY',po.cost_resource_list_id,
522 'REVENUE_ONLY',po.revenue_resource_list_id,
523 'COST_AND_REV_SAME',po.all_resource_list_id,
524 'COST_AND_REV_SEP',
525 DECODE
526 (bv.version_type,
527 'COST',po.cost_resource_list_id,
528 'REVENUE',po.revenue_resource_list_id
529 )
530 ),
531 DECODE
532 (po.fin_plan_preference_code,
533 'COST_ONLY',po.cost_time_phased_code,
534 'REVENUE_ONLY',po.revenue_time_phased_code,
535 'COST_AND_REV_SAME',po.all_time_phased_code,
536 'COST_AND_REV_SEP',
537 DECODE
538 (bv.version_type,
539 'COST',po.cost_time_phased_code,
540 'REVENUE',po.revenue_time_phased_code
541 )
542 ),
543 bv.version_type,
544 bv.ci_id
545 INTO
546 x_fin_plan_pref_code,
547 x_multi_curr_flag,
548 x_fin_plan_level_code,
549 x_resource_list_id,
550 x_time_phased_code,
551 x_version_type,
552 x_ci_id
553 FROM pa_budget_versions bv, pa_proj_fp_options po
554 WHERE
555 bv.budget_version_id = p_budget_version_id
556 AND po.fin_plan_version_id = bv.budget_version_id
557 AND po.project_id = p_project_id;
558
559 EXCEPTION
560 WHEN NO_DATA_FOUND THEN
561 PA_UTILS.ADD_MESSAGE
562 ( p_app_short_name => 'PA',
563 p_msg_name => 'PA_FP_CI_NO_VERSION_DATA_FOUND');
564 ----DBMS_OUTPUT.PUT_LINE('FP_CI_GET_VERSION_DETAILS - 2***');
565 x_return_status := FND_API.G_RET_STS_ERROR;
566 END;
567 -- Get the resource list name to check if the
568 -- budget version is planned with resource or
569 -- without resource
570
571 SELECT
572 NVL(pr.uncategorized_flag,'N'),
573 NVL(pr.group_resource_type_id,0)
574 INTO
575 x_uncategorized_flag,
576 x_group_res_type_id
577 FROM pa_resource_lists_all_bg pr
578 WHERE pr.resource_list_id = x_resource_list_id;
579
580 EXCEPTION
581 WHEN OTHERS THEN
582 FND_MSG_PUB.add_exc_msg
583 ( p_pkg_name => 'Pa_Fp_Control_Items_Utils.' ||
584 'FP_CI_GET_VERSION_DETAILS'
585 ,p_procedure_name => PA_DEBUG.G_Err_Stack);
586 ----DBMS_OUTPUT.PUT_LINE('FP_CI_GET_VERSION_DETAILS - 3');
587 IF P_PA_DEBUG_MODE = 'Y' THEN
588 PA_DEBUG.g_err_stage := 'Unexpected error in FP_CI_GET_VERSION_DETAILS';
589 PA_DEBUG.Log_Message(p_message => PA_DEBUG.g_err_stage);
590 END IF;
591 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
592 PA_DEBUG.Reset_Curr_Function;
593 RAISE;
594 END FP_CI_GET_VERSION_DETAILS;
595 -- end of FP_CI_GET_VERSION_DETAILS
596
597 /*********************************************************************
598 This API will be called when a change request or a change
599 order has been created by the user and the user wants
600 to implement or include the change requests into a change
601 order or change orders into a plan version. The API is supposed
602 to check different conditions and determine if the merge is
603 possible between the two plan versions of not
604
605 --
606
607
608 ********************************************************************/
609 PROCEDURE FP_CI_CHECK_MERGE_POSSIBLE
610 (
611 p_project_id IN NUMBER,
612 p_source_fp_version_id_tbl IN SYSTEM.pa_num_tbl_type,
613 p_target_fp_version_id IN NUMBER,
614 p_calling_mode IN VARCHAR2,
615 x_merge_possible_code_tbl OUT NOCOPY SYSTEM.pa_varchar2_1_tbl_type,
616 x_return_status OUT NOCOPY VARCHAR2, --File.Sql.39 bug 4440895
617 x_msg_count OUT NOCOPY NUMBER, --File.Sql.39 bug 4440895
618 x_msg_data OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
619 )
620 IS
621 -- Local Variable Declaration
622 l_budget_version_id pa_budget_versions.budget_version_id%TYPE;
623
624 --Defining Local variables for source version
625 l_s_version_id pa_budget_versions.budget_version_id%TYPE;
626 l_s_fin_plan_pref_code pa_proj_fp_options. fin_plan_preference_code%TYPE;
627 l_s_multi_curr_flag pa_proj_fp_options. plan_in_multi_curr_flag%TYPE;
628 l_s_time_phased_code pa_proj_fp_options. all_time_phased_code%TYPE;
629 l_s_resource_list_id pa_proj_fp_options.all_resource_list_id%TYPE;
630 l_s_fin_plan_level_code pa_proj_fp_options.all_fin_plan_level_code%TYPE;
631 l_s_uncategorized_flag pa_resource_lists_all_bg.uncategorized_flag %TYPE;
632 l_s_group_res_type_id pa_resource_lists_all_bg.group_resource_type_id%TYPE;
633 l_s_version_type pa_budget_versions.version_type%TYPE;
634 l_s_ci_id pa_budget_versions.ci_id%TYPE;
635
636 --Defining Local variables for target version
637 l_t_version_id pa_budget_versions.budget_version_id%TYPE;
638 l_t_fin_plan_pref_code pa_proj_fp_options. fin_plan_preference_code%TYPE;
639 l_t_multi_curr_flag pa_proj_fp_options. plan_in_multi_curr_flag%TYPE;
640 l_t_time_phased_code pa_proj_fp_options. all_time_phased_code%TYPE;
641 l_t_resource_list_id pa_proj_fp_options.all_resource_list_id%TYPE;
642 l_t_fin_plan_level_code pa_proj_fp_options.all_fin_plan_level_code%TYPE;
643 l_t_uncategorized_flag pa_resource_lists_all_bg.uncategorized_flag %TYPE;
644 l_t_group_res_type_id pa_resource_lists_all_bg.group_resource_type_id%TYPE;
645 l_t_version_type pa_budget_versions.version_type%TYPE;
646 l_t_ci_id pa_budget_versions.ci_id%TYPE;
647
648 --Defining Local PL/SQL variables for source version
649 l_s_version_id_tbl PA_PLSQL_DATATYPES.IdTabTyp;
650 l_s_fin_plan_pref_code_tbl PA_PLSQL_DATATYPES.Char30TabTyp;
651 l_s_multi_curr_flag_tbl PA_PLSQL_DATATYPES.Char1TabTyp;
652 l_s_time_phased_code_tbl PA_PLSQL_DATATYPES.Char30TabTyp;
653 l_s_resource_list_id_tbl PA_PLSQL_DATATYPES.IdTabTyp;
654 l_s_fin_plan_level_code_tbl PA_PLSQL_DATATYPES.Char30TabTyp;
655 l_s_uncategorized_flag_tbl PA_PLSQL_DATATYPES.Char1TabTyp;
656 l_s_group_res_type_id_tbl PA_PLSQL_DATATYPES.IdTabTyp;
657 l_s_version_type_tbl PA_PLSQL_DATATYPES.Char30TabTyp;
658 l_s_ci_id_tbl PA_PLSQL_DATATYPES.IdTabTyp;
659
660 --Defining Local PL/SQL variables for target version
661 l_t_version_id_tbl PA_PLSQL_DATATYPES.IdTabTyp;
662 l_t_fin_plan_pref_code_tbl PA_PLSQL_DATATYPES.Char30TabTyp;
663 l_t_multi_curr_flag_tbl PA_PLSQL_DATATYPES.Char1TabTyp;
664 l_t_time_phased_code_tbl PA_PLSQL_DATATYPES.Char30TabTyp;
665 l_t_resource_list_id_tbl PA_PLSQL_DATATYPES.IdTabTyp;
666 l_t_fin_plan_level_code_tbl PA_PLSQL_DATATYPES.Char30TabTyp;
667 l_t_uncategorized_flag_tbl PA_PLSQL_DATATYPES.Char1TabTyp;
668 l_t_version_type_tbl PA_PLSQL_DATATYPES.Char30TabTyp;
669 l_t_group_res_type_id_tbl PA_PLSQL_DATATYPES.IdTabTyp;
670 l_t_ci_id_tbl PA_PLSQL_DATATYPES.IdTabTyp;
671 l_s_agreement_id pa_budget_versions.agreement_id%TYPE;
672 l_t_agreement_id pa_budget_versions.agreement_id%TYPE;
673 --Other Local Variables
674 l_merge_possible_code VARCHAR2(1);
675 l_raise_error_flag VARCHAR2(1);
676 l_debug_mode VARCHAR2(30);
677 l_token_v_type VARCHAR2(30);
678 l_res_resgr_mismatch_flag VARCHAR2(1) := 'N';
679 l_chg_doc_token varchar2(250);
680 l_ci_number pa_control_items.ci_number%type;
681 l_ci_type_name pa_ci_types_tl.short_name%type;
682 l_count number;
683 l_token_ci_id pa_control_items.ci_id%type;
684 l_tsk_plan_level_mismatch VARCHAR2(1) := 'N';
685 l_s_task_id_tbl PA_PLSQL_DATATYPES.IdTabTyp;
686 l_t_task_id_tbl PA_PLSQL_DATATYPES.IdTabTyp;
687 l_s_fin_plan_level_tbl PA_PLSQL_DATATYPES.Char30TabTyp;
688 l_t_fin_plan_level_tbl PA_PLSQL_DATATYPES.Char30TabTyp;
689 l_targ_pt_name pa_fin_plan_types_tl.name%TYPE;
690 l_src_ci_number pa_control_items.ci_number%TYPE;
691 l_module_name varchar2(30) := 'check is possible';
692
693 -- Bug 5845142
694 l_s_app_rev_flag pa_budget_versions.approved_rev_plan_type_flag%TYPE;
695 l_t_app_rev_flag pa_budget_versions.approved_rev_plan_type_flag%TYPE;
696
697 BEGIN
698 IF P_PA_DEBUG_MODE = 'Y' THEN
699 pa_debug.init_err_stack('PAFPCIUB.FP_CI_CHECK_MERGE_POSSIBLE');
700 END IF;
701 fnd_profile.get('PA_DEBUG_MODE',l_debug_mode);
702 l_debug_mode := NVL(l_debug_mode, 'Y');
703 pa_debug.set_process('PLSQL','LOG',l_debug_mode);
704 x_return_status := FND_API.G_RET_STS_SUCCESS;
705 x_msg_count := 0;
706 ----DBMS_OUTPUT.PUT_LINE('FP_CI_CHECK_MERGE_POSSIBLE - 1');
707 -- The API is sure to have ONE target version id for merge check
708
709 IF l_debug_mode = 'Y' THEN
710 pa_debug.g_err_stage:='p_target_fp_version_id = ' || p_target_fp_version_id;
711 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
712
713 pa_debug.g_err_stage:='p_calling_mode = ' || p_calling_mode;
714 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
715 END IF;
716
717 IF p_source_fp_version_id_tbl.COUNT > 0 THEN
718 FOR i IN p_source_fp_version_id_tbl.FIRST .. p_source_fp_version_id_tbl.LAST LOOP
719 IF l_debug_mode = 'Y' THEN
720 pa_debug.g_err_stage:='p_source_fp_version_id_tbl = ' || p_source_fp_version_id_tbl(i);
721 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
722 END IF;
723 END LOOP;
724 END IF;
725
726 l_t_version_id := p_target_fp_version_id;
727 -- Get all column values for target version id in a call to the get version details API
728 -- Get the parameters for the TARGET version id.
729 ----DBMS_OUTPUT.PUT_LINE('FP_CI_CHECK_MERGE_POSSIBLE - 2');
730 FP_CI_GET_VERSION_DETAILS
731 (
732 p_project_id => p_project_id,
733 p_budget_version_id => l_t_version_id,
734 x_fin_plan_pref_code => l_t_fin_plan_pref_code,
735 x_multi_curr_flag => l_t_multi_curr_flag,
736 x_fin_plan_level_code => l_t_fin_plan_level_code,
737 x_resource_list_id => l_t_resource_list_id,
738 x_time_phased_code => l_t_time_phased_code,
739 x_uncategorized_flag => l_t_uncategorized_flag,
740 x_group_res_type_id => l_t_group_res_type_id,
741 x_version_type => l_t_version_type,
742 x_ci_id => l_t_ci_id,
743 x_return_status => x_return_status,
744 x_msg_count => x_msg_count,
745 x_msg_data => x_msg_data
746 ) ;
747
748 --Get the plan type name when the context is 'IMPLEMENT'
749 IF p_calling_mode='IMPLEMENT' THEN
750
751 SELECT name
752 INTO l_targ_pt_name
753 FROM pa_fin_plan_types_vl fin,
754 pa_budget_versions pbv
755 WHERE fin.fin_plan_type_id = pbv.fin_plan_type_id
756 AND pbv.budget_version_id= l_t_version_id;
757
758 END IF;
759
760 x_merge_possible_code_tbl:=SYSTEM.pa_varchar2_1_tbl_type();
761 ----DBMS_OUTPUT.PUT_LINE('FP_CI_CHECK_MERGE_POSSIBLE - 3');
762 FOR i in p_source_fp_version_id_tbl.FIRST.. p_source_fp_version_id_tbl.LAST
763 LOOP
764 l_merge_possible_code := 'Y';
765 l_raise_error_flag := 'N';
766 ----DBMS_OUTPUT.PUT_LINE('FP_CI_CHECK_MERGE_POSSIBLE - 4');
767 l_s_version_id := p_source_fp_version_id_tbl (i);
768 ----DBMS_OUTPUT.PUT_LINE('FP_CI_CHECK_MERGE_POSSIBLE - 5');
769 --Get the values for the SOURCE version
770 FP_CI_GET_VERSION_DETAILS
771 (
772 p_project_id => p_project_id,
773 p_budget_version_id => l_s_version_id,
774 x_fin_plan_pref_code => l_s_fin_plan_pref_code,
775 x_multi_curr_flag => l_s_multi_curr_flag,
776 x_fin_plan_level_code => l_s_fin_plan_level_code,
777 x_resource_list_id => l_s_resource_list_id,
778 x_time_phased_code => l_s_time_phased_code,
779 x_uncategorized_flag => l_s_uncategorized_flag,
780 x_group_res_type_id => l_s_group_res_type_id,
781 x_version_type => l_s_version_type,
782 x_ci_id => l_s_ci_id,
783 x_return_status => x_return_status,
784 x_msg_count => x_msg_count,
785 x_msg_data => x_msg_data
786 ) ;
787 ----DBMS_OUTPUT.PUT_LINE('FP_CI_CHECK_MERGE_POSSIBLE - 6');
788
789 IF p_calling_mode='INCLUDE' THEN
790
791 SELECT ci_number
792 INTO l_src_ci_number
793 FROM pa_control_items
794 WHERE ci_id=l_s_ci_id;
795
796 END IF;
797
798
799 IF (p_calling_mode = 'INCLUDE_CR_TO_CO') THEN
800 BEGIN
801 IF(l_s_version_type = 'COST') THEN
802 l_token_v_type := l_s_version_type;
803 ELSIF (l_s_version_type = 'REVENUE') THEN
804 l_token_v_type := l_s_version_type;
805 ELSE
806 l_token_v_type := '';
807 END IF;
808 -- Time phased code check
809 IF(l_s_time_phased_code = 'P') THEN
810 ----DBMS_OUTPUT.PUT_LINE('FP_CI_CHECK_MERGE_POSSIBLE - 7');
811 --Check for the Target to be the same
812 IF (l_t_time_phased_code = 'G') THEN ----DBMS_OUTPUT.PUT_LINE('FP_CI_CHECK_MERGE_POSSIBLE - **8');
813 ----DBMS_OUTPUT.PUT_LINE('Time phased Code is Different');
814 --MERGE NOT POSSIBLE
815 l_merge_possible_code := 'E';
816 -- Add message in PA_UTILS
817 PA_UTILS.ADD_MESSAGE
818 ( p_app_short_name => 'PA',
819 p_msg_name => 'PA_FP_CI_C_TIME_PHASE_DIFF'
820 );
821 /*p_token1 => 'CI_SOURCE',
822 p_value1 => l_s_ci_id,
823 p_token2 => 'CI_TARGET',
824 p_value2 => l_t_ci_id
825 );*/
826 -- RAISE EXCEPTION RAISE_MERGE_ERROR
827 --raise RAISE_MERGE_ERROR;
828 l_raise_error_flag := 'Y';
829 -- PROCESS THE NEXT ELEMENT IN THE LOOP
830 END IF;
831 ELSIF (l_s_time_phased_code = 'G') THEN
832 ----DBMS_OUTPUT.PUT_LINE('FP_CI_CHECK_MERGE_POSSIBLE - 9***');
833 ----DBMS_OUTPUT.PUT_LINE('Time phased Code is Different');
834 --Check for the Target to be the same
835 IF (l_t_time_phased_code = 'P') THEN
836 -- MERGE NOT POSSIBLE
837 l_merge_possible_code := 'E';
838 -- Add message in PA_UTILS
839 PA_UTILS.ADD_MESSAGE
840 ( p_app_short_name => 'PA',
841 p_msg_name => 'PA_FP_CI_C_TIME_PHASE_DIFF'
842 );
843 /*p_token1 => 'CI_SOURCE',
844 p_value1 => l_s_ci_id,
845 p_token2 => 'CI_TARGET',
846 p_value2 => l_t_ci_id
847 );*/
848 -- RAISE EXCEPTION RAISE_MERGE_ERROR
849 --raise RAISE_MERGE_ERROR;
850 l_raise_error_flag := 'Y';
851 -- PROCESS THE NEXT ELEMENT IN THE LOOP
852 END IF;
853
854 END IF;
855
856 --Check for the version type
857 IF (
858 (
859 (l_s_version_type = 'COST') AND
860 (l_t_version_type = 'REVENUE')
861 )
862 OR
863 (
864 (l_s_version_type = 'REVENUE') AND
865 (l_t_version_type = 'COST')
866 )
867 ) THEN
868 ----DBMS_OUTPUT.PUT_LINE('FP_CI_CHECK_MERGE_POSSIBLE - 25');
869 -- MERGE NOT POSSIBLE
870 l_merge_possible_code := 'E';
871 -- Add message in PA_UTILS
872 PA_UTILS.ADD_MESSAGE
873 ( p_app_short_name => 'PA',
874 p_msg_name => 'PA_FP_CI_C_INV_VER_TYPE_MATCH'
875 );
876 /*p_token1 => 'CI_SOURCE',
877 p_value1 => l_s_ci_id,
878 p_token2 => 'CI_TARGET',
879 p_value2 => l_t_ci_id
880 );*/
881 -- RAISE EXCEPTION RAISE_MERGE_ERROR
882 --raise RAISE_MERGE_ERROR;
883 l_raise_error_flag := 'Y';
884 -- PROCESS THE NEXT ELEMENT IN THE LOOP
885 END IF;
886
887 --Check for the preference code and version type
888 IF (l_s_fin_plan_pref_code = 'COST_ONLY') THEN
889 ----DBMS_OUTPUT.PUT_LINE('FP_CI_CHECK_MERGE_POSSIBLE - 15');
890 IF (l_t_fin_plan_pref_code = 'REVENUE_ONLY') THEN
891 ----DBMS_OUTPUT.PUT_LINE('FP_CI_CHECK_MERGE_POSSIBLE - 16****');
892 -- MERGE NOT POSSIBLE
893 l_merge_possible_code := 'E';
894 -- Add message in PA_UTILS
895 PA_UTILS.ADD_MESSAGE
896 ( p_app_short_name => 'PA',
897 p_msg_name => 'PA_FP_CI_C_INV_PREF_CODE_MATCH'
898 );
899 /*p_token1 => 'CI_SOURCE',
900 p_value1 => l_s_ci_id,
901 p_token2 => 'CI_TARGET',
902 p_value2 => l_t_ci_id
903 );*/
904 -- RAISE EXCEPTION RAISE_MERGE_ERROR
905 --raise RAISE_MERGE_ERROR;
906 l_raise_error_flag := 'Y';
907 -- PROCESS THE NEXT ELEMENT IN THE LOOP
908 END IF;
909 END IF;
910
911 IF (l_s_fin_plan_pref_code = 'REVENUE_ONLY') THEN
912 ----DBMS_OUTPUT.PUT_LINE('FP_CI_CHECK_MERGE_POSSIBLE - 17*****');
913 IF (l_t_fin_plan_pref_code = 'COST_ONLY') THEN
914 ----DBMS_OUTPUT.PUT_LINE('FP_CI_CHECK_MERGE_POSSIBLE - 18');
915 -- MERGE NOT POSSIBLE
916 l_merge_possible_code := 'E';
917 -- Add message in PA_UTILS
918 PA_UTILS.ADD_MESSAGE
919 ( p_app_short_name => 'PA',
920 p_msg_name => 'PA_FP_CI_C_INV_PREF_CODE_MATCH'
921 );
922 /*p_token1 => 'CI_SOURCE',
923 p_value1 => l_s_ci_id,
924 p_token2 => 'CI_TARGET',
925 p_value2 => l_t_ci_id
926 );*/
927 -- RAISE EXCEPTION RAISE_MERGE_ERROR
928 --raise RAISE_MERGE_ERROR;
929 l_raise_error_flag := 'Y';
930 -- PROCESS THE NEXT ELEMENT IN THE LOOP
931 END IF;
932 END IF;
933
934 -- Special Case Check for preference code when target is planned
935 -- separately for cost and revenue
936 IF (l_t_fin_plan_pref_code = 'COST_AND_REV_SEP') THEN
937 ----DBMS_OUTPUT.PUT_LINE('FP_CI_CHECK_MERGE_POSSIBLE - 19');
938 IF (l_s_fin_plan_pref_code = 'REVENUE_ONLY') THEN
939 ----DBMS_OUTPUT.PUT_LINE('FP_CI_CHECK_MERGE_POSSIBLE - 20');
940 IF (l_t_version_type = 'COST') THEN
941 ----DBMS_OUTPUT.PUT_LINE('FP_CI_CHECK_MERGE_POSSIBLE - 21***');
942 -- MERGE NOT POSSIBLE
943 l_merge_possible_code := 'E';
944 -- Add message in PA_UTILS
945 PA_UTILS.ADD_MESSAGE
946 ( p_app_short_name => 'PA',
947 p_msg_name => 'PA_FP_CI_C_INV_PREF_CODE_MATCH'
948 );
949 /*p_token1 => 'CI_SOURCE',
950 p_value1 => l_s_ci_id,
951 p_token2 => 'CI_TARGET',
952 p_value2 => l_t_ci_id
953 );*/
954 -- RAISE EXCEPTION RAISE_MERGE_ERROR
955 --raise RAISE_MERGE_ERROR;
956 l_raise_error_flag := 'Y';
957 -- PROCESS THE NEXT ELEMENT IN THE LOOP
958 END IF;
959 ELSIF (l_s_fin_plan_pref_code = 'COST_ONLY') THEN
960 ----DBMS_OUTPUT.PUT_LINE('FP_CI_CHECK_MERGE_POSSIBLE - 22');
961 IF (l_t_version_type = 'REVENUE') THEN
962 ----DBMS_OUTPUT.PUT_LINE('FP_CI_CHECK_MERGE_POSSIBLE - 23***');
963 -- MERGE NOT POSSIBLE
964 l_merge_possible_code := 'E';
965 -- Add message in PA_UTILS
966 PA_UTILS.ADD_MESSAGE
967 ( p_app_short_name => 'PA',
968 p_msg_name => 'PA_FP_CI_C_INV_PREF_CODE_MATCH'
969 );
970 /*p_token1 => 'CI_SOURCE',
971 p_value1 => l_s_ci_id,
972 p_token2 => 'CI_TARGET',
973 p_value2 => l_t_ci_id
974 );*/
975 -- RAISE EXCEPTION RAISE_MERGE_ERROR
976 --raise RAISE_MERGE_ERROR;
977 l_raise_error_flag := 'Y';
978 -- PROCESS THE NEXT ELEMENT IN THE LOOP
979 END IF;
980 ELSIF (l_s_fin_plan_pref_code = 'COST_AND_REV_SEP') THEN
981 ----DBMS_OUTPUT.PUT_LINE('FP_CI_CHECK_MERGE_POSSIBLE - 24****');
982 IF (
983 (
984 (l_s_version_type = 'COST') AND
985 (l_t_version_type = 'REVENUE')
986 )
987 OR
988 (
989 (l_s_version_type = 'REVENUE') AND
990 (l_t_version_type = 'COST')
991 )
992 ) THEN
993 ----DBMS_OUTPUT.PUT_LINE('FP_CI_CHECK_MERGE_POSSIBLE - 25');
994 -- MERGE NOT POSSIBLE
995 l_merge_possible_code := 'E';
996 -- Add message in PA_UTILS
997 PA_UTILS.ADD_MESSAGE
998 ( p_app_short_name => 'PA',
999 p_msg_name => 'PA_FP_CI_C_INV_VER_TYPE_MATCH'
1000 );
1001 /*p_token1 => 'CI_SOURCE',
1002 p_value1 => l_s_ci_id,
1003 p_token2 => 'CI_TARGET',
1004 p_value2 => l_t_ci_id
1005 );*/
1006 -- RAISE EXCEPTION RAISE_MERGE_ERROR
1007 --raise RAISE_MERGE_ERROR;
1008 l_raise_error_flag := 'Y';
1009 -- PROCESS THE NEXT ELEMENT IN THE LOOP
1010 END IF;
1011 END IF;
1012 END IF;
1013
1014 IF l_debug_mode = 'Y' THEN
1015 pa_debug.g_err_stage:='Source version type: ' || l_s_version_type;
1016 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
1017
1018 pa_debug.g_err_stage:='Target version type: ' || l_t_version_type;
1019 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
1020 END IF;
1021
1022 --Added agreement check for P2 bug 2724156
1023 IF (l_s_version_type IN ('REVENUE','ALL') AND l_t_version_type IN ('REVENUE','ALL')) THEN
1024 --Bug 5845142
1025 SELECT NVL(agreement_id,-99), NVL(approved_rev_plan_type_flag,'N')
1026 INTO l_s_agreement_id,l_s_app_rev_flag
1027 FROM pa_budget_versions
1028 where budget_version_id = l_s_version_id;
1029
1030 --Bug 5845142
1031 SELECT NVL(agreement_id,-100), NVL(approved_rev_plan_type_flag,'N')
1032 INTO l_t_agreement_id,l_t_app_rev_flag
1033 FROM pa_budget_versions
1034 where budget_version_id = l_t_version_id;
1035
1036 IF l_debug_mode = 'Y' THEN
1037 pa_debug.g_err_stage:='Source Agr: ' || l_s_agreement_id;
1038 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
1039
1040 pa_debug.g_err_stage:='Target Agr: ' || l_t_agreement_id;
1041 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
1042 END IF;
1043
1044 --Bug 5845142. Since its possible for the cost impact to be of ALL version type throw the
1045 --error only for revenue impacts
1046 IF (l_s_agreement_id <> l_t_agreement_id) AND
1047 (l_s_app_rev_flag ='Y' AND l_t_app_rev_flag='Y') THEN
1048 --MERGE NOT POSSIBLE
1049 l_merge_possible_code := 'E';
1050 -- Add message in PA_UTILS
1051 PA_UTILS.ADD_MESSAGE
1052 ( p_app_short_name => 'PA',
1053 p_msg_name => 'PA_FP_CI_C_INV_AGR_ID_MATCH'
1054 );
1055 -- RAISE EXCEPTION RAISE_MERGE_ERROR
1056 --raise RAISE_MERGE_ERROR;
1057 l_raise_error_flag := 'Y';
1058 -- PROCESS THE NEXT ELEMENT IN THE LOOP
1059 END IF;
1060 END IF;
1061
1062 IF l_debug_mode = 'Y' THEN
1063 pa_debug.g_err_stage:='Error: ' || l_raise_error_flag;
1064 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
1065 END IF;
1066
1067 --end of agreement check for P2 bug 2724156
1068 IF (l_raise_error_flag = 'Y') THEN
1069 raise RAISE_MERGE_ERROR;
1070 END IF;
1071
1072 ----DBMS_OUTPUT.PUT_LINE('IN CHECK MERGEEEEEEEEEEEEEEEE');
1073 ----DBMS_OUTPUT.PUT_LINE('l_s_version_id :' || l_s_version_id);
1074 ----DBMS_OUTPUT.PUT_LINE('l_t_version_id :' || l_t_version_id);
1075 ----DBMS_OUTPUT.PUT_LINE('l_s_fin_plan_pref_code :' || l_s_fin_plan_pref_code);
1076 ----DBMS_OUTPUT.PUT_LINE('l_t_fin_plan_pref_code :' || l_t_fin_plan_pref_code);
1077 ----DBMS_OUTPUT.PUT_LINE('l_s_multi_curr_flag :' || l_s_multi_curr_flag);
1078 ----DBMS_OUTPUT.PUT_LINE('l_t_multi_curr_flag :' || l_t_multi_curr_flag);
1079 ----DBMS_OUTPUT.PUT_LINE('l_s_fin_plan_level_code :' || l_s_fin_plan_level_code);
1080 ----DBMS_OUTPUT.PUT_LINE('l_t_fin_plan_level_code :' || l_t_fin_plan_level_code);
1081 ----DBMS_OUTPUT.PUT_LINE('l_s_uncategorized_flag :' || l_s_uncategorized_flag);
1082 ----DBMS_OUTPUT.PUT_LINE('l_t_uncategorized_flag :' || l_t_uncategorized_flag);
1083 ----DBMS_OUTPUT.PUT_LINE('l_s_version_type :' || l_s_version_type);
1084 ----DBMS_OUTPUT.PUT_LINE('l_t_version_type :' || l_t_version_type);
1085 x_merge_possible_code_tbl.extend(1);
1086 x_merge_possible_code_tbl (i) := l_merge_possible_code;
1087 ----DBMS_OUTPUT.PUT_LINE('FP_CI_CHECK_MERGE_POSSIBLE - 34');
1088 EXCEPTION
1089 WHEN RAISE_MERGE_ERROR THEN
1090 ----DBMS_OUTPUT.PUT_LINE('FP_CI_CHECK_MERGE_POSSIBLE - 35');
1091 x_merge_possible_code_tbl.extend(1);
1092 x_merge_possible_code_tbl (i) := l_merge_possible_code;
1093 x_return_status := FND_API.G_RET_STS_ERROR;
1094 ----DBMS_OUTPUT.PUT_LINE('FP_CI_CHECK_MERGE_POSSIBLE - 36****');
1095 select ci_id into l_token_ci_id from
1096 pa_budget_versions where
1097 budget_version_id = l_s_version_id;
1098
1099 l_chg_doc_token := null;
1100 begin
1101 select ci.ci_number,cit.short_name into
1102 l_ci_number,l_ci_type_name from
1103 pa_control_items ci,
1104 pa_ci_types_tl cit
1105 where ci.ci_id = l_token_ci_id and
1106 cit.ci_type_id = ci.ci_type_id and
1107 cit.language = userenv('LANG');
1108 l_chg_doc_token := l_ci_type_name;
1109 if l_ci_number is not null then
1110 l_chg_doc_token := l_chg_doc_token ||'('||l_ci_number ||')';
1111 end if;
1112 IF l_debug_mode = 'Y' THEN
1113 pa_debug.g_err_stage:='Token: ' || l_chg_doc_token;
1114 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
1115 END IF;
1116 exception
1117 when no_data_found then
1118 l_count := 0;
1119 /* dummy stmt */
1120 end;
1121
1122 PA_UTILS.ADD_MESSAGE
1123 ( p_app_short_name => 'PA',
1124 p_msg_name => 'PA_FP_CI_NO_COPY',
1125 p_token1 => 'CI_ID',
1126 p_value1 => l_chg_doc_token,
1127 p_token2 => 'CI_VERSION',
1128 p_value2 => l_token_v_type
1129 );
1130 END;
1131
1132 ELSE
1133 BEGIN
1134 -- Time phased code check
1135 IF(l_s_time_phased_code = 'P') THEN
1136 ----DBMS_OUTPUT.PUT_LINE('FP_CI_CHECK_MERGE_POSSIBLE - 7');
1137 --Check for the Target to be the same
1138 IF (l_t_time_phased_code = 'G') THEN
1139 ----DBMS_OUTPUT.PUT_LINE('FP_CI_CHECK_MERGE_POSSIBLE - **8');
1140 ----DBMS_OUTPUT.PUT_LINE('Time phased Code is Different');
1141 --MERGE NOT POSSIBLE
1142 l_merge_possible_code := 'E';
1143 -- Add message in PA_UTILS
1144 IF (p_calling_mode = 'INCLUDE') THEN
1145 PA_UTILS.ADD_MESSAGE
1146 ( p_app_short_name => 'PA',
1147 p_msg_name => 'PA_FP_CI_TIME_PHASE_DIFF',
1148 p_token1 => 'CHG_DOC',
1149 p_value1 => l_src_ci_number
1150 );
1151 ELSIF (p_calling_mode = 'IMPLEMENT') THEN
1152 PA_UTILS.ADD_MESSAGE
1153 ( p_app_short_name => 'PA',
1154 p_msg_name => 'PA_FP_CIM_TIME_PHASE_DIFF',
1155 p_token1 => 'PLAN_TYPE',
1156 p_value1 => l_targ_pt_name
1157
1158 );
1159 ELSIF (p_calling_mode = 'SUBMIT') THEN
1160 PA_UTILS.ADD_MESSAGE
1161 ( p_app_short_name => 'PA',
1162 p_msg_name => 'PA_FP_CIS_TIME_PHASE_DIFF'
1163 );
1164
1165 END IF;
1166 /*p_token1 => 'CI_SOURCE',
1167 p_value1 => l_s_ci_id,
1168 p_token2 => 'CI_TARGET',
1169 p_value2 => l_t_ci_id
1170 );*/
1171 -- RAISE EXCEPTION RAISE_MERGE_ERROR
1172 --raise RAISE_MERGE_ERROR;
1173 l_raise_error_flag := 'Y';
1174 -- PROCESS THE NEXT ELEMENT IN THE LOOP
1175 END IF;
1176 ELSIF (l_s_time_phased_code = 'G') THEN
1177 ----DBMS_OUTPUT.PUT_LINE('FP_CI_CHECK_MERGE_POSSIBLE - 9***');
1178 ----DBMS_OUTPUT.PUT_LINE('Time phased Code is Different');
1179 --Check for the Target to be the same
1180 IF (l_t_time_phased_code = 'P') THEN
1181 -- MERGE NOT POSSIBLE
1182 l_merge_possible_code := 'E';
1183 -- Add message in PA_UTILS
1184 IF (p_calling_mode = 'INCLUDE') THEN
1185 PA_UTILS.ADD_MESSAGE
1186 ( p_app_short_name => 'PA',
1187 p_msg_name => 'PA_FP_CI_TIME_PHASE_DIFF',
1188 p_token1 => 'CHG_DOC',
1189 p_value1 => l_src_ci_number
1190 );
1191 ELSIF (p_calling_mode = 'IMPLEMENT') THEN
1192 PA_UTILS.ADD_MESSAGE
1193 ( p_app_short_name => 'PA',
1194 p_msg_name => 'PA_FP_CIM_TIME_PHASE_DIFF',
1195 p_token1 => 'PLAN_TYPE',
1196 p_value1 => l_targ_pt_name
1197
1198 );
1199 ELSIF (p_calling_mode = 'SUBMIT') THEN
1200 PA_UTILS.ADD_MESSAGE
1201 ( p_app_short_name => 'PA',
1202 p_msg_name => 'PA_FP_CIS_TIME_PHASE_DIFF'
1203 );
1204
1205 END IF;
1206 /*p_token1 => 'CI_SOURCE',
1207 p_value1 => l_s_ci_id,
1208 p_token2 => 'CI_TARGET',
1209 p_value2 => l_t_ci_id
1210 );*/
1211 -- RAISE EXCEPTION RAISE_MERGE_ERROR
1212 --raise RAISE_MERGE_ERROR;
1213 l_raise_error_flag := 'Y';
1214 -- PROCESS THE NEXT ELEMENT IN THE LOOP
1215 END IF;
1216
1217 END IF;
1218
1219
1220 --Check for the version type
1221 IF (
1222 (
1223 (l_s_version_type = 'COST') AND
1224 (l_t_version_type = 'REVENUE')
1225 )
1226 OR
1227 (
1228 (l_s_version_type = 'REVENUE') AND
1229 (l_t_version_type = 'COST')
1230 )
1231 ) THEN
1232 ----DBMS_OUTPUT.PUT_LINE('FP_CI_CHECK_MERGE_POSSIBLE - 25');
1233 -- MERGE NOT POSSIBLE
1234 l_merge_possible_code := 'E';
1235 -- Add message in PA_UTILS
1236 IF (p_calling_mode = 'INCLUDE') THEN
1237 PA_UTILS.ADD_MESSAGE
1238 ( p_app_short_name => 'PA',
1239 p_msg_name => 'PA_FP_CI_INV_VER_TYPE_MATCH',
1240 p_token1 => 'CHG_DOC',
1241 p_value1 => l_src_ci_number
1242 );
1243 ELSIF (p_calling_mode = 'IMPLEMENT') THEN
1244 PA_UTILS.ADD_MESSAGE
1245 ( p_app_short_name => 'PA',
1246 p_msg_name => 'PA_FP_CIM_INV_VER_TYPE_MATCH',
1247 p_token1 => 'PLAN_TYPE',
1248 p_value1 => l_targ_pt_name
1249
1250 );
1251 ELSIF (p_calling_mode = 'SUBMIT') THEN
1252 PA_UTILS.ADD_MESSAGE
1253 ( p_app_short_name => 'PA',
1254 p_msg_name => 'PA_FP_CIS_INV_VER_TYPE_MATCH'
1255 );
1256
1257 END IF;
1258 /*p_token1 => 'CI_SOURCE',
1259 p_value1 => l_s_ci_id,
1260 p_token2 => 'CI_TARGET',
1261 p_value2 => l_t_ci_id
1262 );*/
1263 -- RAISE EXCEPTION RAISE_MERGE_ERROR
1264 --raise RAISE_MERGE_ERROR;
1265 l_raise_error_flag := 'Y';
1266 -- PROCESS THE NEXT ELEMENT IN THE LOOP
1267 END IF;
1268
1269 --Check for the preference code and version type
1270 IF (l_s_fin_plan_pref_code = 'COST_ONLY') THEN
1271 ----DBMS_OUTPUT.PUT_LINE('FP_CI_CHECK_MERGE_POSSIBLE - 15');
1272 IF (l_t_fin_plan_pref_code = 'REVENUE_ONLY') THEN
1273 ----DBMS_OUTPUT.PUT_LINE('FP_CI_CHECK_MERGE_POSSIBLE - 16****');
1274 -- MERGE NOT POSSIBLE
1275 l_merge_possible_code := 'E';
1276 -- Add message in PA_UTILS
1277 IF (p_calling_mode = 'INCLUDE') THEN
1278 PA_UTILS.ADD_MESSAGE
1279 ( p_app_short_name => 'PA',
1280 p_msg_name => 'PA_FP_CI_INV_PREF_CODE_MATCH',
1281 p_token1 => 'CHG_DOC',
1282 p_value1 => l_src_ci_number
1283 );
1284 ELSIF (p_calling_mode = 'IMPLEMENT') THEN
1285 PA_UTILS.ADD_MESSAGE
1286 ( p_app_short_name => 'PA',
1287 p_msg_name => 'PA_FP_CIM_INV_PREF_CODE_MATCH',
1288 p_token1 => 'PLAN_TYPE',
1289 p_value1 => l_targ_pt_name
1290
1291 );
1292 ELSIF (p_calling_mode = 'SUBMIT') THEN
1293 PA_UTILS.ADD_MESSAGE
1294 ( p_app_short_name => 'PA',
1295 p_msg_name => 'PA_FP_CIS_INV_PREF_CODE_MATCH'
1296 );
1297
1298 END IF;
1299 /*p_token1 => 'CI_SOURCE',
1300 p_value1 => l_s_ci_id,
1301 p_token2 => 'CI_TARGET',
1302 p_value2 => l_t_ci_id
1303 );*/
1304 -- RAISE EXCEPTION RAISE_MERGE_ERROR
1305 --raise RAISE_MERGE_ERROR;
1306 l_raise_error_flag := 'Y';
1307 -- PROCESS THE NEXT ELEMENT IN THE LOOP
1308 END IF;
1309 END IF;
1310
1311 IF (l_s_fin_plan_pref_code = 'REVENUE_ONLY') THEN
1312 ----DBMS_OUTPUT.PUT_LINE('FP_CI_CHECK_MERGE_POSSIBLE - 17*****');
1313 IF (l_t_fin_plan_pref_code = 'COST_ONLY') THEN
1314 ----DBMS_OUTPUT.PUT_LINE('FP_CI_CHECK_MERGE_POSSIBLE - 18');
1315 -- MERGE NOT POSSIBLE
1316 l_merge_possible_code := 'E';
1317 -- Add message in PA_UTILS
1318 IF (p_calling_mode = 'INCLUDE') THEN
1319 PA_UTILS.ADD_MESSAGE
1320 ( p_app_short_name => 'PA',
1321 p_msg_name => 'PA_FP_CI_INV_PREF_CODE_MATCH',
1322 p_token1 => 'CHG_DOC',
1323 p_value1 => l_src_ci_number
1324
1325 );
1326 ELSIF (p_calling_mode = 'IMPLEMENT') THEN
1327 PA_UTILS.ADD_MESSAGE
1328 ( p_app_short_name => 'PA',
1329 p_msg_name => 'PA_FP_CIM_INV_PREF_CODE_MATCH',
1330 p_token1 => 'PLAN_TYPE',
1331 p_value1 => l_targ_pt_name
1332 );
1333 ELSIF (p_calling_mode = 'SUBMIT') THEN
1334 PA_UTILS.ADD_MESSAGE
1335 ( p_app_short_name => 'PA',
1336 p_msg_name => 'PA_FP_CIS_INV_PREF_CODE_MATCH'
1337 );
1338
1339 END IF;
1340 /*p_token1 => 'CI_SOURCE',
1341 p_value1 => l_s_ci_id,
1342 p_token2 => 'CI_TARGET',
1343 p_value2 => l_t_ci_id
1344 );*/
1345 -- RAISE EXCEPTION RAISE_MERGE_ERROR
1346 --raise RAISE_MERGE_ERROR;
1347 l_raise_error_flag := 'Y';
1348 -- PROCESS THE NEXT ELEMENT IN THE LOOP
1349 END IF;
1350 END IF;
1351
1352 -- Special Case Check for preference code when target is planned
1353 -- separately for cost and revenue
1354 IF (l_t_fin_plan_pref_code = 'COST_AND_REV_SEP') THEN
1355 ----DBMS_OUTPUT.PUT_LINE('FP_CI_CHECK_MERGE_POSSIBLE - 19');
1356 IF (l_s_fin_plan_pref_code = 'REVENUE_ONLY') THEN
1357 ----DBMS_OUTPUT.PUT_LINE('FP_CI_CHECK_MERGE_POSSIBLE - 20');
1358 IF (l_t_version_type = 'COST') THEN
1359 ----DBMS_OUTPUT.PUT_LINE('FP_CI_CHECK_MERGE_POSSIBLE - 21***');
1360 -- MERGE NOT POSSIBLE
1361 l_merge_possible_code := 'E';
1362 -- Add message in PA_UTILS
1363 IF (p_calling_mode = 'INCLUDE') THEN
1364 PA_UTILS.ADD_MESSAGE
1365 ( p_app_short_name => 'PA',
1366 p_msg_name => 'PA_FP_CI_INV_PREF_CODE_MATCH',
1367 p_token1 => 'CHG_DOC',
1368 p_value1 => l_src_ci_number
1369
1370 );
1371 ELSIF (p_calling_mode = 'IMPLEMENT') THEN
1372 PA_UTILS.ADD_MESSAGE
1373 ( p_app_short_name => 'PA',
1374 p_msg_name => 'PA_FP_CIM_INV_PREF_CODE_MATCH',
1375 p_token1 => 'PLAN_TYPE',
1376 p_value1 => l_targ_pt_name
1377
1378 );
1379 ELSIF (p_calling_mode = 'SUBMIT') THEN
1380 PA_UTILS.ADD_MESSAGE
1381 ( p_app_short_name => 'PA',
1382 p_msg_name => 'PA_FP_CIS_INV_PREF_CODE_MATCH'
1383 );
1384
1385 END IF;
1386 /*p_token1 => 'CI_SOURCE',
1387 p_value1 => l_s_ci_id,
1388 p_token2 => 'CI_TARGET',
1389 p_value2 => l_t_ci_id
1390 );*/
1391 -- RAISE EXCEPTION RAISE_MERGE_ERROR
1392 --raise RAISE_MERGE_ERROR;
1393 l_raise_error_flag := 'Y';
1394 -- PROCESS THE NEXT ELEMENT IN THE LOOP
1395 END IF;
1396 ELSIF (l_s_fin_plan_pref_code = 'COST_ONLY') THEN
1397 ----DBMS_OUTPUT.PUT_LINE('FP_CI_CHECK_MERGE_POSSIBLE - 22');
1398 IF (l_t_version_type = 'REVENUE') THEN
1399 ----DBMS_OUTPUT.PUT_LINE('FP_CI_CHECK_MERGE_POSSIBLE - 23***');
1400 -- MERGE NOT POSSIBLE
1401 l_merge_possible_code := 'E';
1402 -- Add message in PA_UTILS
1403 IF (p_calling_mode = 'INCLUDE') THEN
1404 PA_UTILS.ADD_MESSAGE
1405 ( p_app_short_name => 'PA',
1406 p_msg_name => 'PA_FP_CI_INV_PREF_CODE_MATCH',
1407 p_token1 => 'CHG_DOC',
1408 p_value1 => l_src_ci_number
1409
1410 );
1411 ELSIF (p_calling_mode = 'IMPLEMENT') THEN
1412 PA_UTILS.ADD_MESSAGE
1413 ( p_app_short_name => 'PA',
1414 p_msg_name => 'PA_FP_CIM_INV_PREF_CODE_MATCH',
1415 p_token1 => 'PLAN_TYPE',
1416 p_value1 => l_targ_pt_name
1417
1418 );
1419 ELSIF (p_calling_mode = 'SUBMIT') THEN
1420 PA_UTILS.ADD_MESSAGE
1421 ( p_app_short_name => 'PA',
1422 p_msg_name => 'PA_FP_CIS_INV_PREF_CODE_MATCH'
1423 );
1424
1425 END IF;
1426 /*p_token1 => 'CI_SOURCE',
1427 p_value1 => l_s_ci_id,
1428 p_token2 => 'CI_TARGET',
1429 p_value2 => l_t_ci_id
1430 );*/
1431 -- RAISE EXCEPTION RAISE_MERGE_ERROR
1432 --raise RAISE_MERGE_ERROR;
1433 l_raise_error_flag := 'Y';
1434 -- PROCESS THE NEXT ELEMENT IN THE LOOP
1435 END IF;
1436 ELSIF (l_s_fin_plan_pref_code = 'COST_AND_REV_SEP') THEN
1437 ----DBMS_OUTPUT.PUT_LINE('FP_CI_CHECK_MERGE_POSSIBLE - 24****');
1438 IF (
1439 (
1440 (l_s_version_type = 'COST') AND
1441 (l_t_version_type = 'REVENUE')
1442 )
1443 OR
1444 (
1445 (l_s_version_type = 'REVENUE') AND
1446 (l_t_version_type = 'COST')
1447 )
1448 ) THEN
1449 ----DBMS_OUTPUT.PUT_LINE('FP_CI_CHECK_MERGE_POSSIBLE - 25');
1450 -- MERGE NOT POSSIBLE
1451 l_merge_possible_code := 'E';
1452 -- Add message in PA_UTILS
1453 IF (p_calling_mode = 'INCLUDE') THEN
1454 PA_UTILS.ADD_MESSAGE
1455 ( p_app_short_name => 'PA',
1456 p_msg_name => 'PA_FP_CI_INV_VER_TYPE_MATCH',
1457 p_token1 => 'CHG_DOC',
1458 p_value1 => l_src_ci_number
1459
1460 );
1461 ELSIF (p_calling_mode = 'IMPLEMENT') THEN
1462 PA_UTILS.ADD_MESSAGE
1463 ( p_app_short_name => 'PA',
1464 p_msg_name => 'PA_FP_CIM_INV_VER_TYPE_MATCH',
1465 p_token1 => 'PLAN_TYPE',
1466 p_value1 => l_targ_pt_name
1467
1468 );
1469 ELSIF (p_calling_mode = 'SUBMIT') THEN
1470 PA_UTILS.ADD_MESSAGE
1471 ( p_app_short_name => 'PA',
1472 p_msg_name => 'PA_FP_CIS_INV_VER_TYPE_MATCH'
1473 );
1474
1475 END IF;
1476 /*p_token1 => 'CI_SOURCE',
1477 p_value1 => l_s_ci_id,
1478 p_token2 => 'CI_TARGET',
1479 p_value2 => l_t_ci_id
1480 );*/
1481 -- RAISE EXCEPTION RAISE_MERGE_ERROR
1482 --raise RAISE_MERGE_ERROR;
1483 l_raise_error_flag := 'Y';
1484 -- PROCESS THE NEXT ELEMENT IN THE LOOP
1485 END IF;
1486 END IF;
1487 END IF;
1488
1489 IF (l_raise_error_flag = 'Y') THEN
1490 raise RAISE_MERGE_ERROR;
1491 END IF;
1492
1493 ----DBMS_OUTPUT.PUT_LINE('IN CHECK MERGEEEEEEEEEEEEEEEE');
1494 ----DBMS_OUTPUT.PUT_LINE('l_s_version_id :' || l_s_version_id);
1495 ----DBMS_OUTPUT.PUT_LINE('l_t_version_id :' || l_t_version_id);
1496 ----DBMS_OUTPUT.PUT_LINE('l_s_fin_plan_pref_code :' || l_s_fin_plan_pref_code);
1497 ----DBMS_OUTPUT.PUT_LINE('l_t_fin_plan_pref_code :' || l_t_fin_plan_pref_code);
1498 ----DBMS_OUTPUT.PUT_LINE('l_s_multi_curr_flag :' || l_s_multi_curr_flag);
1499 ----DBMS_OUTPUT.PUT_LINE('l_t_multi_curr_flag :' || l_t_multi_curr_flag);
1500 ----DBMS_OUTPUT.PUT_LINE('l_s_fin_plan_level_code :' || l_s_fin_plan_level_code);
1501 ----DBMS_OUTPUT.PUT_LINE('l_t_fin_plan_level_code :' || l_t_fin_plan_level_code);
1502 ----DBMS_OUTPUT.PUT_LINE('l_s_uncategorized_flag :' || l_s_uncategorized_flag);
1503 ----DBMS_OUTPUT.PUT_LINE('l_t_uncategorized_flag :' || l_t_uncategorized_flag);
1504 ----DBMS_OUTPUT.PUT_LINE('l_s_version_type :' || l_s_version_type);
1505 ----DBMS_OUTPUT.PUT_LINE('l_t_version_type :' || l_t_version_type);
1506 x_merge_possible_code_tbl.extend(1);
1507 x_merge_possible_code_tbl (i) := l_merge_possible_code;
1508 ----DBMS_OUTPUT.PUT_LINE('FP_CI_CHECK_MERGE_POSSIBLE - 34');
1509 EXCEPTION
1510 WHEN RAISE_MERGE_ERROR THEN
1511 ----DBMS_OUTPUT.PUT_LINE('FP_CI_CHECK_MERGE_POSSIBLE - 35');
1512 x_merge_possible_code_tbl.extend(1);
1513 x_merge_possible_code_tbl (i) := l_merge_possible_code;
1514 x_return_status := FND_API.G_RET_STS_ERROR;
1515 ----DBMS_OUTPUT.PUT_LINE('FP_CI_CHECK_MERGE_POSSIBLE - 36****');
1516 END;
1517 END IF;
1518 END LOOP;
1519 -- For the Source Version Id
1520
1521 EXCEPTION
1522 WHEN OTHERS THEN
1523 FND_MSG_PUB.add_exc_msg
1524 ( p_pkg_name => 'Pa_Fp_Control_Items_Utils.' ||
1525 'FP_CI_CHECK_MERGE_POSSIBLE'
1526 ,p_procedure_name => PA_DEBUG.G_Err_Stack);
1527 IF P_PA_DEBUG_MODE = 'Y' THEN
1528 PA_DEBUG.g_err_stage := 'Unexpected error in FP_CI_CHECK_MERGE_POSSIBLE';
1529 PA_DEBUG.Log_Message(p_message => PA_DEBUG.g_err_stage);
1530 END IF;
1531 ----DBMS_OUTPUT.PUT_LINE('FP_CI_CHECK_MERGE_POSSIBLE - 37');
1532 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1533 PA_DEBUG.Reset_Curr_Function;
1534 RAISE;
1535
1536 END FP_CI_CHECK_MERGE_POSSIBLE;
1537 -- end of FP_CI_CHECK_MERGE_POSSIBLE
1538 -- end of FP_CI_CHECK_MERGE_POSSIBLE
1539
1540 /* isFundingLevelChangeAllowed requires 2 input parameters:
1541 p_project_id -- the project_id context
1542 p_proposed_fund_level -- The proposed funding level which is defaulted to null
1543
1544 The API adds a message and returns x_return_status as FND_API.G_RET_STS_ERROR
1545 when the proposed funding level cannot be changed. */
1546
1547 PROCEDURE isFundingLevelChangeAllowed
1548 (
1549 p_project_id IN NUMBER,
1550 p_proposed_fund_level IN VARCHAR2,
1551 x_return_status OUT NOCOPY VARCHAR2, --File.Sql.39 bug 4440895
1552 x_msg_count OUT NOCOPY NUMBER, --File.Sql.39 bug 4440895
1553 x_msg_data OUT NOCOPY VARCHAR2) IS --File.Sql.39 bug 4440895
1554
1555
1556 x_err_code VARCHAR2(2000);
1557 x_err_stage VARCHAR2(2000);
1558 x_err_stack VARCHAR2(2000);
1559 l_msg_index_out NUMBER;
1560 l_ci_funding_level VARCHAR2(1);
1561 l_funding_level VARCHAR2(1);
1562
1563 cursor check_ci_funding_level is
1564 select DECODE(bv.version_type,'REVENUE',revenue_fin_plan_level_code,
1565 'ALL',all_fin_plan_level_code,null)
1566 from pa_budget_versions bv,
1567 pa_proj_fp_options po,
1568 pa_ci_impacts pci,
1569 pa_projects_all ppa
1570 where bv.project_id = p_project_id
1571 and bv.approved_rev_plan_type_flag = 'Y'
1572 and po.project_id = bv.project_id
1573 and po.fin_plan_type_id = bv.fin_plan_type_id
1574 and po.fin_plan_version_id = bv.budget_version_id
1575 and po.fin_plan_option_level_code = 'PLAN_VERSION'
1576 and pci.ci_id = bv.ci_id
1577 and pci.impact_type_code = 'FINPLAN_REVENUE'
1578 and pci.status_code = 'CI_IMPACT_PENDING'
1579 and ppa.project_id = bv.project_id
1580 and ppa.baseline_funding_flag = 'Y';
1581
1582 BEGIN
1583
1584 x_return_status := FND_API.G_RET_STS_SUCCESS;
1585
1586 open check_ci_funding_level;
1587 fetch check_ci_funding_level into l_ci_funding_level;
1588 IF check_ci_funding_level%NOTFOUND THEN
1589 x_return_status := FND_API.G_RET_STS_SUCCESS;
1590 x_msg_count := FND_MSG_PUB.Count_Msg;
1591 close check_ci_funding_level;
1592 return;
1593 END IF;
1594 close check_ci_funding_level;
1595
1596 IF p_proposed_fund_level IS NOT NULL THEN
1597 IF p_proposed_fund_level = 'T' and l_ci_funding_level = 'P' THEN
1598 /* Project funding level being modified to Top Task level
1599 where as Budget planning level is at project level
1600 throw an error as this mismatch cannot be handled in auto-baseline */
1601
1602 x_return_status := FND_API.G_RET_STS_ERROR;
1603
1604 PA_UTILS.ADD_MESSAGE(p_app_short_name => 'PA',
1605 p_msg_name => 'PA_FP_CHK_FUNDING_LVL');
1606 END IF;
1607 ELSE -- p_proposed_fund_level IS NULL
1608 pa_billing_core.check_funding_level (p_project_id,
1609 l_funding_level,
1610 x_err_code,
1611 x_err_stage,
1612 x_err_stack);
1613
1614 if (x_err_code <> 0) then
1615 x_return_status := FND_API.G_RET_STS_ERROR;
1616 x_msg_count := FND_MSG_PUB.Count_Msg;
1617 if x_msg_count = 1 then
1618 PA_INTERFACE_UTILS_PUB.get_messages
1619 (p_encoded => FND_API.G_TRUE,
1620 p_msg_index => 1,
1621 p_data => x_msg_data,
1622 p_msg_index_out => l_msg_index_out);
1623 end if;
1624 return;
1625 end if;
1626 IF l_funding_level = 'P' AND l_ci_funding_level = 'P' then
1627
1628 /* Project funding level being modified to Top Task level
1629 where as Budget planning level is at project level
1630 throw an error as this mismatch cannot be handled in auto-baseline */
1631
1632 x_return_status := FND_API.G_RET_STS_ERROR;
1633 PA_UTILS.ADD_MESSAGE(p_app_short_name => 'PA',
1634 p_msg_name => 'PA_FP_CHK_FUNDING_LVL');
1635 END IF;
1636 END IF;
1637
1638 x_msg_count := FND_MSG_PUB.Count_Msg;
1639
1640 IF x_msg_count = 1 then
1641 PA_INTERFACE_UTILS_PUB.get_messages
1642 (p_encoded => FND_API.G_TRUE,
1643 p_msg_index => 1,
1644 p_data => x_msg_data,
1645 p_msg_index_out => l_msg_index_out);
1646 END IF;
1647
1648 EXCEPTION
1649 WHEN OTHERS THEN
1650 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1651 x_msg_count := 1;
1652 x_msg_data := SQLERRM;
1653 FND_MSG_PUB.add_exc_msg
1654 ( p_pkg_name => 'PA_FP_CONTROL_ITEMS_UTILS'
1655 ,p_procedure_name => 'isFundingLevelChangeAllowed' );
1656
1657
1658 END isFundingLevelChangeAllowed;
1659
1660 /* isAgreementDeletionAllowed API needs to be called before deleting an Agreement.
1661 If x_return_status is FND_API.G_RET_STS_ERROR then do not allow deletion of agreement.
1662 Display the error message from the stack or x_msg_data (when x_msg_count=1).
1663 */
1664
1665 PROCEDURE isAgreementDeletionAllowed
1666 (
1667 p_agreement_id IN NUMBER,
1668 x_return_status OUT NOCOPY VARCHAR2, --File.Sql.39 bug 4440895
1669 x_msg_count OUT NOCOPY NUMBER, --File.Sql.39 bug 4440895
1670 x_msg_data OUT NOCOPY VARCHAR2) IS --File.Sql.39 bug 4440895
1671
1672
1673 l_msg_index_out NUMBER;
1674 l_found varchar2(1);
1675
1676 cursor c1 is
1677 select 'Y' from dual
1678 where exists (
1679 select 'x'
1680 from pa_summary_project_fundings fu,
1681 pa_budget_versions bv
1682 where fu.agreement_id = p_agreement_id
1683 and bv.project_id = fu.project_id
1684 and bv.agreement_id = p_agreement_id);
1685 BEGIN
1686
1687 x_return_status := FND_API.G_RET_STS_SUCCESS;
1688 l_found := 'N';
1689
1690 open c1;
1691 fetch c1 into l_found;
1692 close c1;
1693
1694 IF l_found = 'Y' then
1695 x_return_status := FND_API.G_RET_STS_ERROR;
1696 PA_UTILS.ADD_MESSAGE(p_app_short_name => 'PA',
1697 p_msg_name => 'PA_FP_AGR_CI_NO_DELETE');
1698 END IF;
1699
1700
1701 x_msg_count := FND_MSG_PUB.Count_Msg;
1702 IF x_msg_count = 1 then
1703 PA_INTERFACE_UTILS_PUB.get_messages
1704 (p_encoded => FND_API.G_TRUE,
1705 p_msg_index => 1,
1706 p_data => x_msg_data,
1707 p_msg_index_out => l_msg_index_out);
1708 END IF;
1709
1710 EXCEPTION
1711 WHEN NO_DATA_FOUND THEN
1712 x_return_status := FND_API.G_RET_STS_SUCCESS;
1713 x_msg_count := FND_MSG_PUB.Count_Msg;
1714 IF x_msg_count = 1 then
1715 PA_INTERFACE_UTILS_PUB.get_messages
1716 (p_encoded => FND_API.G_TRUE,
1717 p_msg_index => 1,
1718 p_data => x_msg_data,
1719 p_msg_index_out => l_msg_index_out);
1720 END IF;
1721 WHEN OTHERS THEN
1722 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1723 x_msg_count := 1;
1724 x_msg_data := SQLERRM;
1725 FND_MSG_PUB.add_exc_msg
1726 ( p_pkg_name => 'PA_FP_CONTROL_ITEMS_UTILS'
1727 ,p_procedure_name => 'isAgreementDeletionAllowed' );
1728
1729
1730 END isAgreementDeletionAllowed;
1731
1732
1733 /* isAgrCurrencyChangeAllowed API needs to be called before changing Agreement/Funding Currency.
1734 If x_return_status is FND_API.G_RET_STS_ERROR then do not allow change in currency.
1735 Display the error message from the stack or x_msg_data (when x_msg_count=1).
1736 */
1737
1738 PROCEDURE isAgrCurrencyChangeAllowed
1739 (
1740 p_agreement_id IN NUMBER,
1741 x_return_status OUT NOCOPY VARCHAR2, --File.Sql.39 bug 4440895
1742 x_msg_count OUT NOCOPY NUMBER, --File.Sql.39 bug 4440895
1743 x_msg_data OUT NOCOPY VARCHAR2) IS --File.Sql.39 bug 4440895
1744
1745 l_msg_index_out NUMBER;
1746 l_found varchar2(1);
1747
1748 cursor c1 is
1749 select 'Y' from dual
1750 where exists (
1751 select 'x'
1752 from pa_summary_project_fundings fu,
1753 pa_budget_versions bv
1754 where fu.agreement_id = p_agreement_id
1755 and bv.project_id = fu.project_id
1756 and bv.agreement_id = p_agreement_id);
1757 BEGIN
1758
1759 x_return_status := FND_API.G_RET_STS_SUCCESS;
1760 l_found := 'N';
1761
1762 open c1;
1763 fetch c1 into l_found;
1764 close c1;
1765
1766 IF l_found = 'Y' then
1767 x_return_status := FND_API.G_RET_STS_ERROR;
1768 PA_UTILS.ADD_MESSAGE(p_app_short_name => 'PA',
1769 p_msg_name => 'PA_FP_AGR_CUR_NO_CHANGE');
1770 END IF;
1771
1772
1773 x_msg_count := FND_MSG_PUB.Count_Msg;
1774 IF x_msg_count = 1 then
1775 PA_INTERFACE_UTILS_PUB.get_messages
1776 (p_encoded => FND_API.G_TRUE,
1777 p_msg_index => 1,
1778 p_data => x_msg_data,
1779 p_msg_index_out => l_msg_index_out);
1780 END IF;
1781
1782 EXCEPTION
1783 WHEN NO_DATA_FOUND THEN
1784 x_return_status := FND_API.G_RET_STS_SUCCESS;
1785 x_msg_count := FND_MSG_PUB.Count_Msg;
1786 IF x_msg_count = 1 then
1787 PA_INTERFACE_UTILS_PUB.get_messages
1788 (p_encoded => FND_API.G_TRUE,
1789 p_msg_index => 1,
1790 p_data => x_msg_data,
1791 p_msg_index_out => l_msg_index_out);
1792 END IF;
1793 WHEN OTHERS THEN
1794 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1795 x_msg_count := 1;
1796 x_msg_data := SQLERRM;
1797 FND_MSG_PUB.add_exc_msg
1798 ( p_pkg_name => 'PA_FP_CONTROL_ITEMS_UTILS'
1799 ,p_procedure_name => 'isAgrCurrencyChangeAllowed' );
1800
1801 END isAgrCurrencyChangeAllowed;
1802
1803 /*==============================================================================
1804 This api is called to check if a CI version can be created for the impacted
1805 task id,plan type_id and project_id combination.
1806
1807 -- 01-JUL-2003 jwhite - Bug 2989874
1808 -- For Is_Create_CI_Version_Allowed procedure,
1809 -- default ci from the current working version.
1810 ===============================================================================*/
1811
1812 PROCEDURE Is_Create_CI_Version_Allowed
1813 ( p_project_id IN pa_budget_versions.project_id%TYPE
1814 ,p_fin_plan_type_id IN pa_proj_fp_options.fin_plan_type_id%TYPE
1815 ,p_version_type IN pa_budget_versions.version_type%TYPE
1816 ,p_impacted_task_id IN pa_tasks.task_id%TYPE
1817 ,x_version_allowed_flag OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
1818 ,x_return_status OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
1819 ,x_msg_count OUT NOCOPY NUMBER --File.Sql.39 bug 4440895
1820 ,x_msg_data OUT NOCOPY VARCHAR2) --File.Sql.39 bug 4440895
1821 AS
1822
1823 l_msg_count NUMBER := 0;
1824 l_data VARCHAR2(2000);
1825 l_msg_data VARCHAR2(2000);
1826 l_error_msg_code VARCHAR2(30);
1827 l_msg_index_out NUMBER;
1828 l_return_status VARCHAR2(2000);
1829 l_debug_mode VARCHAR2(30);
1830 l_module_name VARCHAR2(100) := 'pa.plsql.Pa_Fp_Control_Items_Utils';
1831
1832 l_uncategorized_flag pa_resource_lists.uncategorized_flag%TYPE;
1833 l_group_resource_type_id pa_resource_lists.group_resource_type_id%TYPE;
1834 l_resource_list_id pa_resource_lists.resource_list_id%TYPE;
1835 l_grouped_flag VARCHAR2(1); --indicates if resource_list is grouped
1836
1837 l_proj_fp_options_id pa_proj_fp_options.proj_fp_options_id%TYPE;
1838
1839 l_count NUMBER;
1840 l_impacted_task_level VARCHAR2(1);
1841 l_plan_type_planning_level pa_proj_fp_options.all_fin_plan_level_code%TYPE;
1842
1843 -- jwhite: Added for Plannable Task Dev Effort ------------------
1844 -- 01-JUL-2003 Default ci from current working version
1845 l_ci_apprv_bv_option_id pa_proj_fp_options.proj_fp_options_id%TYPE :=NULL;
1846 l_ci_apprv_cw_bv_id pa_budget_versions.budget_version_id%TYPE :=NULL;
1847
1848 -- ---------------------------------------------------------------------------
1849
1850
1851 CURSOR impacted_task_cur(c_impacted_task_id pa_tasks.task_id%TYPE) IS
1852 SELECT parent_task_id,
1853 top_task_id
1854 FROM pa_tasks
1855 WHERE task_id = c_impacted_task_id;
1856
1857 impacted_task_rec impacted_task_cur%ROWTYPE;
1858
1859 /*CURSOR cur_impact_task_level_M_top (c_task_id pa_tasks.task_id%TYPE) IS
1860 SELECT COUNT(1)
1861 FROM DUAL
1862 WHERE EXISTS
1863 (SELECT 'X'
1864 FROM pa_resource_assignments pra
1865 WHERE pra.budget_version_id = l_ci_apprv_cw_bv_id
1866 AND pra.project_id = p_project_id
1867 AND pra.project_assignment_id = -1
1868 AND (pra.task_id=c_task_id OR pra.task_id=p_impacted_task_id));*/
1869
1870 CURSOR cur_impact_task_level_M_child IS
1871 SELECT COUNT(1)
1872 FROM DUAL
1873 WHERE EXISTS
1874 (SELECT 'X'
1875 FROM pa_resource_assignments pra
1876 WHERE pra.budget_version_id = l_ci_apprv_cw_bv_id
1877 AND pra.project_id = p_project_id
1878 AND pra.project_assignment_id = -1
1879 AND EXISTS ( SELECT 1
1880 FROM pa_tasks t
1881 WHERE t.parent_task_id = p_impacted_task_id
1882 START WITH t.task_id = pra.task_id
1883 CONNECT BY PRIOR t.parent_task_id = t.task_id));
1884
1885 CURSOR cur_impact_task_level_L (c_top_task_id pa_tasks.task_id%TYPE) IS
1886 SELECT COUNT(1)
1887 FROM DUAL
1888 WHERE EXISTS
1889 (SELECT 'X'
1890 FROM pa_resource_assignments pra
1891 WHERE pra.budget_version_id = l_ci_apprv_cw_bv_id
1892 AND pra.project_id = p_project_id
1893 AND pra.project_assignment_id = -1
1894 AND (pra.task_id = p_impacted_task_id or pra.task_id = c_top_task_id));-- /*UT*/fe.top_task_id = c_top_task_id)
1895
1896
1897 CURSOR cur_impact_task_level_T IS
1898 SELECT COUNT(1)
1899 FROM DUAL
1900 WHERE EXISTS
1901 (SELECT 'X'
1902 FROM pa_resource_assignments pra,
1903 pa_tasks t
1904 WHERE pra.budget_version_id = l_ci_apprv_cw_bv_id
1905 AND pra.project_id = p_project_id
1906 AND pra.project_assignment_id = -1
1907 AND t.task_id=pra.task_id
1908 AND t.top_task_id = p_impacted_task_id);
1909
1910 CURSOR cur_impacted_task_null IS
1911 SELECT count(1)
1912 FROM DUAL
1913 WHERE EXISTS
1914 (SELECT 'X'
1915 FROM pa_resource_assignments pra
1916 WHERE pra.budget_version_id = l_ci_apprv_cw_bv_id
1917 AND pra.project_id = p_project_id
1918 AND pra.project_assignment_id = -1);
1919 BEGIN
1920
1921 x_msg_count := 0;
1922 x_return_status := FND_API.G_RET_STS_SUCCESS;
1923 pa_debug.set_err_stack('PA_FP_CONTROL_ITEMS_UTILS.Is_Create_CI_Version_Allowed');
1924 fnd_profile.get('PA_DEBUG_MODE',l_debug_mode);
1925 l_debug_mode := NVL(l_debug_mode, 'Y');
1926 pa_debug.set_process('PLSQL','LOG',l_debug_mode);
1927
1928 -- Check for business rules violations
1929
1930 pa_debug.g_err_stage:= 'Validating input parameters';
1931 IF P_PA_DEBUG_MODE = 'Y' THEN
1932 pa_debug.write('Is_Create_CI_Version_Allowed: ' || l_module_name,pa_debug.g_err_stage,PA_FP_CONSTANTS_PKG.G_DEBUG_LEVEL3);
1933 END IF;
1934
1935 --Check if plan version id is null
1936
1937 IF (p_project_id IS NULL) OR
1938 (p_fin_plan_type_id IS NULL) OR
1939 (p_version_type IS NULL)
1940 THEN
1941 pa_debug.g_err_stage:= 'p_project_id = '||p_project_id;
1942 IF P_PA_DEBUG_MODE = 'Y' THEN
1943 pa_debug.write('Is_Create_CI_Version_Allowed: ' || l_module_name,pa_debug.g_err_stage,PA_FP_CONSTANTS_PKG.G_DEBUG_LEVEL5);
1944 END IF;
1945 pa_debug.g_err_stage:= 'p_fin_plan_type_id = '||p_fin_plan_type_id;
1946 IF P_PA_DEBUG_MODE = 'Y' THEN
1947 pa_debug.write('Is_Create_CI_Version_Allowed: ' || l_module_name,pa_debug.g_err_stage,PA_FP_CONSTANTS_PKG.G_DEBUG_LEVEL5);
1948 END IF;
1949 pa_debug.g_err_stage:= 'p_version_type = '||p_version_type;
1950 IF P_PA_DEBUG_MODE = 'Y' THEN
1951 pa_debug.write('Is_Create_CI_Version_Allowed: ' || l_module_name,pa_debug.g_err_stage,PA_FP_CONSTANTS_PKG.G_DEBUG_LEVEL5);
1952 END IF;
1953
1954 PA_UTILS.ADD_MESSAGE(p_app_short_name => 'PA',
1955 p_msg_name => 'PA_FP_INV_PARAM_PASSED');
1956
1957 pa_debug.g_err_stage:= 'Invalid Arguments Passed';
1958 IF P_PA_DEBUG_MODE = 'Y' THEN
1959 pa_debug.write('Is_Create_CI_Version_Allowed: ' || l_module_name,pa_debug.g_err_stage,PA_FP_CONSTANTS_PKG.G_DEBUG_LEVEL5);
1960 END IF;
1961
1962 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
1963 END IF;
1964
1965 -- Fetch the plan type fp options id and resource list attached
1966 -- Bug# 2682955-Fetching plan type planning level
1967
1968 -- Begin; jwhite: Added for Plannable Task Dev Effort ------------------
1969 -- 01-JUL-2003 Default ci from current working version
1970
1971
1972 -- Fetch current working approved budget version id
1973 Pa_Fp_Control_Items_Utils.CHK_APRV_CUR_WORKING_BV_EXISTS(
1974 p_project_id => p_project_id,
1975 p_fin_plan_type_id => p_fin_plan_type_id,
1976 p_version_type => p_version_type,
1977 x_cur_work_bv_id => l_ci_apprv_cw_bv_id,
1978 x_return_status => l_return_status,
1979 x_msg_count => l_msg_count,
1980 x_msg_data => l_msg_data );
1981
1982 IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
1983 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
1984 END IF;
1985
1986
1987 BEGIN
1988 SELECT proj_fp_options_id,
1989 DECODE(p_version_type,
1990 PA_FP_CONSTANTS_PKG.G_ELEMENT_TYPE_ALL, all_resource_list_id,
1991 PA_FP_CONSTANTS_PKG.G_ELEMENT_TYPE_COST, cost_resource_list_id,
1992 PA_FP_CONSTANTS_PKG.G_ELEMENT_TYPE_REVENUE, revenue_resource_list_id) resource_list_id,
1993 DECODE(p_version_type,
1994 PA_FP_CONSTANTS_PKG.G_ELEMENT_TYPE_ALL, all_fin_plan_level_code,
1995 PA_FP_CONSTANTS_PKG.G_ELEMENT_TYPE_COST, cost_fin_plan_level_code,
1996 PA_FP_CONSTANTS_PKG.G_ELEMENT_TYPE_REVENUE, revenue_fin_plan_level_code) plan_type_planning_level
1997 INTO l_proj_fp_options_id,
1998 l_resource_list_id,
1999 l_plan_type_planning_level
2000 FROM pa_proj_fp_options
2001 WHERE project_id = p_project_id
2002 AND fin_plan_type_id = p_fin_plan_type_id
2003 AND fin_plan_version_id = l_ci_apprv_cw_bv_id;
2004
2005 -- End; jwhite: Added for Plannable Task Dev Effort ------------------
2006
2007 EXCEPTION
2008 WHEN OTHERS THEN
2009 pa_debug.g_err_stage:= 'Failed to fetch the fp options id for given combination'||SQLERRM;
2010 IF P_PA_DEBUG_MODE = 'Y' THEN
2011 pa_debug.write('Is_Create_CI_Version_Allowed: ' || l_module_name,pa_debug.g_err_stage,PA_FP_CONSTANTS_PKG.G_DEBUG_LEVEL3);
2012 END IF;
2013 raise;
2014 END;
2015
2016 pa_debug.g_err_stage:= 'Impacted task = '|| p_impacted_task_id;
2017 IF P_PA_DEBUG_MODE = 'Y' THEN
2018 pa_debug.write('Is_Create_CI_Version_Allowed: ' || l_module_name,pa_debug.g_err_stage,PA_FP_CONSTANTS_PKG.G_DEBUG_LEVEL3);
2019 END IF;
2020
2021 pa_debug.g_err_stage := 'Plan Type Planning Level =' || l_plan_type_planning_level;
2022 IF P_PA_DEBUG_MODE = 'Y' THEN
2023 pa_debug.write('Is_Create_CI_Version_Allowed: ' || l_module_name,pa_debug.g_err_stage,PA_FP_CONSTANTS_PKG.G_DEBUG_LEVEL3);
2024 END IF;
2025
2026 -- Fetch resource list info
2027
2028 pa_debug.g_err_stage:= 'Calling get_resource_list_info' ;
2029 IF P_PA_DEBUG_MODE = 'Y' THEN
2030 pa_debug.write('Is_Create_CI_Version_Allowed: ' || l_module_name,pa_debug.g_err_stage,PA_FP_CONSTANTS_PKG.G_DEBUG_LEVEL3);
2031 END IF;
2032
2033 pa_fin_plan_utils.get_resource_list_info(
2034 p_resource_list_id => l_resource_list_id
2035 ,x_res_list_is_uncategorized => l_uncategorized_flag
2036 ,x_is_resource_list_grouped => l_grouped_flag
2037 ,x_group_resource_type_id => l_group_resource_type_id
2038 ,x_return_status => l_return_status
2039 ,x_msg_count => l_msg_count
2040 ,x_msg_data => l_msg_data);
2041
2042 IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
2043 raise PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
2044 END IF;
2045
2046 /* Bug# 2682955 - Creating plannable elements based on the impacted task is ONLY applicable
2047 if the plan type level planning level is Task level.
2048
2049 If the planning level for the plan type is Project and resource list is categorized, then ,
2050 regardless of the impacted tasks, only the existenc of project level planning elements
2051 should be checked.
2052
2053 If the planning level for the plan type is Project and resource list is uncategorized,
2054 no check needs to be done. */
2055
2056 IF l_plan_type_planning_level = PA_FP_CONSTANTS_PKG.G_BUDGET_ENTRY_LEVEL_PROJECT AND
2057 l_uncategorized_flag = 'Y' THEN
2058
2059 RETURN;
2060
2061 END IF;
2062
2063 IF l_plan_type_planning_level <> PA_FP_CONSTANTS_PKG.G_BUDGET_ENTRY_LEVEL_PROJECT THEN
2064
2065 -- If impacted task id is not null then fetch it's top task id and parent task id
2066 -- and derive the task level of it
2067
2068 IF p_impacted_task_id IS NOT NULL THEN
2069
2070 pa_debug.g_err_stage:= 'Fetching impacted task details';
2071 IF P_PA_DEBUG_MODE = 'Y' THEN
2072 pa_debug.write('Is_Create_CI_Version_Allowed: ' || l_module_name,pa_debug.g_err_stage,PA_FP_CONSTANTS_PKG.G_DEBUG_LEVEL3);
2073 END IF;
2074
2075 -- Fetching top task id and parent task id of impacted task id
2076
2077 OPEN impacted_task_cur(p_impacted_task_id);
2078 FETCH impacted_task_cur INTO impacted_task_rec;
2079 CLOSE impacted_task_cur;
2080
2081 -- Fetching impacted task level
2082
2083 IF impacted_task_rec.top_task_id = p_impacted_task_id
2084 THEN
2085 l_impacted_task_level := PA_FP_CONSTANTS_PKG.G_IMPACTED_TASK_LEVEL_T;
2086 ELSE
2087 BEGIN
2088 SELECT count(task_id)
2089 INTO l_count
2090 FROM pa_tasks
2091 WHERE parent_task_id = p_impacted_task_id;
2092
2093 IF l_count = 0
2094 THEN
2095 l_impacted_task_level := PA_FP_CONSTANTS_PKG.G_IMPACTED_TASK_LEVEL_L;
2096 ELSE
2097 l_impacted_task_level := PA_FP_CONSTANTS_PKG.G_IMPACTED_TASK_LEVEL_M;
2098 END IF;
2099 EXCEPTION
2100 WHEN Others THEN
2101 pa_debug.g_err_stage:= 'Error during fetching impacted task details';
2102 IF P_PA_DEBUG_MODE = 'Y' THEN
2103 pa_debug.write('Is_Create_CI_Version_Allowed: ' || l_module_name,pa_debug.g_err_stage,PA_FP_CONSTANTS_PKG.G_DEBUG_LEVEL3);
2104 END IF;
2105 RAISE;
2106 END;
2107 END IF;
2108
2109 pa_debug.g_err_stage:= 'Impacted task level = '|| l_impacted_task_level;
2110 IF P_PA_DEBUG_MODE = 'Y' THEN
2111 pa_debug.write('Is_Create_CI_Version_Allowed: ' || l_module_name,pa_debug.g_err_stage,PA_FP_CONSTANTS_PKG.G_DEBUG_LEVEL3);
2112 END IF;
2113
2114 END IF;
2115
2116 END IF; /* l_plan_type_planning_level <> PA_FP_CONSTANTS_PKG.G_BUDGET_ENTRY_LEVEL_PROJECT */
2117
2118 -- Initialising l_count to 0
2119
2120 l_count := 0;
2121
2122 /* Bug# 2682955 - If plan_type planning level is Project with a categorized resource list,
2123 we just need check for the existence of planning elements */
2124
2125 IF p_impacted_task_id IS NULL OR l_plan_type_planning_level = PA_FP_CONSTANTS_PKG.G_BUDGET_ENTRY_LEVEL_PROJECT
2126 THEN
2127
2128 -- Check if plan type has any plannable elements
2129
2130 pa_debug.g_err_stage:= 'Opening cur_impacted_task_null' ;
2131 IF P_PA_DEBUG_MODE = 'Y' THEN
2132 pa_debug.write('Is_Create_CI_Version_Allowed: ' || l_module_name,pa_debug.g_err_stage,PA_FP_CONSTANTS_PKG.G_DEBUG_LEVEL3);
2133 END IF;
2134
2135 OPEN cur_impacted_task_null;
2136 FETCH cur_impacted_task_null INTO l_count;
2137 CLOSE cur_impacted_task_null;
2138 ELSE
2139 IF l_impacted_task_level = PA_FP_CONSTANTS_PKG.G_IMPACTED_TASK_LEVEL_M THEN
2140
2141 -- Check if top task id of impacted task is plannable
2142 pa_debug.g_err_stage:= 'Opening cur_impact_task_level_M_child' ;
2143 IF P_PA_DEBUG_MODE = 'Y' THEN
2144 pa_debug.write('Is_Create_CI_Version_Allowed: ' || l_module_name,pa_debug.g_err_stage,PA_FP_CONSTANTS_PKG.G_DEBUG_LEVEL3);
2145 END IF;
2146
2147 OPEN cur_impact_task_level_M_child;
2148 FETCH cur_impact_task_level_M_child INTO l_count;
2149 CLOSE cur_impact_task_level_M_child;
2150
2151 ELSIF l_impacted_task_level = PA_FP_CONSTANTS_PKG.G_IMPACTED_TASK_LEVEL_L THEN
2152
2153 -- Check if the impacted task or its top task is plannable
2154
2155 pa_debug.g_err_stage:= 'Opening cur_impact_task_level_L' ;
2156 IF P_PA_DEBUG_MODE = 'Y' THEN
2157 pa_debug.write('Is_Create_CI_Version_Allowed: ' || l_module_name,pa_debug.g_err_stage,PA_FP_CONSTANTS_PKG.G_DEBUG_LEVEL3);
2158 END IF;
2159
2160 OPEN cur_impact_task_level_L(impacted_task_rec.top_task_id);
2161 FETCH cur_impact_task_level_L INTO l_count;
2162 CLOSE cur_impact_task_level_L;
2163
2164 ELSIF l_impacted_task_level = PA_FP_CONSTANTS_PKG.G_IMPACTED_TASK_LEVEL_T THEN
2165
2166 -- Check if there are any plannable elements with top task id as impacted task id.
2167
2168 pa_debug.g_err_stage:= 'Opening cur_impact_task_level_T' ;
2169 IF P_PA_DEBUG_MODE = 'Y' THEN
2170 pa_debug.write('Is_Create_CI_Version_Allowed: ' || l_module_name,pa_debug.g_err_stage,PA_FP_CONSTANTS_PKG.G_DEBUG_LEVEL3);
2171 END IF;
2172
2173 OPEN cur_impact_task_level_T;
2174 FETCH cur_impact_task_level_T INTO l_count;
2175 CLOSE cur_impact_task_level_T;
2176 END IF;
2177 END IF;
2178
2179 IF l_count = 0
2180 THEN
2181 x_version_allowed_flag := 'N';
2182
2183 pa_debug.g_err_stage:= 'Ci_version cant be created';
2184 IF P_PA_DEBUG_MODE = 'Y' THEN
2185 pa_debug.write('Is_Create_CI_Version_Allowed: ' || l_module_name,pa_debug.g_err_stage,PA_FP_CONSTANTS_PKG.G_DEBUG_LEVEL5);
2186 END IF;
2187
2188 -- raise error if the ci version cant be created
2189 x_return_status := FND_API.G_RET_STS_ERROR;
2190
2191 PA_UTILS.ADD_MESSAGE(p_app_short_name => 'PA',
2192 p_msg_name => 'PA_FP_CI_VERSION_NOT_ALLOWED');
2193 RETURN;
2194 ELSE
2195 x_version_allowed_flag := 'Y';
2196 END IF;
2197
2198 pa_debug.g_err_stage:= 'Exiting Is_Create_CI_Version_Allowed';
2199 IF P_PA_DEBUG_MODE = 'Y' THEN
2200 pa_debug.write('Is_Create_CI_Version_Allowed: ' || l_module_name,pa_debug.g_err_stage,PA_FP_CONSTANTS_PKG.G_DEBUG_LEVEL3);
2201 END IF;
2202 pa_debug.reset_err_stack;
2203
2204 EXCEPTION
2205
2206 WHEN PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc THEN
2207
2208 x_return_status := FND_API.G_RET_STS_ERROR;
2209 l_msg_count := FND_MSG_PUB.count_msg;
2210 IF l_msg_count = 1 THEN
2211 PA_INTERFACE_UTILS_PUB.get_messages
2212 (p_encoded => FND_API.G_TRUE
2213 ,p_msg_index => 1
2214 ,p_msg_count => l_msg_count
2215 ,p_msg_data => l_msg_data
2216 ,p_data => l_data
2217 ,p_msg_index_out => l_msg_index_out);
2218 x_msg_data := l_data;
2219 x_msg_count := l_msg_count;
2220 ELSE
2221 x_msg_count := l_msg_count;
2222 END IF;
2223
2224 -- pa_debug.g_err_stage:= 'Invalid Arguments Passed';
2225 -- pa_debug.write(l_module_name,pa_debug.g_err_stage,PA_FP_CONSTANTS_PKG.G_DEBUG_LEVEL5);
2226 pa_debug.reset_err_stack;
2227 RAISE;
2228
2229 WHEN others THEN
2230
2231 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2232 x_msg_count := 1;
2233 x_msg_data := SQLERRM;
2234 FND_MSG_PUB.add_exc_msg( p_pkg_name => 'PA_FP_CONTROL_ITEMS_UTILS'
2235 ,p_procedure_name => 'Is_Create_CI_Version_Allowed');
2236 pa_debug.g_err_stage:= 'Unexpected Error'||SQLERRM;
2237 IF P_PA_DEBUG_MODE = 'Y' THEN
2238 pa_debug.write('Is_Create_CI_Version_Allowed: ' || l_module_name,pa_debug.g_err_stage,PA_FP_CONSTANTS_PKG.G_DEBUG_LEVEL5);
2239 END IF;
2240 pa_debug.reset_err_stack;
2241 RAISE;
2242
2243 END Is_Create_CI_Version_Allowed;
2244
2245 PROCEDURE IsValidAgreement(
2246 p_project_id IN NUMBER,
2247 p_agreement_number IN VARCHAR2,
2248 x_agreement_id OUT NOCOPY NUMBER, --File.Sql.39 bug 4440895
2249 x_msg_count OUT NOCOPY NUMBER, --File.Sql.39 bug 4440895
2250 x_msg_data OUT NOCOPY VARCHAR2, --File.Sql.39 bug 4440895
2251 x_return_status OUT NOCOPY VARCHAR2 ) IS --File.Sql.39 bug 4440895
2252 l_count NUMBER := 0;
2253
2254 BEGIN
2255 x_return_status := FND_API.G_RET_STS_SUCCESS;
2256
2257 IF P_PA_DEBUG_MODE = 'Y' THEN
2258 pa_debug.init_err_stack('IsValidAgreement: ' || 'PA_FP_CONTROL_ITEMS_UTILS.Get_Fin_Plan_Dtls');
2259 END IF;
2260
2261 IF p_agreement_number IS NULL THEN
2262 x_return_status := FND_API.G_RET_STS_ERROR;
2263 PA_UTILS.ADD_MESSAGE( p_app_short_name => 'PA',
2264 p_msg_name => 'PA_FP_AGR_NUM_REQ' );
2265 pa_debug.reset_err_stack;
2266 RETURN;
2267 END IF;
2268
2269 SELECT a.Agreement_Id INTO x_agreement_id FROM
2270 Pa_Agreements_All a,
2271 Pa_Summary_Project_Fundings spf
2272 WHERE
2273 a.agreement_num = p_agreement_number AND
2274 a.agreement_id = spf.agreement_id AND
2275 spf.project_id = p_project_id AND
2276 NVL(spf.total_unbaselined_amount,0) > 0 AND
2277 ROWNUM < 2;
2278 pa_debug.reset_err_stack;
2279 RETURN;
2280 EXCEPTION
2281 WHEN NO_DATA_FOUND THEN
2282 x_return_status := FND_API.G_RET_STS_ERROR;
2283 PA_UTILS.ADD_MESSAGE( p_app_short_name => 'PA',
2284 p_msg_name => 'PA_FP_AGR_INVALID',
2285 p_token1 => 'AGREEMENT_NUMBER',
2286 p_value1 => p_agreement_number);
2287 pa_debug.reset_err_stack;
2288 RETURN;
2289
2290 WHEN OTHERS THEN
2291 FND_MSG_PUB.Add_Exc_Msg(
2292 p_pkg_name => 'PA_FP_CONTROL_ITEMS_UTILS.IsValidAgreement'
2293 ,p_procedure_name => PA_DEBUG.G_Err_Stack);
2294 IF P_PA_DEBUG_MODE = 'Y' THEN
2295 pa_debug.write_file('IsValidAgreement: ' || SQLERRM);
2296 END IF;
2297 pa_debug.reset_err_stack;
2298 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2299 RAISE;
2300 END IsValidAgreement;
2301
2302 FUNCTION IsFpAutoBaselineEnabled(p_project_id IN NUMBER)
2303 RETURN VARCHAR2 IS
2304 l_baseline_funding_flag pa_projects_all.baseline_funding_flag%TYPE;
2305 l_no_of_app_plan_types NUMBER;
2306 l_fp_pref_code pa_proj_fp_options.fin_plan_preference_code%TYPE;
2307
2308 BEGIN
2309 SELECT NVL(Baseline_Funding_Flag,'N') INTO
2310 l_baseline_Funding_flag
2311 FROM Pa_Projects_All
2312 WHERE
2313 Project_Id = p_project_id;
2314 IF l_baseline_funding_flag = 'N' THEN
2315 RETURN l_baseline_funding_flag;
2316 END IF;
2317
2318 SELECT COUNT(*) INTO l_no_of_app_plan_types FROM Pa_Proj_Fp_Options
2319 WHERE
2320 Project_Id = p_project_id AND
2321 Fin_Plan_Option_Level_Code = 'PLAN_TYPE' AND
2322 ( NVL(Approved_Cost_Plan_Type_Flag ,'N') = 'Y' OR
2323 NVL(Approved_Rev_Plan_Type_Flag ,'N') = 'Y' ) ;
2324
2325 IF l_no_of_app_plan_types = 0 THEN
2326 l_baseline_funding_flag := 'N';
2327 RETURN l_baseline_funding_flag;
2328 END IF;
2329
2330 IF l_no_of_app_plan_types = 1 THEN
2331 SELECT fin_plan_preference_code INTO
2332 l_fp_pref_code
2333 FROM pa_proj_fp_options
2334 WHERE
2335 project_id = p_project_id AND
2336 Fin_Plan_Option_Level_Code = 'PLAN_TYPE' AND
2337 ( NVL(Approved_Cost_Plan_Type_Flag ,'N') = 'Y' OR
2338 NVL(Approved_Rev_Plan_Type_Flag ,'N') = 'Y' ) ;
2339
2340 IF l_fp_pref_code = PA_FP_CONSTANTS_PKG.G_PREF_COST_ONLY THEN
2341 l_baseline_funding_flag := 'N';
2342 RETURN l_baseline_funding_flag;
2343 END IF;
2344 END IF;
2345 /* if the no of approved plan types is 2, then
2346 it is planned for revenue */
2347 RETURN l_baseline_funding_flag;
2348 EXCEPTION
2349 WHEN OTHERS THEN
2350 RETURN 'N';
2351 END IsFpAutoBaselineEnabled;
2352
2353 /*
2354 This API returns budget version information
2355 from the pa budget versions table and
2356 also returns information regarding project
2357 currency to show on the OA Page
2358 */
2359 PROCEDURE GET_BUDGET_VERSION_INFO
2360 (
2361 p_project_id IN NUMBER,
2362 p_budget_version_id IN NUMBER,
2363 x_version_number OUT NOCOPY NUMBER, --File.Sql.39 bug 4440895
2364 x_version_name OUT NOCOPY VARCHAR2, --File.Sql.39 bug 4440895
2365 x_version_type OUT NOCOPY VARCHAR2, --File.Sql.39 bug 4440895
2366 x_project_currency_code OUT NOCOPY VARCHAR2, --File.Sql.39 bug 4440895
2367 x_approved_cost_flag OUT NOCOPY VARCHAR2, --File.Sql.39 bug 4440895
2368 x_approved_rev_flag OUT NOCOPY VARCHAR2, --File.Sql.39 bug 4440895
2369 x_fin_plan_type_id OUT NOCOPY NUMBER, --File.Sql.39 bug 4440895
2370 x_plan_type_name OUT NOCOPY VARCHAR2, --File.Sql.39 bug 4440895
2371 x_plan_class_code OUT NOCOPY VARCHAR2, --File.Sql.39 bug 4440895
2372 x_return_status OUT NOCOPY VARCHAR2, --File.Sql.39 bug 4440895
2373 x_msg_count OUT NOCOPY NUMBER, --File.Sql.39 bug 4440895
2374 x_msg_data OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
2375 )
2376 IS
2377
2378 -- Local Variable Declaration
2379 l_debug_mode VARCHAR2(30);
2380
2381 BEGIN
2382 IF P_PA_DEBUG_MODE = 'Y' THEN
2383 pa_debug.init_err_stack('PAFPCIUB.GET_BUDGET_VERSION_INFO');
2384 END IF;
2385 fnd_profile.get('PA_DEBUG_MODE',l_debug_mode);
2386 l_debug_mode := NVL(l_debug_mode, 'Y');
2387 pa_debug.set_process('PLSQL','LOG',l_debug_mode);
2388 x_return_status := FND_API.G_RET_STS_SUCCESS;
2389 x_msg_count := 0;
2390 ----DBMS_OUTPUT.PUT_LINE('GET_BUDGET_VERSION_INFO - 1');
2391 --Get the column values for this budget version id and project id combination
2392 -- Added x_plan_class_code below
2393 BEGIN
2394 SELECT
2395 bv.version_number,
2396 bv.version_name,
2397 bv.version_type,
2398 NVL(bv.approved_cost_plan_type_flag,'N'),
2399 NVL(bv.approved_rev_plan_type_flag,'N'),
2400 bv.fin_plan_type_id,
2401 patl.name,
2402 pftb.plan_class_code plan_class_code
2403 INTO
2404 x_version_number,
2405 x_version_name,
2406 x_version_type,
2407 x_approved_cost_flag,
2408 x_approved_rev_flag,
2409 x_fin_plan_type_id,
2410 x_plan_type_name,
2411 x_plan_class_code
2412 FROM pa_budget_versions bv, pa_fin_plan_types_tl patl,pa_fin_plan_types_b pftb
2413 WHERE bv.budget_version_id = p_budget_version_id
2414 and bv.project_id = p_project_id
2415 and bv.fin_plan_type_id = patl.fin_plan_type_id
2416 and patl.fin_plan_type_id = pftb.fin_plan_type_id
2417 and patl.language = userenv('LANG');
2418
2419 EXCEPTION
2420 WHEN NO_DATA_FOUND THEN
2421 PA_UTILS.ADD_MESSAGE
2422 ( p_app_short_name => 'PA',
2423 p_msg_name => 'PA_FP_CI_NO_VERSION_DATA_FOUND');
2424 ----DBMS_OUTPUT.PUT_LINE('FP_CI_GET_VERSION_DETAILS - 2***');
2425 x_return_status := FND_API.G_RET_STS_ERROR;
2426 END;
2427
2428 BEGIN
2429 SELECT project_currency_code
2430 INTO
2431 x_project_currency_code
2432 FROM
2433 Pa_Projects_All
2434 WHERE
2435 project_Id = p_project_id;
2436 EXCEPTION
2437 WHEN NO_DATA_FOUND THEN
2438 NULL;
2439 END;
2440
2441 EXCEPTION
2442 WHEN OTHERS THEN
2443 FND_MSG_PUB.add_exc_msg
2444 ( p_pkg_name => 'Pa_Fp_Control_Items_Utils.' ||
2445 'GET_BUDGET_VERSION_INFO'
2446 ,p_procedure_name => PA_DEBUG.G_Err_Stack);
2447 ----DBMS_OUTPUT.PUT_LINE('GET_BUDGET_VERSION_INFO - 3');
2448 IF P_PA_DEBUG_MODE = 'Y' THEN
2449 PA_DEBUG.g_err_stage := 'Unexpected error in GET_BUDGET_VERSION_INFO';
2450 PA_DEBUG.Log_Message(p_message => PA_DEBUG.g_err_stage);
2451 END IF;
2452 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2453 PA_DEBUG.Reset_Curr_Function;
2454 RAISE;
2455 END GET_BUDGET_VERSION_INFO;
2456 -- end of GET_BUDGET_VERSION_INFO
2457
2458 /* the following function is used in the
2459 Impact Implementation page */
2460
2461 FUNCTION Get_Funindg_Amount(
2462 p_project_id IN pa_projects_all.project_id%TYPE,
2463 p_agreement_id IN pa_agreements_all.agreement_id%TYPE)
2464 RETURN NUMBER IS
2465 l_funding_amount NUMBER := 0;
2466 BEGIN
2467 SELECT SUM(NVL(total_baselined_amount,0)) INTO
2468 l_funding_amount
2469 FROM
2470 pa_summary_project_fundings
2471 WHERE
2472 project_id = p_project_id AND
2473 agreement_id = p_agreement_id;
2474 RETURN l_funding_amount;
2475 EXCEPTION
2476 WHEN OTHERS THEN
2477 RETURN l_funding_amount;
2478 END GET_FUNINDG_AMOUNT;
2479
2480 /* CHK_APRV_CUR_WORKING_BV_EXISTS checks to see if for an approved budget version
2481 which is a current working version of the version type the user is
2482 trying to create a financial impact. It returns an error status when such a
2483 working version is not available.
2484 */
2485 --Bug 4283579: The fix done to this API thru bug 4089203 is reverted as that is only partial fix.
2486 --Please refer to the bug 4283579 for the expected/correct behavior. Code changes for enforcing that
2487 --behavior are targeted for track1 post FP.M
2488
2489 PROCEDURE CHK_APRV_CUR_WORKING_BV_EXISTS
2490 ( p_project_id IN pa_projects_all.project_id%TYPE
2491 ,p_fin_plan_type_id IN pa_proj_fp_options.fin_plan_type_id%TYPE
2492 ,p_version_type IN pa_budget_versions.version_type%TYPE
2493 ,x_cur_work_bv_id OUT NOCOPY pa_budget_versions.budget_version_id%TYPE --File.Sql.39 bug 4440895
2494 ,x_return_status OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
2495 ,x_msg_count OUT NOCOPY NUMBER --File.Sql.39 bug 4440895
2496 ,x_msg_data OUT NOCOPY VARCHAR2) IS --File.Sql.39 bug 4440895
2497
2498 l_msg_index_out number;
2499 l_exists varchar2(1) := 'N';
2500 l_project_name pa_projects_all.name%TYPE;
2501 l_plan_name pa_fin_plan_types_tl.name%TYPE;
2502 l_version_type pa_lookups.meaning%TYPE;
2503 l_stage number;
2504 l_baseline_funding_flag pa_projects_all.baseline_funding_flag%TYPE;
2505 l_msg_name fnd_new_messages.message_name%TYPE;
2506 --Bug 5845142. Exclude COST impacts with cost and revenue together setup.
2507 cursor c1 is
2508 Select budget_version_id
2509 from pa_budget_versions bv,
2510 pa_proj_fp_options pfo
2511 where bv.project_id = p_project_id
2512 and bv.fin_plan_type_id = p_fin_plan_type_id
2513 and bv.version_type = p_version_type
2514 and bv.current_working_flag = 'Y'
2515 and bv.ci_id IS NULL
2516 and pfo.project_id = p_project_id
2517 and pfo.fin_plan_type_id= p_fin_plan_type_id
2518 and pfo.fin_plan_version_id IS NULL
2519 and ((DECODE(p_version_type,'COST',bv.approved_cost_plan_type_flag,
2520 'REVENUE',bv.approved_rev_plan_type_flag,
2521 'N') = 'Y')
2522 OR
2523 (p_version_type='ALL' and
2524 pfo.approved_cost_plan_type_flag ='Y' and
2525 pfo.approved_rev_plan_type_flag ='N' and
2526 pfo.fin_plan_preference_code='COST_AND_REV_SAME')
2527 OR
2528 (p_version_type='ALL' and
2529 pfo.approved_cost_plan_type_flag ='N' and
2530 pfo.approved_rev_plan_type_flag ='Y' and
2531 pfo.fin_plan_preference_code='COST_AND_REV_SAME') /* bug 7584903 */
2532 OR
2533 (bv.approved_cost_plan_type_flag = 'Y' and
2534 bv.approved_rev_plan_type_flag = 'Y')) ;
2535
2536 BEGIN
2537
2538 x_return_status := FND_API.G_RET_STS_SUCCESS;
2539
2540 l_stage := 100;
2541
2542 select name,
2543 NVL(Baseline_Funding_Flag,'N')
2544 into l_project_name,
2545 l_baseline_Funding_flag
2546 from pa_projects_all
2547 where project_id = p_project_id;
2548
2549 l_stage := 200;
2550
2551 select name
2552 into l_plan_name
2553 from pa_fin_plan_types_tl
2554 where fin_plan_type_id = p_fin_plan_type_id
2555 and language = userenv('LANG');
2556
2557 l_stage := 300;
2558
2559 select meaning
2560 into l_version_type
2561 from pa_lookups
2562 where lookup_type = 'FIN_PLAN_VER_TYPE'
2563 and lookup_code = p_version_type;
2564
2565 l_stage := 400;
2566
2567 open c1;
2568 l_stage := 500;
2569 fetch c1 into x_cur_work_bv_id;
2570 IF C1%NOTFOUND then
2571 x_cur_work_bv_id := -9999;
2572 IF l_baseline_Funding_flag = 'Y' AND
2573 p_version_type = 'REVENUE' THEN
2574 l_msg_name := 'PA_FP_CI_AB_NO_CW';
2575 ELSE
2576 l_msg_name := 'PA_FP_APRV_CUR_WORK_NOT_EXISTS';
2577 END IF;
2578 pa_utils.add_message
2579 ( p_app_short_name => 'PA',
2580 p_msg_name => l_msg_name,
2581 p_token1 => 'PROJECT',
2582 p_value1 => l_project_name,
2583 p_token2 => 'PLAN',
2584 p_value2 => l_plan_name,
2585 p_token3 => 'VERSION_TYPE',
2586 p_value3 => l_version_type);
2587
2588 fnd_msg_pub.count_and_get (p_count => x_msg_count,
2589 p_data => x_msg_data);
2590 x_msg_count := fnd_msg_pub.count_msg;
2591 x_return_status := FND_API.G_RET_STS_ERROR;
2592 close c1;
2593
2594 return;
2595 END IF;
2596
2597 l_stage := 600;
2598 close c1;
2599
2600 x_msg_count := FND_MSG_PUB.Count_Msg;
2601
2602 IF x_msg_count = 1 then
2603 PA_INTERFACE_UTILS_PUB.get_messages
2604 (p_encoded => FND_API.G_TRUE,
2605 p_msg_index => 1,
2606 p_data => x_msg_data,
2607 p_msg_index_out => l_msg_index_out);
2608 END IF;
2609 x_return_status := FND_API.G_RET_STS_SUCCESS;
2610
2611 EXCEPTION
2612 WHEN OTHERS THEN
2613 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2614 x_msg_count := 1;
2615 x_msg_data := to_char(l_stage)||'-'||SQLERRM;
2616 FND_MSG_PUB.add_exc_msg
2617 ( p_pkg_name => 'PA_FP_CONTROL_ITEMS_UTILS'
2618 ,p_procedure_name => 'Chk_Aprv_Cur_Working_BV_Exists' );
2619
2620 END CHK_APRV_CUR_WORKING_BV_EXISTS;
2621
2622 --In FP M merge is not possible only when the source time phasing is PA and target time phasing is GL or vice-versa
2623 --IN other cases merge will be possible. Modified the API for this change
2624 PROCEDURE COMPARE_SOURCE_TARGET_VER_ATTR
2625 ( p_source_bv_id IN pa_budget_versions.budget_version_id%TYPE
2626 ,p_target_bv_id IN pa_budget_versions.budget_version_id%TYPE
2627 ,x_attributes_same_flag OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
2628 ,x_return_status OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
2629 ,x_msg_count OUT NOCOPY NUMBER --File.Sql.39 bug 4440895
2630 ,x_msg_data OUT NOCOPY VARCHAR2) IS --File.Sql.39 bug 4440895
2631
2632 l_stage number ;
2633 l_source_time_phased_code pa_proj_fp_options.all_time_phased_code%TYPE;
2634 l_target_time_phased_code pa_proj_fp_options.all_time_phased_code%TYPE;
2635
2636 cursor c1 is
2637 select DECODE(pos.fin_plan_preference_code,'COST_ONLY', pos.cost_time_phased_code,
2638 'REVENUE_ONLY',pos.revenue_time_phased_code,
2639 pos.all_time_phased_code) source_time_phased_code,
2640 DECODE(pot.fin_plan_preference_code,'COST_ONLY', pot.cost_time_phased_code,
2641 'REVENUE_ONLY',pot.revenue_time_phased_code,
2642 pot.all_time_phased_code) target_time_phased_code
2643 from pa_proj_fp_options pos
2644 ,pa_proj_fp_options pot
2645 where pos.fin_plan_version_id = p_source_bv_id
2646 and pot.fin_plan_version_id = p_target_bv_id;
2647 BEGIN
2648 x_return_status := FND_API.G_RET_STS_SUCCESS;
2649
2650 open c1;
2651 l_stage := 100;
2652 fetch c1 into l_source_time_phased_code
2653 ,l_target_time_phased_code;
2654
2655 l_stage := 200;
2656 close c1;
2657
2658 IF l_source_time_phased_code <> l_target_time_phased_code AND
2659 l_source_time_phased_code IN ('P','G') AND
2660 l_target_time_phased_code IN ('P','G') THEN
2661
2662 l_stage := 400;
2663 --For Bug 3642884
2664 x_attributes_same_flag := 'N';
2665 x_return_status := FND_API.G_RET_STS_SUCCESS;
2666 x_msg_count := FND_MSG_PUB.Count_Msg;
2667 x_msg_data := NULL;
2668
2669 ELSE
2670 l_stage := 500;
2671 --For Bug 3642884
2672 x_attributes_same_flag := 'Y';
2673 x_return_status := FND_API.G_RET_STS_SUCCESS;
2674 x_msg_count := FND_MSG_PUB.Count_Msg;
2675 x_msg_data := NULL;
2676 END IF;
2677
2678 EXCEPTION
2679 WHEN OTHERS THEN
2680 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2681 x_msg_count := 1;
2682 x_msg_data := to_char(l_stage)||'-'||SQLERRM;
2683 FND_MSG_PUB.add_exc_msg
2684 ( p_pkg_name => 'PA_FP_CONTROL_ITEMS_UTILS'
2685 ,p_procedure_name => 'Compare_Source_Target_Ver_Attr' );
2686
2687 END COMPARE_SOURCE_TARGET_VER_ATTR;
2688
2689 /*
2690 This API returns budget version id OR
2691 number of budget version ids for a project id,
2692 fin plan type id and version name if there
2693 are more than one budget version ids.The API
2694 is used to validate the LOV selection in
2695 the Advanced Display Options Page
2696 */
2697 PROCEDURE CHECK_PLAN_VERSION_NAME_OR_ID
2698 (
2699 p_project_id IN NUMBER,
2700 p_budget_version_name IN VARCHAR2,
2701 p_fin_plan_type_id IN NUMBER,
2702 p_version_type IN VARCHAR2,
2703 x_no_of_bv_versions OUT NOCOPY NUMBER, --File.Sql.39 bug 4440895
2704 x_budget_version_id OUT NOCOPY NUMBER, --File.Sql.39 bug 4440895
2705 x_return_status OUT NOCOPY VARCHAR2, --File.Sql.39 bug 4440895
2706 x_msg_count OUT NOCOPY NUMBER, --File.Sql.39 bug 4440895
2707 x_msg_data OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
2708 )
2709 IS
2710
2711 -- Local Variable Declaration
2712 l_debug_mode VARCHAR2(30);
2713
2714 BEGIN
2715 IF P_PA_DEBUG_MODE = 'Y' THEN
2716 pa_debug.init_err_stack('PAFPCIUB.CHECK_PLAN_VERSION_NAME_OR_ID');
2717 END IF;
2718 fnd_profile.get('PA_DEBUG_MODE',l_debug_mode);
2719 l_debug_mode := NVL(l_debug_mode, 'Y');
2720 pa_debug.set_process('PLSQL','LOG',l_debug_mode);
2721 x_return_status := FND_API.G_RET_STS_SUCCESS;
2722 x_msg_count := 0;
2723 ----DBMS_OUTPUT.PUT_LINE('CHECK_PLAN_VERSION_NAME_OR_ID - 1');
2724 --Get the number of versions for this budget version name
2725 -- fin plan type id and project id combination
2726 SELECT
2727 count(*)
2728 INTO
2729 x_no_of_bv_versions
2730 FROM pa_budget_versions bv
2731 WHERE bv.version_name = p_budget_version_name
2732 and bv.project_id = p_project_id
2733 and bv.fin_plan_type_id = p_fin_plan_type_id
2734 and bv.version_type = p_version_type;
2735
2736 IF (x_no_of_bv_versions = 1) THEN
2737 SELECT
2738 bv.budget_version_id
2739 INTO
2740 x_budget_version_id
2741 FROM pa_budget_versions bv
2742 WHERE bv.version_name = p_budget_version_name
2743 and bv.project_id = p_project_id
2744 and bv.fin_plan_type_id = p_fin_plan_type_id
2745 and bv.version_type = p_version_type;
2746
2747 RETURN;
2748 ELSE
2749 RETURN;
2750 END IF;
2751 EXCEPTION
2752 WHEN OTHERS THEN
2753 FND_MSG_PUB.add_exc_msg
2754 ( p_pkg_name => 'Pa_Fp_Control_Items_Utils.' ||
2755 'CHECK_PLAN_VERSION_NAME_OR_ID'
2756 ,p_procedure_name => PA_DEBUG.G_Err_Stack);
2757 ----DBMS_OUTPUT.PUT_LINE('CHECK_PLAN_VERSION_NAME_OR_ID - 3');
2758 IF P_PA_DEBUG_MODE = 'Y' THEN
2759 PA_DEBUG.g_err_stage := 'Unexpected error in CHECK_PLAN_VERSION_NAME_OR_ID';
2760 PA_DEBUG.Log_Message(p_message => PA_DEBUG.g_err_stage);
2761 END IF;
2762 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2763 PA_DEBUG.Reset_Curr_Function;
2764 RAISE;
2765 END CHECK_PLAN_VERSION_NAME_OR_ID;
2766 -- end of CHECK_PLAN_VERSION_NAME_OR_ID
2767
2768
2769 --
2770
2771 -- 01-JUL-2003 jwhite - Bug 2989874
2772 -- For procedure, FP_CI_CHECK_COPY_POSSIBLE
2773 -- default ci from the current working version.
2774
2775 PROCEDURE FP_CI_CHECK_COPY_POSSIBLE
2776 ( p_source_plan_level_code IN pa_proj_fp_options.all_fin_plan_level_code%TYPE
2777 ,p_source_time_phased_code IN pa_proj_fp_options.all_time_phased_code%TYPE
2778 ,p_source_resource_list_id IN pa_proj_fp_options.all_resource_list_id%TYPE
2779 ,p_source_version_type IN pa_budget_versions.version_type%TYPE
2780 ,p_project_id IN pa_budget_versions.project_id%TYPE
2781 ,p_s_ci_id IN pa_budget_versions.ci_id%TYPE
2782 ,p_multiple_plan_types_flag IN VARCHAR2
2783 ,x_copy_possible_flag OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
2784 ,x_return_status OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
2785 ,x_msg_count OUT NOCOPY NUMBER --File.Sql.39 bug 4440895
2786 ,x_msg_data OUT NOCOPY VARCHAR2) --File.Sql.39 bug 4440895
2787 IS
2788
2789 l_debug_mode VARCHAR2(30);
2790 l_target_plan_level_code pa_proj_fp_options.all_fin_plan_level_code%TYPE;
2791 l_target_time_phased_code pa_proj_fp_options.all_time_phased_code%TYPE;
2792 l_target_resource_list_id pa_proj_fp_options.all_resource_list_id%TYPE;
2793
2794 l_token_ci_id varchar2(150);
2795 l_token_v_type VARCHAR2(30);
2796 l_time_phase_code_flag VARCHAR2(1);
2797 l_baseline_funding_Flag pa_projects_All.baseline_funding_flag%type;
2798 l_s_rev_bv_id pa_budget_versions.budget_version_id%type;
2799 l_count number;
2800 l_s_bv_fp_level_code pa_proj_fp_options.all_fin_plan_level_code%TYPE;
2801 l_ci_number pa_control_items.ci_number%type;
2802 l_ci_type_name pa_ci_types_tl.short_name%type;
2803 l_s_bv_time_phased_code pa_proj_fp_options.revenue_time_phased_code%type;
2804 l_s_bv_resource_list_id pa_proj_fp_options.revenue_resource_list_id%type;
2805
2806 l_ci_aprv_bv_option_id pa_proj_fp_options.proj_fp_options_id%TYPE;
2807 l_ci_aprv_cw_bv_id pa_budget_versions.budget_version_id%TYPE;
2808 l_ci_aprv_plan_type_id pa_proj_fp_options.fin_plan_type_id%TYPE;
2809 l_return_status VARCHAR2(1) := NULL;
2810 l_msg_count NUMBER := NULL;
2811 l_msg_data VARCHAR2(2000) := NULL;
2812 l_data VARCHAR2(2000) := NULL;
2813 l_msg_index_out NUMBER := NULL;
2814
2815
2816 BEGIN
2817 IF P_PA_DEBUG_MODE = 'Y' THEN
2818 pa_debug.init_err_stack('PAFPCIUB.FP_CI_CHECK_COPY_POSSIBLE');
2819 END IF;
2820 fnd_profile.get('PA_DEBUG_MODE',l_debug_mode);
2821 l_debug_mode := NVL(l_debug_mode, 'Y');
2822 pa_debug.set_process('PLSQL','LOG',l_debug_mode);
2823 x_return_status := FND_API.G_RET_STS_SUCCESS;
2824 x_msg_count := 0;
2825 ----DBMS_OUTPUT.PUT_LINE('FP_CI_CHECK_COPY_POSSIBLE - 1');
2826
2827 IF(p_source_version_type = 'COST') THEN
2828 l_token_v_type := p_source_version_type;
2829 ELSIF (p_source_version_type = 'REVENUE') THEN
2830 l_token_v_type := p_source_version_type;
2831 ELSE
2832 l_token_v_type := '';
2833 END IF;
2834
2835 IF(p_source_time_phased_code = 'P') THEN
2836 l_time_phase_code_flag := 'Y';
2837 ELSIF(p_source_time_phased_code = 'G') then
2838
2839 l_time_phase_code_flag := 'Y';
2840 ELSIF(p_source_time_phased_code = 'N') THEN
2841 l_time_phase_code_flag := 'Y';
2842 ELSE
2843 l_time_phase_code_flag := 'N';
2844 END IF;
2845
2846 select nvl(baseline_funding_flag ,'N') into
2847 l_baseline_funding_flag from
2848 pa_projects_all where
2849 project_id = p_project_id;
2850
2851 l_token_ci_id := null;
2852
2853 begin
2854 select ci.ci_number,cit.short_name into
2855 l_ci_number,l_ci_type_name from
2856 pa_control_items ci,
2857 pa_ci_types_tl cit
2858 where ci.ci_id = p_s_ci_id and
2859 cit.ci_type_id = ci.ci_type_id and
2860 cit.language = userenv('LANG');
2861 l_token_ci_id := l_ci_type_name;
2862 if l_ci_number is not null then
2863 l_token_ci_id := l_token_ci_id ||'('||l_ci_number ||')';
2864 end if;
2865 exception
2866 when no_data_found then
2867 l_count := 0;
2868 /* dummy stmt */
2869 end;
2870
2871 --Get the column values for the approved plan type and
2872 --project id combination
2873
2874 IF (p_multiple_plan_types_flag = 'Y') THEN
2875 BEGIN
2876
2877 -- Get plan_type_id of approved budget plan type
2878
2879 SELECT fin_plan_type_id
2880 INTO l_ci_aprv_plan_type_id
2881 FROM pa_proj_fp_options po
2882 WHERE
2883 po.project_id = p_project_id
2884 AND fin_plan_option_level_code = 'PLAN_TYPE'
2885 AND DECODE
2886 (p_source_version_type,
2887 'COST',po.approved_cost_plan_type_flag,
2888 'REVENUE',po.approved_rev_plan_type_flag
2889 ) = 'Y';
2890
2891 -- Fetch current working approved budget version id
2892 Pa_Fp_Control_Items_Utils.CHK_APRV_CUR_WORKING_BV_EXISTS(
2893 p_project_id => p_project_id,
2894 p_fin_plan_type_id => l_ci_aprv_plan_type_id,
2895 p_version_type => p_source_version_type,
2896 x_cur_work_bv_id => l_ci_aprv_cw_bv_id,
2897 x_return_status => l_return_status,
2898 x_msg_count => l_msg_count,
2899 x_msg_data => l_msg_data );
2900
2901 IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
2902 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
2903 END IF;
2904
2905 SELECT
2906 DECODE
2907 (p_source_version_type,
2908 'COST',po.cost_fin_plan_level_code,
2909 'REVENUE',po.revenue_fin_plan_level_code,
2910 'ALL',po.all_fin_plan_level_code
2911 ),
2912 DECODE
2913 (p_source_version_type,
2914 'COST',po.cost_resource_list_id,
2915 'REVENUE',po.revenue_resource_list_id,
2916 'ALL',po.all_resource_list_id
2917 ),
2918 DECODE
2919 (p_source_version_type,
2920 'COST',po.cost_time_phased_code,
2921 'REVENUE',po.revenue_time_phased_code,
2922 'ALL',po.all_time_phased_code
2923 )
2924 INTO
2925 l_target_plan_level_code,
2926 l_target_resource_list_id,
2927 l_target_time_phased_code
2928 FROM pa_proj_fp_options po
2929 WHERE
2930 po.project_id = p_project_id
2931 AND fin_plan_type_id = l_ci_aprv_plan_type_id
2932 AND fin_plan_version_id = l_ci_aprv_cw_bv_id;
2933 EXCEPTION
2934 WHEN NO_DATA_FOUND THEN
2935 PA_UTILS.ADD_MESSAGE
2936 ( p_app_short_name => 'PA',
2937 p_msg_name => 'PA_FP_CI_NO_PLAN_LVL_DATA_FND');
2938 x_return_status := FND_API.G_RET_STS_ERROR;
2939 END;
2940 ELSE
2941 BEGIN
2942
2943 -- Get plan_type_id of approved budget plan type
2944
2945 SELECT fin_plan_type_id
2946 INTO l_ci_aprv_plan_type_id
2947 FROM pa_proj_fp_options po
2948 WHERE
2949 po.project_id = p_project_id
2950 AND fin_plan_option_level_code = 'PLAN_TYPE'
2951 AND ( NVL(po.approved_rev_plan_type_flag,'N') = 'Y'
2952 OR NVL(po.approved_cost_plan_type_flag,'N') = 'Y' );
2953
2954 /* WHERE clause modified for bug 3043178. if there is only one
2955 approved budget plan type the WHERE clause should check for
2956 Cost or Revenue approved budget plan type. The Where clasue in
2957 the p_multiple_plan_types_flag='Y' will not work for this case. */
2958
2959 -- Fetch current working approved budget version id
2960 Pa_Fp_Control_Items_Utils.CHK_APRV_CUR_WORKING_BV_EXISTS(
2961 p_project_id => p_project_id,
2962 p_fin_plan_type_id => l_ci_aprv_plan_type_id,
2963 p_version_type => p_source_version_type,
2964 x_cur_work_bv_id => l_ci_aprv_cw_bv_id,
2965 x_return_status => l_return_status,
2966 x_msg_count => l_msg_count,
2967 x_msg_data => l_msg_data );
2968
2969 IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
2970 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
2971 END IF;
2972
2973 SELECT
2974 DECODE
2975 (p_source_version_type,
2976 'COST',po.cost_fin_plan_level_code,
2977 'REVENUE',po.revenue_fin_plan_level_code,
2978 'ALL',po.all_fin_plan_level_code
2979 ),
2980 DECODE
2981 (p_source_version_type,
2982 'COST',po.cost_resource_list_id,
2983 'REVENUE',po.revenue_resource_list_id,
2984 'ALL',po.all_resource_list_id
2985 ),
2986 DECODE
2987 (p_source_version_type,
2988 'COST',po.cost_time_phased_code,
2989 'REVENUE',po.revenue_time_phased_code,
2990 'ALL',po.all_time_phased_code
2991 )
2992 INTO
2993 l_target_plan_level_code,
2994 l_target_resource_list_id,
2995 l_target_time_phased_code
2996 FROM pa_proj_fp_options po
2997 WHERE
2998 po.project_id = p_project_id
2999 AND fin_plan_type_id = l_ci_aprv_plan_type_id
3000 AND fin_plan_version_id = l_ci_aprv_cw_bv_id;
3001
3002 EXCEPTION
3003 WHEN NO_DATA_FOUND THEN
3004 PA_UTILS.ADD_MESSAGE
3005 ( p_app_short_name => 'PA',
3006 p_msg_name => 'PA_FP_CI_NO_PLAN_LVL_DATA_FND');
3007 ----DBMS_OUTPUT.PUT_LINE('FP_CI_CHECK_COPY_POSSIBLE - 2***');
3008 x_return_status := FND_API.G_RET_STS_ERROR;
3009 END;
3010 END IF;
3011
3012 --DBMS_OUTPUT.PUT_LINE('l_target_plan_level_code : ' || l_target_plan_level_code);
3013 --DBMS_OUTPUT.PUT_LINE('p_source_plan_level_code : ' || p_source_plan_level_code);
3014 --DBMS_OUTPUT.PUT_LINE('p_source_time_phased_code : ' || p_source_time_phased_code);
3015 --DBMS_OUTPUT.PUT_LINE('l_target_time_phased_code : ' || l_target_time_phased_code);
3016 --DBMS_OUTPUT.PUT_LINE('p_source_resource_list_id : ' || p_source_resource_list_id);
3017 --DBMS_OUTPUT.PUT_LINE('l_target_resource_list_id : ' || l_target_resource_list_id);
3018 --DBMS_OUTPUT.PUT_LINE('l_time_phase_code_flag : ' || l_time_phase_code_flag);
3019 --DBMS_OUTPUT.PUT_LINE('l_token_v_type : ' || l_token_v_type);
3020 /* added for bug 2762024 */
3021 if l_baseline_funding_flag = 'Y' and
3022 p_source_version_type = 'REVENUE' then
3023 begin
3024 /* select po.revenue_fin_plan_level_code,
3025 po.revenue_time_phased_code,
3026 po.revenue_resource_list_id into
3027 l_s_bv_fp_level_code,
3028 l_s_bv_time_phased_code,
3029 l_s_bv_resource_list_id
3030 FROM pa_proj_fp_options po,
3031 pa_budget_versions bv
3032 WHERE
3033 bv.project_id = p_project_id and
3034 bv.ci_id = p_s_ci_id and
3035 bv.version_type = 'REVENUE' and
3036 po.project_id = p_project_id and
3037 po.fin_plan_option_level_code = 'PLAN_VERSION' and
3038 po.fin_plan_version_id = bv.budget_version_id and
3039 po.fin_plan_type_id = bv.fin_plan_type_id;
3040 the above select is not required as the target values
3041 can be directly copied from the source version. */
3042
3043 l_target_plan_level_code := p_source_plan_level_code;
3044 l_target_time_phased_code := p_source_time_phased_code;
3045 l_target_resource_list_id := p_source_resource_list_id;
3046 exception
3047 when no_Data_found then
3048 l_count := 0;
3049 /* dummy stmt */
3050 end;
3051 end if;
3052 /* added for bug 2762024 */
3053
3054 IF (
3055 (p_source_plan_level_code = l_target_plan_level_code AND
3056 p_source_time_phased_code = l_target_time_phased_code AND
3057 p_source_resource_list_id = l_target_resource_list_id
3058 )
3059 AND
3060 (l_time_phase_code_flag = 'Y')
3061 )THEN
3062
3063 x_copy_possible_flag := 'Y';
3064 x_return_status := FND_API.G_RET_STS_SUCCESS;
3065 x_msg_count := FND_MSG_PUB.Count_Msg;
3066 x_msg_data := NULL;
3067
3068 ELSE
3069 IF (l_time_phase_code_flag = 'N') THEN
3070 PA_UTILS.ADD_MESSAGE
3071 ( p_app_short_name => 'PA',
3072 p_msg_name => 'PA_FP_CI_C_NO_SP_TIME_PHASE'
3073 );
3074 END IF;
3075
3076 IF (p_source_plan_level_code <> l_target_plan_level_code) THEN
3077 PA_UTILS.ADD_MESSAGE
3078 ( p_app_short_name => 'PA',
3079 p_msg_name => 'PA_FP_CI_C_INV_PLAN_LVL_MATCH'
3080 );
3081 END IF;
3082 IF (p_source_time_phased_code <> l_target_time_phased_code) THEN
3083 PA_UTILS.ADD_MESSAGE
3084 ( p_app_short_name => 'PA',
3085 p_msg_name => 'PA_FP_CI_C_TIME_PHASE_DIFF'
3086 );
3087 END IF;
3088 IF (p_source_resource_list_id <> l_target_resource_list_id) THEN
3089 PA_UTILS.ADD_MESSAGE
3090 ( p_app_short_name => 'PA',
3091 p_msg_name => 'PA_FP_CI_C_RES_LIST_DIFF'
3092 );
3093 END IF;
3094 PA_UTILS.ADD_MESSAGE
3095 ( p_app_short_name => 'PA',
3096 p_msg_name => 'PA_FP_CI_NO_COPY',
3097 p_token1 => 'CI_ID',
3098 p_value1 => l_token_ci_id,
3099 p_token2 => 'CI_VERSION',
3100 p_value2 => l_token_v_type
3101 );
3102
3103 x_copy_possible_flag := 'N';
3104 x_return_status := FND_API.G_RET_STS_SUCCESS;
3105 x_msg_count := FND_MSG_PUB.Count_Msg;
3106 x_msg_data := NULL;
3107 END IF;
3108 EXCEPTION
3109 WHEN PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc THEN
3110 l_msg_count := FND_MSG_PUB.count_msg;
3111 IF l_msg_count = 1 THEN
3112 PA_INTERFACE_UTILS_PUB.get_messages
3113 (p_encoded => FND_API.G_TRUE
3114 ,p_msg_index => 1
3115 ,p_msg_count => l_msg_count
3116 ,p_msg_data => l_msg_data
3117 ,p_data => l_data
3118 ,p_msg_index_out => l_msg_index_out);
3119 x_msg_data := l_data;
3120 x_msg_count := l_msg_count;
3121 ELSE
3122 x_msg_count := l_msg_count;
3123 END IF;
3124 x_return_status := FND_API.G_RET_STS_ERROR;
3125 pa_debug.reset_err_stack;
3126 RAISE;
3127 WHEN OTHERS THEN
3128 FND_MSG_PUB.add_exc_msg
3129 ( p_pkg_name => 'Pa_Fp_Control_Items_Utils.' ||
3130 'FP_CI_CHECK_COPY_POSSIBLE'
3131 ,p_procedure_name => PA_DEBUG.G_Err_Stack);
3132 ----DBMS_OUTPUT.PUT_LINE('FP_CI_CHECK_COPY_POSSIBLE - 3');
3133 IF P_PA_DEBUG_MODE = 'Y' THEN
3134 PA_DEBUG.g_err_stage := 'Unexpected error in FP_CI_CHECK_COPY_POSSIBLE';
3135 PA_DEBUG.Log_Message(p_message => PA_DEBUG.g_err_stage);
3136 END IF;
3137 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
3138 PA_DEBUG.Reset_Curr_Function;
3139
3140 END FP_CI_CHECK_COPY_POSSIBLE;
3141
3142
3143 /*
3144 This API returns 'Y' if the financial plan
3145 copy control item api should be called otherwise
3146 returns 'N'
3147 */
3148 PROCEDURE CHECK_FP_PLAN_VERSION_EXISTS
3149 (
3150 p_project_id IN NUMBER,
3151 p_ci_id IN VARCHAR2,
3152 x_call_fp_api_flag OUT NOCOPY VARCHAR2, --File.Sql.39 bug 4440895
3153 x_return_status OUT NOCOPY VARCHAR2, --File.Sql.39 bug 4440895
3154 x_msg_count OUT NOCOPY NUMBER, --File.Sql.39 bug 4440895
3155 x_msg_data OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
3156 )
3157 IS
3158
3159 -- Local Variable Declaration
3160 l_debug_mode VARCHAR2(30);
3161 l_no_of_bv_versions NUMBER := 0;
3162
3163 BEGIN
3164 IF P_PA_DEBUG_MODE = 'Y' THEN
3165 pa_debug.init_err_stack('PAFPCIUB.CHECK_FP_PLAN_VERSION_EXISTS');
3166 END IF;
3167 fnd_profile.get('PA_DEBUG_MODE',l_debug_mode);
3168 l_debug_mode := NVL(l_debug_mode, 'Y');
3169 pa_debug.set_process('PLSQL','LOG',l_debug_mode);
3170 x_return_status := FND_API.G_RET_STS_SUCCESS;
3171 x_msg_count := 0;
3172
3173 x_call_fp_api_flag := 'N';
3174 ----DBMS_OUTPUT.PUT_LINE('CHECK_FP_PLAN_VERSION_EXISTS - 1');
3175 --Get the number of versions for this control item id
3176 --and project id
3177
3178 SELECT
3179 count(*)
3180 INTO
3181 l_no_of_bv_versions
3182 FROM pa_budget_versions bv
3183 WHERE bv.project_id = p_project_id
3184 and bv.ci_id = p_ci_id;
3185
3186 IF (l_no_of_bv_versions = 0) THEN
3187 x_call_fp_api_flag := 'N';
3188 RETURN;
3189 ELSE
3190 x_call_fp_api_flag := 'Y';
3191 RETURN;
3192 END IF;
3193 EXCEPTION
3194 WHEN OTHERS THEN
3195 FND_MSG_PUB.add_exc_msg
3196 ( p_pkg_name => 'Pa_Fp_Control_Items_Utils.' ||
3197 'CHECK_FP_PLAN_VERSION_EXISTS'
3198 ,p_procedure_name => PA_DEBUG.G_Err_Stack);
3199 ----DBMS_OUTPUT.PUT_LINE('CHECK_FP_PLAN_VERSION_EXISTS - 3');
3200 IF P_PA_DEBUG_MODE = 'Y' THEN
3201 PA_DEBUG.g_err_stage := 'Unexpected error in CHECK_FP_PLAN_VERSION_EXISTS';
3202 PA_DEBUG.Log_Message(p_message => PA_DEBUG.g_err_stage);
3203 END IF;
3204 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
3205 PA_DEBUG.Reset_Curr_Function;
3206 RAISE;
3207 END CHECK_FP_PLAN_VERSION_EXISTS;
3208 -- end of CHECK_FP_PLAN_VERSION_EXISTS
3209
3210 /* Added the following API for bug #2651851. This API is used for Review
3211 and Submit of Control Items. It takes as input Project Id and Control Item ID.
3212 While submitting the Change Order this API checks if the Financial Impact
3213 Plan version has the same Plan Settings as the Current Working Approved Budget.
3214 If the Plan settings are different, then appropriate error messages are raised. */
3215
3216 PROCEDURE Fp_Ci_Impact_Submit_Chk
3217 ( p_project_id IN pa_budget_versions.project_id%TYPE
3218 ,p_ci_id IN pa_budget_versions.ci_id%TYPE
3219 ,x_return_status OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
3220 ,x_msg_count OUT NOCOPY NUMBER --File.Sql.39 bug 4440895
3221 ,x_msg_data OUT NOCOPY VARCHAR2) --File.Sql.39 bug 4440895
3222 IS
3223
3224 CURSOR cur_ci_version_dtl IS
3225 SELECT budget_version_id
3226 ,version_type
3227 ,fin_plan_type_id
3228 FROM pa_budget_versions
3229 WHERE project_id = p_project_id AND
3230 nvl(ci_id,-1) = p_ci_id;
3231
3232 l_ci_version_id_tbl PA_PLSQL_DATATYPES.IdTabTyp;
3233 l_version_type_tbl PA_PLSQL_DATATYPES.Char30TabTyp;
3234 l_fin_plan_type_id_tbl PA_PLSQL_DATATYPES.IdTabTyp;
3235 l_fp_options_id pa_proj_fp_options.proj_fp_options_id%TYPE;
3236 l_curr_work_version_id pa_proj_fp_options.fin_plan_version_id%TYPE;
3237 l_attr_same_flag VARCHAR2(1);
3238
3239 --Added by Xin Liu. For enhancement.
3240 l_source_id_tbl SYSTEM.pa_num_tbl_type:=SYSTEM.pa_num_tbl_type();
3241
3242 l_target_version_id pa_budget_versions.budget_version_id%TYPE;
3243 l_source_version_id pa_budget_versions.budget_version_id%TYPE;
3244 --Done by Xin Liu for enhancement
3245
3246 l_msg_count NUMBER := 0;
3247 l_data VARCHAR2(2000);
3248 l_msg_data VARCHAR2(2000);
3249 l_msg_index_out NUMBER;
3250 l_return_status VARCHAR2(2000);
3251 l_no_of_ci_plan_versions NUMBER;
3252 l_module_name VARCHAR2(100) := 'pa.plsql.Pa_Fp_Control_Items_Utils';
3253 l_merge_possible_code_tbl SYSTEM.pa_varchar2_1_tbl_type:=SYSTEM.pa_varchar2_1_tbl_type();
3254
3255 BEGIN
3256 x_msg_count := 0;
3257 x_return_status := FND_API.G_RET_STS_SUCCESS;
3258 IF p_pa_debug_mode = 'Y' THEN
3259 pa_debug.set_err_stack('Pa_Fp_Control_Items_Utils.Fp_Ci_Impact_Submit_Chk');
3260 pa_debug.set_process('PLSQL','LOG',p_pa_debug_mode);
3261 END IF;
3262
3263 /* Get the details of the CI Budget Versions. */
3264 OPEN cur_ci_version_dtl;
3265 FETCH cur_ci_version_dtl BULK COLLECT INTO
3266 l_ci_version_id_tbl
3267 ,l_version_type_tbl
3268 ,l_fin_plan_type_id_tbl;
3269 CLOSE cur_ci_version_dtl;
3270
3271 IF nvl(l_ci_version_id_tbl.last,0) < 1 THEN
3272 /* If there are no budget versions for the CI, throw an error to the user. */
3273
3274 IF P_PA_DEBUG_MODE = 'Y' THEN
3275 pa_debug.g_err_stage := 'No Budget Version for the CI';
3276 pa_debug.write('Fp_Ci_Impact_Submit_Chk: ' || l_module_name,
3277 pa_debug.g_err_stage,PA_FP_CONSTANTS_PKG.G_DEBUG_LEVEL3);
3278 END IF;
3279 PA_UTILS.ADD_MESSAGE(p_app_short_name => 'PA',
3280 p_msg_name => 'PA_FP_CI_VERSION_NOT_FOUND');
3281 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
3282
3283 ELSE
3284
3285 FOR i in l_ci_version_id_tbl.first..l_ci_version_id_tbl.last
3286 LOOP
3287
3288 IF P_PA_DEBUG_MODE = 'Y' THEN
3289 pa_debug.g_err_stage := 'Fetching the Current Working Version';
3290 pa_debug.write('Fp_Ci_Impact_Submit_Chk: ' || l_module_name,
3291 pa_debug.g_err_stage,PA_FP_CONSTANTS_PKG.G_DEBUG_LEVEL3);
3292 END IF;
3293
3294 -- Bug 3809665 Check if change order versions have any budget lines with
3295 -- rejection code
3296
3297 IF 'Y' = pa_fin_plan_utils.does_bv_have_rej_lines
3298 (p_budget_version_id => l_ci_version_id_tbl(i))
3299 THEN
3300 PA_UTILS.ADD_MESSAGE(p_app_short_name => 'PA',
3301 p_msg_name => 'PA_FP_CI_REJ_LINES_EXST_TO_SUB');
3302 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
3303 END IF;
3304
3305
3306 /* For the Project, Plan Type and Version Type, get the Current Working Version. */
3307 pa_fin_plan_utils.Get_Curr_Working_Version_Info(
3308 p_project_id => p_project_id
3309 ,p_fin_plan_type_id => l_fin_plan_type_id_tbl(i)
3310 ,p_version_type => l_version_type_tbl(i)
3311 ,x_fp_options_id => l_fp_options_id
3312 ,x_fin_plan_version_id => l_curr_work_version_id
3313 ,x_return_status => l_return_status
3314 ,x_msg_count => l_msg_count
3315 ,x_msg_data => l_msg_data);
3316
3317 IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
3318 IF P_PA_DEBUG_MODE = 'Y' THEN
3319 pa_debug.g_err_stage := 'No working version found.';
3320 pa_debug.write('Fp_Ci_Impact_Submit_Chk: ' || l_module_name,
3321 pa_debug.g_err_stage,PA_FP_CONSTANTS_PKG.G_DEBUG_LEVEL3);
3322 END IF;
3323 raise PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
3324 END IF;
3325
3326 /* Compare the Plan settings of the Financial Impact and the plan settings of the
3327 current working apporved budget plan version. */
3328
3329 IF P_PA_DEBUG_MODE = 'Y' THEN
3330 pa_debug.g_err_stage := 'Comparing the Plan Settings of Versions';
3331 pa_debug.write('Fp_Ci_Impact_Submit_Chk: ' || l_module_name,
3332 pa_debug.g_err_stage,PA_FP_CONSTANTS_PKG.G_DEBUG_LEVEL3);
3333 END IF;
3334
3335 --Added by Xin Liu. For enhancement.
3336
3337 l_source_version_id := l_ci_version_id_tbl(i);
3338 l_source_id_tbl.DELETE;
3339 l_source_id_tbl:= SYSTEM.pa_num_tbl_type();
3340 l_source_id_tbl.extend(1);
3341 l_source_id_tbl(1) := l_source_version_id;
3342 l_target_version_id := l_curr_work_version_id;
3343
3344 Pa_Fp_Control_Items_Utils.FP_CI_CHECK_MERGE_POSSIBLE(
3345 p_project_id => p_project_id,
3346 p_source_fp_version_id_tbl => l_source_id_tbl,
3347 p_target_fp_version_id => l_target_version_id,
3348 p_calling_mode => 'SUBMIT',
3349 x_merge_possible_code_tbl => l_merge_possible_code_tbl,
3350 x_return_status => l_return_status,
3351 x_msg_count => x_msg_count,
3352 x_msg_data => x_msg_data
3353 );
3354
3355 IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
3356 x_return_status := l_return_status ;
3357 END IF; -- l_return_status <> FND_API.G_RET_STS_SUCCESS
3358
3359 END LOOP;
3360
3361 END IF; -- nvl(l_ci_version_id_tbl.last,0) < 1
3362
3363 IF p_pa_debug_mode = 'Y' THEN
3364 pa_debug.g_err_stage:= 'Exiting Fp_Ci_Impact_Submit_Chk';
3365 pa_debug.write('Fp_Ci_Impact_Submit_Chk: ' ||l_module_name,pa_debug.g_err_stage,
3366 PA_FP_CONSTANTS_PKG.G_DEBUG_LEVEL3);
3367 pa_debug.reset_err_stack;
3368 END IF;
3369
3370 EXCEPTION
3371 WHEN PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc THEN
3372 x_return_status := FND_API.G_RET_STS_ERROR;
3373 l_msg_count := FND_MSG_PUB.count_msg;
3374 IF l_msg_count = 1 THEN
3375 PA_INTERFACE_UTILS_PUB.get_messages
3376 (p_encoded => FND_API.G_TRUE
3377 ,p_msg_index => 1
3378 ,p_msg_count => l_msg_count
3379 ,p_msg_data => l_msg_data
3380 ,p_data => l_data
3381 ,p_msg_index_out => l_msg_index_out);
3382 x_msg_data := l_data;
3383 x_msg_count := l_msg_count;
3384 ELSE
3385 x_msg_count := l_msg_count;
3386 END IF;
3387 IF p_pa_debug_mode = 'Y' THEN
3388 pa_debug.reset_err_stack;
3389 END IF;
3390 /* #2723909: Returning to the calling procedure instead of raising it,
3391 so that the calling procedure checks for the return status of this procedure
3392 and handles it appropriately. */
3393 RETURN;
3394 WHEN OTHERS THEN
3395 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
3396 x_msg_count := 1;
3397 x_msg_data := SQLERRM;
3398 FND_MSG_PUB.add_exc_msg
3399 ( p_pkg_name => 'Pa_Fp_Control_Items_Utils'
3400 ,p_procedure_name => 'Fp_Ci_Impact_Submit_Chk'
3401 ,p_error_text => x_msg_data);
3402
3403 IF p_pa_debug_mode = 'Y' THEN
3404 pa_debug.g_err_stage:= 'Unexpected Error'||x_msg_data;
3405 pa_debug.write('Fp_Ci_Impact_Submit_Chk: ' ||l_module_name,pa_debug.g_err_stage,
3406 PA_FP_CONSTANTS_PKG.G_DEBUG_LEVEL5);
3407 pa_debug.reset_err_stack;
3408 END IF;
3409 RAISE;
3410 END Fp_Ci_Impact_Submit_Chk;
3411
3412 /*==================================================================
3413 This api Identifies whether the impact can be updated to implemented
3414 or not. Included for bug 2681589.
3415 ==================================================================*/
3416 --Bug 3550073. Included x_upd_cost_impact_allowed and x_upd_rev_impact_allowed
3417 PROCEDURE FP_CI_VALIDATE_UPDATE_IMPACT
3418 (
3419 p_project_id IN pa_budget_versions.project_id%TYPE,
3420 p_ci_id IN pa_control_items.ci_id%TYPE,
3421 p_source_version_id IN pa_budget_versions.budget_version_id%TYPE,
3422 p_target_version_id IN pa_budget_versions.budget_version_id%TYPE,
3423 x_upd_cost_impact_allowed OUT NOCOPY VARCHAR2, --File.Sql.39 bug 4440895
3424 x_upd_rev_impact_allowed OUT NOCOPY VARCHAR2, --File.Sql.39 bug 4440895
3425 x_msg_data OUT NOCOPY VARCHAR2, --File.Sql.39 bug 4440895
3426 x_msg_count OUT NOCOPY NUMBER, --File.Sql.39 bug 4440895
3427 x_return_status OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
3428 )
3429 AS
3430
3431 l_msg_count NUMBER := 0;
3432 l_data VARCHAR2(2000);
3433 l_msg_data VARCHAR2(2000);
3434 l_msg_index_out NUMBER;
3435 l_debug_mode VARCHAR2(1);
3436
3437 l_approved_cost_flag pa_budget_versions.approved_cost_plan_type_flag%TYPE;
3438 l_approved_rev_flag pa_budget_versions.approved_rev_plan_type_flag%TYPE;
3439 l_ci_id pa_budget_versions.ci_id%TYPE;
3440 l_second_bv_id pa_budget_versions.budget_version_id%TYPE;
3441
3442 l_count NUMBER := 0;
3443 l_merged_count NUMBER := 0;
3444 l_module_name VARCHAR2(100) := 'pa.plsql.Pa_Fp_Control_Items_Utils';
3445
3446 CURSOR c_upd_impact_val_csr
3447 (c_ci_id pa_control_items.ci_id%TYPE,
3448 c_version_type pa_fp_merged_ctrl_items.version_type%TYPE)
3449 IS
3450 SELECT 'Y'
3451 FROM pa_fp_merged_ctrl_items
3452 WHERE ci_id =c_ci_id
3453 AND project_id=p_project_id
3454 AND plan_version_id=p_target_version_id
3455 AND ci_plan_version_id=NVL(p_source_version_id,ci_plan_version_id)
3456 AND version_type=c_version_type;
3457
3458 BEGIN
3459
3460 x_msg_count := 0;
3461 x_return_status := FND_API.G_RET_STS_SUCCESS;
3462 l_debug_mode := NVL(FND_PROFILE.value('PA_DEBUG_MODE'),'N');
3463 IF l_debug_mode = 'Y' THEN
3464 pa_debug.set_err_stack('Pa_Fp_Control_Items_Utils.FP_CI_VALIDATE_UPDATE_IMPACT');
3465 pa_debug.set_process('PLSQL','LOG',l_debug_mode);
3466 END IF;
3467
3468 -- Check for business rules violations
3469
3470 IF l_debug_mode = 'Y' THEN
3471 pa_debug.g_err_stage:= 'Validating input parameters';
3472 pa_debug.write(l_module_name,pa_debug.g_err_stage,
3473 PA_FP_CONSTANTS_PKG.G_DEBUG_LEVEL3);
3474 END IF;
3475
3476 IF (p_project_id IS NULL) OR (p_ci_id IS NULL AND p_source_version_id IS NULL)
3477 OR (p_target_version_id is NULL)
3478 THEN
3479 IF l_debug_mode = 'Y' THEN
3480 pa_debug.g_err_stage:= 'p_project_id = '|| to_char(p_project_id);
3481 pa_debug.write(l_module_name,pa_debug.g_err_stage,
3482 PA_FP_CONSTANTS_PKG.G_DEBUG_LEVEL5);
3483 pa_debug.g_err_stage:= 'p_source_version_id = '|| to_char(p_source_version_id);
3484 pa_debug.write(l_module_name,pa_debug.g_err_stage,
3485 PA_FP_CONSTANTS_PKG.G_DEBUG_LEVEL5);
3486 pa_debug.g_err_stage:= 'p_target_version_id = '|| to_char(p_target_version_id);
3487 pa_debug.write(l_module_name,pa_debug.g_err_stage,
3488 PA_FP_CONSTANTS_PKG.G_DEBUG_LEVEL5);
3489 pa_debug.g_err_stage:= 'p_ci_id = '|| to_char(p_ci_id);
3490 pa_debug.write(l_module_name,pa_debug.g_err_stage,PA_FP_CONSTANTS_PKG.G_DEBUG_LEVEL5);
3491 END IF;
3492 PA_UTILS.ADD_MESSAGE
3493 (p_app_short_name => 'PA',
3494 p_msg_name => 'PA_FP_INV_PARAM_PASSED');
3495 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
3496
3497 END IF;
3498
3499 SELECT NVL(approved_cost_plan_type_flag,'N'),
3500 NVL(approved_rev_plan_type_flag,'N')
3501 INTO
3502 l_approved_cost_flag,
3503 l_approved_rev_flag
3504 FROM pa_budget_versions
3505 WHERE budget_version_id = p_target_version_id
3506 AND project_id = p_project_id;
3507
3508 x_upd_cost_impact_allowed:='N';
3509 x_upd_rev_impact_allowed:='N';
3510
3511 IF(l_approved_cost_flag = 'Y' OR l_approved_rev_flag = 'Y') THEN
3512 IF p_ci_id IS NULL THEN
3513 SELECT ci_id
3514 INTO l_ci_id
3515 FROM pa_budget_versions
3516 WHERE budget_version_id = p_source_version_id
3517 AND project_id = p_project_id;
3518 ELSE
3519 l_ci_id:=p_ci_id;
3520 END IF;
3521
3522 IF l_approved_cost_flag = 'Y' THEN
3523
3524 OPEN c_upd_impact_val_csr(l_ci_id,'COST');
3525 FETCH c_upd_impact_val_csr INTO x_upd_cost_impact_allowed;
3526 IF c_upd_impact_val_csr%NOTFOUND THEN
3527
3528 x_upd_cost_impact_allowed:='N';
3529
3530 END IF;
3531 CLOSE c_upd_impact_val_csr;
3532
3533 END IF;
3534
3535 IF l_approved_rev_flag = 'Y' THEN
3536
3537 OPEN c_upd_impact_val_csr(l_ci_id,'REVENUE');
3538 FETCH c_upd_impact_val_csr INTO x_upd_rev_impact_allowed;
3539 IF c_upd_impact_val_csr%NOTFOUND THEN
3540
3541 x_upd_rev_impact_allowed:='N';
3542
3543 END IF;
3544 CLOSE c_upd_impact_val_csr;
3545
3546 END IF;
3547
3548 END IF; --end if for approved revenue and cost flag check
3549
3550
3551 IF l_debug_mode = 'Y' THEN
3552 pa_debug.g_err_stage:= 'x_upd_cost_impact_allowed is '||x_upd_cost_impact_allowed
3553 ||'x_upd_rev_impact_allowed is '||x_upd_rev_impact_allowed;
3554 pa_debug.write(l_module_name,pa_debug.g_err_stage,
3555 PA_FP_CONSTANTS_PKG.G_DEBUG_LEVEL3);
3556 pa_debug.g_err_stage:= 'Exiting FP_CI_VALIDATE_UPDATE_IMPACT';
3557 pa_debug.write(l_module_name,pa_debug.g_err_stage,
3558 PA_FP_CONSTANTS_PKG.G_DEBUG_LEVEL3);
3559 pa_debug.reset_err_stack;
3560
3561 END IF;
3562
3563 EXCEPTION
3564
3565 WHEN PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc THEN
3566
3567 x_return_status := FND_API.G_RET_STS_ERROR;
3568 l_msg_count := FND_MSG_PUB.count_msg;
3569
3570 IF l_msg_count = 1 and x_msg_data IS NULL THEN
3571 PA_INTERFACE_UTILS_PUB.get_messages
3572 (p_encoded => FND_API.G_TRUE
3573 ,p_msg_index => 1
3574 ,p_msg_count => l_msg_count
3575 ,p_msg_data => l_msg_data
3576 ,p_data => l_data
3577 ,p_msg_index_out => l_msg_index_out);
3578 x_msg_data := l_data;
3579 x_msg_count := l_msg_count;
3580 ELSE
3581 x_msg_count := l_msg_count;
3582 END IF;
3583 IF l_debug_mode = 'Y' THEN
3584 pa_debug.reset_err_stack;
3585 END IF;
3586 RAISE;
3587
3588 WHEN others THEN
3589
3590 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
3591 x_msg_count := 1;
3592 x_msg_data := SQLERRM;
3593
3594 FND_MSG_PUB.add_exc_msg
3595 ( p_pkg_name => 'Pa_Fp_Control_Items_Utils'
3596 ,p_procedure_name => 'FP_CI_VALIDATE_UPDATE_IMPACT'
3597 ,p_error_text => x_msg_data);
3598
3599 IF l_debug_mode = 'Y' THEN
3600 pa_debug.g_err_stage:= 'Unexpected Error'||x_msg_data;
3601 pa_debug.write(l_module_name,pa_debug.g_err_stage,
3602 PA_FP_CONSTANTS_PKG.G_DEBUG_LEVEL5);
3603 pa_debug.reset_err_stack;
3604
3605 END IF;
3606 RAISE;
3607
3608 END FP_CI_VALIDATE_UPDATE_IMPACT;
3609
3610 procedure chk_res_resgrp_mismatch(
3611 p_project_id in number,
3612 p_s_budget_version_id IN pa_budget_versions.budget_version_id%TYPE,
3613 p_s_fin_plan_level_code IN pa_proj_fp_options.all_fin_plan_level_code%TYPE,
3614 p_t_budget_version_id IN pa_budget_versions.budget_version_id%TYPE,
3615 p_t_fin_plan_level_code IN pa_proj_fp_options.all_fin_plan_level_code%TYPE,
3616 p_calling_mode in varchar2,
3617 x_res_resgr_mismatch_flag OUT NOCOPY varchar2, --File.Sql.39 bug 4440895
3618 x_msg_data OUT NOCOPY VARCHAR2, --File.Sql.39 bug 4440895
3619 x_msg_count OUT NOCOPY NUMBER, --File.Sql.39 bug 4440895
3620 x_return_status OUT NOCOPY VARCHAR2 ) IS --File.Sql.39 bug 4440895
3621 l_count number;
3622 cursor c1(c_fp_opt_id number,
3623 c_ver_type varchar2) is
3624 select fpe.task_id,
3625 fpe.top_task_id,
3626 t.task_name task_name,
3627 t.task_number task_number,
3628 fpe.resource_planning_level,
3629 PA_PROJ_ELEMENTS_UTILS.GET_DISPLAY_SEQUENCE(fpe.task_id)
3630 seq_no,
3631 nvl(fpe.top_task_planning_level,'LOWEST')
3632 top_task_planning_level
3633 from
3634 pa_fp_elements fpe,
3635 pa_tasks t where
3636 fpe.proj_fp_options_id = c_fp_opt_id and
3637 fpe.element_type = c_ver_type and
3638 fpe.task_id = t.task_id and
3639 fpe.resource_list_member_id = 0 and
3640 fpe.plannable_flag = 'Y'
3641 order by seq_no;
3642 /* nvl(fpe.plan_amount_exists_flag,'N') = 'Y'
3643 the merge api does not support this check right now */
3644
3645 l_source_plan_level varchar2(1);
3646 l_target_plan_level varchar2(1);
3647 l_error_msg_header_flag varchar2(1);
3648 l_message_code varchar2(100);
3649 l_target_task_id number;
3650 l_target_task_name pa_tasks.TASK_NAME%type;
3651 l_target_task_number pa_tasks.TASK_NUMBER%type;
3652 l_prj_rlm_id NUMBER;
3653 l_prj_rlm_id_target NUMBER;
3654 l_target_prj_plan_level varchar2(1);
3655 l_source_fp_opt_id NUMBER;
3656 l_target_fp_opt_id NUMBER;
3657 l_source_ver_type pa_budget_versions.version_type%type;
3658 l_target_ver_type pa_budget_versions.version_type%type;
3659 l_top_task_plan_level pa_fp_elements.top_task_planning_level%type;
3660 BEGIN
3661 l_count := 0;
3662 x_msg_count := 0;
3663 l_error_msg_header_flag := 'N';
3664 x_res_resgr_mismatch_flag := 'N';
3665 x_return_status := FND_API.G_RET_STS_SUCCESS;
3666
3667 select o.proj_fp_options_id,
3668 bv.version_type into
3669 l_source_fp_opt_id,
3670 l_source_ver_type
3671 from pa_proj_fp_options o,
3672 pa_budget_versions bv
3673 where
3674 bv.budget_version_id = p_s_budget_version_id and
3675 bv.fin_plan_type_id = o.fin_plan_type_id and
3676 o.project_id = p_project_id and
3677 o.fin_plan_version_id = bv.budget_version_id;
3678
3679
3680 select o.proj_fp_options_id ,
3681 bv.version_type into
3682 l_target_fp_opt_id,
3683 l_target_ver_type
3684 from pa_proj_fp_options o,
3685 pa_budget_versions bv
3686 where
3687 bv.budget_version_id = p_t_budget_version_id and
3688 bv.fin_plan_type_id = o.fin_plan_type_id and
3689 o.project_id = p_project_id and
3690 o.fin_plan_version_id = bv.budget_version_id;
3691
3692 /*
3693 Resource planning level source Resource planning level target Merge
3694 Possible
3695 ==========================================================================
3696 Resource Resource Yes
3697 Resource Group Resource Group Yes
3698 Resource Resource Group Yes
3699 Resource Group Resource No
3700 ==========================================================================
3701 */
3702 /* checking for if source and target versions are planning at the
3703 project level */
3704
3705 if p_s_fin_plan_level_code = 'P' and
3706 p_t_fin_plan_level_code = 'P' then
3707 l_source_plan_level := 'R';
3708 l_target_plan_level := 'R';
3709 l_prj_rlm_id := null;
3710 begin
3711 select ra.resource_list_member_id into l_prj_rlm_id from
3712 pa_resource_assignments ra
3713 where
3714 ra.budget_version_id = p_s_budget_version_id and
3715 nvl(ra.resource_assignment_type,'USER_ENTERED') =
3716 'USER_ENTERED' and
3717 rownum < 2;
3718 exception
3719 when no_data_found then
3720 l_prj_rlm_id := null;
3721 end;
3722 if nvl(l_prj_rlm_id,0) > 0 then
3723 select decode(parent_member_id,null,'G','R') into
3724 l_source_plan_level from pa_resource_list_members
3725 where resource_list_member_id = l_prj_rlm_id;
3726 end if;
3727 /* checking for target */
3728 l_prj_rlm_id := null;
3729 begin
3730 select ra.resource_list_member_id into l_prj_rlm_id from
3731 pa_resource_assignments ra
3732 where
3733 ra.budget_version_id = p_t_budget_version_id and
3734 nvl(ra.resource_assignment_type,'USER_ENTERED') =
3735 'USER_ENTERED' and
3736 rownum < 2;
3737 exception
3738 when no_data_found then
3739 l_prj_rlm_id := null;
3740 end;
3741 if nvl(l_prj_rlm_id,0) > 0 then
3742 select decode(parent_member_id,null,'G','R') into
3743 l_target_plan_level from pa_resource_list_members
3744 where resource_list_member_id = l_prj_rlm_id;
3745 end if;
3746 if l_source_plan_level = 'G' and
3747 l_target_plan_level = 'R' then
3748 x_return_status := FND_API.G_RET_STS_ERROR;
3749
3750 if p_calling_mode = 'INCLUDE_CR_TO_CO' then
3751 l_message_code := 'PA_FP_CI_C_INVP_RES_TO_RES_GRP';
3752 elsif p_calling_mode = 'INCLUDE' then
3753 l_message_code := 'PA_FP_CI_INVP_RES_TO_RES_GRP';
3754 elsif p_calling_mode = 'IMPLEMENT' then
3755 l_message_code := 'PA_FP_CIM_INVP_RES_TO_RES_GRP';
3756 elsif p_calling_mode = 'SUBMIT' then
3757 l_message_code := 'PA_FP_CIS_INVP_RES_TO_RES_GRP';
3758 end if;
3759 PA_UTILS.ADD_MESSAGE
3760 ( p_app_short_name => 'PA',
3761 p_msg_name => l_message_code );
3762
3763 elsif l_source_plan_level = 'R' AND
3764 l_target_plan_level = 'G' THEN
3765 x_res_resgr_mismatch_flag := 'Y';
3766 end if;
3767 RETURN;
3768 end if;
3769
3770 /* the following logic takes care of the check source version is
3771 any planning level other than project and target is any
3772 planning level. */
3773 l_target_prj_plan_level := NULL;
3774
3775 if p_t_fin_plan_level_code = 'P' then
3776 l_prj_rlm_id := null;
3777 begin
3778 select ra.resource_list_member_id into l_prj_rlm_id from
3779 pa_resource_assignments ra
3780 where
3781 ra.budget_version_id = p_t_budget_version_id and
3782 nvl(ra.resource_assignment_type,'USER_ENTERED') =
3783 'USER_ENTERED' and
3784 rownum < 2;
3785 exception
3786 when no_data_found then
3787 l_prj_rlm_id := null;
3788 end;
3789 if nvl(l_prj_rlm_id,0) > 0 then
3790 select decode(parent_member_id,null,'G','R') into
3791 l_target_prj_plan_level from pa_resource_list_members
3792 where resource_list_member_id = l_prj_rlm_id;
3793 end if;
3794 end if;
3795
3796 for c1_rec in c1(l_source_fp_opt_id,
3797 l_source_ver_type ) loop
3798 l_target_task_id := 0;
3799 if p_t_fin_plan_level_code = 'L' THEN
3800 l_target_task_id := c1_rec.task_id; /* Bug 2757823 - For this case the p_t_fin_plan_level_code can only be L */
3801 elsif p_t_fin_plan_level_code = 'T' THEN
3802 l_target_task_id := c1_rec.top_task_id;
3803 elsif p_t_fin_plan_level_code = 'P' THEN
3804 l_target_task_id := 0;
3805 /* bug 2672708 fix starts */
3806 elsif p_t_fin_plan_level_code = 'M' THEN
3807 if c1_rec.top_task_planning_level = 'TOP' then
3808 l_target_task_id := c1_rec.top_task_id;
3809 elsif c1_rec.top_task_planning_level = 'LOWEST' and
3810 c1_rec.task_id = c1_rec.top_task_id then
3811 /* this case occurs if the node is a top task and it
3812 does not have any child tasks */
3813 l_target_task_id := c1_rec.top_task_id;
3814 elsif c1_rec.top_task_planning_level = 'LOWEST' and
3815 c1_rec.task_id <> c1_rec.top_task_id then
3816 begin
3817 select nvl(fpe.top_task_planning_level,'LOWEST')
3818 into l_top_task_plan_level
3819 from pa_fp_elements fpe
3820 where
3821 fpe.proj_fp_options_id = l_target_fp_opt_id and
3822 fpe.element_type = l_target_ver_type and
3823 fpe.task_id = c1_rec.task_id and
3824 fpe.resource_list_member_id = 0 and
3825 fpe.plannable_flag = 'Y';
3826 l_target_task_id := c1_rec.task_id;
3827 exception
3828 when no_data_found then
3829 /* checking for whether the top task is planned in the
3830 target */
3831 begin
3832 select nvl(fpe.top_task_planning_level,'LOWEST')
3833 into l_top_task_plan_level
3834 from pa_fp_elements fpe
3835 where
3836 fpe.proj_fp_options_id = l_target_fp_opt_id and
3837 fpe.element_type = l_target_ver_type and
3838 fpe.task_id = c1_rec.top_task_id and
3839 fpe.resource_list_member_id = 0 and
3840 fpe.plannable_flag = 'Y';
3841 l_target_task_id := c1_rec.top_task_id;
3842 exception
3843 when no_data_found then
3844 l_target_task_id := c1_rec.task_id;
3845 end;
3846 end;
3847 /* bug 2672708 fix starts */
3848 end if;
3849 end if;
3850 l_source_plan_level := 'R';
3851 l_target_plan_level := 'R';
3852
3853 l_target_task_name := NULL;
3854 l_target_task_number := NULL;
3855
3856 if l_target_task_id > 0 then
3857 begin
3858 select task_name,task_number into
3859 l_target_task_name,
3860 l_target_task_number
3861 from pa_Tasks where task_id = l_target_task_id;
3862 exception
3863 when no_data_found then
3864 l_target_task_name := NULL;
3865 l_target_task_number := NULL;
3866 end;
3867
3868 end if;
3869
3870 l_source_plan_level := c1_rec.resource_planning_level;
3871
3872
3873 /* Bug 2757823 - Res grp mismatch should be done for the following cases also
3874 1. when source plan level is L and target plan level is L
3875 1. when source plan level is T and target plan level is T */
3876 /* bug 2672708 source M and target M check added */
3877
3878 if ( p_s_fin_plan_level_code = 'L' and p_t_fin_plan_level_code = 'T' ) OR
3879 ( p_s_fin_plan_level_code = 'M' and p_t_fin_plan_level_code = 'T' ) OR
3880 ( p_s_fin_plan_level_code = 'M' and p_t_fin_plan_level_code = 'L' ) OR
3881 ( p_s_fin_plan_level_code = 'L' and p_t_fin_plan_level_code = 'L' ) OR
3882 ( p_s_fin_plan_level_code = 'M' and p_t_fin_plan_level_code = 'M' ) OR
3883 ( p_s_fin_plan_level_code = 'L' and p_t_fin_plan_level_code = 'M' ) OR
3884 ( p_s_fin_plan_level_code = 'T' and p_t_fin_plan_level_code = 'M' ) OR
3885 ( p_s_fin_plan_level_code = 'T' and p_t_fin_plan_level_code = 'T' ) then
3886 begin
3887 select resource_planning_level into l_target_plan_level
3888 from pa_fp_elements
3889 where proj_fp_options_id = l_target_fp_opt_id
3890 and element_type = l_target_ver_type
3891 and resource_list_member_id = 0
3892 and plannable_flag = 'Y'
3893 and task_id = l_target_task_id;
3894 exception
3895 when no_Data_found then
3896 l_target_plan_level := l_source_plan_level;
3897 end;
3898 elsif p_t_fin_plan_level_code = 'P' then
3899 l_target_plan_level := l_target_prj_plan_level;
3900 end if;
3901 if l_target_plan_level is null then
3902 l_target_plan_level := l_source_plan_level;
3903 end if;
3904
3905 if l_source_plan_level = 'G' AND
3906 l_target_plan_level = 'R' THEN
3907 x_return_status := FND_API.G_RET_STS_ERROR;
3908 if l_error_msg_header_flag = 'N' then
3909 x_res_resgr_mismatch_flag := 'Y';
3910 l_error_msg_header_flag := 'Y';
3911 if
3912 ( p_s_fin_plan_level_code = 'L' and p_t_fin_plan_level_code = 'L' ) OR
3913 ( p_s_fin_plan_level_code = 'T' and p_t_fin_plan_level_code = 'T' ) OR
3914 ( p_s_fin_plan_level_code = 'M' and p_t_fin_plan_level_code = 'M' ) OR
3915 ( p_s_fin_plan_level_code = 'L' and p_t_fin_plan_level_code = 'M' ) OR
3916 ( p_s_fin_plan_level_code = 'T' and p_t_fin_plan_level_code = 'M' ) OR
3917 ( p_s_fin_plan_level_code = 'M' and p_t_fin_plan_level_code = 'L' ) OR
3918 ( p_s_fin_plan_level_code = 'M' and p_t_fin_plan_level_code = 'T' ) OR
3919 ( p_s_fin_plan_level_code in ( 'T','L','M') and p_t_fin_plan_level_code = 'P' ) THEN
3920 if p_calling_mode = 'INCLUDE_CR_TO_CO' then
3921 l_message_code := 'PA_FP_CI_C_INV_RES_TO_RES_GRP';
3922 elsif p_calling_mode = 'INCLUDE' then
3923 l_message_code := 'PA_FP_CI_INV_RES_TO_RES_GRP';
3924 elsif p_calling_mode = 'IMPLEMENT' then
3925 l_message_code := 'PA_FP_CIM_INV_RES_TO_RES_GRP';
3926 elsif p_calling_mode = 'SUBMIT' then
3927 l_message_code := 'PA_FP_CIS_INV_RES_TO_RES_GRP';
3928 end if;
3929 PA_UTILS.ADD_MESSAGE
3930 ( p_app_short_name => 'PA',
3931 p_msg_name => l_message_code );
3932
3933 elsif p_s_fin_plan_level_code <> 'P' and p_t_fin_plan_level_code <> 'P' then
3934 /* same as above, copied just for readability */
3935 if p_calling_mode = 'INCLUDE_CR_TO_CO' then
3936 l_message_code := 'PA_FP_CI_C_INV_RES_TO_RES_GRP';
3937 elsif p_calling_mode = 'INCLUDE' then
3938 l_message_code := 'PA_FP_CI_INV_RES_TO_RES_GRP';
3939 elsif p_calling_mode = 'IMPLEMENT' then
3940 l_message_code := 'PA_FP_CIM_INV_RES_TO_RES_GRP';
3941 end if;
3942 PA_UTILS.ADD_MESSAGE
3943 ( p_app_short_name => 'PA',
3944 p_msg_name => l_message_code );
3945 end if;
3946 end if;
3947 /* end if error msg header */
3948 if
3949 ( p_s_fin_plan_level_code = 'L' and p_t_fin_plan_level_code = 'L' ) OR
3950 ( p_s_fin_plan_level_code = 'T' and p_t_fin_plan_level_code = 'T' ) OR
3951 ( p_s_fin_plan_level_code in ( 'T','L','M') and p_t_fin_plan_level_code = 'P' ) THEN
3952 PA_UTILS.ADD_MESSAGE
3953 ( p_app_short_name => 'PA',
3954 p_msg_name => 'PA_FP_CI_INV_S_TASK_DATA',
3955 p_token1 => 'TASK_NAME',
3956 p_value1 => c1_rec.task_name,
3957 p_token2 => 'TASK_NO',
3958 p_value2 => c1_rec.task_number );
3959
3960 elsif p_s_fin_plan_level_code <> 'P' and p_t_fin_plan_level_code <> 'P' then
3961 IF c1_rec.task_id = l_target_task_id THEN
3962 PA_UTILS.ADD_MESSAGE
3963 ( p_app_short_name => 'PA',
3964 p_msg_name => 'PA_FP_CI_INV_S_TASK_DATA',
3965 p_token1 => 'TASK_NAME',
3966 p_value1 => c1_rec.task_name,
3967 p_token2 => 'TASK_NO',
3968 p_value2 => c1_rec.task_number );
3969 ELSE
3970 PA_UTILS.ADD_MESSAGE
3971 ( p_app_short_name => 'PA',
3972 p_msg_name => 'PA_FP_CI_INV_ST_TASK_DATA',
3973 p_token1 => 'S_TASK_NAME',
3974 p_value1 => c1_rec.task_name,
3975 p_token2 => 'S_TASK_NO',
3976 p_value2 => c1_rec.task_number,
3977 p_token3 => 'T_TASK_NAME',
3978 p_value3 => l_target_task_name,
3979 p_token4 => 'T_TASK_NO',
3980 p_value4 => l_target_task_number );
3981 END IF;
3982 end if;
3983 /* end if for populating the acutal error msg */
3984 elsif l_source_plan_level = 'R' AND
3985 l_target_plan_level = 'G' THEN
3986 x_res_resgr_mismatch_flag := 'Y';
3987 END IF;
3988
3989 end loop;
3990
3991 EXCEPTION
3992 WHEN OTHERS THEN
3993
3994 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
3995 fnd_msg_pub.add_exc_msg(p_pkg_name => 'Pa_Fp_Control_Items_Utils',
3996 p_procedure_name => 'chk_res_resgrp_mismatch',
3997 p_error_text => SUBSTRB(SQLERRM,1,240));
3998 fnd_msg_pub.count_and_get(p_count => x_msg_count,
3999 p_data => x_msg_data);
4000
4001 END chk_res_resgrp_mismatch;
4002
4003 procedure chk_tsk_plan_level_mismatch(
4004 p_project_id in number,
4005 p_s_budget_version_id IN pa_budget_versions.budget_version_id%TYPE,
4006 p_t_budget_version_id IN pa_budget_versions.budget_version_id%TYPE,
4007 p_calling_mode in varchar2,
4008 x_tsk_plan_level_mismatch OUT NOCOPY varchar2, --File.Sql.39 bug 4440895
4009 x_s_task_id_tbl OUT NOCOPY PA_PLSQL_DATATYPES.IdTabTyp,
4010 x_t_task_id_tbl OUT NOCOPY PA_PLSQL_DATATYPES.IdTabTyp,
4011 x_s_fin_plan_level_tbl OUT NOCOPY PA_PLSQL_DATATYPES.Char30TabTyp,
4012 x_t_fin_plan_level_tbl OUT NOCOPY PA_PLSQL_DATATYPES.Char30TabTyp,
4013 x_msg_data OUT NOCOPY VARCHAR2, --File.Sql.39 bug 4440895
4014 x_msg_count OUT NOCOPY NUMBER, --File.Sql.39 bug 4440895
4015 x_return_status OUT NOCOPY VARCHAR2 ) IS --File.Sql.39 bug 4440895
4016 l_count number;
4017 l_error_msg_header_flag VARCHAR2(1);
4018 cursor c1(c_fp_opt_id number,
4019 c_ver_type varchar2) is
4020 select fpe.task_id task_id,
4021 fpe.top_task_id top_task_id,
4022 t.task_name task_name,
4023 t.task_number task_number,
4024 fpe.resource_planning_level resource_planning_level,
4025 PA_PROJ_ELEMENTS_UTILS.GET_DISPLAY_SEQUENCE(fpe.task_id)
4026 seq_no,
4027 NVL(fpe.top_task_planning_level,'LOWEST')
4028 top_task_planning_level
4029 from
4030 pa_fp_elements fpe,
4031 pa_tasks t where
4032 fpe.proj_fp_options_id = c_fp_opt_id and
4033 fpe.element_type = c_ver_type and
4034 fpe.task_id = t.task_id and
4035 fpe.resource_list_member_id = 0 and
4036 fpe.plannable_flag = 'Y'
4037 order by seq_no;
4038 /* the merge api does not support this check right now.
4039 nvl(fpe.plan_amount_exists_flag,'N') = 'Y' */
4040 /* the merge api needs all the distinct task
4041 combination to be processed,so the following check
4042 has been removed from the cursor
4043 NVL(fpe.top_task_planning_level,'LOWEST') = 'TOP' */
4044 l_message_code varchar2(100);
4045 l_target_task_id number;
4046 l_target_task_name pa_tasks.TASK_NAME%type;
4047 l_target_task_number pa_tasks.TASK_NUMBER%type;
4048 l_prj_rlm_id NUMBER;
4049 l_prj_rlm_id_target NUMBER;
4050 l_target_prj_plan_level varchar2(1);
4051 l_source_fp_opt_id NUMBER;
4052 l_target_fp_opt_id NUMBER;
4053 l_source_ver_type pa_budget_versions.version_type%type;
4054 l_target_ver_type pa_budget_versions.version_type%type;
4055 l_top_task_plan_level pa_fp_elements.top_task_planning_level%type;
4056 l_source_task_id number;
4057 l_source_plan_level varchar2(30);
4058 l_target_plan_level varchar2(30);
4059 l_index number;
4060 l_task_exists_Flag varchar2(1);
4061 BEGIN
4062 l_count := 0;
4063 x_msg_count := 0;
4064 l_error_msg_header_flag := 'N';
4065 x_tsk_plan_level_mismatch := 'N';
4066 l_index := 1;
4067 x_return_status := FND_API.G_RET_STS_SUCCESS;
4068 IF P_PA_DEBUG_MODE = 'Y' THEN
4069 PA_DEBUG.init_err_stack('PA_FP_CI_IMPLEMENT_PKG.implement_change_order');
4070 END IF;
4071
4072 IF p_pa_debug_mode = 'Y' THEN
4073 PA_DEBUG.write_log (x_module =>
4074 'pa.plsql.Pa_Fp_Control_Items_Utils.chk_tsk_plan_level_mismatch'
4075 ,x_msg => 'selecting source version fp option details'
4076 ,x_log_level => 5);
4077 END IF;
4078
4079 select o.proj_fp_options_id,
4080 bv.version_type into
4081 l_source_fp_opt_id,
4082 l_source_ver_type
4083 from pa_proj_fp_options o,
4084 pa_budget_versions bv
4085 where
4086 bv.budget_version_id = p_s_budget_version_id and
4087 bv.fin_plan_type_id = o.fin_plan_type_id and
4088 o.project_id = p_project_id and
4089 o.fin_plan_version_id = bv.budget_version_id;
4090
4091 IF p_pa_debug_mode = 'Y' THEN
4092 PA_DEBUG.write_log (x_module =>
4093 'pa.plsql.Pa_Fp_Control_Items_Utils.chk_tsk_plan_level_mismatch'
4094 ,x_msg => 'selecting target version fp option details'
4095 ,x_log_level => 5);
4096 END IF;
4097
4098 select o.proj_fp_options_id ,
4099 bv.version_type into
4100 l_target_fp_opt_id,
4101 l_target_ver_type
4102 from pa_proj_fp_options o,
4103 pa_budget_versions bv
4104 where
4105 bv.budget_version_id = p_t_budget_version_id and
4106 bv.fin_plan_type_id = o.fin_plan_type_id and
4107 o.project_id = p_project_id and
4108 o.fin_plan_version_id = bv.budget_version_id;
4109
4110 FOR tsk_rec IN c1(l_source_fp_opt_id,
4111 l_source_ver_type) LOOP
4112 /* checking for the same task is planned in the
4113 target */
4114 l_source_task_id := tsk_rec.task_id;
4115 l_source_plan_level := tsk_rec.top_task_planning_level;
4116
4117 begin
4118 IF p_pa_debug_mode = 'Y' THEN
4119 PA_DEBUG.write_log (x_module =>
4120 'pa.plsql.Pa_Fp_Control_Items_Utils.chk_tsk_plan_level_mismatch'
4121 ,x_msg => 'checking for the same task is planned in the target'
4122 ,x_log_level => 5);
4123 END IF;
4124 select nvl(fpe.top_task_planning_level,'LOWEST')
4125 into l_top_task_plan_level
4126 from pa_fp_elements fpe
4127 where
4128 fpe.proj_fp_options_id = l_target_fp_opt_id and
4129 fpe.element_type = l_target_ver_type and
4130 fpe.task_id = tsk_rec.task_id and
4131 fpe.resource_list_member_id = 0 and
4132 fpe.plannable_flag = 'Y';
4133 l_target_task_id := tsk_rec.task_id;
4134 l_target_plan_level := l_top_task_plan_level;
4135 exception
4136 when no_data_found then
4137 /* checking for whether the top task is planned in the
4138 target */
4139 begin
4140 IF p_pa_debug_mode = 'Y' THEN
4141 PA_DEBUG.write_log (x_module =>
4142 'pa.plsql.Pa_Fp_Control_Items_Utils.chk_tsk_plan_level_mismatch'
4143 ,x_msg => 'checking for whether the top task is planned in the target'
4144 ,x_log_level => 5);
4145 END IF;
4146 select nvl(fpe.top_task_planning_level,'LOWEST')
4147 into l_top_task_plan_level
4148 from pa_fp_elements fpe
4149 where
4150 fpe.proj_fp_options_id = l_target_fp_opt_id and
4151 fpe.element_type = l_target_ver_type and
4152 fpe.task_id = tsk_rec.top_task_id and
4153 fpe.resource_list_member_id = 0 and
4154 fpe.plannable_flag = 'Y';
4155 l_target_task_id := tsk_rec.top_task_id;
4156 l_target_plan_level := l_top_task_plan_level;
4157 exception
4158 when no_data_found then
4159 if l_source_plan_level = 'TOP' then
4160 /* checking for whether the top task in the source version
4161 is planned at the lowest task level in target version */
4162 begin
4163 IF p_pa_debug_mode = 'Y' THEN
4164 PA_DEBUG.write_log (x_module =>
4165 'pa.plsql.Pa_Fp_Control_Items_Utils.chk_tsk_plan_level_mismatch'
4166 ,x_msg => 'checking for source - top task and target - lowest task'
4167 ,x_log_level => 5);
4168 END IF;
4169 select nvl(fpe.top_task_planning_level,'LOWEST')
4170 into l_top_task_plan_level
4171 from pa_fp_elements fpe
4172 where
4173 fpe.proj_fp_options_id = l_target_fp_opt_id and
4174 fpe.element_type = l_target_ver_type and
4175 fpe.task_id = tsk_rec.top_task_id and
4176 fpe.resource_list_member_id = 0;
4177 l_target_plan_level := l_top_task_plan_level;
4178 l_target_task_id := 0;
4179 /* the above target task id is a dummy assignment stmt and
4180 not being used anywhere in the processing. Because,
4181 the API will raise the error */
4182 exception
4183 when no_data_found then
4184 l_target_task_id := tsk_rec.task_id;
4185 l_target_plan_level := tsk_rec.top_task_planning_level;
4186 end;
4187 else
4188 l_target_task_id := tsk_rec.task_id;
4189 l_target_plan_level := tsk_rec.top_task_planning_level;
4190 end if;
4191 end;
4192 end;
4193
4194 if l_source_plan_level = 'TOP' and
4195 l_target_plan_level = 'LOWEST' then
4196 IF p_pa_debug_mode = 'Y' THEN
4197 PA_DEBUG.write_log (x_module =>
4198 'pa.plsql.Pa_Fp_Control_Items_Utils.chk_tsk_plan_level_mismatch'
4199 ,x_msg => 'getting the task info from pa_tasks table'
4200 ,x_log_level => 5);
4201 END IF;
4202 begin
4203 select task_name,task_number into
4204 l_target_task_name,
4205 l_target_task_number
4206 from pa_Tasks where task_id = tsk_rec.task_id;
4207 exception
4208 when no_data_found then
4209 l_target_task_name := NULL;
4210 l_target_task_number := NULL;
4211 end;
4212
4213 if l_error_msg_header_flag = 'N' then
4214 x_return_status := FND_API.G_RET_STS_ERROR;
4215 l_error_msg_header_flag := 'Y';
4216 if p_calling_mode = 'INCLUDE_CR_TO_CO' then
4217 l_message_code := 'PA_FP_CI_C_INV_TSK_LVL';
4218 elsif p_calling_mode = 'INCLUDE' then
4219 l_message_code := 'PA_FP_CI_INV_TSK_LVL';
4220 elsif p_calling_mode = 'IMPLEMENT' then
4221 l_message_code := 'PA_FP_CIM_INV_TSK_LVL';
4222 elsif p_calling_mode = 'SUBMIT' then
4223 l_message_code := 'PA_FP_CIS_INV_TSK_LVL';
4224
4225 end if;
4226 PA_UTILS.ADD_MESSAGE
4227 ( p_app_short_name => 'PA',
4228 p_msg_name => l_message_code );
4229
4230 end if; /* error msg header flag check */
4231 PA_UTILS.ADD_MESSAGE
4232 ( p_app_short_name => 'PA',
4233 p_msg_name => 'PA_FP_CI_INV_S_TASK_DATA',
4234 p_token1 => 'TASK_NAME',
4235 p_value1 => l_target_task_name,
4236 p_token2 => 'TASK_NO',
4237 p_value2 => l_target_task_number );
4238 else
4239 /* merge possible for the following task planning level
4240 Source Target
4241 ======= ======
4242 Lowest Lowest
4243 Top Top
4244 Lowest Top
4245 */
4246 IF p_pa_debug_mode = 'Y' THEN
4247 PA_DEBUG.write_log (x_module =>
4248 'pa.plsql.Pa_Fp_Control_Items_Utils.chk_tsk_plan_level_mismatch'
4249 ,x_msg => 'populating the pl sql table for source and target task'
4250 ,x_log_level => 5);
4251 END IF;
4252 l_task_exists_Flag := 'N';
4253 for chk in 1 .. x_s_task_id_tbl.count loop
4254 if x_s_task_id_tbl(chk) = l_source_task_id AND
4255 x_t_task_id_tbl(chk) = l_target_task_id then
4256 l_task_exists_Flag := 'Y';
4257 exit;
4258 end if;
4259 end loop;
4260 if l_task_exists_Flag = 'N' then
4261 x_s_task_id_tbl(l_index) := l_source_task_id;
4262 x_t_task_id_tbl(l_index) := l_target_task_id;
4263 x_s_fin_plan_level_tbl(l_index) := l_source_plan_level;
4264 x_t_fin_plan_level_tbl(l_index) := l_target_plan_level;
4265 l_index := l_index + 1;
4266 end if;
4267 end if; /* end if for top and lowest check */
4268 END LOOP;
4269 IF p_pa_debug_mode = 'Y' THEN
4270 PA_DEBUG.Reset_Err_Stack;
4271 END IF;
4272 EXCEPTION
4273 WHEN OTHERS THEN
4274 IF p_pa_debug_mode = 'Y' THEN
4275 PA_DEBUG.Reset_Err_Stack;
4276 END IF;
4277 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4278 fnd_msg_pub.add_exc_msg(p_pkg_name => 'Pa_Fp_Control_Items_Utils',
4279 p_procedure_name => 'chk_tsk_plan_level_mismatch',
4280 p_error_text => SUBSTRB(SQLERRM,1,240));
4281 fnd_msg_pub.count_and_get(p_count => x_msg_count,
4282 p_data => x_msg_data);
4283 END chk_tsk_plan_level_mismatch;
4284
4285 /* dbora - FP M - New function to check for valid status
4286 smullapp-Changed NON_APP_STATUSES_EXIST to add p_fin_plan_type_id as input parameter(bug 3899756)
4287 */
4288 FUNCTION NON_APP_STATUSES_EXIST (
4289 p_ci_type_id IN pa_pt_co_impl_statuses.ci_type_id%TYPE,
4290 p_version_type IN pa_pt_co_impl_statuses.version_type%TYPE,
4291 p_fin_plan_type_id IN pa_pt_co_impl_statuses.fin_plan_type_id%TYPE)
4292 RETURN VARCHAR2
4293 IS
4294 l_return VARCHAR2(1);
4295
4296 l_debug_mode VARCHAR2(1);
4297 l_debug_level3 CONSTANT NUMBER := 3;
4298 l_module_name VARCHAR2(100) := 'NON_APP_STATUSES_EXIST' ;
4299
4300 BEGIN
4301
4302 l_debug_mode := NVL(FND_PROFILE.value('PA_DEBUG_MODE'),'N');
4303
4304 IF l_debug_mode = 'Y' THEN
4305 pa_debug.set_curr_function( p_function => 'NON_APP_STATUSES_EXIST',
4306 p_debug_mode => l_debug_mode );
4307 END IF;
4308
4309 BEGIN
4310 SELECT 'Y'
4311 INTO l_return
4312 FROM dual
4313 WHERE
4314 EXISTS (SELECT 'X'
4315 FROM pa_pt_co_impl_statuses ptco,
4316 pa_ci_statuses_v pcs
4317 WHERE ptco.ci_type_id = p_ci_type_id
4318 AND ptco.version_type = p_version_type
4319 AND ptco.ci_type_id = pcs.ci_type_id
4320 AND ptco.status_code=pcs.project_status_code
4321 AND pcs.project_system_status_code <> PA_FP_CONSTANTS_PKG.G_SYS_STATUS_APPROVED
4322 AND ptco.fin_plan_type_id=p_fin_plan_type_id);
4323
4324 EXCEPTION
4325 WHEN NO_DATA_FOUND THEN
4326 l_return := 'N';
4327 END;
4328
4329 IF l_debug_mode = 'Y' THEN
4330 pa_debug.reset_curr_function;
4331 END IF;
4332
4333 RETURN l_return;
4334 END NON_APP_STATUSES_EXIST;
4335
4336 /* FP M - dbora - To return the CI type
4337 */
4338 FUNCTION GET_CI_ALLOWED_IMPACTS(
4339 p_ci_type_id IN pa_pt_co_impl_statuses.ci_type_id%TYPE)
4340 RETURN VARCHAR2
4341
4342 IS
4343 l_cost_impact_flag VARCHAR2(30);
4344 l_rev_impact_flag VARCHAR2(30);
4345
4346 l_debug_mode VARCHAR2(1);
4347 l_debug_level3 CONSTANT NUMBER := 3;
4348 l_module_name VARCHAR2(100) := 'GET_CI_ALLOWED_IMPACTS' ;
4349
4350 BEGIN
4351
4352 IF l_debug_mode = 'Y' THEN
4353 pa_debug.set_curr_function( p_function => 'GET_CI_ALLOWED_IMPACTS',
4354 p_debug_mode => l_debug_mode );
4355 END IF;
4356
4357 BEGIN
4358
4359 BEGIN
4360 SELECT cost_impact_flag, revenue_impact_flag
4361 INTO l_cost_impact_flag, l_rev_impact_flag
4362 FROM PA_CI_TYPES_W_FINPLAN_V
4363 WHERE ci_type_id = p_ci_type_id;
4364 EXCEPTION
4365 WHEN NO_DATA_FOUND THEN
4366 IF l_debug_mode = 'Y' THEN
4367 pa_debug.reset_curr_function;
4368 END IF;
4369 END;
4370 IF (l_cost_impact_flag = 'Y' AND l_rev_impact_flag = 'Y') THEN
4371
4372 IF l_debug_mode = 'Y' THEN
4373 pa_debug.reset_curr_function;
4374 END IF ;
4375
4376 RETURN PA_FP_CONSTANTS_PKG.G_ELEMENT_TYPE_BOTH;
4377
4378 ELSIF l_cost_impact_flag = 'Y' THEN
4379
4380 IF l_debug_mode = 'Y' THEN
4381 pa_debug.reset_curr_function;
4382 END IF ;
4383
4384 RETURN PA_FP_CONSTANTS_PKG.G_ELEMENT_TYPE_COST;
4385
4386 ELSIF l_rev_impact_flag = 'Y' THEN
4387
4388 IF l_debug_mode = 'Y' THEN
4389 pa_debug.reset_curr_function;
4390 END IF ;
4391
4392 RETURN PA_FP_CONSTANTS_PKG.G_ELEMENT_TYPE_REVENUE;
4393
4394 ELSE
4395
4396 IF l_debug_mode = 'Y' THEN
4397 pa_debug.reset_curr_function;
4398 END IF ;
4399
4400 RETURN NULL;
4401 END IF;
4402 END;
4403
4404 END GET_CI_ALLOWED_IMPACTS;
4405
4406
4407
4408 PROCEDURE get_summary_data
4409 ( p_project_id IN NUMBER
4410 ,p_cost_version_id IN pa_budget_versions.budget_version_id%TYPE
4411 ,p_revenue_version_id IN pa_budget_versions.budget_version_id%TYPE
4412 ,p_page_context IN VARCHAR2
4413 ,p_calling_mode IN VARCHAR2 DEFAULT 'APPROVED' --Bug 5278200 kchaitan
4414 ,x_context OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
4415 ,x_summary_tbl OUT NOCOPY SYSTEM.PA_VARCHAR2_150_TBL_TYPE --File.Sql.39 bug 4440895
4416 ,x_url_tbl OUT NOCOPY SYSTEM.PA_VARCHAR2_240_TBL_TYPE --File.Sql.39 bug 4440895
4417 ,x_reference_tbl OUT NOCOPY SYSTEM.PA_VARCHAR2_30_TBL_TYPE --File.Sql.39 bug 4440895
4418 ,x_equipment_hours_tbl OUT NOCOPY SYSTEM.PA_NUM_TBL_TYPE --File.Sql.39 bug 4440895
4419 ,x_labor_hours_tbl OUT NOCOPY SYSTEM.PA_NUM_TBL_TYPE --File.Sql.39 bug 4440895
4420 ,x_cost_tbl OUT NOCOPY SYSTEM.PA_NUM_TBL_TYPE --File.Sql.39 bug 4440895
4421 ,x_revenue_tbl OUT NOCOPY SYSTEM.PA_NUM_TBL_TYPE --File.Sql.39 bug 4440895
4422 ,x_margin_tbl OUT NOCOPY SYSTEM.PA_NUM_TBL_TYPE --File.Sql.39 bug 4440895
4423 ,x_margin_percent_tbl OUT NOCOPY SYSTEM.PA_NUM_TBL_TYPE --File.Sql.39 bug 4440895
4424 ,x_project_currency_code OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
4425 ,x_report_labor_hrs_code OUT NOCOPY VARCHAR2 /* Bug 4038253 */ --File.Sql.39 bug 4440895
4426 ,x_return_status OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
4427 ,x_msg_count OUT NOCOPY NUMBER --File.Sql.39 bug 4440895
4428 ,x_msg_data OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
4429 ) IS
4430
4431 --Start of variables used for debugging
4432 l_msg_count NUMBER :=0;
4433 l_data VARCHAR2(2000);
4434 l_msg_data VARCHAR2(2000);
4435 l_error_msg_code VARCHAR2(30);
4436 l_msg_index_out NUMBER;
4437 l_return_status VARCHAR2(2000);
4438 l_debug_mode VARCHAR2(30);
4439 --End of variables used for debugging
4440
4441
4442 l_assigned_flag VARCHAR2(1) := 'N';
4443 l_continue_flag VARCHAR2(1) := 'Y';
4444 l_row_count NUMBER := 0;
4445 l_margin_derived_from_code PA_PROJ_FP_OPTIONS.margin_derived_from_code%TYPE;
4446 l_module_name VARCHAR2(30) := 'ctrl_itm_utls.plan_summ_data';
4447 l_version_type PA_BUDGET_VERSIONS.version_type%TYPE;
4448 l_ar_fin_plan_type_id PA_PROJ_FP_OPTIONS.FIN_PLAN_TYPE_ID%TYPE;
4449 l_ac_fin_plan_type_id PA_PROJ_FP_OPTIONS.FIN_PLAN_TYPE_ID%TYPE;
4450 l_report_version_type PA_BUDGET_VERSIONS.version_type%TYPE;
4451 l_labor_quantity PA_BUDGET_VERSIONS.LABOR_QUANTITY%TYPE;
4452 l_equipment_quantity PA_BUDGET_VERSIONS.EQUIPMENT_QUANTITY%TYPE;
4453 l_cost PA_BUDGET_VERSIONS.RAW_COST%TYPE;
4454 l_revenue PA_BUDGET_VERSIONS.REVENUE%TYPE;
4455
4456 l_cb_labor_quantity PA_BUDGET_VERSIONS.LABOR_QUANTITY%TYPE;
4457 l_cb_equipment_quantity PA_BUDGET_VERSIONS.EQUIPMENT_QUANTITY%TYPE;
4458 l_cb_cost PA_BUDGET_VERSIONS.RAW_COST%TYPE;
4459 l_cb_revenue PA_BUDGET_VERSIONS.REVENUE%TYPE;
4460
4461 l_cw_labor_quantity PA_BUDGET_VERSIONS.LABOR_QUANTITY%TYPE;
4462 l_cw_equipment_quantity PA_BUDGET_VERSIONS.EQUIPMENT_QUANTITY%TYPE;
4463 l_cw_cost PA_BUDGET_VERSIONS.RAW_COST%TYPE;
4464 l_cw_revenue PA_BUDGET_VERSIONS.REVENUE%TYPE;
4465
4466 l_lookup_code_tbl SYSTEM.PA_NUM_TBL_TYPE := SYSTEM.PA_NUM_TBL_TYPE();
4467 l_fin_plan_type_id_tbl SYSTEM.PA_NUM_TBL_TYPE := SYSTEM.PA_NUM_TBL_TYPE();
4468 l_fin_plan_preference_code_tbl SYSTEM.PA_VARCHAR2_30_TBL_TYPE := SYSTEM.PA_VARCHAR2_30_TBL_TYPE();
4469 l_rep_lab_from_code_tbl SYSTEM.PA_VARCHAR2_30_TBL_TYPE := SYSTEM.PA_VARCHAR2_30_TBL_TYPE();
4470 l_appr_cost_plan_type_flag_tbl SYSTEM.PA_VARCHAR2_1_TBL_TYPE := SYSTEM.PA_VARCHAR2_1_TBL_TYPE();
4471 l_appr_rev_plan_type_flag_tbl SYSTEM.PA_VARCHAR2_1_TBL_TYPE := SYSTEM.PA_VARCHAR2_1_TBL_TYPE();
4472
4473 l_set_cw_url_flag VARCHAR2(1) := 'Y';
4474 l_set_ob_url_flag VARCHAR2(1) := 'Y';
4475 l_set_cb_url_flag VARCHAR2(1) := 'Y';
4476 l_set_cpb_url_flag VARCHAR2(1) := 'Y';
4477 l_set_ccw_url_flag VARCHAR2(1) := 'Y';
4478 l_fin_plan_type_id PA_PROJ_FP_OPTIONS.FIN_PLAN_TYPE_ID%TYPE;
4479 l_pa_cw_cost_bv_id PA_BUDGET_VERSIONS.BUDGET_VERSION_ID%TYPE;
4480 l_pa_cw_revenue_bv_id PA_BUDGET_VERSIONS.BUDGET_VERSION_ID%TYPE;
4481 l_pa_ob_cost_bv_id PA_BUDGET_VERSIONS.BUDGET_VERSION_ID%TYPE;
4482 l_pa_ob_revenue_bv_id PA_BUDGET_VERSIONS.BUDGET_VERSION_ID%TYPE;
4483 l_pa_cb_cost_bv_id PA_BUDGET_VERSIONS.BUDGET_VERSION_ID%TYPE;
4484 l_pa_cb_revenue_bv_id PA_BUDGET_VERSIONS.BUDGET_VERSION_ID%TYPE;
4485 l_bv_id PA_BUDGET_VERSIONS.BUDGET_VERSION_ID%TYPE;
4486 l_version_type_tbl SYSTEM.PA_VARCHAR2_30_TBL_TYPE := SYSTEM.PA_VARCHAR2_30_TBL_TYPE();
4487 l_budget_version_id_tbl SYSTEM.PA_NUM_TBL_TYPE := SYSTEM.PA_NUM_TBL_TYPE();
4488 l_next VARCHAR2(30);
4489 l_context VARCHAR2(30);
4490
4491 l_appr_rev_cw_version_id PA_BUDGET_VERSIONS.BUDGET_VERSION_ID%TYPE;
4492
4493 l_report_labor_hrs_code pa_proj_fp_options.report_labor_hrs_from_code%TYPE; /* Bug 4038253 */
4494 l_pref_code_for_pt_of_ver pa_proj_fp_options.fin_plan_preference_code%TYPE; /* Bug 4038253 */
4495
4496 CURSOR c_lookup_summary IS
4497 SELECT MEANING,to_number(LOOKUP_CODE)
4498 FROM PA_LOOKUPS
4499 WHERE LOOKUP_TYPE = 'PA_FP_CI_PLAN_SUMMARY'
4500 ORDER BY to_number(LOOKUP_CODE);
4501
4502 CURSOR c_lookup_reference IS
4503 SELECT MEANING
4504 FROM PA_LOOKUPS
4505 WHERE LOOKUP_TYPE = 'PA_FP_CI_PLAN_REFERENCE'
4506 ORDER BY to_number(LOOKUP_CODE);
4507
4508 CURSOR c_get_approved_details
4509 (c_project_id PA_PROJECTS_ALL.PROJECT_ID%TYPE) IS
4510 SELECT fin_plan_type_id,
4511 fin_plan_preference_code,
4512 report_labor_hrs_from_code,
4513 approved_cost_plan_type_flag,
4514 approved_rev_plan_type_flag
4515 FROM pa_proj_fp_options
4516 WHERE project_id = c_project_id
4517 AND (approved_cost_plan_type_flag = 'Y' or approved_rev_plan_type_flag = 'Y')
4518 AND fin_plan_option_level_code = 'PLAN_TYPE';
4519
4520 CURSOR c_original_baselined
4521 (c_project_id PA_PROJECTS_ALL.PROJECT_ID%TYPE,
4522 c_ac_fin_plan_type_id PA_PROJ_FP_OPTIONS.FIN_PLAN_TYPE_ID%TYPE,
4523 c_ar_fin_plan_type_id PA_PROJ_FP_OPTIONS.FIN_PLAN_TYPE_ID%TYPE,
4524 c_margin_derived_from_code PA_PROJ_FP_OPTIONS.margin_derived_from_code%TYPE,
4525 c_report_version_type PA_BUDGET_VERSIONS.VERSION_TYPE%TYPE) IS
4526 SELECT nvl(sum(decode(pbv.version_type,
4527 c_report_version_type,
4528 nvl(pbv.labor_quantity,0),0)),0),
4529 nvl(sum(decode(pbv.version_type,
4530 c_report_version_type,
4531 nvl(pbv.equipment_quantity,0),0)),0),
4532 nvl(sum(decode(pbv.fin_plan_type_id,
4533 c_ac_fin_plan_type_id,
4534 decode(c_margin_derived_from_code,
4535 'B',nvl(pbv.total_project_burdened_cost,0),
4536 nvl(pbv.total_project_raw_cost,0))
4537 ,0)),0) as cost,
4538 nvl(sum(decode(pbv.fin_plan_type_id,
4539 c_ar_fin_plan_type_id,nvl(pbv.total_project_revenue,0),0)),0)
4540 FROM pa_budget_versions pbv
4541 WHERE pbv.project_id = c_project_id
4542 AND pbv.ci_id is null
4543 AND nvl(pbv.current_original_flag,'N') = 'Y'
4544 --Below 2 lines commented for bug 5278200
4545 AND pbv.fin_plan_type_id in (c_ac_fin_plan_type_id,c_ar_fin_plan_type_id)
4546 --AND pbv.fin_plan_type_id is not null
4547 --AND (pbv.approved_cost_plan_type_flag = 'Y' or pbv.approved_rev_plan_type_flag = 'Y')
4548 AND pbv.budget_status_code = 'B';
4549
4550 CURSOR c_current_baselined
4551 (c_project_id PA_PROJECTS_ALL.PROJECT_ID%TYPE,
4552 c_ac_fin_plan_type_id PA_PROJ_FP_OPTIONS.FIN_PLAN_TYPE_ID%TYPE,
4553 c_ar_fin_plan_type_id PA_PROJ_FP_OPTIONS.FIN_PLAN_TYPE_ID%TYPE,
4554 c_margin_derived_from_code PA_PROJ_FP_OPTIONS.margin_derived_from_code%TYPE,
4555 c_report_version_type PA_BUDGET_VERSIONS.VERSION_TYPE%TYPE) IS
4556 SELECT nvl(sum(decode(pbv.version_type,
4557 c_report_version_type,
4558 nvl(pbv.labor_quantity,0),0)),0),
4559 nvl(sum(decode(pbv.version_type,
4560 c_report_version_type,
4561 nvl(pbv.equipment_quantity,0),0)),0),
4562 nvl(sum(decode(pbv.fin_plan_type_id,
4563 c_ac_fin_plan_type_id,
4564 decode(c_margin_derived_from_code,
4565 'B',nvl(pbv.total_project_burdened_cost,0),
4566 nvl(pbv.total_project_raw_cost,0))
4567 ,0)),0) as cost,
4568 nvl(sum(decode(pbv.fin_plan_type_id,
4569 c_ar_fin_plan_type_id,
4570 nvl(pbv.total_project_revenue,0),0)),0)
4571 FROM pa_budget_versions pbv
4572 WHERE pbv.project_id = c_project_id
4573 AND pbv.ci_id is null
4574 AND nvl(pbv.current_flag,'N') = 'Y'
4575 --Below 2 lines commented for bug 5278200
4576 AND pbv.fin_plan_type_id in (c_ac_fin_plan_type_id,c_ar_fin_plan_type_id)
4577 --AND pbv.fin_plan_type_id is not null
4578 --AND (pbv.approved_cost_plan_type_flag = 'Y' or pbv.approved_rev_plan_type_flag = 'Y')
4579 AND pbv.budget_status_code = 'B';
4580
4581 CURSOR c_current_working
4582 (c_project_id PA_PROJECTS_ALL.PROJECT_ID%TYPE,
4583 c_ac_fin_plan_type_id PA_PROJ_FP_OPTIONS.FIN_PLAN_TYPE_ID%TYPE,
4584 c_ar_fin_plan_type_id PA_PROJ_FP_OPTIONS.FIN_PLAN_TYPE_ID%TYPE,
4585 c_margin_derived_from_code PA_PROJ_FP_OPTIONS.margin_derived_from_code%TYPE,
4586 c_report_version_type PA_BUDGET_VERSIONS.VERSION_TYPE%TYPE) IS
4587 SELECT nvl(sum(decode(pbv.version_type,
4588 c_report_version_type,
4589 nvl(pbv.labor_quantity,0),0)),0),
4590 nvl(sum(decode(pbv.version_type,
4591 c_report_version_type,
4592 nvl(pbv.equipment_quantity,0),0)),0),
4593 nvl(sum(decode(pbv.fin_plan_type_id,
4594 c_ac_fin_plan_type_id,
4595 decode(c_margin_derived_from_code,
4596 'B',nvl(pbv.total_project_burdened_cost,0),
4597 nvl(pbv.total_project_raw_cost,0)),0)),0) as cost,
4598 nvl(sum(decode(pbv.fin_plan_type_id,
4599 c_ar_fin_plan_type_id,
4600 nvl(pbv.total_project_revenue,0),0)),0)
4601 FROM pa_budget_versions pbv
4602 WHERE pbv.project_id = c_project_id
4603 AND pbv.ci_id is null
4604 AND nvl(pbv.current_working_flag,'N') = 'Y'
4605 --Below 2 lines commented for bug 5278200
4606 AND pbv.fin_plan_type_id in (c_ac_fin_plan_type_id,c_ar_fin_plan_type_id);
4607 --AND pbv.fin_plan_type_id is not null
4608 --AND (pbv.approved_cost_plan_type_flag = 'Y' or pbv.approved_rev_plan_type_flag = 'Y')
4609 -- AND pbv.budget_status_code in ('S','W'); -- Bug#3815378
4610
4611 /* Bug - 3882985.
4612 Cursor c_change_documents_current is commented out below and re-written.
4613 c_change_documents_current should rely on inclusion_method_code in pa_fp_merged_ctrl_items.
4614 Basically All records having inclusion_method_code as (MANUAL,AUTOMATIC) should
4615 be considered while deriving Amounts/Quantities for the Current Working Version.
4616 We should NOT use a 'not exists' clause on change documents that have been already
4617 included in the current baseline version(as it was done earlier).
4618 */
4619 /* CURSOR c_change_documents_current
4620 (c_project_id PA_PROJECTS_ALL.PROJECT_ID%TYPE,
4621 c_ac_fin_plan_type_id PA_PROJ_FP_OPTIONS.FIN_PLAN_TYPE_ID%TYPE,
4622 c_ar_fin_plan_type_id PA_PROJ_FP_OPTIONS.FIN_PLAN_TYPE_ID%TYPE,
4623 c_margin_derived_from_code PA_PROJ_FP_OPTIONS.margin_derived_from_code%TYPE,
4624 c_report_version_type PA_BUDGET_VERSIONS.VERSION_TYPE%TYPE) IS -- Raja review
4625 Select nvl(sum(decode(c_report_version_type,
4626 'COST', decode(merge.version_type, 'COST',nvl(merge.impl_quantity,0),0),
4627 'REVENUE', decode(merge.version_type, 'REVENUE',nvl(merge.impl_quantity,0),0),
4628 'ALL', decode(merge.version_type, 'COST',nvl(merge.impl_quantity,0),0)
4629 ,0)),0),
4630 nvl(sum(decode(c_report_version_type,
4631 'COST', decode(merge.version_type, 'COST',nvl(merge.impl_equipment_quantity,0),0),
4632 'REVENUE', decode(merge.version_type, 'REVENUE',nvl(merge.impl_equipment_quantity,0),0),
4633 'ALL', decode(merge.version_type, 'COST',nvl(merge.impl_equipment_quantity,0),0)
4634 ,0)),0),
4635
4636 -- Raja report_version_type should be taken into consideration
4637 -- nvl(sum(nvl(merge.impl_quantity,0)),0),
4638 -- nvl(sum(nvl(merge.impl_equipment_quantity,0)),0),
4639
4640 nvl(sum(decode(c_margin_derived_from_code,
4641 'B',nvl(merge.impl_proj_burdened_cost,0),
4642 nvl(merge.impl_proj_raw_cost,0))),0) as cost,
4643 nvl(sum(nvl(merge.impl_proj_revenue,0)),0)
4644 from pa_fp_merged_ctrl_items merge,
4645 pa_budget_versions pbv
4646 where pbv.project_id = c_project_id
4647 and pbv.fin_plan_type_id in (c_ac_fin_plan_type_id, c_ar_fin_plan_type_id)
4648 and pbv.current_working_flag = 'Y'
4649 and merge.project_id = c_project_id
4650 and merge.plan_version_id = pbv.budget_version_id
4651 and pbv.ci_id is null
4652 -- and pbv.budget_status_code in ('S','W') -- Bug#3815378
4653 -- Added by Raja, filter all the ci versions included/copied in current baseline version
4654 and not exists(select 1
4655 from pa_fp_merged_ctrl_items merge1, pa_budget_versions pbv1
4656 where pbv1.project_id = c_project_id
4657 and pbv1.fin_plan_type_id in (c_ac_fin_plan_type_id,
4658 c_ar_fin_plan_type_id)
4659 and pbv1.budget_status_code = 'B'
4660 and pbv1.current_flag = 'Y'
4661 and pbv1.ci_id is null
4662 and merge1.project_id = c_project_id
4663 and merge1.plan_version_id = pbv1.budget_version_id
4664 and merge1.ci_plan_version_id = merge.ci_plan_version_id);
4665 */
4666
4667 -- Bug 5845142. Take the revenue amounts only from revenue impact.Note that cost impacts
4668 -- with ALL version type can have revenue amounts.
4669 CURSOR c_change_documents_current
4670 (c_project_id PA_PROJECTS_ALL.PROJECT_ID%TYPE,
4671 c_ac_fin_plan_type_id PA_PROJ_FP_OPTIONS.FIN_PLAN_TYPE_ID%TYPE,
4672 c_ar_fin_plan_type_id PA_PROJ_FP_OPTIONS.FIN_PLAN_TYPE_ID%TYPE,
4673 c_margin_derived_from_code PA_PROJ_FP_OPTIONS.margin_derived_from_code%TYPE,
4674 c_report_version_type PA_BUDGET_VERSIONS.VERSION_TYPE%TYPE) IS -- Raja review
4675 Select nvl(sum(decode(c_report_version_type,
4676 'COST', decode(merge.version_type, 'COST',nvl(merge.impl_quantity,0),0),
4677 'REVENUE', decode(merge.version_type, 'REVENUE',nvl(merge.impl_quantity,0),0),
4678 'ALL', decode(merge.version_type, 'COST',nvl(merge.impl_quantity,0),0)
4679 ,0)),0),
4680 nvl(sum(decode(c_report_version_type,
4681 'COST', decode(merge.version_type, 'COST',nvl(merge.impl_equipment_quantity,0),0),
4682 'REVENUE', decode(merge.version_type, 'REVENUE',nvl(merge.impl_equipment_quantity,0),0),
4683 'ALL', decode(merge.version_type, 'COST',nvl(merge.impl_equipment_quantity,0),0)
4684 ,0)),0),
4685 nvl(sum(decode(c_margin_derived_from_code,
4686 'B',nvl(merge.impl_proj_burdened_cost,0),
4687 nvl(merge.impl_proj_raw_cost,0))),0) as cost,
4688 nvl(sum(decode(pbv.fin_plan_type_id,
4689 c_ar_fin_plan_type_id,nvl(merge.impl_proj_revenue,0),
4690 0)),0)
4691 from pa_fp_merged_ctrl_items merge,
4692 pa_budget_versions pbv
4693 where pbv.project_id = c_project_id
4694 and pbv.fin_plan_type_id in (c_ac_fin_plan_type_id, c_ar_fin_plan_type_id)
4695 and pbv.current_working_flag = 'Y'
4696 and merge.project_id = c_project_id
4697 and merge.plan_version_id = pbv.budget_version_id
4698 and pbv.ci_id is null
4699 and merge.inclusion_method_code in ('MANUAL','AUTOMATIC');
4700
4701
4702
4703 /* Bug - 3882985.
4704 Cursor c_change_documents_prior is modified below.
4705 c_change_documents_prior should rely on inclusion_method_code in pa_fp_merged_ctrl_items.
4706 Basically All records having inclusion_method_code as (COPIED - for Current Baseline) should
4707 be considered while deriving Amounts/Quantities for the Prior Baselined Versions
4708 */
4709 -- Bug 5845142. Take the revenue amounts only from revenue impact.Note that cost impacts
4710 -- with ALL version type can have revenue amounts.
4711 CURSOR c_change_documents_prior
4712 (c_project_id PA_PROJECTS_ALL.PROJECT_ID%TYPE,
4713 c_ac_fin_plan_type_id PA_PROJ_FP_OPTIONS.FIN_PLAN_TYPE_ID%TYPE,
4714 c_ar_fin_plan_type_id PA_PROJ_FP_OPTIONS.FIN_PLAN_TYPE_ID%TYPE,
4715 c_margin_derived_from_code PA_PROJ_FP_OPTIONS.margin_derived_from_code%TYPE,
4716 c_report_version_type PA_BUDGET_VERSIONS.VERSION_TYPE%TYPE) IS -- Raja review
4717 Select nvl(sum(decode(c_report_version_type,
4718 'COST', decode(merge.version_type, 'COST',nvl(merge.impl_quantity,0),0),
4719 'REVENUE', decode(merge.version_type, 'REVENUE',nvl(merge.impl_quantity,0),0),
4720 'ALL', decode(merge.version_type, 'COST',nvl(merge.impl_quantity,0),0)
4721 ,0)),0),
4722 nvl(sum(decode(c_report_version_type,
4723 'COST', decode(merge.version_type, 'COST',nvl(merge.impl_equipment_quantity,0),0),
4724 'REVENUE', decode(merge.version_type, 'REVENUE',nvl(merge.impl_equipment_quantity,0),0),
4725 'ALL', decode(merge.version_type, 'COST',nvl(merge.impl_equipment_quantity,0),0)
4726 ,0)),0),
4727 /** Raja report_version_type should be taken into consideration
4728 nvl(sum(nvl(merge.impl_quantity,0)),0),
4729 nvl(sum(nvl(merge.impl_equipment_quantity,0)),0),
4730 **/
4731 nvl(sum(decode(c_margin_derived_from_code,'B'
4732 ,nvl(merge.impl_proj_burdened_cost,0)
4733 ,nvl(merge.impl_proj_raw_cost,0))),0) as cost,
4734 nvl(sum(decode(pbv.fin_plan_type_id,
4735 c_ar_fin_plan_type_id,nvl(merge.impl_proj_revenue,0),
4736 0)),0)
4737 from pa_fp_merged_ctrl_items merge,
4738 pa_budget_versions pbv
4739 where merge.plan_version_id = pbv.budget_version_id
4740 and pbv.fin_plan_type_id in (c_ac_fin_plan_type_id, c_ar_fin_plan_type_id)
4741 and pbv.current_flag = 'Y'
4742 and pbv.project_id = c_project_id
4743 and merge.project_id = c_project_id
4744 and pbv.ci_id is null
4745 and pbv.budget_status_code = 'B'
4746 and merge.inclusion_method_code = 'COPIED' -- Bug 3882985
4747 /* Raja filter all the change orders that have been included/copied in the original baseline version */
4748 and not exists(select 1
4749 from pa_fp_merged_ctrl_items merge1, pa_budget_versions pbv1
4750 where pbv1.project_id = c_project_id
4751 and pbv1.fin_plan_type_id in (c_ac_fin_plan_type_id,
4752 c_ar_fin_plan_type_id)
4753 and pbv1.current_original_flag = 'Y'
4754 and pbv1.ci_id is null
4755 and pbv1.budget_status_code = 'B'
4756 and merge1.project_id = c_project_id
4757 and merge1.plan_version_id = pbv1.budget_version_id
4758 -- Raja review and pbv.budget_version_id = pbv1.budget_version_id);
4759 and merge1.ci_plan_version_id = merge.ci_plan_version_id);
4760
4761
4762 /* Bug 3572880 Only those change orders that have not been already merged into the current
4763 working version should be considered. */
4764 /* commented by Raja rewritten the cursor below
4765 CURSOR c_change_documents_status
4766 (c_project_id pa_projects_all.project_id%TYPE,
4767 c_system_status_code pa_ci_statuses_v.project_system_status_code%TYPE,
4768 c_margin_derived_from_code PA_PROJ_FP_OPTIONS.margin_derived_from_code%TYPE) IS
4769 SELECT nvl(sum(pfca.people_effort),0),
4770 nvl(sum(pfca.equipment_effort),0),
4771 nvl(sum(decode(c_margin_derived_from_code,'B',
4772 nvl(pfca.burdened_cost,0),
4773 nvl(pfca.raw_cost,0))),0) as cost,
4774 nvl(sum(nvl(pfca.revenue,0)),0)
4775 from PA_FP_ELIGIBLE_CI_V pfca
4776 where pfca.project_id = c_project_id
4777 and pfca.PROJECT_SYSTEM_STATUS_CODE = c_system_status_code;
4778 */
4779 -- For ALL change order versions (meaning same plan type is designated as
4780 -- both AC and AR, plan setup is COST_AND_REV_SAME), quantity is implemented
4781 -- when cost is implemented. To avoid double count, in the second select
4782 -- quantity is never computed for ALL CO versions
4783 -- Changed for Bug 3744910
4784 -- Bug 3947153. Modified the inner select for revenue data to show the correct quantity. Please see
4785 -- the bug for details
4786 CURSOR c_change_documents_status
4787 (c_project_id pa_projects_all.project_id%TYPE,
4788 c_system_status_code pa_ci_statuses_v.project_system_status_code%TYPE,
4789 c_margin_derived_from_code PA_PROJ_FP_OPTIONS.margin_derived_from_code%TYPE,
4790 c_report_version_type PA_BUDGET_VERSIONS.VERSION_TYPE%TYPE,
4791 c_appr_rev_cw_version_id PA_BUDGET_VERSIONS.BUDGET_VERSION_ID%TYPE) IS -- Raja review
4792 SELECT (cost_query.people_effort + revenue_query.people_effort),
4793 (cost_query.equipment_effort + revenue_query.equipment_effort),
4794 (cost_query.cost + revenue_query.cost),
4795 (cost_query.revenue + revenue_query.revenue)
4796 from
4797 (SELECT nvl(sum(decode(pfca.ci_version_type,
4798 c_report_version_type, pfca.people_effort,
4799 0)),0) as people_effort,
4800 nvl(sum(decode(pfca.ci_version_type,
4801 c_report_version_type, pfca.equipment_effort,
4802 0)),0) as equipment_effort,
4803 nvl(sum(decode(c_margin_derived_from_code,'B',
4804 nvl(pfca.burdened_cost,0),
4805 nvl(pfca.raw_cost,0))),0) as cost,
4806 0 as revenue
4807 from (SELECT PBV.PROJECT_ID AS PROJECT_ID
4808 ,PBV.BUDGET_VERSION_ID AS CI_VERSION_ID
4809 ,PBV.VERSION_TYPE AS CI_VERSION_TYPE
4810 ,PCI.CI_ID AS CI_ID
4811 ,PCI.SUMMARY AS SUMMARY
4812 ,PCS.PROJECT_SYSTEM_STATUS_CODE AS PROJECT_SYSTEM_STATUS_CODE
4813 ,PBV.LABOR_QUANTITY AS PEOPLE_EFFORT
4814 ,PBV.EQUIPMENT_QUANTITY AS EQUIPMENT_EFFORT
4815 ,PBV.TOTAL_PROJECT_RAW_COST AS RAW_COST
4816 ,PBV.TOTAL_PROJECT_BURDENED_COST AS BURDENED_COST
4817 FROM pa_budget_versions pbv
4818 ,pa_control_items pci
4819 ,pa_project_statuses pcs
4820 ,pa_ci_types_vl pct
4821 WHERE PBV.CI_ID = PCI.CI_ID
4822 AND PBV.PROJECT_ID = PCI.PROJECT_ID
4823 AND PCI.STATUS_CODE = PCS.PROJECT_STATUS_CODE
4824 AND pct.ci_type_id = pci.ci_type_id
4825 AND pct.ci_type_class_code = 'CHANGE_ORDER') pfca
4826 where pfca.project_id = c_project_id
4827 and pfca.project_system_status_code = c_system_status_code
4828 and pfca.ci_version_type in ('COST', 'ALL')
4829 and not exists(select 1
4830 from pa_fp_merged_ctrl_items merge1, pa_budget_versions pbv1
4831 where merge1.project_id = c_project_id
4832 and merge1.ci_id = pfca.ci_id
4833 and merge1.ci_plan_version_id = pfca.ci_version_id
4834 and merge1.version_type = 'COST'
4835 -- and pbv1.budget_status_code in ('S','W') -- Bug#3815378
4836 and pbv1.current_working_flag = 'Y'
4837 and pbv1.budget_version_id = merge1.plan_version_id
4838 and pbv1.ci_id is null
4839 and pbv1.approved_cost_plan_type_flag = 'Y')) cost_query,
4840 -- Modified revenue Query 3902490 to add calls to get_labor_qty_partial and get_equip_qty_partial
4841 -- for deriving quantity when rev_partially_impl_flag is passed as Y.
4842 (SELECT nvl(sum(nvl(decode(c_report_version_type,'REVENUE',
4843 decode(pfca.REV_PARTIALLY_IMPL_FLAG,'Y',PA_FP_CONTROL_ITEMS_UTILS.get_labor_qty_partial
4844 (pfca.CI_VERSION_TYPE
4845 ,c_appr_rev_cw_version_id
4846 ,pfca.CI_VERSION_ID
4847 ,pfca.people_effort
4848 ,'REVENUE')
4849 ,pfca.people_effort),
4850 0),
4851 0)
4852 ),0) as people_effort,
4853 nvl(sum(nvl(decode(c_report_version_type,'REVENUE',
4854 decode(pfca.REV_PARTIALLY_IMPL_FLAG,'Y',PA_FP_CONTROL_ITEMS_UTILS.get_equip_qty_partial
4855 (pfca.CI_VERSION_TYPE
4856 ,c_appr_rev_cw_version_id
4857 ,pfca.CI_VERSION_ID
4858 ,pfca.equipment_effort
4859 ,'REVENUE')
4860 ,pfca.equipment_effort),
4861 0),
4862 0)
4863 ),0) as equipment_effort,
4864 0 as cost,
4865 nvl(sum(nvl(decode(pfca.REV_PARTIALLY_IMPL_FLAG,'Y',PA_FP_CONTROL_ITEMS_UTILS.get_pc_revenue_partial
4866 (pfca.CI_VERSION_TYPE
4867 ,c_appr_rev_cw_version_id
4868 ,pfca.CI_VERSION_ID
4869 ,pfca.revenue
4870 ,'REVENUE')
4871 ,pfca.revenue),0)),0) as revenue
4872 from (SELECT PBV.PROJECT_ID AS PROJECT_ID
4873 ,PBV.BUDGET_VERSION_ID AS CI_VERSION_ID
4874 ,PBV.VERSION_TYPE AS CI_VERSION_TYPE
4875 ,PCI.CI_ID AS CI_ID
4876 ,PCS.PROJECT_SYSTEM_STATUS_CODE AS PROJECT_SYSTEM_STATUS_CODE
4877 ,PBV.LABOR_QUANTITY AS PEOPLE_EFFORT
4878 ,PBV.EQUIPMENT_QUANTITY AS EQUIPMENT_EFFORT
4879 ,PBV.TOTAL_PROJECT_REVENUE AS REVENUE
4880 ,nvl(PBV.REV_PARTIALLY_IMPL_FLAG,'N') AS REV_PARTIALLY_IMPL_FLAG
4881 FROM pa_budget_versions pbv
4882 ,pa_control_items pci
4883 ,pa_project_statuses pcs
4884 ,pa_ci_types_vl pct
4885 WHERE PBV.CI_ID = PCI.CI_ID
4886 AND PBV.PROJECT_ID = PCI.PROJECT_ID
4887 AND PCI.STATUS_CODE = PCS.PROJECT_STATUS_CODE
4888 AND pct.ci_type_id = pci.ci_type_id
4889 AND pct.ci_type_class_code = 'CHANGE_ORDER') pfca
4890 where pfca.project_id = c_project_id
4891 and pfca.project_system_status_code = c_system_status_code
4892 and pfca.ci_version_type in ('REVENUE', 'ALL')
4893 and (pfca.REV_PARTIALLY_IMPL_FLAG = 'Y' OR
4894 not exists(select 1
4895 from pa_fp_merged_ctrl_items merge1, pa_budget_versions pbv1
4896 where merge1.project_id = c_project_id
4897 and merge1.ci_id = pfca.ci_id
4898 and merge1.ci_plan_version_id = pfca.ci_version_id
4899 and merge1.version_type = 'REVENUE'
4900 -- and pbv1.budget_status_code in ('S','W') -- Bug#3815378
4901 and pbv1.current_working_flag = 'Y'
4902 and pbv1.budget_version_id = merge1.plan_version_id
4903 and pbv1.ci_id is null
4904 and pbv1.approved_rev_plan_type_flag = 'Y'))) revenue_query;
4905
4906 --Bug 5278200Added extra parameter
4907 cursor c_url_original_baseline(c_project_id PA_PROJECTS_ALL.PROJECT_ID%TYPE,
4908 c_fin_plan_type_id pa_budget_versions.fin_plan_type_id%TYPE,
4909 c_version_type pa_budget_versions.version_type%TYPE) IS
4910 SELECT BUDGET_VERSION_ID,VERSION_TYPE
4911 FROM PA_BUDGET_VERSIONS
4912 WHERE BUDGET_STATUS_CODE = 'B'
4913 AND PROJECT_ID = c_project_id
4914 AND CI_ID IS NULL
4915 AND NVL(CURRENT_ORIGINAL_FLAG,'N') = 'Y'
4916 AND FIN_PLAN_TYPE_ID = C_FIN_PLAN_TYPE_ID
4917 AND version_type = c_version_type;
4918 --Bug 4089203
4919 --AND (approved_cost_plan_type_flag='Y' or approved_rev_plan_type_flag='Y');
4920
4921 --Bug 5278200Added extra parameter
4922 cursor c_url_current_baseline(c_project_id PA_PROJECTS_ALL.PROJECT_ID%TYPE,
4923 c_fin_plan_type_id pa_budget_versions.fin_plan_type_id%TYPE,
4924 c_version_type pa_budget_versions.version_type%TYPE) IS
4925 SELECT BUDGET_VERSION_ID,VERSION_TYPE
4926 FROM PA_BUDGET_VERSIONS
4927 WHERE BUDGET_STATUS_CODE = 'B'
4928 AND PROJECT_ID = c_project_id
4929 AND CI_ID IS NULL
4930 AND NVL(CURRENT_FLAG,'N') = 'Y'
4931 AND FIN_PLAN_TYPE_ID = C_FIN_PLAN_TYPE_ID
4932 AND version_type = c_version_type;
4933 --Bug 4089203
4934 --AND (approved_cost_plan_type_flag='Y' or approved_rev_plan_type_flag='Y');
4935
4936 --Bug 5278200Added extra parameter
4937 cursor c_url_current_working(c_project_id PA_PROJECTS_ALL.PROJECT_ID%TYPE,
4938 c_fin_plan_type_id pa_budget_versions.fin_plan_type_id%TYPE,
4939 c_version_type pa_budget_versions.version_type%TYPE) IS
4940 SELECT BUDGET_VERSION_ID,VERSION_TYPE
4941 FROM PA_BUDGET_VERSIONS
4942 WHERE PROJECT_ID = c_project_id
4943 AND CI_ID IS NULL
4944 AND NVL(CURRENT_WORKING_FLAG,'N') = 'Y'
4945 -- AND BUDGET_STATUS_CODE in ('S','W') -- Bug#3815378
4946 AND FIN_PLAN_TYPE_ID = C_FIN_PLAN_TYPE_ID
4947 AND version_type = c_version_type;
4948 --Bug 4089203
4949 --AND (approved_cost_plan_type_flag='Y' or approved_rev_plan_type_flag='Y');
4950
4951
4952 BEGIN
4953
4954 fnd_profile.get('PA_DEBUG_MODE',l_debug_mode);
4955 x_msg_count := 0;
4956 x_return_status := FND_API.G_RET_STS_SUCCESS;
4957 PA_DEBUG.Set_Curr_Function( p_function => l_module_name,
4958 p_debug_mode => l_debug_mode );
4959
4960
4961 -----------------------------------------------------------------------------
4962 -- Validate Input Params, p_project_id and (p_cost_version_id and p_revenue_version_id
4963 -- both) cannot be null or =-99
4964 -----------------------------------------------------------------------------
4965 IF l_debug_mode = 'Y' THEN
4966 pa_debug.g_err_stage:='Validating input parameters - project id : ' || p_project_id;
4967 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
4968 END IF;
4969
4970 IF (p_project_id IS NULL) THEN
4971 IF l_debug_mode = 'Y' THEN
4972 pa_debug.g_err_stage:='p_project_id is null';
4973 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
4974 END IF;
4975 PA_UTILS.ADD_MESSAGE(p_app_short_name => 'PA',
4976 p_msg_name => 'PA_FP_INV_PARAM_PASSED');
4977 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
4978 END IF;
4979
4980 IF l_debug_mode = 'Y' THEN
4981 pa_debug.g_err_stage:='Validating input parameters - p_cost_version_id : '||p_cost_version_id;
4982 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
4983
4984 pa_debug.g_err_stage:='Validating input parameters - p_revenue_version_id : '||p_revenue_version_id;
4985 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
4986 END IF;
4987
4988 IF ((nvl(p_cost_version_id,-99) = -99) AND (nvl(p_revenue_version_id,-99) = -99)) THEN
4989 IF l_debug_mode = 'Y' THEN
4990 pa_debug.g_err_stage:='Validating p_cost_version_id :'||p_cost_version_id;
4991 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
4992 END IF;
4993 IF l_debug_mode = 'Y' THEN
4994 pa_debug.g_err_stage:='Validating p_revenue_version_id :'||p_revenue_version_id;
4995 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
4996 END IF;
4997 RAISE PA_FP_CONSTANTS_PKG.Just_Ret_Exc;
4998 END IF;
4999
5000
5001 -------------------------------------------
5002 -- Initialising all tables to empty tables.
5003 -------------------------------------------
5004 IF l_debug_mode = 'Y' THEN
5005 pa_debug.g_err_stage:='Initialising all tables to empty tables.';
5006 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
5007 END IF;
5008 x_summary_tbl := SYSTEM.PA_VARCHAR2_150_TBL_TYPE();
5009 x_url_tbl := SYSTEM.PA_VARCHAR2_240_TBL_TYPE();
5010 x_reference_tbl := SYSTEM.PA_VARCHAR2_30_TBL_TYPE();
5011 x_equipment_hours_tbl := SYSTEM.pa_num_tbl_type();
5012 x_labor_hours_tbl := SYSTEM.pa_num_tbl_type();
5013 x_cost_tbl := SYSTEM.pa_num_tbl_type();
5014 x_revenue_tbl := SYSTEM.pa_num_tbl_type();
5015 x_margin_tbl := SYSTEM.pa_num_tbl_type();
5016 x_margin_percent_tbl := SYSTEM.pa_num_tbl_type();
5017
5018 ----------------------------------------------------
5019 -- Derive Value of x_context
5020 ----------------------------------------------------
5021 IF l_debug_mode = 'Y' THEN
5022 pa_debug.g_err_stage:='Derive Value of x_context';
5023 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
5024 END IF;
5025
5026 IF ((nvl(p_cost_version_id,-99) <> -99) AND (nvl(p_revenue_version_id,-99) <> -99)) THEN
5027 l_context := 'ALL';
5028 ELSIF ((nvl(p_cost_version_id,-99) <> -99) AND (nvl(p_revenue_version_id,-99) = -99)) THEN
5029 l_context := 'COST';
5030 ELSIF ((nvl(p_cost_version_id,-99) = -99) AND (nvl(p_revenue_version_id,-99) <> -99)) THEN
5031 l_context := 'REVENUE';
5032 END IF;
5033
5034 x_context := l_context;
5035
5036 --------------------------------------------------
5037 -- Fetching the project currency code
5038 --------------------------------------------------
5039 IF l_debug_mode = 'Y' THEN
5040 pa_debug.g_err_stage:='Derived x_context : '||x_context;
5041 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
5042
5043 pa_debug.g_err_stage:='Fetching the project currency code';
5044 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
5045 END IF;
5046
5047 BEGIN
5048 SELECT project_currency_code
5049 INTO x_project_currency_code
5050 FROM Pa_Projects_All
5051 WHERE project_Id = p_project_id;
5052
5053 IF l_debug_mode = 'Y' THEN
5054 pa_debug.g_err_stage:='x_project_currency_code = ' || x_project_currency_code;
5055 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
5056 END IF;
5057
5058 EXCEPTION
5059 WHEN NO_DATA_FOUND THEN
5060 IF l_debug_mode = 'Y' THEN
5061 pa_debug.g_err_stage:='NO_DATA_FOUND for fetching project_currency_code';
5062 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
5063 END IF;
5064 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
5065 END;
5066
5067 -----------------------------------------
5068 -- Fetching the margin dervied from code.
5069 -----------------------------------------
5070 IF l_debug_mode = 'Y' THEN
5071 pa_debug.g_err_stage:='Fetching the margin dervied from code';
5072 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
5073 END IF;
5074
5075 BEGIN
5076 SELECT nvl(MARGIN_DERIVED_FROM_CODE,'B')
5077 INTO l_margin_derived_from_code
5078 FROM PA_PROJ_FP_OPTIONS
5079 WHERE project_id = p_project_id
5080 AND fin_plan_option_level_code = 'PLAN_TYPE'
5081 AND approved_cost_plan_type_flag = 'Y';
5082
5083 IF l_debug_mode = 'Y' THEN
5084 pa_debug.g_err_stage:='margin dervied from code :'||l_margin_derived_from_code;
5085 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
5086 END IF;
5087
5088 EXCEPTION
5089 WHEN NO_DATA_FOUND THEN
5090 IF l_debug_mode = 'Y' THEN
5091 pa_debug.g_err_stage:='NO_DATA_FOUND for margin dervied from code,default to burdened cost';
5092 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
5093 END IF;
5094 l_margin_derived_from_code := 'B';
5095 END;
5096
5097
5098 ----------------------------------------------------
5099 -- Fetch Lookup_code ,summary and reference details.
5100 ----------------------------------------------------
5101 IF l_debug_mode = 'Y' THEN
5102 pa_debug.g_err_stage:='Fetching lookup data';
5103 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
5104 END IF;
5105
5106 OPEN c_lookup_summary;
5107 FETCH c_lookup_summary BULK COLLECT INTO x_summary_tbl,l_lookup_code_tbl;
5108 CLOSE c_lookup_summary;
5109
5110 OPEN c_lookup_reference;
5111 FETCH c_lookup_reference BULK COLLECT INTO x_reference_tbl;
5112 CLOSE c_lookup_reference;
5113
5114 --Bug 5278200 Changed below code as if else condition
5115 IF nvl(p_calling_mode,'APPROVED') = 'APPROVED' THEN
5116 ----------------------------------------------------------------
5117 -- Fetching the approved revenue budget currenct working version
5118 ----------------------------------------------------------------
5119 -- Bug 3744910 -- This is being passed to get_pc_revenue_partial
5120 -- in c_change_documents_status cursor
5121 IF l_debug_mode = 'Y' THEN
5122 pa_debug.g_err_stage:='fetching the approved revenue current working version';
5123 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
5124 END IF;
5125 BEGIN
5126 SELECT A.BUDGET_VERSION_ID
5127 INTO l_appr_rev_cw_version_id
5128 FROM PA_BUDGET_VERSIONS A
5129 WHERE A.PROJECT_ID = p_project_id
5130 AND A.VERSION_TYPE IN('ALL', 'REVENUE')
5131 AND A.APPROVED_REV_PLAN_TYPE_FLAG = 'Y'
5132 AND A.CURRENT_WORKING_FLAG = 'Y'
5133 AND A.CI_ID IS NULL;
5134 -- AND A.BUDGET_STATUS_CODE in ('S','W'); -- Bug#3815378
5135
5136 IF l_debug_mode = 'Y' THEN
5137 pa_debug.g_err_stage:='---l_appr_rev_cw_version_id----'||l_appr_rev_cw_version_id;
5138 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
5139 END IF;
5140
5141
5142 EXCEPTION
5143 WHEN NO_DATA_FOUND THEN
5144 l_appr_rev_cw_version_id := null;
5145 END;
5146
5147 -----------------------------------------------------
5148 -- Get Approved Fin plan Type Details for the project
5149 -----------------------------------------------------
5150
5151 IF l_debug_mode = 'Y' THEN
5152 pa_debug.g_err_stage:='Get Approved Fin plan Type Details for the project';
5153 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
5154 END IF;
5155
5156 OPEN c_get_approved_details(p_project_id);
5157 FETCH c_get_approved_details BULK COLLECT INTO l_fin_plan_type_id_tbl,
5158 l_fin_plan_preference_code_tbl,
5159 l_rep_lab_from_code_tbl,
5160 l_appr_cost_plan_type_flag_tbl,
5161 l_appr_rev_plan_type_flag_tbl;
5162 CLOSE c_get_approved_details;
5163
5164 ELSIF nvl(p_calling_mode,'APPROVED') = 'CURRENT' THEN
5165 IF l_debug_mode = 'Y' THEN
5166 pa_debug.g_err_stage:='fetching the revenue current working version of current plan type';
5167 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
5168 END IF;
5169
5170 BEGIN
5171 SELECT A.BUDGET_VERSION_ID
5172 INTO l_appr_rev_cw_version_id
5173 FROM PA_BUDGET_VERSIONS A
5174 WHERE A.PROJECT_ID = p_project_id
5175 AND A.VERSION_TYPE IN('ALL', 'REVENUE')
5176 --AND A.APPROVED_REV_PLAN_TYPE_FLAG = 'Y'
5177 AND A.FIN_PLAN_TYPE_ID IN(select FIN_PLAN_TYPE_ID from
5178 PA_BUDGET_VERSIONS where
5179 budget_version_id in
5180 (p_cost_version_id,p_revenue_version_id))
5181 AND A.CURRENT_WORKING_FLAG = 'Y'
5182 AND A.CI_ID IS NULL;
5183 --AND A.BUDGET_STATUS_CODE in ('S','W'); -- Bug#3815378
5184
5185 IF l_debug_mode = 'Y' THEN
5186 pa_debug.g_err_stage:='---l_appr_rev_cw_version_id----'||l_appr_rev_cw_version_id;
5187 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
5188 END IF;
5189
5190
5191 EXCEPTION
5192 WHEN NO_DATA_FOUND THEN
5193 l_appr_rev_cw_version_id := null;
5194 END;
5195
5196 l_fin_plan_type_id_tbl.extend(1);
5197 l_fin_plan_preference_code_tbl.extend(1);
5198 l_rep_lab_from_code_tbl.extend(1);
5199 l_appr_cost_plan_type_flag_tbl.extend(1);
5200 l_appr_rev_plan_type_flag_tbl.extend(1);
5201
5202 SELECT fin_plan_type_id,
5203 fin_plan_preference_code,
5204 report_labor_hrs_from_code
5205 INTO
5206 l_fin_plan_type_id_tbl(1),
5207 l_fin_plan_preference_code_tbl(1),
5208 l_rep_lab_from_code_tbl(1)
5209 FROM pa_proj_fp_options
5210 WHERE project_id = p_project_id
5211 AND fin_plan_option_level_code = 'PLAN_TYPE'
5212 AND fin_plan_type_id in(select FIN_PLAN_TYPE_ID from
5213 PA_BUDGET_VERSIONS where
5214 budget_version_id in (p_cost_version_id,p_revenue_version_id));
5215 l_appr_cost_plan_type_flag_tbl(1):='Y';
5216 l_appr_rev_plan_type_flag_tbl(1):='Y';
5217
5218 END IF;
5219 IF l_fin_plan_type_id_tbl.COUNT = 0 THEN
5220 --------------------------------------------------------------------------
5221 -- Insert data as 0 in all pl sql tables.
5222 --------------------------------------------------------------------------
5223 IF l_debug_mode = 'Y' THEN
5224 pa_debug.g_err_stage:='No Approved Plan type in in the system for this project';
5225 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
5226 END IF;
5227 l_row_count := x_summary_tbl.COUNT;
5228 x_margin_tbl.extend(l_row_count);
5229 x_margin_percent_tbl.extend(l_row_count);
5230 x_equipment_hours_tbl.extend(l_row_count);
5231 x_labor_hours_tbl.extend(l_row_count);
5232 x_revenue_tbl.extend(l_row_count);
5233 x_cost_tbl.extend(l_row_count);
5234 x_url_tbl.extend(l_row_count);
5235 FOR i IN x_summary_tbl.FIRST .. x_summary_tbl.LAST LOOP
5236 x_equipment_hours_tbl(i) := 0;
5237 x_labor_hours_tbl(i) := 0;
5238 x_cost_tbl(i) := 0;
5239 x_revenue_tbl(i) := 0;
5240 x_margin_tbl(i) := 0;
5241 x_margin_percent_tbl(i) := 0;
5242 x_url_tbl(i) := '';
5243 END LOOP;
5244 l_continue_flag := 'N' ;
5245 ELSE
5246 FOR i IN l_fin_plan_type_id_tbl.FIRST .. l_fin_plan_type_id_tbl.LAST LOOP
5247 IF l_fin_plan_preference_code_tbl(i) = 'COST_ONLY' THEN
5248 l_ac_fin_plan_type_id := l_fin_plan_type_id_tbl(i);
5249 ELSIF l_fin_plan_preference_code_tbl(i) = 'REVENUE_ONLY' THEN
5250 l_ar_fin_plan_type_id := l_fin_plan_type_id_tbl(i);
5251 ELSIF l_fin_plan_preference_code_tbl(i) = 'COST_AND_REV_SAME' THEN
5252 IF l_appr_cost_plan_type_flag_tbl(i) = 'Y' THEN
5253 l_ac_fin_plan_type_id := l_fin_plan_type_id_tbl(i);
5254 END IF;
5255 IF l_appr_rev_plan_type_flag_tbl(i) = 'Y' THEN
5256 l_ar_fin_plan_type_id := l_fin_plan_type_id_tbl(i);
5257 END IF;
5258 ELSIF l_fin_plan_preference_code_tbl(i) = 'COST_AND_REV_SEP' THEN
5259 IF l_appr_cost_plan_type_flag_tbl(i) = 'Y' THEN
5260 l_ac_fin_plan_type_id := l_fin_plan_type_id_tbl(i);
5261 END IF;
5262 IF l_appr_rev_plan_type_flag_tbl(i) = 'Y' THEN
5263 l_ar_fin_plan_type_id := l_fin_plan_type_id_tbl(i);
5264 END IF;
5265 END IF;
5266
5267 IF l_fin_plan_type_id_tbl.COUNT = 1 THEN
5268 IF l_fin_plan_preference_code_tbl(i) = 'COST_ONLY' THEN
5269 l_report_version_type := 'COST';
5270 ELSIF l_fin_plan_preference_code_tbl(i) = 'REVENUE_ONLY' THEN
5271 l_report_version_type := 'REVENUE';
5272 ELSIF l_fin_plan_preference_code_tbl(i) = 'COST_AND_REV_SAME' THEN
5273 l_report_version_type := 'ALL';
5274 ELSIF l_fin_plan_preference_code_tbl(i) = 'COST_AND_REV_SEP' THEN
5275 l_report_version_type := l_rep_lab_from_code_tbl(i);
5276 END IF;
5277 ELSE
5278 l_report_version_type := 'COST';
5279 END IF;
5280 END LOOP;
5281 END IF;
5282 --CLOSE c_get_approved_details;
5283
5284 IF l_debug_mode = 'Y' THEN
5285 pa_debug.g_err_stage:='l_ac_fin_plan_type_id; '||l_ac_fin_plan_type_id;
5286 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
5287
5288 pa_debug.g_err_stage:='l_ar_fin_plan_type_id; '||l_ar_fin_plan_type_id;
5289 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
5290
5291 pa_debug.g_err_stage:='l_report_version_type :'||l_report_version_type;
5292 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
5293 END IF;
5294
5295 ---------------------------------------------------------
5296 -- Deriving plan type id for links in plan summary region
5297 ---------------------------------------------------------
5298 IF l_debug_mode = 'Y' THEN
5299 pa_debug.g_err_stage:='Deriving plan type id for links in plan summary region';
5300 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
5301 END IF;
5302
5303 IF l_context = 'ALL' THEN
5304 IF l_ac_fin_plan_type_id IS NOT NULL THEN
5305 l_fin_plan_type_id := l_ac_fin_plan_type_id;
5306 IF l_ac_fin_plan_type_id = l_ar_fin_plan_type_id THEN
5307 l_next := 'ALL'; -- All here means cost and rev both
5308 ELSE
5309 l_next := 'COST';
5310 END IF;
5311 ELSE
5312 IF l_ar_fin_plan_type_id IS NOT NULL THEN
5313 l_fin_plan_type_id := l_ar_fin_plan_type_id;
5314 l_next := 'REVENUE';
5315 END IF;
5316 END IF;
5317 ELSIF l_context = 'COST' THEN
5318 IF l_ac_fin_plan_type_id IS NOT NULL THEN
5319 l_fin_plan_type_id := l_ac_fin_plan_type_id;
5320 l_next := 'COST';
5321 END IF;
5322 ELSIF l_context = 'REVENUE' THEN
5323 IF l_ar_fin_plan_type_id IS NOT NULL THEN
5324 l_fin_plan_type_id := l_ar_fin_plan_type_id;
5325 l_next := 'REVENUE';
5326 END IF;
5327 END IF;
5328
5329
5330 IF l_debug_mode = 'Y' THEN
5331 pa_debug.g_err_stage:='Derived l_fin_plan_type_id --- '||l_fin_plan_type_id;
5332 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
5333
5334 pa_debug.g_err_stage:='Derived l_next --- '||l_next;
5335 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
5336 END IF;
5337
5338
5339
5340 IF l_fin_plan_type_id IS NOT NULL THEN
5341 OPEN c_url_original_baseline(p_project_id,l_fin_plan_type_id,l_next); --bug 5278200
5342 FETCH c_url_original_baseline BULK COLLECT INTO l_budget_version_id_tbl,l_version_type_tbl;
5343 IF l_budget_version_id_tbl.COUNT = 0 THEN
5344 l_set_ob_url_flag := 'N';
5345 ELSE
5346 FOR j IN l_budget_version_id_tbl.FIRST .. l_budget_version_id_tbl.LAST LOOP
5347 IF l_version_type_tbl(j) = 'COST' THEN
5348 l_pa_ob_cost_bv_id := l_budget_version_id_tbl(j);
5349 IF l_budget_version_id_tbl.COUNT = 1 THEN
5350 l_pa_ob_revenue_bv_id := -99;
5351 END IF;
5352 ELSIF l_version_type_tbl(j) = 'REVENUE' THEN
5353 l_pa_ob_revenue_bv_id := l_budget_version_id_tbl(j);
5354 IF l_budget_version_id_tbl.COUNT = 1 THEN
5355 l_pa_ob_cost_bv_id := -99;
5356 END IF;
5357 ELSIF l_version_type_tbl(j) = 'ALL' THEN
5358 l_pa_ob_cost_bv_id := l_budget_version_id_tbl(j);
5359 l_pa_ob_revenue_bv_id := l_budget_version_id_tbl(j);
5360 END IF;
5361 END LOOP;
5362 END IF;
5363 CLOSE c_url_original_baseline;
5364
5365 OPEN c_url_current_baseline(p_project_id,l_fin_plan_type_id,l_next);--bug 5278200
5366 FETCH c_url_current_baseline BULK COLLECT INTO l_budget_version_id_tbl,l_version_type_tbl;
5367 IF l_budget_version_id_tbl.COUNT = 0 THEN
5368 l_set_cb_url_flag := 'N';
5369 ELSE
5370 FOR j IN l_budget_version_id_tbl.FIRST .. l_budget_version_id_tbl.LAST LOOP
5371 IF l_version_type_tbl(j) = 'COST' THEN
5372 l_pa_cb_cost_bv_id := l_budget_version_id_tbl(j);
5373 IF l_budget_version_id_tbl.COUNT = 1 THEN
5374 l_pa_cb_revenue_bv_id := -99;
5375 END IF;
5376 ELSIF l_version_type_tbl(j) = 'REVENUE' THEN
5377 l_pa_cb_revenue_bv_id := l_budget_version_id_tbl(j);
5378 IF l_budget_version_id_tbl.COUNT = 1 THEN
5379 l_pa_cb_cost_bv_id := -99;
5380 END IF;
5381 ELSIF l_version_type_tbl(j) = 'ALL' THEN
5382 l_pa_cb_cost_bv_id := l_budget_version_id_tbl(j);
5383 l_pa_cb_revenue_bv_id := l_budget_version_id_tbl(j);
5384 END IF;
5385 END LOOP;
5386 END IF;
5387 CLOSE c_url_current_baseline;
5388
5389 OPEN c_url_current_working(p_project_id,l_fin_plan_type_id,l_next);--bug 5278200
5390 FETCH c_url_current_working BULK COLLECT INTO l_budget_version_id_tbl,l_version_type_tbl;
5391 IF l_budget_version_id_tbl.COUNT = 0 THEN
5392 l_set_cw_url_flag := 'N';
5393 ELSE
5394 FOR j IN l_budget_version_id_tbl.FIRST .. l_budget_version_id_tbl.LAST LOOP
5395 IF l_version_type_tbl(j) = 'COST' THEN
5396 l_pa_cw_cost_bv_id := l_budget_version_id_tbl(j);
5397 IF l_budget_version_id_tbl.COUNT = 1 THEN
5398 l_pa_cw_revenue_bv_id := -99;
5399 END IF;
5400 ELSIF l_version_type_tbl(j) = 'REVENUE' THEN
5401 l_pa_cw_revenue_bv_id := l_budget_version_id_tbl(j);
5402 IF l_budget_version_id_tbl.COUNT = 1 THEN
5403 l_pa_cw_cost_bv_id := -99;
5404 END IF;
5405 ELSIF l_version_type_tbl(j) = 'ALL' THEN
5406 l_pa_cw_cost_bv_id := l_budget_version_id_tbl(j);
5407 l_pa_cw_revenue_bv_id := l_budget_version_id_tbl(j);
5408 END IF;
5409 END LOOP;
5410 END IF;
5411 CLOSE c_url_current_working;
5412 END IF;
5413
5414 /* The following logic is based on the following assumptions:
5415 The lookup code signifies the data this is being shown in the region as follows:
5416 As of now:
5417 10 Original Baselined Version
5418 20 Change Documents from Prior Baselined Versions
5419 30 Adjustments from Prior Baselined Versions
5420 40 Current Baseline
5421 50 Change Documents Included in this Version
5422 60 Adjustments
5423 70 Total Current Working
5424 80 Approved Change Documents
5425 90 Working Change Documents
5426 100 Submitted Change Documents
5427 110 Projected Total
5428
5429 Disclaimer: Please note that the actual and latest mapping of the above can be got from
5430 pa_lookups as follows:
5431 select lookup_code, meaning
5432 from pa_lookupus
5433 where lookup_type = 'PA_FP_CI_PLAN_SUMMARY'
5434 order by to_number(lookup_code);
5435
5436 Description for the lookup type has been updated as well saying that sayijng the code is
5437 used as number internally.*/
5438 IF l_continue_flag = 'Y' THEN
5439
5440 FOR i IN l_lookup_code_tbl.FIRST .. l_lookup_code_tbl.LAST LOOP
5441
5442 x_url_tbl.extend(1);
5443 x_equipment_hours_tbl.extend(1);
5444 x_labor_hours_tbl.extend(1);
5445 x_cost_tbl.extend(1);
5446 x_revenue_tbl.extend(1);
5447 x_url_tbl.extend(1);
5448
5449 IF l_lookup_code_tbl(i) = 10 THEN
5450 IF l_debug_mode = 'Y' THEN
5451 pa_debug.g_err_stage:='Fetching Data for Original Baselined Version';
5452 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
5453 END IF;
5454 OPEN c_original_baselined(p_project_id,
5455 l_ac_fin_plan_type_id,
5456 l_ar_fin_plan_type_id,
5457 l_margin_derived_from_code ,
5458 l_report_version_type);
5459 FETCH c_original_baselined INTO l_labor_quantity,
5460 l_equipment_quantity,
5461 l_cost,
5462 l_revenue;
5463 CLOSE c_original_baselined;
5464 IF l_debug_mode = 'Y' THEN
5465 pa_debug.g_err_stage:='l_labor_quantity:'||l_labor_quantity;
5466 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
5467
5468 pa_debug.g_err_stage:='l_equipment_quantity:'||l_equipment_quantity;
5469 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
5470
5471 pa_debug.g_err_stage:='l_cost:'||l_cost;
5472 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
5473
5474 pa_debug.g_err_stage:='l_revenue:'||l_revenue;
5475 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
5476 END IF;
5477
5478 IF l_fin_plan_type_id IS NOT NULL THEN
5479 -- Bug 3883406
5480 -- URL to be built for view plan page, depending if the current context is task_summary or resource_summary.
5481 IF (p_page_context = 'VIEWPLAN_TASK' OR p_page_context = 'VIEWPLAN_RESOURCE') THEN
5482 IF ((l_next = 'COST') AND (p_cost_version_id = l_pa_ob_cost_bv_id)) OR
5483 ((l_next = 'REVENUE') AND (p_revenue_version_id = l_pa_ob_revenue_bv_id)) OR
5484 ((l_next = 'ALL') AND ((p_cost_version_id = l_pa_ob_cost_bv_id) AND
5485 (p_revenue_version_id = l_pa_ob_revenue_bv_id))) THEN
5486 l_set_ob_url_flag := 'N';
5487 END IF;
5488 END IF;
5489 ELSE
5490 l_set_ob_url_flag := 'N';
5491 END IF;
5492
5493 IF l_set_ob_url_flag = 'Y' THEN
5494 -- Bug 3883406
5495 -- URL to be built for view plan page, depending if the current context is task_summary or resource_summary.
5496 IF p_page_context = 'VIEWPLAN_TASK' THEN
5497 x_url_tbl(i) := 'OA.jsp?page=/oracle/apps/pji/viewplan/reporting/webui/VPBudgetTaskSumPG&paProjectId='||p_project_id
5498 ||'&paFinTypeId='||l_fin_plan_type_id
5499 ||'&paCstContextVersionId='||l_pa_ob_cost_bv_id
5500 ||'&paRevContextVersionId='||l_pa_ob_revenue_bv_id
5501 ||'&addBreadCrumb=Y&retainAM=N';
5502 ELSIF p_page_context = 'VIEWPLAN_RESOURCE' THEN
5503 x_url_tbl(i) := 'OA.jsp?page=/oracle/apps/pji/viewplan/reporting/webui/VPBudgetResSumPG&paProjectId='||p_project_id
5504 ||'&paFinTypeId='||l_fin_plan_type_id
5505 ||'&paCstContextVersionId='||l_pa_ob_cost_bv_id
5506 ||'&paRevContextVersionId='||l_pa_ob_revenue_bv_id
5507 ||'&addBreadCrumb=Y&retainAM=N';
5508 END IF;
5509 END IF;
5510
5511 ELSIF l_lookup_code_tbl(i) = 20 THEN
5512 IF l_debug_mode = 'Y' THEN
5513 pa_debug.g_err_stage:='Fetching Data for Change Docs fom Prior Baselined Versions';
5514 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
5515 END IF;
5516 OPEN c_change_documents_prior(p_project_id,
5517 l_ac_fin_plan_type_id,
5518 l_ar_fin_plan_type_id,
5519 l_margin_derived_from_code,
5520 l_report_version_type); -- Raja review
5521 FETCH c_change_documents_prior INTO l_labor_quantity,
5522 l_equipment_quantity,
5523 l_cost,
5524 l_revenue;
5525 CLOSE c_change_documents_prior;
5526 IF l_debug_mode = 'Y' THEN
5527 pa_debug.g_err_stage:='l_labor_quantity:'||l_labor_quantity;
5528 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
5529
5530 pa_debug.g_err_stage:='l_equipment_quantity:'||l_equipment_quantity;
5531 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
5532
5533 pa_debug.g_err_stage:='l_cost:'||l_cost;
5534 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
5535
5536 pa_debug.g_err_stage:='l_revenue:'||l_revenue;
5537 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
5538 END IF;
5539
5540 IF l_fin_plan_type_id IS NOT NULL THEN
5541 IF (l_next = 'COST' OR l_next = 'ALL') THEN
5542 l_bv_id := l_pa_cb_cost_bv_id;
5543 ELSE
5544 l_bv_id := l_pa_cb_revenue_bv_id;
5545 END IF;
5546
5547 IF (p_page_context = 'VIEWCD' AND ((l_bv_id = p_cost_version_id) OR (l_bv_id = p_revenue_version_id))) THEN
5548 l_set_cpb_url_flag := 'N';
5549 END IF;
5550
5551 ELSE
5552 l_set_cpb_url_flag := 'N';
5553 END IF;
5554
5555 IF l_set_cpb_url_flag = 'Y' AND l_set_cb_url_flag = 'Y' THEN
5556 x_url_tbl(i) := 'OA.jsp?page=/oracle/apps/pa/finplan/webui/FpCiIncldedPG&paProjectId='||p_project_id
5557 ||'&paPageContext=VIEWCD'
5558 ||'&paBudgetVersionId='||l_bv_id||'&addBreadCrumb=Y&retainAM=N';
5559 END IF;
5560
5561 ELSIF l_lookup_code_tbl(i) = 30 THEN /* fetching data for Adjustments from Prior Baseline Versions */
5562 IF l_debug_mode = 'Y' THEN
5563 pa_debug.g_err_stage:='Fetching Data for Current Baselined';
5564 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
5565 END IF;
5566 OPEN c_current_baselined(p_project_id,
5567 l_ac_fin_plan_type_id,
5568 l_ar_fin_plan_type_id,
5569 l_margin_derived_from_code ,
5570 l_report_version_type);
5571 FETCH c_current_baselined INTO l_cb_labor_quantity,
5572 l_cb_equipment_quantity,
5573 l_cb_cost,
5574 l_cb_revenue;
5575 CLOSE c_current_baselined;
5576 IF l_debug_mode = 'Y' THEN
5577 pa_debug.g_err_stage:='l_cb_labor_quantity:'||l_cb_labor_quantity;
5578 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
5579
5580 pa_debug.g_err_stage:='l_cb_equipment_quantity:'||l_cb_equipment_quantity;
5581 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
5582
5583 pa_debug.g_err_stage:='l_cb_cost:'||l_cb_cost;
5584 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
5585
5586 pa_debug.g_err_stage:='l_cb_revenue:'||l_cb_revenue;
5587 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
5588 END IF;
5589
5590 IF l_debug_mode = 'Y' THEN
5591 pa_debug.g_err_stage:='Inserting Data for Adjustments from Prior versions';
5592 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
5593 END IF;
5594 x_equipment_hours_tbl(i) := l_cb_equipment_quantity -
5595 x_equipment_hours_tbl(i-1) -
5596 x_equipment_hours_tbl(i-2);
5597 x_labor_hours_tbl(i) := l_cb_labor_quantity -
5598 x_labor_hours_tbl(i-1) -
5599 x_labor_hours_tbl(i-2);
5600 x_cost_tbl(i) := l_cb_cost -
5601 x_cost_tbl(i-1) -
5602 x_cost_tbl(i-2);
5603 x_revenue_tbl(i) := l_cb_revenue -
5604 x_revenue_tbl(i-1) -
5605 x_revenue_tbl(i-2);
5606 l_assigned_flag := 'Y';
5607
5608 ELSIF l_lookup_code_tbl(i) = 40 THEN
5609
5610 IF l_fin_plan_type_id IS NOT NULL THEN
5611 -- Bug 3883406
5612 -- URL to be built for view plan page, depending if the current context is task_summary or resource_summary.
5613 IF (p_page_context = 'VIEWPLAN_TASK' OR p_page_context = 'VIEWPLAN_RESOURCE') THEN
5614 IF ((l_next = 'COST') AND (p_cost_version_id = l_pa_cb_cost_bv_id)) OR
5615 ((l_next = 'REVENUE') AND (p_revenue_version_id = l_pa_cb_revenue_bv_id)) OR
5616 ((l_next = 'ALL') AND ((p_cost_version_id = l_pa_cb_cost_bv_id) AND
5617 (p_revenue_version_id = l_pa_cb_revenue_bv_id))) THEN
5618 l_set_cb_url_flag := 'N';
5619 END IF;
5620 END IF;
5621
5622 ELSE
5623 l_set_cb_url_flag := 'N';
5624 END IF;
5625
5626 IF l_set_cb_url_flag = 'Y' THEN
5627 -- Bug 3883406
5628 -- URL to be built for view plan page, depending if the current context is task_summary or resource_summary.
5629 IF p_page_context = 'VIEWPLAN_TASK' THEN
5630 x_url_tbl(i) := 'OA.jsp?page=/oracle/apps/pji/viewplan/reporting/webui/VPBudgetTaskSumPG&paProjectId='||p_project_id
5631 ||'&paFinTypeId='||l_fin_plan_type_id
5632 ||'&paCstContextVersionId='||l_pa_cb_cost_bv_id
5633 ||'&paRevContextVersionId='||l_pa_cb_revenue_bv_id
5634 ||'&addBreadCrumb=Y&retainAM=N';
5635 ELSIF p_page_context = 'VIEWPLAN_RESOURCE' THEN
5636 x_url_tbl(i) := 'OA.jsp?page=/oracle/apps/pji/viewplan/reporting/webui/VPBudgetResSumPG&paProjectId='||p_project_id
5637 ||'&paFinTypeId='||l_fin_plan_type_id
5638 ||'&paCstContextVersionId='||l_pa_cb_cost_bv_id
5639 ||'&paRevContextVersionId='||l_pa_cb_revenue_bv_id
5640 ||'&addBreadCrumb=Y&retainAM=N';
5641 END IF;
5642 END IF;
5643
5644 IF l_debug_mode = 'Y' THEN
5645 pa_debug.g_err_stage:='l_cb_labor_quantity:'||l_cb_labor_quantity;
5646 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
5647
5648 pa_debug.g_err_stage:='l_cb_equipment_quantity:'||l_cb_equipment_quantity;
5649 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
5650
5651 pa_debug.g_err_stage:='l_cb_cost:'||l_cb_cost;
5652 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
5653
5654 pa_debug.g_err_stage:='l_cb_revenue:'||l_cb_revenue;
5655 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
5656 END IF;
5657
5658 x_equipment_hours_tbl(i) := l_cb_equipment_quantity;
5659 x_labor_hours_tbl(i) := l_cb_labor_quantity;
5660 x_cost_tbl(i) := l_cb_cost;
5661 x_revenue_tbl(i) := l_cb_revenue;
5662 l_assigned_flag := 'Y';
5663
5664 ELSIF l_lookup_code_tbl(i) = 50 THEN
5665 IF l_debug_mode = 'Y' THEN
5666 pa_debug.g_err_stage:='Fetching Data for Change Docs fom Current Versions';
5667 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
5668 END IF;
5669 OPEN c_change_documents_current(p_project_id,
5670 l_ac_fin_plan_type_id,
5671 l_ar_fin_plan_type_id,
5672 l_margin_derived_from_code,
5673 l_report_version_type); -- Raja review
5674 FETCH c_change_documents_current INTO l_labor_quantity,
5675 l_equipment_quantity,
5676 l_cost,
5677 l_revenue;
5678 CLOSE c_change_documents_current;
5679 IF l_debug_mode = 'Y' THEN
5680 pa_debug.g_err_stage:='l_labor_quantity:'||l_labor_quantity;
5681 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
5682
5683 pa_debug.g_err_stage:='l_equipment_quantity:'||l_equipment_quantity;
5684 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
5685
5686 pa_debug.g_err_stage:='l_cost:'||l_cost;
5687 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
5688
5689 pa_debug.g_err_stage:='l_revenue:'||l_revenue;
5690 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
5691 END IF;
5692
5693 IF l_fin_plan_type_id IS NOT NULL THEN
5694 IF (l_next = 'COST' OR l_next = 'ALL') THEN
5695 l_bv_id := l_pa_cw_cost_bv_id;
5696 ELSE
5697 l_bv_id := l_pa_cw_revenue_bv_id;
5698 END IF;
5699
5700 IF (p_page_context = 'VIEWCD' AND ((l_bv_id = p_cost_version_id) OR (l_bv_id = p_revenue_version_id))) THEN
5701 l_set_ccw_url_flag := 'N';
5702 END IF;
5703
5704 ELSE
5705 l_set_ccw_url_flag := 'N';
5706 END IF;
5707
5708 IF l_set_ccw_url_flag = 'Y' AND l_set_cw_url_flag = 'Y' THEN
5709 x_url_tbl(i) := 'OA.jsp?page=/oracle/apps/pa/finplan/webui/FpCiIncldedPG&paProjectId='||p_project_id
5710 ||'&paPageContext=VIEWCD'
5711 ||'&paBudgetVersionId='||l_bv_id||'&addBreadCrumb=Y&retainAM=N';
5712 END IF;
5713
5714
5715 ELSIF l_lookup_code_tbl(i) = 60 THEN
5716 IF l_debug_mode = 'Y' THEN
5717 pa_debug.g_err_stage:='Fetching Data for Current Working';
5718 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
5719 END IF;
5720 OPEN c_current_working(p_project_id,
5721 l_ac_fin_plan_type_id,
5722 l_ar_fin_plan_type_id,
5723 l_margin_derived_from_code ,
5724 l_report_version_type);
5725 FETCH c_current_working INTO l_cw_labor_quantity,
5726 l_cw_equipment_quantity,
5727 l_cw_cost,
5728 l_cw_revenue;
5729 CLOSE c_current_working;
5730 IF l_debug_mode = 'Y' THEN
5731 pa_debug.g_err_stage:='l_cw_labor_quantity:'||l_cw_labor_quantity;
5732 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
5733
5734 pa_debug.g_err_stage:='l_cw_equipment_quantity:'||l_cw_equipment_quantity;
5735 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
5736
5737 pa_debug.g_err_stage:='l_cw_cost:'||l_cw_cost;
5738 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
5739
5740 pa_debug.g_err_stage:='l_cw_revenue:'||l_cw_revenue;
5741 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
5742 END IF;
5743
5744 IF l_debug_mode = 'Y' THEN
5745 pa_debug.g_err_stage:='Inserting Data for Adjustments';
5746 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
5747 END IF;
5748 x_equipment_hours_tbl(i) := l_cw_equipment_quantity -
5749 x_equipment_hours_tbl(i-1) -
5750 x_equipment_hours_tbl(i-2);
5751 x_labor_hours_tbl(i) := l_cw_labor_quantity -
5752 x_labor_hours_tbl(i-1) -
5753 x_labor_hours_tbl(i-2);
5754 x_cost_tbl(i) := l_cw_cost -
5755 x_cost_tbl(i-1) -
5756 x_cost_tbl(i-2);
5757 x_revenue_tbl(i) := l_cw_revenue -
5758 x_revenue_tbl(i-1) -
5759 x_revenue_tbl(i-2);
5760
5761 l_assigned_flag := 'Y';
5762
5763 ELSIF l_lookup_code_tbl(i) = 70 THEN
5764
5765 IF l_fin_plan_type_id IS NOT NULL THEN
5766 -- Bug 3883406
5767 -- URL to be built for view plan page, depending if the current context is task_summary or resource_summary.
5768 IF (p_page_context = 'VIEWPLAN_TASK' OR p_page_context = 'VIEWPLAN_RESOURCE') THEN
5769 IF ((l_next = 'COST') AND (p_cost_version_id = l_pa_cw_cost_bv_id)) OR
5770 ((l_next = 'REVENUE') AND (p_revenue_version_id = l_pa_cw_revenue_bv_id)) OR
5771 ((l_next = 'ALL') AND ((p_cost_version_id = l_pa_cw_cost_bv_id) AND
5772 (p_revenue_version_id = l_pa_cw_revenue_bv_id))) THEN
5773 l_set_cw_url_flag := 'N';
5774 END IF;
5775 END IF;
5776 ELSE
5777 l_set_cw_url_flag := 'N';
5778 END IF;
5779
5780 IF l_set_cw_url_flag = 'Y' THEN
5781 -- Bug 3883406
5782 -- URL to be built for view plan page, depending if the current context is task_summary or resource_summary.
5783 IF p_page_context = 'VIEWPLAN_TASK' THEN
5784 x_url_tbl(i) := 'OA.jsp?page=/oracle/apps/pji/viewplan/reporting/webui/VPBudgetTaskSumPG&paProjectId='||p_project_id
5785 ||'&paFinTypeId='||l_fin_plan_type_id
5786 ||'&paCstContextVersionId='||l_pa_cw_cost_bv_id
5787 ||'&paRevContextVersionId='||l_pa_cw_revenue_bv_id
5788 ||'&addBreadCrumb=Y&retainAM=N';
5789 ELSIF p_page_context = 'VIEWPLAN_RESOURCE' THEN
5790 x_url_tbl(i) := 'OA.jsp?page=/oracle/apps/pji/viewplan/reporting/webui/VPBudgetResSumPG&paProjectId='||p_project_id
5791 ||'&paFinTypeId='||l_fin_plan_type_id
5792 ||'&paCstContextVersionId='||l_pa_cw_cost_bv_id
5793 ||'&paRevContextVersionId='||l_pa_cw_revenue_bv_id
5794 ||'&addBreadCrumb=Y&retainAM=N';
5795 END IF;
5796 END IF;
5797
5798 IF l_debug_mode = 'Y' THEN
5799 pa_debug.g_err_stage:='l_cw_labor_quantity:'||l_cw_labor_quantity;
5800 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
5801
5802 pa_debug.g_err_stage:='l_cw_equipment_quantity:'||l_cw_equipment_quantity;
5803 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
5804
5805 pa_debug.g_err_stage:='l_cw_cost:'||l_cw_cost;
5806 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
5807
5808 pa_debug.g_err_stage:='l_cw_revenue:'||l_cw_revenue;
5809 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
5810 END IF;
5811
5812
5813 x_equipment_hours_tbl(i) := l_cw_equipment_quantity;
5814 x_labor_hours_tbl(i) := l_cw_labor_quantity;
5815 x_cost_tbl(i) := l_cw_cost;
5816 x_revenue_tbl(i) := l_cw_revenue;
5817 l_assigned_flag := 'Y';
5818
5819 ELSIF l_lookup_code_tbl(i) = 80 THEN
5820 IF l_debug_mode = 'Y' THEN
5821 pa_debug.g_err_stage:='Fetching Data for Change Docs of System Status Approved';
5822 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
5823 END IF;
5824 OPEN c_change_documents_status(p_project_id,
5825 'CI_APPROVED',
5826 l_margin_derived_from_code,
5827 l_report_version_type,
5828 l_appr_rev_cw_version_id); -- Raja review
5829 FETCH c_change_documents_status INTO l_labor_quantity,
5830 l_equipment_quantity,
5831 l_cost,
5832 l_revenue;
5833 CLOSE c_change_documents_status;
5834 IF l_debug_mode = 'Y' THEN
5835 pa_debug.g_err_stage:='l_labor_quantity:'||l_labor_quantity;
5836 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
5837
5838 pa_debug.g_err_stage:='l_equipment_quantity:'||l_equipment_quantity;
5839 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
5840
5841 pa_debug.g_err_stage:='l_cost:'||l_cost;
5842 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
5843
5844 pa_debug.g_err_stage:='l_revenue:'||l_revenue;
5845 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
5846 END IF;
5847
5848 ELSIF l_lookup_code_tbl(i) = 90 THEN
5849 IF l_debug_mode = 'Y' THEN
5850 pa_debug.g_err_stage:='Fetching Data for Change Docs of System Status Working';
5851 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
5852 END IF;
5853 OPEN c_change_documents_status(p_project_id,
5854 'CI_WORKING',
5855 l_margin_derived_from_code,
5856 l_report_version_type,
5857 l_appr_rev_cw_version_id); -- Raja review
5858 FETCH c_change_documents_status INTO l_labor_quantity,
5859 l_equipment_quantity,
5860 l_cost,
5861 l_revenue;
5862 CLOSE c_change_documents_status;
5863 IF l_debug_mode = 'Y' THEN
5864 pa_debug.g_err_stage:='l_labor_quantity:'||l_labor_quantity;
5865 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
5866
5867 pa_debug.g_err_stage:='l_equipment_quantity:'||l_equipment_quantity;
5868 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
5869
5870 pa_debug.g_err_stage:='l_cost:'||l_cost;
5871 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
5872
5873 pa_debug.g_err_stage:='l_revenue:'||l_revenue;
5874 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
5875 END IF;
5876
5877 ELSIF l_lookup_code_tbl(i) = 100 THEN
5878 IF l_debug_mode = 'Y' THEN
5879 pa_debug.g_err_stage:='Fetching Data for Change Docs of System Status Submitted';
5880 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
5881 END IF;
5882 OPEN c_change_documents_status(p_project_id,
5883 'CI_SUBMITTED',
5884 l_margin_derived_from_code,
5885 l_report_version_type,
5886 l_appr_rev_cw_version_id); -- Raja review
5887 FETCH c_change_documents_status INTO l_labor_quantity,
5888 l_equipment_quantity,
5889 l_cost,
5890 l_revenue;
5891 CLOSE c_change_documents_status;
5892 IF l_debug_mode = 'Y' THEN
5893 pa_debug.g_err_stage:='l_labor_quantity:'||l_labor_quantity;
5894 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
5895
5896 pa_debug.g_err_stage:='l_equipment_quantity:'||l_equipment_quantity;
5897 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
5898
5899 pa_debug.g_err_stage:='l_cost:'||l_cost;
5900 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
5901
5902 pa_debug.g_err_stage:='l_revenue:'||l_revenue;
5903 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
5904 END IF;
5905
5906 ELSIF l_lookup_code_tbl(i) = 110 THEN
5907 IF l_debug_mode = 'Y' THEN
5908 pa_debug.g_err_stage:='Fetching Data for Projected Total';
5909 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
5910 END IF;
5911 x_equipment_hours_tbl(i) := x_equipment_hours_tbl(i-4) +
5912 x_equipment_hours_tbl(i-3) +
5913 x_equipment_hours_tbl(i-2) +
5914 x_equipment_hours_tbl(i-1);
5915 x_labor_hours_tbl(i) := x_labor_hours_tbl(i-4) +
5916 x_labor_hours_tbl(i-3) +
5917 x_labor_hours_tbl(i-2) +
5918 x_labor_hours_tbl(i-1);
5919 x_cost_tbl(i) := x_cost_tbl(i-4) +
5920 x_cost_tbl(i-3) +
5921 x_cost_tbl(i-2) +
5922 x_cost_tbl(i-1);
5923 x_revenue_tbl(i) := x_revenue_tbl(i-4) +
5924 x_revenue_tbl(i-3) +
5925 x_revenue_tbl(i-2) +
5926 x_revenue_tbl(i-1);
5927 l_assigned_flag := 'Y';
5928 END IF;
5929
5930 IF l_assigned_flag = 'N' THEN
5931 x_equipment_hours_tbl(i) := l_equipment_quantity;
5932 x_labor_hours_tbl(i) := l_labor_quantity;
5933 x_cost_tbl(i) := l_cost;
5934 x_revenue_tbl(i) := l_revenue;
5935 END IF;
5936
5937 l_assigned_flag := 'N';
5938
5939 END LOOP;
5940 END IF;
5941
5942 IF l_debug_mode = 'Y' THEN
5943 pa_debug.g_err_stage:='Deriving Margin and Margin Percent';
5944 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
5945 END IF;
5946
5947 l_row_count := x_summary_tbl.COUNT;
5948 IF l_row_count > 0 THEN
5949 x_margin_tbl.extend(l_row_count);
5950 x_margin_percent_tbl.extend(l_row_count);
5951 FOR i IN x_cost_tbl.FIRST .. x_cost_tbl.LAST LOOP
5952 x_margin_tbl(i) := x_revenue_tbl(i) - x_cost_tbl(i);
5953 IF x_revenue_tbl(i) <> 0 THEN
5954 x_margin_percent_tbl(i) := (x_margin_tbl(i)/x_revenue_tbl(i))*100;
5955 ELSE
5956 x_margin_percent_tbl(i) := 0;
5957 END IF;
5958 END LOOP;
5959 END IF;
5960
5961 /* Bug 4038253 : returning the report_labor_hrs_from_code attribute for the version
5962 if the preference code of the plan type is COST_AND_REVENUE_SEP, otherwise returning null*/
5963 IF l_context = 'COST' OR l_context = 'REVENUE' THEN
5964
5965 l_report_labor_hrs_code := null;
5966 BEGIN
5967 -- getting the preference code of the plan type for the budget version
5968 SELECT fin_plan_preference_code,
5969 report_labor_hrs_from_code
5970 INTO l_pref_code_for_pt_of_ver,
5971 l_report_labor_hrs_code
5972 FROM pa_proj_fp_options
5973 WHERE project_id = p_project_id
5974 AND fin_plan_type_id = l_fin_plan_type_id
5975 AND fin_plan_option_level_code = 'PLAN_TYPE';
5976 EXCEPTION
5977 WHEN NO_DATA_FOUND THEN
5978 null;
5979 END;
5980
5981 IF l_pref_code_for_pt_of_ver = 'COST_AND_REV_SEP' THEN
5982 x_report_labor_hrs_code := l_report_labor_hrs_code;
5983 ELSE
5984 x_report_labor_hrs_code := null;
5985 END IF;
5986 END IF; /* COST or REVENUE version */
5987 /* Bug 4038253 :ends */
5988
5989 pa_debug.reset_curr_function;
5990
5991 EXCEPTION
5992 WHEN PA_FP_CONSTANTS_PKG.Just_Ret_Exc THEN
5993 IF l_debug_mode = 'Y' THEN
5994 pa_debug.g_err_stage:='Exiting out as there are insufficient Parameters..'||SQLERRM;
5995 pa_debug.write('get_summary_data: ' || g_module_name,pa_debug.g_err_stage,5);
5996 END IF;
5997 pa_debug.reset_curr_function;
5998 RETURN;
5999
6000 WHEN PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc THEN
6001 l_msg_count := FND_MSG_PUB.count_msg;
6002 IF l_msg_count = 1 THEN
6003 PA_INTERFACE_UTILS_PUB.get_messages
6004 (p_encoded => FND_API.G_TRUE
6005 ,p_msg_index => 1
6006 ,p_msg_count => l_msg_count
6007 ,p_msg_data => l_msg_data
6008 ,p_data => l_data
6009 ,p_msg_index_out => l_msg_index_out);
6010 x_msg_data := l_data;
6011 x_msg_count := l_msg_count;
6012 ELSE
6013 x_msg_count := l_msg_count;
6014 END IF;
6015 x_return_status := FND_API.G_RET_STS_ERROR;
6016 pa_debug.reset_curr_function;
6017 RETURN;
6018
6019 WHEN OTHERS THEN
6020 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6021 x_msg_count := 1;
6022 x_msg_data := SQLERRM;
6023 FND_MSG_PUB.add_exc_msg( p_pkg_name => 'PA_FP_CONTROL_ITEMS_UTILS'
6024 ,p_procedure_name => 'get_summary_data');
6025
6026 IF l_debug_mode = 'Y' THEN
6027 pa_debug.g_err_stage:='Unexpected Error'||SQLERRM;
6028 pa_debug.write('get_summary_data: ' || g_module_name,pa_debug.g_err_stage,5);
6029 END IF;
6030 pa_debug.reset_curr_function;
6031 RAISE;
6032
6033 END get_summary_data;
6034
6035
6036
6037
6038 --------------------------------------------------------------------------------
6039 -- Please note that this function is called for Include Change Doc Page PLSql Apis
6040 -- View included Change Doc PlSql APIs, VO Queries, Change Doc Merge Apis
6041
6042 -- 07-Jun-2004 Raja Added new input parameter p_pt_ct_version_type b/c for 'ALL'
6043 -- change order versions, there would be two records in pa_pt_co_impl_statuses
6044 -- table and so the view returns PA_FP_ELIGIBLE_CI_V two records.
6045 -- How to avoid double count here? If ci_version is 'ALL' and target version is
6046 -- also 'ALL', then compute quantity only if p_pt_ct_version_type is 'COST' as
6047 -- in this case Quantity gets merged along with cost amounts
6048
6049 -- Note: In some cases, p_pt_ct_version_type is passed as null in this case
6050 -- values are returned without bothering about double count.
6051 --------------------------------------------------------------------------------
6052 FUNCTION get_labor_qty_partial(
6053 p_version_type IN pa_budget_versions.version_type%TYPE, -- This is the CI version type
6054 p_budget_version_id IN pa_budget_versions.budget_version_id%TYPE,
6055 p_ci_version_id IN pa_budget_versions.budget_version_id%TYPE,
6056 p_labor_qty IN pa_budget_versions.labor_quantity%TYPE DEFAULT NULL, -- CI qty
6057 p_pt_ct_version_type IN pa_pt_co_impl_statuses.version_type%TYPE DEFAULT NULL
6058 )
6059 RETURN NUMBER
6060 IS
6061 l_debug_mode VARCHAR2(30);
6062 l_module_name VARCHAR2(30) := 'ctrl_utils.lab_qty_prtial';
6063 l_source_version_type pa_budget_versions.version_type%TYPE;
6064 l_target_version_type pa_budget_versions.version_type%TYPE;
6065 l_impl_qty_exists VARCHAR2(1) := 'N';
6066 l_revenue_partial_flag varchar2(1) := 'N';
6067 l_return_quantity PA_BUDGET_VERSIONS.LABOR_QUANTITY%TYPE;
6068 l_partial_quantity PA_BUDGET_VERSIONS.LABOR_QUANTITY%TYPE;
6069 l_labor_quantity PA_BUDGET_VERSIONS.LABOR_QUANTITY%TYPE;
6070 l_appr_rev_cw_version_id PA_BUDGET_VERSIONS.BUDGET_VERSION_ID%TYPE;
6071 BEGIN
6072 fnd_profile.get('PA_DEBUG_MODE',l_debug_mode);
6073 IF l_debug_mode = 'Y' THEN
6074 pa_debug.g_err_stage:='In get_labor_qty_partial - pa_fp_control_items_utils ';
6075 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
6076 END IF;
6077
6078 -------------------------------
6079 -- Fetching source version type
6080 -------------------------------
6081 IF p_version_type IS NULL THEN
6082 IF l_debug_mode = 'Y' THEN
6083 pa_debug.g_err_stage:='fetching source version type';
6084 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
6085 END IF;
6086 BEGIN
6087 SELECT VERSION_TYPE
6088 INTO l_source_version_type
6089 FROM PA_BUDGET_VERSIONS
6090 WHERE BUDGET_VERSION_ID = p_ci_version_id;
6091 EXCEPTION
6092 WHEN NO_DATA_FOUND THEN
6093 IF l_debug_mode = 'Y' THEN
6094 pa_debug.g_err_stage:='source version does not exist';
6095 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
6096 END IF;
6097 RAISE;
6098 END;
6099 ELSE
6100 l_source_version_type := p_version_type;
6101 END IF;
6102
6103 -------------------------------
6104 -- Fetching target version type
6105 -------------------------------
6106 IF l_debug_mode = 'Y' THEN
6107 pa_debug.g_err_stage:='fetching target version type';
6108 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
6109 END IF;
6110 BEGIN
6111 SELECT VERSION_TYPE
6112 INTO l_target_version_type
6113 FROM PA_BUDGET_VERSIONS
6114 WHERE BUDGET_VERSION_ID = p_budget_version_id;
6115 EXCEPTION
6116 WHEN NO_DATA_FOUND THEN
6117 IF l_debug_mode = 'Y' THEN
6118 pa_debug.g_err_stage:='target version does not exist';
6119 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
6120 END IF;
6121 RAISE;
6122 END;
6123
6124 -----------------------------------
6125 -- Fetching labor quantity
6126 -----------------------------------
6127 IF p_labor_qty IS NULL THEN
6128 IF l_debug_mode = 'Y' THEN
6129 pa_debug.g_err_stage:='Fetching labor quantity';
6130 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
6131 END IF;
6132 BEGIN
6133 SELECT labor_quantity
6134 INTO l_labor_quantity
6135 FROM PA_BUDGET_VERSIONS
6136 WHERE BUDGET_VERSION_ID = p_ci_version_id;
6137 EXCEPTION
6138 WHEN NO_DATA_FOUND THEN
6139 IF l_debug_mode = 'Y' THEN
6140 pa_debug.g_err_stage:='source version does not exist';
6141 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
6142 END IF;
6143 RAISE;
6144 END;
6145 ELSE
6146 l_labor_quantity := p_labor_qty;
6147 END IF;
6148
6149 ----------------------------------------
6150 -- Deriving qty based on source version
6151 ----------------------------------------
6152 IF l_source_version_type = 'COST' THEN
6153 IF l_target_version_type = 'COST' OR l_target_version_type = 'ALL' THEN
6154 BEGIN
6155 SELECT 'Y'
6156 INTO l_impl_qty_exists
6157 FROM DUAL
6158 WHERE EXISTS (SELECT 1
6159 FROM PA_FP_MERGED_CTRL_ITEMS
6160 WHERE CI_PLAN_VERSION_ID = p_ci_version_id
6161 AND PLAN_VERSION_ID = p_budget_version_id
6162 AND VERSION_TYPE = 'COST');
6163 EXCEPTION
6164 WHEN NO_DATA_FOUND THEN
6165 l_impl_qty_exists := 'N';
6166 END;
6167
6168 IF l_impl_qty_exists = 'Y' THEN
6169 RETURN 0;
6170 ELSE
6171 RETURN l_labor_quantity;
6172 END IF;
6173 ELSE
6174 RETURN 0;
6175 END IF;
6176
6177 ELSIF l_source_version_type = 'REVENUE' THEN
6178 IF l_target_version_type = 'COST'
6179 OR l_target_version_type = 'ALL' -- Raja review
6180 -- For ALL versions Quantity is computed from Cost Versions only
6181 THEN
6182 RETURN 0;
6183 ELSIF l_target_version_type = 'REVENUE' -- Raja review OR l_target_version_type = 'ALL'
6184 THEN
6185 BEGIN
6186 IF l_debug_mode = 'Y' THEN
6187 pa_debug.g_err_stage:='Check if record exits in pa_fp_merged_ctl_items';
6188 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
6189 END IF;
6190 SELECT 'Y'
6191 INTO l_impl_qty_exists
6192 FROM DUAL
6193 WHERE EXISTS (SELECT 1
6194 FROM PA_FP_MERGED_CTRL_ITEMS A
6195 WHERE A.CI_PLAN_VERSION_ID = P_CI_VERSION_ID
6196 AND A.PLAN_VERSION_ID = P_BUDGET_VERSION_ID
6197 AND A.VERSION_TYPE = 'REVENUE');
6198 EXCEPTION
6199 WHEN NO_DATA_FOUND THEN
6200 RETURN l_labor_quantity;
6201 END;
6202 ------------------------------------------------
6203 -- If record exists then check for partial flag
6204 ------------------------------------------------
6205 IF l_impl_qty_exists = 'Y' THEN
6206 BEGIN
6207 SELECT NVL(B.REV_PARTIALLY_IMPL_FLAG,'N') , A.IMPL_QUANTITY
6208 INTO l_revenue_partial_flag, l_partial_quantity
6209 FROM PA_FP_MERGED_CTRL_ITEMS A , PA_BUDGET_VERSIONS B
6210 WHERE A.CI_PLAN_VERSION_ID = p_ci_version_id
6211 AND A.PLAN_VERSION_ID = p_budget_version_id
6212 AND A.VERSION_TYPE = 'REVENUE'
6213 AND B.BUDGET_VERSION_ID = A.CI_PLAN_VERSION_ID;
6214
6215 EXCEPTION
6216 WHEN NO_DATA_FOUND THEN
6217 NULL;
6218 END;
6219
6220 IF l_revenue_partial_flag = 'Y' THEN
6221
6222 --Moved the code here to fetch the aprroved revenue current working budget
6223 --version when source and target version type is 'REVENUE' and
6224 --when l_impl_qty_exists = 'Y'
6225 --For bug 3902176
6226 ----------------------------------------------------------------
6227 -- Fetching the approved revenue current working budget version
6228 ----------------------------------------------------------------
6229 IF l_debug_mode = 'Y' THEN
6230 pa_debug.g_err_stage:='fetching the approved revenue current working version';
6231 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
6232 END IF;
6233 BEGIN
6234 SELECT A.BUDGET_VERSION_ID
6235 INTO l_appr_rev_cw_version_id
6236 FROM PA_BUDGET_VERSIONS A
6237 WHERE A.PROJECT_ID = (SELECT B.PROJECT_ID FROM PA_BUDGET_VERSIONS B
6238 WHERE B.BUDGET_VERSION_ID = p_budget_version_id)
6239 AND A.VERSION_TYPE IN ('REVENUE', 'ALL')
6240 -- Raja review A.VERSION_TYPE = 'REVENUE'
6241 AND A.APPROVED_REV_PLAN_TYPE_FLAG = 'Y'
6242 AND CURRENT_WORKING_FLAG = 'Y'
6243 AND A.CI_ID IS NULL;
6244 -- AND A.BUDGET_STATUS_CODE in ('S','W'); -- Bug#3815378
6245
6246 EXCEPTION
6247 WHEN NO_DATA_FOUND THEN
6248 NULL;
6249 END;
6250
6251 IF p_budget_version_id = l_appr_rev_cw_version_id THEN
6252 l_return_quantity := l_labor_quantity - l_partial_quantity;
6253 ELSE
6254 l_return_quantity := 0;
6255 END IF;
6256 RETURN l_return_quantity;
6257 ELSIF l_revenue_partial_flag ='N' THEN
6258 l_return_quantity := 0;
6259 RETURN l_return_quantity;
6260 END IF;
6261 END IF;
6262 END IF;
6263
6264 ELSIF l_source_version_type = 'ALL' THEN
6265 IF l_target_version_type = 'COST' OR
6266 (l_target_version_type = 'ALL' AND nvl(p_pt_ct_version_type,'COST') = 'COST') THEN
6267 -- To avoid double count check for pt_ct_version_type
6268 BEGIN
6269 SELECT 'Y'
6270 INTO l_impl_qty_exists
6271 FROM DUAL
6272 WHERE EXISTS (SELECT 1
6273 FROM PA_FP_MERGED_CTRL_ITEMS
6274 WHERE CI_PLAN_VERSION_ID = p_ci_version_id
6275 AND PLAN_VERSION_ID = p_budget_version_id
6276 AND VERSION_TYPE = 'COST');
6277 EXCEPTION
6278 WHEN NO_DATA_FOUND THEN
6279 l_impl_qty_exists := 'N';
6280 END;
6281
6282 IF l_impl_qty_exists = 'Y' THEN
6283 RETURN 0;
6284 ELSE
6285 RETURN l_labor_quantity;
6286 END IF;
6287 -- Bug 3678063 this case is missing
6288 ELSIF l_target_version_type = 'ALL' AND nvl(p_pt_ct_version_type,'COST') <> 'COST' THEN
6289 RETURN 0;
6290 ELSIF l_target_version_type = 'REVENUE' THEN
6291 -- For bug 3902176
6292 -- Commented out the code to
6293 -- Return 0 if Source Version = 'ALL' and Target Version 'REVENUE'
6294 RETURN 0;
6295
6296 /*
6297 BEGIN
6298 IF l_debug_mode = 'Y' THEN
6299 pa_debug.g_err_stage:='Check if record exits in pa_fp_merged_ctl_items';
6300 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
6301 END IF;
6302 SELECT 'Y'
6303 INTO l_impl_qty_exists
6304 FROM DUAL
6305 WHERE EXISTS (SELECT 1
6306 FROM PA_FP_MERGED_CTRL_ITEMS A
6307 WHERE A.CI_PLAN_VERSION_ID = P_CI_VERSION_ID
6308 AND A.PLAN_VERSION_ID = P_BUDGET_VERSION_ID
6309 AND A.VERSION_TYPE = 'REVENUE');
6310 EXCEPTION
6311 WHEN NO_DATA_FOUND THEN
6312 RETURN l_labor_quantity;
6313 END;
6314 ------------------------------------------------
6315 -- If record exists then check for partial flag
6316 ------------------------------------------------
6317 IF l_impl_qty_exists = 'Y' THEN
6318 BEGIN
6319 SELECT NVL(B.REV_PARTIALLY_IMPL_FLAG,'N') , A.IMPL_QUANTITY
6320 INTO l_revenue_partial_flag, l_partial_quantity
6321 FROM PA_FP_MERGED_CTRL_ITEMS A , PA_BUDGET_VERSIONS B
6322 WHERE A.CI_PLAN_VERSION_ID = p_ci_version_id
6323 AND A.PLAN_VERSION_ID = p_budget_version_id
6324 AND A.VERSION_TYPE = 'REVENUE'
6325 AND B.BUDGET_VERSION_ID = A.CI_PLAN_VERSION_ID;
6326 EXCEPTION
6327 WHEN NO_DATA_FOUND THEN
6328 NULL;
6329 END;
6330 IF l_revenue_partial_flag = 'Y' THEN
6331 IF p_budget_version_id = l_appr_rev_cw_version_id THEN
6332 l_return_quantity := l_labor_quantity - l_partial_quantity;
6333 ELSE
6334 l_return_quantity := 0;
6335 END IF;
6336 RETURN l_return_quantity;
6337 ELSIF l_revenue_partial_flag ='N' THEN
6338 l_return_quantity := 0;
6339 RETURN l_return_quantity;
6340 END IF;
6341 END IF; */
6342 END IF;
6343 END IF;
6344 END get_labor_qty_partial;
6345
6346 --------------------------------------------------------------------------------
6347 -- Please note that this function is called for Include Change Doc Page PLSql Apis
6348 -- View included Change Doc PlSql APIs, VO Queries, Change Doc Merge Apis
6349
6350 -- 07-Jun-2004 Raja Added new input parameter p_pt_ct_version_type b/c for 'ALL'
6351 -- change order versions, there would be two records in pa_pt_co_impl_statuses
6352 -- table and so the view returns PA_FP_ELIGIBLE_CI_V two records.
6353 -- How to avoid double count here? If ci_version is 'ALL' and target version is
6354 -- also 'ALL', then compute quantity only if p_pt_ct_version_type is 'COST' as
6355 -- in this case Quantity gets merged along with cost amounts
6356
6357 -- Note: In some cases, p_pt_ct_version_type is passed as null in this case
6358 -- values are returned without bothering about double count.
6359
6360 --------------------------------------------------------------------------------
6361
6362 FUNCTION get_equip_qty_partial(
6363 p_version_type IN pa_budget_versions.version_type%TYPE, -- This is the CI version type
6364 p_budget_version_id IN pa_budget_versions.budget_version_id%TYPE,
6365 p_ci_version_id IN pa_budget_versions.budget_version_id%TYPE,
6366 p_equip_qty IN pa_budget_versions.equipment_quantity%TYPE DEFAULT NULL, -- CI qty
6367 p_pt_ct_version_type IN pa_pt_co_impl_statuses.version_type%TYPE DEFAULT NULL
6368 )
6369 RETURN NUMBER
6370 IS
6371 l_debug_mode VARCHAR2(30);
6372 l_module_name VARCHAR2(30) := 'ctrl_utils.equip_qty_prtial';
6373 l_source_version_type pa_budget_versions.version_type%TYPE;
6374 l_target_version_type pa_budget_versions.version_type%TYPE;
6375 l_impl_qty_exists VARCHAR2(1) := 'N';
6376 l_revenue_partial_flag varchar2(1) := 'N';
6377 l_return_quantity PA_BUDGET_VERSIONS.EQUIPMENT_QUANTITY%TYPE;
6378 l_partial_quantity PA_BUDGET_VERSIONS.EQUIPMENT_QUANTITY%TYPE;
6379 l_equip_quantity PA_BUDGET_VERSIONS.EQUIPMENT_QUANTITY%TYPE;
6380 l_appr_rev_cw_version_id PA_BUDGET_VERSIONS.BUDGET_VERSION_ID%TYPE;
6381 BEGIN
6382 fnd_profile.get('PA_DEBUG_MODE',l_debug_mode);
6383 IF l_debug_mode = 'Y' THEN
6384 pa_debug.g_err_stage:='In get_equip_qty_partial - pa_fp_control_items_utils ';
6385 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
6386 END IF;
6387
6388 -------------------------------
6389 -- Fetching source version type
6390 -------------------------------
6391 IF p_version_type IS NULL THEN
6392 IF l_debug_mode = 'Y' THEN
6393 pa_debug.g_err_stage:='fetching source version type';
6394 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
6395 END IF;
6396 BEGIN
6397 SELECT VERSION_TYPE
6398 INTO l_source_version_type
6399 FROM PA_BUDGET_VERSIONS
6400 WHERE BUDGET_VERSION_ID = p_ci_version_id;
6401 EXCEPTION
6402 WHEN NO_DATA_FOUND THEN
6403 IF l_debug_mode = 'Y' THEN
6404 pa_debug.g_err_stage:='source version does not exist';
6405 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
6406 END IF;
6407 RAISE;
6408 END;
6409 ELSE
6410 l_source_version_type := p_version_type;
6411 END IF;
6412
6413 -------------------------------
6414 -- Fetching target version type
6415 -------------------------------
6416 IF l_debug_mode = 'Y' THEN
6417 pa_debug.g_err_stage:='fetching target version type';
6418 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
6419 END IF;
6420 BEGIN
6421 SELECT VERSION_TYPE
6422 INTO l_target_version_type
6423 FROM PA_BUDGET_VERSIONS
6424 WHERE BUDGET_VERSION_ID = p_budget_version_id;
6425 EXCEPTION
6426 WHEN NO_DATA_FOUND THEN
6427 IF l_debug_mode = 'Y' THEN
6428 pa_debug.g_err_stage:='target version does not exist';
6429 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
6430 END IF;
6431 RAISE;
6432 END;
6433
6434 -----------------------------------
6435 -- Fetching equipment quantity
6436 -----------------------------------
6437 IF p_equip_qty IS NULL THEN
6438 IF l_debug_mode = 'Y' THEN
6439 pa_debug.g_err_stage:='Fetching equipment quantity';
6440 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
6441 END IF;
6442 BEGIN
6443 SELECT EQUIPMENT_QUANTITY
6444 INTO l_equip_quantity
6445 FROM PA_BUDGET_VERSIONS
6446 WHERE BUDGET_VERSION_ID = p_ci_version_id;
6447 EXCEPTION
6448 WHEN NO_DATA_FOUND THEN
6449 IF l_debug_mode = 'Y' THEN
6450 pa_debug.g_err_stage:='source version does not exist';
6451 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
6452 END IF;
6453 RAISE;
6454 END;
6455 ELSE
6456 l_equip_quantity := p_equip_qty;
6457 END IF;
6458
6459 ----------------------------------------
6460 -- Deriving qty based on source version
6461 ----------------------------------------
6462 IF l_source_version_type = 'COST' THEN
6463 IF l_target_version_type = 'COST' OR l_target_version_type = 'ALL' THEN
6464 BEGIN
6465 SELECT 'Y'
6466 INTO l_impl_qty_exists
6467 FROM DUAL
6468 WHERE EXISTS (SELECT 1
6469 FROM PA_FP_MERGED_CTRL_ITEMS
6470 WHERE CI_PLAN_VERSION_ID = p_ci_version_id
6471 AND PLAN_VERSION_ID = p_budget_version_id
6472 AND VERSION_TYPE = 'COST');
6473 EXCEPTION
6474 WHEN NO_DATA_FOUND THEN
6475 l_impl_qty_exists := 'N';
6476 END;
6477
6478 IF l_impl_qty_exists = 'Y' THEN
6479 RETURN 0;
6480 ELSE
6481 RETURN l_equip_quantity;
6482 END IF;
6483 ELSE
6484 RETURN 0;
6485 END IF;
6486
6487 ELSIF l_source_version_type = 'REVENUE' THEN
6488 IF l_target_version_type = 'COST'
6489 OR l_target_version_type = 'ALL' THEN -- Raja review
6490 -- For ALL versions Quantity is computed from Cost Versions only
6491 RETURN 0;
6492 ELSIF l_target_version_type = 'REVENUE' -- Raja review OR l_target_version_type = 'ALL'
6493 THEN
6494 BEGIN
6495 IF l_debug_mode = 'Y' THEN
6496 pa_debug.g_err_stage:='Check if record exits in pa_fp_merged_ctl_items';
6497 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
6498 END IF;
6499 SELECT 'Y'
6500 INTO l_impl_qty_exists
6501 FROM DUAL
6502 WHERE EXISTS (SELECT 1
6503 FROM PA_FP_MERGED_CTRL_ITEMS A
6504 WHERE A.CI_PLAN_VERSION_ID = P_CI_VERSION_ID
6505 AND A.PLAN_VERSION_ID = P_BUDGET_VERSION_ID
6506 AND A.VERSION_TYPE = 'REVENUE');
6507 EXCEPTION
6508 WHEN NO_DATA_FOUND THEN
6509 RETURN l_equip_quantity;
6510 END;
6511 ------------------------------------------------
6512 -- If record exists then check for partial flag
6513 ------------------------------------------------
6514 IF l_impl_qty_exists = 'Y' THEN
6515 BEGIN
6516 SELECT NVL(B.REV_PARTIALLY_IMPL_FLAG,'N') , A.IMPL_EQUIPMENT_QUANTITY
6517 INTO l_revenue_partial_flag, l_partial_quantity
6518 FROM PA_FP_MERGED_CTRL_ITEMS A , PA_BUDGET_VERSIONS B
6519 WHERE A.CI_PLAN_VERSION_ID = p_ci_version_id
6520 AND A.PLAN_VERSION_ID = p_budget_version_id
6521 AND A.VERSION_TYPE = 'REVENUE'
6522 AND B.BUDGET_VERSION_ID = A.CI_PLAN_VERSION_ID;
6523
6524 EXCEPTION
6525 WHEN NO_DATA_FOUND THEN
6526 NULL;
6527 END;
6528
6529 IF l_revenue_partial_flag = 'Y' THEN
6530
6531 --For bug 3902176
6532 --Moved the code here to fect aprroved rev CW version when
6533 --source and target version both are 'REVENUE'
6534 --and l_impl_quantity = 'Y'
6535 ----------------------------------------------------------------
6536 -- Fetching the approved revenue currenct working budget version
6537 ----------------------------------------------------------------
6538 IF l_debug_mode = 'Y' THEN
6539 pa_debug.g_err_stage:='fetching the approved revenue current working version';
6540 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
6541 END IF;
6542
6543 BEGIN
6544 SELECT A.BUDGET_VERSION_ID
6545 INTO l_appr_rev_cw_version_id
6546 FROM PA_BUDGET_VERSIONS A
6547 WHERE A.PROJECT_ID = (SELECT B.PROJECT_ID FROM PA_BUDGET_VERSIONS B
6548 WHERE B.BUDGET_VERSION_ID = p_budget_version_id)
6549 AND A.VERSION_TYPE = 'REVENUE'
6550 AND A.APPROVED_REV_PLAN_TYPE_FLAG = 'Y'
6551 AND CURRENT_WORKING_FLAG = 'Y'
6552 AND A.CI_ID IS NULL;
6553 -- AND A.BUDGET_STATUS_CODE in ('S','W'); -- Bug#3815378
6554
6555 EXCEPTION
6556 WHEN NO_DATA_FOUND THEN
6557 NULL;
6558 END;
6559
6560 IF p_budget_version_id = l_appr_rev_cw_version_id THEN
6561 l_return_quantity := l_equip_quantity - l_partial_quantity;
6562 ELSE
6563 l_return_quantity := 0;
6564 END IF;
6565 RETURN l_return_quantity;
6566 ELSIF l_revenue_partial_flag ='N' THEN
6567 l_return_quantity := 0;
6568 RETURN l_return_quantity;
6569 END IF;
6570 END IF;
6571 END IF;
6572
6573 ELSIF l_source_version_type = 'ALL' THEN
6574 IF l_target_version_type = 'COST' OR
6575 (l_target_version_type = 'ALL' AND nvl(p_pt_ct_version_type,'COST') = 'COST') THEN
6576 -- To avoid double count check for pt_ct_version_type
6577 BEGIN
6578 SELECT 'Y'
6579 INTO l_impl_qty_exists
6580 FROM DUAL
6581 WHERE EXISTS (SELECT 1
6582 FROM PA_FP_MERGED_CTRL_ITEMS
6583 WHERE CI_PLAN_VERSION_ID = p_ci_version_id
6584 AND PLAN_VERSION_ID = p_budget_version_id
6585 AND VERSION_TYPE = 'COST');
6586 EXCEPTION
6587 WHEN NO_DATA_FOUND THEN
6588 l_impl_qty_exists := 'N';
6589 END;
6590
6591 IF l_impl_qty_exists = 'Y' THEN
6592 RETURN 0;
6593 ELSE
6594 RETURN l_equip_quantity;
6595 END IF;
6596 -- Bug 3678063 this case is missing
6597 ELSIF l_target_version_type = 'ALL' AND nvl(p_pt_ct_version_type,'COST') <> 'COST' THEN
6598 RETURN 0;
6599 ELSIF l_target_version_type = 'REVENUE' THEN
6600 RETURN 0;
6601 --Commented out the below part for bug 3902176
6602 --And returning 0 instead when Source Version ='ALL'
6603 --And Target Version = 'REVENUE'.
6604
6605 /*
6606 BEGIN
6607 IF l_debug_mode = 'Y' THEN
6608 pa_debug.g_err_stage:='Check if record exits in pa_fp_merged_ctl_items';
6609 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
6610 END IF;
6611 SELECT 'Y'
6612 INTO l_impl_qty_exists
6613 FROM DUAL
6614 WHERE EXISTS (SELECT 1
6615 FROM PA_FP_MERGED_CTRL_ITEMS A
6616 WHERE A.CI_PLAN_VERSION_ID = P_CI_VERSION_ID
6617 AND A.PLAN_VERSION_ID = P_BUDGET_VERSION_ID
6618 AND A.VERSION_TYPE = 'REVENUE');
6619 EXCEPTION
6620 WHEN NO_DATA_FOUND THEN
6621 RETURN l_equip_quantity;
6622 END;
6623 ------------------------------------------------
6624 -- If record exists then check for partial flag
6625 ------------------------------------------------
6626 IF l_impl_qty_exists = 'Y' THEN
6627 BEGIN
6628 SELECT NVL(B.REV_PARTIALLY_IMPL_FLAG,'N') , A.IMPL_EQUIPMENT_QUANTITY
6629 INTO l_revenue_partial_flag, l_partial_quantity
6630 FROM PA_FP_MERGED_CTRL_ITEMS A , PA_BUDGET_VERSIONS B
6631 WHERE A.CI_PLAN_VERSION_ID = p_ci_version_id
6632 AND A.PLAN_VERSION_ID = p_budget_version_id
6633 AND A.VERSION_TYPE = 'REVENUE'
6634 AND B.BUDGET_VERSION_ID = A.CI_PLAN_VERSION_ID;
6635 EXCEPTION
6636 WHEN NO_DATA_FOUND THEN
6637 NULL;
6638 END;
6639 IF l_revenue_partial_flag = 'Y' THEN
6640 IF p_budget_version_id = l_appr_rev_cw_version_id THEN
6641 l_return_quantity := l_equip_quantity - l_partial_quantity;
6642 ELSE
6643 l_return_quantity := 0;
6644 END IF;
6645 RETURN l_return_quantity;
6646 ELSIF l_revenue_partial_flag ='N' THEN
6647 l_return_quantity := 0;
6648 RETURN l_return_quantity;
6649 END IF;
6650 END IF;
6651 */
6652 END IF;
6653 END IF;
6654 END get_equip_qty_partial;
6655
6656 ----------------------------------------------------------------------------------
6657 -- Please note that this function is called for Include Change Doc Page PLSql Apis
6658 -- View included Change Doc PlSql APIs, VO Queries, Change Doc Merge Apis
6659
6660 -- 07-Jun-2004 Raja Added new input parameter p_pt_ct_version_type b/c for 'ALL'
6661 -- change order versions, there would be two records in pa_pt_co_impl_statuses
6662 -- table and so the view returns PA_FP_ELIGIBLE_CI_V two records. To avoid double
6663 -- count revenue amount would be returned only if p_pt_ct_version_type is 'REVENUE'
6664
6665 -- Note: In some cases, p_pt_ct_version_type is passed as null in this case
6666 -- values are returned without bothering about double count.
6667 -----------------------------------------------------------------------------------
6668
6669 FUNCTION get_pc_revenue_partial (
6670 p_version_type IN pa_budget_versions.version_type%TYPE, -- version type of CI
6671 p_budget_version_id IN pa_budget_versions.budget_version_id%TYPE,
6672 p_ci_version_id IN pa_budget_versions.budget_version_id%TYPE,
6673 p_revenue IN pa_budget_versions.total_project_revenue%TYPE DEFAULT NULL,
6674 p_pt_ct_version_type IN pa_pt_co_impl_statuses.version_type%TYPE DEFAULT NULL
6675 )
6676 RETURN NUMBER
6677 IS
6678 l_return_revenue NUMBER :=0;
6679 l_partial_revenue NUMBER :=0;
6680 l_revenue NUMBER := 0;
6681 l_revenue_partial_flag VARCHAR2(1);
6682 l_debug_mode VARCHAR2(30);
6683 l_module_name VARCHAR2(30) := 'ctrl_utils.rev_prtial';
6684 l_exists VARCHAR2(1) := 'N';
6685 l_appr_rev_cw_version_id PA_BUDGET_VERSIONS.BUDGET_VERSION_ID%TYPE;
6686 l_budget_version_type pa_budget_versions.version_type%TYPE;
6687 l_version_type pa_budget_versions.version_type%TYPE;
6688 -- Bug 5845142
6689 l_ci_app_rev_flag pa_budget_versions.approved_rev_plan_type_flag%TYPE;
6690 BEGIN
6691
6692 fnd_profile.get('PA_DEBUG_MODE',l_debug_mode);
6693
6694 IF l_debug_mode = 'Y' THEN
6695 pa_debug.g_err_stage:='In get_pc_revenue_partial - pa_fp_control_items_utils ';
6696 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
6697 END IF;
6698
6699 ----------------------------------------------------------------
6700 -- Return 0 if p_pt_ct_version_type is 'COST'
6701 ----------------------------------------------------------------
6702 IF p_pt_ct_version_type IS NOT NULL AND p_pt_ct_version_type = 'COST' THEN
6703 return 0;
6704 END IF;
6705
6706 --Bug 5845142
6707 SELECT NVL(approved_rev_plan_type_flag,'N')
6708 INTO l_ci_app_rev_flag
6709 FROM pa_budget_versions
6710 WHERE BUDGET_VERSION_ID = p_ci_version_id;
6711
6712 --Bug 5845142
6713 IF l_ci_app_rev_flag = 'N' THEN
6714 RETURN 0;
6715 END IF;
6716
6717 IF p_revenue IS NULL THEN
6718 BEGIN
6719 SELECT TOTAL_PROJECT_REVENUE
6720 INTO l_revenue
6721 FROM PA_BUDGET_VERSIONS
6722 WHERE BUDGET_VERSION_ID = p_ci_version_id;
6723 EXCEPTION
6724 WHEN NO_DATA_FOUND THEN
6725 IF l_debug_mode = 'Y' THEN
6726 pa_debug.g_err_stage:='In get_pc_revenue_partial - no budget version';
6727 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
6728 END IF;
6729 RAISE;
6730 END;
6731 ELSE
6732 l_revenue := p_revenue;
6733 END IF;
6734
6735 BEGIN
6736 IF l_debug_mode = 'Y' THEN
6737 pa_debug.g_err_stage:='Check if record exits in pa_fp_merged_ctl_items';
6738 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
6739 END IF;
6740 SELECT 'Y'
6741 INTO l_exists
6742 FROM DUAL
6743 WHERE EXISTS (SELECT 1
6744 FROM PA_FP_MERGED_CTRL_ITEMS A
6745 WHERE A.CI_PLAN_VERSION_ID = P_CI_VERSION_ID
6746 AND A.PLAN_VERSION_ID = P_BUDGET_VERSION_ID
6747 AND A.VERSION_TYPE = 'REVENUE');
6748 EXCEPTION
6749 WHEN NO_DATA_FOUND THEN
6750 RETURN l_revenue;
6751 END;
6752
6753 ----------------------------------------------------------------
6754 -- Fetching the version type of the source(CI) if not passed.
6755 ----------------------------------------------------------------
6756 If p_version_type is NULL THEN
6757 BEGIN
6758 SELECT VERSION_TYPE
6759 INTO l_version_type
6760 FROM PA_BUDGET_VERSIONS
6761 WHERE BUDGET_VERSION_ID = p_ci_version_id;
6762 EXCEPTION
6763 WHEN NO_DATA_FOUND THEN
6764 IF l_debug_mode = 'Y' THEN
6765 pa_debug.g_err_stage:='In get_pc_revenue_partial - no version type of source';
6766 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
6767 END IF;
6768 RAISE;
6769 END;
6770 ELSE
6771 l_version_type := p_version_type;
6772 END IF;
6773
6774 ----------------------------------------------------------------
6775 -- Fetching the version type of the target(budget version)
6776 ----------------------------------------------------------------
6777 BEGIN
6778 SELECT VERSION_TYPE
6779 INTO l_budget_version_type
6780 FROM PA_BUDGET_VERSIONS
6781 WHERE BUDGET_VERSION_ID = p_budget_version_id;
6782 EXCEPTION
6783 WHEN NO_DATA_FOUND THEN
6784 IF l_debug_mode = 'Y' THEN
6785 pa_debug.g_err_stage:='In get_pc_revenue_partial - no version type of target';
6786 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
6787 END IF;
6788 RAISE;
6789 END;
6790
6791 --For bug 3902176
6792 --Return 0 if either the source or target version type is 'COST'
6793 IF l_version_type ='COST' OR l_budget_version_type = 'COST' THEN
6794 return 0;
6795 END IF;
6796
6797
6798
6799 IF l_version_type = 'ALL' OR l_version_type = 'REVENUE' THEN
6800 IF l_exists = 'Y' THEN
6801 BEGIN
6802 SELECT NVL(B.REV_PARTIALLY_IMPL_FLAG,'N') , A.IMPL_PROJ_REVENUE
6803 INTO l_revenue_partial_flag, l_partial_revenue
6804 FROM PA_FP_MERGED_CTRL_ITEMS A , PA_BUDGET_VERSIONS B
6805 WHERE A.CI_PLAN_VERSION_ID = p_ci_version_id
6806 AND A.PLAN_VERSION_ID = p_budget_version_id
6807 AND A.VERSION_TYPE = 'REVENUE'
6808 AND B.BUDGET_VERSION_ID = A.CI_PLAN_VERSION_ID;
6809
6810 EXCEPTION
6811 WHEN NO_DATA_FOUND THEN
6812 NULL;
6813 END;
6814
6815
6816
6817 IF l_revenue_partial_flag = 'Y' THEN
6818
6819 --For bug 3902176
6820 --Moved the code to fetch approved revenue CW budget version
6821 --when p_version_type = 'ALL' OR p_version_type = 'REVENUE' along
6822 --with l_exists = 'Y'
6823
6824 ----------------------------------------------------------------
6825 -- Fetching the approved revenue budget currenct working version
6826 ----------------------------------------------------------------
6827 IF l_debug_mode = 'Y' THEN
6828 pa_debug.g_err_stage:='fetching the approved revenue current working version';
6829 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
6830 END IF;
6831
6832 BEGIN
6833 SELECT A.BUDGET_VERSION_ID
6834 INTO l_appr_rev_cw_version_id
6835 FROM PA_BUDGET_VERSIONS A
6836 WHERE A.PROJECT_ID = (SELECT B.PROJECT_ID FROM PA_BUDGET_VERSIONS B
6837 WHERE B.BUDGET_VERSION_ID = p_budget_version_id)
6838 AND A.VERSION_TYPE IN('ALL', 'REVENUE')
6839 -- Raja review AND A.VERSION_TYPE IN('REVENUE')
6840 AND A.APPROVED_REV_PLAN_TYPE_FLAG = 'Y'
6841 AND CURRENT_WORKING_FLAG = 'Y'
6842 AND A.CI_ID IS NULL;
6843 -- AND A.BUDGET_STATUS_CODE in ('S','W'); -- Bug#3815378
6844
6845 EXCEPTION
6846 WHEN NO_DATA_FOUND THEN
6847 NULL;
6848 END;
6849
6850 IF p_budget_version_id = l_appr_rev_cw_version_id THEN
6851 l_return_revenue := l_revenue - l_partial_revenue;
6852 ELSE
6853 l_return_revenue := 0;
6854 END IF;
6855 ELSIF l_revenue_partial_flag ='N' THEN
6856 l_return_revenue := 0;
6857 END IF;
6858
6859 ELSIF l_exists = 'N' THEN
6860 RETURN l_revenue;
6861 END IF;
6862
6863 END IF;
6864
6865 RETURN l_return_revenue;
6866
6867 END get_pc_revenue_partial;
6868
6869 --------------------------------------------------------------------------------
6870 -- Please note that this function is called for Include Change Doc Page PLSql Apis
6871 -- View included Change Doc PlSql APIs, VO Queries, Change Doc Merge Apis
6872
6873 -- 07-Jun-2004 Raja Added new input parameter p_pt_ct_version_type b/c for 'ALL'
6874 -- change order versions, there would be two records in pa_pt_co_impl_statuses
6875 -- table and so the view returns PA_FP_ELIGIBLE_CI_V two records. To avoid double
6876 -- count cost amount would be returned only if p_pt_ct_version_type is 'COST'
6877
6878 -- Note: In some cases, p_pt_ct_version_type is passed as null in this case
6879 -- values are returned without bothering about double count.
6880 --------------------------------------------------------------------------------
6881 FUNCTION get_pc_cost (
6882 p_version_type IN pa_budget_versions.version_type%TYPE, -- this is the ci version type
6883 p_budget_version_id IN pa_budget_versions.budget_version_id%TYPE,
6884 p_ci_version_id IN pa_budget_versions.budget_version_id%TYPE,
6885 p_raw_cost IN pa_budget_versions.total_project_raw_cost%TYPE DEFAULT NULL,
6886 p_burdened_cost IN pa_budget_versions.total_project_burdened_cost%TYPE DEFAULT NULL,
6887 p_pt_ct_version_type IN pa_pt_co_impl_statuses.version_type%TYPE DEFAULT NULL
6888 )
6889 RETURN NUMBER
6890 IS
6891 l_return_cost NUMBER :=0;
6892 l_margin_derived_from_code pa_proj_fp_options.margin_derived_from_code%TYPE;
6893 l_debug_mode VARCHAR2(30);
6894 l_module_name VARCHAR2(30) := 'ctrl_utils.get_pc_cost';
6895 l_budget_version_type pa_budget_versions.version_type%TYPE;
6896 l_version_type pa_budget_versions.version_type%TYPE;
6897 l_cost pa_budget_versions.total_project_raw_cost%TYPE;
6898
6899 BEGIN
6900
6901 fnd_profile.get('PA_DEBUG_MODE',l_debug_mode);
6902
6903 IF l_debug_mode = 'Y' THEN
6904 pa_debug.g_err_stage:='In get_pc_cost - pa_fp_control_items_utils ';
6905 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
6906 END IF;
6907
6908 ----------------------------------------------------------------
6909 -- Return 0 if p_pt_ct_version_type is 'REVENUE'
6910 ----------------------------------------------------------------
6911 IF p_pt_ct_version_type IS NOT NULL AND p_pt_ct_version_type = 'REVENUE' THEN
6912 return 0;
6913 END IF;
6914
6915 -----------------------------------------
6916 -- Fetching the margin dervied from code.
6917 -- Changed the select stmt for bug 3902176
6918 -- to fetch l_margin_derived_from_code with
6919 -- respect to ci_version_id
6920 -----------------------------------------
6921
6922 SELECT nvl(MARGIN_DERIVED_FROM_CODE,'B')
6923 INTO l_margin_derived_from_code
6924 FROM PA_PROJ_FP_OPTIONS a
6925 WHERE a.FIN_PLAN_VERSION_ID = p_ci_version_id
6926 AND a.fin_plan_option_level_code = 'PLAN_VERSION';
6927
6928 ----------------------------------------------------------------
6929 -- Fetching the version type of the source(CI) if not passed.
6930 ----------------------------------------------------------------
6931 If p_version_type is NULL THEN
6932 BEGIN
6933 SELECT VERSION_TYPE
6934 INTO l_version_type
6935 FROM PA_BUDGET_VERSIONS
6936 WHERE BUDGET_VERSION_ID = p_ci_version_id;
6937 EXCEPTION
6938 WHEN NO_DATA_FOUND THEN
6939 IF l_debug_mode = 'Y' THEN
6940 pa_debug.g_err_stage:='In get_pc_cost - no version type of source';
6941 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
6942 END IF;
6943 RAISE;
6944 END;
6945 ELSE
6946 l_version_type := p_version_type;
6947 END IF;
6948
6949 ----------------------------------------------------------------
6950 -- Fetching the version type of the target(budget version)
6951 ----------------------------------------------------------------
6952 BEGIN
6953 SELECT VERSION_TYPE
6954 INTO l_budget_version_type
6955 FROM PA_BUDGET_VERSIONS
6956 WHERE BUDGET_VERSION_ID = p_budget_version_id;
6957 EXCEPTION
6958 WHEN NO_DATA_FOUND THEN
6959 IF l_debug_mode = 'Y' THEN
6960 pa_debug.g_err_stage:='In get_pc_cost - no version type of target';
6961 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
6962 END IF;
6963 RAISE;
6964 END;
6965
6966
6967 -- For bug 3902176
6968 --Return 0 if the version type of either source or target is revenue.
6969 IF l_version_type ='REVENUE' OR l_budget_version_type = 'REVENUE' THEN
6970 return 0;
6971 END IF;
6972
6973 --For bug 3902176
6974 --Assigning l_cost to either p_raw_cost or p_burdened_cost based on the
6975 --fetched margin_derived_from_code
6976 IF l_margin_derived_from_code = 'R' Then
6977 l_cost:= p_raw_cost;
6978 ELSIF
6979 l_margin_derived_from_code = 'B' Then
6980 l_cost:= p_burdened_cost;
6981 END IF;
6982
6983 ----------------------------------------------------------------
6984 -- Fetching the raw cost or burdened cost if not passed
6985 -- depending on margin derived from code value(For bug 3902176)
6986 ----------------------------------------------------------------
6987 /* Begin changes for bug 8507605 - commented code as there is no reason to
6988 * get the cost of the budget when CO's cost is NULL
6989 IF l_cost is NULL THEN
6990 BEGIN
6991 Select decode(l_margin_derived_from_code,
6992 'R',total_project_raw_cost
6993 ,total_project_burdened_cost)
6994 INTO l_cost
6995 FROM PA_BUDGET_VERSIONS
6996 WHERE BUDGET_VERSION_ID = p_budget_version_id;
6997
6998 EXCEPTION
6999 WHEN NO_DATA_FOUND THEN
7000 IF l_debug_mode = 'Y' THEN
7001 pa_debug.g_err_stage:='In get_pc_cost - couldnt get raw or burdened cost';
7002 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
7003 END IF;
7004 RAISE;
7005 END;
7006 END IF;
7007 * End changes for bug 8507605 */
7008
7009
7010 IF l_version_type = 'ALL' or l_version_type = 'COST' THEN
7011 BEGIN
7012 Select l_cost
7013 into l_return_cost
7014 from dual
7015 where not exists (Select 1
7016 from pa_fp_merged_ctrl_items
7017 where plan_version_id = p_budget_version_id
7018 and version_type = 'COST'
7019 and ci_plan_version_id = p_ci_version_id);
7020
7021 EXCEPTION
7022 WHEN NO_DATA_FOUND THEN
7023 l_return_cost := 0;
7024 IF l_debug_mode = 'Y' THEN
7025 pa_debug.g_err_stage:='In get_pc_cost - NO_DATA_FOUND ';
7026 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
7027 END IF;
7028 END;
7029
7030 ELSIF l_version_type = 'REVENUE' THEN
7031 l_return_cost := 0;
7032 END IF;
7033
7034 IF l_debug_mode = 'Y' THEN
7035 pa_debug.g_err_stage:='In get_pc_cost - l_return_cost ' || l_return_cost;
7036 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
7037 END IF;
7038
7039 return l_return_cost;
7040 END get_pc_cost;
7041
7042 PROCEDURE get_not_included
7043 ( p_project_id IN NUMBER
7044 ,p_budget_version_id IN pa_budget_versions.budget_version_id%TYPE
7045 ,p_fin_plan_type_id IN pa_budget_versions.fin_plan_type_id%TYPE
7046 ,p_version_type IN pa_budget_versions.version_type%TYPE
7047 ,x_summary_tbl OUT NOCOPY SYSTEM.PA_VARCHAR2_150_TBL_TYPE --File.Sql.39 bug 4440895
7048 ,x_equipment_hours_tbl OUT NOCOPY SYSTEM.PA_NUM_TBL_TYPE --File.Sql.39 bug 4440895
7049 ,x_labor_hours_tbl OUT NOCOPY SYSTEM.PA_NUM_TBL_TYPE --File.Sql.39 bug 4440895
7050 ,x_cost_tbl OUT NOCOPY SYSTEM.PA_NUM_TBL_TYPE --File.Sql.39 bug 4440895
7051 ,x_revenue_tbl OUT NOCOPY SYSTEM.PA_NUM_TBL_TYPE --File.Sql.39 bug 4440895
7052 ,x_margin_tbl OUT NOCOPY SYSTEM.PA_NUM_TBL_TYPE --File.Sql.39 bug 4440895
7053 ,x_margin_percent_tbl OUT NOCOPY SYSTEM.PA_NUM_TBL_TYPE --File.Sql.39 bug 4440895
7054 ,x_return_status OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
7055 ,x_msg_count OUT NOCOPY NUMBER --File.Sql.39 bug 4440895
7056 ,x_msg_data OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
7057 ) IS
7058
7059 --Start of variables used for debugging
7060 l_msg_count NUMBER :=0;
7061 l_data VARCHAR2(2000);
7062 l_msg_data VARCHAR2(2000);
7063 l_error_msg_code VARCHAR2(30);
7064 l_msg_index_out NUMBER;
7065 l_return_status VARCHAR2(2000);
7066 l_debug_mode VARCHAR2(30);
7067 --End of variables used for debugging
7068
7069 l_row_count NUMBER := 0;
7070 l_version_type PA_BUDGET_VERSIONS.VERSION_TYPE%TYPE;
7071 l_fin_plan_type_id PA_PROJ_FP_OPTIONS.FIN_PLAN_TYPE_ID%TYPE;
7072 l_labor_quantity PA_BUDGET_VERSIONS.LABOR_QUANTITY%TYPE;
7073 l_equipment_quantity PA_BUDGET_VERSIONS.EQUIPMENT_QUANTITY%TYPE;
7074 l_cost PA_BUDGET_VERSIONS.RAW_COST%TYPE;
7075 l_revenue PA_BUDGET_VERSIONS.REVENUE%TYPE;
7076 l_lookup_code_tbl SYSTEM.PA_NUM_TBL_TYPE := SYSTEM.PA_NUM_TBL_TYPE();
7077 l_assigned_flag VARCHAR2(1) := 'N';
7078 l_module_name VARCHAR2(30) := 'ctrl_itm_utls.get_not_incl';
7079
7080
7081 CURSOR c_lookup_summary IS
7082 SELECT MEANING,to_number(LOOKUP_CODE)
7083 FROM PA_LOOKUPS
7084 WHERE LOOKUP_TYPE = 'PA_FP_CI_NOT_INCLUDED'
7085 ORDER BY to_number(LOOKUP_CODE);
7086
7087 -- In the cursor c_change_documents_status, all the select column sums have been wrapped up
7088 -- with nvl beacuse, the select is not reporting a %NOTFOUND because of use of group funcs
7089 -- here, and we wish to return 0 values for all amounts/quantity for null cases
7090
7091 --Any cursor change may be required to be incorporated in PaFpCiIncludeChangeOrderVO.xml as well.
7092 --Changed this cursor for bug 3902176
7093
7094 CURSOR c_change_documents_status(
7095 c_system_status_code PA_CI_STATUSES_V.PROJECT_SYSTEM_STATUS_CODE%TYPE,
7096 c_budget_version_id PA_BUDGET_VERSIONS.BUDGET_VERSION_ID%TYPE,
7097 c_project_id PA_PROJECTS_ALL.PROJECT_ID%TYPE,
7098 c_fin_plan_type_id PA_BUDGET_VERSIONS.FIN_PLAN_TYPE_ID%TYPE,
7099 c_version_type PA_BUDGET_VERSIONS.VERSION_TYPE%TYPE) IS
7100 select nvl(sum(nvl(PA_FP_CONTROL_ITEMS_UTILS.get_labor_qty_partial(
7101 pfca.CI_VERSION_TYPE,
7102 c_budget_version_id,
7103 pfca.CI_VERSION_ID,
7104 pfca.people_effort,
7105 pfca.PT_CT_VERSION_TYPE),0)),0) as people_effort
7106 ,nvl(sum(nvl(PA_FP_CONTROL_ITEMS_UTILS.get_equip_qty_partial(
7107 pfca.CI_VERSION_TYPE,
7108 c_budget_version_id,
7109 pfca.CI_VERSION_ID,
7110 pfca.equipment_effort,
7111 pfca.PT_CT_VERSION_TYPE),0)),0) as equipment_effort
7112 ,nvl(sum(nvl(PA_FP_CONTROL_ITEMS_UTILS.get_pc_cost(
7113 pfca.CI_VERSION_TYPE,
7114 c_budget_version_id,
7115 pfca.CI_VERSION_ID,
7116 pfca.RAW_COST,
7117 pfca.BURDENED_COST,
7118 pfca.PT_CT_VERSION_TYPE),0)),0) as cost
7119 ,nvl(sum(nvl(PA_FP_CONTROL_ITEMS_UTILS.get_pc_revenue_partial(
7120 pfca.CI_VERSION_TYPE,
7121 c_budget_version_id,
7122 pfca.CI_VERSION_ID,
7123 pfca.REVENUE,
7124 pfca.PT_CT_VERSION_TYPE),0)),0) as revenue
7125 from PA_FP_ELIGIBLE_CI_V pfca
7126 where pfca.project_id = c_project_id
7127 and pfca.fin_plan_type_id = c_fin_plan_type_id
7128 and pfca.CI_VERSION_TYPE <>
7129 decode(c_version_type,'COST','REVENUE','REVENUE','COST','ALL','-99')
7130 and decode (pfca.CI_VERSION_TYPE,'ALL',
7131 pfca.PT_CT_VERSION_TYPE,pfca.CI_VERSION_TYPE) = pfca.PT_CT_VERSION_TYPE
7132 -- 3572880 below join necessary when target version type is COST/REV and ci version type
7133 -- is ALL to avoid REV/COST impacts
7134 and pfca.PT_CT_VERSION_TYPE
7135 = decode (c_version_type, 'ALL', pfca.PT_CT_VERSION_TYPE, c_version_type)
7136 and pfca.PROJECT_SYSTEM_STATUS_CODE = c_system_status_code
7137 and ( pfca.REV_PARTIALLY_IMPL_FLAG='Y'
7138 or (pfca.ci_version_type='ALL'
7139 AND DECODE(c_version_type,'ALL',2,1) > (SELECT COUNT(*)
7140 FROM pa_fp_merged_ctrl_items merge1
7141 where merge1.ci_plan_version_id = pfca.ci_version_id
7142 and merge1.plan_version_id = c_budget_version_id
7143 and merge1.project_id = c_project_id))
7144 or (pfca.ci_version_type <> 'ALL'
7145 AND not exists (Select 'X'
7146 from pa_fp_merged_ctrl_items merge2
7147 where merge2.ci_plan_version_id = pfca.ci_version_id
7148 and merge2.plan_version_id = c_budget_version_id
7149 and merge2.version_type = pfca.ci_version_type
7150 and merge2.project_id = c_project_id)));
7151
7152 BEGIN
7153
7154 fnd_profile.get('PA_DEBUG_MODE',l_debug_mode);
7155 x_msg_count := 0;
7156 x_return_status := FND_API.G_RET_STS_SUCCESS;
7157 PA_DEBUG.Set_Curr_Function( p_function => l_module_name,
7158 p_debug_mode => l_debug_mode );
7159
7160
7161 -----------------------------------------------------------------------------
7162 -- Validate Input Params, p_project_id and p_budget_version_id cannot be null
7163 -----------------------------------------------------------------------------
7164
7165 IF l_debug_mode = 'Y' THEN
7166 pa_debug.g_err_stage:='Validating input parameters - project id and budget version id: ' || p_project_id;
7167 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
7168 END IF;
7169
7170 IF (p_project_id IS NULL) THEN
7171 IF l_debug_mode = 'Y' THEN
7172 pa_debug.g_err_stage:='p_project_id is null';
7173 pa_debug.write(l_module_name,pa_debug.g_err_stage,5);
7174 END IF;
7175 PA_UTILS.ADD_MESSAGE(p_app_short_name => 'PA',
7176 p_msg_name => 'PA_FP_INV_PARAM_PASSED');
7177 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
7178 END IF;
7179
7180 IF l_debug_mode = 'Y' THEN
7181 pa_debug.g_err_stage:='p_project_id; '||p_project_id;
7182 pa_debug.write(l_module_name,pa_debug.g_err_stage,5);
7183 END IF;
7184
7185 IF (p_budget_version_id IS NULL) THEN
7186 IF l_debug_mode = 'Y' THEN
7187 pa_debug.g_err_stage:='p_budget_version_id is null';
7188 pa_debug.write(l_module_name,pa_debug.g_err_stage,5);
7189 END IF;
7190 PA_UTILS.ADD_MESSAGE(p_app_short_name => 'PA',
7191 p_msg_name => 'PA_FP_INV_PARAM_PASSED');
7192 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
7193 END IF;
7194
7195 IF l_debug_mode = 'Y' THEN
7196 pa_debug.g_err_stage:='p_budget_version_id; '||p_budget_version_id;
7197 pa_debug.write(l_module_name,pa_debug.g_err_stage,5);
7198 END IF;
7199
7200 ---------------------------------------------------------
7201 -- Derive version type and fin_plan_type_id if not passed
7202 ---------------------------------------------------------
7203 IF p_version_type is NULL THEN
7204
7205 IF l_debug_mode = 'Y' THEN
7206 pa_debug.g_err_stage:='fetching version type';
7207 pa_debug.write(l_module_name,pa_debug.g_err_stage,5);
7208 END IF;
7209
7210 BEGIN
7211 Select version_type
7212 into l_version_type
7213 from pa_budget_versions
7214 where budget_version_id = p_budget_version_id;
7215
7216 IF l_debug_mode = 'Y' THEN
7217 pa_debug.g_err_stage:='l_version_type; '||l_version_type;
7218 pa_debug.write(l_module_name,pa_debug.g_err_stage,5);
7219 END IF;
7220
7221 EXCEPTION
7222 WHEN NO_DATA_FOUND THEN
7223 IF l_debug_mode = 'Y' THEN
7224 pa_debug.g_err_stage:='p_budget_version_id is invalid - fetching version type';
7225 pa_debug.write(l_module_name,pa_debug.g_err_stage,5);
7226 END IF;
7227 PA_UTILS.ADD_MESSAGE(p_app_short_name => 'PA',
7228 p_msg_name => 'PA_FP_INV_PARAM_PASSED');
7229 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
7230 END;
7231 ELSE
7232 l_version_type := p_version_type;
7233 END IF;
7234
7235
7236 IF p_fin_plan_type_id is NULL THEN
7237
7238 IF l_debug_mode = 'Y' THEN
7239 pa_debug.g_err_stage:='fetching fin plan type id';
7240 pa_debug.write(l_module_name,pa_debug.g_err_stage,5);
7241 END IF;
7242
7243 BEGIN
7244 Select fin_plan_type_id
7245 into l_fin_plan_type_id
7246 from pa_budget_versions
7247 where budget_version_id = p_budget_version_id;
7248
7249 IF l_debug_mode = 'Y' THEN
7250 pa_debug.g_err_stage:='l_fin_plan_type_id; '||l_fin_plan_type_id;
7251 pa_debug.write(l_module_name,pa_debug.g_err_stage,5);
7252 END IF;
7253
7254 EXCEPTION
7255 WHEN NO_DATA_FOUND THEN
7256 IF l_debug_mode = 'Y' THEN
7257 pa_debug.g_err_stage:='p_budget_version_id is invalid - fetching fin plan type id';
7258 pa_debug.write(l_module_name,pa_debug.g_err_stage,5);
7259 END IF;
7260 PA_UTILS.ADD_MESSAGE(p_app_short_name => 'PA',
7261 p_msg_name => 'PA_FP_INV_PARAM_PASSED');
7262 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
7263 END;
7264 ELSE
7265 l_fin_plan_type_id := p_fin_plan_type_id;
7266 END IF;
7267
7268
7269
7270 -------------------------------------------
7271 -- Initialising all tables to empty tables.
7272 -------------------------------------------
7273 IF l_debug_mode = 'Y' THEN
7274 pa_debug.g_err_stage:='Initialising all tables to empty tables.';
7275 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
7276 END IF;
7277 x_summary_tbl := SYSTEM.PA_VARCHAR2_150_TBL_TYPE();
7278 x_equipment_hours_tbl := SYSTEM.pa_num_tbl_type();
7279 x_labor_hours_tbl := SYSTEM.pa_num_tbl_type();
7280 x_cost_tbl := SYSTEM.pa_num_tbl_type();
7281 x_revenue_tbl := SYSTEM.pa_num_tbl_type();
7282 x_margin_tbl := SYSTEM.pa_num_tbl_type();
7283 x_margin_percent_tbl := SYSTEM.pa_num_tbl_type();
7284
7285
7286 ----------------------------------------------------
7287 -- Fetch Lookup_code ,summary and reference details.
7288 ----------------------------------------------------
7289 IF l_debug_mode = 'Y' THEN
7290 pa_debug.g_err_stage:='Fetching lookup data' || p_project_id;
7291 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
7292 END IF;
7293
7294 OPEN c_lookup_summary;
7295 FETCH c_lookup_summary BULK COLLECT INTO x_summary_tbl,l_lookup_code_tbl;
7296 CLOSE c_lookup_summary;
7297
7298
7299
7300 /* The following logic is based on the following assumptions:
7301 The lookup code signifies the data this is being shown in the region as follows:
7302 As of now:
7303 10 Approved Change Documents
7304 20 Working Change Documents
7305 30 Submitted Change Documents
7306 40 Rejected Change Documents
7307 50 Total Change Documents
7308
7309 Disclaimer: Please note that the actual and latest mapping of the above
7310 can be got from pa_lookups as follows:
7311 select lookup_code, meaning
7312 from pa_lookupus
7313 where lookup_type = 'PA_FP_CI_NOT_INCLUDED'
7314 order by to_number(lookup_code);
7315
7316 Description for the lookup type has been updated as well saying that
7317 the code is used as number internally.*/
7318
7319 FOR i IN l_lookup_code_tbl.FIRST .. l_lookup_code_tbl.LAST LOOP
7320
7321
7322
7323 x_equipment_hours_tbl.extend(1);
7324 x_labor_hours_tbl.extend(1);
7325 x_cost_tbl.extend(1);
7326 x_revenue_tbl.extend(1);
7327
7328 IF l_lookup_code_tbl(i) = 10 THEN
7329 IF l_debug_mode = 'Y' THEN
7330 pa_debug.g_err_stage:='Fetching Data for Approved Change Documents';
7331 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
7332 END IF;
7333 OPEN c_change_documents_status('CI_APPROVED',
7334 p_budget_version_id,
7335 p_project_id ,
7336 l_fin_plan_type_id ,
7337 l_version_type );
7338 FETCH c_change_documents_status INTO l_labor_quantity,
7339 l_equipment_quantity,
7340 l_cost,
7341 l_revenue;
7342 CLOSE c_change_documents_status;
7343 IF l_debug_mode = 'Y' THEN
7344 pa_debug.g_err_stage:='l_labor_quantity:'||l_labor_quantity;
7345 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
7346
7347 pa_debug.g_err_stage:='l_equipment_quantity:'||l_equipment_quantity;
7348 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
7349
7350 pa_debug.g_err_stage:='l_cost:'||l_cost;
7351 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
7352
7353 pa_debug.g_err_stage:='l_revenue:'||l_revenue;
7354 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
7355 END IF;
7356
7357 ELSIF l_lookup_code_tbl(i) = 20 THEN
7358 IF l_debug_mode = 'Y' THEN
7359 pa_debug.g_err_stage:='Fetching Data for Working Change Documents';
7360 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
7361 END IF;
7362 OPEN c_change_documents_status('CI_WORKING',
7363 p_budget_version_id,
7364 p_project_id ,
7365 l_fin_plan_type_id ,
7366 l_version_type );
7367 FETCH c_change_documents_status INTO l_labor_quantity,
7368 l_equipment_quantity,
7369 l_cost,
7370 l_revenue;
7371 CLOSE c_change_documents_status;
7372 IF l_debug_mode = 'Y' THEN
7373 pa_debug.g_err_stage:='l_labor_quantity:'||l_labor_quantity;
7374 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
7375
7376 pa_debug.g_err_stage:='l_equipment_quantity:'||l_equipment_quantity;
7377 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
7378
7379 pa_debug.g_err_stage:='l_cost:'||l_cost;
7380 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
7381
7382 pa_debug.g_err_stage:='l_revenue:'||l_revenue;
7383 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
7384 END IF;
7385
7386 ELSIF l_lookup_code_tbl(i) = 30 THEN /* fetching data for COs included into asdfsd prior versions */
7387 IF l_debug_mode = 'Y' THEN
7388 pa_debug.g_err_stage:='Fetching Data for Submitted Change Documents';
7389 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
7390 END IF;
7391 OPEN c_change_documents_status('CI_SUBMITTED',
7392 p_budget_version_id,
7393 p_project_id ,
7394 l_fin_plan_type_id ,
7395 l_version_type );
7396 FETCH c_change_documents_status INTO l_labor_quantity,
7397 l_equipment_quantity,
7398 l_cost,
7399 l_revenue;
7400 CLOSE c_change_documents_status;
7401 IF l_debug_mode = 'Y' THEN
7402 pa_debug.g_err_stage:='l_labor_quantity:'||l_labor_quantity;
7403 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
7404
7405 pa_debug.g_err_stage:='l_equipment_quantity:'||l_equipment_quantity;
7406 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
7407
7408 pa_debug.g_err_stage:='l_cost:'||l_cost;
7409 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
7410
7411 pa_debug.g_err_stage:='l_revenue:'||l_revenue;
7412 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
7413 END IF;
7414
7415 ELSIF l_lookup_code_tbl(i) = 40 THEN
7416 IF l_debug_mode = 'Y' THEN
7417 pa_debug.g_err_stage:='Fetching Data for Rejected Change Documents';
7418 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
7419 END IF;
7420 OPEN c_change_documents_status('CI_REJECTED',
7421 p_budget_version_id,
7422 p_project_id ,
7423 l_fin_plan_type_id ,
7424 l_version_type );
7425 FETCH c_change_documents_status INTO l_labor_quantity,
7426 l_equipment_quantity,
7427 l_cost,
7428 l_revenue;
7429 CLOSE c_change_documents_status;
7430 IF l_debug_mode = 'Y' THEN
7431 pa_debug.g_err_stage:='l_labor_quantity:'||l_labor_quantity;
7432 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
7433
7434 pa_debug.g_err_stage:='l_equipment_quantity:'||l_equipment_quantity;
7435 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
7436
7437 pa_debug.g_err_stage:='l_cost:'||l_cost;
7438 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
7439
7440 pa_debug.g_err_stage:='l_revenue:'||l_revenue;
7441 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
7442 END IF;
7443
7444 ELSIF l_lookup_code_tbl(i) = 50 THEN
7445 IF l_debug_mode = 'Y' THEN
7446 pa_debug.g_err_stage:='Deriving Data for Total Change Documents';
7447 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
7448 END IF;
7449 x_equipment_hours_tbl(i) := x_equipment_hours_tbl(i-1) +
7450 x_equipment_hours_tbl(i-2) +
7451 x_equipment_hours_tbl(i-3) +
7452 x_equipment_hours_tbl(i-4);
7453 x_labor_hours_tbl(i) := x_labor_hours_tbl(i-1) +
7454 x_labor_hours_tbl(i-2) +
7455 x_labor_hours_tbl(i-3) +
7456 x_labor_hours_tbl(i-4);
7457 x_cost_tbl(i) := x_cost_tbl(i-1) +
7458 x_cost_tbl(i-2) +
7459 x_cost_tbl(i-3) +
7460 x_cost_tbl(i-4);
7461 x_revenue_tbl(i) := x_revenue_tbl(i-1) +
7462 x_revenue_tbl(i-2) +
7463 x_revenue_tbl(i-3) +
7464 x_revenue_tbl(i-4);
7465 l_assigned_flag := 'Y';
7466 END IF;
7467
7468 IF l_assigned_flag = 'N' THEN
7469 x_equipment_hours_tbl(i) := l_equipment_quantity;
7470 x_labor_hours_tbl(i) := l_labor_quantity;
7471 x_cost_tbl(i) := l_cost;
7472 x_revenue_tbl(i) := l_revenue;
7473 END IF;
7474
7475 l_assigned_flag := 'N';
7476
7477 END LOOP;
7478
7479 IF l_debug_mode = 'Y' THEN
7480 pa_debug.g_err_stage:='Deriving Margin and Margin Percent';
7481 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
7482 END IF;
7483
7484 l_row_count := x_summary_tbl.COUNT;
7485 IF l_row_count > 0 THEN
7486 x_margin_tbl.extend(l_row_count);
7487 x_margin_percent_tbl.extend(l_row_count);
7488 FOR i IN x_cost_tbl.FIRST .. x_cost_tbl.LAST LOOP
7489 x_margin_tbl(i) := x_revenue_tbl(i) - x_cost_tbl(i);
7490 IF x_revenue_tbl(i) <> 0 THEN
7491 x_margin_percent_tbl(i) := (x_margin_tbl(i)/x_revenue_tbl(i))*100;
7492 ELSE
7493 x_margin_percent_tbl(i) := 0;
7494 END IF;
7495 END LOOP;
7496 END IF;
7497
7498 pa_debug.reset_curr_function;
7499
7500 EXCEPTION
7501 WHEN PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc THEN
7502 l_msg_count := FND_MSG_PUB.count_msg;
7503 IF l_msg_count = 1 THEN
7504 PA_INTERFACE_UTILS_PUB.get_messages
7505 (p_encoded => FND_API.G_TRUE
7506 ,p_msg_index => 1
7507 ,p_msg_count => l_msg_count
7508 ,p_msg_data => l_msg_data
7509 ,p_data => l_data
7510 ,p_msg_index_out => l_msg_index_out);
7511 x_msg_data := l_data;
7512 x_msg_count := l_msg_count;
7513 ELSE
7514 x_msg_count := l_msg_count;
7515 END IF;
7516 x_return_status := FND_API.G_RET_STS_ERROR;
7517 pa_debug.reset_curr_function;
7518 RETURN;
7519
7520 WHEN OTHERS THEN
7521 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
7522 x_msg_count := 1;
7523 x_msg_data := SQLERRM;
7524 FND_MSG_PUB.add_exc_msg( p_pkg_name => 'PA_FP_CONTROL_ITEMS_UTILS'
7525 ,p_procedure_name => 'get_not_included');
7526
7527 IF l_debug_mode = 'Y' THEN
7528 pa_debug.g_err_stage:='Unexpected Error'||SQLERRM;
7529 pa_debug.write('get_not_included: ' || g_module_name,pa_debug.g_err_stage,5);
7530 END IF;
7531 pa_debug.reset_curr_function;
7532 RAISE;
7533
7534 END get_not_included;
7535
7536
7537 /* FP.M -This function checks if any record exists in pa_ci_impacts and if yes then
7538 * returns the impact type code
7539 */
7540 FUNCTION is_impact_exists(p_ci_id IN pa_ci_impacts.ci_id%TYPE)
7541 RETURN VARCHAR2
7542 IS
7543 l_record_count NUMBER;
7544 l_impact_type_code VARCHAR2(30);
7545 l_debug_mode VARCHAR2(30);
7546 l_module_name VARCHAR2(30) := 'is_impact_exists';
7547
7548 l_msg_count NUMBER :=0;
7549 l_data VARCHAR2(2000);
7550 l_msg_data VARCHAR2(2000);
7551 l_msg_index_out NUMBER;
7552
7553 -- Bug 3787977: Introduced the following cursor to get the impact_type_code
7554 CURSOR get_impact_type_csr
7555 IS
7556 SELECT impact_type_code
7557 FROM pa_ci_impacts
7558 WHERE ci_id = p_ci_id
7559 AND impact_type_code IN ('FINPLAN',
7560 'FINPLAN_COST',
7561 'FINPLAN_REVENUE')
7562 ORDER BY impact_type_code;
7563
7564 l_impact_type_tbl PA_PLSQL_DATATYPES.Char30TabTyp;
7565
7566 BEGIN
7567 fnd_profile.get('PA_DEBUG_MODE',l_debug_mode);
7568
7569 IF l_debug_mode = 'Y' THEN
7570 pa_debug.g_err_stage:='In is_impact_exists - pa_fp_control_items_utils ';
7571 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
7572 END IF;
7573 PA_DEBUG.Set_Curr_Function( p_function => l_module_name,
7574 p_debug_mode => l_debug_mode );
7575 OPEN get_impact_type_csr;
7576
7577 FETCH get_impact_type_csr
7578 BULK COLLECT INTO l_impact_type_tbl;
7579
7580 CLOSE get_impact_type_csr;
7581
7582 l_record_count := l_impact_type_tbl.COUNT;
7583
7584 IF l_debug_mode = 'Y' THEN
7585 pa_debug.g_err_stage:='l_record_count is:' || l_record_count;
7586 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
7587 END IF;
7588
7589 IF l_record_count = 0 THEN
7590 IF l_debug_mode = 'Y' THEN
7591 pa_debug.g_err_stage:='No Impact Exists';
7592 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
7593 END IF;
7594
7595 l_impact_type_code := 'NONE';
7596
7597 pa_debug.reset_curr_function;
7598 RETURN l_impact_type_code;
7599 END IF;
7600
7601 IF l_record_count > 0 THEN
7602 IF l_record_count = 1 THEN
7603 IF NOT l_impact_type_tbl(l_impact_type_tbl.FIRST) = 'FINPLAN' THEN
7604 IF P_PA_debug_mode = 'Y' THEN
7605 pa_debug.g_err_stage:='Impact Wrongly Created';
7606 pa_debug.write(l_module_name,pa_debug.g_err_stage,5);
7607 END IF;
7608 pa_debug.reset_curr_function;
7609 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
7610 ELSE
7611 l_impact_type_code := 'FINPLAN';
7612 END IF;
7613 ELSIF l_record_count = 2 THEN
7614 IF l_impact_type_tbl(l_impact_type_tbl.FIRST) = 'FINPLAN' AND
7615 l_impact_type_tbl(l_impact_type_tbl.LAST) = 'FINPLAN_COST' THEN
7616 l_impact_type_code := PA_FP_CONSTANTS_PKG.G_ELEMENT_TYPE_COST;
7617 ELSIF l_impact_type_tbl(l_impact_type_tbl.FIRST) = 'FINPLAN' AND
7618 l_impact_type_tbl(l_impact_type_tbl.LAST) = 'FINPLAN_REVENUE' THEN
7619 l_impact_type_code := PA_FP_CONSTANTS_PKG.G_ELEMENT_TYPE_REVENUE;
7620 END IF;
7621 ELSE
7622 l_impact_type_code := PA_FP_CONSTANTS_PKG.G_ELEMENT_TYPE_BOTH;
7623 END IF;
7624 END IF;
7625 IF l_debug_mode = 'Y' THEN
7626 pa_debug.g_err_stage:='l_impact_type_code is:' || l_impact_type_code;
7627 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
7628 END IF;
7629
7630 pa_debug.reset_curr_function;
7631 RETURN l_impact_type_code;
7632 EXCEPTION
7633 WHEN PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc THEN
7634 l_msg_count := FND_MSG_PUB.count_msg;
7635
7636 IF l_msg_count = 1 THEN
7637 PA_INTERFACE_UTILS_PUB.get_messages
7638 (p_encoded => FND_API.G_TRUE
7639 ,p_msg_index => 1
7640 ,p_msg_count => l_msg_count
7641 ,p_msg_data => l_msg_data
7642 ,p_data => l_data
7643 ,p_msg_index_out => l_msg_index_out);
7644 END IF;
7645 pa_debug.reset_curr_function;
7646 RAISE;
7647 WHEN OTHERS THEN
7648 IF l_debug_mode = 'Y' THEN
7649 pa_debug.g_err_stage:='Unexpected Error'||SQLERRM;
7650 pa_debug.write(l_module_name || g_module_name,pa_debug.g_err_stage,5);
7651 END IF;
7652 pa_debug.reset_curr_function;
7653 RAISE;
7654 END is_impact_exists;
7655
7656 /* FP.M- This function checks for the particular ci type, the Cost Impact or
7657 * Revenue Impact has been enabled for Financial implementation
7658 */
7659 FUNCTION is_fin_impact_enabled(p_ci_id IN pa_control_items.ci_id%TYPE,
7660 p_project_id IN pa_projects_all.project_id%TYPE)
7661 RETURN VARCHAR2
7662 IS
7663
7664 l_ci_type_id NUMBER;
7665 l_fin_impl_flag VARCHAR2(30);
7666 l_cost_impact_flag VARCHAR2(30);
7667 l_rev_impact_flag VARCHAR2(30);
7668 l_debug_mode VARCHAR2(30);
7669 l_module_name VARCHAR2(30) := 'is_fin_impact_enabled';
7670
7671 BEGIN
7672 fnd_profile.get('PA_DEBUG_MODE',l_debug_mode);
7673
7674 IF l_debug_mode = 'Y' THEN
7675 pa_debug.g_err_stage:='is_fin_impact_enabled - pa_fp_control_items_utils ';
7676 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
7677 END IF;
7678 PA_DEBUG.Set_Curr_Function( p_function => l_module_name,
7679 p_debug_mode => l_debug_mode );
7680
7681 BEGIN
7682 SELECT ci_type_id
7683 INTO l_ci_type_id
7684 FROM pa_control_items
7685 WHERE ci_id = p_ci_id
7686 AND project_id = p_project_id;
7687
7688 SELECT cost_impact_flag, revenue_impact_flag
7689 INTO l_cost_impact_flag, l_rev_impact_flag
7690 FROM pa_ci_types_w_finplan_v
7691 WHERE ci_type_id = l_ci_type_id;
7692
7693 EXCEPTION
7694 WHEN NO_DATA_FOUND THEN
7695 IF l_debug_mode = 'Y' THEN
7696 pa_debug.g_err_stage:='No Fin Impact Exists';
7697 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
7698 END IF;
7699
7700 l_fin_impl_flag := 'NONE';
7701
7702 pa_debug.reset_curr_function;
7703 RETURN l_fin_impl_flag;
7704 END;
7705 IF l_cost_impact_flag = 'Y' and l_rev_impact_flag = 'N' THEN
7706 l_fin_impl_flag := PA_FP_CONSTANTS_PKG.G_ELEMENT_TYPE_COST;
7707 ELSIF l_cost_impact_flag = 'N' and l_rev_impact_flag = 'Y' THEN
7708 l_fin_impl_flag := PA_FP_CONSTANTS_PKG.G_ELEMENT_TYPE_REVENUE;
7709 ELSIF l_cost_impact_flag = 'Y' and l_rev_impact_flag = 'Y' THEN
7710 l_fin_impl_flag := PA_FP_CONSTANTS_PKG.G_ELEMENT_TYPE_BOTH;
7711 END IF;
7712
7713 IF l_debug_mode = 'Y' THEN
7714 pa_debug.g_err_stage:='l_fin_impl_flag is:' || l_fin_impl_flag;
7715 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
7716 END IF;
7717
7718 pa_debug.reset_curr_function;
7719 RETURN l_fin_impl_flag;
7720 EXCEPTION
7721 WHEN OTHERS THEN
7722 IF l_debug_mode = 'Y' THEN
7723 pa_debug.g_err_stage:='Unexpected Error'||SQLERRM;
7724 pa_debug.write(l_module_name || g_module_name,pa_debug.g_err_stage,5);
7725 END IF;
7726 pa_debug.reset_curr_function;
7727 RAISE;
7728 END is_fin_impact_enabled;
7729
7730 /* Returns the Ids of the versions created for this Change Document(p_ci_id).
7731 The ID will be NULL if the version can never be there */
7732
7733 --Bug 5845142
7734 PROCEDURE GET_CI_VERSIONS(P_ci_id IN Pa_budget_versions.ci_id%TYPE -- Controm item id of the change document
7735 ,X_cost_budget_version_id OUT NOCOPY Pa_budget_versions.budget_version_id%TYPE -- ID of the cost version associated with the CI --File.Sql.39 bug 4440895
7736 ,X_rev_budget_version_id OUT NOCOPY Pa_budget_versions.budget_version_id%TYPE -- ID of the revenue version associated with the CI --File.Sql.39 bug 4440895
7737 ,X_all_budget_version_id OUT NOCOPY Pa_budget_versions.budget_version_id%TYPE -- ID of the all version associated with the CI --File.Sql.39 bug 4440895
7738 ,x_return_status OUT NOCOPY VARCHAR2 -- Indicates the exit status of the API --File.Sql.39 bug 4440895
7739 ,x_msg_data OUT NOCOPY VARCHAR2 -- Indicates the error occurred --File.Sql.39 bug 4440895
7740 ,X_msg_count OUT NOCOPY NUMBER) -- Indicates the number of error messages --File.Sql.39 bug 4440895
7741 IS
7742 CURSOR c_vers_for_ci IS
7743 SELECT budget_version_id,
7744 Version_type,
7745 approved_cost_plan_type_flag,
7746 approved_rev_plan_type_flag
7747 FROM pa_budget_versions
7748 WHERE ci_id =p_ci_id;
7749
7750 -- Start of variables used for debugging purpose
7751
7752 l_msg_count NUMBER :=0;
7753 l_data VARCHAR2(2000);
7754 l_msg_data VARCHAR2(2000);
7755 l_msg_index_out NUMBER;
7756 l_return_status VARCHAR2(2000);
7757 l_debug_mode VARCHAR2(1);
7758 l_debug_level3 CONSTANT NUMBER := 3;
7759 l_debug_level5 CONSTANT NUMBER := 5;
7760 l_mod_name VARCHAR2(100) := g_module_name || '.GET_CI_VERSIONS' ;
7761 l_token_name VARCHAR2(30) :='PROCEDURENAME';
7762
7763 -- End of variables used for debugging purpose
7764
7765 c_vers_for_ci_rec c_vers_for_ci%ROWTYPE;
7766
7767 BEGIN
7768
7769 pa_debug.set_curr_function( p_function => 'GET_CI_VERSIONS',
7770 p_debug_mode => P_PA_debug_mode );
7771
7772
7773 x_msg_count := 0;
7774 x_return_status := FND_API.G_RET_STS_SUCCESS;
7775
7776 IF (p_ci_id IS NULL)
7777 THEN
7778
7779 IF P_PA_debug_mode = 'Y' THEN
7780 pa_debug.g_err_stage:='Ci_id = '||p_ci_id;
7781 pa_debug.write(l_mod_name,pa_debug.g_err_stage,l_debug_level5);
7782 END IF;
7783
7784
7785 PA_UTILS.ADD_MESSAGE(p_app_short_name => 'PA',
7786 p_msg_name => 'PA_FP_INV_PARAM_PASSED',
7787 p_token1 => l_token_name,
7788 p_value1 => l_mod_name);
7789
7790
7791 IF P_PA_debug_mode = 'Y' THEN
7792 pa_debug.g_err_stage:='Invalid Arguments Passed';
7793 pa_debug.write(l_mod_name,pa_debug.g_err_stage,l_debug_level5);
7794 END IF;
7795 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
7796
7797 END IF;
7798
7799 IF P_PA_debug_mode = 'Y' THEN
7800 pa_debug.g_err_stage:= 'Entering GET_CI_VERSIONS';
7801 pa_debug.write(l_mod_name,pa_debug.g_err_stage,l_debug_level3);
7802 END IF;
7803
7804 X_cost_budget_version_id := NULL;
7805 X_rev_budget_version_id := NULL;
7806 X_all_budget_version_id := NULL;
7807
7808 FOR c_vers_for_ci_rec IN c_vers_for_ci LOOP
7809 IF c_vers_for_ci_rec.version_type = PA_FP_CONSTANTS_PKG.G_ELEMENT_TYPE_COST THEN
7810 X_cost_budget_version_id := c_vers_for_ci_rec.budget_version_id;
7811 ELSIF c_vers_for_ci_rec.version_type = PA_FP_CONSTANTS_PKG.G_ELEMENT_TYPE_REVENUE THEN
7812 X_rev_budget_version_id := c_vers_for_ci_rec.budget_version_id;
7813 ELSIF c_vers_for_ci_rec.version_type = PA_FP_CONSTANTS_PKG.G_ELEMENT_TYPE_ALL THEN
7814
7815 --Bug 5845142. COST impact can be of ALL version type.
7816 IF c_vers_for_ci_rec.approved_cost_plan_type_flag='Y' AND
7817 c_vers_for_ci_rec.approved_rev_plan_type_flag='Y' THEN
7818
7819 X_all_budget_version_id := c_vers_for_ci_rec.budget_version_id;
7820
7821 ELSIF c_vers_for_ci_rec.approved_cost_plan_type_flag='Y' THEN
7822
7823 X_cost_budget_version_id := c_vers_for_ci_rec.budget_version_id;
7824
7825 ELSIF c_vers_for_ci_rec.approved_rev_plan_type_flag='Y' THEN
7826
7827 X_rev_budget_version_id := c_vers_for_ci_rec.budget_version_id;
7828
7829 END IF;
7830 END IF;
7831 END LOOP;
7832
7833 IF P_PA_debug_mode = 'Y' THEN
7834 pa_debug.g_err_stage:= 'Exiting GET_CI_VERSIONS';
7835 pa_debug.write(l_mod_name,pa_debug.g_err_stage,l_debug_level3);
7836 END IF;
7837
7838 pa_debug.reset_curr_function;
7839
7840 EXCEPTION
7841 WHEN PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc THEN
7842 l_msg_count := FND_MSG_PUB.count_msg;
7843
7844 IF l_msg_count = 1 and x_msg_data IS NULL THEN
7845 PA_INTERFACE_UTILS_PUB.get_messages
7846 (p_encoded => FND_API.G_TRUE
7847 ,p_msg_index => 1
7848 ,p_msg_count => l_msg_count
7849 ,p_msg_data => l_msg_data
7850 ,p_data => l_data
7851 ,p_msg_index_out => l_msg_index_out);
7852 x_msg_data := l_data;
7853 x_msg_count := l_msg_count;
7854 ELSE
7855 x_msg_count := l_msg_count;
7856 END IF;
7857 x_return_status := FND_API.G_RET_STS_ERROR;
7858
7859 pa_debug.reset_curr_function;
7860
7861 RETURN;
7862
7863 WHEN Others THEN
7864 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
7865 x_msg_count := 1;
7866 x_msg_data := SQLERRM;
7867
7868 IF c_vers_for_ci%ISOPEN THEN
7869 CLOSE c_vers_for_ci;
7870 END IF;
7871
7872 FND_MSG_PUB.add_exc_msg( p_pkg_name => 'Pa_Fp_Control_Items_Utils'
7873 ,p_procedure_name => 'GET_CI_VERSIONS');
7874 IF P_PA_DEBUG_MODE = 'Y' THEN
7875 pa_debug.g_err_stage:='Unexpected Error ' || SQLERRM;
7876 pa_debug.write(l_mod_name,pa_debug.g_err_stage,l_debug_level5);
7877 END IF;
7878 pa_debug.reset_curr_function;
7879 RAISE;
7880
7881 END GET_CI_VERSIONS;
7882
7883 /* Returns all the plan types attached to a project(excluding work plan and org forecast plan types)
7884 and other information including whether a change order can be implemented into it */
7885 -- Added New Params for Quantity in GET_PLAN_TYPES_FOR_IMPL - Bug 3902176
7886 PROCEDURE GET_PLAN_TYPES_FOR_IMPL
7887 (P_ci_id IN Pa_fin_plan_types_b.fin_plan_type_id%TYPE, -- Id of the Change Document
7888 P_project_id IN Pa_budget_versions.project_id%TYPE, -- Id of the Project
7889 X_pt_id_tbl OUT NOCOPY SYSTEM.pa_num_tbl_type, -- Plsql table for fin plan type ids --File.Sql.39 bug 4440895
7890 X_pt_name_tbl OUT NOCOPY SYSTEM.pa_varchar2_150_tbl_type, -- Plsql table for fin plan type names --File.Sql.39 bug 4440895
7891 x_cost_impact_impl_tbl OUT NOCOPY SYSTEM.pa_varchar2_1_tbl_type, --File.Sql.39 bug 4440895
7892 x_rev_impact_impl_tbl OUT NOCOPY SYSTEM.pa_varchar2_1_tbl_type, --File.Sql.39 bug 4440895
7893 X_cost_impl_tbl OUT NOCOPY SYSTEM.pa_varchar2_1_tbl_type, -- Plsql table for Implement Cost Flag --File.Sql.39 bug 4440895
7894 x_rev_impl_tbl OUT NOCOPY SYSTEM.pa_varchar2_1_tbl_type, -- Plsql table for Implement Rev Flag --File.Sql.39 bug 4440895
7895 X_raw_cost_tbl OUT NOCOPY SYSTEM.pa_num_tbl_type, -- Plsql table for raw cost --File.Sql.39 bug 4440895
7896 X_burd_cost_tbl OUT NOCOPY SYSTEM.pa_num_tbl_type, -- Plsql table for burdened cost --File.Sql.39 bug 4440895
7897 X_revenue_tbl OUT NOCOPY SYSTEM.pa_num_tbl_type, -- Plsql table for revenue --File.Sql.39 bug 4440895
7898 X_labor_hrs_c_tbl OUT NOCOPY SYSTEM.pa_num_tbl_type, -- Plsql table for labor hrs -Cost --File.Sql.39 bug 4440895
7899 X_equipment_hrs_c_tbl OUT NOCOPY SYSTEM.pa_num_tbl_type, -- Plsql tabe for equipment hrs -Cost --File.Sql.39 bug 4440895
7900 X_labor_hrs_r_tbl OUT NOCOPY SYSTEM.pa_num_tbl_type, -- Plsql table for labor hrs -Rev --File.Sql.39 bug 4440895
7901 X_equipment_hrs_r_tbl OUT NOCOPY SYSTEM.pa_num_tbl_type, -- Plsql tabe for equipment hrs -Rev --File.Sql.39 bug 4440895
7902 X_margin_tbl OUT NOCOPY SYSTEM.pa_num_tbl_type, -- Plsql table for margin --File.Sql.39 bug 4440895
7903 X_margin_percent_tbl OUT NOCOPY SYSTEM.pa_num_tbl_type, -- Plsql table for margin percent --File.Sql.39 bug 4440895
7904 X_margin_derived_code_tbl OUT NOCOPY SYSTEM.pa_varchar2_30_tbl_type, -- Plsql table for Margin Derived From Code - Bug 3734840 --File.Sql.39 bug 4440895
7905 x_approved_fin_pt_id OUT NOCOPY Pa_fin_plan_types_b.fin_plan_type_id%TYPE, -- Contains the ID of the approved plan type --File.Sql.39 bug 4440895
7906 X_cost_bv_id_tbl OUT NOCOPY SYSTEM.pa_num_tbl_type, -- Plsql table for cost bv id --File.Sql.39 bug 4440895
7907 X_rev_bv_id_tbl OUT NOCOPY SYSTEM.pa_num_tbl_type, -- Plsql table for revenue bv id --File.Sql.39 bug 4440895
7908 X_all_bv_id_tbl OUT NOCOPY SYSTEM.pa_num_tbl_type, -- Plsql table for all bv id --File.Sql.39 bug 4440895
7909 X_select_flag_tbl OUT NOCOPY SYSTEM.pa_varchar2_1_tbl_type, -- The flag which indicates whether the select flag can be checked by default or not --File.Sql.39 bug 4440895
7910 X_agreement_num OUT NOCOPY Pa_agreements_all.agreement_num%TYPE, -- Agreement number of the agreement --File.Sql.39 bug 4440895
7911 X_partially_impl_flag OUT NOCOPY VARCHAR2, -- A flag that indicates whether a partially implemented CO exists for the plan type or not. Possible values are Y/N --File.Sql.39 bug 4440895
7912 X_cost_ci_version_id OUT NOCOPY Pa_budget_versions.budget_version_id%TYPE, -- Ci cost Budget version id --File.Sql.39 bug 4440895
7913 X_rev_ci_version_id OUT NOCOPY Pa_budget_versions.budget_version_id%TYPE, -- Ci rev Budget version id --File.Sql.39 bug 4440895
7914 X_all_ci_version_id OUT NOCOPY Pa_budget_versions.budget_version_id%TYPE, -- Ci all Budget version id --File.Sql.39 bug 4440895
7915 x_rem_proj_revenue OUT NOCOPY Pa_budget_versions.total_project_revenue%TYPE, -- Remaining revenue amount to be implemented --File.Sql.39 bug 4440895
7916 x_rem_labor_qty OUT NOCOPY Pa_budget_versions.labor_quantity%TYPE, --File.Sql.39 bug 4440895
7917 x_rem_equip_qty OUT NOCOPY pa_budget_versions.equipment_quantity%TYPE, --File.Sql.39 bug 4440895
7918 X_autobaseline_project OUT NOCOPY VARCHAR2, -- This flag will be set to Y if the project is enabled for autobaseline --File.Sql.39 bug 4440895
7919 x_disable_baseline_flag_tbl OUT NOCOPY SYSTEM.pa_varchar2_1_tbl_type, -- Plsql table for Disable Baseline Checkbox Flag -- 3735309 --File.Sql.39 bug 4440895
7920 x_return_status OUT NOCOPY VARCHAR2, -- Indicates the exit status of the API --File.Sql.39 bug 4440895
7921 x_msg_data OUT NOCOPY VARCHAR2, -- Indicates the error occurred --File.Sql.39 bug 4440895
7922 X_msg_count OUT NOCOPY NUMBER) -- Indicates the number of error messages --File.Sql.39 bug 4440895
7923 IS
7924
7925 -- All plan types attached to the project(excluding work plan and org forecast plan types)
7926 CURSOR c_plan_types_attached IS
7927 SELECT fin.name
7928 ,pfo.fin_plan_type_id
7929 ,NVL(pfo.approved_cost_plan_type_flag,'N') approved_cost_plan_type_flag
7930 ,NVL(pfo.approved_rev_plan_type_flag,'N') approved_rev_plan_type_flag
7931 ,fin.plan_class_code
7932 ,pfo.fin_plan_preference_code
7933 FROM pa_fin_plan_types_vl fin,
7934 pa_proj_fp_options pfo
7935 WHERE pfo.project_id = p_project_id
7936 AND pfo.fin_plan_option_level_code = PA_FP_CONSTANTS_PKG.G_OPTION_LEVEL_PLAN_TYPE
7937 AND pfo.fin_plan_type_id = fin.fin_plan_type_id
7938 AND nvl(fin.use_for_workplan_flag,'N') <> 'Y'
7939 And nvl(fin.fin_plan_type_code,'NON-ORG') <> 'ORG_FORECAST'
7940 ORDER BY fin.name;
7941
7942 -- Start of variables used for debugging purpose
7943
7944 l_msg_count NUMBER :=0;
7945 l_data VARCHAR2(2000);
7946 l_msg_data VARCHAR2(2000);
7947 l_msg_index_out NUMBER;
7948 l_return_status VARCHAR2(2000);
7949 l_debug_mode VARCHAR2(1);
7950 l_debug_level3 CONSTANT NUMBER := 3;
7951 l_debug_level5 CONSTANT NUMBER := 5;
7952 l_mod_name VARCHAR2(100) := g_module_name || '.GET_PLAN_TYPES_FOR_IMPL' ;
7953 l_token_name VARCHAR2(30) :='PROCEDURENAME';
7954
7955 -- End of variables used for debugging purpose
7956
7957 i NUMBER; -- The index for the out plsql tbls
7958
7959 c_plan_type_rec c_plan_types_attached%ROWTYPE;
7960
7961 l_cost_impl_flag VARCHAR2(1);
7962 l_rev_impl_flag VARCHAR2(1);
7963 l_impl_full_flag VARCHAR2(1);
7964 l_cost_impact_impl_flag VARCHAR2(1);
7965 l_rev_impact_impl_flag VARCHAR2(1);
7966 l_partially_impl_flag VARCHAR2(1);
7967
7968 l_status_code pa_control_items.status_code%TYPE;
7969 l_ci_type_id pa_control_items.ci_type_id%TYPE;
7970
7971 l_ci_version_type pa_budget_versions.version_type%TYPE;
7972
7973 l_budget_version_id Pa_budget_versions.budget_version_id%TYPE;
7974
7975 l_approved_fin_pt_id Pa_fin_plan_types_b.fin_plan_type_id%TYPE;
7976
7977 -- Version Type ref is not longer required as both Cost and Revenue Quantity Figures are Retrieved and used now -- 3902176
7978 -- l_version_type pa_budget_versions.version_type%TYPE;--Bug 3662077
7979
7980 -- Added for Bug 3735309 - Function Security Check
7981 l_submit_cost VARCHAR2(1);
7982 l_submit_revenue VARCHAR2(1);
7983 l_submit_cost_appr VARCHAR2(1);
7984 l_submit_revenue_appr VARCHAR2(1);
7985 l_submit_cost_forecast VARCHAR2(1);
7986 l_submit_revenue_forecast VARCHAR2(1);
7987 l_render_impl_cost_tbl SYSTEM.pa_varchar2_1_tbl_type := SYSTEM.pa_varchar2_1_tbl_type();
7988 l_render_impl_revenue_tbl SYSTEM.pa_varchar2_1_tbl_type := SYSTEM.pa_varchar2_1_tbl_type();
7989 l_disable_impl_cost_tbl SYSTEM.pa_varchar2_1_tbl_type := SYSTEM.pa_varchar2_1_tbl_type();
7990 l_disable_impl_revenue_tbl SYSTEM.pa_varchar2_1_tbl_type := SYSTEM.pa_varchar2_1_tbl_type();
7991 l_submit_cost_check VARCHAR2(1);
7992 l_submit_revenue_check VARCHAR2(1);
7993
7994 -- Bug 11708214
7995 l_agreement_amount NUMBER;
7996 l_agreement_currency_code pa_agreements_all.agreement_currency_code%TYPE;
7997
7998 BEGIN
7999
8000 fnd_profile.get('PA_DEBUG_MODE',l_debug_mode);
8001 l_debug_mode := NVL(l_debug_mode, 'N');
8002
8003
8004 pa_debug.set_curr_function( p_function => 'GET_PLAN_TYPES_FOR_IMPL',
8005 p_debug_mode => l_debug_mode );
8006
8007
8008 x_msg_count := 0;
8009 x_return_status := FND_API.G_RET_STS_SUCCESS;
8010
8011 -- initialising all the output tables
8012 X_pt_id_tbl := SYSTEM.pa_num_tbl_type();
8013 X_pt_name_tbl := SYSTEM.pa_varchar2_150_tbl_type();
8014 x_cost_impact_impl_tbl := SYSTEM.pa_varchar2_1_tbl_type();
8015 x_rev_impact_impl_tbl := SYSTEM.pa_varchar2_1_tbl_type();
8016 X_cost_impl_tbl := SYSTEM.pa_varchar2_1_tbl_type();
8017 x_rev_impl_tbl := SYSTEM.pa_varchar2_1_tbl_type();
8018 X_raw_cost_tbl := SYSTEM.pa_num_tbl_type();
8019 X_burd_cost_tbl := SYSTEM.pa_num_tbl_type();
8020 X_revenue_tbl := SYSTEM.pa_num_tbl_type();
8021 X_labor_hrs_c_tbl := SYSTEM.pa_num_tbl_type();
8022 X_equipment_hrs_c_tbl := SYSTEM.pa_num_tbl_type();
8023 X_labor_hrs_r_tbl := SYSTEM.pa_num_tbl_type();
8024 X_equipment_hrs_r_tbl := SYSTEM.pa_num_tbl_type();
8025 X_margin_tbl := SYSTEM.pa_num_tbl_type();
8026 X_margin_percent_tbl := SYSTEM.pa_num_tbl_type();
8027 X_cost_bv_id_tbl := SYSTEM.pa_num_tbl_type();
8028 X_rev_bv_id_tbl := SYSTEM.pa_num_tbl_type();
8029 X_all_bv_id_tbl := SYSTEM.pa_num_tbl_type();
8030 X_select_flag_tbl := SYSTEM.pa_varchar2_1_tbl_type();
8031 X_margin_derived_code_tbl := SYSTEM.pa_varchar2_30_tbl_type(); -- Bug 3734840
8032 x_disable_baseline_flag_tbl := SYSTEM.pa_varchar2_1_tbl_type(); -- Bug 3735309
8033 -- Check for business rules violations
8034
8035 IF l_debug_mode = 'Y' THEN
8036 pa_debug.g_err_stage:='Validating input parameters';
8037 pa_debug.write(l_mod_name,pa_debug.g_err_stage,l_debug_level3);
8038 END IF;
8039
8040 -- Check if project id and ci id are null
8041
8042 IF (p_project_id IS NULL) OR
8043 (p_ci_id IS NULL)
8044 THEN
8045
8046
8047 IF l_debug_mode = 'Y' THEN
8048 pa_debug.g_err_stage:='Project_id = '||p_project_id;
8049 pa_debug.write(l_mod_name,pa_debug.g_err_stage,l_debug_level5);
8050
8051 pa_debug.g_err_stage:='Ci_id = '||p_ci_id;
8052 pa_debug.write(l_mod_name,pa_debug.g_err_stage,l_debug_level5);
8053 END IF;
8054
8055
8056 PA_UTILS.ADD_MESSAGE(p_app_short_name => 'PA',
8057 p_msg_name => 'PA_FP_INV_PARAM_PASSED',
8058 p_token1 => l_token_name,
8059 p_value1 => l_mod_name);
8060
8061
8062 IF l_debug_mode = 'Y' THEN
8063 pa_debug.g_err_stage:='Invalid Arguments Passed';
8064 pa_debug.write(l_mod_name,pa_debug.g_err_stage,l_debug_level5);
8065 END IF;
8066 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
8067
8068 END IF;
8069
8070
8071 IF l_debug_mode = 'Y' THEN
8072 pa_debug.g_err_stage:='Fetching Function Security return codes';
8073 pa_debug.write(l_mod_name,pa_debug.g_err_stage,l_debug_level5);
8074 END IF;
8075 -- Fetching Function Security User Privelege for submit for baseline flag
8076 -- "Financials: Project: Budget: Submit Cost"
8077 pa_security_pvt.check_user_privilege(x_ret_code => l_submit_cost,
8078 x_return_status => l_return_status,
8079 x_msg_count => l_msg_count,
8080 x_msg_data => l_msg_data,
8081 p_privilege => 'PA_FP_BDGT_SUB_COST_PLAN',
8082 p_object_name => 'PA_PROJECTS',
8083 p_object_key => P_project_id);
8084
8085 IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
8086 IF l_debug_mode = 'Y' THEN
8087 pa_debug.g_err_stage:= 'Error fetching function security - Submit Cost';
8088 pa_debug.write(l_mod_name,pa_debug.g_err_stage,l_debug_level5);
8089 END IF;
8090 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
8091 END IF;
8092
8093 -- "Financials: Project: Budget: Submit Revenue"
8094 pa_security_pvt.check_user_privilege(x_ret_code => l_submit_revenue,
8095 x_return_status => l_return_status,
8096 x_msg_count => l_msg_count,
8097 x_msg_data => l_msg_data,
8098 p_privilege => 'PA_FP_BDGT_SUB_REV_PLAN',
8099 p_object_name => 'PA_PROJECTS',
8100 p_object_key => P_project_id);
8101 IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
8102 IF l_debug_mode = 'Y' THEN
8103 pa_debug.g_err_stage:= 'Error fetching function security - Submit Revenue';
8104 pa_debug.write(l_mod_name,pa_debug.g_err_stage,l_debug_level5);
8105 END IF;
8106 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
8107 END IF;
8108
8109 -- "Financials: Project: Approved Budget: Submit Cost"
8110 pa_security_pvt.check_user_privilege(x_ret_code => l_submit_cost_appr,
8111 x_return_status => l_return_status,
8112 x_msg_count => l_msg_count,
8113 x_msg_data => l_msg_data,
8114 p_privilege => 'PA_FP_APP_BDGT_SUB_COST_PLAN',
8115 p_object_name => 'PA_PROJECTS',
8116 p_object_key => P_project_id);
8117 IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
8118 IF l_debug_mode = 'Y' THEN
8119 pa_debug.g_err_stage:= 'Error fetching function security - Submit Cost Approved';
8120 pa_debug.write(l_mod_name,pa_debug.g_err_stage,l_debug_level5);
8121 END IF;
8122 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
8123 END IF;
8124
8125 -- "Financials: Project: Approved Budget: Submit Revenue"
8126 pa_security_pvt.check_user_privilege(x_ret_code => l_submit_revenue_appr,
8127 x_return_status => l_return_status,
8128 x_msg_count => l_msg_count,
8129 x_msg_data => l_msg_data,
8130 p_privilege => 'PA_FP_APP_BDGT_SUB_REV_PLAN',
8131 p_object_name => 'PA_PROJECTS',
8132 p_object_key => P_project_id);
8133 IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
8134 IF l_debug_mode = 'Y' THEN
8135 pa_debug.g_err_stage:= 'Error fetching function security - Submit Revenue Approved';
8136 pa_debug.write(l_mod_name,pa_debug.g_err_stage,l_debug_level5);
8137 END IF;
8138 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
8139 END IF;
8140
8141 -- "Financials: Project: Forecast: Submit Cost"
8142 pa_security_pvt.check_user_privilege(x_ret_code => l_submit_cost_forecast,
8143 x_return_status => l_return_status,
8144 x_msg_count => l_msg_count,
8145 x_msg_data => l_msg_data,
8146 p_privilege => 'PA_FP_FCST_SUB_COST_PLAN',
8147 p_object_name => 'PA_PROJECTS',
8148 p_object_key => P_project_id);
8149 IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
8150 IF l_debug_mode = 'Y' THEN
8151 pa_debug.g_err_stage:= 'Error fetching function security - Submit Cost Forecast';
8152 pa_debug.write(l_mod_name,pa_debug.g_err_stage,l_debug_level5);
8153 END IF;
8154 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
8155 END IF;
8156
8157 -- "Financials: Project: Forecast: Submit Revenue"
8158 pa_security_pvt.check_user_privilege(x_ret_code => l_submit_revenue_forecast,
8159 x_return_status => l_return_status,
8160 x_msg_count => l_msg_count,
8161 x_msg_data => l_msg_data,
8162 p_privilege => 'PA_FP_FCST_SUB_REV_PLAN',
8163 p_object_name => 'PA_PROJECTS',
8164 p_object_key => P_project_id);
8165 IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
8166 IF l_debug_mode = 'Y' THEN
8167 pa_debug.g_err_stage:= 'Error fetching function security - Submit Revenue Forecast';
8168 pa_debug.write(l_mod_name,pa_debug.g_err_stage,l_debug_level5);
8169 END IF;
8170 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
8171 END IF;
8172
8173 IF l_debug_mode = 'Y' THEN
8174 pa_debug.g_err_stage:='After Fetching Function Security return codes';
8175 pa_debug.write(l_mod_name,pa_debug.g_err_stage,l_debug_level3);
8176
8177 pa_debug.g_err_stage:='l_submit_cost: '||l_submit_cost;
8178 pa_debug.write(l_mod_name,pa_debug.g_err_stage,l_debug_level3);
8179
8180 pa_debug.g_err_stage:='l_submit_revenue: '||l_submit_revenue;
8181 pa_debug.write(l_mod_name,pa_debug.g_err_stage,l_debug_level3);
8182
8183 pa_debug.g_err_stage:='l_submit_cost_appr: '||l_submit_cost_appr;
8184 pa_debug.write(l_mod_name,pa_debug.g_err_stage,l_debug_level3);
8185
8186 pa_debug.g_err_stage:='l_submit_revenue_appr: '||l_submit_revenue_appr;
8187 pa_debug.write(l_mod_name,pa_debug.g_err_stage,l_debug_level3);
8188
8189 pa_debug.g_err_stage:='l_submit_cost_forecast: '||l_submit_cost_forecast;
8190 pa_debug.write(l_mod_name,pa_debug.g_err_stage,l_debug_level3);
8191
8192 pa_debug.g_err_stage:='l_submit_revenue_forecast: '||l_submit_revenue_forecast;
8193 pa_debug.write(l_mod_name,pa_debug.g_err_stage,l_debug_level3);
8194 END IF;
8195
8196
8197 IF l_debug_mode = 'Y' THEN
8198 pa_debug.g_err_stage:= 'Entering GET_PLAN_TYPES_FOR_IMPL';
8199 pa_debug.write(l_mod_name,pa_debug.g_err_stage,l_debug_level3);
8200 END IF;
8201
8202 BEGIN
8203
8204 SELECT ci_type_id,status_code
8205 INTO l_ci_type_id,l_status_code
8206 FROM pa_control_items
8207 WHERE ci_id=p_ci_id;
8208
8209 EXCEPTION
8210 WHEN NO_DATA_FOUND THEN
8211
8212 IF l_DEBUG_MODE = 'Y' THEN
8213 pa_debug.g_err_stage:='Error while fetching status of the CI';
8214 pa_debug.write(l_mod_name,pa_debug.g_err_stage,l_debug_level3);
8215 END IF;
8216 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
8217 END;
8218
8219 X_partially_impl_flag := 'N';
8220 i := 1;
8221
8222 Pa_Fp_Control_Items_Utils.get_ci_versions(
8223 P_ci_id => p_ci_id,
8224 X_cost_budget_version_id => x_cost_ci_version_id,
8225 X_rev_budget_version_id => x_rev_ci_version_id,
8226 X_all_budget_version_id => x_all_ci_version_id,
8227 x_return_status => l_return_status,
8228 x_msg_data => l_msg_data,
8229 X_msg_count => l_msg_count);
8230
8231
8232 IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
8233 IF l_debug_mode = 'Y' THEN
8234 pa_debug.g_err_stage:= 'Error in GET_CI_VERSIONS';
8235 pa_debug.write(l_mod_name,pa_debug.g_err_stage,l_debug_level5);
8236 END IF;
8237 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
8238 END IF;
8239
8240 -- Version Type ref is not longer required as both Cost and Revenue Quantity Figures are Retrieved and used now -- 3902176
8241 /*
8242 --Derive the version type from the labor/equipement hours are being shown. Based on this, either cost/revenue
8243 --labor/equipement hours of the plan type will be retrieved. Bug 3662077
8244 IF NVL(x_all_ci_version_id,-1)<>-1 THEN
8245 l_version_type:='ALL';
8246 ELSIF NVL(x_cost_ci_version_id,-1)<>-1 THEN
8247 l_version_type:='COST';
8248 ELSIF NVL(x_rev_ci_version_id,-1)<>-1 THEN
8249 l_version_type:='REVENUE';
8250 END IF;
8251
8252 IF l_debug_mode = 'Y' THEN
8253 pa_debug.g_err_stage:= 'l_version_type derived is '||l_version_type;
8254 pa_debug.write(l_mod_name,pa_debug.g_err_stage,l_debug_level3);
8255 END IF;
8256 */
8257
8258 x_autobaseline_project := Pa_Fp_Control_Items_Utils.IsFpAutoBaselineEnabled(p_project_id => p_project_id);
8259
8260 -- Loop for each plan type attached to the project(excluding work plan and org forecast plan types)
8261 FOR c_plan_type_rec IN c_plan_types_attached LOOP
8262 l_rev_impl_flag:=null;
8263 Pa_Fp_Control_Items_Utils.get_impl_details(
8264 P_fin_plan_type_id => c_plan_type_rec.fin_plan_type_id,
8265 P_project_id => p_project_id,
8266 P_app_rev_plan_type_flag => c_plan_type_rec.approved_rev_plan_type_flag,
8267 P_ci_id => p_ci_id,
8268 p_ci_type_id => l_ci_type_id,
8269 P_ci_status => l_status_code,
8270 P_ci_cost_version_id => x_cost_ci_version_id,
8271 P_ci_rev_version_id => x_rev_ci_version_id,
8272 P_ci_all_version_id => x_all_ci_version_id,
8273 x_cost_impl_flag => l_cost_impl_flag,
8274 x_rev_impl_flag => l_rev_impl_flag,
8275 X_cost_impact_impl_flag => l_cost_impact_impl_flag,
8276 x_rev_impact_impl_flag => l_rev_impact_impl_flag,
8277 X_partially_impl_flag => l_partially_impl_flag,
8278 x_agreement_num => x_agreement_num,
8279 x_approved_fin_pt_id => l_approved_fin_pt_id,
8280 x_return_status => l_return_status,
8281 x_msg_data => l_msg_data,
8282 X_msg_count => l_msg_count);
8283
8284 IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
8285 IF l_debug_mode = 'Y' THEN
8286 pa_debug.g_err_stage:= 'Error in get_impl_details';
8287 pa_debug.write(l_mod_name,pa_debug.g_err_stage,l_debug_level5);
8288 END IF;
8289 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
8290 END IF;
8291
8292 IF l_approved_fin_pt_id IS NOT NULL THEN
8293 x_approved_fin_pt_id := l_approved_fin_pt_id;
8294 END IF;
8295
8296 X_pt_id_tbl.extend;
8297 X_pt_name_tbl.extend;
8298 x_cost_impact_impl_tbl.extend;
8299 x_rev_impact_impl_tbl.extend;
8300 X_cost_impl_tbl.extend;
8301 x_rev_impl_tbl.extend;
8302 X_raw_cost_tbl.extend;
8303 X_burd_cost_tbl.extend;
8304 X_revenue_tbl.extend;
8305 X_labor_hrs_c_tbl.extend;
8306 X_equipment_hrs_c_tbl.extend;
8307 X_labor_hrs_r_tbl.extend;
8308 X_equipment_hrs_r_tbl.extend;
8309 X_margin_tbl.extend;
8310 X_margin_percent_tbl.extend;
8311 X_cost_bv_id_tbl.extend;
8312 X_rev_bv_id_tbl.extend;
8313 X_all_bv_id_tbl.extend;
8314 X_select_flag_tbl.extend;
8315 x_margin_derived_code_tbl.extend; -- Bug 3734840
8316
8317 -- Bug 3735309 for function Security of Submit for Baseline
8318 x_disable_baseline_flag_tbl.extend;
8319 l_render_impl_cost_tbl.extend;
8320 l_render_impl_revenue_tbl.extend;
8321 l_disable_impl_cost_tbl.extend;
8322 l_disable_impl_revenue_tbl.extend;
8323
8324 BEGIN
8325 select impl_default_flag
8326 INTO x_select_flag_tbl(i)
8327 from pa_pt_co_impl_statuses
8328 WHERE fin_plan_type_id = c_plan_type_rec.fin_plan_type_id
8329 AND ci_type_id = l_ci_type_id
8330 AND ROWNUM = 1 ;
8331
8332 EXCEPTION
8333 WHEN NO_DATA_FOUND THEN
8334 x_select_flag_tbl(i) := 'N';
8335 END;
8336
8337 x_pt_id_tbl(i) := c_plan_type_rec.fin_plan_type_id;
8338 x_pt_name_tbl(i) := c_plan_type_rec.name;
8339 x_cost_impact_impl_tbl(i) := l_cost_impact_impl_flag;
8340 x_rev_impact_impl_tbl(i) := l_rev_impact_impl_flag;
8341 x_cost_impl_tbl(i) := l_cost_impl_flag;
8342 x_rev_impl_tbl(i) := l_rev_impl_flag;
8343
8344 -- Version Type ref is not longer required as both Cost and Revenue Quantity Figures are Retrieved and used now -- 3902176
8345 PA_FIN_PLAN_UTILS.get_summary_amounts(
8346 p_context => PA_FP_CONSTANTS_PKG.G_PLAN_TYPE_CWV_AMOUNTS,
8347 P_project_id => p_project_id,
8348 P_ci_id => p_ci_id,
8349 P_fin_plan_type_id => c_plan_type_rec.fin_plan_type_id,
8350 -- p_version_type => l_version_type, --Bug 3662077
8351 X_proj_raw_cost => x_raw_cost_tbl(i),
8352 X_proj_burdened_cost => x_burd_cost_tbl(i),
8353 X_proj_revenue => x_revenue_tbl(i),
8354 X_margin => x_margin_tbl(i),
8355 X_margin_percent => X_margin_percent_tbl(i),
8356 x_margin_derived_from_code => x_margin_derived_code_tbl(i), -- Bug 3734840
8357 X_labor_hrs_cost => x_labor_hrs_c_tbl(i),
8358 X_equipment_hrs_cost => x_equipment_hrs_c_tbl(i),
8359 X_labor_hrs_rev => x_labor_hrs_r_tbl(i),
8360 X_equipment_hrs_rev => x_equipment_hrs_r_tbl(i),
8361 X_cost_budget_version_id => x_cost_bv_id_tbl(i),
8362 X_rev_budget_version_id => x_rev_bv_id_tbl(i),
8363 X_all_budget_version_id => x_all_bv_id_tbl(i),
8364 x_return_status => l_return_status,
8365 x_msg_data => l_msg_data,
8366 X_msg_count => l_msg_count);
8367
8368 IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
8369 IF l_debug_mode = 'Y' THEN
8370 pa_debug.g_err_stage:= 'Error in get_summary_amounts';
8371 pa_debug.write(l_mod_name,pa_debug.g_err_stage,l_debug_level5);
8372 END IF;
8373 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
8374 END IF;
8375
8376 --Bug 5845142. A CI version of type ALL with only approved cost plan type flag as Y should be
8377 --considered as having cost impact alone. Revenue amounts , though availble , can not be
8378 --displayed as an impact to approved budget.
8379 IF c_plan_type_rec.approved_cost_plan_type_flag='Y' AND
8380 c_plan_type_rec.approved_rev_plan_type_flag='N' AND
8381 c_plan_type_rec.fin_plan_preference_code='COST_AND_REV_SAME' THEN
8382
8383 x_revenue_tbl(i) := NULL;
8384 x_margin_tbl(i) := NULL;
8385 X_margin_percent_tbl(i) := NULL;
8386 x_margin_derived_code_tbl(i) := NULL;
8387 x_labor_hrs_r_tbl(i) := NULL;
8388 x_equipment_hrs_r_tbl(i) := NULL;
8389 x_cost_bv_id_tbl(i) := x_all_bv_id_tbl(i);
8390 x_rev_bv_id_tbl(i) := -1;
8391 x_all_bv_id_tbl(i) := -1;
8392
8393 END IF;
8394
8395 IF l_partially_impl_flag = 'Y' THEN
8396 x_partially_impl_flag := l_partially_impl_flag;
8397
8398
8399 IF nvl(x_rev_bv_id_tbl(i),-1) <> -1 THEN
8400 l_budget_version_id := x_rev_bv_id_tbl(i);
8401 ELSE
8402 l_budget_version_id := x_all_bv_id_tbl(i);
8403 END IF;
8404
8405 -- Bug 3962249.
8406 -- Derive ci version type for calling get_xxxx funtions below.
8407 IF x_rev_ci_version_id IS NOT NULL THEN
8408 l_ci_version_type := 'REVENUE';
8409 ELSE
8410 l_ci_version_type := 'ALL';
8411 END IF;
8412
8413 x_rem_proj_revenue :=
8414 Pa_Fp_Control_Items_Utils.get_pc_revenue_partial(
8415 p_version_type => l_ci_version_type,
8416 p_budget_version_id => l_budget_version_id,
8417 p_ci_version_id => nvl(x_rev_ci_version_id,x_all_ci_version_id));
8418
8419 x_rem_labor_qty :=
8420 Pa_Fp_Control_Items_Utils.get_labor_qty_partial(
8421 p_version_type => l_ci_version_type,
8422 p_budget_version_id => l_budget_version_id,
8423 p_ci_version_id => nvl(x_rev_ci_version_id,x_all_ci_version_id));
8424
8425 x_rem_equip_qty :=
8426 Pa_Fp_Control_Items_Utils.get_equip_qty_partial(
8427 p_version_type => l_ci_version_type,
8428 p_budget_version_id => l_budget_version_id,
8429 p_ci_version_id => nvl(x_rev_ci_version_id,x_all_ci_version_id));
8430
8431 END IF;
8432
8433 -- Bug 3735309 This data will be used to derive x_disable_baseline_flag_tbl
8434 IF (l_cost_impl_flag = 'H') THEN
8435 l_render_impl_cost_tbl(i) := 'N';
8436 ELSE
8437 l_render_impl_cost_tbl(i) := 'Y';
8438 END IF;
8439
8440 IF (l_rev_impl_flag = 'H') THEN
8441 l_render_impl_revenue_tbl(i) := 'N';
8442 ELSE
8443 l_render_impl_revenue_tbl(i) := 'Y';
8444 END IF;
8445
8446 IF (l_cost_impl_flag = 'D') THEN
8447 l_disable_impl_cost_tbl(i) := 'Y';
8448 ELSE
8449 l_disable_impl_cost_tbl(i) := 'N';
8450 END IF;
8451
8452 IF (l_rev_impl_flag = 'D') THEN
8453 l_disable_impl_revenue_tbl(i) := 'Y';
8454 ELSE
8455 l_disable_impl_revenue_tbl(i) := 'N';
8456 END IF;
8457
8458 /* Deriving function Security to be used
8459 FOR Forecast use PA_FP_FCST_SUB_COST_PLAN for Cost and PA_FP_FCST_SUB_REV_PLAN for Revenue
8460 FOR BUDGET
8461 FOR APPROVED Cost Use PA_FP_APP_BDGT_SUB_COST_PLAN
8462 FOR Cost Use PA_FP_BDGT_SUB_COST_PLAN
8463 FOR APPROVED Revenue Use PA_FP_APP_BDGT_SUB_REV_PLAN
8464 FOR Revenue Use PA_FP_BDGT_SUB_REV_PLAN
8465 */
8466 IF c_plan_type_rec.plan_class_code = 'FORECAST' THEN
8467 l_submit_cost_check := l_submit_cost_forecast;
8468 l_submit_revenue_check := l_submit_revenue_forecast;
8469 ELSE -- For Budget
8470 IF c_plan_type_rec.approved_cost_plan_type_flag = 'Y' THEN
8471 l_submit_cost_check := l_submit_cost_appr;
8472 ELSE -- For Non Approved Cost
8473 l_submit_cost_check := l_submit_cost;
8474 END IF;
8475
8476 IF c_plan_type_rec.approved_rev_plan_type_flag = 'Y' THEN
8477 l_submit_revenue_check := l_submit_revenue_appr;
8478 ELSE -- For Non Approved Revenue
8479 l_submit_revenue_check := l_submit_revenue;
8480 END IF;
8481 END IF;
8482
8483
8484 IF l_debug_mode = 'Y' THEN
8485 pa_debug.g_err_stage:= 'Deriving x_disable Submit for Baseline';
8486 pa_debug.write(l_mod_name,pa_debug.g_err_stage,l_debug_level3);
8487
8488 pa_debug.g_err_stage:= 'l_render_impl_cost :'||l_render_impl_cost_tbl(i);
8489 pa_debug.write(l_mod_name,pa_debug.g_err_stage,l_debug_level3);
8490
8491 pa_debug.g_err_stage:= 'l_render_impl_revenue :'||l_render_impl_revenue_tbl(i);
8492 pa_debug.write(l_mod_name,pa_debug.g_err_stage,l_debug_level3);
8493
8494 pa_debug.g_err_stage:= 'l_disable_impl_cost :'||l_disable_impl_cost_tbl(i);
8495 pa_debug.write(l_mod_name,pa_debug.g_err_stage,l_debug_level3);
8496
8497 pa_debug.g_err_stage:= 'l_disable_impl_revenue :'||l_disable_impl_revenue_tbl(i);
8498 pa_debug.write(l_mod_name,pa_debug.g_err_stage,l_debug_level3);
8499 END IF;
8500
8501 /*
8502 Submit For Baseline Disable Logic
8503 a. If Cost and Revenue have been implmented in full then disable Checkbox.
8504 b1. If Only Cost Check Box is Enabled check for Submit function security for Cost
8505 b2. If Only Revenue Check Box is Enabled check for Submit function security for Revenue
8506 b3. If both Cost and Revenue CheckBoxes are enabled, check for availability for either of
8507 Submit Revenue or Submit Cost for User
8508 c. If project is enabled for auto baseline then disable checkbox.
8509 */
8510
8511 IF ( (l_cost_impact_impl_flag <> 'Y' OR l_rev_impact_impl_flag <> 'Y')
8512 AND ( ( (l_render_impl_cost_tbl(i) = 'Y' AND l_disable_impl_cost_tbl(i) = 'N')
8513 AND (l_render_impl_revenue_tbl(i) = 'N' OR l_disable_impl_revenue_tbl(i) = 'Y')
8514 AND (l_submit_cost_check = 'T'))
8515 OR ( (l_render_impl_revenue_tbl(i) = 'Y' AND l_disable_impl_revenue_tbl(i) = 'N')
8516 AND (l_render_impl_cost_tbl(i) = 'N' OR l_disable_impl_cost_tbl(i) = 'Y')
8517 AND (l_submit_revenue_check = 'T'))
8518 OR ( (l_render_impl_cost_tbl(i) = 'Y' AND l_disable_impl_cost_tbl(i) = 'N')
8519 AND (l_render_impl_revenue_tbl(i) = 'Y' AND l_disable_impl_revenue_tbl(i) = 'N')
8520 AND (l_submit_cost_check = 'T' OR l_submit_revenue_check = 'T')))
8521 AND (NOT(x_autobaseline_project = 'Y' AND x_pt_id_tbl(i) = l_approved_fin_pt_id
8522 AND l_render_impl_revenue_tbl(i) = 'Y' AND l_disable_impl_revenue_tbl(i) = 'N'))) THEN
8523
8524 x_disable_baseline_flag_tbl(i) := 'N';
8525 ELSE
8526 x_disable_baseline_flag_tbl(i) := 'Y';
8527 END IF;
8528
8529 IF l_debug_mode = 'Y' THEN
8530 pa_debug.g_err_stage:= 'x_disable_baseline_flag_tbl : '||x_disable_baseline_flag_tbl(i);
8531 pa_debug.write(l_mod_name,pa_debug.g_err_stage,l_debug_level3);
8532 END IF;
8533 -- Bug 3735309 End of changes.
8534
8535 i := i + 1;
8536 END LOOP;
8537
8538 -- Bug 11708214
8539 Pa_Fp_Control_Items_Utils.get_fp_ci_agreement_dtls(p_project_id => p_project_id,
8540 p_ci_id => p_ci_id,
8541 x_agreement_num => x_agreement_num,
8542 x_agreement_amount => l_agreement_amount,
8543 x_agreement_currency_code => l_agreement_currency_code,
8544 x_msg_data => l_msg_data,
8545 x_msg_count => l_msg_count,
8546 x_return_status => l_return_status);
8547
8548 IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
8549 IF P_PA_debug_mode = 'Y' THEN
8550 pa_debug.g_err_stage:= 'Error in get_fp_ci_agreement_dtls';
8551 pa_debug.write(l_mod_name,pa_debug.g_err_stage,l_debug_level5);
8552 END IF;
8553 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
8554 END IF;
8555 -- Bug 11708214
8556
8557 IF l_debug_mode = 'Y' THEN
8558 pa_debug.g_err_stage:= 'Exiting GET_PLAN_TYPES_FOR_IMPL';
8559 pa_debug.write(l_mod_name,pa_debug.g_err_stage,l_debug_level3);
8560 END IF;
8561 pa_debug.reset_curr_function;
8562
8563 EXCEPTION
8564 WHEN PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc THEN
8565 l_msg_count := FND_MSG_PUB.count_msg;
8566
8567 IF c_plan_types_attached%ISOPEN THEN
8568 CLOSE c_plan_types_attached;
8569 END IF;
8570 IF l_msg_count = 1 and x_msg_data IS NULL THEN
8571 PA_INTERFACE_UTILS_PUB.get_messages
8572 (p_encoded => FND_API.G_TRUE
8573 ,p_msg_index => 1
8574 ,p_msg_count => l_msg_count
8575 ,p_msg_data => l_msg_data
8576 ,p_data => l_data
8577 ,p_msg_index_out => l_msg_index_out);
8578 x_msg_data := l_data;
8579 x_msg_count := l_msg_count;
8580 ELSE
8581 x_msg_count := l_msg_count;
8582 END IF;
8583 x_return_status := FND_API.G_RET_STS_ERROR;
8584
8585 pa_debug.reset_curr_function;
8586 RETURN;
8587
8588 WHEN Others THEN
8589 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
8590 x_msg_count := 1;
8591 x_msg_data := SQLERRM;
8592
8593 IF c_plan_types_attached%ISOPEN THEN
8594 CLOSE c_plan_types_attached;
8595 END IF;
8596
8597 FND_MSG_PUB.add_exc_msg( p_pkg_name => 'Pa_Fp_Control_Items_Utils'
8598 ,p_procedure_name => 'GET_PLAN_TYPES_FOR_IMPL');
8599 IF l_DEBUG_MODE = 'Y' THEN
8600 pa_debug.g_err_stage:='Unexpected Error ' || SQLERRM;
8601 pa_debug.write(l_mod_name,pa_debug.g_err_stage,l_debug_level5);
8602 END IF;
8603 pa_debug.reset_curr_function;
8604 RAISE;
8605
8606
8607 END GET_PLAN_TYPES_FOR_IMPL;
8608
8609
8610 /* For each plan type, returns information including whether a change order can be implemented into it.
8611
8612 OUT paramters X_cost_impl_flag, x_rev_impl_flag can have following values:
8613 'D' - The cost/rev impact is implemented. This indicates that the checkbox should be checked and disabled in the page
8614 'H' - The impact can not be implemented. The checkbox should be hidden in the page
8615 'X' - The impact has not been implemented. The working version does not exist for the plan type. The checkbox should be displayed on the page
8616 'Y' - The impact has not been implemented. The working version exists for the plan type. The checkbox should be displayed on the page.
8617
8618 'R' - Partial implementation has happened. This is applicable only for x_rev_impl_flag.
8619
8620 The OUT parameters X_partially_impl_flag, x_agreement_num and x_approved_fin_pt_id will be passed back only in the context of
8621 current working version of approved revenue plan type
8622
8623 See comments for other OUT parameters to know what they indicate */
8624
8625 PROCEDURE GET_IMPL_DETAILS(P_fin_plan_type_id IN Pa_fin_plan_types_b.fin_plan_type_id%TYPE -- Id of the plan type
8626 ,P_project_id IN Pa_budget_versions.project_id%TYPE -- Id of the Project
8627 ,P_app_rev_plan_type_flag IN pa_budget_versions.approved_rev_plan_type_flag%TYPE DEFAULT NULL -- Indicates whether the plan type passed is approved rev_plan_type or not. If the value is NULL the value will be derived
8628 ,P_ci_id IN Pa_budget_versions.ci_id%TYPE -- Id of the Change Order
8629 ,p_ci_type_id IN pa_control_items.ci_type_id%TYPE DEFAULT NULL
8630 ,P_ci_status IN Pa_control_items.status_code%TYPE DEFAULT NULL -- Status of the Change Order
8631 ,P_ci_cost_version_id IN Pa_budget_versions.budget_version_id%TYPE DEFAULT NULL -- Id of the Cost ci version
8632 ,P_ci_rev_version_id IN Pa_budget_versions.budget_version_id%TYPE DEFAULT NULL -- Id of the Revenue ci version
8633 ,P_ci_all_version_id IN Pa_budget_versions.budget_version_id%TYPE DEFAULT NULL -- Id of the All ci version
8634 ,p_targ_bv_id IN Pa_budget_versions.budget_version_id%TYPE DEFAULT NULL -- Id of the target budget version. Bug 3745163
8635 ,x_cost_impl_flag OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
8636 ,x_rev_impl_flag OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
8637 ,X_cost_impact_impl_flag OUT NOCOPY VARCHAR2 -- Contains 'Y' if the cost impact is completely implemented --File.Sql.39 bug 4440895
8638 ,x_rev_impact_impl_flag OUT NOCOPY VARCHAR2 -- Contains 'Y' if the revenue impact is completely implemented --File.Sql.39 bug 4440895
8639 ,X_partially_impl_flag OUT NOCOPY VARCHAR2 -- Can be Y or N. Indicates whether a CI is partially implemented . --File.Sql.39 bug 4440895
8640 ,x_agreement_num OUT NOCOPY pa_agreements_all.agreement_num%TYPE -- Agreement Number. Has meaning only in the context of an approved revenue plan type. --File.Sql.39 bug 4440895
8641 ,x_approved_fin_pt_id OUT NOCOPY Pa_fin_plan_types_b.fin_plan_type_id%TYPE -- If p_fin_plan_type_id is an approved revenue plan type, this is equal to p_fin_plan_type_id --File.Sql.39 bug 4440895
8642 ,x_return_status OUT NOCOPY VARCHAR2 -- Indicates the exit status of the API --File.Sql.39 bug 4440895
8643 ,x_msg_data OUT NOCOPY VARCHAR2 -- Indicates the error occurred --File.Sql.39 bug 4440895
8644 ,X_msg_count OUT NOCOPY NUMBER) -- Indicates the number of error messages --File.Sql.39 bug 4440895
8645 IS
8646
8647 CURSOR c_implementable_status(c_status_code IN pa_pt_co_impl_statuses.status_code%TYPE,
8648 c_impact_type_code IN pa_pt_co_impl_statuses.version_type%TYPE,
8649 c_ci_type_id IN pa_pt_co_impl_statuses.ci_type_id%TYPE) IS
8650 SELECT 'Y'
8651 FROM dual
8652 WHERE
8653 EXISTS (SELECT 'X'
8654 FROM pa_pt_co_impl_statuses popt
8655 WHERE popt.status_code =c_status_code
8656 AND popt.version_type = c_impact_type_code
8657 AND popt.fin_plan_type_id = p_fin_plan_type_id
8658 AND popt.ci_type_id = c_ci_type_id);
8659
8660 CURSOR c_impact_impl_csr(c_version_id IN pa_fp_merged_Ctrl_items.plan_version_id%TYPE,
8661 c_ci_version_id IN pa_fp_merged_Ctrl_items.ci_plan_version_id%TYPE,
8662 c_version_type IN pa_fp_merged_Ctrl_items.version_type%TYPE) IS
8663 SELECT 'X'
8664 FROM pa_fp_merged_Ctrl_items
8665 WHERE ci_id=p_ci_id
8666 AND plan_version_id = c_version_id
8667 AND ci_plan_version_id = c_ci_version_id
8668 AND project_id = p_project_id
8669 AND version_type=c_version_type;
8670
8671 -- Start of variables used for debugging purpose
8672
8673 l_msg_count NUMBER :=0;
8674 l_data VARCHAR2(2000);
8675 l_msg_data VARCHAR2(2000);
8676 l_msg_index_out NUMBER;
8677 l_return_status VARCHAR2(2000);
8678 l_debug_mode VARCHAR2(1);
8679 l_debug_level3 CONSTANT NUMBER := 3;
8680 l_debug_level5 CONSTANT NUMBER := 5;
8681 l_mod_name VARCHAR2(100) := 'GET_IMPL_DETAILS' || g_module_name;
8682 l_token_name VARCHAR2(30) :='PROCEDURENAME';
8683
8684 -- End of variables used for debugging purpose
8685
8686 l_is_impl VARCHAR2(1);
8687 l_ci_version_id Pa_budget_versions.budget_version_id%TYPE;
8688 l_budget_version_id Pa_budget_versions.budget_version_id%TYPE;
8689
8690 l_cost_budget_version_id Pa_budget_versions.budget_version_id%TYPE;
8691 l_rev_budget_version_id Pa_budget_versions.budget_version_id%TYPE;
8692 l_all_budget_version_id Pa_budget_versions.budget_version_id%TYPE;
8693
8694 l_ci_type_id pa_control_items.ci_type_id%TYPE;
8695
8696 l_status_allows_cost_impl VARCHAR2(1);
8697 l_status_allows_rev_impl VARCHAR2(1);
8698
8699 l_app_rev_plan_type_flag pa_proj_fp_options.approved_rev_plan_type_flag%TYPE;
8700
8701 l_agreement_amount NUMBER;
8702 l_agreement_currency_code pa_agreements_all.agreement_currency_code%TYPE;
8703
8704 l_ci_cost_version_id Pa_budget_versions.budget_version_id%TYPE;
8705 l_ci_rev_version_id Pa_budget_versions.budget_version_id%TYPE;
8706 l_ci_all_version_id Pa_budget_versions.budget_version_id%TYPE;
8707
8708 l_status_code pa_control_items.status_code%TYPE;
8709 l_target_version_id pa_budget_versions.budget_version_id%TYPE;
8710
8711 l_rev_impl_full VARCHAR2(1); -- Will indicate if revenue has been implemented in full or not
8712
8713 l_version_type Pa_budget_versions.version_type%TYPE; -- Bug 3745163
8714
8715 l_current_working_flag Pa_budget_versions.current_working_flag%TYPE; -- Bug 3732446
8716
8717 --Bug 5845142
8718 l_t_app_cost_flag pa_budget_versions.approved_cost_plan_type_flag%TYPE;
8719 l_t_app_rev_flag pa_budget_versions.approved_rev_plan_type_flag%TYPE;
8720 l_t_pt_pref_code pa_proj_fp_options.fin_plan_preference_code%TYPE;
8721
8722 BEGIN
8723
8724 pa_debug.set_curr_function( p_function => 'GET_IMPL_DETAILS',
8725 p_debug_mode => P_PA_debug_mode );
8726
8727
8728 x_msg_count := 0;
8729 x_return_status := FND_API.G_RET_STS_SUCCESS;
8730
8731
8732 -- Check if project id and ci id are null
8733
8734 IF (p_project_id IS NULL) OR (p_ci_id IS NULL) OR (p_fin_plan_type_id IS NULL)
8735 THEN
8736
8737
8738 IF P_PA_debug_mode = 'Y' THEN
8739 pa_debug.g_err_stage:='Project_id = '||p_project_id;
8740 pa_debug.write(l_mod_name,pa_debug.g_err_stage,l_debug_level5);
8741
8742 pa_debug.g_err_stage:='Ci_id = '||p_ci_id;
8743 pa_debug.write(l_mod_name,pa_debug.g_err_stage,l_debug_level5);
8744
8745 pa_debug.g_err_stage:='p_fin_plan_type_id = '||p_fin_plan_type_id;
8746 pa_debug.write(l_mod_name,pa_debug.g_err_stage,l_debug_level5);
8747
8748 END IF;
8749
8750
8751 PA_UTILS.ADD_MESSAGE(p_app_short_name => 'PA',
8752 p_msg_name => 'PA_FP_INV_PARAM_PASSED',
8753 p_token1 => l_token_name,
8754 p_value1 => l_mod_name);
8755
8756
8757 IF P_PA_debug_mode = 'Y' THEN
8758 pa_debug.g_err_stage:='Invalid Arguments Passed';
8759 pa_debug.write(l_mod_name,pa_debug.g_err_stage,l_debug_level5);
8760 END IF;
8761 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
8762
8763 END IF;
8764
8765
8766 IF P_PA_debug_mode = 'Y' THEN
8767 pa_debug.g_err_stage:= 'Entering GET_IMPL_DETAILS';
8768 pa_debug.write(l_mod_name,pa_debug.g_err_stage,l_debug_level3);
8769 END IF;
8770
8771 IF p_ci_status IS NULL OR p_ci_type_id IS NULL THEN
8772 BEGIN
8773 SELECT status_code, ci_type_id
8774 INTO l_status_code, l_ci_type_id
8775 FROM pa_control_items
8776 WHERE ci_id=p_ci_id;
8777 EXCEPTION
8778 WHEN NO_DATA_FOUND THEN
8779 RAISE ;
8780 END;
8781 ELSE
8782 l_status_code := p_ci_status;
8783 l_ci_type_id := p_ci_type_id;
8784 END IF;
8785
8786 -- Check to see if the status of the control iitem is defined to be implementable
8787
8788 OPEN c_implementable_status(l_status_code,PA_FP_CONSTANTS_PKG.G_ELEMENT_TYPE_COST,l_ci_type_id);
8789 FETCH c_implementable_status INTO l_is_impl;
8790 IF c_implementable_status%FOUND THEN
8791 l_status_allows_cost_impl := 'Y';
8792 ELSE
8793 l_status_allows_cost_impl := 'N';
8794 END IF;
8795 CLOSE c_implementable_status;
8796
8797 OPEN c_implementable_status(l_status_code,PA_FP_CONSTANTS_PKG.G_ELEMENT_TYPE_REVENUE,l_ci_type_id);
8798 FETCH c_implementable_status INTO l_is_impl;
8799 IF c_implementable_status%FOUND THEN
8800 l_status_allows_rev_impl := 'Y';
8801 ELSE
8802 l_status_allows_rev_impl := 'N';
8803 END IF;
8804 CLOSE c_implementable_status;
8805
8806
8807 x_cost_impl_flag := 'H';
8808 x_rev_impl_flag := 'H';
8809 x_cost_impact_impl_flag :='Y';
8810 x_rev_impact_impl_flag := 'Y';
8811
8812 IF p_ci_cost_version_id IS NULL AND p_ci_rev_version_id IS NULL AND p_ci_all_version_id IS NULL THEN
8813 Pa_Fp_Control_Items_Utils.GET_CI_VERSIONS(P_ci_id => p_ci_id,
8814 X_cost_budget_version_id => l_ci_cost_version_id,
8815 X_rev_budget_version_id => l_ci_rev_version_id,
8816 X_all_budget_version_id => l_ci_all_version_id,
8817 x_return_status => l_return_status,
8818 x_msg_data => l_msg_data,
8819 X_msg_count => l_msg_count);
8820
8821 IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
8822 IF P_PA_debug_mode = 'Y' THEN
8823 pa_debug.g_err_stage:= 'Error in GET_CI_VERSIONS';
8824 pa_debug.write(l_mod_name,pa_debug.g_err_stage,l_debug_level5);
8825 END IF;
8826 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
8827 END IF;
8828 ELSE
8829 l_ci_cost_version_id := p_ci_cost_version_id;
8830 l_ci_rev_version_id := p_ci_rev_version_id;
8831 l_ci_all_version_id := p_ci_all_version_id;
8832 END IF;
8833
8834 --Bug 5845142.
8835 SELECT NVL(approved_cost_plan_type_flag,'N'),
8836 NVL(approved_rev_plan_type_flag,'N'),
8837 fin_plan_preference_code
8838 INTO l_t_app_cost_flag,
8839 l_t_app_rev_flag,
8840 l_t_pt_pref_code
8841 FROM pa_proj_fp_options
8842 WHERE project_id=p_project_id
8843 AND fin_plan_type_id=p_fin_plan_type_id
8844 AND fin_plan_version_id IS NULL;
8845
8846 --Bug 5845142. If the plan type is approved for only cost but contains revenue amounts then
8847 --the revenue impact of the change order should not be considered
8848 IF l_t_app_cost_flag='Y' AND
8849 l_t_app_rev_flag ='N' AND
8850 l_t_pt_pref_code='COST_AND_REV_SAME' THEN
8851
8852 l_ci_rev_version_id:=NULL;
8853
8854 END IF;
8855
8856 -- Bug 3745163
8857
8858 /* -1 indicates that the variable will not have meaning in the context. The code down the line will
8859 assign values to the relevant bv id variable */
8860
8861 l_cost_budget_version_id := -1;
8862 l_rev_budget_version_id := -1;
8863 l_all_budget_version_id := -1;
8864
8865 l_current_working_flag := 'Y';
8866
8867 IF p_targ_bv_id IS NOT NULL THEN
8868 SELECT version_type,current_working_flag
8869 INTO l_version_type,l_current_working_flag
8870 FROM pa_budget_versions
8871 WHERE budget_version_id=p_targ_bv_id;
8872
8873 IF l_version_type=PA_FP_CONSTANTS_PKG.G_ELEMENT_TYPE_COST THEN
8874 l_ci_rev_version_id := NULL;
8875 l_cost_budget_version_id := p_targ_bv_id;
8876 ELSIF l_version_type=PA_FP_CONSTANTS_PKG.G_ELEMENT_TYPE_REVENUE THEN
8877 l_ci_cost_version_id := NULL;
8878 l_rev_budget_version_id := p_targ_bv_id;
8879 ELSIF l_version_type=PA_FP_CONSTANTS_PKG.G_ELEMENT_TYPE_ALL THEN
8880 l_all_budget_version_id := p_targ_bv_id;
8881 END IF;
8882
8883 ELSE
8884
8885 IF P_PA_debug_mode = 'Y' THEN
8886 pa_debug.g_err_stage:= 'Calling GET_CURR_WORKING_VERSION_IDS';
8887 pa_debug.write(l_mod_name,pa_debug.g_err_stage,l_debug_level5);
8888 END IF;
8889
8890 pa_fin_plan_utils.GET_CURR_WORKING_VERSION_IDS(P_fin_plan_type_id => P_fin_plan_type_id
8891 ,P_project_id => p_project_id
8892 ,X_cost_budget_version_id => l_cost_budget_version_id
8893 ,X_rev_budget_version_id => l_rev_budget_version_id
8894 ,X_all_budget_version_id => l_all_budget_version_id
8895 ,x_return_status => l_return_status
8896 ,x_msg_data => l_msg_data
8897 ,X_msg_count => l_msg_count);
8898
8899
8900 IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
8901 IF P_PA_debug_mode = 'Y' THEN
8902 pa_debug.g_err_stage:= 'Error in GET_CURR_WORKING_VERSION_IDS';
8903 pa_debug.write(l_mod_name,pa_debug.g_err_stage,l_debug_level5);
8904 END IF;
8905 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
8906 END IF;
8907 END IF;
8908
8909
8910 --Bug 3663513. The IF ELSIF is changed to IF END IF .. since a ci can have more than one version.
8911 IF l_ci_cost_version_id IS NOT NULL THEN
8912 -- There is cost impact
8913 IF l_cost_budget_version_id = -1 THEN
8914 -- -1 indicates a "COST" budget version cannot exist for this plan type
8915 l_target_version_id := l_all_budget_version_id;
8916 ELSE
8917 l_target_version_id := l_cost_budget_version_id;
8918 END IF;
8919
8920 IF nvl(l_target_version_id,-1) <> -1 THEN
8921 -- If the current working version exists, check to see if cost has been implemented
8922 OPEN c_impact_impl_csr(l_target_version_id , l_ci_cost_version_id, 'COST');
8923 FETCH c_impact_impl_csr INTO l_is_impl;
8924 IF c_impact_impl_csr%FOUND THEN
8925 -- Cost has already been implemented
8926 x_cost_impl_flag := 'D';
8927 ELSE
8928 -- Cost has not been implemented
8929 x_cost_impl_flag := 'Y';
8930 END IF;
8931 CLOSE c_impact_impl_csr;
8932
8933 ELSIF l_target_version_id IS NULL THEN
8934 -- NULL indicates no current working version exists for this plan type
8935 x_cost_impl_flag := 'X';
8936 END IF;
8937
8938 END IF;
8939
8940 IF l_ci_rev_version_id IS NOT NULL THEN
8941 -- There is revenue impact
8942 IF l_rev_budget_version_id = -1 THEN
8943 -- -1 indicates a "REVENUE" budget version cannot exist for this plan type
8944 l_target_version_id := l_all_budget_version_id;
8945 ELSE
8946 l_target_version_id := l_rev_budget_version_id;
8947 END IF;
8948
8949 IF nvl(l_target_version_id,-1) <> -1 THEN
8950 -- If the current working version exists, check to see if revenue has been implemented
8951 OPEN c_impact_impl_csr(l_target_version_id , l_ci_rev_version_id, 'REVENUE');
8952 FETCH c_impact_impl_csr INTO l_is_impl;
8953 IF c_impact_impl_csr%FOUND THEN
8954 -- Revenue has already been implemented either fully or partially
8955 x_rev_impl_flag := 'D';
8956 ELSE
8957 x_rev_impl_flag := 'Y';
8958 END IF;
8959 CLOSE c_impact_impl_csr;
8960
8961 ELSIF l_target_version_id IS NULL THEN
8962 -- NULL indicates no current working version exists for this plan type
8963 x_rev_impl_flag := 'X';
8964 END IF;
8965
8966 END IF;
8967
8968 IF l_ci_all_version_id IS NOT NULL THEN
8969 -- There is both cost and revenue impact
8970 IF l_all_budget_version_id = -1 THEN
8971 /* -1 indicates an "ALL" budget version cannot exist for this plan type
8972 In this case, see if cost/revenue budget versions exist */
8973
8974 IF NVL(l_version_type,PA_FP_CONSTANTS_PKG.G_ELEMENT_TYPE_COST) = PA_FP_CONSTANTS_PKG.G_ELEMENT_TYPE_COST THEN
8975 --This chunk of code needs to be executed only when version type is COST or targ bv id is not passed
8976 IF nvl(l_cost_budget_version_id,-1) <> -1 THEN
8977 OPEN c_impact_impl_csr(l_cost_budget_version_id , l_ci_all_version_id, 'COST');
8978 FETCH c_impact_impl_csr INTO l_is_impl;
8979 IF c_impact_impl_csr%FOUND THEN
8980 x_cost_impl_flag := 'D';
8981 ELSE
8982 x_cost_impl_flag := 'Y';
8983 END IF;
8984 CLOSE c_impact_impl_csr;
8985 ELSIF l_cost_budget_version_id IS NULL THEN
8986 x_cost_impl_flag := 'X';
8987 END IF;
8988 END IF;
8989
8990 IF NVL(l_version_type,PA_FP_CONSTANTS_PKG.G_ELEMENT_TYPE_REVENUE) = PA_FP_CONSTANTS_PKG.G_ELEMENT_TYPE_REVENUE THEN
8991 --This chunk of code needs to be executed only when version type is REVENUE or targ bv id is not passed
8992 IF nvl(l_rev_budget_version_id,-1) <> -1 THEN
8993 OPEN c_impact_impl_csr(l_rev_budget_version_id , l_ci_all_version_id, 'REVENUE');
8994 FETCH c_impact_impl_csr INTO l_is_impl;
8995 IF c_impact_impl_csr%FOUND THEN
8996 x_rev_impl_flag := 'D';
8997 ELSE
8998 x_rev_impl_flag := 'Y';
8999 END IF;
9000 CLOSE c_impact_impl_csr;
9001 ELSIF l_rev_budget_version_id IS NULL THEN
9002 x_rev_impl_flag := 'X';
9003 END IF;
9004 END IF;
9005
9006 ELSIF l_all_budget_version_id IS NOT NULL THEN
9007 OPEN c_impact_impl_csr(l_all_budget_version_id , l_ci_all_version_id, 'COST');
9008 FETCH c_impact_impl_csr INTO l_is_impl;
9009 IF c_impact_impl_csr%FOUND THEN
9010 x_cost_impl_flag := 'D';
9011 ELSE
9012 x_cost_impl_flag := 'Y';
9013 END IF;
9014 CLOSE c_impact_impl_csr;
9015
9016 OPEN c_impact_impl_csr(l_all_budget_version_id , l_ci_all_version_id, 'REVENUE');
9017 FETCH c_impact_impl_csr INTO l_is_impl;
9018 IF c_impact_impl_csr%FOUND THEN
9019 x_rev_impl_flag := 'D';
9020 ELSE
9021 x_rev_impl_flag := 'Y';
9022 END IF;
9023 CLOSE c_impact_impl_csr;
9024 ELSE
9025 -- NULL indicates no current working version exists for this plan type
9026 x_cost_impl_flag := 'X';
9027 x_rev_impl_flag := 'X';
9028 END IF;
9029 END IF;
9030
9031 -- Derive the approved_rev_plan_type_flag if not passed
9032 IF l_current_working_flag = 'Y' THEN
9033 IF p_app_rev_plan_type_flag IS NULL THEN
9034 BEGIN
9035 SELECT approved_rev_plan_type_flag
9036 INTO l_app_rev_plan_type_flag
9037 FROM pa_proj_fp_options
9038 WHERE project_id = p_project_id
9039 AND fin_plan_option_level_code = 'PLAN_TYPE'
9040 AND fin_plan_type_id = p_fin_plan_type_id;
9041
9042 EXCEPTION
9043 WHEN NO_DATA_FOUND THEN
9044 IF P_PA_debug_mode = 'Y' THEN
9045 pa_debug.g_err_stage:='No data found while getting approved_rev_plan_type_flag ';
9046 pa_debug.write(l_mod_name,pa_debug.g_err_stage,l_debug_level5);
9047 END IF;
9048 RAISE ;
9049 END;
9050 ELSE
9051 l_app_rev_plan_type_flag := p_app_rev_plan_type_flag;
9052
9053 END IF;
9054
9055
9056 IF l_app_rev_plan_type_flag = 'Y' THEN
9057 Pa_Fp_Control_Items_Utils.get_fp_ci_agreement_dtls(p_project_id => p_project_id,
9058 p_ci_id => p_ci_id,
9059 x_agreement_num => x_agreement_num,
9060 x_agreement_amount => l_agreement_amount,
9061 x_agreement_currency_code => l_agreement_currency_code,
9062 x_msg_data => l_msg_data,
9063 x_msg_count => l_msg_count,
9064 x_return_status => l_return_status);
9065
9066 IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
9067 IF P_PA_debug_mode = 'Y' THEN
9068 pa_debug.g_err_stage:= 'Error in get_fp_ci_agreement_dtls';
9069 pa_debug.write(l_mod_name,pa_debug.g_err_stage,l_debug_level5);
9070 END IF;
9071 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
9072 END IF;
9073
9074 -- Modified if clause below for Bug 3668169
9075 --Changed the select for bug 3663513. This should get executed only if the revenue version exists
9076 IF ((nvl(l_rev_budget_version_id,-1) <> -1 OR nvl(l_all_budget_version_id,-1) <> -1))
9077 AND ((l_ci_rev_version_id IS NOT NULL) OR (l_ci_all_version_id IS NOT NULL)) THEN
9078
9079 /* Scheme Used to Derive Partial Impl Flag Below(this might change)
9080 ---------------------------------------------
9081 Fetch partial impl flag from pa_budget_versions
9082 for the ci_version
9083 If Flag is Y then
9084 Return Y
9085 If Flag is not Y then
9086 Check if revenue record exists for ci version and plan version
9087 in pa_fp_merged_ctrl_items.
9088 If Record Exists - Fuull Impl has taken place return N
9089 Else Check Partial Rev Enable FLag for plan type
9090 If Y then
9091 return Y
9092 else
9093 return N */
9094
9095 BEGIN
9096 -- Changed Select below for Bug 3668169
9097 SELECT nvl(rev_partially_impl_flag,'N')
9098 INTO x_partially_impl_flag
9099 FROM pa_budget_versions pbv
9100 WHERE pbv.budget_Version_id = nvl(l_ci_rev_version_id,l_ci_all_version_id);
9101
9102 /* SELECT nvl(rev_partially_impl_flag,'N')
9103 INTO x_partially_impl_flag
9104 FROM pa_budget_versions pbv
9105 WHERE pbv.budget_Version_id = decode( nvl(l_rev_budget_version_id,-1),
9106 -1,l_all_budget_version_id,
9107 l_rev_budget_version_id); */
9108
9109 EXCEPTION
9110 WHEN NO_DATA_FOUND THEN
9111 IF P_PA_debug_mode = 'Y' THEN
9112 pa_debug.g_err_stage:='get rev_partially_impl_flag - NO_DATA_FOUND ';
9113 pa_debug.write(l_mod_name,pa_debug.g_err_stage,l_debug_level5);
9114 END IF;
9115 RAISE ;
9116 END;
9117
9118 -- Added Code below for Bug 3668169 -- Starts
9119 IF x_partially_impl_flag = 'N' THEN
9120 BEGIN
9121 SELECT 'Y'
9122 INTO l_rev_impl_full
9123 FROM DUAL
9124 WHERE EXISTS (SELECT 1
9125 FROM PA_FP_MERGED_CTRL_ITEMS
9126 WHERE CI_PLAN_VERSION_ID = nvl(l_ci_rev_version_id,l_ci_all_version_id)
9127 AND version_type = 'REVENUE'
9128 AND PLAN_VERSION_ID = decode(nvl(l_rev_budget_version_id,-1),-1,l_all_budget_version_id
9129 ,l_rev_budget_version_id));
9130 EXCEPTION
9131 WHEN NO_DATA_FOUND THEN
9132 IF P_PA_debug_mode = 'Y' THEN
9133 pa_debug.g_err_stage:='Deriving rev partial flag - Rev not yet implemented';
9134 pa_debug.write(l_mod_name,pa_debug.g_err_stage,l_debug_level5);
9135 END IF;
9136 l_rev_impl_full := 'N';
9137 END;
9138
9139 IF l_rev_impl_full = 'Y' THEN
9140 x_partially_impl_flag := 'N';
9141 ELSIF l_rev_impl_full = 'N' THEN
9142 BEGIN
9143 SELECT nvl(enable_partial_impl_flag,'N')
9144 INTO x_partially_impl_flag
9145 FROM PA_FIN_PLAN_TYPES_B
9146 WHERE fin_plan_type_id = p_fin_plan_type_id;
9147 EXCEPTION
9148 WHEN NO_DATA_FOUND THEN
9149 IF P_PA_debug_mode = 'Y' THEN
9150 pa_debug.g_err_stage:='Deriving rev partial flag : Record not found for plan type';
9151 pa_debug.write(l_mod_name,pa_debug.g_err_stage,l_debug_level5);
9152 END IF;
9153 RAISE;
9154 END;
9155 END IF;
9156 END IF;
9157 -- Code for Bug 3668169 -- Ends
9158
9159 ELSE
9160 x_partially_impl_flag := 'N';
9161 END IF;
9162
9163 IF x_partially_impl_flag = 'Y' THEN
9164 x_rev_impl_flag := 'R';
9165 END IF;
9166
9167 x_approved_fin_pt_id := p_fin_plan_type_id;
9168 END IF;
9169 END IF; -- IF l_current_working_flag = 'Y'
9170
9171 IF x_cost_impl_flag = 'D' THEN
9172 -- Cost is implemented
9173 X_cost_impact_impl_flag := 'Y';
9174 ELSE
9175 IF x_cost_impl_flag ='H' AND x_rev_impl_flag ='D' THEN
9176 /* This is the case where there can be no cost version for the plan type and revenue has been completely implemented.
9177 So X_cost_impact_impl_flag is set to 'Y' to have the 'Implemented in Full' icon enabled. NOTE: It doesnt mean that cost
9178 has been implemented into this plan type*/
9179 X_cost_impact_impl_flag := 'Y';
9180 ELSE
9181 X_cost_impact_impl_flag := 'N';
9182 END IF;
9183 END IF;
9184
9185 IF x_rev_impl_flag = 'D' THEN
9186 -- Revenue is completely implemented
9187 X_rev_impact_impl_flag := 'Y';
9188 ELSE
9189 IF x_rev_impl_flag = 'H' AND x_cost_impl_flag = 'D' THEN
9190 /* This is the case where there can be no revenue version for the plan type and cost has been implemented.
9191 So X_rev_impact_impl_flag is set to 'Y' to have the 'Implemented in Full' icon enabled. NOTE: It doesnt mean that revenue
9192 has been implemented into this plan type*/
9193 X_rev_impact_impl_flag := 'Y';
9194 ELSE
9195 X_rev_impact_impl_flag := 'N';
9196 END IF;
9197 END IF;
9198
9199
9200 IF l_status_allows_cost_impl = 'N' THEN
9201 -- Status does not allow cost implementation
9202 X_cost_impl_flag := 'H';
9203 END IF;
9204
9205 IF l_status_allows_rev_impl = 'N' THEN
9206 -- Status does not allow revenue implementation
9207 X_rev_impl_flag := 'H';
9208 END IF;
9209
9210 IF P_PA_debug_mode = 'Y' THEN
9211 pa_debug.g_err_stage:= 'Exiting GET_IMPL_DETAILS';
9212 pa_debug.write(l_mod_name,pa_debug.g_err_stage,l_debug_level3);
9213 END IF;
9214
9215 pa_debug.reset_curr_function;
9216
9217 EXCEPTION
9218 WHEN PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc THEN
9219 l_msg_count := FND_MSG_PUB.count_msg;
9220
9221 IF l_msg_count = 1 and x_msg_data IS NULL THEN
9222 PA_INTERFACE_UTILS_PUB.get_messages
9223 (p_encoded => FND_API.G_TRUE
9224 ,p_msg_index => 1
9225 ,p_msg_count => l_msg_count
9226 ,p_msg_data => l_msg_data
9227 ,p_data => l_data
9228 ,p_msg_index_out => l_msg_index_out);
9229 x_msg_data := l_data;
9230 x_msg_count := l_msg_count;
9231 ELSE
9232 x_msg_count := l_msg_count;
9233 END IF;
9234 x_return_status := FND_API.G_RET_STS_ERROR;
9235
9236 pa_debug.reset_curr_function;
9237 RETURN;
9238
9239 WHEN Others THEN
9240 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
9241 x_msg_count := 1;
9242 x_msg_data := SQLERRM;
9243
9244 FND_MSG_PUB.add_exc_msg( p_pkg_name => 'Pa_Fp_Control_Items_Utils'
9245 ,p_procedure_name => 'GET_IMPL_DETAILS');
9246 IF P_PA_DEBUG_MODE = 'Y' THEN
9247 pa_debug.g_err_stage:='Unexpected Error ' || SQLERRM;
9248 pa_debug.write(l_mod_name,pa_debug.g_err_stage,l_debug_level5);
9249 END IF;
9250 pa_debug.reset_curr_function;
9251 RAISE;
9252
9253 END GET_IMPL_DETAILS;
9254
9255 -- This function returns either Y or N. If the user status code passed exists in
9256 -- pa_pt_co_impl_statuses, meaning that there exists a ci type whose change
9257 -- documents can be implemented/included into the working versions of a
9258 -- plan type, then Y is returned. N is returned otherwise
9259 FUNCTION is_user_status_implementable(p_status_code IN pa_control_items.status_code%TYPE)
9260 RETURN VARCHAR2
9261 IS
9262 l_status_implementable VARCHAR2(1);
9263 BEGIN
9264
9265 BEGIN
9266 SELECT 'Y'
9267 INTO l_status_implementable
9268 FROM DUAL
9269 WHERE EXISTS (SELECT 'X'
9270 FROM pa_pt_co_impl_statuses
9271 WHERE status_code=p_status_code);
9272 EXCEPTION
9273 WHEN NO_DATA_FOUND THEN
9274 l_status_implementable:='N';
9275 END;
9276
9277 RETURN l_status_implementable;
9278
9279 END;
9280
9281 --This API will be called from the View Financial Impact page. This API will return the details required for
9282 --that page
9283 --p_budget_version_id is the target version id with which comparision happens in the view fin impact page. If this
9284 --is available its not required to fetch the approved cost/rev current working ids.
9285 PROCEDURE get_dtls_for_view_fin_imp_pg
9286 (p_project_id IN pa_projects_all.project_id%TYPE,
9287 p_ci_id IN pa_control_items.ci_id%TYPE,
9288 p_ci_cost_version_id IN pa_budget_versions.budget_version_id%TYPE,
9289 p_ci_rev_version_id IN pa_budget_versions.budget_version_id%TYPE,
9290 p_ci_all_version_id IN pa_budget_versions.budget_version_id%TYPE,
9291 p_budget_version_id IN pa_budget_versions.budget_version_id%TYPE,
9292 x_app_cost_cw_ver_id OUT NOCOPY pa_budget_versions.budget_version_id%TYPE, --File.Sql.39 bug 4440895
9293 x_app_rev_cw_ver_id OUT NOCOPY pa_budget_versions.budget_version_id%TYPE, --File.Sql.39 bug 4440895
9294 x_ci_status_code OUT NOCOPY pa_control_items.status_code%TYPE, --File.Sql.39 bug 4440895
9295 x_project_currency_code OUT NOCOPY pa_projects_all.project_currency_code%TYPE, --File.Sql.39 bug 4440895
9296 x_impact_in_mc_flag OUT NOCOPY VARCHAR2, --File.Sql.39 bug 4440895
9297 x_targ_version_type OUT NOCOPY pa_budget_Versions.version_type%TYPE, --File.Sql.39 bug 4440895
9298 x_show_resources_flag OUT NOCOPY VARCHAR2, --File.Sql.39 bug 4440895
9299 x_plan_class_code OUT NOCOPY VARCHAR2, --File.Sql.39 bug 4440895
9300 x_report_cost_using OUT NOCOPY VARCHAR2, --File.Sql.39 bug 4440895
9301 x_cost_impl_into_app_cw_ver OUT NOCOPY VARCHAR2, --File.Sql.39 bug 4440895
9302 x_rev_impl_into_app_cw_ver OUT NOCOPY VARCHAR2, --File.Sql.39 bug 4440895
9303 x_ci_type OUT NOCOPY pa_ci_types_vl.name%TYPE, --File.Sql.39 bug 4440895
9304 x_ci_number OUT NOCOPY pa_control_items.ci_number%TYPE, --File.Sql.39 bug 4440895
9305 x_msg_data OUT NOCOPY VARCHAR2, --File.Sql.39 bug 4440895
9306 x_msg_count OUT NOCOPY NUMBER, --File.Sql.39 bug 4440895
9307 x_return_status OUT NOCOPY VARCHAR2) --File.Sql.39 bug 4440895
9308 IS
9309 --Start of variables used for debugging
9310 l_msg_count NUMBER :=0;
9311 l_data VARCHAR2(2000);
9312 l_msg_data VARCHAR2(2000);
9313 l_error_msg_code VARCHAR2(30);
9314 l_msg_index_out NUMBER;
9315 l_return_status VARCHAR2(2000);
9316 l_debug_mode VARCHAR2(30);
9317 l_module_name VARCHAR2(100) := 'PAFPCIUB.get_dtls_for_view_fin_imp_pg' ;
9318 --End of variables used for debugging
9319 l_cost_ci_version_id pa_budget_versions.budget_version_id%TYPE;
9320 l_rev_ci_version_id pa_budget_versions.budget_version_id%TYPE;
9321 l_all_ci_version_id pa_budget_versions.budget_version_id%TYPE;
9322 l_ci_resource_list_id1 pa_resource_lists_all_bg.resource_list_id%TYPE;
9323 l_ci_resource_list_id2 pa_resource_lists_all_bg.resource_list_id%TYPE;
9324 l_targ_resource_list_id1 pa_resource_lists_all_bg.resource_list_id%TYPE;
9325 l_targ_resource_list_id2 pa_resource_lists_all_bg.resource_list_id%TYPE;
9326 l_dummy VARCHAR2(1);
9327
9328 CURSOR c_ci_merge_csr(c_version_type pa_budget_Versions.version_type%TYPE,
9329 c_ci_version_id pa_budget_Versions.budget_Version_id%TYPE,
9330 c_app_cw_ver_id pa_budget_Versions.budget_Version_id%TYPE)
9331 IS
9332 SELECT 'x'
9333 FROM DUAL
9334 WHERE EXISTS (SELECT 'x'
9335 FROM pa_fp_merged_ctrl_items
9336 WHERE ci_id=p_ci_id
9337 AND plan_version_id=c_app_cw_ver_id
9338 AND ci_plan_version_id=c_ci_version_id
9339 AND version_type=c_version_type);
9340 BEGIN
9341 fnd_profile.get('PA_DEBUG_MODE',l_debug_mode);
9342 l_debug_mode := NVL(l_debug_mode, 'Y');
9343 x_msg_count := 0;
9344 x_return_status := FND_API.G_RET_STS_SUCCESS;
9345 PA_DEBUG.Set_Curr_Function( p_function => l_module_name,
9346 p_debug_mode => l_debug_mode );
9347
9348 IF p_ci_id IS NULL OR
9349 p_project_id IS NULL THEN
9350
9351 IF l_debug_mode = 'Y' THEN
9352 pa_debug.g_err_stage:= 'Passed project id is '||p_project_id;
9353 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
9354
9355 pa_debug.g_err_stage:= 'Passed p_ci_id is '||p_ci_id;
9356 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
9357
9358 END IF;
9359
9360 PA_UTILS.ADD_MESSAGE(p_app_short_name => 'PA',
9361 p_msg_name => 'PA_FP_INV_PARAM_PASSED',
9362 p_token1 => 'PROCEDURENAME',
9363 p_value1 => l_module_name);
9364
9365 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
9366
9367 END IF;
9368
9369 --Get the ci versions if not passed
9370 IF p_ci_cost_version_id IS NULL AND
9371 p_ci_rev_version_id IS NULL AND
9372 p_ci_all_version_id IS NULL THEN
9373
9374 Pa_Fp_Control_Items_Utils.get_ci_versions
9375 (p_ci_id => p_ci_id,
9376 x_cost_budget_version_id => l_cost_ci_version_id,
9377 x_rev_budget_version_id => l_rev_ci_version_id,
9378 x_all_budget_version_id => l_all_ci_version_id,
9379 x_return_status => x_return_status,
9380 x_msg_data => x_msg_data,
9381 X_msg_count => x_msg_count);
9382
9383 IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
9384
9385 IF l_debug_mode = 'Y' THEN
9386 pa_debug.g_err_stage:='Called API Pa_Fp_Control_Items_Utils.get_ci_versions returned error';
9387 pa_debug.write( l_module_name,pa_debug.g_err_stage,5);
9388 END IF;
9389
9390 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
9391
9392 END IF;
9393 ELSE
9394
9395 l_cost_ci_version_id:=p_ci_cost_version_id;
9396 l_rev_ci_version_id:=p_ci_rev_version_id;
9397 l_all_ci_version_id:=p_ci_all_version_id;
9398
9399 END IF;
9400
9401 IF l_debug_mode = 'Y' THEN
9402 pa_debug.g_err_stage:='Getting project currency code';
9403 pa_debug.write( l_module_name,pa_debug.g_err_stage,5);
9404 END IF;
9405
9406
9407 --Get the project currency code
9408 SELECT project_currency_code
9409 INTO x_project_currency_code
9410 FROM pa_projects_all
9411 WHERE project_id=p_project_id;
9412
9413 IF l_debug_mode = 'Y' THEN
9414 pa_debug.g_err_stage:='Getting ci status code';
9415 pa_debug.write( l_module_name,pa_debug.g_err_stage,3);
9416 END IF;
9417
9418 --Get the CI status code
9419 SELECT pps.project_system_status_code
9420 INTO x_ci_status_code
9421 FROM pa_control_items pci,
9422 pa_project_statuses pps
9423 WHERE pci.ci_id=p_ci_id
9424 AND pps.project_status_code=pci.status_code;
9425
9426 --Derive the value for x_impact_in_mc_flag. This should be 'Y' if either COST or REVENUE impact is
9427 --defined in multiple currencies
9428 IF l_debug_mode = 'Y' THEN
9429 pa_debug.g_err_stage:='Getting impact is mc flag';
9430 pa_debug.write( l_module_name,pa_debug.g_err_stage,3);
9431 END IF;
9432
9433 IF NVL(l_cost_ci_version_id,NVL(l_all_ci_version_id,l_rev_ci_version_id)) <>
9434 NVL(l_rev_ci_version_id,NVL(l_all_ci_version_id,l_cost_ci_version_id)) THEN
9435
9436 SELECT NVL(pfoc.margin_derived_from_code,'B'),
9437 DECODE(nvl(pfoc.plan_in_multi_curr_flag,'N'),
9438 'N',DECODE(nvl(pfor.plan_in_multi_curr_flag,'N'),
9439 'N','N',
9440 'Y'),
9441 'Y'),
9442 NVL(pfoc.cost_resource_list_id,NVL(pfoc.all_resource_list_id,pfoc.revenue_resource_list_id)),
9443 NVL(pfoc.revenue_resource_list_id,NVL(pfoc.all_resource_list_id,pfoc.cost_resource_list_id))
9444 INTO x_report_cost_using,
9445 x_impact_in_mc_flag,
9446 l_ci_resource_list_id1,
9447 l_ci_resource_list_id2
9448 FROM pa_proj_fp_options pfoc,
9449 pa_proj_fp_options pfor
9450 WHERE pfoc.fin_plan_version_id = NVL(l_cost_ci_version_id,NVL(l_all_ci_version_id,l_rev_ci_version_id))
9451 AND pfor.fin_plan_version_id = NVL(l_rev_ci_version_id,NVL(l_all_ci_version_id,l_cost_ci_version_id));
9452
9453 ELSE
9454
9455 SELECT DECODE(pfo.fin_plan_preference_code,
9456 'REVENUE_ONLY',NULL,
9457 NVL(pfo.margin_derived_from_code,'B')),
9458 NVL(pfo.plan_in_multi_curr_flag,'N'),
9459 NVL(pfo.cost_resource_list_id,NVL(pfo.all_resource_list_id,pfo.revenue_resource_list_id)),
9460 NVL(pfo.cost_resource_list_id,NVL(pfo.all_resource_list_id,pfo.revenue_resource_list_id))
9461 INTO x_report_cost_using,
9462 x_impact_in_mc_flag,
9463 l_ci_resource_list_id1,
9464 l_ci_resource_list_id2
9465 FROM pa_proj_fp_options pfo
9466 WHERE pfo.fin_plan_version_id=NVL(l_rev_ci_version_id,NVL(l_all_ci_version_id,l_cost_ci_version_id)) ;
9467
9468 END IF;
9469
9470 IF l_debug_mode = 'Y' THEN
9471 pa_debug.g_err_stage:='Getting app cost/rev current working version ids';
9472 pa_debug.write( l_module_name,pa_debug.g_err_stage,3);
9473 END IF;
9474
9475 --Call the API that will return the approved cost/rev current working version ids for the project
9476 IF p_budget_version_id IS NULL THEN
9477
9478 IF l_debug_mode = 'Y' THEN
9479 pa_debug.g_err_stage:='Getting app cost/rev current working version ids';
9480 pa_debug.write( l_module_name,pa_debug.g_err_stage,3);
9481 END IF;
9482
9483
9484 pa_fp_control_items_utils.get_app_cw_ver_ids_for_proj
9485 (p_project_id => p_project_id,
9486 x_app_cost_cw_ver_id => x_app_cost_cw_ver_id,
9487 x_app_rev_cw_ver_id => x_app_rev_cw_ver_id,
9488 x_msg_data => x_msg_data,
9489 x_msg_count => x_msg_count,
9490 x_return_status => x_return_status);
9491
9492 IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
9493
9494 IF l_debug_mode = 'Y' THEN
9495 pa_debug.g_err_stage:='Called API pa_fp_control_items_utils.get_app_cw_ver_ids_for_proj returned error';
9496 pa_debug.write( l_module_name,pa_debug.g_err_stage,5);
9497 END IF;
9498
9499 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
9500
9501 END IF;
9502
9503 --Get the resource list ids for the approved current working versions
9504 SELECT pbvc.resource_list_id,
9505 pbvr.resource_list_id
9506 INTO l_targ_resource_list_id1 ,
9507 l_targ_resource_list_id2
9508 FROM pa_budget_versions pbvc,
9509 pa_budget_versions pbvr
9510 WHERE pbvc.budget_version_id=nvl(x_app_cost_cw_ver_id,x_app_rev_cw_ver_id)
9511 AND pbvr.budget_version_id=nvl(x_app_rev_cw_ver_id,x_app_cost_cw_ver_id) ;
9512
9513 --The approved cost/rev current working versions will always be from plan type of plan class code BUDGET
9514 x_plan_class_code:='BUDGET';
9515
9516 ELSE
9517
9518 IF l_debug_mode = 'Y' THEN
9519 pa_debug.g_err_stage:='Getting the version type for the budget version id passed';
9520 pa_debug.write( l_module_name,pa_debug.g_err_stage,3);
9521 END IF;
9522
9523 --Select the version details of the budget version id passed
9524 SELECT pbv.version_type,
9525 pbv.resource_list_id,
9526 pbv.resource_list_id,
9527 fin.plan_class_code
9528 INTO x_targ_version_type,
9529 l_targ_resource_list_id1 ,
9530 l_targ_resource_list_id2,
9531 x_plan_class_code
9532 FROM pa_budget_versions pbv,
9533 pa_fin_plan_types_b fin
9534 WHERE budget_version_id=p_budget_version_id
9535 AND fin.fin_plan_type_id=pbv.fin_plan_type_id;
9536
9537
9538 END IF;
9539
9540 --Check whether the resource list ids of the CI version and target version are same or not
9541 --Bug 3977032. Changed the logic for deriving x_show_resources_flag. Please see comments below
9542 --The name "x_show_resources_flag" is misleading. Based on this "%change to budget" will either be shown or
9543 --hidden. The name has to be changed
9544 x_show_resources_flag:='Y';
9545 IF p_budget_version_id IS NULL THEN
9546 --Impact should be compared with Approved Current Working versions of project
9547
9548 --The below IF checks for the existence of impact and then it compares the resource list of the CI version
9549 --with the corresponding approved CW version.
9550 IF (l_cost_ci_version_id IS NOT NULL AND l_targ_resource_list_id1 <> l_ci_resource_list_id1) OR
9551 (l_rev_ci_version_id IS NOT NULL AND l_targ_resource_list_id2 <> l_ci_resource_list_id2) OR
9552 (l_all_ci_version_id IS NOT NULL AND l_targ_resource_list_id1 <> l_ci_resource_list_id1) THEN
9553
9554 x_show_resources_flag:='N';
9555
9556 END IF;
9557
9558 ELSIF p_budget_version_id IS NOT NULL THEN
9559
9560 --The below IF checks for the version type of the budget version in the context of which View financial
9561 --impact page is rendered and then based on the version type it compares the resource list of the buget version
9562 --and the correspondig impact
9563 --In the case of an ALL version, details from both cost /revenue impacts have to be shown. Hence its
9564 --resource list should be equal to the resource lists in both cost/rev ci versions. Note:This is not
9565 --required in the above If block since if the ci is of type ALL then the approved CW version should also
9566 --be of type ALL
9567 IF (x_targ_version_type = 'COST' AND l_targ_resource_list_id1 <> l_ci_resource_list_id1) OR
9568 (x_targ_version_type = 'REVENUE' AND l_targ_resource_list_id2 <> l_ci_resource_list_id2) OR
9569 (x_targ_version_type = 'ALL' AND (l_targ_resource_list_id1 <> l_ci_resource_list_id1 OR
9570 l_targ_resource_list_id2 <> l_ci_resource_list_id2)) THEN
9571
9572 x_show_resources_flag:='N';
9573
9574 END IF;
9575
9576 END IF;
9577
9578 --x_cost_impl_into_app_cw_ver should be Y if the change doc has got implemented into app_cw_ver
9579 --x_rev_impl_into_app_cw_ver should be Y if the change doc has got implemented into app_cw_ver
9580 IF l_debug_mode = 'Y' THEN
9581 pa_debug.g_err_stage:='Deriving x_cost_impl_into_app_cw_ver and x_rev_impl_into_app_cw_ver';
9582 pa_debug.write( l_module_name,pa_debug.g_err_stage,3);
9583 END IF;
9584
9585 IF NVL(l_cost_ci_version_id,l_all_ci_version_id) IS NOT NULL THEN
9586
9587 OPEN c_ci_merge_csr('COST',NVL(l_cost_ci_version_id,l_all_ci_version_id),nvl(p_budget_version_id,x_app_cost_cw_ver_id));
9588 FETCH c_ci_merge_csr INTO l_dummy;
9589
9590 IF c_ci_merge_csr%NOTFOUND THEN
9591
9592 x_cost_impl_into_app_cw_ver:='N';
9593
9594 ELSE
9595
9596 x_cost_impl_into_app_cw_ver:='Y';
9597
9598 END IF;
9599
9600 CLOSE c_ci_merge_csr;
9601
9602 END IF;
9603
9604 IF NVL(l_rev_ci_version_id,l_all_ci_version_id) IS NOT NULL THEN
9605
9606 OPEN c_ci_merge_csr('REVENUE',NVL(l_rev_ci_version_id,l_all_ci_version_id),nvl(p_budget_version_id,x_app_rev_cw_ver_id));
9607 FETCH c_ci_merge_csr INTO l_dummy;
9608
9609 IF c_ci_merge_csr%NOTFOUND THEN
9610
9611 x_rev_impl_into_app_cw_ver:='N';
9612
9613 ELSE
9614
9615 x_rev_impl_into_app_cw_ver:='Y';
9616
9617 END IF;
9618
9619 CLOSE c_ci_merge_csr;
9620
9621 END IF;
9622
9623 IF l_debug_mode = 'Y' THEN
9624 pa_debug.g_err_stage:='x_cost_impl_into_app_cw_ver is '||x_cost_impl_into_app_cw_ver;
9625 pa_debug.write( l_module_name,pa_debug.g_err_stage,3);
9626
9627 pa_debug.g_err_stage:='x_rev_impl_into_app_cw_ver is '||x_rev_impl_into_app_cw_ver;
9628 pa_debug.write( l_module_name,pa_debug.g_err_stage,3);
9629
9630 END IF;
9631
9632 --For bug 3957561
9633
9634 SELECT ci.ci_number,ct.name
9635 INTO x_ci_number,x_ci_type
9636 FROM pa_control_items ci,pa_ci_types_vl ct
9637 WHERE ci_id=p_ci_id
9638 AND ci.ci_type_id=ct.ci_type_id;
9639
9640 IF l_debug_mode = 'Y' THEN
9641 pa_debug.g_err_stage:='x_ci_number is '||x_ci_number;
9642 pa_debug.write( l_module_name,pa_debug.g_err_stage,3);
9643
9644 pa_debug.g_err_stage:='x_ci_type is '||x_ci_type;
9645 pa_debug.write( l_module_name,pa_debug.g_err_stage,3);
9646
9647 END IF;
9648
9649 --End of bug 3957561
9650
9651 IF l_debug_mode = 'Y' THEN
9652 pa_debug.g_err_stage:='Exiting get_dtls_for_view_fin_imp_pg';
9653 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
9654 END IF;
9655
9656 pa_debug.reset_curr_function;
9657
9658 EXCEPTION
9659
9660 WHEN PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc THEN
9661 l_msg_count := FND_MSG_PUB.count_msg;
9662 IF l_msg_count = 1 THEN
9663 PA_INTERFACE_UTILS_PUB.get_messages
9664 (p_encoded => FND_API.G_TRUE
9665 ,p_msg_index => 1
9666 ,p_msg_count => l_msg_count
9667 ,p_msg_data => l_msg_data
9668 ,p_data => l_data
9669 ,p_msg_index_out => l_msg_index_out);
9670 x_msg_data := l_data;
9671 x_msg_count := l_msg_count;
9672
9673 ELSE
9674
9675 x_msg_count := l_msg_count;
9676 END IF;
9677 x_return_status := FND_API.G_RET_STS_ERROR;
9678 pa_debug.reset_curr_function;
9679
9680 WHEN OTHERS THEN
9681
9682 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
9683 x_msg_count := 1;
9684 x_msg_data := SQLERRM;
9685 FND_MSG_PUB.add_exc_msg( p_pkg_name => 'PAFPCIUB'
9686 ,p_procedure_name => 'get_dtls_for_view_fin_imp_pg');
9687
9688 IF l_debug_mode = 'Y' THEN
9689 pa_debug.g_err_stage:='Unexpected Error'||SQLERRM;
9690 pa_debug.write(l_module_name,pa_debug.g_err_stage,5);
9691 END IF;
9692
9693 pa_debug.reset_curr_function;
9694 RAISE;
9695
9696 END get_dtls_for_view_fin_imp_pg;
9697
9698 --This procedure will return the approved cost/rev current working version ids for a project.
9699 --If there is only one version which is approved for both cost and revenue and then same version id will be
9700 --populated in both x_app_cost_cw_ver_id and x_app_rev_cw_ver_id
9701 --If the current working versions do not exist then null will be returned
9702 PROCEDURE get_app_cw_ver_ids_for_proj
9703 (p_project_id IN pa_projects_all.project_id%TYPE,
9704 x_app_cost_cw_ver_id OUT NOCOPY pa_budget_versions.budget_version_id%TYPE, --File.Sql.39 bug 4440895
9705 x_app_rev_cw_ver_id OUT NOCOPY pa_budget_versions.budget_version_id%TYPE, --File.Sql.39 bug 4440895
9706 x_msg_data OUT NOCOPY VARCHAR2, --File.Sql.39 bug 4440895
9707 x_msg_count OUT NOCOPY NUMBER, --File.Sql.39 bug 4440895
9708 x_return_status OUT NOCOPY VARCHAR2) --File.Sql.39 bug 4440895
9709 IS
9710 --Start of variables used for debugging
9711 l_msg_count NUMBER :=0;
9712 l_data VARCHAR2(2000);
9713 l_msg_data VARCHAR2(2000);
9714 l_error_msg_code VARCHAR2(30);
9715 l_msg_index_out NUMBER;
9716 l_return_status VARCHAR2(2000);
9717 l_debug_mode VARCHAR2(30);
9718 l_module_name VARCHAR2(100) := 'PAFPCIUB.get_app_cw_ver_ids_for_proj' ;
9719 --End of variables used for debugging
9720
9721 CURSOR c_app_cw_ver_csr
9722 IS
9723 SELECT budget_version_id,
9724 approved_cost_plan_type_flag,
9725 approved_rev_plan_type_flag
9726 FROM pa_budget_versions pbv
9727 WHERE pbv.project_id=p_project_id
9728 AND pbv.ci_id IS NULL
9729 AND pbv.fin_plan_type_id IS NOT NULL
9730 AND nvl(pbv.wp_version_flag,'N')='N'
9731 AND (pbv.approved_cost_plan_type_flag = 'Y' OR
9732 pbv.approved_rev_plan_type_flag = 'Y' )
9733 AND pbv.current_working_flag = 'Y';
9734
9735 l_app_cw_ver_rec c_app_cw_ver_csr%ROWTYPE;
9736
9737 BEGIN
9738 fnd_profile.get('PA_DEBUG_MODE',l_debug_mode);
9739 l_debug_mode := NVL(l_debug_mode, 'Y');
9740 x_msg_count := 0;
9741 x_return_status := FND_API.G_RET_STS_SUCCESS;
9742 PA_DEBUG.Set_Curr_Function( p_function => l_module_name,
9743 p_debug_mode => l_debug_mode );
9744
9745 IF p_project_id IS NULL THEN
9746
9747 IF l_debug_mode = 'Y' THEN
9748 pa_debug.g_err_stage:= 'Passed project id is '||p_project_id;
9749 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
9750
9751 END IF;
9752
9753 PA_UTILS.ADD_MESSAGE(p_app_short_name => 'PA',
9754 p_msg_name => 'PA_FP_INV_PARAM_PASSED',
9755 p_token1 => 'PROCEDURENAME',
9756 p_value1 => l_module_name);
9757
9758 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
9759
9760 END IF;
9761
9762 IF l_debug_mode = 'Y' THEN
9763 pa_debug.g_err_stage:='About to derive the CW ver ids';
9764 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
9765 END IF;
9766
9767 x_app_cost_cw_ver_id:=NULL;
9768 x_app_cost_cw_ver_id:=NULL;
9769 OPEN c_app_cw_ver_csr;
9770 LOOP
9771 FETCH c_app_cw_ver_csr INTO l_app_cw_ver_rec;
9772 EXIT WHEN c_app_cw_ver_csr%NOTFOUND;
9773 IF l_app_cw_ver_rec.approved_cost_plan_type_flag ='Y' THEN
9774
9775 x_app_cost_cw_ver_id:=l_app_cw_ver_rec.budget_version_id;
9776
9777 END IF;
9778
9779 IF l_app_cw_ver_rec.approved_rev_plan_type_flag ='Y' THEN
9780
9781 x_app_rev_cw_ver_id:=l_app_cw_ver_rec.budget_version_id;
9782
9783 END IF;
9784
9785 END LOOP;
9786
9787 CLOSE c_app_cw_ver_csr; -- Added for bug#6405905
9788
9789
9790 IF l_debug_mode = 'Y' THEN
9791
9792 pa_debug.g_err_stage:='Derived x_app_cost_cw_ver_id is '||x_app_cost_cw_ver_id ||' x_app_rev_cw_ver_id is '||x_app_rev_cw_ver_id;
9793 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
9794
9795 pa_debug.g_err_stage:='Exiting get_app_cw_ver_ids_for_proj';
9796 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
9797 END IF;
9798
9799 pa_debug.reset_curr_function;
9800
9801 EXCEPTION
9802
9803 WHEN PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc THEN
9804
9805 CLOSE c_app_cw_ver_csr; -- Added for bug#6405905
9806
9807 l_msg_count := FND_MSG_PUB.count_msg;
9808 IF l_msg_count = 1 THEN
9809 PA_INTERFACE_UTILS_PUB.get_messages
9810 (p_encoded => FND_API.G_TRUE
9811 ,p_msg_index => 1
9812 ,p_msg_count => l_msg_count
9813 ,p_msg_data => l_msg_data
9814 ,p_data => l_data
9815 ,p_msg_index_out => l_msg_index_out);
9816 x_msg_data := l_data;
9817 x_msg_count := l_msg_count;
9818
9819 ELSE
9820
9821 x_msg_count := l_msg_count;
9822 END IF;
9823 x_return_status := FND_API.G_RET_STS_ERROR;
9824 pa_debug.reset_curr_function;
9825
9826 WHEN OTHERS THEN
9827
9828 CLOSE c_app_cw_ver_csr; -- Added for bug#6405905 by vvjoshi
9829
9830 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
9831 x_msg_count := 1;
9832 x_msg_data := SQLERRM;
9833 FND_MSG_PUB.add_exc_msg( p_pkg_name => 'PAFPCIUB'
9834 ,p_procedure_name => 'get_app_cw_ver_ids_for_proj');
9835
9836 IF l_debug_mode = 'Y' THEN
9837 pa_debug.g_err_stage:='Unexpected Error'||SQLERRM;
9838 pa_debug.write(l_module_name,pa_debug.g_err_stage,5);
9839 END IF;
9840 pa_debug.reset_curr_function;
9841 RAISE;
9842
9843 END get_app_cw_ver_ids_for_proj;
9844
9845 /* Bug 3731948- New Function to return the CO amount already implemented
9846 * for REVENUE implementation in agreement currency
9847 */
9848 FUNCTION get_impl_agr_revenue (p_project_id IN pa_projects_all.project_id%TYPE,
9849 p_ci_id IN pa_fp_merged_ctrl_items.ci_id%TYPE)
9850 RETURN NUMBER
9851 IS
9852 l_impl_agr_rev_amt NUMBER := 0;
9853 l_cw_bv_id NUMBER;
9854 l_ci_rev_version_id NUMBER;
9855 l_debug_mode VARCHAR2(30);
9856 l_module_name VARCHAR2(30) := 'get_impl_agr_revenue';
9857
9858 l_msg_count NUMBER := 0;
9859 l_data VARCHAR2(2000);
9860 l_msg_data VARCHAR2(2000);
9861 l_msg_index_out NUMBER;
9862
9863
9864
9865 BEGIN
9866 fnd_profile.get('PA_DEBUG_MODE',l_debug_mode);
9867
9868 IF l_debug_mode = 'Y' THEN
9869 pa_debug.g_err_stage:='get_impl_agr_revenue - pa_fp_control_items_utils ';
9870 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
9871 END IF;
9872 PA_DEBUG.Set_Curr_Function( p_function => l_module_name,
9873 p_debug_mode => l_debug_mode );
9874
9875 -- Throwing error if the inputs are Null
9876 IF p_project_id IS NULL OR
9877 p_ci_id IS NULL THEN
9878 IF l_debug_mode = 'Y' THEN
9879 pa_debug.g_err_stage:='Input p_project_id/p_ci_id is NULL';
9880 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
9881 END IF;
9882 pa_debug.reset_curr_function;
9883 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
9884 END IF;
9885
9886 BEGIN
9887 -- Selecting budget_version_id for the Rev CI version
9888 SELECT budget_version_id
9889 INTO l_ci_rev_version_id
9890 FROM pa_budget_versions
9891 WHERE project_id = p_project_id
9892 AND ci_id = p_ci_id
9893 AND Nvl(approved_rev_plan_type_flag, 'N')= 'Y'
9894 AND version_type IN ('REVENUE','ALL');
9895
9896 -- Selecting the budget_version_id of the target current working version
9897 SELECT budget_version_id
9898 INTO l_cw_bv_id
9899 FROM pa_budget_versions
9900 WHERE project_id = p_project_id
9901 AND Nvl(approved_rev_plan_type_flag, 'N')= 'Y'
9902 AND Nvl(current_working_flag, 'N') = 'Y';
9903
9904 EXCEPTION
9905 WHEN NO_DATA_FOUND THEN
9906 IF l_debug_mode = 'Y' THEN
9907 pa_debug.g_err_stage:='No Rev Current Working Version Exists';
9908 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
9909 END IF;
9910 pa_debug.reset_curr_function;
9911
9912 RETURN l_impl_agr_rev_amt;
9913
9914 WHEN OTHERS THEN
9915 IF l_debug_mode = 'Y' THEN
9916 pa_debug.g_err_stage:='Unexpected Error'||SQLERRM;
9917 pa_debug.write(l_module_name || g_module_name,pa_debug.g_err_stage,5);
9918 END IF;
9919 pa_debug.reset_curr_function;
9920 RAISE;
9921 END;
9922 IF l_debug_mode = 'Y' THEN
9923 pa_debug.g_err_stage:='Rev Current Working version id: ' || l_cw_bv_id;
9924 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
9925 END IF;
9926
9927 BEGIN
9928 -- Selecting the revenue amount implemeted in agreement currency
9929 SELECT Nvl(impl_agr_revenue,0)
9930 INTO l_impl_agr_rev_amt
9931 FROM pa_fp_merged_ctrl_items
9932 WHERE project_id = p_project_id
9933 AND ci_id = p_ci_id
9934 AND plan_version_id = l_cw_bv_id
9935 AND ci_plan_version_id = l_ci_rev_version_id
9936 AND version_type = 'REVENUE';
9937
9938 EXCEPTION
9939 WHEN NO_DATA_FOUND THEN
9940 IF l_debug_mode = 'Y' THEN
9941 pa_debug.g_err_stage:='No Rev Current Working Version Exists';
9942 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
9943 END IF;
9944 pa_debug.reset_curr_function;
9945
9946 RETURN l_impl_agr_rev_amt;
9947 WHEN OTHERS THEN
9948 IF l_debug_mode = 'Y' THEN
9949 pa_debug.g_err_stage:='Unexpected Error'||SQLERRM;
9950 pa_debug.write(l_module_name || g_module_name,pa_debug.g_err_stage,5);
9951 END IF;
9952 pa_debug.reset_curr_function;
9953 RAISE;
9954 END;
9955
9956 IF l_debug_mode = 'Y' THEN
9957 pa_debug.g_err_stage:='Agr Revenue Amount: ' || l_impl_agr_rev_amt;
9958 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
9959 END IF;
9960
9961 pa_debug.reset_curr_function;
9962
9963 RETURN l_impl_agr_rev_amt;
9964
9965 EXCEPTION
9966 WHEN PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc THEN
9967 l_msg_count := FND_MSG_PUB.count_msg;
9968 IF l_msg_count = 1 THEN
9969 PA_INTERFACE_UTILS_PUB.get_messages
9970 (p_encoded => FND_API.G_TRUE
9971 ,p_msg_index => 1
9972 ,p_msg_count => l_msg_count
9973 ,p_msg_data => l_msg_data
9974 ,p_data => l_data
9975 ,p_msg_index_out => l_msg_index_out);
9976 END IF;
9977 pa_debug.reset_curr_function;
9978
9979 WHEN OTHERS THEN
9980 FND_MSG_PUB.add_exc_msg( p_pkg_name => 'PAFPCIUB'
9981 ,p_procedure_name => 'get_app_cw_ver_ids_for_proj');
9982
9983 IF l_debug_mode = 'Y' THEN
9984 pa_debug.g_err_stage:='Unexpected Error'||SQLERRM;
9985 pa_debug.write(l_module_name,pa_debug.g_err_stage,5);
9986 END IF;
9987 pa_debug.reset_curr_function;
9988 RAISE;
9989 END get_impl_agr_revenue;
9990
9991 /*Function added for EnC */
9992
9993 FUNCTION is_edit_plan_enabled(p_ci_id IN pa_ci_impacts.ci_id%TYPE)
9994 RETURN VARCHAR2
9995 IS
9996 l_is_editplanned_enabled varchar2(1) := 'N';
9997 BEGIN
9998 SELECT 'Y'
9999 INTO l_is_editplanned_enabled
10000 FROM DUAL
10001 WHERE EXISTS (SELECT 1
10002 FROM PA_CI_TYPES_V
10003 WHERE CI_TYPE_ID = (SELECT CI_TYPE_ID FROM PA_CONTROL_ITEMS WHERE CI_ID = p_ci_id)
10004 AND (IMPACT_BUDGET_TYPE_CODE = 'EDIT_PLANNED_AMOUNTS' OR
10005 /* Added OR contion Bug 13960686 */
10006 IMPACT_BUDGET_TYPE_CODE = 'DIRECT_COST_ENTRY' )
10007 );/* Changed the Query for E&C 12.1.3 */
10008
10009 RETURN l_is_editplanned_enabled;
10010
10011 EXCEPTION
10012 WHEN NO_DATA_FOUND THEN
10013 RETURN 'N';
10014
10015 END is_edit_plan_enabled;
10016
10017 /* Function returns 'Y' if the change order has been implemented/included into ANY budget version. */
10018 FUNCTION has_co_been_merged(p_ci_id IN pa_ci_impacts.ci_id%TYPE)
10019 RETURN VARCHAR2
10020 IS
10021 l_is_merged varchar2(1) := 'N';
10022 BEGIN
10023 SELECT 'Y'
10024 INTO l_is_merged
10025 FROM DUAL
10026 WHERE EXISTS (SELECT 1
10027 FROM PA_FP_MERGED_CTRL_ITEMS
10028 WHERE CI_ID = p_ci_id);
10029
10030 RETURN l_is_merged;
10031
10032 EXCEPTION
10033 WHEN NO_DATA_FOUND THEN
10034 RETURN 'N';
10035
10036 END has_co_been_merged;
10037
10038 /* This API returns the txn_currency_code and the ci version id of the budget lines of a REVENUE or ALL ci version, if lines exist. Else it returns NULL
10039 All the lines of a revenue change order version will be in a single currency
10040 */
10041 PROCEDURE get_txn_curr_code_of_ci_ver(
10042 p_project_id IN pa_projects_all.project_id%TYPE
10043 ,p_ci_id IN pa_budget_versions.ci_id%TYPE
10044 ,x_txn_currency_code OUT NOCOPY pa_budget_lines.txn_currency_code%TYPE --File.Sql.39 bug 4440895
10045 ,x_budget_version_id OUT NOCOPY pa_budget_versions.budget_version_id%TYPE --File.Sql.39 bug 4440895
10046 ,x_msg_data OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
10047 ,x_msg_count OUT NOCOPY NUMBER --File.Sql.39 bug 4440895
10048 ,x_return_status OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
10049 )
10050 IS
10051
10052 l_msg_count NUMBER := 0;
10053 l_data VARCHAR2(2000);
10054 l_msg_data VARCHAR2(2000);
10055 l_msg_index_out NUMBER;
10056
10057 BEGIN
10058
10059 x_msg_count := 0;
10060 x_return_status := FND_API.G_RET_STS_SUCCESS;
10061
10062 -- Set curr function
10063 pa_debug.set_curr_function(
10064 p_function =>'PAFPCIUB.get_txn_curr_code_of_ci_ver'
10065 ,p_debug_mode => P_PA_DEBUG_MODE );
10066
10067 -- Validate input parameters
10068 IF P_PA_DEBUG_MODE = 'Y' THEN
10069 pa_debug.g_err_stage:='Validating input parameters';
10070 pa_debug.write('get_txn_curr_code_of_ci_ver: ' || g_module_name,pa_debug.g_err_stage,3);
10071 END IF;
10072
10073
10074 IF (p_project_id IS NULL) OR (p_ci_id IS NULL)
10075 THEN
10076
10077 IF P_PA_DEBUG_MODE = 'Y' THEN
10078 pa_debug.g_err_stage:='p_project_id = '||p_project_id;
10079 pa_debug.write('get_txn_curr_code_of_ci_ver: ' || g_module_name,pa_debug.g_err_stage,5);
10080
10081 pa_debug.g_err_stage:='p_ci_id = '||p_ci_id;
10082 pa_debug.write('get_txn_curr_code_of_ci_ver: ' || g_module_name,pa_debug.g_err_stage,5);
10083 END IF;
10084
10085 PA_UTILS.ADD_MESSAGE( p_app_short_name => 'PA',
10086 p_msg_name => 'PA_FP_INV_PARAM_PASSED',
10087 p_token1 => 'PROCEDURENAME',
10088 p_value1 => 'PAFPCIUB.get_txn_curr_code_of_ci_ver');
10089
10090 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
10091
10092 END IF;
10093
10094
10095 -- Check if budget line exists for any of the budget versions of the project-plan type
10096 Begin
10097
10098 SELECT rac.txn_currency_code,
10099 rac.budget_version_id
10100 INTO x_txn_currency_code,
10101 x_budget_version_id
10102 FROM pa_resource_asgn_curr rac,
10103 pa_budget_versions bv
10104 WHERE bv.project_id = p_project_id
10105 AND bv.ci_id = p_ci_id
10106 AND bv.version_type IN ('REVENUE','ALL')
10107 AND rac.budget_version_id = bv.budget_version_id
10108 AND rownum=1;
10109
10110 -- reset curr function
10111 pa_debug.reset_curr_function();
10112
10113 Exception
10114 When no_data_found Then
10115 -- reset curr function
10116 pa_debug.reset_curr_function();
10117 End;
10118
10119 EXCEPTION
10120 WHEN PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc THEN
10121 l_msg_count := FND_MSG_PUB.count_msg;
10122 IF l_msg_count = 1 THEN
10123 PA_INTERFACE_UTILS_PUB.get_messages
10124 (p_encoded => FND_API.G_TRUE
10125 ,p_msg_index => 1
10126 ,p_msg_count => l_msg_count
10127 ,p_msg_data => l_msg_data
10128 ,p_data => l_data
10129 ,p_msg_index_out => l_msg_index_out);
10130 x_msg_data := l_data;
10131 x_msg_count := l_msg_count;
10132
10133 ELSE
10134
10135 x_msg_count := l_msg_count;
10136 END IF;
10137 x_return_status := FND_API.G_RET_STS_ERROR;
10138 pa_debug.reset_curr_function;
10139 WHEN Others THEN
10140
10141 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
10142 x_msg_count := 1;
10143 x_msg_data := SQLERRM;
10144
10145 FND_MSG_PUB.add_exc_msg( p_pkg_name => 'Pa_Fp_Control_Items_Utils'
10146 ,p_procedure_name => 'get_txn_curr_code_of_ci_ver');
10147
10148 IF P_PA_DEBUG_MODE = 'Y' THEN
10149 pa_debug.g_err_stage:='Unexpected Error'||SQLERRM;
10150 pa_debug.write('get_txn_curr_code_of_ci_ver: ' || g_module_name,pa_debug.g_err_stage,5);
10151 END IF;
10152
10153 -- reset curr function
10154 pa_debug.Reset_Curr_Function();
10155
10156 RAISE;
10157
10158 END get_txn_curr_code_of_ci_ver;
10159
10160 /* Bug 3927208: DBORA- The following function is to be used by Control Item team, before
10161 * deleting any CI type from the system, to check if the ci type is being used
10162 * in any financial plan type context to define implementation/inclusion statuses
10163 * for financial impact implementation
10164 */
10165 FUNCTION validate_fp_ci_type_delete (p_ci_type_id IN pa_ci_types_b.ci_type_id%TYPE)
10166 RETURN VARCHAR2
10167 IS
10168 l_debug_mode VARCHAR2(30);
10169 l_module_name VARCHAR2(30) := 'validate_fp_ci_type_delete';
10170 l_msg_count NUMBER := 0;
10171 l_data VARCHAR2(2000);
10172 l_msg_data VARCHAR2(2000);
10173 l_msg_index_out NUMBER;
10174
10175 is_delete_allowed VARCHAR2(1) := 'Y';
10176
10177 BEGIN
10178 fnd_profile.get('PA_DEBUG_MODE',l_debug_mode);
10179
10180 IF l_debug_mode = 'Y' THEN
10181 pa_debug.g_err_stage:='validate_fp_ci_type_delete - pa_fp_control_items_utils ';
10182 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
10183 END IF;
10184 PA_DEBUG.Set_Curr_Function( p_function => l_module_name,
10185 p_debug_mode => l_debug_mode );
10186
10187 IF l_debug_mode = 'Y' THEN
10188 pa_debug.g_err_stage:='Entering validate_fp_ci_type_delete';
10189 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
10190 END IF;
10191
10192 IF p_ci_type_id IS NULL THEN
10193 IF l_debug_mode = 'Y' THEN
10194 pa_debug.g_err_stage:='Input p_ci_type_id is NULL';
10195 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
10196 END IF;
10197 PA_UTILS.ADD_MESSAGE( p_app_short_name => 'PA',
10198 p_msg_name => 'PA_FP_INV_PARAM_PASSED',
10199 p_token1 => 'PROCEDURENAME',
10200 p_value1 => 'PAFPCIUB.validate_fp_ci_type_delete');
10201 pa_debug.reset_curr_function;
10202 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
10203 END IF;
10204
10205 IF l_debug_mode = 'Y' THEN
10206 pa_debug.g_err_stage:='Checkin if delete allowed';
10207 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
10208 END IF;
10209
10210 BEGIN
10211 SELECT 'N'
10212 INTO is_delete_allowed
10213 FROM DUAL
10214 WHERE EXISTS (SELECT 'X'
10215 FROM pa_pt_co_impl_statuses
10216 WHERE ci_type_id = p_ci_type_id);
10217 EXCEPTION
10218 WHEN NO_DATA_FOUND THEN
10219 RETURN is_delete_allowed;
10220 END;
10221
10222 IF l_debug_mode = 'Y' THEN
10223 pa_debug.g_err_stage:='Check completed';
10224 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
10225 pa_debug.g_err_stage:='Value returned: ' || is_delete_allowed;
10226 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
10227 pa_debug.g_err_stage:='Leaving validate_fp_ci_type_delete';
10228 pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
10229 END IF;
10230
10231 pa_debug.reset_curr_function;
10232
10233 RETURN is_delete_allowed;
10234
10235 EXCEPTION
10236 WHEN PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc THEN
10237 l_msg_count := FND_MSG_PUB.count_msg;
10238 IF l_msg_count = 1 THEN
10239 PA_INTERFACE_UTILS_PUB.get_messages
10240 (p_encoded => FND_API.G_TRUE
10241 ,p_msg_index => 1
10242 ,p_msg_count => l_msg_count
10243 ,p_msg_data => l_msg_data
10244 ,p_data => l_data
10245 ,p_msg_index_out => l_msg_index_out);
10246 END IF;
10247 pa_debug.reset_curr_function;
10248 WHEN OTHERS THEN
10249 FND_MSG_PUB.add_exc_msg( p_pkg_name => 'PAFPCIUB'
10250 ,p_procedure_name => 'validate_fp_ci_type_delete');
10251
10252 IF l_debug_mode = 'Y' THEN
10253 pa_debug.g_err_stage:='Unexpected Error'||SQLERRM;
10254 pa_debug.write(l_module_name,pa_debug.g_err_stage,5);
10255 END IF;
10256 pa_debug.reset_curr_function;
10257 RAISE;
10258 END validate_fp_ci_type_delete;
10259
10260 -- Bug 5845142. This function will be used to check if inclusion of change orders is possible into
10261 -- unapproved budgets. It will return N only when the approved cost plan type (approved only for cost
10262 -- but not for revenue) is setup as "Cost and Revenue" Together. In other cases it will return Y
10263 -- indicating that the change orders can be included into unapproved budgets
10264 FUNCTION check_valid_combo
10265 (p_project_id IN NUMBER,
10266 p_targ_app_cost_flag IN VARCHAR2,
10267 p_targ_app_rev_flag IN VARCHAR2)
10268 RETURN VARCHAR2 IS
10269 --Bug 5845142
10270 l_app_cost_pt_rev_flag pa_proj_fp_options.approved_cost_plan_type_flag%TYPE;
10271 l_app_cost_pt_pref_code pa_proj_fp_options.fin_plan_preference_code%TYPE;
10272 BEGIN
10273
10274 IF l_cvc_project_id=p_project_id THEN
10275
10276 l_app_cost_pt_rev_flag := l_cvc_app_cost_pt_rev_flag;
10277 l_app_cost_pt_pref_code := l_cvc_app_cost_pt_pref_code;
10278
10279 ELSE
10280
10281 BEGIN
10282
10283 SELECT nvl(pfo.approved_rev_plan_type_flag,'N'),
10284 nvl(pfo.fin_plan_preference_code,'N')
10285 INTO l_app_cost_pt_rev_flag,
10286 l_app_cost_pt_pref_code
10287 FROM pa_proj_fp_options pfo
10288 WHERE pfo.project_id = p_project_id
10289 AND pfo.fin_plan_version_id IS NULL
10290 AND pfo.approved_cost_plan_type_flag ='Y';
10291
10292 EXCEPTION
10293 WHEN NO_DATA_FOUND THEN
10294 l_app_cost_pt_rev_flag := NULL;
10295 l_app_cost_pt_pref_code := NULL;
10296 END;
10297
10298 l_cvc_project_id := p_project_id;
10299 l_cvc_app_cost_pt_rev_flag := l_app_cost_pt_rev_flag;
10300 l_cvc_app_cost_pt_pref_code := l_app_cost_pt_pref_code;
10301
10302 END IF;
10303
10304 IF l_app_cost_pt_rev_flag='N' AND
10305 l_app_cost_pt_pref_code='COST_AND_REV_SAME' THEN
10306
10307 IF p_targ_app_cost_flag <> 'Y' AND
10308 p_targ_app_rev_flag <> 'Y' THEN
10309
10310 RETURN 'N';
10311
10312 END IF;
10313
10314 END IF;
10315
10316 RETURN 'Y';
10317
10318 END check_valid_combo;
10319
10320 END Pa_Fp_Control_Items_Utils;