[Home] [Help]
PACKAGE BODY: APPS.PA_USER_ATTR_PUB
Source
1 PACKAGE BODY PA_USER_ATTR_PUB AS
2 /* $Header: PAUATTPB.pls 120.1 2007/10/08 09:11:10 jcgeorge ship $ */
3
4 -- Global constant
5 G_PKG_NAME CONSTANT VARCHAR2(30) := 'PA_USER_ATTR_PUB';
6 G_ATTR_GROUP_TYPE CONSTANT VARCHAR2(30) := 'PA_PROJ_ATTR_GROUP_TYPE';
7
8 -- API name : COPY_USER_ATTRS_DATA
9 -- Type : Public
10 -- Pre-reqs : None.
11 PROCEDURE COPY_USER_ATTRS_DATA
12 ( p_api_version IN NUMBER := 1.0
13 ,p_init_msg_list IN VARCHAR2 := FND_API.G_TRUE
14 ,p_commit IN VARCHAR2 DEFAULT FND_API.G_FALSE
15 ,p_debug_mode IN VARCHAR2 := 'N'
16 ,p_object_id_from IN NUMBER
17 ,p_object_id_to IN NUMBER
18 ,p_object_type IN VARCHAR2
19 ,x_return_status OUT NOCOPY VARCHAR2
20 ,x_errorcode OUT NOCOPY NUMBER
21 ,x_msg_count OUT NOCOPY NUMBER
22 ,x_msg_data OUT NOCOPY VARCHAR2
23 )
24 IS
25 l_api_name CONSTANT VARCHAR(30) := 'Copy_User_Attrs_Data';
26 l_api_version CONSTANT NUMBER := 1.0;
27
28 l_orig_proj_pk_value_pairs EGO_COL_NAME_VALUE_PAIR_ARRAY;
29 l_new_proj_pk_value_pairs EGO_COL_NAME_VALUE_PAIR_ARRAY;
30 l_orig_task_pk_value_pairs EGO_COL_NAME_VALUE_PAIR_ARRAY;
31 l_new_task_pk_value_pairs EGO_COL_NAME_VALUE_PAIR_ARRAY;
32
33 CURSOR get_project_id(c_task_id NUMBER)
34 IS
35 SELECT project_id
36 FROM PA_PROJ_ELEMENTS
37 WHERE proj_element_id = c_task_id;
38
39 CURSOR get_proj_elements(c_project_id NUMBER)
40 IS
41 SELECT proj_element_id
42 FROM PA_PROJ_ELEMENTS
43 WHERE project_id = c_project_id;
44
45 CURSOR get_new_proj_element_id(c_old_proj_element_id NUMBER, c_old_project_id NUMBER, c_new_project_id NUMBER)
46 IS
47 SELECT ppe2.proj_element_id
48 FROM PA_PROJ_ELEMENTS ppe, PA_PROJ_ELEMENTS ppe2
49 WHERE ppe.project_id = c_old_project_id
50 AND ppe.proj_element_id = c_old_proj_element_id
51 AND ppe.element_number = ppe2.element_number
52 AND ppe2.project_id = c_new_project_id;
53
54 CURSOR get_categories(c_project_id NUMBER)
55 IS
56 SELECT DISTINCT limiting_value
57 FROM pa_project_copy_overrides
58 WHERE project_id = c_project_id
59 AND field_name = 'CLASSIFICATION';
60
61 CURSOR check_category_removed(c_category VARCHAR2, c_old_project_id NUMBER, c_new_project_id NUMBER)
62 IS
63 SELECT class_category
64 FROM PA_PROJECT_CLASSES
65 WHERE project_id = c_old_project_id
66 AND class_category = c_category
67 AND class_category NOT IN
68 (SELECT class_category
69 FROM PA_PROJECT_CLASSES
70 where project_id = c_new_project_id);
71
72 CURSOR get_codes(c_category VARCHAR2, c_old_project_id NUMBER, c_new_project_id NUMBER)
73 IS
74 SELECT class_code
75 FROM PA_PROJECT_CLASSES
76 WHERE project_id = c_old_project_id
77 AND class_category = c_category
78 MINUS
79 SELECT class_code
80 FROM PA_PROJECT_CLASSES
81 WHERE project_id = c_new_project_id
82 AND class_category = c_category;
83
84 CURSOR get_category_id(c_category VARCHAR2)
85 IS
86 SELECT class_category_id
87 FROM PA_CLASS_CATEGORIES
88 WHERE class_category = c_category;
89
90 CURSOR get_code_id(c_category VARCHAR2, c_code VARCHAR2)
91 IS
92 SELECT class_code_id
93 FROM PA_CLASS_CODES
94 WHERE class_category = c_category
95 AND class_code = c_code;
96
97
98 l_project_id_from NUMBER;
99 l_project_id_to NUMBER;
100 l_old_proj_element_id NUMBER;
101 l_new_proj_element_id NUMBER;
102 l_category VARCHAR2(30);
103 l_code VARCHAR2(30);
104 l_deleted_category VARCHAR2(30);
105 l_category_id NUMBER;
106 l_code_id NUMBER;
107
108 l_return_status VARCHAR2(1);
109 l_error_msg_code VARCHAR2(250);
110 l_msg_count NUMBER;
111 l_msg_data VARCHAR2(250);
112 l_data VARCHAR2(250);
113 l_msg_index_out NUMBER;
114 l_errorcode NUMBER;
115
116 BEGIN
117 pa_debug.init_err_stack('PA_USER_ATTR_PUB.Copy_User_Attrs_Data');
118
119 if (p_debug_mode = 'Y') then
120 pa_debug.debug('PA_USER_ATTR_PUB.Copy_User_Attrs_Data BEGIN');
121 end if;
122
123 if not FND_API.COMPATIBLE_API_CALL(l_api_version, p_api_version, l_api_name, g_pkg_name) then
124 raise FND_API.G_EXC_UNEXPECTED_ERROR;
125 end if;
126
127 if p_commit = FND_API.G_TRUE then
128 savepoint copy_user_attrs_data;
129 end if;
130
131 if FND_API.TO_BOOLEAN(nvl(p_init_msg_list,FND_API.G_FALSE)) then
132 FND_MSG_PUB.initialize;
133 end if;
134
135 if p_object_type = 'PA_PROJECTS' then
136
137 l_orig_proj_pk_value_pairs := EGO_COL_NAME_VALUE_PAIR_ARRAY(EGO_COL_NAME_VALUE_PAIR_OBJ('PROJECT_ID', p_object_id_from));
138 l_new_proj_pk_value_pairs := EGO_COL_NAME_VALUE_PAIR_ARRAY(EGO_COL_NAME_VALUE_PAIR_OBJ('PROJECT_ID', p_object_id_to));
139
140 l_orig_task_pk_value_pairs := EGO_COL_NAME_VALUE_PAIR_ARRAY(EGO_COL_NAME_VALUE_PAIR_OBJ('PROJ_ELEMENT_ID', NULL));
141 l_new_task_pk_value_pairs := EGO_COL_NAME_VALUE_PAIR_ARRAY(EGO_COL_NAME_VALUE_PAIR_OBJ('PROJ_ELEMENT_ID', NULL));
142
143 EGO_USER_ATTRS_DATA_PUB.Copy_User_Attrs_Data (
144 p_api_version => 1.0
145 ,p_application_id => 275
146 ,p_object_name => 'PA_PROJECTS'
147 ,p_old_pk_col_value_pairs => l_orig_proj_pk_value_pairs
148 ,p_old_dtlevel_col_value_pairs => l_orig_task_pk_value_pairs
149 ,p_new_pk_col_value_pairs => l_new_proj_pk_value_pairs
150 ,p_new_dtlevel_col_value_pairs => l_new_task_pk_value_pairs
151 ,p_commit => FND_API.G_FALSE
152 ,x_return_status => l_return_status
153 ,x_errorcode => l_errorcode
154 ,x_msg_count => l_msg_count
155 ,x_msg_data => l_msg_data );
156
157 if l_return_status <> FND_API.G_RET_STS_SUCCESS then
158 x_msg_count := FND_MSG_PUB.count_msg;
159 if x_msg_count = 1 then
160 pa_interface_utils_pub.get_messages
161 (p_encoded => FND_API.G_TRUE,
162 p_msg_index => 1,
163 p_msg_count => l_msg_count,
164 p_msg_data => l_msg_data,
165 p_data => l_data,
166 p_msg_index_out => l_msg_index_out);
167 x_msg_data := l_data;
168 end if;
169 raise FND_API.G_EXC_ERROR;
170 end if;
171
172 OPEN get_proj_elements(p_object_id_from);
173 LOOP
174 FETCH get_proj_elements INTO l_old_proj_element_id;
175 EXIT WHEN get_proj_elements%NOTFOUND;
176
177 OPEN get_new_proj_element_id(l_old_proj_element_id, p_object_id_from, p_object_id_to);
178 FETCH get_new_proj_element_id INTO l_new_proj_element_id;
179 if get_new_proj_element_id%FOUND THEN
180 l_orig_task_pk_value_pairs := EGO_COL_NAME_VALUE_PAIR_ARRAY(EGO_COL_NAME_VALUE_PAIR_OBJ('PROJ_ELEMENT_ID', l_old_proj_element_id));
181 l_new_task_pk_value_pairs := EGO_COL_NAME_VALUE_PAIR_ARRAY(EGO_COL_NAME_VALUE_PAIR_OBJ('PROJ_ELEMENT_ID', l_new_proj_element_id));
182
183 EGO_USER_ATTRS_DATA_PUB.Copy_User_Attrs_Data (
184 p_api_version => 1.0
185 ,p_application_id => 275
186 ,p_object_name => 'PA_PROJECTS'
187 ,p_old_pk_col_value_pairs => l_orig_proj_pk_value_pairs
188 ,p_old_dtlevel_col_value_pairs => l_orig_task_pk_value_pairs
189 ,p_new_pk_col_value_pairs => l_new_proj_pk_value_pairs
190 ,p_new_dtlevel_col_value_pairs => l_new_task_pk_value_pairs
191 ,p_commit => FND_API.G_FALSE
192 ,x_return_status => l_return_status
193 ,x_errorcode => l_errorcode
194 ,x_msg_count => l_msg_count
195 ,x_msg_data => l_msg_data );
196
197 if l_return_status <> FND_API.G_RET_STS_SUCCESS then
198 x_msg_count := FND_MSG_PUB.count_msg;
199 if x_msg_count = 1 then
200 pa_interface_utils_pub.get_messages
201 (p_encoded => FND_API.G_TRUE,
202 p_msg_index => 1,
203 p_msg_count => l_msg_count,
204 p_msg_data => l_msg_data,
205 p_data => l_data,
206 p_msg_index_out => l_msg_index_out);
207 x_msg_data := l_data;
208 end if;
209 raise FND_API.G_EXC_ERROR;
210 end if;
211
212 end if;
213 CLOSE get_new_proj_element_id;
214
215 END LOOP;
216 CLOSE get_proj_elements;
217
218 -- Get all of the class categories included as quick entry overrides
219 -- For each class category, find out which codes were in the source but are no longer
220 -- in the destination
221 OPEN get_categories(p_object_id_from);
222 LOOP
223 FETCH get_categories INTO l_category;
224 EXIT WHEN get_categories%NOTFOUND;
225
226 OPEN check_category_removed(l_category, p_object_id_from, p_object_id_to);
227 FETCH check_category_removed INTO l_deleted_category;
228 if check_category_removed%FOUND THEN
229 OPEN get_category_id(l_category);
230 FETCH get_category_id INTO l_category_id;
231 CLOSE get_category_id;
232
233 PA_USER_ATTR_PUB.DELETE_USER_ATTRS_DATA (
234 p_validate_only => FND_API.G_FALSE
235 ,p_project_id => p_object_id_to
236 ,p_old_classification_id => l_category_id
237 ,p_classification_type => 'CLASS_CATEGORY'
238 ,x_return_status => l_return_status
239 ,x_msg_count => l_msg_count
240 ,x_msg_data => l_msg_data );
241
242 if l_return_status <> FND_API.G_RET_STS_SUCCESS then
243 x_msg_count := FND_MSG_PUB.count_msg;
244 if x_msg_count = 1 then
245 pa_interface_utils_pub.get_messages
246 (p_encoded => FND_API.G_TRUE,
247 p_msg_index => 1,
248 p_msg_count => l_msg_count,
249 p_msg_data => l_msg_data,
250 p_data => l_data,
251 p_msg_index_out => l_msg_index_out);
252 x_msg_data := l_data;
253 end if;
254 raise FND_API.G_EXC_ERROR;
255 end if;
256 end if;
257 CLOSE check_category_removed;
258
259 OPEN get_codes(l_category, p_object_id_from, p_object_id_to);
260 LOOP
261 FETCH get_codes INTO l_code;
262 EXIT WHEN get_codes%NOTFOUND;
263
264 OPEN get_code_id(l_category, l_code);
265 FETCH get_code_id INTO l_code_id;
266 CLOSE get_code_id;
267
268 PA_USER_ATTR_PUB.DELETE_USER_ATTRS_DATA (
269 p_validate_only => FND_API.G_FALSE
270 ,p_project_id => p_object_id_to
271 ,p_old_classification_id => l_code_id
272 ,p_classification_type => 'CLASS_CODE'
273 ,x_return_status => l_return_status
274 ,x_msg_count => l_msg_count
275 ,x_msg_data => l_msg_data );
276
277 if l_return_status <> FND_API.G_RET_STS_SUCCESS then
278 x_msg_count := FND_MSG_PUB.count_msg;
279 if x_msg_count = 1 then
280 pa_interface_utils_pub.get_messages
281 (p_encoded => FND_API.G_TRUE,
282 p_msg_index => 1,
283 p_msg_count => l_msg_count,
284 p_msg_data => l_msg_data,
285 p_data => l_data,
286 p_msg_index_out => l_msg_index_out);
287 x_msg_data := l_data;
288 end if;
289 raise FND_API.G_EXC_ERROR;
290 end if;
291
292 END LOOP;
293 CLOSE get_codes;
294
295 END LOOP;
296 CLOSE get_categories;
297
298 end if;
299
300 x_return_status := FND_API.G_RET_STS_SUCCESS;
301
302 if p_commit = FND_API.G_TRUE then
303 commit work;
304 end if;
305
306 if (p_debug_mode = 'Y') then
307 pa_debug.debug('PA_USER_ATTR_PUB.Copy_User_Attrs_Data END');
308 end if;
309
310 EXCEPTION
311 when FND_API.G_EXC_ERROR then
312 if p_commit = FND_API.G_TRUE then
313 rollback to copy_user_attrs_data;
314 end if;
315 x_errorcode := l_errorcode;
316 x_return_status := FND_API.G_RET_STS_ERROR;
317 when FND_API.G_EXC_UNEXPECTED_ERROR then
318 if p_commit = FND_API.G_TRUE then
319 rollback to copy_user_attrs_data;
320 end if;
321 x_errorcode := l_errorcode;
322 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
323 fnd_msg_pub.add_exc_msg(p_pkg_name => 'PA_USER_ATTR_PUB',
324 p_procedure_name => 'Copy_User_Attrs_Data',
325 p_error_text => SUBSTRB(SQLERRM,1,240));
326 when OTHERS then
327 if p_commit = FND_API.G_TRUE then
328 rollback to copy_user_attrs_data;
329 end if;
330 x_errorcode := l_errorcode;
331 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
332 fnd_msg_pub.add_exc_msg(p_pkg_name => 'PA_USER_ATTR_PUB',
333 p_procedure_name => 'Copy_User_Attrs_Data',
334 p_error_text => SUBSTRB(SQLERRM,1,240));
335 raise;
336 END COPY_USER_ATTRS_DATA;
337
338
339 -- API name : DELETE_USER_ATTRS_DATA
340 -- Type : Public
341 -- Pre-reqs : None.
342
343 PROCEDURE DELETE_USER_ATTRS_DATA
344 ( p_api_version IN NUMBER := 1.0
345 ,p_init_msg_list IN VARCHAR2 := FND_API.G_TRUE
346 ,p_commit IN VARCHAR2 DEFAULT FND_API.G_FALSE
347 ,p_validate_only IN VARCHAR2 := FND_API.G_TRUE
348 ,p_validation_level IN NUMBER := FND_API.G_VALID_LEVEL_FULL
349 ,p_calling_module IN VARCHAR2 := 'SELF_SERVICE'
350 ,p_debug_mode IN VARCHAR2 := 'N'
351 ,p_project_id IN NUMBER
352 ,p_proj_element_id IN NUMBER DEFAULT NULL
353 ,p_old_classification_id IN NUMBER
354 ,p_new_classification_id IN NUMBER DEFAULT NULL
355 ,p_classification_type IN VARCHAR2
356 ,x_return_status OUT NOCOPY VARCHAR2
357 ,x_msg_count OUT NOCOPY NUMBER
358 ,x_msg_data OUT NOCOPY VARCHAR2
359 )
360 IS
361 l_api_name CONSTANT VARCHAR(30) := 'Delete_User_Attrs_Data';
362 l_api_version CONSTANT NUMBER := 1.0;
363
364 l_return_status VARCHAR2(1);
365 l_error_msg_code VARCHAR2(250);
366 l_msg_count NUMBER;
367 l_msg_data VARCHAR2(250);
368 l_data VARCHAR2(250);
369 l_msg_index_out NUMBER;
370
371 BEGIN
372 pa_debug.init_err_stack('PA_USER_ATTR_PUB.Delete_User_Attrs_Data');
373
374 if (p_debug_mode = 'Y') then
375 pa_debug.debug('PA_USER_ATTR_PUB.Delete_User_Attrs_Data BEGIN');
376 end if;
377
378 if not FND_API.COMPATIBLE_API_CALL(l_api_version, p_api_version, l_api_name, g_pkg_name) then
379 raise FND_API.G_EXC_UNEXPECTED_ERROR;
380 end if;
381
382 if p_commit = FND_API.G_TRUE then
383 savepoint delete_user_attrs_data;
384 end if;
385
386 if FND_API.TO_BOOLEAN(nvl(p_init_msg_list,FND_API.G_FALSE)) then
387 FND_MSG_PUB.initialize;
388 end if;
389
390 PA_USER_ATTR_PVT.DELETE_USER_ATTRS_DATA (
391 p_commit => FND_API.G_FALSE
392 ,p_validate_only => p_validate_only
393 ,p_validation_level => p_validation_level
394 ,p_calling_module => p_calling_module
395 ,p_debug_mode => p_debug_mode
396 ,p_project_id => p_project_id
397 ,p_proj_element_id => p_proj_element_id
398 ,p_old_classification_id => p_old_classification_id
399 ,p_new_classification_id => p_new_classification_id
400 ,p_classification_type => p_classification_type
401 ,x_return_status => l_return_status
402 ,x_msg_count => l_msg_count
403 ,x_msg_data => l_msg_data );
404
405 if l_return_status <> FND_API.G_RET_STS_SUCCESS then
406 x_msg_count := FND_MSG_PUB.count_msg;
407 if x_msg_count = 1 then
408 pa_interface_utils_pub.get_messages
409 (p_encoded => FND_API.G_TRUE,
410 p_msg_index => 1,
411 p_msg_count => l_msg_count,
412 p_msg_data => l_msg_data,
413 p_data => l_data,
414 p_msg_index_out => l_msg_index_out);
415 x_msg_data := l_data;
416 end if;
417 raise FND_API.G_EXC_ERROR;
418 end if;
419
420 x_return_status := FND_API.G_RET_STS_SUCCESS;
421
422 if p_commit = FND_API.G_TRUE then
423 commit work;
424 end if;
425
426 if (p_debug_mode = 'Y') then
427 pa_debug.debug('PA_USER_ATTR_PUB.Delete_User_Attrs_Data END');
428 end if;
429
430 EXCEPTION
431 when FND_API.G_EXC_ERROR then
432 if p_commit = FND_API.G_TRUE then
433 rollback to delete_user_attrs_data;
434 end if;
435 x_return_status := FND_API.G_RET_STS_ERROR;
436 when FND_API.G_EXC_UNEXPECTED_ERROR then
437 if p_commit = FND_API.G_TRUE then
438 rollback to delete_user_attrs_data;
439 end if;
440 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
441 fnd_msg_pub.add_exc_msg(p_pkg_name => 'PA_USER_ATTR_PUB',
442 p_procedure_name => 'Delete_User_Attrs_Data',
443 p_error_text => SUBSTRB(SQLERRM,1,240));
444 when OTHERS then
445 if p_commit = FND_API.G_TRUE then
446 rollback to delete_user_attrs_data;
447 end if;
448 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
449 fnd_msg_pub.add_exc_msg(p_pkg_name => 'PA_USER_ATTR_PUB',
450 p_procedure_name => 'Delete_User_Attrs_Data',
451 p_error_text => SUBSTRB(SQLERRM,1,240));
452 raise;
453 END DELETE_USER_ATTRS_DATA;
454
455
456
457 -- API name : CHECK_DELETE_ASSOC_OK
458 -- Type : Public
459 -- Pre-reqs : None.
460
461 PROCEDURE CHECK_DELETE_ASSOC_OK
462 ( p_api_version IN NUMBER := 1.0
463 ,p_association_id IN NUMBER
464 ,p_classification_code IN VARCHAR2
465 ,p_data_level IN VARCHAR2
466 ,p_attr_group_id IN NUMBER
467 ,p_application_id IN NUMBER
468 ,p_attr_group_type IN VARCHAR2
469 ,p_attr_group_name IN VARCHAR2
470 ,p_enabled_code IN VARCHAR2
471 ,x_ok_to_delete OUT NOCOPY VARCHAR2
472 ,x_return_status OUT NOCOPY VARCHAR2
473 ,x_errorcode OUT NOCOPY NUMBER
474 ,x_msg_count OUT NOCOPY NUMBER
475 ,x_msg_data OUT NOCOPY VARCHAR2
476 )
477 IS
478 l_api_name CONSTANT VARCHAR(30) := 'Check_Delete_Assoc_Ok';
479 l_api_version CONSTANT NUMBER := 1.0;
480
481 l_ok_to_delete VARCHAR2(250);
482 l_return_status VARCHAR2(1);
483 l_errorcode NUMBER;
484 l_msg_count NUMBER;
485 l_msg_data VARCHAR2(250);
486 l_data VARCHAR2(250);
487 l_msg_index_out NUMBER;
488
489 l_dummy VARCHAR2(1);
490 l_assoc_date DATE;
491 l_max_ext_date DATE;
492
493 CURSOR exists_in_ext_tbl
494 IS
495 SELECT 'Y'
496 FROM PA_PROJECTS_ERP_EXT_B
497 WHERE attr_group_id = p_attr_group_id;
498
499 CURSOR get_assoc_date
500 IS
501 SELECT creation_date
502 FROM EGO_OBJ_AG_ASSOCS_B
503 WHERE association_id = p_association_id;
504
505 CURSOR get_max_ext_date
506 IS
507 SELECT max(creation_date)
508 FROM PA_PROJECTS_ERP_EXT_B
509 WHERE attr_group_id = p_attr_group_id;
510
511 BEGIN
512
513 if not FND_API.COMPATIBLE_API_CALL(l_api_version, p_api_version, l_api_name, g_pkg_name) then
514 raise FND_API.G_EXC_UNEXPECTED_ERROR;
515 end if;
516
517 OPEN exists_in_ext_tbl;
518 FETCH exists_in_ext_tbl INTO l_dummy;
519
520 if exists_in_ext_tbl%NOTFOUND then
521 x_ok_to_delete := FND_API.G_TRUE;
522 else
523 OPEN get_assoc_date;
524 FETCH get_assoc_date INTO l_assoc_date;
525 CLOSE get_assoc_date;
526
527 OPEN get_max_ext_date;
528 FETCH get_max_ext_date INTO l_max_ext_date;
529 CLOSE get_max_ext_date;
530
531 if l_assoc_date > l_max_ext_date then
532 x_ok_to_delete := FND_API.G_TRUE;
533 else
534 x_ok_to_delete := FND_API.G_FALSE;
535 PA_UTILS.Add_Message( p_app_short_name => 'PA'
536 ,p_msg_name => 'PA_EXT_CANT_DEL_ASSOC');
537
538 end if;
539 end if;
540
541 l_msg_count := FND_MSG_PUB.count_msg;
542 if l_msg_count > 0 then
543 x_msg_count := l_msg_count;
544 if x_msg_count = 1 then
545 pa_interface_utils_pub.get_messages
546 (p_encoded => FND_API.G_TRUE,
547 p_msg_index => 1,
548 p_msg_count => l_msg_count,
549 p_msg_data => l_msg_data,
550 p_data => l_data,
551 p_msg_index_out => l_msg_index_out);
552 x_msg_data := l_data;
553 end if;
554 x_return_status := FND_API.G_RET_STS_ERROR;
555 else
556 x_return_status := FND_API.G_RET_STS_SUCCESS;
557 end if;
558
559 EXCEPTION
560 when OTHERS then
561 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
562 fnd_msg_pub.add_exc_msg(p_pkg_name => 'PA_USER_ATTR_PUB',
563 p_procedure_name => 'Check_Delete_Assoc_Ok',
564 p_error_text => SUBSTRB(SQLERRM,1,240));
565 x_ok_to_delete := FND_API.G_FALSE;
566 raise;
567 END CHECK_DELETE_ASSOC_OK;
568
569
570
571 -- API name : DELETE_ALL_USER_ATTRS_DATA
572 -- Type : Public
573 -- Pre-reqs : None.
574
575 PROCEDURE DELETE_ALL_USER_ATTRS_DATA
576 ( p_api_version IN NUMBER := 1.0
577 ,p_init_msg_list IN VARCHAR2 := FND_API.G_TRUE
578 ,p_commit IN VARCHAR2 DEFAULT FND_API.G_FALSE
579 ,p_validate_only IN VARCHAR2 := FND_API.G_TRUE
580 ,p_validation_level IN NUMBER := FND_API.G_VALID_LEVEL_FULL
581 ,p_calling_module IN VARCHAR2 := 'SELF_SERVICE'
582 ,p_debug_mode IN VARCHAR2 := 'N'
583 ,p_project_id IN NUMBER
584 ,p_proj_element_id IN NUMBER DEFAULT NULL
585 ,x_return_status OUT NOCOPY VARCHAR2
586 ,x_msg_count OUT NOCOPY NUMBER
587 ,x_msg_data OUT NOCOPY VARCHAR2
588 )
589 IS
590 l_api_name CONSTANT VARCHAR(30) := 'Delete_All_User_Attrs_Data';
591 l_api_version CONSTANT NUMBER := 1.0;
592
593 l_return_status VARCHAR2(1);
594 l_errorcode NUMBER;
595 l_msg_count NUMBER;
596 l_msg_data VARCHAR2(250);
597 l_data VARCHAR2(250);
598 l_msg_index_out NUMBER;
599
600 BEGIN
601 pa_debug.init_err_stack('PA_USER_ATTR_PUB.Delete_All_User_Attrs_Data');
602
603 if (p_debug_mode = 'Y') then
604 pa_debug.debug('PA_USER_ATTR_PUB.Delete_All_User_Attrs_Data BEGIN');
605 end if;
606
607 if not FND_API.COMPATIBLE_API_CALL(l_api_version, p_api_version, l_api_name, g_pkg_name) then
608 raise FND_API.G_EXC_UNEXPECTED_ERROR;
609 end if;
610
611 if p_commit = FND_API.G_TRUE then
612 savepoint delete_all_user_attrs_data;
613 end if;
614
615 if FND_API.TO_BOOLEAN(nvl(p_init_msg_list,FND_API.G_FALSE)) then
616 FND_MSG_PUB.initialize;
617 end if;
618
619 PA_USER_ATTR_PVT.DELETE_ALL_USER_ATTRS_DATA (
620 p_commit => FND_API.G_FALSE
621 ,p_validate_only => p_validate_only
622 ,p_validation_level => p_validation_level
623 ,p_calling_module => p_calling_module
624 ,p_debug_mode => p_debug_mode
625 ,p_project_id => p_project_id
626 ,p_proj_element_id => p_proj_element_id
627 ,x_return_status => l_return_status
628 ,x_msg_count => l_msg_count
629 ,x_msg_data => l_msg_data );
630
631 if l_return_status <> FND_API.G_RET_STS_SUCCESS then
632 x_msg_count := FND_MSG_PUB.count_msg;
633 if x_msg_count = 1 then
634 pa_interface_utils_pub.get_messages
635 (p_encoded => FND_API.G_TRUE,
636 p_msg_index => 1,
637 p_msg_count => l_msg_count,
638 p_msg_data => l_msg_data,
639 p_data => l_data,
640 p_msg_index_out => l_msg_index_out);
641 x_msg_data := l_data;
642 end if;
643 raise FND_API.G_EXC_ERROR;
644 end if;
645
646 if p_commit = FND_API.G_TRUE then
647 commit work;
648 end if;
649
650 x_return_status := FND_API.G_RET_STS_SUCCESS;
651
652 if (p_debug_mode = 'Y') then
653 pa_debug.debug('PA_USER_ATTR_PUB.Delete_All_User_Attrs_Data END');
654 end if;
655
656 EXCEPTION
657 when FND_API.G_EXC_ERROR then
658 if p_commit = FND_API.G_TRUE then
659 rollback to delete_all_user_attrs_data;
660 end if;
661 x_return_status := FND_API.G_RET_STS_ERROR;
662 when FND_API.G_EXC_UNEXPECTED_ERROR then
663 if p_commit = FND_API.G_TRUE then
664 rollback to delete_all_user_attrs_data;
665 end if;
666 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
667 fnd_msg_pub.add_exc_msg(p_pkg_name => 'PA_USER_ATTR_PUB',
668 p_procedure_name => 'Delete_All_User_Attrs_Data',
669 p_error_text => SUBSTRB(SQLERRM,1,240));
670 when OTHERS then
671 if p_commit = FND_API.G_TRUE then
672 rollback to delete_all_user_attrs_data;
673 end if;
674 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
675 fnd_msg_pub.add_exc_msg(p_pkg_name => 'PA_USER_ATTR_PUB',
676 p_procedure_name => 'Delete_All_User_Attrs_Data',
677 p_error_text => SUBSTRB(SQLERRM,1,240));
678 raise;
679 END DELETE_ALL_USER_ATTRS_DATA;
680
681
682 -- API name : Process_User_Attrs_Data
683 -- Type : Public
684 -- Pre-reqs : None.
685 -- Description : This API is a wrapper for the EGO API
686 -- EGO_USER_ATTRS_DATA_PUB.Process_User_Attr_Data
687 -- It performs the following operations:
688 -- 1. transpose data from the PA data structure
689 -- to a format that is understood by the EGO API
690 -- 2. Call the EGO api and return the results
691 PROCEDURE Process_User_Attrs_Data
692 ( p_api_version IN NUMBER := 1.0
693 , p_object_name IN VARCHAR2 := 'PA_PROJECTS'
694 , p_ext_attr_data_table IN PA_PROJECT_PUB.PA_EXT_ATTR_TABLE_TYPE
695 , p_project_id IN NUMBER := 0
696 , p_structure_type IN VARCHAR2 := 'FINANCIAL'
697 , p_entity_id IN NUMBER := NULL
698 , p_entity_index IN NUMBER := NULL
699 , p_entity_code IN VARCHAR2 := NULL
700 , p_debug_mode IN VARCHAR2 := 'N'
701 , p_debug_level IN NUMBER := 0
702 , p_init_error_handler IN VARCHAR2 := FND_API.G_FALSE
703 , p_write_to_concurrent_log IN VARCHAR2 := FND_API.G_FALSE
704 , p_init_msg_list IN VARCHAR2 := FND_API.G_FALSE
705 , p_log_errors IN VARCHAR2 := FND_API.G_FALSE
706 , p_commit IN VARCHAR2 := FND_API.G_FALSE
707 , x_failed_row_id_list OUT NOCOPY VARCHAR2
708 , x_return_status OUT NOCOPY VARCHAR2
709 , x_errorcode OUT NOCOPY NUMBER
710 , x_msg_count OUT NOCOPY NUMBER
711 , x_msg_data OUT NOCOPY VARCHAR2)
712 IS
713
714 l_api_name CONSTANT VARCHAR(30) := 'Process_User_Attrs_Data';
715 l_api_version CONSTANT NUMBER := 1.0;
716 i NUMBER;
717 attr_rec PA_PROJECT_PUB.PA_EXT_ATTR_ROW_TYPE;
718 p_pk_column_name_value_pairs EGO_COL_NAME_VALUE_PAIR_ARRAY;
719 p_class_code_name_value_pairs EGO_COL_NAME_VALUE_PAIR_ARRAY;
720 p_attributes_row_table EGO_USER_ATTR_ROW_TABLE;
721 p_attributes_data_table EGO_USER_ATTR_DATA_TABLE;
722 l_prev_loop_row_identifier NUMBER;
723 l_at_start_of_row BOOLEAN;
724
725 l_failed_row_id_list VARCHAR2(32767);
726 l_return_status VARCHAR2(1);
727 l_errorcode NUMBER;
728 l_msg_count NUMBER;
729 l_msg_data VARCHAR2(1000);
730 l_data VARCHAR2(250);
731 l_msg_index_out NUMBER;
732 l_proj_elem_id NUMBER;
733
734 BEGIN
735 pa_debug.init_err_stack('PA_USER_ATTR_PUB.Process_User_Attrs_Data');
736
737 SAVEPOINT PROCESS_USER_ATTRS_DATA_PUB;
738
739 if (p_debug_mode = 'Y') then
740 pa_debug.debug('PA_USER_ATTR_PUB.Process_User_Attrs_Data BEGIN');
741 end if;
742
743 if not FND_API.COMPATIBLE_API_CALL(l_api_version, p_api_version, l_api_name, g_pkg_name) then
744 raise FND_API.G_EXC_UNEXPECTED_ERROR;
745 end if;
746
747 i := p_ext_attr_data_table.first;
748
749 if (p_debug_mode = 'Y') then
750 pa_debug.debug('Project Id = ' || to_char(p_project_id));
751 end if;
752
753 ------------------------------------------------------------------
754 -- Initialization phase: --
755 -- 1. Build arrays for the Primary Key columns and the --
756 -- Classification Code columns --
757 -- 2. We also build Attr Row and Attr Data tables --
758 ------------------------------------------------------------------
759 p_pk_column_name_value_pairs := EGO_COL_NAME_VALUE_PAIR_ARRAY(
760 EGO_COL_NAME_VALUE_PAIR_OBJ('PROJECT_ID', p_project_id)
761 );
762
763 p_attributes_row_table := EGO_USER_ATTR_ROW_TABLE();
764 p_attributes_data_table := EGO_USER_ATTR_DATA_TABLE();
765
766
767 ------------------------------------------------------------------
768 -- Loop through pl/sql table to build data structures which --
769 -- will be passed in as parameters to the PLM API --
770 ------------------------------------------------------------------
771 WHILE i IS NOT NULL LOOP
772 attr_rec := p_ext_attr_data_table(i);
773
774 -----------------------------------------------------
775 -- Figure out whether we're now starting a new row --
776 -----------------------------------------------------
777 l_at_start_of_row := (l_prev_loop_row_identifier IS NULL OR
778 l_prev_loop_row_identifier <> attr_rec.ROW_IDENTIFIER);
779
780 ---------------------------------------------------
781 -- Build an Attr Row Object for each logical row --
782 ---------------------------------------------------
783 IF (l_at_start_of_row) THEN
784
785 --------------------------------------------
786 -- Resolve PROJ_ELEMENT_ID, if necessary --
787 --------------------------------------------
788 l_proj_elem_id := NULL;
789 IF (attr_rec.PROJ_ELEMENT_ID IS NULL) THEN
790 IF (attr_rec.PROJ_ELEMENT_REFERENCE IS NOT NULL) THEN
791 PA_PROJECT_PVT.Convert_pm_taskref_to_id_all
792 ( p_pa_project_id => p_project_id
793 , p_structure_type => p_structure_type
794 , p_pm_task_reference => attr_rec.PROJ_ELEMENT_REFERENCE
795 , p_out_task_id => l_proj_elem_id
796 , p_return_status => l_return_status );
797
798 IF (l_return_status = FND_API.G_RET_STS_UNEXP_ERROR)
799 THEN
800 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
801 ELSIF (l_return_status = FND_API.G_RET_STS_ERROR)
802 THEN
803 RAISE FND_API.G_EXC_ERROR;
804 END IF;
805 END IF;
806 ELSE
807 l_proj_elem_id := attr_rec.PROJ_ELEMENT_ID;
808 END IF;
809
810 p_attributes_row_table.EXTEND();
811 p_attributes_row_table(p_attributes_row_table.LAST) := EGO_USER_ATTR_ROW_OBJ(
812 attr_rec.ROW_IDENTIFIER
813 ,attr_rec.ATTR_GROUP_ID
814 ,275
815 ,G_ATTR_GROUP_TYPE
816 ,attr_rec.ATTR_GROUP_INT_NAME
817 ,null
818 ,l_proj_elem_id
819 ,null
820 ,null
821 ,null
822 ,null
823 ,attr_rec.TRANSACTION_TYPE
824 );
825
826 IF (p_debug_mode = 'Y') then
827 pa_debug.debug('Build Row Object:');
828 pa_debug.debug('Row Identifier =' || attr_rec.ROW_IDENTIFIER);
829 pa_debug.debug('ATTR_GROUP_ID =' || attr_rec.ATTR_GROUP_ID);
830 pa_debug.debug('ATTR_GROUP_INT_NAME =' || attr_rec.ATTR_GROUP_INT_NAME);
831 pa_debug.debug('PROJ_ELEMENT_ID =' || l_proj_elem_id);
832 pa_debug.debug('TRANSACTION_TYPE =' || attr_rec.TRANSACTION_TYPE);
833 END IF;
834 END IF;
835
836 ---------------------------------------------------------------
837 -- Add an Attr Data object to the Attr Data table every time --
838 ---------------------------------------------------------------
839 p_attributes_data_table.EXTEND();
840 p_attributes_data_table(p_attributes_data_table.LAST) := EGO_USER_ATTR_DATA_OBJ(
841 attr_rec.ROW_IDENTIFIER
842 ,attr_rec.ATTR_INT_NAME
843 ,attr_rec.ATTR_VALUE_STR
844 ,attr_rec.ATTR_VALUE_NUM
845 ,attr_rec.ATTR_VALUE_DATE
846 ,attr_rec.ATTR_DISP_VALUE
847 ,null -- ATTR_UNIT_OF_MEASURE
848 ,attr_rec.USER_ROW_IDENTIFIER
849 );
850 IF (p_debug_mode = 'Y') then
851 pa_debug.debug('Build Data Object:');
852 pa_debug.debug('Row Identifier =' || attr_rec.ROW_IDENTIFIER);
853 pa_debug.debug('ATTR_INT_NAME =' || attr_rec.ATTR_INT_NAME);
854 pa_debug.debug('ATTR_VALUE_STR =' || attr_rec.ATTR_VALUE_STR);
855 pa_debug.debug('ATTR_VALUE_NUM =' || attr_rec.ATTR_VALUE_NUM);
856 pa_debug.debug('ATTR_VALUE_DATE =' || attr_rec.ATTR_VALUE_DATE);
857 pa_debug.debug('ATTR_DISP_VALUE =' || attr_rec.ATTR_DISP_VALUE);
858 END IF;
859 ------------------------------------------------------
860 -- Update these variables for the next loop through --
861 ------------------------------------------------------
862 l_prev_loop_row_identifier := attr_rec.ROW_IDENTIFIER;
863 i := p_ext_attr_data_table.next(i);
864
865 END LOOP;
866
867 -------------------------------------------------------------------------
868 -- Since we are done looping and constructing the pl/sql tables,we are --
869 -- ready to process the data we've collected for this project instance --
870 -------------------------------------------------------------------------
871 if (p_debug_mode = 'Y') then
872 pa_debug.debug('>> EGO_USER_ATTRS_DATA_PUB.Process_User_Attrs_Data');
873 end if;
874 EGO_USER_ATTRS_DATA_PUB.Process_User_Attrs_Data
875 (
876 p_api_version => 1.0
877 ,p_object_name => p_object_name
878 ,p_attributes_row_table => p_attributes_row_table
879 ,p_attributes_data_table => p_attributes_data_table
880 ,p_pk_column_name_value_pairs => p_pk_column_name_value_pairs
881 ,p_add_errors_to_fnd_stack => FND_API.G_TRUE
882 ,p_class_code_name_value_pairs => null
883 ,p_entity_id => p_entity_id
884 ,p_entity_index => p_entity_index
885 ,p_entity_code => p_entity_code
886 ,p_debug_level => p_debug_level
887 ,p_commit => p_commit
888 ,p_log_errors => FND_API.G_TRUE
889 ,x_failed_row_id_list => l_failed_row_id_list
890 ,x_return_status => l_return_status
891 ,x_errorcode => l_errorcode
892 ,x_msg_count => l_msg_count
893 ,x_msg_data => l_msg_data
894 );
895 if (p_debug_mode = 'Y') then
896 pa_debug.debug('>> EGO_USER_ATTRS_DATA_PUB.Process_User_Attrs_Data');
897 pa_debug.debug('Return Status = ' || l_return_status);
898 pa_debug.debug('Message Count = ' || l_msg_count);
899 end if;
900
901 -- process error status/messages
902 x_failed_row_id_list := l_failed_row_id_list;
903 x_return_status := l_return_status;
904 x_errorcode := l_errorcode;
905
906 if l_return_status <> FND_API.G_RET_STS_SUCCESS then
907 x_msg_count := FND_MSG_PUB.count_msg;
908 if x_msg_count = 1 then
909 pa_interface_utils_pub.get_messages
910 (p_encoded => FND_API.G_TRUE,
911 p_msg_index => 1,
912 p_msg_count => l_msg_count,
913 p_msg_data => l_msg_data,
914 p_data => l_data,
915 p_msg_index_out => l_msg_index_out);
916 x_msg_data := l_data;
917 end if;
918 raise FND_API.G_EXC_ERROR;
919 end if;
920
921 if p_commit = FND_API.G_TRUE then
922 commit work;
923 end if;
924
925 x_return_status := FND_API.G_RET_STS_SUCCESS;
926
927 EXCEPTION
928 when FND_API.G_EXC_ERROR then
929 if p_commit = FND_API.G_TRUE then
930 rollback to PROCESS_USER_ATTRS_DATA_PUB;
931 end if;
932 x_return_status := FND_API.G_RET_STS_ERROR;
933 when FND_API.G_EXC_UNEXPECTED_ERROR then
934 if p_commit = FND_API.G_TRUE then
935 rollback to PROCESS_USER_ATTRS_DATA_PUB;
936 end if;
937 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
938 fnd_msg_pub.add_exc_msg(p_pkg_name => 'PA_USER_ATTR_PUB',
939 p_procedure_name => 'PROCESS_USER_ATTRS_DATA',
940 p_error_text => SUBSTRB(SQLERRM,1,240));
941 when OTHERS then
942 if p_commit = FND_API.G_TRUE then
943 rollback to PROCESS_USER_ATTRS_DATA_PUB;
944 end if;
945 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
946 fnd_msg_pub.add_exc_msg(p_pkg_name => 'PA_USER_ATTR_PUB',
947 p_procedure_name => 'PROCESS_USER_ATTRS_DATA',
948 p_error_text => SUBSTRB(SQLERRM,1,240));
949 raise;
950
951 END Process_User_Attrs_Data;
952
953
954 -- API name : Check_Class_Assoc_Exists
955 -- Type : Public
956 -- Pre-reqs : None.
957
958 PROCEDURE CHECK_CLASS_ASSOC_EXISTS
959 ( P_ROW_ID IN VARCHAR2
960 ,P_NEW_CLASS_CATEGORY IN VARCHAR2 DEFAULT NULL
961 ,P_NEW_CLASS_CODE IN VARCHAR2 DEFAULT NULL
962 ,P_MODE IN VARCHAR2
963 ,X_ASSOC_EXISTS OUT NOCOPY VARCHAR2
964 )
965 IS
966 CURSOR C1
967 IS
968 SELECT class_category, class_code
969 FROM PA_PROJECT_CLASSES
970 WHERE rowid = p_row_id;
971
972 l_class_category VARCHAR2(30);
973 l_class_category_id NUMBER;
974 l_new_class_category_id NUMBER;
975 l_class_code VARCHAR2(30);
976 l_class_code_id NUMBER;
977 l_new_class_code_id NUMBER;
978 l_check_cat_assoc VARCHAR2(1);
979 l_check_new_cat_assoc VARCHAR2(1);
980 l_check_code_assoc VARCHAR2(1);
981 l_check_new_code_assoc VARCHAR2(1);
982
983 CURSOR get_class_category_id(c_class_category VARCHAR2)
984 IS
985 SELECT class_category_id
986 FROM PA_CLASS_CATEGORIES
987 WHERE class_category = c_class_category;
988
989 CURSOR get_class_code_id(c_class_category VARCHAR2, c_class_code VARCHAR2)
990 IS
991 SELECT class_code_id
992 FROM PA_CLASS_CODES
993 WHERE class_category = c_class_category
994 AND class_code = c_class_code;
995
996 CURSOR check_cat_assoc(c_class_category_id NUMBER)
997 IS
998 SELECT 'Y'
999 FROM DUAL
1000 WHERE EXISTS
1001 (SELECT classification_code
1002 FROM EGO_OBJ_AG_ASSOCS_B assocs,
1003 FND_OBJECTS obj
1004 WHERE assocs.classification_code = 'CLASS_CATEGORY:'||to_char(c_class_category_id)
1005 AND assocs.object_id = obj.object_id
1006 AND obj.obj_name = 'PA_PROJECTS');
1007
1008 CURSOR check_code_assoc(c_class_code_id NUMBER)
1009 IS
1010 SELECT 'Y'
1011 FROM DUAL
1012 WHERE EXISTS
1013 (SELECT classification_code
1014 FROM EGO_OBJ_AG_ASSOCS_B assocs,
1015 FND_OBJECTS obj
1016 WHERE assocs.classification_code = 'CLASS_CODE:'||to_char(c_class_code_id)
1017 AND assocs.object_id = obj.object_id
1018 AND obj.obj_name = 'PA_PROJECTS');
1019
1020 BEGIN
1021
1022 x_assoc_exists := 'N';
1023
1024 if p_mode = 'DELETE' then
1025 OPEN C1;
1026 FETCH C1 INTO l_class_category, l_class_code;
1027 CLOSE C1;
1028
1029 OPEN get_class_category_id(l_class_category);
1030 FETCH get_class_category_id INTO l_class_category_id;
1031 CLOSE get_class_category_id;
1032
1033 OPEN get_class_code_id(l_class_category, l_class_code);
1034 FETCH get_class_code_id INTO l_class_code_id;
1035 CLOSE get_class_code_id;
1036
1037 OPEN check_cat_assoc(l_class_category_id);
1038 FETCH check_cat_assoc INTO l_check_cat_assoc;
1039 if check_cat_assoc%FOUND then
1040 x_assoc_exists := 'Y';
1041 CLOSE check_cat_assoc;
1042 return;
1043 end if;
1044
1045 OPEN check_code_assoc(l_class_code_id);
1046 FETCH check_code_assoc INTO l_check_code_assoc;
1047 if check_code_assoc%FOUND then
1048 x_assoc_exists := 'Y';
1049 CLOSE check_code_assoc;
1050 return;
1051 end if;
1052
1053 elsif p_mode = 'UPDATE' then
1054 OPEN C1;
1055 FETCH C1 INTO l_class_category, l_class_code;
1056 CLOSE C1;
1057
1058 if (l_class_category = p_new_class_category) AND (l_class_code = p_new_class_code) then
1059 return;
1060 else
1061 OPEN get_class_category_id(l_class_category);
1062 FETCH get_class_category_id INTO l_class_category_id;
1063 CLOSE get_class_category_id;
1064
1065 OPEN get_class_category_id(p_new_class_category);
1066 FETCH get_class_category_id INTO l_new_class_category_id;
1067 CLOSE get_class_category_id;
1068
1069 OPEN get_class_code_id(l_class_category, l_class_code);
1070 FETCH get_class_code_id INTO l_class_code_id;
1071 CLOSE get_class_code_id;
1072
1073 OPEN get_class_code_id(p_new_class_category, p_new_class_code);
1074 FETCH get_class_code_id INTO l_new_class_code_id;
1075 CLOSE get_class_code_id;
1076
1077 OPEN check_cat_assoc(l_class_category_id);
1078 FETCH check_cat_assoc INTO l_check_cat_assoc;
1079 if check_cat_assoc%FOUND then
1080 x_assoc_exists := 'Y';
1081 CLOSE check_cat_assoc;
1082 return;
1083 end if;
1084 CLOSE check_cat_assoc;
1085
1086 OPEN check_cat_assoc(l_new_class_category_id);
1087 FETCH check_cat_assoc INTO l_check_new_cat_assoc;
1088 if check_cat_assoc%FOUND then
1089 x_assoc_exists := 'Y';
1090 CLOSE check_cat_assoc;
1091 return;
1092 end if;
1093 CLOSE check_cat_assoc;
1094
1095 OPEN check_code_assoc(l_class_code_id);
1096 FETCH check_code_assoc INTO l_check_code_assoc;
1097 if check_code_assoc%FOUND then
1098 x_assoc_exists := 'Y';
1099 CLOSE check_code_assoc;
1100 return;
1101 end if;
1102 CLOSE check_code_assoc;
1103
1104 OPEN check_code_assoc(l_new_class_code_id);
1105 FETCH check_code_assoc INTO l_check_new_code_assoc;
1106 if check_code_assoc%FOUND then
1107 x_assoc_exists := 'Y';
1108 CLOSE check_code_assoc;
1109 return;
1110 end if;
1111 CLOSE check_code_assoc;
1112 end if;
1113
1114 end if;
1115
1116 EXCEPTION
1117 WHEN OTHERS THEN
1118 x_assoc_exists := 'N';
1119
1120 END CHECK_CLASS_ASSOC_EXISTS;
1121
1122
1123 -- API name : Check_PT_Assoc_Exists
1124 -- Type : Public
1125 -- Pre-reqs : None.
1126
1127 PROCEDURE CHECK_PT_ASSOC_EXISTS
1128 ( P_PROJECT_ID IN NUMBER
1129 ,P_NEW_PROJECT_TYPE IN VARCHAR2
1130 ,X_ASSOC_EXISTS OUT NOCOPY VARCHAR2
1131 )
1132 IS
1133
1134 CURSOR check_pt_assoc(c_project_type_id NUMBER)
1135 IS
1136 SELECT 'Y'
1137 FROM DUAL
1138 WHERE EXISTS
1139 (SELECT classification_code
1140 FROM EGO_OBJ_AG_ASSOCS_B assocs,
1141 FND_OBJECTS obj
1142 WHERE assocs.classification_code = 'PROJECT_TYPE:'||to_char(c_project_type_id)
1143 AND assocs.object_id = obj.object_id
1144 AND obj.obj_name = 'PA_PROJECTS');
1145
1146 CURSOR get_old_project_type_id
1147 IS
1148 SELECT PTT.project_type_id
1149 FROM pa_project_types PTT, pa_projects_all PPA
1150 WHERE PPA.project_id = p_project_id
1151 AND PPA.project_type = PTT.project_type;
1152
1153 CURSOR get_new_project_type_id
1154 IS
1155 SELECT project_type_id
1156 FROM pa_project_types
1157 WHERE project_type = p_new_project_type;
1158
1159
1160 l_old_project_type_id NUMBER;
1161 l_new_project_type_id NUMBER;
1162 l_check_old_pt_assoc VARCHAR2(1);
1163 l_check_new_pt_assoc VARCHAR2(1);
1164
1165 BEGIN
1166 x_assoc_exists := 'N';
1167
1168 OPEN get_old_project_type_id;
1169 FETCH get_old_project_type_id INTO l_old_project_type_id;
1170 CLOSE get_old_project_type_id;
1171
1172 OPEN get_new_project_type_id;
1173 FETCH get_new_project_type_id INTO l_new_project_type_id;
1174 CLOSE get_new_project_type_id;
1175
1176 if l_old_project_type_id = l_new_project_type_id then
1177 return;
1178 else
1179 OPEN check_pt_assoc(l_old_project_type_id);
1180 FETCH check_pt_assoc INTO l_check_old_pt_assoc;
1181 if check_pt_assoc%FOUND then
1182 x_assoc_exists := 'Y';
1183 CLOSE check_pt_assoc;
1184 return;
1185 end if;
1186 CLOSE check_pt_assoc;
1187
1188 OPEN check_pt_assoc(l_new_project_type_id);
1189 FETCH check_pt_assoc INTO l_check_new_pt_assoc;
1190 if check_pt_assoc%FOUND then
1191 x_assoc_exists := 'Y';
1192 CLOSE check_pt_assoc;
1193 return;
1194 end if;
1195 CLOSE check_pt_assoc;
1196
1197 end if;
1198
1199 EXCEPTION
1200 WHEN OTHERS THEN
1201 x_assoc_exists := 'N';
1202
1203 END CHECK_PT_ASSOC_EXISTS;
1204
1205
1206 END PA_USER_ATTR_PUB;