DBA Data[Home] [Help]

PACKAGE BODY: APPS.PA_PM_FUNCTION_SECURITY_PUB

Source


1 PACKAGE BODY PA_PM_FUNCTION_SECURITY_PUB AS
2 /*$Header: PAPMFSPB.pls 120.2 2005/08/19 16:42:38 mwasowic ship $*/
3 
4 g_module_name VARCHAR2(100) := 'pa.plsql.PA_PM_FUNCTION_SECURITY_PUB';
5 
6 PROCEDURE check_function_security
7      (p_api_version_number  IN NUMBER,
8       p_responsibility_id  IN NUMBER,
9       p_function_name      IN VARCHAR2,
10       p_msg_count          OUT NOCOPY NUMBER, --File.Sql.39 bug 4440895
11       p_msg_data           OUT NOCOPY VARCHAR2, --File.Sql.39 bug 4440895
12       p_return_status     OUT NOCOPY VARCHAR2 ,      --File.Sql.39 bug 4440895
13       p_function_allowed  OUT NOCOPY VARCHAR2 ) IS --File.Sql.39 bug 4440895
14 
15 --CURSOR l_fnd_function_csr IS
16 --SELECT 'x'
17 --FROM fnd_form_functions ff,
18 --     fnd_resp_functions fr
19 --WHERE ff.function_name = p_function_name
20 --AND   ff.function_id     = fr.action_id
21 --AND   fr.responsibility_id = p_responsibility_id;
22 
23 l_dummy        VARCHAR2(1);
24 l_api_version_number    CONSTANT       NUMBER      :=  1.0;
25 l_api_name              CONSTANT       VARCHAR2(30):=
26                         'check_function_security';
27 l_return_status                        VARCHAR2(1);
28 l_function_allowed                     VARCHAR2(1) := NULL;
29 
30 --bug2442069
31 l_object_type                          VARCHAR2(12) := NULL;
32 --bug 2442069
33 
34 BEGIN
35     -- The caching logic for checking the function security would not let the
36     -- initialisation of x_return_status happen. Hence moved this up
37     p_return_status := FND_API.G_RET_STS_SUCCESS;
38 
39   -- Included call to Check_Global_Vars, to check for global variables and
40   -- see if check_function_security procedure has already been called once.
41   -- This way, we are avoiding multiple calls to this procedure
42   -- check_function_security         S Sanckar 09-Jul-99
43 
44   Check_Global_Vars ( p_function_name    => p_function_name,
45                   p_function_allowed => p_function_allowed,
46                         p_found_or_not     => G_found_or_not);
47 
48   IF G_found_or_not = 'N' THEN
49 
50 
51   -- Standard Api compatibility call
52     IF NOT FND_API.Compatible_API_Call ( l_api_version_number   ,
53                                          p_api_version_number   ,
54                                          l_api_name             ,
55                                          G_PKG_NAME             )
56     THEN
57         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
58     END IF;
59 
60     --p_return_status := FND_API.G_RET_STS_SUCCESS; Moved this above
61 
62    -- function security is enforced in Applications by excluding
63    -- a function from a given responsibility. Hence, if we get a
64    -- row for the cursor , then the function is not allowed
65 
66     /* Commented out the following code for bug 2442069 and replaced the logic. Please see below.
67 
68      IF fnd_function.test(p_function_name) THEN
69          p_function_allowed := 'Y';
70          l_function_allowed := 'Y';
71      ELSE
72            p_function_allowed := 'N';
73            l_function_allowed := 'N';
74      END IF;*/
75 
76    --Added the following code replacing the above logic to incorporate advanced proejct security
77    --bug 2442069
78    IF PA_INTERFACE_UTILS_PUB.G_ADVANCED_PROJ_SEC_FLAG = 'N'
79    THEN
80 
81      -- -- dbms_output.put_line( 'Default Function Security is enforced! ' );
82      IF fnd_function.test(p_function_name) THEN
83            p_function_allowed := 'Y';
84            l_function_allowed := 'Y';
85      ELSE
86            p_function_allowed := 'N';
87            l_function_allowed := 'N';
88      END IF;
89    ELSE
90        -- -- dbms_output.put_line( 'WATCH Advanced Project Security is enforced! ' );
91        IF PA_INTERFACE_UTILS_PUB.G_PROJECt_ID IS NULL
92        THEN
93            l_object_type := null;
94        ELSE
95            l_object_type := 'PA_PROJECTS';
96        END IF;
97        IF  PA_SECURITY_PVT.CHECK_USER_PRIVILEGE(
98                p_privilege     => p_function_name
99               ,p_object_name   => l_object_type
100               ,p_object_key    => PA_INTERFACE_UTILS_PUB.G_PROJECt_ID
101             ) = 'T'
102        THEN
103            p_function_allowed := 'Y';
104            l_function_allowed := 'Y';
105        ELSE
106            p_function_allowed := 'N';
107            l_function_allowed := 'N';
108        END IF;
109    END IF;
110    --bug 2442069
111 
112 --   OPEN l_fnd_function_csr;
113 --   FETCH l_fnd_function_csr INTO l_dummy;
114 --   IF l_fnd_function_csr%FOUND THEN
115 --      p_function_allowed := 'N';
116 --   ELSE
117 --      p_function_allowed := 'Y';
118 --   END IF;
119 --   CLOSE l_fnd_function_csr;
120 
121    -- Included call to Set_Global_Vars, to set the global variables
122    -- which are used in checking if check_function_security procedure has
123    -- already been called. This way, we are avoiding multiple calls to
124    -- this procedure check_function_security         S Sanckar 09-Jul-99
125 
126    Set_Global_Vars ( p_function_name    => p_function_name,
127                  p_function_allowed => l_function_allowed);
128 
129     -- dbms_output.put_line('x return status is '||p_return_status);
130 
131   END IF;  /* End of G_found_or_not IF condition */
132 
133    -- dbms_output.put_line('x return status is '||p_return_status);
134 
135 EXCEPTION
136 
137       WHEN FND_API.G_EXC_ERROR
138       THEN
139 
140             p_return_status := FND_API.G_RET_STS_ERROR;
141 
142             FND_MSG_PUB.Count_And_Get
143                   (   p_count       =>    p_msg_count ,
144                       p_data        =>    p_msg_data  );
145 
146       WHEN FND_API.G_EXC_UNEXPECTED_ERROR
147       THEN
148       p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
149 
150       FND_MSG_PUB.Count_And_Get
151                   (   p_count       =>    p_msg_count ,
152                       p_data        =>    p_msg_data  );
153 
154       WHEN OTHERS
155       THEN
156 
157       p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
158 
159       IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
160       THEN
161             FND_MSG_PUB.add_exc_msg
162                         ( p_pkg_name            => G_PKG_NAME
163                         , p_procedure_name      => l_api_name     );
164 
165       END IF;
166 
167       FND_MSG_PUB.Count_And_Get
168                   (   p_count       =>    p_msg_count ,
169                       p_data        =>    p_msg_data  );
170 
171 END check_function_security;
172 
173 -- New Procedure added to use global variables and thus avoid
174 -- repeated calls to Check_Function_Security   S Sanckar 09-Jul-99
175 
176 PROCEDURE Check_Global_Vars
177      (p_function_name      IN VARCHAR2,
178       p_function_allowed  OUT NOCOPY VARCHAR2,  --File.Sql.39 bug 4440895
179       p_found_or_not      OUT NOCOPY VARCHAR2 ) IS --File.Sql.39 bug 4440895
180 
181 BEGIN
182 
183   p_found_or_not := 'N';
184 
185   IF p_function_name = 'PA_PM_CREATE_PROJECT' AND
186      G_Create_Project   IS NOT NULL THEN
187        p_function_allowed := G_Create_Project;
188        p_found_or_not     := 'Y';
189        RETURN;
190   END IF;
191 
192   IF p_function_name = 'PA_PM_UPDATE_PROJECT' AND
193      G_Update_Project   IS NOT NULL THEN
194        p_function_allowed := G_Update_Project;
195        p_found_or_not     := 'Y';
196        RETURN;
197   END IF;
198 
199   IF p_function_name = 'PA_PM_DELETE_PROJECT' AND
200      G_Delete_Project   IS NOT NULL THEN
201        p_function_allowed := G_Delete_Project;
202        p_found_or_not     := 'Y';
203        RETURN;
204   END IF;
205 
206   IF p_function_name = 'PA_PM_UPDATE_PROJ_PROGRESS' AND
207      G_Update_Proj_Progress   IS NOT NULL THEN
208        p_function_allowed := G_Update_Proj_Progress;
209        p_found_or_not     := 'Y';
210        RETURN;
211   END IF;
212 
213   IF p_function_name = 'PA_PM_ADD_TASK' AND
214      G_Add_Task   IS NOT NULL THEN
215        p_function_allowed := G_Add_Task;
216        p_found_or_not     := 'Y';
217        RETURN;
218   END IF;
219 
220   IF p_function_name = 'PA_PM_UPDATE_TASK' AND
221      G_Update_Task   IS NOT NULL THEN
222        p_function_allowed := G_Update_Task;
223        p_found_or_not     := 'Y';
224        RETURN;
225   END IF;
226 
227   IF p_function_name = 'PA_PM_MODIFY_TOP_TASK' AND
228      G_Modify_Top_Task   IS NOT NULL THEN
229        p_function_allowed := G_Modify_Top_Task;
230        p_found_or_not     := 'Y';
231        RETURN;
232   END IF;
233 
234   IF p_function_name = 'PA_PM_DELETE_TASK' AND
235      G_Delete_Task   IS NOT NULL THEN
236        p_function_allowed := G_Delete_Task;
237        p_found_or_not     := 'Y';
238        RETURN;
239   END IF;
240 
241   IF p_function_name = 'PA_PM_CREATE_DRAFT_BUDGET' AND
242      G_Create_Draft_Budget   IS NOT NULL THEN
243        p_function_allowed := G_Create_Draft_Budget;
244        p_found_or_not     := 'Y';
245        RETURN;
246   END IF;
247 
248   IF p_function_name = 'PA_PM_UPDATE_BUDGET' AND
249      G_Update_Budget   IS NOT NULL THEN
250        p_function_allowed := G_Update_Budget;
251        p_found_or_not     := 'Y';
252        RETURN;
253   END IF;
254 
255   IF p_function_name = 'PA_PM_BASELINE_BUDGET' AND
256      G_Baseline_Budget   IS NOT NULL THEN
257        p_function_allowed := G_Baseline_Budget;
258        p_found_or_not     := 'Y';
259        RETURN;
260   END IF;
261 
262   IF p_function_name = 'PA_PM_DELETE_DRAFT_BUDGET' AND
263      G_Delete_Draft_Budget   IS NOT NULL THEN
264        p_function_allowed := G_Delete_Draft_Budget;
265        p_found_or_not     := 'Y';
266        RETURN;
267   END IF;
268 
269   IF p_function_name = 'PA_PM_ADD_BUDGET_LINE' AND
270      G_Add_Budget_Line   IS NOT NULL THEN
271        p_function_allowed := G_Add_Budget_Line;
272        p_found_or_not     := 'Y';
273        RETURN;
274   END IF;
275 
276   IF p_function_name = 'PA_PM_UPDATE_BUDGET_LINE' AND
277      G_Update_Budget_Line   IS NOT NULL THEN
278        p_function_allowed := G_Update_Budget_Line;
279        p_found_or_not     := 'Y';
280        RETURN;
281   END IF;
282 
283   IF p_function_name = 'PA_PM_DELETE_BUDGET_LINE' AND
284      G_Delete_Budget_Line   IS NOT NULL THEN
285        p_function_allowed := G_Delete_Budget_Line;
286        p_found_or_not     := 'Y';
287        RETURN;
288   END IF;
289 
290   IF p_function_name = 'PA_PM_UPDATE_EARNED_VALUE' AND
291      G_Update_Earned_Value   IS NOT NULL THEN
292        p_function_allowed := G_Update_Earned_Value;
293        p_found_or_not     := 'Y';
294        RETURN;
295   END IF;
296 
297   IF p_function_name = 'PA_PM_CREATE_RESOURCE_LIST' AND
298      G_Create_Res_List   IS NOT NULL THEN
299        p_function_allowed := G_Create_Res_List;
300        p_found_or_not     := 'Y';
301        RETURN;
302   END IF;
303 
304   IF p_function_name = 'PA_PM_UPDATE_RESOURCE_LIST' AND
305      G_Update_Res_List   IS NOT NULL THEN
306        p_function_allowed := G_Update_Res_List;
307        p_found_or_not     := 'Y';
308        RETURN;
309   END IF;
310 
311   IF p_function_name = 'PA_PM_DELETE_RESOURCE_LIST' AND
312      G_Delete_Res_List   IS NOT NULL THEN
313        p_function_allowed := G_Delete_Res_List;
314        p_found_or_not     := 'Y';
315        RETURN;
316   END IF;
317 
318   IF p_function_name = 'PA_PM_ADD_RESOURCE_LIST_MEMBER' AND
319      G_Add_Res_List_Member   IS NOT NULL THEN
320        p_function_allowed := G_Add_Res_List_Member;
321        p_found_or_not     := 'Y';
322        RETURN;
323   END IF;
324 
325   IF p_function_name = 'PA_PM_UPD_RESOURCE_LIST_MEMBER' AND
326      G_Update_Res_List_Member   IS NOT NULL THEN
327        p_function_allowed := G_Update_Res_List_Member;
328        p_found_or_not     := 'Y';
329        RETURN;
330   END IF;
331 
332   IF p_function_name = 'PA_PM_DEL_RESOURCE_LIST_MEMBER' AND
333      G_Delete_Res_List_Member   IS NOT NULL THEN
334        p_function_allowed := G_Delete_Res_List_Member;
335        p_found_or_not     := 'Y';
336        RETURN;
337   END IF;
338 
339   IF p_function_name = 'PA_AF_CREATE_AGREEMENT' AND
340      G_Create_Agreement   IS NOT NULL THEN
341        p_function_allowed := G_Create_Agreement;
342        p_found_or_not     := 'Y';
343        RETURN;
344   END IF;
345 
346   IF p_function_name = 'PA_AF_DELETE_AGREEMENT' AND
347      G_Delete_Agreement   IS NOT NULL THEN
348        p_function_allowed := G_Delete_Agreement;
349        p_found_or_not     := 'Y';
350        RETURN;
351   END IF;
352 
353 
354   IF p_function_name = 'PA_AF_UPDATE_AGREEMENT' AND
355      G_Update_Agreement   IS NOT NULL THEN
356        p_function_allowed := G_Update_Agreement;
357        p_found_or_not     := 'Y';
358        RETURN;
359   END IF;
360 
361    IF p_function_name = 'PA_AF_ADD_FUNDING' AND
362      G_Add_Funding   IS NOT NULL THEN
363        p_function_allowed := G_Add_Funding;
364        p_found_or_not     := 'Y';
365        RETURN;
366   END IF;
367 
368    IF p_function_name = 'PA_AF_DELETE_FUNDING' AND
369      G_Delete_Funding   IS NOT NULL THEN
370        p_function_allowed := G_Delete_Funding;
371        p_found_or_not     := 'Y';
372        RETURN;
373   END IF;
374 
375    IF p_function_name = 'PA_AF_UPDATE_FUNDING' AND
376      G_Update_Funding   IS NOT NULL THEN
377        p_function_allowed := G_Update_Funding;
378        p_found_or_not     := 'Y';
379        RETURN;
380   END IF;
381 
382    IF p_function_name = 'PA_AF_INIT_AGREEMENT' AND
383      G_Init_Agreement   IS NOT NULL THEN
384        p_function_allowed := G_Init_Agreement;
385        p_found_or_not     := 'Y';
386        RETURN;
387   END IF;
388 
389    IF p_function_name = 'PA_AF_LOAD_AGREEMENT' AND
390      G_Load_Agreement   IS NOT NULL THEN
391        p_function_allowed := G_Load_Agreement;
392        p_found_or_not     := 'Y';
393        RETURN;
394   END IF;
395 
396    IF p_function_name = 'PA_AF_LOAD_FUNDING' AND
397      G_Load_Funding   IS NOT NULL THEN
398        p_function_allowed := G_Load_Funding;
399        p_found_or_not     := 'Y';
400        RETURN;
401   END IF;
402 
403    IF p_function_name = 'PA_AF_EXE_CRE_AGMT' AND
404      G_Exe_Cre_Agmt   IS NOT NULL THEN
405        p_function_allowed := G_Exe_Cre_Agmt;
406        p_found_or_not     := 'Y';
407        RETURN;
408   END IF;
409 
410    IF p_function_name = 'PA_AF_EXE_UPD_AGMT' AND
411      G_Exe_Upd_Agmt   IS NOT NULL THEN
412        p_function_allowed := G_Exe_Upd_Agmt;
413        p_found_or_not     := 'Y';
414        RETURN;
415   END IF;
416 
417    IF p_function_name = 'PA_AF_FETCH_FUNDING' AND
418      G_Fetch_Funding   IS NOT NULL THEN
419        p_function_allowed := G_Fetch_Funding;
420        p_found_or_not     := 'Y';
421        RETURN;
422   END IF;
423 
424    IF p_function_name = 'PA_AF_CLR_AGREEMENT' AND
425      G_Clear_Agreement   IS NOT NULL THEN
426        p_function_allowed := G_Clear_Agreement;
427        p_found_or_not     := 'Y';
428        RETURN;
429   END IF;
430 
431    IF p_function_name = 'PA_AF_DEL_AGMT_OK' AND
432      G_Check_Del_Agmt_Ok   IS NOT NULL THEN
433        p_function_allowed := G_Check_Del_Agmt_Ok;
434        p_found_or_not     := 'Y';
435        RETURN;
436   END IF;
437 
438    IF p_function_name = 'PA_AF_ADD_FUND_OK' AND
439      G_Check_Add_Fund_Ok   IS NOT NULL THEN
440        p_function_allowed := G_Check_Add_Fund_Ok;
441        p_found_or_not     := 'Y';
442        RETURN;
443   END IF;
444 
445    IF p_function_name = 'PA_AF_DEL_FUND_OK' AND
446      G_Check_Del_Fund_Ok   IS NOT NULL THEN
447        p_function_allowed := G_Check_Del_Fund_Ok;
448        p_found_or_not     := 'Y';
449        RETURN;
450   END IF;
451 
452    IF p_function_name = 'PA_AF_UPD_FUND_OK' AND
453      G_Check_Upd_Fund_Ok   IS NOT NULL THEN
454        p_function_allowed := G_Check_Upd_Fund_Ok;
455        p_found_or_not     := 'Y';
456        RETURN;
457   END IF;
458 
459   /* Start of code for bug #4317792 */
460 
461   IF p_function_name = 'PA_FP_APP_BDGT_MNT_COST_PLAN' AND
462      G_FP_Maintain_AC_Plan IS NOT NULL THEN
463        p_function_allowed := G_FP_Maintain_AC_Plan;
464        p_found_or_not     := 'Y';
465        RETURN;
466   END IF;
467 
468   IF p_function_name = 'PA_FP_BDGT_MNT_COST_PLAN' AND
469      G_FP_Maintain_C_Plan IS NOT NULL THEN
470        p_function_allowed := G_FP_Maintain_C_Plan;
471        p_found_or_not     := 'Y';
472        RETURN;
473   END IF;
474 
475   IF p_function_name = 'PA_FP_FCST_MNT_COST_PLAN' AND
476      G_FP_Maintain_FC_Plan IS NOT NULL THEN
477        p_function_allowed := G_FP_Maintain_FC_Plan;
478        p_found_or_not     := 'Y';
479        RETURN;
480   END IF;
481 
482   IF p_function_name = 'PA_FP_APP_BDGT_MNT_REV_PLAN' AND
483      G_FP_Maintain_AR_Plan IS NOT NULL THEN
484        p_function_allowed := G_FP_Maintain_AR_Plan;
485        p_found_or_not     := 'Y';
486        RETURN;
487   END IF;
488 
489   IF p_function_name = 'PA_FP_BDGT_MNT_REV_PLAN' AND
490      G_FP_Maintain_R_Plan IS NOT NULL THEN
491        p_function_allowed := G_FP_Maintain_R_Plan;
492        p_found_or_not     := 'Y';
493        RETURN;
494   END IF;
495 
496   IF p_function_name = 'PA_FP_FCST_MNT_REV_PLAN' AND
497      G_FP_Maintain_FR_Plan IS NOT NULL THEN
498        p_function_allowed := G_FP_Maintain_FR_Plan;
499        p_found_or_not     := 'Y';
500        RETURN;
501   END IF;
502 
503   IF p_function_name = 'PA_FP_APP_BDGT_BSLN_COST_PLAN' AND
504      G_FP_Baseline_AC_Plan IS NOT NULL THEN
505        p_function_allowed := G_FP_Baseline_AC_Plan;
506        p_found_or_not     := 'Y';
507        RETURN;
508   END IF;
509 
510   IF p_function_name = 'PA_FP_BDGT_BSLN_COST_PLAN' AND
511      G_FP_Baseline_C_Plan IS NOT NULL THEN
512        p_function_allowed := G_FP_Baseline_C_Plan;
513        p_found_or_not     := 'Y';
514        RETURN;
515   END IF;
516 
517   IF p_function_name = 'PA_FP_FCST_BSLN_COST_PLAN' AND
518      G_FP_Baseline_FC_Plan IS NOT NULL THEN
519        p_function_allowed := G_FP_Baseline_FC_Plan;
520        p_found_or_not     := 'Y';
521        RETURN;
522   END IF;
523 
524   IF p_function_name = 'PA_FP_APP_BDGT_BSLN_REV_PLAN' AND
525      G_FP_Baseline_AR_Plan IS NOT NULL THEN
526        p_function_allowed := G_FP_Baseline_AR_Plan;
527        p_found_or_not     := 'Y';
528        RETURN;
529   END IF;
530 
531   IF p_function_name = 'PA_FP_BDGT_BSLN_REV_PLAN' AND
532      G_FP_Baseline_R_Plan IS NOT NULL THEN
533        p_function_allowed := G_FP_Baseline_R_Plan;
534        p_found_or_not     := 'Y';
535        RETURN;
536   END IF;
537 
538   IF p_function_name = 'PA_FP_FCST_BSLN_REV_PLAN' AND
539      G_FP_Baseline_FR_Plan IS NOT NULL THEN
540        p_function_allowed := G_FP_Baseline_FR_Plan;
541        p_found_or_not     := 'Y';
542        RETURN;
543   END IF;
544 
545   IF p_function_name = 'PA_FP_APP_BDGT_MNT_PLAN_LINES' AND
546      G_FP_Maintain_AC_AR_Plan_Lines IS NOT NULL THEN
547        p_function_allowed := G_FP_Maintain_AC_AR_Plan_Lines;
548        p_found_or_not     := 'Y';
549        RETURN;
550   END IF;
551 
552   IF p_function_name = 'PA_FP_BDGT_MNT_PLAN_LINES' AND
553      G_FP_Maintain_Plan_Lines IS NOT NULL THEN
554        p_function_allowed := G_FP_Maintain_Plan_Lines;
555        p_found_or_not     := 'Y';
556        RETURN;
557   END IF;
558 
559   IF p_function_name = 'PA_FP_FCST_MNT_PLAN_LINES' AND
560      G_FP_Maintain_FC_FR_Plan_Lines IS NOT NULL THEN
561        p_function_allowed := G_FP_Maintain_FC_FR_Plan_Lines;
562        p_found_or_not     := 'Y';
563        RETURN;
564   END IF;
565 
566   /* End of code for bug #4317792 */
567 
568 END Check_Global_Vars;
569 
570 
571 -- New Procedure added to set global variables and thus avoid
572 -- repeated calls to Check_Function_Security   S Sanckar 09-Jul-99
573 
574 PROCEDURE Set_Global_Vars
575      (p_function_name      IN VARCHAR2,
576       p_function_allowed   IN VARCHAR2) IS
577 
578 BEGIN
579 
580   IF p_function_name = 'PA_PM_CREATE_PROJECT' THEN
581        G_Create_Project := p_function_allowed;
582        RETURN;
583   END IF;
584 
585   IF p_function_name = 'PA_PM_UPDATE_PROJECT' THEN
586        G_Update_Project := p_function_allowed;
587        RETURN;
588   END IF;
589 
590   IF p_function_name = 'PA_PM_DELETE_PROJECT' THEN
591        G_Delete_Project := p_function_allowed;
592        RETURN;
593   END IF;
594 
595   IF p_function_name = 'PA_PM_UPDATE_PROJ_PROGRESS' THEN
596        G_Update_Proj_Progress := p_function_allowed;
597        RETURN;
598   END IF;
599 
600   IF p_function_name = 'PA_PM_ADD_TASK' THEN
601        G_Add_Task := p_function_allowed;
602        RETURN;
603   END IF;
604 
605   IF p_function_name = 'PA_PM_UPDATE_TASK' THEN
606        G_Update_Task := p_function_allowed;
607        RETURN;
608   END IF;
609 
610   IF p_function_name = 'PA_PM_MODIFY_TOP_TASK' THEN
611        G_Modify_Top_Task := p_function_allowed;
612        RETURN;
613   END IF;
614 
615   IF p_function_name = 'PA_PM_DELETE_TASK' THEN
616        G_Delete_Task := p_function_allowed;
617        RETURN;
618   END IF;
619 
620   IF p_function_name = 'PA_PM_CREATE_DRAFT_BUDGET' THEN
621        G_Create_Draft_Budget := p_function_allowed;
622        RETURN;
623   END IF;
624 
625   IF p_function_name = 'PA_PM_UPDATE_BUDGET' THEN
626        G_Update_Budget := p_function_allowed;
627        RETURN;
628   END IF;
629 
630   IF p_function_name = 'PA_PM_BASELINE_BUDGET' THEN
631        G_Baseline_Budget := p_function_allowed;
632        RETURN;
633   END IF;
634 
635   IF p_function_name = 'PA_PM_DELETE_DRAFT_BUDGET' THEN
636        G_Delete_Draft_Budget := p_function_allowed;
637        RETURN;
638   END IF;
639 
640   IF p_function_name = 'PA_PM_ADD_BUDGET_LINE' THEN
641        G_Add_Budget_Line := p_function_allowed;
642        RETURN;
643   END IF;
644 
645   IF p_function_name = 'PA_PM_UPDATE_BUDGET_LINE' THEN
646        G_Update_Budget_Line := p_function_allowed;
647        RETURN;
648   END IF;
649 
650   IF p_function_name = 'PA_PM_DELETE_BUDGET_LINE' THEN
651        G_Delete_Budget_Line := p_function_allowed;
652        RETURN;
653   END IF;
654 
655   IF p_function_name = 'PA_PM_UPDATE_EARNED_VALUE' THEN
656        G_Update_Earned_Value := p_function_allowed;
657        RETURN;
658   END IF;
659 
660   IF p_function_name = 'PA_PM_CREATE_RESOURCE_LIST' THEN
661        G_Create_Res_List := p_function_allowed;
662        RETURN;
663   END IF;
664 
665   IF p_function_name = 'PA_PM_UPDATE_RESOURCE_LIST' THEN
666        G_Update_Res_List := p_function_allowed;
667        RETURN;
668   END IF;
669 
670   IF p_function_name = 'PA_PM_DELETE_RESOURCE_LIST' THEN
671        G_Delete_Res_List := p_function_allowed;
672        RETURN;
673   END IF;
674 
675   IF p_function_name = 'PA_PM_ADD_RESOURCE_LIST_MEMBER' THEN
676        G_Add_Res_List_Member := p_function_allowed;
677        RETURN;
678   END IF;
679 
680   IF p_function_name = 'PA_PM_UPD_RESOURCE_LIST_MEMBER' THEN
681        G_Update_Res_List_Member := p_function_allowed;
682        RETURN;
683   END IF;
684 
685   IF p_function_name = 'PA_PM_DEL_RESOURCE_LIST_MEMBER' THEN
686        G_Delete_Res_List_Member := p_function_allowed;
687        RETURN;
688   END IF;
689 
690   IF p_function_name = 'PA_AF_CREATE_AGREEMENT' THEN
691        G_Create_Agreement:= p_function_allowed ;
692        RETURN;
693   END IF;
694 
695   IF p_function_name = 'PA_AF_DELETE_AGREEMENT' THEN
696        G_Delete_Agreement := p_function_allowed ;
697        RETURN;
698   END IF;
699 
700 
701   IF p_function_name = 'PA_AF_UPDATE_AGREEMENT' THEN
702        G_Update_Agreement := p_function_allowed ;
703        RETURN;
704   END IF;
705 
706    IF p_function_name = 'PA_AF_ADD_FUNDING' THEN
707        G_Add_Funding   := p_function_allowed;
708        RETURN;
709   END IF;
710 
711    IF p_function_name = 'PA_AF_DELETE_FUNDING' THEN
712        G_Delete_Funding := p_function_allowed ;
713        RETURN;
714   END IF;
715 
716    IF p_function_name = 'PA_AF_UPDATE_FUNDING' THEN
717        G_Update_Funding := p_function_allowed ;
718        RETURN;
719   END IF;
720 
721    IF p_function_name = 'PA_AF_INIT_AGREEMENT' THEN
722        G_Init_Agreement := p_function_allowed ;
723        RETURN;
724   END IF;
725 
726    IF p_function_name = 'PA_AF_LOAD_AGREEMENT' THEN
727        G_Load_Agreement    := p_function_allowed ;
728        RETURN;
729   END IF;
730 
731    IF p_function_name = 'PA_AF_LOAD_FUNDING' THEN
732        G_Load_Funding := p_function_allowed ;
733        RETURN;
734   END IF;
735 
736    IF p_function_name = 'PA_AF_EXE_CRE_AGMT' THEN
737        G_Exe_Cre_Agmt := p_function_allowed ;
738        RETURN;
739   END IF;
740 
741    IF p_function_name = 'PA_AF_EXE_UPD_AGMT' THEN
742        G_Exe_Upd_Agmt := p_function_allowed ;
743        RETURN;
744   END IF;
745 
746    IF p_function_name = 'PA_AF_FETCH_FUNDING' THEN
747        G_Fetch_Funding := p_function_allowed ;
748        RETURN;
749   END IF;
750 
751    IF p_function_name = 'PA_AF_CLR_AGREEMENT' THEN
752        G_Clear_Agreement := p_function_allowed ;
753        RETURN;
754   END IF;
755 
756    IF p_function_name = 'PA_AF_DEL_AGMT_OK' THEN
757        G_Check_Del_Agmt_Ok := p_function_allowed;
758        RETURN;
759   END IF;
760 
761    IF p_function_name = 'PA_AF_ADD_FUND_OK' THEN
762        G_Check_Add_Fund_Ok := p_function_allowed;
763        RETURN;
764   END IF;
765 
766    IF p_function_name = 'PA_AF_DEL_FUND_OK' THEN
767        G_Check_Del_Fund_Ok    := p_function_allowed ;
768        RETURN;
769   END IF;
770 
771    IF p_function_name = 'PA_AF_UPD_FUND_OK' THEN
772        G_Check_Upd_Fund_Ok    := p_function_allowed ;
773        RETURN;
774   END IF;
775 
776   /* Start of code for bug #4317792 */
777 
778   IF p_function_name = 'PA_FP_APP_BDGT_MNT_COST_PLAN' THEN
779       G_FP_Maintain_AC_Plan    := p_function_allowed ;
780       RETURN;
781   END IF;
782 
783   IF p_function_name = 'PA_FP_BDGT_MNT_COST_PLAN' THEN
784       G_FP_Maintain_C_Plan    := p_function_allowed ;
785       RETURN;
786   END IF;
787 
788   IF p_function_name = 'PA_FP_FCST_MNT_COST_PLAN' THEN
789       G_FP_Maintain_FC_Plan    := p_function_allowed ;
790       RETURN;
791   END IF;
792 
793   IF p_function_name = 'PA_FP_APP_BDGT_MNT_REV_PLAN' THEN
794       G_FP_Maintain_AR_Plan    := p_function_allowed ;
795       RETURN;
796   END IF;
797 
798   IF p_function_name = 'PA_FP_BDGT_MNT_REV_PLAN' THEN
799       G_FP_Maintain_R_Plan    := p_function_allowed ;
800       RETURN;
801   END IF;
802 
803   IF p_function_name = 'PA_FP_FCST_MNT_REV_PLAN' THEN
804       G_FP_Maintain_FR_Plan    := p_function_allowed ;
805       RETURN;
806   END IF;
807 
808   IF p_function_name = 'PA_FP_APP_BDGT_BSLN_COST_PLAN' THEN
809       G_FP_Baseline_AC_Plan    := p_function_allowed ;
810       RETURN;
811   END IF;
812 
813   IF p_function_name = 'PA_FP_BDGT_BSLN_COST_PLAN' THEN
814       G_FP_Baseline_C_Plan    := p_function_allowed ;
815       RETURN;
816   END IF;
817 
818   IF p_function_name = 'PA_FP_FCST_BSLN_COST_PLAN' THEN
819       G_FP_Baseline_FC_Plan    := p_function_allowed ;
820       RETURN;
821   END IF;
822 
823   IF p_function_name = 'PA_FP_APP_BDGT_BSLN_REV_PLAN' THEN
824       G_FP_Baseline_AR_Plan    := p_function_allowed ;
825       RETURN;
826   END IF;
827 
828   IF p_function_name = 'PA_FP_BDGT_BSLN_REV_PLAN' THEN
829       G_FP_Baseline_R_Plan    := p_function_allowed ;
830       RETURN;
831   END IF;
832 
833   IF p_function_name = 'PA_FP_FCST_BSLN_REV_PLAN' THEN
834       G_FP_Baseline_FR_Plan    := p_function_allowed ;
835       RETURN;
836   END IF;
837 
838   IF p_function_name = 'PA_FP_APP_BDGT_MNT_PLAN_LINES' THEN
839       G_FP_Maintain_AC_AR_Plan_Lines    := p_function_allowed ;
840       RETURN;
841   END IF;
842 
843   IF p_function_name = 'PA_FP_BDGT_MNT_PLAN_LINES' THEN
844       G_FP_Maintain_Plan_Lines    := p_function_allowed ;
845       RETURN;
846   END IF;
847 
848   IF p_function_name = 'PA_FP_FCST_MNT_PLAN_LINES' THEN
849       G_FP_Maintain_FC_FR_Plan_Lines    := p_function_allowed ;
850       RETURN;
851   END IF;
852 
853   /* End of code for bug #4317792 */
854 
855 END Set_Global_Vars;
856 
857 
858 /*
859 This procedure is a wrapper for all the project and function security related
860 actions. This procedure does the following :
861 1. Initializes the security variables
862 2. Checks if the user has QUERY and UPDATE permissions on the given project
863 3. For the given function name whether function security exists or not.
864 If any of the checks fail, 'F' is returned and if the user has all the required
865 permissions / function security, 'T' is returned.
866 This API is called from all BUDGETS AMG APIs.
867 
868 This procedure internally calls:
869 1. pa_security.initialize
870 2. pa_security.allow_query
871 3. check_function_security
872 
873 Created : 25-Dec-2002    bvarnasi
874 15-Sep-03 vejayara As part of PCS changes, the function security check is done based
875                    on the plan type. Refer bug for more details
876 */
877 
878 PROCEDURE CHECK_BUDGET_SECURITY (
879                         p_api_version_number IN  NUMBER,
880                         p_project_id         IN  PA_PROJECTS_ALL.PROJECT_ID%TYPE,
881                         p_fin_plan_type_id   IN  PA_FIN_PLAN_TYPES_B.FIN_PLAN_TYPE_ID%TYPE,
882                         p_calling_context    IN  VARCHAR2,
883                         p_function_name      IN  VARCHAR2,
884                         p_version_type       IN  VARCHAR2,
885                         x_return_status      OUT NOCOPY VARCHAR2, --File.Sql.39 bug 4440895
886                         x_ret_code           OUT NOCOPY VARCHAR2 ) IS --File.Sql.39 bug 4440895
887 
888 l_api_version_number   CONSTANT   NUMBER      :=  1.0;
889 l_api_name             CONSTANT   VARCHAR2(30):= 'CHECK_BUDGET_SECURITY';
890 
891 l_module_name                     VARCHAR2(100);
892 p_pa_debug_mode                   VARCHAR2(1);
893 
894 l_resp_id                         NUMBER;
895 l_user_id                         NUMBER;
896 
897 l_cost_ret_status                 VARCHAR2(1);
898 l_rev_ret_status                  VARCHAR2(1);
899 
900 l_ret_code                        VARCHAR2(1);
901 l_msg_count                       NUMBER := 0;
902 l_msg_data                        VARCHAR2(2000);
903 l_debug_mode                      VARCHAR2(1);
904 l_function_is_allowed  CONSTANT   VARCHAR2(1):='Y';
905 l_function_not_allowed CONSTANT   VARCHAR2(1):='N';
906 l_plan_class                      VARCHAR2(2000); /* Return value of a function */
907 l_function_name                   VARCHAR2(2000);
908 
909 BEGIN
910       /* Set module name and other standard things like setting error stack etc. */
911       x_return_status := FND_API.G_RET_STS_SUCCESS;
912 
913       l_module_name    := g_module_name;
914       p_pa_debug_mode  := NVL(FND_PROFILE.value('PA_DEBUG_MODE'), 'N');
915 
916 
917       IF p_pa_debug_mode = 'Y' THEN
918         pa_debug.set_curr_function( p_function   => 'CHECK_BUDGET_SECURITY',
919                                     p_debug_mode => l_debug_mode );
920       END IF;
921 
922       IF p_pa_debug_mode = 'Y' THEN
923           pa_debug.set_process('PLSQL','LOG',p_pa_debug_mode);
924           pa_debug.g_err_stage := 'Validating input parameters ';
925           pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
926       END IF;
927 
928       -- Validate input parameters
929       IF p_project_id IS NULL THEN
930             IF p_pa_debug_mode = 'Y' THEN
931                   pa_debug.g_err_stage := 'Project Id can not be null';
932                   pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
933             END IF;
934             PA_UTILS.ADD_MESSAGE(p_app_short_name  => 'PA',
935                                  p_msg_name        => 'PA_FP_INV_PARAM_PASSED');
936             RAISE PA_FP_CONSTANTS_PKG.INVALID_ARG_EXC;
937       END IF;
938 
939       IF p_calling_context IS NULL THEN
940             IF p_pa_debug_mode = 'Y' THEN
941               pa_debug.g_err_stage := 'Calling Context can not be null';
942               pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
943             END IF;
944             PA_UTILS.ADD_MESSAGE(p_app_short_name  => 'PA',
945                                p_msg_name        => 'PA_FP_INV_PARAM_PASSED');
946             RAISE PA_FP_CONSTANTS_PKG.INVALID_ARG_EXC;
947       END IF;
948 
949       IF p_function_name IS NULL THEN
950             IF p_pa_debug_mode = 'Y' THEN
951               pa_debug.g_err_stage := 'Function Name can not be null';
952               pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
953             END IF;
954             PA_UTILS.ADD_MESSAGE(p_app_short_name  => 'PA',
955                                p_msg_name        => 'PA_FP_INV_PARAM_PASSED');
956             RAISE PA_FP_CONSTANTS_PKG.INVALID_ARG_EXC;
957       END IF;
958 
959        -- dbms_output.put_line('validateing ver type');
960       IF  p_calling_context = PA_FP_CONSTANTS_PKG.G_CALLING_MODULE_FIN_PLAN THEN
961 
962             IF p_fin_plan_type_id IS NULL THEN /* Bug 3139924 */
963                   IF p_pa_debug_mode = 'Y' THEN
964                     pa_debug.g_err_stage := 'Plan Type Id can not be null';
965                     pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
966                   END IF;
967                   PA_UTILS.ADD_MESSAGE(p_app_short_name  => 'PA',
968                                      p_msg_name        => 'PA_FP_INV_PARAM_PASSED');
969                   RAISE PA_FP_CONSTANTS_PKG.INVALID_ARG_EXC;
970             END IF;
971 
972             IF p_version_type IS NULL THEN
973                   IF p_pa_debug_mode = 'Y' THEN
974                         pa_debug.g_err_stage := 'Version Type can not be null for calling context : '||
975                                                  p_calling_context;
976                         pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
977                   END IF;
978                   PA_UTILS.ADD_MESSAGE(p_app_short_name  => 'PA',
979                                        p_msg_name        => 'PA_FP_INV_PARAM_PASSED');
980                   RAISE PA_FP_CONSTANTS_PKG.INVALID_ARG_EXC;
981             ELSIF p_version_type NOT IN (PA_FP_CONSTANTS_PKG.G_VERSION_TYPE_COST,
982                                        PA_FP_CONSTANTS_PKG.G_VERSION_TYPE_REVENUE,
983                                        PA_FP_CONSTANTS_PKG.G_VERSION_TYPE_ALL) THEN
984                   IF p_pa_debug_mode = 'Y' THEN
985                         pa_debug.g_err_stage := 'Version Type '|| p_version_type ||' is invalid. ';
986                         pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
987                   END IF;
988                   PA_UTILS.ADD_MESSAGE(p_app_short_name  => 'PA',
989                                      p_msg_name        => 'PA_FP_INV_PARAM_PASSED');
990                   RAISE PA_FP_CONSTANTS_PKG.INVALID_ARG_EXC;
991             END IF;
992       END IF;
993              -- dbms_output.put_line('after validateing ver type');
994       /* Validations of input parameters are over */
995       /* Get the responsibility and user id  and initialize security variables */
996 
997       l_resp_id := FND_GLOBAL.Resp_id;
998       l_user_id := FND_GLOBAL.User_id;
999 
1000       IF p_pa_debug_mode = 'Y' THEN
1001             pa_debug.g_err_stage := 'Responsibility Id: '|| l_resp_id ||' User Id: '||l_user_id||
1002                                 ' Project Id: '||p_project_id;
1003             pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
1004       END IF;
1005 
1006       -- Set the project Id into the global variable, this is reference by the
1007       -- API CHECK_FUNCTION_SECURITY
1008       PA_INTERFACE_UTILS_PUB.G_PROJECT_ID := p_project_id;
1009 
1010       pa_security.initialize (X_user_id        => l_user_id,
1011                               X_calling_module => p_function_name);
1012       -- Check if the user has QUERY and UPDATE permissions on the project
1013 
1014       IF pa_security.allow_query (x_project_id => p_project_id ) = 'N' THEN
1015             IF p_pa_debug_mode = 'Y' THEN
1016                   pa_debug.g_err_stage := 'Query Permission does not exist for project id '||p_project_id;
1017                   pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
1018             END IF;
1019 
1020             pa_utils.add_message(
1021                   p_app_short_name  => 'PA',
1022                   p_msg_name        => 'PA_PR_SECURITY_ENFORCED_AMG');
1023 
1024             RAISE FND_API.G_EXC_ERROR;
1025       ELSIF pa_security.allow_update (x_project_id => p_project_id ) = 'N' THEN
1026             IF p_pa_debug_mode = 'Y' THEN
1027                   pa_debug.g_err_stage := 'Update Permission does not exist for project id '||p_project_id;
1028                   pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
1029             END IF;
1030 
1031             pa_utils.add_message(
1032                   p_app_short_name  => 'PA',
1033                   p_msg_name        => 'PA_PR_SECURITY_ENFORCED_AMG');
1034 
1035             RAISE FND_API.G_EXC_ERROR;
1036       END IF;
1037 
1038       IF p_pa_debug_mode = 'Y' THEN
1039         pa_debug.g_err_stage := 'Checking Function Securrity for '||p_function_name||
1040                                 ' in '||p_calling_context||' module.';
1041         pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
1042       END IF;
1043        -- dbms_output.put_line('validateing ver type 2');
1044 
1045       -- Now check if the user has FUNCTION SECURITY on the function passed
1046       -- for BUDGETs Model
1047 
1048       IF p_calling_context = PA_FP_CONSTANTS_PKG.G_CALLING_MODULE_BUDGET THEN
1049 
1050             IF p_function_name = 'PA_PM_CREATE_DRAFT_BUDGET' THEN
1051                    -- dbms_output.put_line('before  checking for PA_PM_CREATE_DRAFT_BUDGET x_return_status'
1052                    --||x_return_status);
1053                   PA_PM_FUNCTION_SECURITY_PUB.check_function_security(
1054                           p_api_version_number => p_api_version_number,
1055                           p_responsibility_id  => l_resp_id,
1056                           p_function_name      => 'PA_PM_CREATE_DRAFT_BUDGET',
1057                           p_msg_count          => l_msg_count,
1058                           p_msg_data           => l_msg_data,
1059                           p_return_status      => x_return_status,
1060                           p_function_allowed   => l_ret_code);
1061 
1062                    -- dbms_output.put_line('after checking for PA_PM_CREATE_DRAFT_BUDGET');
1063                    -- dbms_output.put_line('x_return_status is '||x_return_status);
1064                    -- dbms_output.put_line('l_ret_code is '||l_ret_code);
1065 
1066                   IF x_return_status = FND_API.G_RET_STS_SUCCESS AND
1067                      l_ret_code = l_function_is_allowed THEN
1068                         x_ret_code := l_function_is_allowed;
1069                   ELSE
1070                         x_ret_code := l_function_not_allowed;
1071                         pa_utils.add_message(
1072                         p_app_short_name  => 'PA',
1073                         p_msg_name        => 'PA_FUNCTION_SECURITY_ENFORCED');
1074                   /* 3377434  Modified message name PA_PR_SECURITY_ENFORCED_AMG to
1075                   PA_FUNCTION_SECURITY_ENFORCED above*/
1076                   END IF;
1077 
1078                   IF p_pa_debug_mode = 'Y' THEN
1079                         pa_debug.g_err_stage := 'PA_PM_CREATE_DRAFT_BUDGET : '||x_ret_code;
1080                         pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
1081                   END IF;
1082 
1083                   --Changes for bug 3182963
1084                   IF p_pa_debug_mode = 'Y' THEN
1085                         pa_debug.reset_curr_function;
1086                   END IF;
1087 
1088                   RETURN;
1089 
1090             ELSIF p_function_name = 'PA_PM_DELETE_DRAFT_BUDGET' THEN
1091                   PA_PM_FUNCTION_SECURITY_PUB.check_function_security(
1092                         p_api_version_number => p_api_version_number,
1093                         p_responsibility_id  => l_resp_id,
1094                         p_function_name      => 'PA_PM_DELETE_DRAFT_BUDGET',
1095                         p_msg_count          => l_msg_count,
1096                         p_msg_data           => l_msg_data,
1097                         p_return_status      => x_return_status,
1098                         p_function_allowed   => l_ret_code);
1099 
1100                   IF x_return_status = FND_API.G_RET_STS_SUCCESS AND
1101                      l_ret_code = l_function_is_allowed THEN
1102 
1103                         x_ret_code := l_function_is_allowed;
1104 
1105                   ELSE
1106                         x_ret_code := l_function_not_allowed;
1107                         pa_utils.add_message(
1108                         p_app_short_name  => 'PA',
1109                         p_msg_name        => 'PA_FUNCTION_SECURITY_ENFORCED');
1110                   /* 3377434  Modified message name PA_PR_SECURITY_ENFORCED_AMG to
1111                   PA_FUNCTION_SECURITY_ENFORCED above*/
1112                   END IF;
1113 
1114                   IF p_pa_debug_mode = 'Y' THEN
1115                         pa_debug.g_err_stage := 'PA_PM_DELETE_DRAFT_BUDGET : '||x_ret_code;
1116                         pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
1117                   END IF;
1118 
1119                   --Changes for bug 3182963
1120                   IF p_pa_debug_mode = 'Y' THEN
1121                         pa_debug.reset_curr_function;
1122                   END IF;
1123 
1124                   RETURN;
1125 
1126             ELSIF p_function_name = 'PA_PM_UPDATE_BUDGET' THEN
1127 
1128                   PA_PM_FUNCTION_SECURITY_PUB.check_function_security(
1129                           p_api_version_number => p_api_version_number,
1130                           p_responsibility_id  => l_resp_id,
1131                           p_function_name      => 'PA_PM_UPDATE_BUDGET',
1132                           p_msg_count          => l_msg_count,
1133                           p_msg_data           => l_msg_data,
1134                           p_return_status      => x_return_status,
1135                           p_function_allowed   => l_ret_code);
1136 
1137                   IF x_return_status = FND_API.G_RET_STS_SUCCESS AND
1138                      l_ret_code = l_function_is_allowed THEN
1139 
1140                         x_ret_code := l_function_is_allowed;
1141                   ELSE
1142                         x_ret_code := l_function_not_allowed;
1143                         pa_utils.add_message(
1144                         p_app_short_name  => 'PA',
1145                         p_msg_name        => 'PA_FUNCTION_SECURITY_ENFORCED');
1146                   /* 3377434  Modified message name PA_PR_SECURITY_ENFORCED_AMG to
1147                   PA_FUNCTION_SECURITY_ENFORCED above*/
1148                   END IF;
1149 
1150                   IF p_pa_debug_mode = 'Y' THEN
1151                         pa_debug.g_err_stage := 'PA_PM_UPDATE_BUDGET : '||x_ret_code;
1152                         pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
1153                   END IF;
1154 
1155                   --Changes for bug 3182963
1156                   IF p_pa_debug_mode = 'Y' THEN
1157                         pa_debug.reset_curr_function;
1158                   END IF;
1159 
1160                   RETURN;
1161 
1162             ELSIF p_function_name = 'PA_PM_ADD_BUDGET_LINE' THEN
1163                   PA_PM_FUNCTION_SECURITY_PUB.check_function_security(
1164                           p_api_version_number => p_api_version_number,
1165                           p_responsibility_id  => l_resp_id,
1166                           p_function_name      => 'PA_PM_ADD_BUDGET_LINE',
1167                           p_msg_count          => l_msg_count,
1168                           p_msg_data           => l_msg_data,
1169                           p_return_status      => x_return_status,
1170                           p_function_allowed   => l_ret_code);
1171 
1172                   IF x_return_status = FND_API.G_RET_STS_SUCCESS AND
1173                      l_ret_code = l_function_is_allowed THEN
1174                         x_ret_code := l_function_is_allowed;
1175                   ELSE
1176                         x_ret_code := l_function_not_allowed;
1177                         pa_utils.add_message(
1178                         p_app_short_name  => 'PA',
1179                         p_msg_name        => 'PA_FUNCTION_SECURITY_ENFORCED');
1180                   /* 3377434  Modified message name PA_PR_SECURITY_ENFORCED_AMG to
1181                   PA_FUNCTION_SECURITY_ENFORCED above*/
1182                   END IF;
1183 
1184                   IF p_pa_debug_mode = 'Y' THEN
1185                         pa_debug.g_err_stage := 'PA_PM_ADD_BUDGET_LINE : '||x_ret_code;
1186                         pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
1187                   END IF;
1188 
1189                   --Changes for bug 3182963
1190                   IF p_pa_debug_mode = 'Y' THEN
1191                         pa_debug.reset_curr_function;
1192                   END IF;
1193 
1194                   RETURN;
1195 
1196             ELSIF p_function_name = 'PA_PM_DELETE_BUDGET_LINE' THEN
1197 
1198                   PA_PM_FUNCTION_SECURITY_PUB.check_function_security(
1199                           p_api_version_number => p_api_version_number,
1200                           p_responsibility_id  => l_resp_id,
1201                           p_function_name      => 'PA_PM_DELETE_BUDGET_LINE',
1202                           p_msg_count          => l_msg_count,
1203                           p_msg_data           => l_msg_data,
1204                           p_return_status      => x_return_status,
1205                           p_function_allowed   => l_ret_code);
1206 
1207                   IF x_return_status = FND_API.G_RET_STS_SUCCESS AND
1208                      l_ret_code = l_function_is_allowed THEN
1209 
1210                         x_ret_code := l_function_is_allowed;
1211                   ELSE
1212                         x_ret_code := l_function_not_allowed;
1213                         pa_utils.add_message(
1214                         p_app_short_name  => 'PA',
1215                         p_msg_name        => 'PA_FUNCTION_SECURITY_ENFORCED');
1216                   /* 3377434  Modified message name PA_PR_SECURITY_ENFORCED_AMG to
1217                   PA_FUNCTION_SECURITY_ENFORCED above*/
1218                   END IF;
1219 
1220                   IF p_pa_debug_mode = 'Y' THEN
1221                         pa_debug.g_err_stage := 'PA_PM_DELETE_BUDGET_LINE : '||x_ret_code;
1222                         pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
1223                   END IF;
1224 
1225               --Changes for bug 3182963
1226                   IF p_pa_debug_mode = 'Y' THEN
1227                         pa_debug.reset_curr_function;
1228                   END IF;
1229 
1230                   RETURN;
1231 
1232             ELSIF p_function_name = 'PA_PM_UPDATE_BUDGET_LINE' THEN
1233                   PA_PM_FUNCTION_SECURITY_PUB.check_function_security(
1234                           p_api_version_number => p_api_version_number,
1235                           p_responsibility_id  => l_resp_id,
1236                           p_function_name      => 'PA_PM_UPDATE_BUDGET_LINE',
1237                           p_msg_count          => l_msg_count,
1238                           p_msg_data           => l_msg_data,
1239                           p_return_status      => x_return_status,
1240                           p_function_allowed   => l_ret_code);
1241 
1242                   IF x_return_status = FND_API.G_RET_STS_SUCCESS AND
1243                      l_ret_code = l_function_is_allowed THEN
1244                         x_ret_code := l_function_is_allowed;
1245                   ELSE
1246                         x_ret_code := l_function_not_allowed;
1247                         pa_utils.add_message(
1248                         p_app_short_name  => 'PA',
1249                         p_msg_name        => 'PA_FUNCTION_SECURITY_ENFORCED');
1250                   /* 3377434  Modified message name PA_PR_SECURITY_ENFORCED_AMG to
1251                   PA_FUNCTION_SECURITY_ENFORCED above*/
1252               END IF;
1253 
1254                   IF p_pa_debug_mode = 'Y' THEN
1255                         pa_debug.g_err_stage := 'PA_PM_UPDATE_BUDGET_LINE : '||x_ret_code;
1256                         pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
1257                   END IF;
1258 
1259                   --Changes for bug 3182963
1260                   IF p_pa_debug_mode = 'Y' THEN
1261                         pa_debug.reset_curr_function;
1262                   END IF;
1263 
1264                   RETURN;
1265 
1266             ELSIF p_function_name = 'PA_PM_BASELINE_BUDGET' THEN
1267                   PA_PM_FUNCTION_SECURITY_PUB.check_function_security(
1268                           p_api_version_number => p_api_version_number,
1269                           p_responsibility_id  => l_resp_id,
1270                           p_function_name      => 'PA_PM_BASELINE_BUDGET',
1271                           p_msg_count          => l_msg_count,
1272                           p_msg_data           => l_msg_data,
1273                           p_return_status      => x_return_status,
1274                           p_function_allowed   => l_ret_code);
1275 
1276                   IF x_return_status = FND_API.G_RET_STS_SUCCESS AND l_ret_code = l_function_is_allowed
1277                   THEN
1278                         x_ret_code := l_function_is_allowed;
1279                   ELSE
1280                         x_ret_code := l_function_not_allowed;
1281                         pa_utils.add_message(
1282                         p_app_short_name  => 'PA',
1283                         p_msg_name        => 'PA_FUNCTION_SECURITY_ENFORCED');
1284                   /* 3377434  Modified message name PA_PR_SECURITY_ENFORCED_AMG to
1285                   PA_FUNCTION_SECURITY_ENFORCED above*/
1286                   END IF;
1287 
1288                   IF p_pa_debug_mode = 'Y' THEN
1289                         pa_debug.g_err_stage := 'PA_PM_BASELINE_BUDGET : '||x_ret_code;
1290                         pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
1291                   END IF;
1292 
1293                   --Changes for bug 3182963
1294                   IF p_pa_debug_mode = 'Y' THEN
1295                         pa_debug.reset_curr_function;
1296                   END IF;
1297 
1298                   RETURN;
1299 
1300             ELSIF p_function_name = 'CALCULATE_AMOUNTS' THEN
1301                   PA_PM_FUNCTION_SECURITY_PUB.check_function_security(
1302                           p_api_version_number => p_api_version_number,
1303                           p_responsibility_id  => l_resp_id,
1304                           p_function_name      => 'CALCULATE_AMOUNTS',
1305                           p_msg_count          => l_msg_count,
1306                           p_msg_data           => l_msg_data,
1307                           p_return_status      => x_return_status,
1308                           p_function_allowed   => l_ret_code);
1309 
1310                   IF x_return_status = FND_API.G_RET_STS_SUCCESS AND l_ret_code = l_function_is_allowed
1311                   THEN
1312                         x_ret_code := l_function_is_allowed;
1313                   ELSE
1314                         x_ret_code := l_function_not_allowed;
1315                         pa_utils.add_message(
1316                         p_app_short_name  => 'PA',
1317                         p_msg_name        => 'PA_FUNCTION_SECURITY_ENFORCED');
1318                   /* 3377434  Modified message name PA_PR_SECURITY_ENFORCED_AMG to
1319                   PA_FUNCTION_SECURITY_ENFORCED above*/
1320                   END IF;
1321 
1322                   IF p_pa_debug_mode = 'Y' THEN
1323                         pa_debug.g_err_stage := 'CALCULATE_AMOUNTS : '||x_ret_code;
1324                         pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
1325                   END IF;
1326 
1327               --Changes for bug 3182963
1328                   IF p_pa_debug_mode = 'Y' THEN
1329                         pa_debug.reset_curr_function;
1330                   END IF;
1331 
1332                   RETURN;
1333 
1334             --Bug 4224464: Added the following elsif blocks to check function security
1335             --for PA_BUDGET_PUB.delete_baseline_budget AMG api.
1336             --Secuity check for deleting Approved Baseline Budget (Cost or Revenue)
1337             ELSIF p_function_name = 'PA_FP_DEL_BSLN_APPRVD_BDGT' THEN
1338                   PA_PM_FUNCTION_SECURITY_PUB.check_function_security(
1339                           p_api_version_number => p_api_version_number,
1340                           p_responsibility_id  => l_resp_id,
1341                           p_function_name      => 'PA_FP_DEL_BSLN_APPRVD_BDGT',
1342                           p_msg_count          => l_msg_count,
1343                           p_msg_data           => l_msg_data,
1344                           p_return_status      => x_return_status,
1345                           p_function_allowed   => l_ret_code);
1346 
1347                   IF x_return_status = FND_API.G_RET_STS_SUCCESS AND l_ret_code = l_function_is_allowed
1348                   THEN
1349                         x_ret_code := l_function_is_allowed;
1350                   ELSE
1351                         x_ret_code := l_function_not_allowed;
1352                         pa_utils.add_message(
1353                         p_app_short_name  => 'PA',
1354                         p_msg_name        => 'PA_FUNCTION_SECURITY_ENFORCED');
1355                   END IF;
1356 
1357                   IF p_pa_debug_mode = 'Y' THEN
1358                         pa_debug.g_err_stage := 'PA_FP_DEL_BSLN_APPRVD_BDGT : '||x_ret_code;
1359                         pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
1360                   END IF;
1361 
1362                   IF p_pa_debug_mode = 'Y' THEN
1363                         pa_debug.reset_curr_function;
1364                   END IF;
1365 
1366                   RETURN;
1367 
1368             --Secuity check for deleting Baseline Budget (not approved Cost or Revenue)
1369             ELSIF p_function_name = 'PA_FP_DEL_BSLN_BDGT' THEN
1370                   PA_PM_FUNCTION_SECURITY_PUB.check_function_security(
1371                           p_api_version_number => p_api_version_number,
1372                           p_responsibility_id  => l_resp_id,
1373                           p_function_name      => 'PA_FP_DEL_BSLN_BDGT',
1374                           p_msg_count          => l_msg_count,
1375                           p_msg_data           => l_msg_data,
1376                           p_return_status      => x_return_status,
1377                           p_function_allowed   => l_ret_code);
1378 
1379                   IF x_return_status = FND_API.G_RET_STS_SUCCESS AND l_ret_code = l_function_is_allowed
1380                   THEN
1381                         x_ret_code := l_function_is_allowed;
1382                   ELSE
1383                         x_ret_code := l_function_not_allowed;
1384                         pa_utils.add_message(
1385                         p_app_short_name  => 'PA',
1386                         p_msg_name        => 'PA_FUNCTION_SECURITY_ENFORCED');
1387                   END IF;
1388 
1389                   IF p_pa_debug_mode = 'Y' THEN
1390                         pa_debug.g_err_stage := 'PA_FP_DEL_BSLN_BDGT : '||x_ret_code;
1391                         pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
1392                   END IF;
1393 
1394                   IF p_pa_debug_mode = 'Y' THEN
1395                         pa_debug.reset_curr_function;
1396                   END IF;
1397 
1398                   RETURN;
1399             --Bug 4224464: End of changes
1400 
1401             ELSE -- Unhandled functions security - Hence throw invalid arg exception
1402                   RAISE PA_FP_CONSTANTS_PKG.INVALID_ARG_EXC;
1403             END IF;-- End of function security checks for BUDGETs model
1404 
1405       ELSIF p_calling_context = PA_FP_CONSTANTS_PKG.G_CALLING_MODULE_FIN_PLAN THEN
1406 
1407             /* Derive the plan class of the plan type */
1408 
1409             l_plan_class := pa_fin_plan_type_global.plantype_to_planclass(
1410                                      p_project_id => p_project_id,
1411                                      p_fin_plan_type_id => p_fin_plan_type_id);
1412 
1413             IF l_plan_class =  'INVALID_PLAN_TYPE' THEN
1414 
1415                   IF p_pa_debug_mode = 'Y' THEN
1416                     pa_debug.g_err_stage := 'Error while retrieving the plan class. Invalid plan type ..';
1417                     pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
1418                   END IF;
1419                   PA_UTILS.ADD_MESSAGE(p_app_short_name  => 'PA',
1420                                      p_msg_name        => 'PA_FP_INV_PARAM_PASSED');
1421                   RAISE PA_FP_CONSTANTS_PKG.INVALID_ARG_EXC;
1422 
1423             END IF;
1424 
1425             IF p_pa_debug_mode = 'Y' THEN
1426 
1427                   pa_debug.g_err_stage := 'Checking function security for FinPlan module. ' ||
1428                   'Plan Class:' || l_plan_class || ' : ' ||
1429                   'Version Type: ' || p_version_type || ' : ' ||
1430                   'Function Name: ' || p_function_name;
1431 
1432                   pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
1433 
1434             END IF;
1435 
1436                    -- dbms_output.put_line('validateing ver type 6');
1437 
1438             IF p_function_name = 'PA_PM_CREATE_DRAFT_BUDGET' OR
1439                p_function_name = 'PA_PM_DELETE_DRAFT_BUDGET' OR
1440                p_function_name = 'PA_PM_UPDATE_BUDGET'       OR
1441                p_function_name = 'PA_PM_ADD_BUDGET_LINE'     OR
1442                p_function_name = 'PA_PM_DELETE_BUDGET_LINE'  OR
1443                p_function_name = 'PA_PM_UPDATE_BUDGET_LINE'  THEN
1444 
1445                   -- In case of FINPLAN, check fn security for COST or ALL version
1446 
1447                   IF p_version_type = PA_FP_CONSTANTS_PKG.G_VERSION_TYPE_COST OR
1448                      p_version_type = PA_FP_CONSTANTS_PKG.G_VERSION_TYPE_ALL  THEN
1449 
1450                         IF l_plan_class =  'APPROVED_BUDGET' THEN
1451 
1452                             l_function_name      := 'PA_FP_APP_BDGT_MNT_COST_PLAN';
1453 
1454                         ELSIF l_plan_class =  'NON_APPROVED_BUDGET' THEN
1455 
1456                             l_function_name      := 'PA_FP_BDGT_MNT_COST_PLAN';
1457 
1458                         ELSIF l_plan_class =  'FORECAST' THEN
1459 
1460                              l_function_name     := 'PA_FP_FCST_MNT_COST_PLAN';
1461 
1462                         ELSE
1463 
1464                              IF p_pa_debug_mode = 'Y' THEN
1465                                pa_debug.g_err_stage := 'Error while retrieving the plan class. ' ||
1466                                                        'Invalid plan type ..';
1467                                pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
1468                              END IF;
1469                              PA_UTILS.ADD_MESSAGE(p_app_short_name  => 'PA',
1470                                                 p_msg_name        => 'PA_FP_INV_PARAM_PASSED');
1471                              RAISE PA_FP_CONSTANTS_PKG.INVALID_ARG_EXC;
1472 
1473                         END IF;
1474 
1475                         PA_PM_FUNCTION_SECURITY_PUB.check_function_security(
1476                                     p_api_version_number => p_api_version_number,
1477                                     p_responsibility_id  => l_resp_id,
1478                                     p_function_name      => l_function_name,
1479                                     p_msg_count          => l_msg_count,
1480                                     p_msg_data           => l_msg_data,
1481                                     p_return_status      => x_return_status,
1482                                     p_function_allowed   => l_ret_code);
1483 
1484                         IF x_return_status = FND_API.G_RET_STS_SUCCESS AND
1485                            l_ret_code = l_function_is_allowed THEN
1486                               l_cost_ret_status := l_function_is_allowed;
1487                               x_ret_code := l_function_is_allowed;
1488                         ELSE
1489                               l_cost_ret_status := l_function_not_allowed;
1490                               x_ret_code := l_function_not_allowed;
1491                         END IF;
1492 
1493                         IF p_pa_debug_mode = 'Y' THEN
1494                               pa_debug.g_err_stage := 'status : '||l_ret_code;
1495                               pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
1496                         END IF;
1497 
1498                   END IF;
1499 
1500                   -- In case of FINPLAN, check fn security for REVENUE or ALL version
1501 
1502                   --We should NOT use ELSIF here as we want this block also to be executed
1503                   --when p_version_type is ALL.
1504 
1505                   IF p_version_type = PA_FP_CONSTANTS_PKG.G_VERSION_TYPE_REVENUE OR
1506                      p_version_type = PA_FP_CONSTANTS_PKG.G_VERSION_TYPE_ALL  THEN
1507 
1508                         IF l_plan_class =  'APPROVED_BUDGET' THEN
1509 
1510                              l_function_name      := 'PA_FP_APP_BDGT_MNT_REV_PLAN';
1511 
1512                         ELSIF l_plan_class =  'NON_APPROVED_BUDGET' THEN
1513 
1514                               l_function_name     := 'PA_FP_BDGT_MNT_REV_PLAN';
1515 
1516                         ELSIF l_plan_class =  'FORECAST' THEN
1517 
1518                               l_function_name     := 'PA_FP_FCST_MNT_REV_PLAN';
1519 
1520                         ELSE
1521 
1522                              IF p_pa_debug_mode = 'Y' THEN
1523                                pa_debug.g_err_stage := 'Error while retrieving the plan class. ' ||
1524                                                        'Invalid plan type ..';
1525                                pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
1526                              END IF;
1527                              PA_UTILS.ADD_MESSAGE(p_app_short_name  => 'PA',
1528                                                 p_msg_name        => 'PA_FP_INV_PARAM_PASSED');
1529                              RAISE PA_FP_CONSTANTS_PKG.INVALID_ARG_EXC;
1530 
1531                         END IF;
1532 
1533                         PA_PM_FUNCTION_SECURITY_PUB.check_function_security(
1534                                     p_api_version_number => p_api_version_number,
1535                                     p_responsibility_id  => l_resp_id,
1536                                     p_function_name      => l_function_name,
1537                                     p_msg_count          => l_msg_count,
1538                                     p_msg_data           => l_msg_data,
1539                                     p_return_status      => x_return_status,
1540                                     p_function_allowed   => l_ret_code);
1541 
1542                         IF x_return_status = FND_API.G_RET_STS_SUCCESS AND
1543                            l_ret_code = l_function_is_allowed THEN
1544                               l_rev_ret_status := l_function_is_allowed;
1545                               x_ret_code := l_function_is_allowed;
1546                         ELSE
1547                               l_rev_ret_status := l_function_not_allowed;
1548                               x_ret_code := l_function_not_allowed;
1549                         END IF;
1550 
1551                         IF p_pa_debug_mode = 'Y' THEN
1552                               pa_debug.g_err_stage := 'status : '||l_ret_code;
1553                               pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
1554                         END IF;
1555 
1556                   END IF;
1557 
1558                   -- In case of FINPLAN, check fn security for ALL version
1559                   IF p_version_type = PA_FP_CONSTANTS_PKG.G_VERSION_TYPE_ALL  THEN
1560 
1561                         IF l_cost_ret_status = l_function_is_allowed OR
1562                            l_rev_ret_status = l_function_is_allowed THEN
1563                            l_ret_code := l_function_is_allowed;
1564                            x_ret_code := l_function_is_allowed;
1565                         ELSE
1566                            l_ret_code := l_function_not_allowed;
1567                            x_ret_code := l_function_not_allowed;
1568                         END IF;
1569 
1570                         IF p_pa_debug_mode = 'Y' THEN
1571                               pa_debug.g_err_stage := 'status : '||l_ret_code;
1572                               pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
1573                         END IF;
1574 
1575                   END IF; -- Comparision for ALL version_type ends
1576 
1577             ELSIF p_function_name = 'PA_PM_BASELINE_BUDGET'  THEN
1578 
1579               -- In case of FINPLAN, check fn security for COST or ALL version
1580 
1581                   IF p_version_type = PA_FP_CONSTANTS_PKG.G_VERSION_TYPE_COST OR
1582                      p_version_type = PA_FP_CONSTANTS_PKG.G_VERSION_TYPE_ALL  THEN
1583 
1584                         IF l_plan_class =  'APPROVED_BUDGET' THEN
1585 
1586                               l_function_name      := 'PA_FP_APP_BDGT_BSLN_COST_PLAN';
1587 
1588                         ELSIF l_plan_class =  'NON_APPROVED_BUDGET' THEN
1589 
1590                               l_function_name      := 'PA_FP_BDGT_BSLN_COST_PLAN';
1591 
1592                         ELSIF l_plan_class =  'FORECAST' THEN
1593 
1594                               l_function_name      := 'PA_FP_FCST_BSLN_COST_PLAN';
1595 
1596                         ELSE
1597 
1598                              IF p_pa_debug_mode = 'Y' THEN
1599                                pa_debug.g_err_stage := 'Error while retrieving the plan class.' ||
1600                                                        'Invalid plan type ..';
1601                                pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
1602                              END IF;
1603                              PA_UTILS.ADD_MESSAGE(p_app_short_name  => 'PA',
1604                                                 p_msg_name        => 'PA_FP_INV_PARAM_PASSED');
1605                              RAISE PA_FP_CONSTANTS_PKG.INVALID_ARG_EXC;
1606 
1607                         END IF;
1608 
1609                         PA_PM_FUNCTION_SECURITY_PUB.check_function_security(
1610                                     p_api_version_number => p_api_version_number,
1611                                     p_responsibility_id  => l_resp_id,
1612                                     p_function_name      => l_function_name,
1613                                     p_msg_count          => l_msg_count,
1614                                     p_msg_data           => l_msg_data,
1615                                     p_return_status      => x_return_status,
1616                                     p_function_allowed   => l_ret_code);
1617 
1618                         IF x_return_status = FND_API.G_RET_STS_SUCCESS AND
1619                            l_ret_code = l_function_is_allowed THEN
1620                               l_cost_ret_status := l_function_is_allowed;
1621                               x_ret_code := l_function_is_allowed;
1622                         ELSE
1623                               l_cost_ret_status := l_function_not_allowed;
1624                               x_ret_code := l_function_not_allowed;
1625                         END IF;
1626 
1627                         IF p_pa_debug_mode = 'Y' THEN
1628                               pa_debug.g_err_stage := 'status : '||l_ret_code;
1629                               pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
1630                         END IF;
1631 
1632                   END IF;
1633 
1634                   --In case of FINPLAN, check fn security for REVENUE or ALL version
1635                   IF p_version_type = PA_FP_CONSTANTS_PKG.G_VERSION_TYPE_REVENUE OR
1636                     p_version_type = PA_FP_CONSTANTS_PKG.G_VERSION_TYPE_ALL  THEN
1637 
1638                         IF l_plan_class =  'APPROVED_BUDGET' THEN
1639 
1640                               l_function_name      := 'PA_FP_APP_BDGT_BSLN_REV_PLAN';
1641 
1642                         ELSIF l_plan_class =  'NON_APPROVED_BUDGET' THEN
1643 
1644                               l_function_name      := 'PA_FP_BDGT_BSLN_REV_PLAN';
1645 
1646                         ELSIF l_plan_class =  'FORECAST' THEN
1647 
1648                               l_function_name      := 'PA_FP_FCST_BSLN_REV_PLAN';
1649 
1650                         ELSE
1651 
1652                              IF p_pa_debug_mode = 'Y' THEN
1653                                pa_debug.g_err_stage := 'Error while retrieving the plan class. ' ||
1654                                                        'Invalid plan type ..';
1655                                pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
1656                              END IF;
1657 
1658                              PA_UTILS.ADD_MESSAGE(p_app_short_name  => 'PA',
1659                                                 p_msg_name        => 'PA_FP_INV_PARAM_PASSED');
1660                              RAISE PA_FP_CONSTANTS_PKG.INVALID_ARG_EXC;
1661 
1662                         END IF;
1663 
1664                         PA_PM_FUNCTION_SECURITY_PUB.check_function_security(
1665                                     p_api_version_number => p_api_version_number,
1666                                     p_responsibility_id  => l_resp_id,
1667                                     p_function_name      => l_function_name,
1668                                     p_msg_count          => l_msg_count,
1669                                     p_msg_data           => l_msg_data,
1670                                     p_return_status      => x_return_status,
1671                                     p_function_allowed   => l_ret_code);
1672 
1673                         IF x_return_status = FND_API.G_RET_STS_SUCCESS AND
1674                            l_ret_code = l_function_is_allowed THEN
1675                               l_rev_ret_status := l_function_is_allowed;
1676                               x_ret_code := l_function_is_allowed;
1677                         ELSE
1678                               l_rev_ret_status := l_function_not_allowed;
1679                               x_ret_code := l_function_not_allowed;
1680                         END IF;
1681 
1682                         IF p_pa_debug_mode = 'Y' THEN
1683                               pa_debug.g_err_stage := 'status : '||l_ret_code;
1684                               pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
1685                         END IF;
1686 
1687                   END IF;
1688 
1689                   --In case of FINPLAN, check fn security for ALL version
1690                   IF p_version_type = PA_FP_CONSTANTS_PKG.G_VERSION_TYPE_ALL  THEN
1691 
1692                         IF l_cost_ret_status = l_function_is_allowed OR
1693                            l_rev_ret_status = l_function_is_allowed THEN
1694                               l_ret_code := l_function_is_allowed;
1695                               x_ret_code := l_function_is_allowed;
1696                         ELSE
1697                               l_ret_code := l_function_not_allowed;
1698                               x_ret_code := l_function_not_allowed;
1699                         END IF;
1700 
1701                         IF p_pa_debug_mode = 'Y' THEN
1702                               pa_debug.g_err_stage := 'status : '||l_ret_code;
1703                               pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
1704                         END IF;
1705 
1706                   END IF; -- Comparision for ALL version_type ends
1707 
1708             ELSIF p_function_name = 'CALCULATE_AMOUNTS'  THEN
1709 
1710                    IF l_plan_class =  'APPROVED_BUDGET' THEN
1711 
1712                         l_function_name      := 'PA_FP_APP_BDGT_MNT_PLAN_LINES';
1713 
1714                    ELSIF l_plan_class =  'NON_APPROVED_BUDGET' THEN
1715 
1716                         l_function_name      := 'PA_FP_BDGT_MNT_PLAN_LINES';
1717 
1718                    ELSIF l_plan_class =  'FORECAST' THEN
1719 
1720                          l_function_name      := 'PA_FP_FCST_MNT_PLAN_LINES';
1721 
1722                    ELSE
1723 
1724                         IF p_pa_debug_mode = 'Y' THEN
1725                                pa_debug.g_err_stage := 'Error while retrieving the plan class.' ||
1726                                                        'Invalid plan type ..';
1727                                pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
1728                         END IF;
1729                         PA_UTILS.ADD_MESSAGE(p_app_short_name  => 'PA',
1730                                              p_msg_name        => 'PA_FP_INV_PARAM_PASSED');
1731                         RAISE PA_FP_CONSTANTS_PKG.INVALID_ARG_EXC;
1732 
1733                    END IF;
1734 
1735                    PA_PM_FUNCTION_SECURITY_PUB.check_function_security(
1736                               p_api_version_number => p_api_version_number,
1737                               p_responsibility_id  => l_resp_id,
1738                               p_function_name      => l_function_name,
1739                               p_msg_count          => l_msg_count,
1740                               p_msg_data           => l_msg_data,
1741                               p_return_status      => x_return_status,
1742                               p_function_allowed   => l_ret_code);
1743 
1744                    IF x_return_status = FND_API.G_RET_STS_SUCCESS AND
1745                       l_ret_code = l_function_is_allowed THEN
1746                           l_ret_code := l_function_is_allowed;
1747                           x_ret_code := l_function_is_allowed;
1748                    ELSE
1749                          l_ret_code := l_function_not_allowed;
1750                          x_ret_code := l_function_not_allowed;
1751                    END IF;
1752 
1753                    IF p_pa_debug_mode = 'Y' THEN
1754                          pa_debug.g_err_stage := 'status : '||l_ret_code;
1755                          pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
1756                    END IF;
1757 
1758             --Bug 4224464: Added the following elsif block to check function security
1759             --for PA_BUDGET_PUB.delete_baseline_budget AMG api.
1760             ELSIF p_function_name = 'PA_PM_DELETE_BASELINE_BUDGET'  THEN
1761 
1762                    IF l_plan_class =  'APPROVED_BUDGET' THEN
1763 
1764                         l_function_name      := 'PA_FP_DEL_BSLN_APPRVD_BDGT';
1765 
1766                    ELSIF l_plan_class =  'NON_APPROVED_BUDGET' THEN
1767 
1768                         l_function_name      := 'PA_FP_DEL_BSLN_BDGT';
1769 
1770                    ELSIF l_plan_class =  'FORECAST' THEN
1771 
1772                          l_function_name      := 'PA_FP_DEL_APPRVD_FCST';
1773 
1774                    ELSE
1775 
1776                         IF p_pa_debug_mode = 'Y' THEN
1777                                pa_debug.g_err_stage := 'Error while retrieving the plan class.' ||
1778                                                        'Invalid plan type ..';
1779                                pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
1780                         END IF;
1781                         PA_UTILS.ADD_MESSAGE(p_app_short_name  => 'PA',
1782                                              p_msg_name        => 'PA_FP_INV_PARAM_PASSED');
1783                         RAISE PA_FP_CONSTANTS_PKG.INVALID_ARG_EXC;
1784 
1785                    END IF;
1786 
1787                    PA_PM_FUNCTION_SECURITY_PUB.check_function_security(
1788                               p_api_version_number => p_api_version_number,
1789                               p_responsibility_id  => l_resp_id,
1790                               p_function_name      => l_function_name,
1791                               p_msg_count          => l_msg_count,
1792                               p_msg_data           => l_msg_data,
1793                               p_return_status      => x_return_status,
1794                               p_function_allowed   => l_ret_code);
1795 
1796                    IF x_return_status = FND_API.G_RET_STS_SUCCESS AND
1797                       l_ret_code = l_function_is_allowed THEN
1798                           l_ret_code := l_function_is_allowed;
1799                           x_ret_code := l_function_is_allowed;
1800                    ELSE
1801                          l_ret_code := l_function_not_allowed;
1802                          x_ret_code := l_function_not_allowed;
1803                    END IF;
1804 
1805                    IF p_pa_debug_mode = 'Y' THEN
1806                          pa_debug.g_err_stage := 'status : '||l_ret_code;
1807                          pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
1808                    END IF;
1809             --Bug 4224464: End of changes
1810 
1811             -- Bug 3986129: FP.M Web ADI Dev. Inculded the following checks
1812             -- for editing of change order versions and forecasr versions
1813             ELSIF p_function_name = 'PA_PM_UPDATE_CHG_DOC'  THEN -- for maintaing CI versions
1814 
1815               -- check fn security for COST or ALL version
1816 
1817                   IF p_version_type = PA_FP_CONSTANTS_PKG.G_VERSION_TYPE_COST OR
1818                      p_version_type = PA_FP_CONSTANTS_PKG.G_VERSION_TYPE_ALL  THEN
1819 
1820                         l_function_name := 'PA_FP_MNT_CHG_DOC_COST_FIN_IMP';
1821 
1822                         PA_PM_FUNCTION_SECURITY_PUB.check_function_security(
1823                                     p_api_version_number => p_api_version_number,
1824                                     p_responsibility_id  => l_resp_id,
1825                                     p_function_name      => l_function_name,
1826                                     p_msg_count          => l_msg_count,
1827                                     p_msg_data           => l_msg_data,
1828                                     p_return_status      => x_return_status,
1829                                     p_function_allowed   => l_ret_code);
1830 
1831                         IF x_return_status = FND_API.G_RET_STS_SUCCESS AND
1832                            l_ret_code = l_function_is_allowed THEN
1833                               l_cost_ret_status := l_function_is_allowed;
1834                               x_ret_code := l_function_is_allowed;
1835                         ELSE
1836                               l_cost_ret_status := l_function_not_allowed;
1837                               x_ret_code := l_function_not_allowed;
1838                         END IF;
1839 
1840                         IF p_pa_debug_mode = 'Y' THEN
1841                               pa_debug.g_err_stage := 'status : '||l_ret_code;
1842                               pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
1843                         END IF;
1844 
1845                   END IF;
1846 
1847                   --In case of FINPLAN, check fn security for REVENUE or ALL version
1848                   IF p_version_type = PA_FP_CONSTANTS_PKG.G_VERSION_TYPE_REVENUE OR
1849                     p_version_type = PA_FP_CONSTANTS_PKG.G_VERSION_TYPE_ALL  THEN
1850                               l_function_name      := 'PA_FP_MNT_CHG_DOC_REV_FIN_IMP';
1851 
1852                         PA_PM_FUNCTION_SECURITY_PUB.check_function_security(
1853                                     p_api_version_number => p_api_version_number,
1854                                     p_responsibility_id  => l_resp_id,
1855                                     p_function_name      => l_function_name,
1856                                     p_msg_count          => l_msg_count,
1857                                     p_msg_data           => l_msg_data,
1858                                     p_return_status      => x_return_status,
1859                                     p_function_allowed   => l_ret_code);
1860 
1861                         IF x_return_status = FND_API.G_RET_STS_SUCCESS AND
1862                            l_ret_code = l_function_is_allowed THEN
1863                               l_rev_ret_status := l_function_is_allowed;
1864                               x_ret_code := l_function_is_allowed;
1865                         ELSE
1866                               l_rev_ret_status := l_function_not_allowed;
1867                               x_ret_code := l_function_not_allowed;
1868                         END IF;
1869 
1870                         IF p_pa_debug_mode = 'Y' THEN
1871                               pa_debug.g_err_stage := 'status : '||l_ret_code;
1872                               pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
1873                         END IF;
1874 
1875                   END IF;
1876 
1877                   IF p_version_type = PA_FP_CONSTANTS_PKG.G_VERSION_TYPE_ALL  THEN
1878 
1879                         IF l_cost_ret_status = l_function_is_allowed OR
1880                            l_rev_ret_status = l_function_is_allowed THEN
1881                               l_ret_code := l_function_is_allowed;
1882                               x_ret_code := l_function_is_allowed;
1883                         ELSE
1884                               l_ret_code := l_function_not_allowed;
1885                               x_ret_code := l_function_not_allowed;
1886                         END IF;
1887 
1888                         IF p_pa_debug_mode = 'Y' THEN
1889                               pa_debug.g_err_stage := 'status : '||l_ret_code;
1890                               pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
1891                         END IF;
1892 
1893                   END IF; -- Comparision for ALL version_type ends
1894 
1895             ELSIF p_function_name = 'PA_PM_SUBMIT_BUDGET'  THEN -- submit privilege for budget/forecasts
1896 
1897                   IF p_version_type = PA_FP_CONSTANTS_PKG.G_VERSION_TYPE_COST OR
1898                      p_version_type = PA_FP_CONSTANTS_PKG.G_VERSION_TYPE_ALL  THEN
1899 
1900                         IF l_plan_class =  'APPROVED_BUDGET' THEN
1901 
1902                               l_function_name      := 'PA_FP_APP_BDGT_SUB_COST_PLAN';
1903 
1904                         ELSIF l_plan_class =  'NON_APPROVED_BUDGET' THEN
1905 
1906                               l_function_name      := 'PA_FP_BDGT_SUB_COST_PLAN';
1907 
1908                         ELSIF l_plan_class =  'FORECAST' THEN
1909 
1910                               l_function_name      := 'PA_FP_FCST_SUB_COST_PLAN';
1911 
1912                         ELSE
1913 
1914                              IF p_pa_debug_mode = 'Y' THEN
1915                                pa_debug.g_err_stage := 'Error while retrieving the plan class.' ||
1916                                                        'Invalid plan type ..';
1917                                pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
1918                              END IF;
1919                              PA_UTILS.ADD_MESSAGE(p_app_short_name  => 'PA',
1920                                                 p_msg_name        => 'PA_FP_INV_PARAM_PASSED');
1921                              RAISE PA_FP_CONSTANTS_PKG.INVALID_ARG_EXC;
1922 
1923                         END IF;
1924 
1925                         PA_PM_FUNCTION_SECURITY_PUB.check_function_security(
1926                                     p_api_version_number => p_api_version_number,
1927                                     p_responsibility_id  => l_resp_id,
1928                                     p_function_name      => l_function_name,
1929                                     p_msg_count          => l_msg_count,
1930                                     p_msg_data           => l_msg_data,
1931                                     p_return_status      => x_return_status,
1932                                     p_function_allowed   => l_ret_code);
1933 
1934                         IF x_return_status = FND_API.G_RET_STS_SUCCESS AND
1935                            l_ret_code = l_function_is_allowed THEN
1936                               l_cost_ret_status := l_function_is_allowed;
1937                               x_ret_code := l_function_is_allowed;
1938                         ELSE
1939                               l_cost_ret_status := l_function_not_allowed;
1940                               x_ret_code := l_function_not_allowed;
1941                         END IF;
1942 
1943                         IF p_pa_debug_mode = 'Y' THEN
1944                               pa_debug.g_err_stage := 'status : '||l_ret_code;
1945                               pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
1946                         END IF;
1947 
1948                   END IF;
1949 
1950                   --In case of FINPLAN, check fn security for REVENUE or ALL version
1951                   IF p_version_type = PA_FP_CONSTANTS_PKG.G_VERSION_TYPE_REVENUE OR
1952                     p_version_type = PA_FP_CONSTANTS_PKG.G_VERSION_TYPE_ALL  THEN
1953 
1954                         IF l_plan_class =  'APPROVED_BUDGET' THEN
1955 
1956                               l_function_name      := 'PA_FP_APP_BDGT_SUB_REV_PLAN';
1957 
1958                         ELSIF l_plan_class =  'NON_APPROVED_BUDGET' THEN
1959 
1960                               l_function_name      := 'PA_FP_BDGT_SUB_REV_PLAN';
1961 
1962                         ELSIF l_plan_class =  'FORECAST' THEN
1963 
1964                               l_function_name      := 'PA_FP_FCST_SUB_REV_PLAN';
1965 
1966                         ELSE
1967 
1968                              IF p_pa_debug_mode = 'Y' THEN
1969                                pa_debug.g_err_stage := 'Error while retrieving the plan class. ' ||
1970                                                        'Invalid plan type ..';
1971                                pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
1972                              END IF;
1973 
1974                              PA_UTILS.ADD_MESSAGE(p_app_short_name  => 'PA',
1975                                                 p_msg_name        => 'PA_FP_INV_PARAM_PASSED');
1976                              RAISE PA_FP_CONSTANTS_PKG.INVALID_ARG_EXC;
1977 
1978                         END IF;
1979 
1980                         PA_PM_FUNCTION_SECURITY_PUB.check_function_security(
1981                                     p_api_version_number => p_api_version_number,
1982                                     p_responsibility_id  => l_resp_id,
1983                                     p_function_name      => l_function_name,
1984                                     p_msg_count          => l_msg_count,
1985                                     p_msg_data           => l_msg_data,
1986                                     p_return_status      => x_return_status,
1987                                     p_function_allowed   => l_ret_code);
1988 
1989                         IF x_return_status = FND_API.G_RET_STS_SUCCESS AND
1990                            l_ret_code = l_function_is_allowed THEN
1991                               l_rev_ret_status := l_function_is_allowed;
1992                               x_ret_code := l_function_is_allowed;
1993                         ELSE
1994                               l_rev_ret_status := l_function_not_allowed;
1995                               x_ret_code := l_function_not_allowed;
1996                         END IF;
1997 
1998                         IF p_pa_debug_mode = 'Y' THEN
1999                               pa_debug.g_err_stage := 'status : '||l_ret_code;
2000                               pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
2001                         END IF;
2002 
2003                   END IF;
2004 
2005                   --In case of FINPLAN, check fn security for ALL version
2006                   IF p_version_type = PA_FP_CONSTANTS_PKG.G_VERSION_TYPE_ALL  THEN
2007 
2008                         IF l_cost_ret_status = l_function_is_allowed OR
2009                            l_rev_ret_status = l_function_is_allowed THEN
2010                               l_ret_code := l_function_is_allowed;
2011                               x_ret_code := l_function_is_allowed;
2012                         ELSE
2013                               l_ret_code := l_function_not_allowed;
2014                               x_ret_code := l_function_not_allowed;
2015                         END IF;
2016 
2017                         IF p_pa_debug_mode = 'Y' THEN
2018                               pa_debug.g_err_stage := 'status : '||l_ret_code;
2019                               pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
2020                         END IF;
2021 
2022                   END IF; -- Comparision for ALL version_type ends
2023 
2024             ELSE  -- if the function passed doesnot match any value compared
2025                   IF p_pa_debug_mode = 'Y' THEN
2026                         pa_debug.g_err_stage := 'Invalid function name passed';
2027                         pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
2028                   END IF;
2029                   pa_utils.add_message
2030                          (p_app_short_name  => 'PA',
2031                           p_msg_name        => 'PA_FP_INV_PARAM_PASSED');
2032                   RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
2033 
2034             END IF; -- end of processing for various function calls
2035             -- Bug 3986129: FP.M Web ADI changes ends
2036 
2037             IF x_ret_code = l_function_not_allowed THEN
2038                   pa_utils.add_message(
2039                               p_app_short_name  => 'PA',
2040                               p_msg_name        => 'PA_FUNCTION_SECURITY_ENFORCED');
2041                   /* 3377434  Modified message name PA_PR_SECURITY_ENFORCED_AMG to
2042                   PA_FUNCTION_SECURITY_ENFORCED above*/
2043             END IF;
2044 
2045       ELSE -- End of ELSE block where p_calling_context = FINPLAN is checked.
2046 
2047             IF p_pa_debug_mode = 'Y' THEN
2048                   pa_debug.g_err_stage := 'Unhandled case of p_calling_context '||p_calling_context;
2049                   pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
2050             END IF;
2051 
2052             RAISE PA_FP_CONSTANTS_PKG.INVALID_ARG_EXC;
2053 
2054       END IF;
2055 
2056       --Changes for bug 3182963
2057       IF p_pa_debug_mode = 'Y' THEN
2058           pa_debug.reset_curr_function;
2059       END IF;
2060 
2061 -- Exception handling
2062 EXCEPTION
2063     WHEN PA_FP_CONSTANTS_PKG.INVALID_ARG_EXC THEN
2064           l_ret_code      :=l_function_not_allowed;
2065           x_ret_code      := l_function_not_allowed;
2066           x_return_status := FND_API.G_RET_STS_ERROR;
2067 
2068           --Changes for bug 3182963
2069           IF p_pa_debug_mode = 'Y' THEN
2070               pa_debug.reset_curr_function;
2071           END IF;
2072 
2073           RETURN;
2074 
2075     WHEN FND_API.G_EXC_ERROR THEN
2076           l_ret_code      :=l_function_not_allowed;
2077           x_ret_code      := l_function_not_allowed;
2078           x_return_status := FND_API.G_RET_STS_ERROR;
2079 
2080           --Changes for bug 3182963
2081           IF p_pa_debug_mode = 'Y' THEN
2082               pa_debug.reset_curr_function;
2083           END IF;
2084 
2085           RETURN;
2086 
2087     WHEN OTHERS THEN
2088           l_ret_code    :=l_function_not_allowed;
2089           x_ret_code      := l_function_not_allowed;
2090           x_return_status := FND_API.G_RET_STS_ERROR;
2091           IF p_pa_debug_mode = 'Y' THEN
2092               pa_debug.g_err_stage := 'Unexpected Exception: '||sqlerrm;
2093               pa_debug.write(l_module_name,pa_debug.g_err_stage,3);
2094           END IF;
2095 
2096           --Changes for bug 3182963
2097           IF p_pa_debug_mode = 'Y' THEN
2098               pa_debug.reset_curr_function;
2099           END IF;
2100 
2101           RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2102 
2103 END CHECK_BUDGET_SECURITY;
2104 
2105 END PA_PM_FUNCTION_SECURITY_PUB;