DBA Data[Home] [Help]

PACKAGE BODY: APPS.PA_FP_CONTROL_ITEMS_UTILS

Source


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