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