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