[Home] [Help]
PACKAGE BODY: APPS.PA_PROJ_STRUCTURE_PVT
Source
1 package body PA_PROJ_STRUCTURE_PVT as
2 /* $Header: PAXSTRVB.pls 120.5 2010/08/16 06:17:34 smijosep ship $ */
3 --
4 --
5 function CHECK_ASSO_PROJ_OK
6 (
7 p_task_id IN NUMBER,
8 p_project_id IN NUMBER
9 )
10 return VARCHAR2
11 IS
12 l_looped VARCHAR2(1);
13 l_linked VARCHAR2(1);
14 l_msgcnt NUMBER;
15 l_msg VARCHAR2(2000);
16 BEGIN
17 pa_debug.set_err_stack('CHECK_ASSO_PROJ_OK');
18 --
19 BEGIN
20 PA_PROJ_STRUCTURE_UTILS.CHECK_LOOPED_PROJECT(
21 p_task_id => p_task_id,
22 p_project_id => p_project_id,
23 x_return_status => l_looped,
24 x_msg_count => l_msgcnt,
25 x_msg_data => l_msg
26 );
27 END;
28 --
29 BEGIN
30 PA_PROJ_STRUCTURE_UTILS.CHECK_MERGED_PROJECT(
31 p_task_id => p_task_id,
32 p_project_id => p_project_id,
33 x_return_status => l_linked,
34 x_msg_count => l_msgcnt,
35 x_msg_data => l_msg
36 );
37 END;
38 --
39 IF ((l_looped = FND_API.G_RET_STS_SUCCESS) AND
40 (l_linked = FND_API.G_RET_STS_SUCCESS)) THEN
41 return FND_API.G_RET_STS_SUCCESS;
42 ELSE
43 return FND_API.G_RET_STS_ERROR;
44 END IF;
45 --
46 pa_debug.reset_err_stack;
47 EXCEPTION
48 WHEN OTHERS THEN
49 RAISE;
50 -- return FND_API.G_RET_STS_UNEXP_ERROR;
51 END CHECK_ASSO_PROJ_OK;
52 --
53 --
54 --
55 procedure CREATE_RELATIONSHIP
56 (
57 p_api_version IN NUMBER := 1.0,
58 p_init_msg_list IN VARCHAR2 := FND_API.G_TRUE,
59 p_commit IN VARCHAR2 := FND_API.G_FALSE,
60 p_validate_only IN VARCHAR2 := FND_API.G_TRUE,
61 p_debug_mode IN VARCHAR2 := 'N',
62 p_task_id IN NUMBER,
63 p_project_id IN NUMBER,
64 x_return_status OUT NOCOPY VARCHAR2, --File.Sql.39 bug 4440895
65 x_msg_count OUT NOCOPY NUMBER, --File.Sql.39 bug 4440895
66 x_msg_data OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
67 )
68 IS
69 l_owning_proj_id NUMBER;
70 l_create_ok VARCHAR2(1);
71 l_user_id NUMBER;
72 l_object_relationships_id NUMBER;
73 l_msg_index_out NUMBER;
74 l_cc_prvdr VARCHAR2(1);
75 --
76 l_proj_start_date DATE;
77 l_proj_end_date DATE;
78 l_task_start_date DATE;
79 l_task_end_date DATE;
80 -- added for Bug: 4537865
81 l_new_msg_count NUMBER;
82 -- added for Bug: 4537865
83 --
84 CURSOR get_owning_project_id(l_task_id NUMBER) IS
85 select project_id
86 from pa_tasks
87 where task_id = l_task_id;
88 --
89 CURSOR get_task_dates(l_task_id NUMBER) IS
90 select start_date, completion_date
91 from pa_tasks
92 where task_id = l_task_id;
93 --
94 CURSOR get_project_dates(l_project_id NUMBER) IS
95 select start_date, completion_date
96 from pa_projects_all
97 where project_id = l_project_id;
98 --
99 CURSOR IS_CC_PRVDR(l_project_id NUMBER) IS
100 select cc_prvdr_flag
101 from pa_project_types_all t, pa_projects_all p
102 --Added the org_id join for bug 5561054
103 where t.org_id = p.org_id
104 and t.project_type = p.project_type and
105 p.project_id = l_project_id;
106 --
107 --This is cursor is used when source task id and dest project id are passed to this api.
108 --This cursor returns subproject association relationships ids for the
109 --given source task id and destination project id.
110 CURSOR get_src_task_det(cp_src_task_id NUMBER) IS
111 SELECT ppev.element_version_id src_task_ver_id,ppe.project_id src_proj_id
112 FROM pa_proj_elements ppe,
113 pa_proj_element_versions ppev,
114 pa_tasks pt
115 WHERE ppe.proj_element_id = cp_src_task_id
116 AND ppe.project_id = ppev.project_id
117 AND ppe.proj_element_id = ppev.proj_element_id
118 AND pt.task_id = ppe.proj_element_id
119 -- Added for bug 4999937
120 AND ppev.parent_structure_version_id =
121 PA_PROJECT_STRUCTURE_UTILS.GET_LATEST_FIN_STRUC_VER_ID(ppev.project_id);
122 --
123 l_src_task_det_rec get_src_task_det%ROWTYPE;
124 l_dest_proj_name VARCHAR2(50);
125 l_src_task_id NUMBER;
126 l_dest_proj_id NUMBER;
127 -- added for Bug: 4537865
128 l_new_dest_proj_id NUMBER;
129 -- added for Bug: 4537865
130 l_error_msg_code VARCHAR2(250);
131 l_data VARCHAR2(250);
132 l_msg_count NUMBER;
133 l_msg_data VARCHAR2(250);
134 --
135 Begin
136 pa_debug.set_err_stack('CREATE_RELATIONSHIP');
137 --
138 x_return_status := FND_API.G_RET_STS_SUCCESS;
139 l_user_id := FND_GLOBAL.USER_ID;
140 --
141 l_src_task_id:= p_task_id;
142 l_dest_proj_id:=p_project_id;
143 IF ((l_dest_proj_id = PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM) OR
144 (l_dest_proj_id IS NULL)) THEN
145 PA_UTILS.ADD_MESSAGE( 'PA', 'PA_PS_DEST_PROJ_NULL');
146 RAISE FND_API.G_EXC_ERROR;
147 END IF;
148 --
149 OPEN IS_CC_PRVDR(p_project_id);
150 LOOP
151 FETCH IS_CC_PRVDR INTO l_cc_prvdr;
152 EXIT WHEN IS_CC_PRVDR%NOTFOUND;
153 END LOOP;
154 CLOSE IS_CC_PRVDR;
155 --
156 IF (l_cc_prvdr <> 'Y') AND (l_cc_prvdr <> 'y') THEN
157 l_create_ok := CHECK_ASSO_PROJ_OK(p_task_id => p_task_id, p_project_id => p_project_id);
158 --
159 IF (l_create_ok = FND_API.G_RET_STS_SUCCESS) THEN
160 --
161 OPEN get_src_task_det(p_task_id);
162 FETCH get_src_task_det INTO l_src_task_det_rec;
163 IF get_src_task_det%NOTFOUND THEN
164 PA_UTILS.ADD_Message('PA','PA_STRUCT_CREATE_ERR');
165 x_return_status := FND_API.G_RET_STS_ERROR;
166 END IF;
167 CLOSE get_src_task_det;
168 PA_PROJ_ELEMENTS_UTILS.Project_Name_Or_Id(
169 p_project_name => l_dest_proj_name
170 ,p_project_id => l_dest_proj_id
171 ,p_check_id_flag => PA_STARTUP.G_Check_ID_Flag
172 --,x_project_id => l_dest_proj_id * commented for Bug: 4537865
173 ,x_project_id => l_new_dest_proj_id -- added for Bug: 4537865
174 ,x_return_status => x_return_status
175 ,x_error_msg_code => l_error_msg_code
176 );
177
178 -- added for Bug: 4537865
179 IF x_return_status = FND_API.G_RET_STS_SUCCESS THEN
180 l_dest_proj_id := l_new_dest_proj_id;
181 END IF;
182 -- added for Bug: 4537865
183
184 IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
185 PA_UTILS.ADD_MESSAGE( 'PA', l_error_msg_code);
186 x_return_status := FND_API.G_RET_STS_ERROR;
187 END IF;
188 --
189 /* Find owning project id */
190 OPEN get_owning_project_id(p_task_id);
191 LOOP
192 FETCH get_owning_project_id INTO l_owning_proj_id;
193 EXIT WHEN get_owning_project_id%NOTFOUND;
194 END LOOP;
195 CLOSE get_owning_project_id;
196 --
197 IF (l_owning_proj_id is NULL) THEN
198 /* Selected task does not belong to a valid project */
199 PA_UTILS.ADD_Message('PA','PA_STRUCT_CREATE_ERR');
200 x_return_status := FND_API.G_RET_STS_ERROR;
201 ELSE
202 /* call table handler */
203 /*pa_object_relationships_pkg.insert_row(
204 p_user_id => l_user_id,
205 p_object_type_from => 'PA_TASKS',
206 p_object_id_from1 => p_task_id,
207 p_object_id_from2 => l_owning_proj_id,
208 p_object_id_from3 => null,
209 p_object_id_from4 => null,
210 p_object_id_from5 => null,
211 p_object_type_to => 'PA_PROJECTS',
212 p_object_id_to1 => p_project_id,
213 p_object_id_to2 => null,
214 p_object_id_to3 => null,
215 p_object_id_to4 => null,
216 p_object_id_to5 => null,
217 p_relationship_type => 'H',
218 p_relationship_subtype => null,
219 p_lag_day => null,
220 p_imported_lag => null,
221 p_priority => null,
222 p_pm_product_code => null,
223 X_OBJECT_RELATIONSHIP_ID => l_object_relationships_id,
224 X_RETURN_STATUS => x_return_status
225 );*/ --commented the call to implement new functionality
226 --
227 PA_RELATIONSHIP_PVT.create_subproject_association(
228 p_api_version => p_api_version,
229 p_init_msg_list => p_init_msg_list,
230 p_validate_only => p_validate_only,
231 -- p_validation_level => p_validation_level,
232 -- p_calling_module => p_calling_module,
233 p_commit => p_commit,
234 p_debug_mode => p_debug_mode,
235 p_max_msg_count => x_msg_count,
236 p_src_proj_id => l_src_task_det_rec.src_proj_id,
237 p_task_ver_id => l_src_task_det_rec.src_task_ver_id,
238 p_dest_proj_id => l_dest_proj_id,
239 p_dest_proj_name => l_dest_proj_name,
240 p_comment => NULL,
241 x_return_status => x_return_status,
242 --x_msg_count => x_msg_count, * commented for Bug Fix: 4537865
243 x_msg_count => l_new_msg_count, --added for Bug: 4537865
244 x_msg_data => x_msg_data);
245 --
246 /* Check for date warning */
247 IF (x_return_status = FND_API.G_RET_STS_SUCCESS) THEN
248 --
249 --added for Bug: 4537865
250 x_msg_count := l_new_msg_count;
251 --added for Bug: 4537865
252 OPEN get_task_dates(p_task_id);
253 LOOP
254 FETCH get_task_dates INTO l_task_start_date, l_task_end_date;
255 EXIT WHEN get_task_dates%NOTFOUND;
256 END LOOP;
257 CLOSE get_task_dates;
258 --
259 OPEN get_project_dates(p_project_id);
260 LOOP
261 FETCH get_project_dates INTO l_proj_start_date, l_proj_end_date;
262 EXIT WHEN get_project_dates%NOTFOUND;
263 END LOOP;
264 CLOSE get_project_dates;
265 --
266 /* Check for date warning */
267 /* Check if subproject start date is earlier than task start date */
268 IF (l_task_start_date IS NOT NULL) THEN
269 IF (l_proj_start_date IS NULL) THEN
270 x_return_status := 'W';
271 ELSIF (l_proj_start_date < l_task_start_date) THEN
272 x_return_status := 'W';
273 END IF;
274 END IF;
275 /* Check if subproject end date is later than task end date */
276 IF (l_task_end_date IS NOT NULL) THEN
277 IF (l_proj_end_date IS NULL) THEN
278 x_return_status := 'W';
279 ELSIF (l_proj_end_date > l_task_end_date) THEN
280 x_return_status := 'W';
281 END IF;
282 END IF;
283 --
284 IF (x_return_status = 'W') THEN
285 PA_UTILS.Add_Message('PA','PA_STRUCT_DATE_WARNING');
286 END IF;
287 --
288 ELSE
289 PA_UTILS.ADD_Message('PA','PA_STRUCT_CREATE_ERR');
290 END IF; /* End Date warning check */
291 --
292 END IF; /* End Create Relationship */
293 ELSE
294 PA_UTILS.Add_Message('PA','PA_STRUCT_PJ_EXT_IN_STRUCT');
295 x_return_status := FND_API.G_RET_STS_ERROR;
296 END IF;
297 ELSE
298 PA_UTILS.Add_Message('PA','PA_STRUCT_PROJ_BILLABLE');
299 x_return_status := FND_API.G_RET_STS_ERROR;
300 END IF;
301 --
302 x_msg_count := FND_MSG_PUB.Count_Msg;
303 --
304 IF (x_msg_count = 1) THEN
305 pa_interface_utils_pub.get_messages ( p_encoded => FND_API.G_TRUE
306 ,p_msg_index => 1
307 ,p_data => x_msg_data
308 ,p_msg_index_out => l_msg_index_out
309 );
310
311 ELSE
312 x_msg_data := null;
313 END IF;
314 pa_debug.reset_err_stack;
315 EXCEPTION
316 When OTHERS Then
317 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
318 RAISE;
319 END CREATE_RELATIONSHIP;
320 --
321 --
322 --
323 procedure DELETE_RELATIONSHIP
324 (
325 p_api_version IN NUMBER := 1.0,
326 p_init_msg_list IN VARCHAR2 := FND_API.G_TRUE,
327 p_commit IN VARCHAR2 := FND_API.G_FALSE,
328 p_validate_only IN VARCHAR2 := FND_API.G_TRUE,
329 p_debug_mode IN VARCHAR2 := 'N',
330 p_task_id IN NUMBER,
331 p_project_id IN NUMBER,
332 x_return_status OUT NOCOPY VARCHAR2, --File.Sql.39 bug 4440895
333 x_msg_count OUT NOCOPY NUMBER, --File.Sql.39 bug 4440895
334 x_msg_data OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
335 )
336 IS
337 l_project_id NUMBER;
338 l_task_id NUMBER;
339 l_project_from_id NUMBER;
340 l_object_relationship_id NUMBER;
341 l_msg_index_out NUMBER;
342 l_disassociation VARCHAR2(1);
343 --
344 CURSOR get_all_projects_for_task(l_task_id NUMBER) IS
345 select
346 object_id_to1, object_relationship_id
347 from
348 pa_object_relationships
349 where
350 object_id_from1 = l_task_id and
351 OBJECT_TYPE_FROM = 'PA_TASKS' and
352 relationship_type = 'H';
353 --
354 CURSOR get_all_tasks_for_project(l_project_id NUMBER) IS
355 select
356 object_id_from1, object_relationship_id
357 from
358 pa_object_relationships
359 where
360 (object_id_to1 = l_project_id and
361 relationship_type = 'H')
362 or
363 (object_id_from2 = l_project_id and
364 relationship_type = 'H');
365 --
366 CURSOR get_selected_relationship(l_task_id NUMBER, l_project_id NUMBER) IS
367 select
368 object_relationship_id
369 from
370 pa_object_relationships
371 where
372 object_type_to = 'PA_PROJECTS' and
373 object_type_from = 'PA_TASKS' and
374 object_id_to1 = l_project_id and
375 object_id_from1 = l_task_id and
376 relationship_type = 'H';
377 --
378 --
379 CURSOR get_src_task_det(cp_src_task_id NUMBER) IS
380 SELECT ppev.element_version_id src_task_ver_id,ppe.project_id src_proj_id
381 FROM pa_proj_elements ppe,
382 pa_proj_element_versions ppev,
383 pa_tasks pt
384 WHERE ppe.proj_element_id = cp_src_task_id
385 AND ppe.project_id = ppev.project_id
386 AND ppe.proj_element_id = ppev.proj_element_id
387 AND pt.task_id = ppe.proj_element_id
388 AND ppev.parent_structure_version_id =
389 PA_PROJECT_STRUCTURE_UTILS.GET_LATEST_FIN_STRUC_VER_ID(ppev.project_id); -- Added for Bug 5687144
390 --
391 --This is cursor is used when source task id and dest project id are passed to this api.
392 --This cursor returns subproject association relationships ids for the
393 --given source task id and destination project id.
394 --
395 CURSOR get_relationship_det1(cp_src_task_ver_id NUMBER,
396 cp_src_proj_id NUMBER,
397 cp_dest_proj_id NUMBER) IS
398 SELECT porb.object_relationship_id lnk_obj_rel_id,
399 porb.record_version_number lnk_rel_rec_ver_number
400 FROM pa_proj_element_versions ppev,
401 pa_object_relationships pora,
402 pa_object_relationships porb,
403 pa_proj_elements ppe
404 WHERE pora.relationship_type = 'S'
405 AND ppev.project_id = cp_src_proj_id
406 AND pora.OBJECT_ID_FROM1 = cp_src_task_ver_id
407 AND pora.object_type_from = 'PA_TASKS'
408 AND pora.OBJECT_ID_to1 = ppev.ELEMENT_VERSION_ID
409 AND ppe.proj_element_id = ppev.proj_element_id
410 AND pora.object_id_to1=porb.object_id_from1
411 AND porb.object_id_to2 <> porb.object_id_from2
412 AND porb.object_id_to2 = cp_dest_proj_id -- Added for Bug 5687144
413 AND porb.object_type_to = 'PA_STRUCTURES'
414 AND porb.relationship_type = 'LF'
415 AND ppe.link_task_flag = 'Y';
416 --
417 --This cursor is used when the destination project id is not passed to this api
418 --This cursor will return all the relationship ids that are going out of the
419 --source task version id.
420 CURSOR get_all_sub_proj_ass_det(cp_src_task_ver_id NUMBER,
421 cp_src_proj_id NUMBER) IS
422 SELECT porb.object_relationship_id lnk_obj_rel_id,
423 porb.record_version_number lnk_rel_rec_ver_number
424 FROM pa_proj_element_versions ppev,
425 pa_object_relationships pora,
426 pa_object_relationships porb,
427 pa_proj_elements ppe
428 WHERE pora.relationship_type = 'S'
429 AND ppev.project_id = cp_src_proj_id
430 AND pora.OBJECT_ID_FROM1 = cp_src_task_ver_id
431 AND pora.object_type_from = 'PA_TASKS'
432 AND pora.OBJECT_ID_to1 = ppev.ELEMENT_VERSION_ID
433 AND ppe.proj_element_id = ppev.proj_element_id
434 AND pora.object_id_to1=porb.object_id_from1
435 AND porb.object_id_to2 <> porb.object_id_from2
436 AND porb.object_id_from2 = cp_src_proj_id
437 AND porb.object_type_to = 'PA_STRUCTURES'
438 AND porb.object_type_from = 'PA_TASKS'
439 AND porb.relationship_type ='LF'
440 AND ppe.link_task_flag = 'Y';
441 --
442 --This is cursor is used when the source task id is not passed to this api
443 --Cursor will return all the incoming links to the financial structure
444 --on the p_project_id, which is destination project id.
445 CURSOR get_str_sub_proj_ass_det(cp_dest_struct_ver_id NUMBER,
446 cp_dest_proj_id NUMBER) IS
447 SELECT porb.object_relationship_id lnk_obj_rel_id,
448 porb.record_version_number lnk_rel_rec_ver_number
449 FROM pa_object_relationships porb
450 WHERE porb.OBJECT_ID_to1 = cp_dest_struct_ver_id
451 AND porb.object_id_from2 = cp_dest_proj_id
452 AND porb.object_id_to2 <> porb.object_id_from2
453 AND porb.object_type_to = 'PA_STRUCTURES'
454 AND porb.object_type_from = 'PA_TASKS'
455 AND porb.relationship_type ='LF';
456 --
457 l_rel_id NUMBER;
458 l_rec_ver_num NUMBER;
459 l_src_task_ver_id NUMBER;
460 l_src_proj_id NUMBER;
461 l_dest_proj_name VARCHAR2(50);
462 l_error_msg_code VARCHAR2(250);
463 l_dest_fin_str_ver_id NUMBER;
464 l_data VARCHAR2(250);
465 l_msg_count NUMBER;
466 l_msg_data VARCHAR2(250);
467 --
468 Begin
469 pa_debug.set_err_stack('DELETE_RELATIONSHIP');
470 x_return_status := FND_API.G_RET_STS_SUCCESS;
471 --
472 IF p_task_id IS NOT NULL THEN
473 OPEN get_src_task_det(p_task_id);
474 FETCH get_src_task_det INTO l_src_task_ver_id,l_src_proj_id;
475 IF get_src_task_det%NOTFOUND THEN
476 PA_UTILS.ADD_Message('PA','PA_STRUCT_CREATE_ERR');
477 x_return_status := FND_API.G_RET_STS_ERROR;
478 END IF;
479 CLOSE get_src_task_det;
480 END IF;
481 --
482 /* new */
483 IF (p_task_id IS NOT NULL) AND (p_project_id IS NOT NULL) THEN
484 --
485 --
486 OPEN get_relationship_det1(l_src_task_ver_id,l_src_proj_id,p_project_id);
487 FETCH get_relationship_det1 INTO l_rel_id,l_rec_ver_num;
488 IF get_relationship_det1%NOTFOUND THEN
489 PA_UTILS.ADD_Message('PA','PA_STRUCT_CREATE_ERR');
490 x_return_status := FND_API.G_RET_STS_ERROR;
491 END IF;
492 CLOSE get_relationship_det1;
493 --
494 --
495 --
496 /* check if any children has contract associated to it */
497 -- Get task owning project
498 /* select project_id
499 into l_project_from_id
500 from pa_tasks
501 where task_id = p_task_id;*/
502 --
503 -- Bug_9931285: Uncommented the below check.
504 IF (pa_install.is_product_installed('OKE')) THEN
505 OKE_PA_CHECKS_PUB.Disassociation_Allowed(p_api_version => 1.0,
506 x_msg_count => x_msg_count,
507 x_msg_data => x_msg_data,
508 x_return_status => x_return_status,
509 From_Project_ID => l_project_from_id,
510 From_Task_ID => p_task_id,
511 To_Project_ID => p_project_id,
512 X_Result => l_disassociation
513 );
514 ELSE
515 l_disassociation := 'Y';
516 END IF;
517 -- Bug_9931285: Commented below line
518 -- l_disassociation := 'Y'; --Moved this line here from the above if block
519 --
520 If ('Y' = l_disassociation) THEN
521 /* disassociation allowed */
522 --
523 /*OPEN get_selected_relationship(p_task_id, p_project_id);
524 LOOP
525 FETCH get_selected_relationship INTO l_object_relationship_id;
526 EXIT WHEN get_selected_relationship%NOTFOUND;
527 BEGIN
528 pa_object_relationships_pkg.delete_row(
529 P_OBJECT_RELATIONSHIP_ID => l_object_relationship_id,
530 P_OBJECT_TYPE_FROM => null,
531 P_OBJECT_ID_FROM1 => p_task_id,
532 P_OBJECT_ID_FROM2 => null,
533 P_OBJECT_ID_FROM3 => null,
534 P_OBJECT_ID_FROM4 => null,
535 P_OBJECT_ID_FROM5 => null,
536 P_OBJECT_TYPE_TO => null,
537 P_OBJECT_ID_TO1 => p_project_id,
538 P_OBJECT_ID_TO2 => null,
539 P_OBJECT_ID_TO3 => null,
540 P_OBJECT_ID_TO4 => null,
541 P_OBJECT_ID_TO5 => null,
542 P_RECORD_VERSION_NUMBER => null,
543 P_PM_PRODUCT_CODE => null,
544 X_RETURN_STATUS => x_return_status
545 );
546 EXCEPTION
547 WHEN OTHERS THEN
548 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
549 PA_UTILS.ADD_Message('PA','PA_STRUCT_DELETE_ERR');
550 END;
551 EXIT WHEN (x_return_status <> FND_API.G_RET_STS_SUCCESS);
552 END LOOP;*/ --Commented the code to implement new functionality for subproject association
553 PA_RELATIONSHIP_PVT.Delete_SubProject_Association(
554 p_commit => p_commit
555 ,p_validate_only => p_validate_only
556 ,p_debug_mode => p_debug_mode
557 ,p_object_relationships_id => l_rel_id
558 ,p_record_version_number => l_rec_ver_num
559 ,x_return_status => x_return_status
560 ,x_msg_count => x_msg_count
561 ,x_msg_data => x_msg_data);
562
563 ELSE
564 /* Can't delete relationship due to other contracts*/
565 x_return_status := FND_API.G_RET_STS_ERROR;
566 PA_UTILS.ADD_Message('PA','PA_STRUCT_HAS_SUB_CONT');
567 END IF;
568 ELSIF (p_task_id IS NOT NULL) AND (p_project_id IS NULL) THEN
569 /* If task_id is not null, then delete all relationships that the task is associated with */
570 -- Get task owning project
571 select project_id
572 into l_project_from_id
573 from pa_tasks
574 where task_id = p_task_id;
575 --
576 OPEN get_all_sub_proj_ass_det(l_src_task_ver_id,l_src_proj_id);
577 LOOP
578 l_rec_ver_num:=NULL;
579 l_rel_id:=NULL;
580 FETCH get_all_sub_proj_ass_det INTO l_rel_id,l_rec_ver_num;
581 EXIT WHEN get_all_sub_proj_ass_det%NOTFOUND;
582 --
583 -- OPEN get_all_projects_for_task(p_task_id);
584 -- LOOP
585 -- FETCH get_all_projects_for_task INTO l_project_id, l_object_relationship_id;
586 -- EXIT WHEN get_all_projects_for_task%NOTFOUND;
587 --
588 /* check if this relationship can be removed */
589 /*IF (pa_install.is_product_installed('OKE')) THEN
590 OKE_PA_CHECKS_PUB.Disassociation_Allowed(p_api_version => 1.0,
591 x_msg_count => x_msg_count,
592 x_msg_data => x_msg_data,
593 x_return_status => x_return_status,
594 From_Project_ID => l_project_from_id,
595 From_Task_ID => p_task_id,
596 To_Project_ID => l_project_id,
597 X_Result => l_disassociation
598 );
599 ELSE
600 l_disassociation := 'Y';
601 END IF;*/ --Commented if block
602 l_disassociation := 'Y'; --Moved this line here from the above if block
603 if (l_disassociation = 'N') THEN
604 x_return_status := FND_API.G_RET_STS_ERROR;
605 PA_UTILS.ADD_Message('PA','PA_STRUCT_HAS_SUB_CONT');
606 end if;
607 --EXIT when l_disassociation = 'N';
608 --
609 -- call table handler api
610 BEGIN
611 /*pa_object_relationships_pkg.delete_row(
612 P_OBJECT_RELATIONSHIP_ID => l_object_relationship_id,
613 P_OBJECT_TYPE_FROM => null,
614 P_OBJECT_ID_FROM1 => p_task_id,
615 P_OBJECT_ID_FROM2 => null,
616 P_OBJECT_ID_FROM3 => null,
617 P_OBJECT_ID_FROM4 => null,
618 P_OBJECT_ID_FROM5 => null,
619 P_OBJECT_TYPE_TO => null,
620 P_OBJECT_ID_TO1 => l_project_id,
621 P_OBJECT_ID_TO2 => null,
622 P_OBJECT_ID_TO3 => null,
623 P_OBJECT_ID_TO4 => null,
624 P_OBJECT_ID_TO5 => null,
625 P_RECORD_VERSION_NUMBER => null,
626 P_PM_PRODUCT_CODE => null,
627 X_RETURN_STATUS => x_return_status
628 );*/ --Commented the code to implement new functionality for subproject association
629 --
630 PA_RELATIONSHIP_PVT.Delete_SubProject_Association(
631 p_commit => p_commit
632 ,p_validate_only => p_validate_only
633 ,p_debug_mode => p_debug_mode
634 ,p_object_relationships_id => l_rel_id
635 ,p_record_version_number => l_rec_ver_num
636 ,x_return_status => x_return_status
637 ,x_msg_count => x_msg_count
638 ,x_msg_data => x_msg_data);
639 EXCEPTION
640 WHEN OTHERS THEN
641 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
642 PA_UTILS.ADD_Message('PA','PA_STRUCT_DELETE_ERR');
643 END;
644 --EXIT WHEN (x_return_status <> FND_API.G_RET_STS_SUCCESS);
645
646 END LOOP;
647 -- CLOSE get_all_projects_for_task;
648 CLOSE get_all_sub_proj_ass_det;
649 ELSIF (p_project_id IS NOT NULL) AND (p_task_id IS NULL) THEN
650 --
651 l_dest_fin_str_ver_id:=PA_PROJECT_STRUCTURE_UTILS.GET_LATEST_FIN_STRUC_VER_ID(p_project_id);
652 IF l_dest_fin_str_ver_id IS NULL THEN
653 --get only version for fin
654 PA_PROJECT_STRUCTURE_UTILS.Get_Financial_Version(p_project_id,l_dest_fin_str_ver_id);
655 END IF;
656 --
657 /* If project_id is not null, then delete all relationships that the project is associated with */
658
659 -- OPEN get_all_tasks_for_project(p_project_id);
660 -- LOOP
661 -- FETCH get_all_tasks_for_project INTO l_task_id, l_object_relationship_id;
662 -- EXIT WHEN get_all_tasks_for_project%NOTFOUND;
663 OPEN get_str_sub_proj_ass_det(l_dest_fin_str_ver_id,
664 p_project_id);
665 LOOP
666 l_rec_ver_num:=NULL;
667 l_rel_id:=NULL;
668 FETCH get_str_sub_proj_ass_det INTO l_rel_id,l_rec_ver_num;
669 EXIT WHEN get_str_sub_proj_ass_det%NOTFOUND;
670 /* do not need to check subproject relationship because delete task */
671 /* will check them. do not need to check current project relationship */
672 /* with other tasks because we check if contract is associated to it */
673 /* call table handler api */
674 BEGIN
675 /*pa_object_relationships_pkg.delete_row(
676 P_OBJECT_RELATIONSHIP_ID => l_object_relationship_id,
677 P_OBJECT_TYPE_FROM => null,
678 P_OBJECT_ID_FROM1 => l_task_id,
679 P_OBJECT_ID_FROM2 => null,
680 P_OBJECT_ID_FROM3 => null,
681 P_OBJECT_ID_FROM4 => null,
682 P_OBJECT_ID_FROM5 => null,
683 P_OBJECT_TYPE_TO => null,
684 P_OBJECT_ID_TO1 => p_project_id,
685 P_OBJECT_ID_TO2 => null,
686 P_OBJECT_ID_TO3 => null,
687 P_OBJECT_ID_TO4 => null,
688 P_OBJECT_ID_TO5 => null,
689 P_RECORD_VERSION_NUMBER => null,
690 P_PM_PRODUCT_CODE => null,
691 X_RETURN_STATUS => x_return_status
692 );*/ --Commented the code to implement new functionality for subproject association
693 PA_RELATIONSHIP_PVT.Delete_SubProject_Association(
694 p_commit => p_commit
695 ,p_validate_only => p_validate_only
696 ,p_debug_mode => p_debug_mode
697 ,p_object_relationships_id => l_rel_id
698 ,p_record_version_number => l_rec_ver_num
699 ,x_return_status => x_return_status
700 ,x_msg_count => x_msg_count
701 ,x_msg_data => x_msg_data);
702 --
703 EXCEPTION
704 WHEN OTHERS THEN
705 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
706 PA_UTILS.ADD_Message('PA','PA_STRUCT_DELETE_ERR');
707 END;
708 EXIT WHEN (x_return_status <> FND_API.G_RET_STS_SUCCESS);
709 END LOOP;
710 -- CLOSE get_all_tasks_for_project;
711 CLOSE get_str_sub_proj_ass_det; --SMukka Added
712 ELSE
713 x_return_status := FND_API.G_RET_STS_ERROR;
714 PA_UTILS.ADD_Message('PA','PA_STRUCT_DELETE_ERR');
715 END IF;
716 --
717 IF (x_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
718 x_return_status := FND_API.G_RET_STS_ERROR;
719 END IF;
720 --
721 x_msg_count := FND_MSG_PUB.Count_Msg;
722 IF (x_msg_count = 1) THEN
723 pa_interface_utils_pub.get_messages ( p_encoded => FND_API.G_TRUE
724 ,p_msg_index => 1
725 ,p_data => x_msg_data
726 ,p_msg_index_out => l_msg_index_out
727 );
728 ELSE
729 x_msg_data := null;
730 END IF;
731 pa_debug.reset_err_stack;
732 EXCEPTION
733 When OTHERS Then
734 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
735 Raise;
736 END DELETE_RELATIONSHIP;
737
738
739
740 end PA_PROJ_STRUCTURE_PVT;
741