DBA Data[Home] [Help]

PACKAGE BODY: APPS.PA_PROJ_STRUCTURE_UTILS

Source


1 package body PA_PROJ_STRUCTURE_UTILS as
2 /* $Header: PAXSTRUB.pls 120.5 2007/05/23 12:51:20 kvuyyuru ship $ */
3 
4 -- Bug Fix 5611909. Creating global variables to cache the project id and budget version id.
5 -- These will be used in the program unit Get_All_Wbs_Rejns and these will be set by using
6 -- the set_budget_version_id_global procedure.
7 -- NOTE: PLEASE DO NOT MODIFY THESE ANYWHERE ELSE OR USING ANY OTHER MEANS.
8 
9 --
10 procedure CHECK_LOOPED_PROJECT
11 (
12 	p_api_version				IN		NUMBER		:= 1.0,
13 	p_init_msg_list 		IN		VARCHAR2	:= FND_API.G_TRUE,
14 	p_commit						IN		VARCHAR2	:= FND_API.G_FALSE,
15 	p_validate_only			IN		VARCHAR2	:= FND_API.G_TRUE,
16 	p_debug_mode				IN		VARCHAR2	:= 'N',
17 	p_task_id						IN		NUMBER,
18 	p_project_id				IN		NUMBER,
19 	x_return_status			OUT		NOCOPY VARCHAR2, --File.Sql.39 bug 4440895
20 	x_msg_count					OUT		NOCOPY NUMBER, --File.Sql.39 bug 4440895
21 	x_msg_data					OUT		NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
22 )
23 IS
24   l_looped		VARCHAR2(1);
25 Begin
26 	pa_debug.set_err_stack('CHECK_LOOPED_PROJECT');
27 
28 	--Block to check if this project is looped.
29 	Begin
30 	--check if it is looped
31 		select 'Y'
32 	 	into l_looped
33 		from
34 			pa_object_relationships r
35 		where
36 -- Bug 5589038		object_id_to1 =
37                         object_id_to2 =
38 			(
39 				select
40 					project_id
41 				from
42 					pa_tasks t
43 				where
44 					t.task_id = p_task_id
45 			)
46 		start with object_id_from2 = p_project_id
47 -- Bug 5589038		connect by object_id_from2 = PRIOR object_id_to1;
48                 connect by object_id_from2 = PRIOR object_id_to2;
49 	EXCEPTION
50 		When NO_DATA_FOUND Then
51 			l_looped := 'N';
52 	End;
53 
54 
55 	IF (l_looped = 'N') Then
56 		--Block to check if the task is linking to its owning project
57 		BEGIN
58 			select 'Y'
59 			into l_looped
60 			from
61 				pa_tasks t2
62 			where
63 				t2.task_id = p_task_id and
64 				t2.project_id = p_project_id;
65 		EXCEPTION
66 			When NO_DATA_FOUND Then
67 				l_looped := 'N';
68 		END;
69 	end if;
70 
71 	IF (l_looped = 'Y') THEN   --There is a loop
72 		x_return_status := FND_API.G_RET_STS_ERROR;
73 	elsif (l_looped = 'N') THEN
74 		x_return_status := FND_API.G_RET_STS_SUCCESS;
75 	else
76 		x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
77 	end if;
78 
79 	x_msg_count := 0;
80 	x_msg_data := null;
81 
82 	pa_debug.reset_err_stack;
83 EXCEPTION
84 	When OTHERS Then
85 		x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
86 		RAISE;
87 END CHECK_LOOPED_PROJECT;
88 
89 
90 
91 procedure CHECK_MERGED_PROJECT
92 (
93 	p_api_version				IN		NUMBER		:= 1.0,
94 	p_init_msg_list 		IN		VARCHAR2	:= FND_API.G_TRUE,
95 	p_commit						IN		VARCHAR2	:= FND_API.G_FALSE,
96 	p_validate_only			IN		VARCHAR2	:= FND_API.G_TRUE,
97 	p_debug_mode				IN		VARCHAR2	:= 'N',
98 	p_task_id						IN		NUMBER,
99 	p_project_id				IN		NUMBER,
100 	x_return_status			OUT		NOCOPY VARCHAR2, --File.Sql.39 bug 4440895
101 	x_msg_count					OUT		NOCOPY NUMBER, --File.Sql.39 bug 4440895
102 	x_msg_data					OUT		NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
103 )
104 IS
105 	l_linked_id	PA_OBJECT_RELATIONSHIPS.OBJECT_ID_FROM2%TYPE;
106 	l_exist     VARCHAR2(1);
107 	l_linked		VARCHAR2(1);
108 
109 /* Commented for Bug5589038
110   CURSOR get_same_project(l_task_id NUMBER, l_project_id VARCHAR2) IS
111   select 'Y'
112   from
113     pa_object_relationships r,
114     pa_tasks t
115   where
116     r.object_id_to1 = l_project_id and
117     r.object_type_to = 'PA_PROJECTS' and
118     r.relationship_type = 'H' and
119     r.object_id_from2 = t.project_id and
120     t.task_id = l_task_id; */
121 --    object_id_from1 = l_task_id and
122 --    object_type_from = 'PA_TASKS' and
123 --    relationship_type = 'H';
124 
125 -- Modified the above cursor for Bug Bug5589038
126   CURSOR get_same_project(l_task_id NUMBER, l_project_id VARCHAR2) IS
127   select 'Y'
128   from
129     pa_object_relationships r,
130     pa_tasks t
131   where
132     r.object_id_to2 = l_project_id and
133     r.object_type_to = 'PA_STRUCTURES' and
134     (r.relationship_type = 'LF' or r.relationship_type = 'LW')  and
135     r.object_id_from2 = t.project_id and
136     t.task_id = l_task_id;
137 
138 	CURSOR get_merged_projects(l_task_id VARCHAR2, l_project_id VARCHAR2) IS
139   (
140 	select
141 		object_id_from2
142 	from
143 		pa_object_relationships
144 	start with
145 -- Bug5589038		object_id_to1 =
146                  object_id_to2 =
147 		(
148 			select
149 				project_id
150 			from
151 				pa_tasks t
152 			where
153 				t.task_id = l_task_id
154 		)
155 --Bug5589038	connect by PRIOR object_id_from2 = object_id_to1
156 	connect by PRIOR object_id_from2 = object_id_to2
157   union
158   select
159     project_id
160   from
161     pa_tasks
162   where
163     task_id = l_task_id
164   )
165 	intersect
166 	select
167 		object_id_from2
168 	from
169 		pa_object_relationships
170 -- Bug5589038	start with object_id_to1 = l_project_id
171  	start with object_id_to2 = l_project_id
172 -- Bug5589038	connect by PRIOR object_id_from2 = object_id_to1;
173 	connect by PRIOR object_id_from2 = object_id_to2;
174 
175 Begin
176 	pa_debug.set_err_stack('CHECK_MERGED_PROJECT');
177 	--Block to check if this project is linked.
178   Begin
179 	  OPEN  get_same_project(p_task_id, to_char(p_project_id));
180     FETCH get_same_project into l_exist;
181     CLOSE get_same_project;
182     IF (l_exist IS NULL) THEN
183       -- This row does not exist; no duplicates.
184 			Begin
185 				--check if it is merged
186 				OPEN get_merged_projects(to_char(p_task_id), to_char(p_project_id));
187 				LOOP
188 					FETCH get_merged_projects INTO l_linked_id;
189 					EXIT WHEN get_merged_projects%FOUND;
190 					l_linked_id := null;
191 					EXIT WHEN get_merged_projects%NOTFOUND;
192 				END LOOP;
193 				CLOSE get_merged_projects;
194 
195 				IF(l_linked_id IS NULL) THEN
196 					x_return_status := FND_API.G_RET_STS_SUCCESS;
197 				ELSE
198 					x_return_status := FND_API.G_RET_STS_ERROR;
199 				END IF;
200 
201 			EXCEPTION
202 				When NO_DATA_FOUND Then
203 					l_linked := 'N';
204 			End;
205 		ELSE
206       x_return_status := FND_API.G_RET_STS_ERROR;
207 		END IF;
208 	END;
209 
210 	x_msg_count := 0;
211 	x_msg_data := null;
212 	pa_debug.reset_err_stack;
213 EXCEPTION
214 	When OTHERS Then
215 		x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
216 		RAISE;
217 END CHECK_MERGED_PROJECT;
218 
219 
220 function CHECK_PROJECT_CONTRACT_EXISTS
221 (
222 	p_project_id	IN	NUMBER
223 )
224 return VARCHAR2
225 IS
226 	output		VARCHAR2(1);
227 	retval		VARCHAR2(1);
228   msg_count NUMBER;
229 	msg_data	VARCHAR2(2000);
230 	ret_status VARCHAR2(10);
231 BEGIN
232 	pa_debug.set_err_stack('CHECK_PROJECT_CONTRACT_EXISTS');
233 	retval := FND_API.G_RET_STS_SUCCESS;
234 
235 /*
236   -- Old code
237 	output := OKE_UTILS.Project_Used(p_project_id);
238 */
239 
240 /*	OKE_PA_CHECKS_PUB.Project_Used(p_api_version => 1.0,
241 		p_commit => FND_API.G_TRUE,
242 		p_init_msg_list => FND_API.G_FALSE,
243     x_msg_count => msg_count,
244 		x_msg_data => msg_data,
245 		x_return_status => ret_status,
246 		Project_ID => p_project_id,
247 		X_Result => output
248 		);  */     --Commented the call to OKE_PA_CHECKS_PUB.Project_Used
249 	IF (output = 'Y') THEN
250 		-- project is used, association exists, return error
251 		retval := FND_API.G_RET_STS_ERROR;
252 	ELSE
253     -- no association exists, return success
254 		retval := FND_API.G_RET_STS_SUCCESS;
255 	END IF;
256 
257 
258 	pa_debug.reset_err_stack;
259 	return retval;
260 EXCEPTION
261 	When OTHERS Then
262 		return FND_API.G_RET_STS_UNEXP_ERROR;
263 END CHECK_PROJECT_CONTRACT_EXISTS;
264 
265 
266 function CHECK_TASK_CONTRACT_EXISTS
267 (
268 	p_task_id	IN	NUMBER
269 )
270 return VARCHAR2
271 IS
272 	output		VARCHAR2(1);
273 	retval		VARCHAR2(1);
274   msg_count NUMBER;
275 	msg_data	VARCHAR2(2000);
276 	ret_status VARCHAR2(10);
277 BEGIN
278 	pa_debug.set_err_stack('CHECK_TASK_CONTRACT_EXISTS');
279 	retval := FND_API.G_RET_STS_SUCCESS;
280 
281 /*
282   -- Old code
283 	output := OKE_UTILS.Task_Used(p_task_id);
284 */
285 /*	OKE_PA_CHECKS_PUB.Task_Used(p_api_version => 1.0,
286 		p_commit => FND_API.G_TRUE,
287 		p_init_msg_list => FND_API.G_FALSE,
288     x_msg_count => msg_count,
289 		x_msg_data => msg_data,
290 		x_return_status => ret_status,
291 		Task_ID => p_task_id,
292 		x_Result => output
293 		);*/      --Commented the call to OKE_PA_CHECKS_PUB.Project_Used
294 	IF (output = 'Y') THEN
295 		-- project is used, association exists, return error
296 		retval := FND_API.G_RET_STS_ERROR;
297 	ELSE
298     -- no association exists, return success
299 		retval := FND_API.G_RET_STS_SUCCESS;
300 	END IF;
301 
302 	pa_debug.reset_err_stack;
303 	return retval;
304 EXCEPTION
305 	When OTHERS Then
306 		return FND_API.G_RET_STS_UNEXP_ERROR;
307 END CHECK_TASK_CONTRACT_EXISTS;
308 -- FP M: Project Execution Workflow Changes
309 FUNCTION IS_WF_ENABLED_FOR_STRUCTURE(
310 	p_project_id			IN		NUMBER
311     ,p_structure_type		IN		VARCHAR2
312 )
313 RETURN VARCHAR2
314 IS
315 -- This cursor selects the enable_wf_flag
316 -- for the given structure and for given project.
317 CURSOR C IS
318  SELECT ENABLE_WF_FLAG
319    FROM PA_PROJ_ELEMENTS ppe,
320         PA_PROJ_STRUCTURE_TYPES pps,
321         PA_STRUCTURE_TYPES pst
322   WHERE ppe.project_id = p_project_id
323     AND ppe.object_type = 'PA_STRUCTURES'
324     AND ppe.proj_element_id = pps.proj_element_id
325     AND pps.structure_type_id = pst.structure_type_id
326     AND pst.structure_type_class_code = p_structure_type ;
327 
328     l_dummy VARCHAR2(1) := 'N' ;
329 BEGIN
330    OPEN C;
331    FETCH C INTO l_dummy ;
332    IF C%NOTFOUND THEN
333      l_dummy := 'N';
334    END IF ;
335    CLOSE C;
336    RETURN nvl(l_dummy,'N') ;
337 EXCEPTION
338 	WHEN OTHERS THEN
339 		return 'N';
340 END IS_WF_ENABLED_FOR_STRUCTURE ;
341 
342 function Get_All_Wbs_Rejns(
343 p_project_id                   IN Number,
344 p_calling_mode                 IN Varchar2 Default 'PROJ_STR_VER',
345 p_proj_str_version_id          IN Number,
346 p_Task_str_version_id          IN Number   Default Null,
347 p_start_date                   IN Date     Default Null,
348 p_end_date                     IN Date     Default Null
349 )
350 return VARCHAR2
351 IS
352   f1 varchar2(2000);
353   f2 varchar2(2000);
354   f3 varchar2(2000);
355   f4 varchar2(2000);
356   f5 varchar2(2000);
357   f6 varchar2(2000);
358   rs varchar2(2000);
359   returnflag varchar2(2000);
360 
361 
362   l_budget_version_id pa_budget_versions.budget_version_id%TYPE;
363 
364 BEGIN
365 
366 -- Bug Fix 5611909.
367 -- Caching the budget_version id and passing it to the PA_FIN_PLAN_UTILS2.Get_WbsBdgtLineRejns.
368 -- Get the budget_version_id from the db for the following conditions.
369 -- 1) This API is called for the first time. Both globals are NULL.
370 -- 2) This API is called for a different project id other than the global project id.
371 
372   IF
373      (((PA_PROJ_STRUCTURE_UTILS.G_PROJECT_ID IS NULL) AND (PA_PROJ_STRUCTURE_UTILS.G_BUDGET_VERSION_ID IS NULL))
374   OR
375      (PA_PROJ_STRUCTURE_UTILS.G_PROJECT_ID <> p_project_ID)) THEN
376 
377      l_budget_version_id := Pa_Fp_wp_gen_amt_utils.get_wp_version_id
378 			(p_project_id       => p_project_id
379                          ,p_plan_type_id    => null
380                          ,p_proj_str_ver_id => p_proj_str_version_id);
381 
382      set_budget_version_id_global(p_project_id,l_budget_version_id);
383 
384    END IF;
385 
386   PA_FIN_PLAN_UTILS2.Get_WbsBdgtLineRejns
387         (p_project_id => p_project_id,
388          p_calling_mode => p_calling_mode,
389          p_proj_str_version_id => p_proj_str_version_id,
390          p_Task_str_version_id => p_Task_str_version_id,
391          p_start_date => p_start_date,
392          p_end_date => p_end_date,
393          p_budget_version_id => PA_PROJ_STRUCTURE_UTILS.G_BUDGET_VERSION_ID,
394          x_cost_rejn_flag => f1,
395          x_burden_rejn_flag => f2,
396          x_revenue_rejn_flag => f3,
397          x_pc_conv_rejn_flag => f4,
398          x_pfc_conv_rejn_flag => f5,
399          x_projstrlvl_rejn_flag => f6,
400          x_return_status => rs);
401   returnflag := 'N';
402   IF (p_calling_mode = 'PROJ_STR_VER') THEN
403     IF (f6 = 'Y') THEN returnflag := 'Y'; END IF;
404   ELSE
405     IF (f1 = 'Y') THEN returnflag := 'Y'; END IF;
406     IF (f2 = 'Y') THEN returnflag := 'Y'; END IF;
407     IF (f3 = 'Y') THEN returnflag := 'Y'; END IF;
408     IF (f4 = 'Y') THEN returnflag := 'Y'; END IF;
409     IF (f5 = 'Y') THEN returnflag := 'Y'; END IF;
410   END IF;
411   RETURN (returnflag);
412 END Get_All_Wbs_Rejns;
413 
414 
415 --bug 4290593
416 function CHECK_STR_TEMP_TAB_POPULATED(p_project_id NUMBER) RETURN VARCHAR2 IS
417    CURSOR cur_str_tmp
418    IS
419      SELECT 'x' FROM pa_structures_tasks_tmp
420      WHERE parent_project_id=p_project_id
421      and rownum < 2;
422 
423    l_dummy   VARCHAR2(1);
424 BEGIN
425    OPEN cur_str_tmp;
426    FETCH cur_str_tmp INTO l_dummy;
427    IF cur_str_tmp%FOUND
428    THEN
429       CLOSE cur_str_tmp;
430       RETURN 'Y';
431    ELSE
432       CLOSE cur_str_tmp;
433       RETURN 'N';
434    END IF;
435 END CHECK_STR_TEMP_TAB_POPULATED;
436 
437 function CHECK_PJI_TEMP_TAB_POPULATED(p_project_id NUMBER) RETURN VARCHAR2 IS
438    CURSOR cur_pji_tmp
439    IS
440      SELECT 'x' FROM pji_fm_xbs_accum_tmp1
441      WHERE project_id=p_project_id
442      and rownum < 2;
443 
444    l_dummy   VARCHAR2(1);
445 BEGIN
446    OPEN cur_pji_tmp;
447    FETCH cur_pji_tmp INTO l_dummy;
448    IF cur_pji_tmp%FOUND
449    THEN
450       CLOSE cur_pji_tmp;
451       RETURN 'Y';
452    ELSE
453       CLOSE cur_pji_tmp;
454       RETURN 'N';
455    END IF;
456 END CHECK_PJI_TEMP_TAB_POPULATED;
457 --end bug 4290593
458 
459 -- Bug Fix 5611909. Creating global variables to cache the project id and budget version id.
460 -- These will be used in the program unit Get_All_Wbs_Rejns and these will be set by using
461 -- the set_budget_version_id_global procedure.
462 -- NOTE: PLEASE DO NOT MODIFY THESE ANYWHERE ELSE OR USING ANY OTHER MEANS.
463 
464 PROCEDURE  set_budget_version_id_global (p_project_id IN NUMBER,
465                                          p_budget_version_id IN NUMBER) IS
466 
467 BEGIN
468 
469 --Begin: 6046307: commented out the following IF condition that 'RAISE  FND_API.G_EXC_ERROR' when 'p_project_id' or 'p_budget_version_id' are NULL
470 /*
471   IF p_project_id IS NULL OR p_budget_version_id IS NULL THEN
472     RAISE FND_API.G_EXC_ERROR;
473   END IF;
474  */
475  --End: 6046307
476 
477   PA_PROJ_STRUCTURE_UTILS.G_PROJECT_ID := p_project_id;
478   PA_PROJ_STRUCTURE_UTILS.G_BUDGET_VERSION_ID := p_budget_version_id;
479 
480 END;
481 
482 
483 END PA_PROJ_STRUCTURE_UTILS;
484