1 PACKAGE BODY pa_project_set_utils AS
2 /*$Header: PAPPSUTB.pls 120.2.12000000.2 2007/10/09 13:09:21 kmaddi ship $*/
3
4 --+
5
6 /*------------------------------------------------
7 Procedure: getPartyIdName
8 Description: Returns the party_id and
9 party_name of the passed in user id
10 ------------------------------------------------*/
11 PROCEDURE getPartyIdName (p_user_id IN NUMBER
12 ,x_party_id OUT NOCOPY NUMBER --File.Sql.39 bug 4440895
13 ,x_party_name OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
14 )
15 IS
16 l_employee_id fnd_user.employee_id%type;
17 l_customer_id fnd_user.person_party_id%type; -- 4586987 changed from customer_id to person_party_id
18 l_enable_log varchar2(1) := NVL(FND_PROFILE.value('PA_DEBUG_MODE'), 'N');
19 BEGIN
20 -- 4586987 changed customer_id to person_party_id
21 /*
22 SELECT employee_id, customer_id
23 INTO l_employee_id, l_customer_id
24 FROM fnd_user
25 WHERE user_id = p_user_id;
26 */
27
28 SELECT employee_id,person_party_id -- selecting person_party_id instead of customer_id
29 INTO l_employee_id,l_customer_id
30 from fnd_user
31 WHERE user_id = p_user_id;
32
33 -- 4586987 end
34
35 IF l_employee_id IS NOT NULL THEN
36 SELECT hp.party_id, hp.party_name
37 INTO x_party_id, x_party_name
38 FROM per_all_people_f pap, hz_parties hp
39 WHERE pap.person_id = l_employee_id
40 AND pap.party_id = hp.party_id
41 AND rownum = 1;
42
43 ELSIF l_customer_id IS NOT NULL THEN
44 SELECT party_id, party_name
45 INTO x_party_id, x_party_name
46 FROM hz_parties
47 WHERE party_type = 'PERSON'
48 AND party_id = l_customer_id
49 AND rownum = 1;
50
51 END IF;
52
53 EXCEPTION
54 WHEN NO_DATA_FOUND THEN
55 x_party_id := NULL;
56 x_party_name := NULL;
57 END getPartyIdName;
58
59
60 FUNCTION get_project_set_lines(p_project_set_id IN NUMBER)
61 RETURN project_set_lines_tbl_type
62 IS
63
64 l_project_set_lines_tbl pa_project_set_utils.project_set_lines_tbl_type;
65
66 TYPE number_tbl_type IS TABLE OF NUMBER
67 INDEX BY BINARY_INTEGER;
68
69 l_project_set_id_tbl number_tbl_type;
70 l_project_id_tbl number_tbl_type;
71
72 BEGIN
73
74 SELECT project_set_id,
75 project_id
76 BULK COLLECT INTO
77 l_project_set_id_tbl,
78 l_project_id_tbl
79 FROM pa_project_set_lines
80 WHERE project_set_id = p_project_set_id;
81
82 IF l_project_set_id_tbl.COUNT > 0 THEN
83
84 FOR i IN l_project_set_id_tbl.FIRST .. l_project_set_id_tbl.LAST LOOP
85
86 l_project_set_lines_tbl(i).project_set_id := l_project_set_id_tbl(i);
87 l_project_set_lines_tbl(i).project_id := l_project_id_tbl(i);
88
89 END LOOP;
90
91 END IF;
92
93 RETURN l_project_set_lines_tbl;
94
95 END get_project_set_lines;
96
97
98 FUNCTION do_lines_exist(p_project_set_id IN NUMBER)
99 RETURN VARCHAR2
100 IS
101 l_lines_exist VARCHAR2(1);
102
103 CURSOR do_lines_exist IS
104 SELECT 'Y'
105 FROM pa_project_set_lines
106 WHERE project_set_id = p_project_set_id;
107 BEGIN
108
109 OPEN do_lines_exist;
110 FETCH do_lines_exist into l_lines_exist;
111
112 IF do_lines_exist%NOTFOUND THEN
113 l_lines_exist := 'N';
114 END IF;
115
116 CLOSE do_lines_exist;
117
118 return l_lines_exist;
119
120 EXCEPTION
121 WHEN OTHERS THEN
122 RAISE;
123 END do_lines_exist;
124
125
126 FUNCTION check_projects_in_set(p_project_set_id IN NUMBER
127 ,p_project_id IN NUMBER)
128 RETURN VARCHAR2
129 IS
130 l_exists VARCHAR2(1);
131 BEGIN
132
133 SELECT 'Y' INTO l_exists
134 FROM pa_project_set_lines
135 WHERE project_set_id = p_project_set_id
136 AND project_id = p_project_id;
137
138 RETURN l_exists;
139
140 EXCEPTION
141 WHEN NO_DATA_FOUND THEN
142 RETURN 'N';
143
144 END check_projects_in_set;
145
146
147 FUNCTION check_security_on_set(p_party_id IN NUMBER,
148 p_user_id NUMBER,
149 p_resp_id NUMBER)
150 RETURN VARCHAR2
151 IS
152 l_update_sup_user VARCHAR2(1);
153 l_party_id HZ_PARTIES.party_id%TYPE;
154 l_party_name HZ_PARTIES.party_name%TYPE;
155 BEGIN
156
157 l_update_sup_user := PA_SECURITY_PVT.check_user_privilege(
158 p_privilege => 'PA_PROJ_SET_UPDATE'
159 ,p_object_name => null
160 ,p_object_key => null);
161
162 IF l_update_sup_user = 'T' THEN
163 RETURN 'T';
164 ELSE
165 getPartyIdName ( p_user_id => p_user_id
166 ,x_party_id => l_party_id
167 ,x_party_name => l_party_name);
168
169 IF p_party_id = l_party_id THEN
170 RETURN 'T';
171 ELSE
172 RETURN 'F';
173 END IF;
174 END IF;
175
176 EXCEPTION
177 WHEN OTHERS THEN
178 RETURN 'F';
179 END check_security_on_set;
180
181
182 FUNCTION is_name_unique(p_project_set_name IN VARCHAR2
183 ,p_project_set_id IN NUMBER := NULL)
184 RETURN VARCHAR2
185 IS
186 l_unique VARCHAR2(1);
187
188 CURSOR check_name_unique IS
189 SELECT 'N'
190 FROM pa_project_sets_tl
191 WHERE name = p_project_set_name
192 AND language = userenv('lang')
193 AND ((project_set_id <> p_project_set_id AND p_project_set_id IS NOT NULL)
194 OR p_project_set_id IS NULL);
195
196 BEGIN
197
198 OPEN check_name_unique;
199 FETCH check_name_unique into l_unique;
200
201 IF check_name_unique%NOTFOUND THEN
202 l_unique := 'Y';
203 END IF;
204
205 CLOSE check_name_unique;
206
207 return l_unique;
208
209 EXCEPTION
210 WHEN OTHERS THEN
211 RAISE;
212 END is_name_unique;
213
214
215 FUNCTION get_proj_set_name (p_project_set_id IN NUMBER)
216 RETURN VARCHAR2
217 IS
218 l_project_set_name pa_project_sets_tl.name%type;
219
220 BEGIN
221
222 SELECT name
223 INTO l_project_set_name
224 FROM pa_project_sets_tl
225 WHERE project_set_id = p_project_set_id
226 AND userenv('lang') = language(+); --Bug 6208018
227
228 return l_project_set_name;
229
230 EXCEPTION
231 WHEN OTHERS THEN
232 RETURN NULL;
233 END get_proj_set_name;
234
235
236 PROCEDURE add_projects_to_proj_set
237 ( p_project_set_id IN pa_project_sets_b.project_set_id%TYPE
238 ,p_project_id_tbl IN SYSTEM.pa_num_tbl_type
239 ,p_init_msg_list IN VARCHAR2 := FND_API.G_FALSE
240 ,p_commit IN VARCHAR2 := FND_API.G_FALSE
241 ,p_validate_only IN VARCHAR2 := FND_API.G_TRUE
242 ,x_return_status OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
243 ,x_msg_count OUT NOCOPY NUMBER --File.Sql.39 bug 4440895
244 ,x_msg_data OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
245 ,x_project_list OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
246 ,x_project_set_name OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
247 )
248 IS
249
250 l_msg_index_out NUMBER;
251 l_return_status VARCHAR2(1) := FND_API.G_RET_STS_SUCCESS;
252 l_project_id_tbl SYSTEM.pa_num_tbl_type := p_project_id_tbl;
253 l_msg_count NUMBER;
254 l_msg_data VARCHAR2(200);
255 l_exists VARCHAR2(4);
256 l_proj_set_name pa_project_sets_tl.name%TYPE;
257 l_project_list VARCHAR2(2000) := '';
258 l_project_name pa_projects_all.name%TYPE;
259 l_project_number pa_projects_all.segment1%TYPE;
260 l_enable_log varchar2(1) := NVL(FND_PROFILE.value('PA_DEBUG_MODE'), 'N');
261
262 CURSOR get_proj_name_number(l_project_id IN NUMBER)
263 IS
264 SELECT name, segment1
265 FROM pa_projects_all
266 WHERE project_id = l_project_id;
267
268 BEGIN
269
270 -- initialize return status to success
271 x_return_status := FND_API.G_RET_STS_SUCCESS;
272
273 IF p_init_msg_list = FND_API.G_TRUE THEN
274 fnd_msg_pub.initialize;
275 END IF;
276
277 -- get the project set name to be displayed in the informational msg if necessary
278 l_proj_set_name := get_proj_set_name(p_project_set_id);
279
280 -- loop through all project ids table to insert each project id
281 -- into the Project Set.
282 IF l_project_id_tbl.count > 0 THEN
283
284 FOR I IN 1..l_project_id_tbl.count LOOP
285
286 l_exists := check_projects_in_set(p_project_set_id, l_project_id_tbl(I));
287
288 IF l_exists = 'N' THEN
289 -- add the project to the project set, if it does not yet exist
290 PA_PROJECT_SETS_PUB.create_project_set_line
291 ( p_project_set_id => p_project_set_id
292 ,p_project_id => l_project_id_tbl(I)
293 ,x_return_status => l_return_status
294 ,x_msg_count => l_msg_count
295 ,x_msg_data => l_msg_data
296 );
297 --dbms_output.put_line ('Successfully inserted ProjectId ###' || l_project_id_tbl(I) || '### into Project Set');
298
299 ELSE
300 -- The project already exists in the set. Add the project name, project number
301 -- to the project list message to be later displayed on the project list page
302 OPEN get_proj_name_number(l_project_id_tbl(I));
303 FETCH get_proj_name_number INTO l_project_name, l_project_number;
304 CLOSE get_proj_name_number;
305
306 l_project_list := l_project_list || l_project_name || '(' || l_project_number || '), ';
307 --dbms_output.put_line ('Project already exists. Add name, number to list');
308
309 END IF;
310
311 END LOOP;
312
313 END IF;
314
315 --dbms_output.put_line ('All concatenated project list is ' || l_project_list);
316
317 x_project_list := l_project_list;
318 x_project_set_name := l_proj_set_name;
319
320
321 EXCEPTION
322 WHEN OTHERS THEN
323 x_project_list := '';
324 x_project_set_name := '';
325 x_return_status := FND_API.G_RET_STS_ERROR;
326
327 END add_projects_to_proj_set;
328
329
330 PROCEDURE Check_PartyName_Or_Id(
331 p_party_id IN NUMBER,
332 p_party_name IN VARCHAR2,
333 p_check_id_flag IN VARCHAR2,
334 x_party_id OUT NOCOPY NUMBER, --File.Sql.39 bug 4440895
335 x_return_status OUT NOCOPY VARCHAR2, --File.Sql.39 bug 4440895
336 x_error_msg_code OUT NOCOPY VARCHAR2) --File.Sql.39 bug 4440895
337 IS
338
339 l_enable_log varchar2(1) := NVL(FND_PROFILE.value('PA_DEBUG_MODE'), 'N');
340
341 BEGIN
342
343 -- Initialize the Error Stack
344 IF l_enable_log = 'Y' THEN
345 PA_DEBUG.init_err_stack('PA_PROJECT_SET_UTILS.Check_PartyName_Or_Id');
346 END IF;
347
348 -- Initialize the return status to success
349 x_return_status := FND_API.G_RET_STS_SUCCESS;
350
351 IF p_party_id IS NOT NULL THEN
352 IF p_check_id_flag = 'Y' THEN
353 SELECT party_id
354 INTO x_party_id
355 FROM hz_parties
356 WHERE party_id = p_party_id;
357 ELSE
358 x_party_id := p_party_id;
359 END IF;
360 ELSE
361 SELECT party_id
362 INTO x_party_id
363 FROM hz_parties
364 WHERE party_name = p_party_name;
365 END IF;
366
367 EXCEPTION
368 WHEN NO_DATA_FOUND THEN
369 x_party_id := NULL;
370 x_return_status := FND_API.G_RET_STS_ERROR;
371 x_error_msg_code := 'PA_PARTY_INVALID';
372 WHEN TOO_MANY_ROWS then
373 x_party_id := NULL;
374 x_return_status := FND_API.G_RET_STS_ERROR;
375 x_error_msg_code := 'PA_MULTIPLE_PARTY';
376 WHEN OTHERS THEN
377 -- Set the exception Message and the stack
378 FND_MSG_PUB.add_exc_msg(p_pkg_name => 'PA_PROJECT_SET_UTILS.Check_PartyName_Or_Id'
379 ,p_procedure_name => PA_DEBUG.G_Err_Stack );
380 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
381 RAISE;
382 END Check_PartyName_Or_Id;
383
384
385 PROCEDURE Check_ProjectSetName_Or_Id(
386 p_project_set_id IN NUMBER
387 ,p_project_set_name IN VARCHAR2
388 ,p_check_id_flag IN VARCHAR2
389 ,x_project_set_id OUT NOCOPY NUMBER --File.Sql.39 bug 4440895
390 ,x_return_status OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
391 ,x_error_msg_code OUT NOCOPY VARCHAR2) --File.Sql.39 bug 4440895
392 IS
393 l_current_id NUMBER := NULL;
394 l_num_ids NUMBER := 0;
395 l_id_found_flag VARCHAR(1) := 'N';
396 l_enable_log varchar2(1) := NVL(FND_PROFILE.value('PA_DEBUG_MODE'), 'N');
397
398 CURSOR p_ids IS
399 SELECT project_set_id
400 FROM pa_project_sets_vl
401 WHERE upper(name) = upper(p_project_set_name);
402 BEGIN
403
404 if (p_project_set_id = FND_API.G_MISS_NUM) OR (p_project_set_id is NULL) then
405 if (p_project_set_name is not NULL) then
406 SELECT project_set_id
407 INTO x_project_set_id
408 FROM pa_project_sets_vl
409 WHERE upper(name) = upper(p_project_set_name);
410 else
411 x_project_set_id := NULL;
412 end if;
413
414 else
415 IF p_check_id_flag = 'Y' THEN
416 SELECT project_set_id
417 INTO x_project_set_id
418 FROM pa_project_sets_vl
419 WHERE project_set_id = p_project_set_id;
420
421 ELSIF (p_check_id_flag='N') THEN
422 x_project_set_id := p_project_set_id;
423
424 ELSIF (p_check_id_flag = 'A') THEN
425 IF (p_project_set_name IS NULL) THEN
426 -- Return a null ID since the name is null.
427 x_project_set_id := NULL;
428 ELSE
429
430 -- Find the ID which matches the Name passed
431 OPEN p_ids;
432 LOOP
433 FETCH p_ids INTO l_current_id;
434 EXIT WHEN p_ids%NOTFOUND;
435 IF (l_current_id = p_project_set_id) THEN
436 l_id_found_flag := 'Y';
437 x_project_set_id := p_project_set_id;
438 END IF;
439 END LOOP;
440 l_num_ids := p_ids%ROWCOUNT;
441 CLOSE p_ids;
442
443 IF (l_num_ids = 0) THEN
444 -- No IDs for name
445 RAISE NO_DATA_FOUND;
446 ELSIF (l_num_ids = 1) THEN
447 -- Since there is only one ID for the name use it.
448 x_project_set_id := l_current_id;
449 ELSIF (l_id_found_flag = 'N') THEN
450 -- More than one ID for the name and none of the IDs matched
451 -- the ID passed in.
452 RAISE TOO_MANY_ROWS;
453 END IF;
454 END IF;
455
456 ELSE
457 x_project_set_id := NULL;
458 END IF;
459
460 end if;
461
462 x_return_status := FND_API.G_RET_STS_SUCCESS;
463
464 EXCEPTION
465 when NO_DATA_FOUND then
466 x_project_set_id := NULL;
467 x_return_status := FND_API.G_RET_STS_ERROR;
468 x_error_msg_code := 'PA_PROJECT_SET_INVALID';
469 when TOO_MANY_ROWS then
470 x_project_set_id := NULL;
471 x_return_status := FND_API.G_RET_STS_ERROR;
472 x_error_msg_code := 'PA_PROJECT_SET_INVALID';
473 when OTHERS then
474 x_project_set_id := NULL;
475 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
476 FND_MSG_PUB.add_exc_msg(p_pkg_name => 'PA_PROJECT_SETS_UTILS', p_procedure_name => 'CHECK_PROJECTSETNAME_OR_ID');
477 raise;
478
479 END Check_ProjectSetName_Or_Id;
480
481 FUNCTION is_party_internal (p_party_id IN NUMBER) RETURN VARCHAR2
482 IS
483 CURSOR c1 IS
484 SELECT orig_system_reference
485 FROM hz_parties
486 WHERE party_id = p_party_id;
487 v_c1 c1%ROWTYPE;
488
489 BEGIN
490 OPEN c1;
491 FETCH c1 INTO v_c1;
492 CLOSE c1;
493
494 IF SUBSTR(v_c1.orig_system_reference, 1, 4) = 'PER:' THEN
495 RETURN 'Y';
496 ELSE
497 RETURN 'N';
498 END IF;
499
500 END is_party_internal;
501
502 END PA_PROJECT_SET_UTILS;