DBA Data[Home] [Help]

PACKAGE BODY: APPS.PA_FIN_PLAN_TYPE_GLOBAL

Source


1 PACKAGE BODY pa_fin_plan_type_global as
2 /* $Header: PAFPPTGB.pls 120.3 2011/03/28 07:05:34 kkorrapo ship $
3    Start of Comments
4    Package name     : PA_FIN_PLAN_TYPE_GLOBAL
5    Purpose          : API's for Org Forecast: PLANS Page
6    History          :
7    NOTE             :
8    End of Comments
9 */
10 
11 P_PA_DEBUG_MODE varchar2(1) := NVL(FND_PROFILE.value('PA_DEBUG_MODE'), 'N');
12 
13 function Get_Project_Id return NUMBER is
14 BEGIN
15   return pa_fin_plan_type_global.G_PROJECT_ID;
16 END Get_Project_Id;
17 
18 /*
19 function Get_Plan_Class_Code return VARCHAR2 is
20 BEGIN
21   return pa_fin_plan_type_global.G_PLAN_CLASS_CODE;
22 END Get_Plan_Class_Code;
23 */
24 
25 PROCEDURE set_global_variables
26     (p_project_id      IN   pa_budget_versions.project_id%TYPE,
27      -- p_plan_class_code IN    pa_fin_plan_types_b.plan_class_code%TYPE,
28      x_factor_by_code  OUT  NOCOPY pa_proj_fp_options.factor_by_code%TYPE, --File.Sql.39 bug 4440895
29      x_return_status   OUT  NOCOPY VARCHAR2, --File.Sql.39 bug 4440895
30      x_msg_count       OUT  NOCOPY NUMBER, --File.Sql.39 bug 4440895
31      x_msg_data    OUT  NOCOPY VARCHAR2) --File.Sql.39 bug 4440895
32 is
33 BEGIN
34   x_return_status    := FND_API.G_RET_STS_SUCCESS;
35   x_msg_count := 0;
36   pa_fin_plan_type_global.G_PROJECT_ID := p_project_id;
37   -- pa_fin_plan_type_global.G_PLAN_CLASS_CODE := p_plan_class_code;
38   -- *** bug fix 2770782: retrieve x_budget_status code from project-level row ***
39   select nvl(po.factor_by_code, 1)
40     into x_factor_by_code
41     from pa_proj_fp_options po
42     where po.project_id = p_project_id and
43           po.fin_plan_option_level_code = 'PROJECT';
44 
45 EXCEPTION WHEN NO_DATA_FOUND THEN
46                x_factor_by_code := 1;
47           WHEN OTHERS THEN
48                  x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
49                  x_msg_count     := 1;
50                  x_msg_data      := SQLERRM;
51                  FND_MSG_PUB.add_exc_msg( p_pkg_name         => 'PA_FIN_PLAN_TYPE_GLOBAL',
52                                           p_procedure_name   => 'set_global_variables');
53 END set_global_variables;
54 
55 PROCEDURE pa_fp_get_orgfcst_version_id( p_project_id          IN   NUMBER,
56                                         p_plan_type_id        IN   NUMBER,
57                                     p_plan_status_code    IN   VARCHAR2,
58                                     x_orgfcst_version_id  OUT  NOCOPY NUMBER, --File.Sql.39 bug 4440895
59                                     x_return_status       OUT NOCOPY VARCHAR2, --File.Sql.39 bug 4440895
60                                     x_msg_count           OUT NOCOPY NUMBER, --File.Sql.39 bug 4440895
61                                     x_msg_data            OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
62                                    )
63 IS
64 cursor cb_csr is
65  select budget_version_id
66    from   pa_budget_versions
67    where  project_id = p_project_id and
68           fin_plan_type_id = p_plan_type_id and
69           version_type = 'ORG_FORECAST' and
70           current_flag = 'Y';
71 cb_rec cb_csr%ROWTYPE;
72 
73 cursor cw_csr is
74  select budget_version_id
75    from   pa_budget_versions
76    where  project_id = p_project_id and
77           fin_plan_type_id = p_plan_type_id and
78           version_type = 'ORG_FORECAST' and
79           current_working_flag = 'Y';
80 cw_rec cw_csr%ROWTYPE;
81 
82 BEGIN
83 x_return_status    := FND_API.G_RET_STS_SUCCESS;
84 IF p_plan_status_code = 'CB' THEN
85   open cb_csr;
86   fetch cb_csr into cb_rec;
87   if cb_csr%NOTFOUND then
88 	x_orgfcst_version_id := -1;
89   else
90 	x_orgfcst_version_id := cb_rec.budget_version_id;
91   end if;
92   close cb_csr;
93 ELSE
94   open cw_csr;
95   fetch cw_csr into cw_rec;
96   if cw_csr%NOTFOUND then
97 	x_orgfcst_version_id := -1;
98   else
99 	x_orgfcst_version_id := cw_rec.budget_version_id;
100   end if;
101   close cw_csr;
102 END IF;
103 
104 EXCEPTION
105     WHEN OTHERS THEN
106       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
107       x_msg_count     := 1;
108       x_msg_data      := SQLERRM;
109       FND_MSG_PUB.add_exc_msg( p_pkg_name         => 'PA_FIN_PLAN_TYPE_GLOBAL',
110                                p_procedure_name   => 'pa_fp_get_orgfcst_version_id');
111 END pa_fp_get_orgfcst_version_id;
112 /* ------------------------------------------------------------------- */
113 
114 PROCEDURE pa_fp_get_finplan_version_id
115     (p_project_id          IN   NUMBER,
116      p_plan_type_id        IN   NUMBER,
117      p_plan_status_code    IN   VARCHAR2,
118      x_cost_version_id     OUT  NOCOPY NUMBER, --File.Sql.39 bug 4440895
119      x_rev_version_id      OUT  NOCOPY NUMBER, --File.Sql.39 bug 4440895
120      x_return_status       OUT NOCOPY VARCHAR2, --File.Sql.39 bug 4440895
121      x_msg_count           OUT NOCOPY NUMBER, --File.Sql.39 bug 4440895
122      x_msg_data            OUT NOCOPY VARCHAR2) --File.Sql.39 bug 4440895
123 is
124 
125 -- we will get only one version per cursor
126 cursor working_cost_csr is
127     select budget_version_id
128       from pa_budget_versions
129       where project_id = p_project_id and
130             fin_plan_type_id = p_plan_type_id and
131             version_type in ('COST', 'ALL') and
132             current_working_flag = 'Y';
133 working_cost_rec working_cost_csr%ROWTYPE;
134 
135 cursor working_revenue_csr is
136     select budget_version_id
137       from pa_budget_versions
138       where project_id = p_project_id and
139             fin_plan_type_id = p_plan_type_id and
140             version_type in ('REVENUE', 'ALL') and
141             current_working_flag = 'Y';
142 working_revenue_rec working_revenue_csr%ROWTYPE;
143 
144 cursor baselined_cost_csr is
145     select budget_version_id
146       from pa_budget_versions
147       where project_id = p_project_id and
148             fin_plan_type_id = p_plan_type_id and
149             version_type in ('COST', 'ALL') and
150             current_flag = 'Y';
151 baselined_cost_rec baselined_cost_csr%ROWTYPE;
152 
153 cursor baselined_revenue_csr is
154     select budget_version_id
155       from pa_budget_versions
156       where project_id = p_project_id and
157             fin_plan_type_id = p_plan_type_id and
158             version_type in ('REVENUE', 'ALL') and
159             current_flag = 'Y';
160 baselined_revenue_rec baselined_revenue_csr%ROWTYPE;
161 
162 BEGIN
163   x_return_status := FND_API.G_RET_STS_SUCCESS;
164   x_msg_count := 0;
165   -- looking for the current baselined cost/revenue versions
166   if p_plan_status_code = 'CB' then
167     open baselined_cost_csr;
168     fetch baselined_cost_csr into baselined_cost_rec;
169     if baselined_cost_csr%NOTFOUND then
170       x_cost_version_id := -1;
171     else
172       x_cost_version_id := baselined_cost_rec.budget_version_id;
173     end if; -- baselined_cost_csr%NOTFOUND
174     close baselined_cost_csr;
175     open baselined_revenue_csr;
176     fetch baselined_revenue_csr into baselined_revenue_rec;
177     if baselined_revenue_csr%NOTFOUND then
178       x_rev_version_id := -1;
179     else
180       x_rev_version_id := baselined_revenue_rec.budget_version_id;
181     end if;  -- baselined_revenue_csr%NOTFOUND
182     close baselined_revenue_csr;
183   -- looking for the current working cost/revenue versions
184   else
185     open working_cost_csr;
186     fetch working_cost_csr into working_cost_rec;
187     if working_cost_csr%NOTFOUND then
188       x_cost_version_id := -1;
189     else
190       x_cost_version_id := working_cost_rec.budget_version_id;
191     end if; -- working_cost_csr%NOTFOUND
192     close working_cost_csr;
193     open working_revenue_csr;
194     fetch working_revenue_csr into working_revenue_rec;
195     if working_revenue_csr%NOTFOUND then
196       x_rev_version_id := -1;
197     else
198       x_rev_version_id := working_revenue_rec.budget_version_id;
199     end if; -- working_revenue_csr%NOTFOUND
200     close working_revenue_csr;
201   end if;
202 
203 EXCEPTION
204     WHEN OTHERS THEN
205       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
206       x_msg_count     := 1;
207       x_msg_data      := SQLERRM;
208       FND_MSG_PUB.add_exc_msg( p_pkg_name         => 'PA_FIN_PLAN_TYPE_GLOBAL',
209                                p_procedure_name   => 'pa_fp_get_finplan_version_id');
210 
211 END pa_fp_get_finplan_version_id;
212 /* ------------------------------------------------------------------- */
213 
214 PROCEDURE delete_plan_type_from_project
215     (p_project_id        IN  pa_budget_versions.project_id%TYPE,
216      p_fin_plan_type_id  IN  pa_budget_versions.fin_plan_type_id%TYPE,
217      x_return_status     OUT NOCOPY VARCHAR2, --File.Sql.39 bug 4440895
218      x_msg_count         OUT NOCOPY NUMBER, --File.Sql.39 bug 4440895
219      x_msg_data          OUT NOCOPY VARCHAR2) --File.Sql.39 bug 4440895
220 is
221 
222 cursor plan_type_versions_csr is
223 select budget_version_id
224   from pa_budget_versions
225   where project_id = p_project_id and
226         fin_plan_type_id = p_fin_plan_type_id;
227 plan_type_versions_rec plan_type_versions_csr%ROWTYPE;
228 
229 cursor plan_type_code_csr is
230 select fin_plan_type_code
231   from pa_fin_plan_types_b
232   where fin_plan_type_id = p_fin_plan_type_id;
233 plan_type_code_rec plan_type_code_csr%ROWTYPE;
234 
235 -- Bug 3619687 Cursor to return all the fp options that need to be
236 -- updated up on delete
237 CURSOR  fp_options_cur(c_project_id NUMBER, c_fin_plan_type_id NUMBER) IS
238 SELECT   gen_src_cost_plan_type_id
239        , gen_src_cost_plan_version_id
240        , gen_src_cost_plan_ver_code
241        , gen_src_rev_plan_type_id
242        , gen_src_rev_plan_version_id
243        , gen_src_rev_plan_ver_code
244        , gen_src_all_plan_type_id
245        , gen_src_all_plan_version_id
246        , gen_src_all_plan_ver_code
247        , fin_plan_option_level_code
248        , proj_fp_options_id
249 FROM   pa_proj_fp_options
250 WHERE  project_id = c_project_id
251 AND    fin_plan_type_id IS NOT NULL -- eliminates project level record
252 AND    fin_plan_type_id <> c_fin_plan_type_id -- eliminates plan type being deleted
253 AND    (gen_src_cost_plan_type_id = c_fin_plan_type_id OR
254         gen_src_rev_plan_type_id  = c_fin_plan_type_id OR
255         gen_src_all_plan_type_id  = c_fin_plan_type_id);
256 
257 fp_options_rec      fp_options_cur%ROWTYPE;
258 
259 -- Bug 3619687 Cursor to return the default generation source plan type
260 CURSOR def_gen_src_plan_type_cur (c_project_id NUMBER, c_fin_plan_type_id NUMBER)IS
261 SELECT pt.fin_plan_type_id  as fin_plan_type_id
262        ,pt.plan_class_code  as plan_class_code
263 FROM   pa_proj_fp_options o
264        ,pa_fin_plan_types_vl pt
265 WHERE  o.project_id = c_project_id
266 AND    o.fin_plan_option_level_code = 'PLAN_TYPE'
267 AND    o.fin_plan_type_id <> c_fin_plan_type_id
268 AND    o.fin_plan_preference_code <> 'REVENUE_ONLY'
269 AND    o.fin_plan_type_id = pt.fin_plan_type_id
270 AND    nvl(pt.use_for_workplan_flag, 'N') = 'N'
271 ORDER BY name ASC;
272 
273 --Bug#11776072 - cusror to get rbs_version_id
274 CURSOR get_rbs_version_id_cur(c_project_id NUMBER, c_fin_plan_type_id NUMBER) IS
275 SELECT rbs_version_id
276 FROM pa_proj_fp_options
277 WHERE project_id = c_project_id
278 AND fin_plan_type_id=c_fin_plan_type_id
279 and fin_plan_option_level_code = 'PLAN_TYPE';
280 
281 --Bug#11776072 - cusror to get rbs_header_id
282 CURSOR get_rbs_header_id_cur(c_rbs_version_id pa_rbs_versions_b.rbs_version_id%TYPE) IS
283 SELECT rbs_header_id
284 FROM pa_rbs_versions_b
285 WHERE rbs_version_id=c_rbs_version_id;
286 
287 --Bug#11776072 - cusror to check rbs association in the project
288 CURSOR check_association_cur(c_rbs_version_id pa_rbs_versions_b.rbs_version_id%TYPE , c_project_id NUMBER) IS
289 SELECT 'X'
290 FROM pa_proj_fp_options
291 WHERE rbs_version_id = c_rbs_version_id
292 AND project_id=c_project_id
293 AND fin_plan_option_level_code = 'PLAN_TYPE';
294 
295 l_def_gen_src_plan_type_id     pa_fin_plan_types_b.fin_plan_type_id%TYPE;
296 l_def_gen_src_plan_class_code  pa_fin_plan_types_b.plan_class_code%TYPE;
297 
298 -- error handling variables
299 l_msg_count       NUMBER := 0;
300 l_data            VARCHAR2(2000);
301 l_msg_data        VARCHAR2(2000);
302 l_error_msg_code  VARCHAR2(30);
303 l_msg_index_out   NUMBER;
304 l_return_status   VARCHAR2(2000);
305 
306 -- Bug 10305516 skkoppul
307 TYPE x_proj_fp_options_id        is table of pa_proj_fp_options.proj_fp_options_id%type;
308 x_proj_fp_options_id_array       x_proj_fp_options_id;
309 
310 --Bug#11776072
311 l_rbs_version_id       pa_rbs_versions_b.rbs_version_id%TYPE;
312 l_rbs_header_id        pa_rbs_headers_b.rbs_header_id%TYPE;
313 l_exists_association   VARCHAR2(1);
314 
315 BEGIN
316   FND_MSG_PUB.initialize;
317   IF P_PA_DEBUG_MODE = 'Y' THEN
318      pa_debug.init_err_stack('PA_FIN_PLAN_TYPE_GLOBAL.delete_plan_type_from_project');
319   END IF;
320   x_msg_count := 0;
321   /* CHECK FOR BUSINESS RULES VIOLATIONS */
322   -- If versions of the plan type exist in the project, cannot delete plan type
323   open plan_type_versions_csr;
324   fetch plan_type_versions_csr into plan_type_versions_rec;
325   if not (plan_type_versions_csr%NOTFOUND) then
326     x_return_status := FND_API.G_RET_STS_ERROR;
327     PA_UTILS.ADD_MESSAGE(p_app_short_name      => 'PA',
328                          p_msg_name            => 'PA_FP_DELETE_PLAN_TYPE_ERROR');
329   end if;
330   close plan_type_versions_csr;
331 
332   -- Cannot delete the Org Forecasting plan type
333   open plan_type_code_csr;
334   fetch plan_type_code_csr into plan_type_code_rec;
335   if not (plan_type_code_csr%NOTFOUND) then
336     if plan_type_code_rec.fin_plan_type_code = 'ORG_FORECAST' then
337       x_return_status := FND_API.G_RET_STS_ERROR;
338       PA_UTILS.ADD_MESSAGE(p_app_short_name      => 'PA',
339                            p_msg_name            => 'PA_CANNOT_DELETE_ORGFCST');
340     end if;
341   end if;
342   close plan_type_code_csr;
343 
344 /* If There are ANY Business Rules Violations , Then Do NOT Proceed: RETURN */
345     l_msg_count := FND_MSG_PUB.count_msg;
346     if l_msg_count > 0 then
347         if l_msg_count = 1 then
348              PA_INTERFACE_UTILS_PUB.get_messages
349                  (p_encoded        => FND_API.G_TRUE,
350                   p_msg_index      => 1,
351                   p_msg_count      => l_msg_count,
352                   p_msg_data       => l_msg_data,
353                   p_data           => l_data,
354                   p_msg_index_out  => l_msg_index_out);
355              x_msg_data := l_data;
356              x_msg_count := l_msg_count;
357             else
358              x_msg_count := l_msg_count;
359         end if;
360             pa_debug.reset_err_stack;
361             return;
362     end if;
363 
364 /* IF NO BUSINESS RULES VIOLATIONS: PROCEED WITH DELETE PLAN TYPE */
365   SAVEPOINT PA_FP_DELETE_PLAN_TYPE;
366 
367   -- Bug 3619687 if plan type id is the genration source plan type for any other option
368   -- update the column with default plan type. Default plan type is determined through
369   -- ordering all the other attached plan types in ascending order by name. The first
370   -- plan type in that arrangement is the default used for updating all such options
371 
372   -- First fetch the default generation source plan type id
373   OPEN def_gen_src_plan_type_cur(p_project_id, p_fin_plan_type_id);
374   FETCH def_gen_src_plan_type_cur
375     INTO l_def_gen_src_plan_type_id,l_def_gen_src_plan_class_code;
376   CLOSE def_gen_src_plan_type_cur;
377 
378   -- Check if any of the fp options exist with the input plan type as generation source
379   OPEN fp_options_cur(p_project_id, p_fin_plan_type_id);
380   LOOP
381       FETCH  fp_options_cur INTO fp_options_rec;
382       EXIT WHEN fp_options_cur%NOTFOUND;
383 
384       IF nvl(fp_options_rec.gen_src_cost_plan_type_id, -1) = p_fin_plan_type_id THEN
385 
386           fp_options_rec.gen_src_cost_plan_type_id :=  l_def_gen_src_plan_type_id;
387 
388           IF 'PLAN_VERSION' = fp_options_rec.fin_plan_option_level_code  THEN
389               fp_options_rec.gen_src_cost_plan_version_id := null;
390               fp_options_rec.gen_src_cost_plan_ver_code := null;
391           ELSE
392               fp_options_rec.gen_src_cost_plan_version_id := null;
393               IF 'FORECAST' =  nvl(l_def_gen_src_plan_class_code, '-99') THEN
394                   fp_options_rec.gen_src_cost_plan_ver_code := 'CURRENT_APPROVED';
395               ELSIF 'BUDGET' =   nvl(l_def_gen_src_plan_class_code, '-99') THEN
396                   fp_options_rec.gen_src_cost_plan_ver_code := 'CURRENT_BASELINED';
397               ELSE
398                   fp_options_rec.gen_src_cost_plan_ver_code := null;
399               END IF;
400           END IF;
401 
402       END IF;
403 
404       IF nvl(fp_options_rec.gen_src_rev_plan_type_id, -1) = p_fin_plan_type_id THEN
405 
406           fp_options_rec.gen_src_rev_plan_type_id :=  l_def_gen_src_plan_type_id;
407 
408           IF 'PLAN_VERSION' = fp_options_rec.fin_plan_option_level_code  THEN
409               fp_options_rec.gen_src_rev_plan_version_id := null;
410               fp_options_rec.gen_src_rev_plan_ver_code := null;
411           ELSE
412               fp_options_rec.gen_src_rev_plan_version_id := null;
413               IF 'FORECAST' =  nvl(l_def_gen_src_plan_class_code, '-99') THEN
414                   fp_options_rec.gen_src_rev_plan_ver_code := 'CURRENT_APPROVED';
415               ELSIF 'BUDGET' =   nvl(l_def_gen_src_plan_class_code, '-99') THEN
416                   fp_options_rec.gen_src_rev_plan_ver_code := 'CURRENT_BASELINED';
417               ELSE
418                   fp_options_rec.gen_src_rev_plan_ver_code := null;
419               END IF;
420           END IF;
421 
422       END IF;
423 
424       IF nvl(fp_options_rec.gen_src_all_plan_type_id, -1) = p_fin_plan_type_id THEN
425 
426           fp_options_rec.gen_src_all_plan_type_id :=  l_def_gen_src_plan_type_id;
427 
428           IF 'PLAN_VERSION' = fp_options_rec.fin_plan_option_level_code  THEN
429               fp_options_rec.gen_src_all_plan_version_id := null;
430               fp_options_rec.gen_src_all_plan_ver_code := null;
431           ELSE
432               fp_options_rec.gen_src_all_plan_version_id := null;
433               IF 'FORECAST' =   nvl(l_def_gen_src_plan_class_code, '-99') THEN
434                   fp_options_rec.gen_src_all_plan_ver_code := 'CURRENT_APPROVED';
435               ELSIF 'BUDGET' =   nvl(l_def_gen_src_plan_class_code, '-99') THEN
436                   fp_options_rec.gen_src_all_plan_ver_code := 'CURRENT_BASELINED';
437               ELSE
438                   fp_options_rec.gen_src_all_plan_ver_code := null;
439               END IF;
440           END IF;
441 
442       END IF;
443 
444       -- Update pa_proj_fp_options table
445       UPDATE pa_proj_fp_options
446       SET    gen_src_cost_plan_type_id      = fp_options_rec.gen_src_cost_plan_type_id
447            , gen_src_cost_plan_version_id   = fp_options_rec.gen_src_cost_plan_version_id
448            , gen_src_cost_plan_ver_code     = fp_options_rec.gen_src_cost_plan_ver_code
449            , gen_src_rev_plan_type_id       = fp_options_rec.gen_src_rev_plan_type_id
450            , gen_src_rev_plan_version_id    = fp_options_rec.gen_src_rev_plan_version_id
451            , gen_src_rev_plan_ver_code      = fp_options_rec.gen_src_rev_plan_ver_code
452            , gen_src_all_plan_type_id       = fp_options_rec.gen_src_all_plan_type_id
453            , gen_src_all_plan_version_id    = fp_options_rec.gen_src_all_plan_version_id
454            , gen_src_all_plan_ver_code      = fp_options_rec.gen_src_all_plan_ver_code
455            , record_version_number          = record_version_number + 1
456            , last_update_date               = SYSDATE
457            , last_updated_by                = FND_GLOBAL.user_id
458            , last_update_login              = FND_GLOBAL.login_id
459       WHERE proj_fp_options_id = fp_options_rec.proj_fp_options_id;
460 
461   END LOOP;
462   CLOSE fp_options_cur;
463   -- End of changes for Bug 3619687
464 
465   -- delete from PA_FP_ELEMENTS
466 
467   /*
468     Bug 3106741 For pa_fp_elements there is no index avaialable on project_id and plan_type_id
469     to avoid full table scan pa_proj_fp_options would be used to fetch all the relevant option_ids
470    */
471 
472 /* commented for bug 10305516
473   delete from pa_fp_elements e
474     where e.proj_fp_options_id in (select o.proj_fp_options_id from pa_proj_fp_options o
475                                  where  o.project_id = p_project_id and
476                                         o.fin_plan_type_id = p_fin_plan_type_id);
477 */
478   /*
479     Bug 3106741 For pa_fp_txn_currencies there is no index avaialable on project_id and plan_type_id
480     to avoid full table scan pa_proj_fp_options would be used to fetch all the relevant option_ids
481    */
482 
483   -- Bug 10305516 skkoppul: replaced above delete statement with following 2 statements
484   SELECT proj_fp_options_id bulk collect
485   INTO x_proj_fp_options_id_array
486   FROM pa_proj_fp_options
487   WHERE project_id = p_project_id and fin_plan_type_id = p_fin_plan_type_id;
488 
489   FORALL i IN x_proj_fp_options_id_array.first..x_proj_fp_options_id_array.last
490     DELETE from pa_fp_elements
491      WHERE proj_fp_options_id = x_proj_fp_options_id_array(i);
492 
493   -- delete from PA_FP_TXN_CURRENCIES
494   delete from pa_fp_txn_currencies tc
495     where tc.proj_fp_options_id in (select o.proj_fp_options_id
496                                     from   pa_proj_fp_options o
497                                     where  o.project_id = p_project_id and  --Replaced project_id with p_project_id
498                                                                           --for bug 2740553
499                                            o.fin_plan_type_id = p_fin_plan_type_id);
500 
501   --For Bug 2976168. Should delete the records from pa_fp_excluded_elements also
502 
503   IF P_PA_DEBUG_MODE = 'Y' THEN
504        pa_debug.g_err_stage:= 'About to delete from pa_fp_excluded_elements';
505        pa_debug.write('delete_plan_type_from_project : PA_FIN_PLAN_TYPE_GLOBAL',pa_debug.g_err_stage,3);
506   END IF;
507 
508   /* Using proj_fp_options_id join instead of directly using project_id, fin_plan_type_id to take
509      advantage of pa_fp_excluded_index_u1 index on pa_fp_excluded_elements */
510 
511   DELETE
512   FROM   pa_fp_excluded_elements ee
513   WHERE  ee.proj_fp_options_id IN (SELECT pfo.proj_fp_options_id
514                                    FROM   pa_proj_fp_options pfo
515                                    WHERE  pfo.project_id = p_project_id
516                                    AND    pfo.fin_plan_type_id=p_fin_plan_type_id);
517 
518   IF P_PA_DEBUG_MODE = 'Y' THEN
519     pa_debug.g_err_stage:= To_char(SQL%ROWCOUNT) || ' records deleted.';
520     pa_debug.write('delete_plan_type_from_project : PA_FIN_PLAN_TYPE_GLOBAL',pa_debug.g_err_stage,3);
521   END IF;
522 
523 --Bug#11776072 - Addition starts
524 open get_rbs_version_id_cur(p_project_id,p_fin_plan_type_id);
525 fetch get_rbs_version_id_cur into l_rbs_version_id;
526 close get_rbs_version_id_cur;
527 --Bug#11776072 - Addition end
528 
529   -- finally, delete from PA_PROJ_FP_OPTIONS
530   delete from pa_proj_fp_options
531     where project_id = p_project_id and
532           fin_plan_option_level_code = 'PLAN_TYPE' and
533           fin_plan_type_id = p_fin_plan_type_id;
534 
535 --Bug#11776072 - Addition starts
536 IF l_rbs_version_id is not null THEN
537 
538 open check_association_cur(l_rbs_version_id,p_project_id);
539 fetch check_association_cur into l_exists_association;
540 close check_association_cur;
541 
542    IF l_exists_association is null or l_exists_association <> 'X' THEN
543 
544      open get_rbs_header_id_cur(l_rbs_version_id);
545      fetch get_rbs_header_id_cur into l_rbs_header_id;
546      close get_rbs_header_id_cur;
547 
548      UPDATE pa_rbs_prj_assignments
549      SET fp_usage_flag='N'
550      WHERE project_id=p_project_id
551       AND rbs_version_id=l_rbs_version_id
552       AND rbs_header_id=l_rbs_header_id
553       AND fp_usage_flag='Y';
554 
555    END IF;
556 
557 END IF;
558 --Bug#11776072 - Addition end
559 
560   x_return_status := FND_API.G_RET_STS_SUCCESS;
561   pa_debug.reset_err_stack;
562 
563 exception
564   when others then
565   rollback to PA_FP_DELETE_PLAN_TYPE;
566       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
567       x_msg_count     := 1;
568       x_msg_data      := SQLERRM;
569       FND_MSG_PUB.add_exc_msg( p_pkg_name         => 'PA_FIN_PLAN_TYPE_GLOBAL',
570                                p_procedure_name   => 'delete_plan_type_from_project');
571       pa_debug.reset_err_stack;
572       raise FND_API.G_EXC_UNEXPECTED_ERROR;
573 END delete_plan_type_from_project;
574 
575 
576 -- CREATED FOR FP L
577 -- Created by:    Danny Lai
578 -- Creation Date: 05/21/03
579 -- SUMMARY: Given a plan type id, this function returns one of the following:
580 --          FORECAST - if the plan type is a forecast plan class
581 --          APPROVED_BUDGET - if the plan type is an approved budget plan class
582 --	    NON_APPROVED_BUDGET - if the plan type is a non-approved budget plan class
583 -- This is used for FUNCTION SECURITY checks in Budgeting/Forecasting OA pages
584 FUNCTION plantype_to_planclass
585     (p_project_id		IN  pa_proj_fp_options.project_id%TYPE,
586      p_fin_plan_type_id    	IN  pa_proj_fp_options.fin_plan_type_id%TYPE)
587 return VARCHAR2 is
588 l_plan_class_code	pa_fin_plan_types_b.plan_class_code%TYPE;
589 l_approved_cost_pt_flag pa_fin_plan_types_b.approved_cost_plan_type_flag%TYPE;
590 l_approved_rev_pt_flag  pa_fin_plan_types_b.approved_rev_plan_type_flag%TYPE;
591 l_return_value		VARCHAR2(80);
592 BEGIN
593     select plan_class_code
594       into l_plan_class_code
595       from pa_fin_plan_types_b
596       where fin_plan_type_id = p_fin_plan_type_id;
597     select approved_cost_plan_type_flag,
598 	   approved_rev_plan_type_flag
599       into l_approved_cost_pt_flag,
600 	   l_approved_rev_pt_flag
601       from pa_proj_fp_options
602       where project_id = p_project_id and
603             fin_plan_type_id = p_fin_plan_type_id and
604             fin_plan_option_level_code = 'PLAN_TYPE';
605     if l_approved_cost_pt_flag = 'Y' or l_approved_rev_pt_flag = 'Y' then
606 	l_return_value := 'APPROVED_BUDGET';
607     else
608 	if l_plan_class_code = 'FORECAST' then
609 	    l_return_value := 'FORECAST';
610 	else
611 	    l_return_value := 'NON_APPROVED_BUDGET';
612 	end if;
613     end if;
614 /*
615     if l_plan_class_code = 'FORECAST' then
616         l_return_value := 'FORECAST';
617     else
618         if l_approved_cost_pt_flag = 'Y' or l_approved_rev_pt_flag = 'Y' then
619 	    l_return_value := 'APPROVED_BUDGET';
620         else
621             l_return_value := 'NON_APPROVED_BUDGET';
622         end if;
623     end if;
624 */
625     return l_return_value;
626 EXCEPTION
627 	when NO_DATA_FOUND then
628 	  return 'INVALID_PLAN_TYPE';
629 	when others then
630 	  return 'INVALID_PLAN_TYPE';
631 END plantype_to_planclass;
632 
633 
634 -- CREATED FOR FP L
635 -- Created by:    Danny Lai
636 -- Creation Date: 05/21/03
637 -- SUMMARY: Given a budget version id, this function returns one of the following:
638 --          FORECAST - if the version is a forecast plan class
639 --          APPROVED_BUDGET - if the version is an approved budget plan class
640 --	    NON_APPROVED_BUDGET - if the version is a non-approved budget plan class
641 -- This is used for FUNCTION SECURITY checks in Budgeting/Forecasting OA pages
642 FUNCTION planversion_to_planclass
643     (p_fin_plan_version_id	IN  pa_budget_versions.budget_version_id%TYPE)
644 return VARCHAR2 is
645 l_return_value	VARCHAR2(80);
646 BEGIN
647     return l_return_value;
648 EXCEPTION
649 	when NO_DATA_FOUND then
650 	  return 'INVALID_PLAN_TYPE';
651 	when others then
652 	  return 'INVALID_PLAN_TYPE';
653 END planversion_to_planclass;
654 
655 END pa_fin_plan_type_global;