1 PACKAGE BODY PA_PROJECT_PARTIES_UTILS AS
2 /* $Header: PARPPU2B.pls 120.12 2011/12/06 21:14:11 skkoppul ship $ */
3
4 P_DEBUG_MODE varchar2(1) := NVL(FND_PROFILE.value('PA_DEBUG_MODE'), 'N');
5
6 FUNCTION VALIDATE_DELETE_PARTY_OK (p_project_id IN NUMBER,
7 p_project_party_id IN NUMBER) RETURN VARCHAR2 IS
8
9 BEGIN
10
11 RETURN 'Y';
12
13 END VALIDATE_DELETE_PARTY_OK;
14
15 FUNCTION ACTIVE_PARTY ( p_start_date_active IN DATE,
16 p_end_date_active IN DATE) RETURN VARCHAR2 IS
17
18 BEGIN
19 IF( (SYSDATE BETWEEN p_start_date_active AND p_end_date_active) OR
20 (p_start_date_active <= SYSDATE AND p_end_date_active IS NULL)) THEN
21 RETURN 'Y';
22 ELSE
23 RETURN 'N';
24 END IF;
25 END ACTIVE_PARTY;
26
27
28 PROCEDURE GET_PROJECT_DATES (p_project_id IN NUMBER,
29 x_project_start_date OUT NOCOPY DATE, --File.Sql.39 bug 4440895
30 x_project_end_date OUT NOCOPY DATE, --File.Sql.39 bug 4440895
31 x_return_status OUT NOCOPY VARCHAR2) IS --File.Sql.39 bug 4440895
32 BEGIN
33 x_return_status := FND_API.G_RET_STS_SUCCESS;
34
35 /* Bug 2636791 - changes begin */
36 /* Commenting this query and selecting start date from PA_PROJECT_DATES_UTILS.GET_PROJECT_START_DATE */
37 /* select start_date, completion_date
38 into x_project_start_date, x_project_end_date
39 from pa_projects_all
40 where project_id = p_project_id; */
41
42 SELECT PA_PROJECT_DATES_UTILS.GET_PROJECT_START_DATE(p_project_id), completion_date
43 INTO x_project_start_date, x_project_end_date
44 FROM pa_projects_all
45 WHERE project_id = p_project_id;
46
47 /* Bug 2636791 - changes end */
48
49 EXCEPTION WHEN OTHERS THEN
50 fnd_message.set_name('PA','PA_NO_PROJECT_ID');
51 fnd_message.set_token('PKG_NAME','PA_PROJECT_PARTIES_UTILS');
52 fnd_message.set_token('PROCEDURE_NAME','GET_PROJECT_DATES');
53 fnd_msg_pub.ADD;
54 x_return_status := FND_API.G_RET_STS_ERROR;
55 END;
56
57
58 PROCEDURE VALIDATE_PROJECT_PARTY( p_validation_level IN NUMBER := FND_API.G_VALID_LEVEL_FULL,
59 p_debug_mode IN VARCHAR2 DEFAULT 'N',
60 p_object_id IN NUMBER,
61 p_OBJECT_TYPE IN VARCHAR2,
62 p_project_role_id IN NUMBER,
63 p_resource_type_id IN NUMBER DEFAULT 101,
64 p_resource_source_id IN NUMBER,
65 p_start_date_active IN DATE,
66 p_scheduled_flag IN VARCHAR2,
67 p_record_version_number IN OUT NOCOPY NUMBER, --File.Sql.39 bug 4440895
68 p_calling_module IN VARCHAR2,
69 p_action IN VARCHAR2,
70 p_project_id IN NUMBER,
71 p_project_end_date IN DATE,
72 p_end_date_active IN OUT NOCOPY DATE, --File.Sql.39 bug 4440895
73 p_project_party_id IN OUT NOCOPY NUMBER, --File.Sql.39 bug 4440895
74 x_call_overlap IN OUT NOCOPY VARCHAR2, --File.Sql.39 bug 4440895
75 x_assignment_action IN OUT NOCOPY VARCHAR2, --File.Sql.39 bug 4440895
76 x_return_status OUT NOCOPY VARCHAR2) IS --File.Sql.39 bug 4440895
77
78 l_error_occured VARCHAR2(1) := 'N';
79 l_project_party_id NUMBER;
80 l_record_version_number NUMBER;
81 l_end_date_active DATE; --Bug 4565156 NOCOPY changes
82
83 CURSOR c_duplicate_customer_org IS
84 SELECT 'Y'
85 FROM pa_project_parties ppp,
86 pa_project_role_types_b r1,
87 pa_project_role_types_b r2
88 WHERE r1.project_role_id = p_project_role_id
89 AND r1.role_party_class = 'CUSTOMER'
90 AND ppp.object_id = p_object_id
91 AND ppp.object_type = p_object_type
92 AND ppp.resource_type_id = 112
93 AND ppp.resource_source_id = p_resource_source_id
94 AND r2.project_role_id = ppp.project_role_id
95 AND r2.role_party_class = 'CUSTOMER'
96 AND ROWNUM=1;
97
98 l_dummy VARCHAR2(1);
99
100
101 BEGIN
102 x_return_status := FND_API.G_RET_STS_SUCCESS;
103 pa_debug.set_err_stack('Validate_project_party');
104
105 l_end_date_active := p_end_date_active; --Bug 4565156 NOCOPY changes
106
107 --MT OrgRole changes: ext people are not schedulable
108 IF p_resource_type_id = 112 AND p_scheduled_flag = 'Y' THEN
109 x_return_status := FND_API.G_RET_STS_ERROR;
110 fnd_message.set_name('PA','PA_NO_SCHEDULE_HZ_PARTY');
111 fnd_msg_pub.ADD;
112 RETURN;
113 END IF;
114 --/MT
115
116 /*Code Addition for bug 2983546 -- Ext people are not allowed as project Managers */
117
118 IF p_resource_type_id = 112 AND p_project_role_id=1 THEN
119 x_return_status := FND_API.G_RET_STS_ERROR;
120 fnd_message.set_name('PA','PA_NO_EXT_MANAGER');
121 fnd_msg_pub.ADD;
122 RETURN;
123 END IF;
124
125 /*Code Addition ends - 2983546*/
126
127
128 --- call to check all mandatory fields are given
129 IF (p_debug_mode = 'Y') THEN
130 pa_debug.debug('Validate_project_party: Calling check_mandatory_fields.');
131 END IF;
132 pa_project_parties_utils.check_mandatory_fields(p_project_role_id => p_project_role_id,
133 p_resource_type_id => p_resource_type_id,
134 p_resource_source_id => p_resource_source_id,
135 p_start_date_active => p_start_date_active,
136 p_end_date_active => p_end_date_active,
137 p_project_end_date => p_project_end_date,
138 p_scheduled_flag => p_scheduled_flag,
139 x_error_occured => l_error_occured);
140 IF (l_error_occured = 'Y') THEN
141 x_return_status := FND_API.G_RET_STS_ERROR;
142 END IF;
143
144
145
146 --dbms_output.put_line('After checking the mandatory errors'||x_return_status);
147
148 -- Bug 2671210. Check to validate role-party combination.
149 --- call to validate role party combination
150 IF (p_debug_mode = 'Y') THEN
151 pa_debug.debug('Validate_role_party: Calling Validate_role_party.');
152 END IF;
153
154 pa_project_parties_utils.Validate_role_party(p_project_role_id => p_project_role_id,
155 p_resource_type_id => p_resource_type_id,
156 p_resource_source_id => p_resource_source_id,
157 x_error_occured => l_error_occured);
158
159 IF (l_error_occured = 'Y') THEN
160 x_return_status := FND_API.G_RET_STS_ERROR;
161 END IF;
162 -- bug2671210 ended.
163
164 --- call to validate the start and end dates for the person
165 IF (p_debug_mode = 'Y') THEN
166 pa_debug.debug('Validate_project_party: Calling validate_dates.');
167 END IF;
168 pa_project_parties_utils.validate_dates(p_start_date_active => p_start_date_active,
169 p_end_date_active => p_end_date_active,
170 x_error_occured => l_error_occured);
171
172 IF (l_error_occured = 'Y') THEN
173 x_return_status := FND_API.G_RET_STS_ERROR;
174 END IF;
175
176 /* Start of Bug 3096700 */
177 /* Adding a validation for checking if the project role start date lies between specified start active and end active date */
178 l_dummy := 'N';
179 BEGIN
180 SELECT 'Y'
181 INTO l_dummy
182 FROM pa_project_role_types_b
183 WHERE project_role_id = p_project_role_id
184 AND p_start_date_active BETWEEN start_date_active AND NVL(end_date_active,p_start_date_active)
185 AND (p_end_date_active IS NULL
186 OR p_end_date_active BETWEEN start_date_active AND NVL(end_date_active,p_end_date_active));
187 EXCEPTION
188 WHEN NO_DATA_FOUND THEN
189 x_return_status := FND_API.G_RET_STS_ERROR;
190 fnd_message.set_name('PA','PA_ROLE_INACTIVE');
191 fnd_msg_pub.ADD;
192 END;
193 /* End of 3096700 */
194 --dbms_output.put_line('after validating dates'||x_return_status);
195 x_assignment_action := 'NOACTION';
196
197 IF (p_calling_module NOT IN ('EXCHANGE','FORM')) THEN
198
199 IF (p_action = 'INSERT' OR pa_project_parties_utils.get_scheduled_flag(p_project_party_id, p_record_version_number) <> p_scheduled_flag) THEN
200
201 IF p_resource_type_id = 112 THEN
202 IF (p_debug_mode = 'Y') THEN
203 pa_debug.debug('Validate_project_party: Looking for customer org duplicate.');
204 END IF;
205
206 OPEN c_duplicate_customer_org;
207 FETCH c_duplicate_customer_org INTO l_dummy;
208 IF c_duplicate_customer_org%FOUND THEN
209 x_return_status := FND_API.G_RET_STS_ERROR;
210 fnd_message.set_name('PA','PA_DUPLICATE_CUSTOMER_ORG');
211 fnd_msg_pub.ADD;
212 CLOSE c_duplicate_customer_org;
213 RETURN;
214 END IF;
215 CLOSE c_duplicate_customer_org;
216 END IF;
217
218
219 IF (p_debug_mode = 'Y') THEN
220 pa_debug.debug('Validate_project_party: Checking for schedule flag.');
221 END IF;
222
223 IF p_scheduled_flag = 'Y' THEN
224 IF VALIDATE_SCHEDULE_ALLOWED(p_project_role_id) = 'Y' THEN
225 --dbms_output.put_line('schedule is allowed for this role');
226 x_assignment_action := 'CREATE';
227 ELSE
228 --dbms_output.put_line('schedule is not allowed for this role');
229 x_return_status := FND_API.G_RET_STS_ERROR;
230 fnd_message.set_name('PA','PA_NO_SCHEDULE_ALLOWED');
231 --fnd_message.set_token('PKG_NAME','PA_PROJECT_PARTIES_UTILS');
232 --fnd_message.set_token('PROCEDURE_NAME','VALIDATE_PROJECT_PARTY');
233 fnd_msg_pub.ADD;
234 END IF;
235 ELSE
236 IF (p_debug_mode = 'Y') THEN
237 pa_debug.debug('Validate_project_party: No schedule required.');
238 END IF;
239
240 --dbms_output.put_line('no assignment required');
241 x_assignment_action := 'NOACTION';
242 END IF;
243
244 IF p_scheduled_flag = 'N' AND p_action = 'UPDATE' THEN
245 IF (p_debug_mode = 'Y') THEN
246 pa_debug.debug('Validate_project_party: Need to delete schedule.');
247 END IF;
248
249 --dbms_output.put_line('need to delete assignment');
250 x_assignment_action := 'DELETE';
251 END IF;
252 END IF;
253
254 IF x_assignment_action = 'CREATE' OR (p_action = 'INSERT' AND p_calling_module <> 'PROJECT_MEMBER') THEN
255 --dbms_output.put_line('trying to get person id');
256 IF (p_debug_mode = 'Y') THEN
257 pa_debug.debug('Validate_project_party: Getting the project party id.');
258 END IF;
259 pa_project_parties_utils.get_person_party_id(p_object_type => p_object_type,
260 p_object_id => p_object_id,
261 p_project_role_id => p_project_role_id,
262 p_resource_type_id => p_resource_type_id,
263 p_resource_source_id => p_resource_source_id,
264 p_start_date_active => p_start_date_active,
265 p_end_date_active => p_end_date_active,
266 x_project_party_id => l_project_party_id,
267 x_record_version_number => l_record_version_number);
268
269 --dbms_output.put_line('person id'||to_char(l_project_party_id));
270 IF l_project_party_id <> -999 THEN
271 x_call_overlap := 'N';
272 IF pa_project_parties_utils.get_scheduled_flag(l_project_party_id, l_record_version_number) <> 'Y' THEN
273 p_project_party_id := l_project_party_id;
274 p_record_version_number := l_record_version_number;
275 ELSE
276 --dbms_output.put_line('cannot create duplicate record');
277 x_return_status := FND_API.G_RET_STS_ERROR;
278 fnd_message.set_name('PA','PA_XC_TOO_MANY_OMGRS');
279 --fnd_message.set_token('PKG_NAME','PA_PROJECT_PARTIES_UTILS');
280 --fnd_message.set_token('PROCEDURE_NAME','VALIDATE_PROJECT_PARTY');
281 fnd_msg_pub.ADD;
282 END IF;
283 END IF;
284 END IF;
285
286 END IF;
287
288 IF x_call_overlap = 'Y' OR p_action = 'UPDATE' OR p_calling_module = 'EXCHANGE' THEN
289
290 IF p_project_role_id = 1 THEN -- hard coded for Project Manager
291 IF (p_debug_mode = 'Y') THEN
292 pa_debug.debug('Validate_project_party: Calling validate_no_overlap_manager.');
293 END IF;
294 pa_project_parties_utils.validate_no_overlap_manager(p_object_type => p_object_type,
295 p_object_id => p_object_id,
296 p_project_role_id => p_project_role_id,
297 p_project_party_id => p_project_party_id,
298 p_start_date_active => p_start_date_active,
299 p_end_date_active => p_end_date_active,
300 x_error_occured => l_error_occured);
301 IF (l_error_occured = 'Y') THEN
302 x_return_status := FND_API.G_RET_STS_ERROR;
303 END IF;
304 --dbms_output.put_line('validating manager');
305 ELSE
306 IF (p_debug_mode = 'Y') THEN
307 pa_debug.debug('Validate_project_party: Calling validate_person_not_overlapped.');
308 END IF;
309 pa_project_parties_utils.validate_person_not_overlapped(p_object_type => p_object_type,
310 p_object_id => p_object_id,
311 p_project_role_id => p_project_role_id,
312 p_project_party_id => p_project_party_id,
313 p_resource_type_id => p_resource_type_id,
314 p_resource_source_id => p_resource_source_id,
315 p_start_date_active => p_start_date_active,
316 p_end_date_active => p_end_date_active,
317 x_error_occured => l_error_occured);
318 IF (l_error_occured = 'Y') THEN
319 x_return_status := FND_API.G_RET_STS_ERROR;
320 END IF;
321 --dbms_output.put_line('validating overlap');
322 END IF;
323 END IF;
324
325 EXCEPTION WHEN OTHERS THEN
326 p_end_date_active := l_end_date_active; --Bug 4565156 NOCOPY changes
327 x_return_status := fnd_api.g_ret_sts_unexp_error;
328 fnd_msg_pub.add_exc_msg(p_pkg_name => 'PA_PROJECT_PARTIES_UTILS',
329 p_procedure_name => 'VALIDATE_PROJECT_PARTY',
330 p_error_text => SUBSTRB(SQLERRM,1,240));
331 RAISE;
332
333 END VALIDATE_PROJECT_PARTY;
334
335
336 FUNCTION GET_SCHEDULED_FLAG(p_project_party_id IN NUMBER,
337 p_record_version_number IN NUMBER) RETURN VARCHAR2 IS
338 l_scheduled_flag VARCHAR2(1);
339 BEGIN
340 pa_debug.set_err_stack('Get_scheduled_flag');
341 SELECT scheduled_flag INTO l_scheduled_flag
342 FROM pa_project_parties
343 WHERE project_party_id = NVL(p_project_party_id,-999)
344 AND record_version_number = NVL(p_record_version_number,record_version_number);
345
346 pa_debug.reset_err_stack;
347 RETURN l_scheduled_flag;
348
349 EXCEPTION
350 WHEN NO_DATA_FOUND THEN
351 fnd_message.set_name('PA','PA_NO_SCHEDULE_ALLOWED');
352 --fnd_message.set_token('PKG_NAME','PA_PROJECT_PARTIES_UTILS');
353 --fnd_message.set_token('FUNCTION_NAME','GET_SCHEDULED_FLAG');
354 fnd_msg_pub.ADD;
355 RETURN 'X';
356 WHEN OTHERS THEN
357 fnd_msg_pub.add_exc_msg(p_pkg_name => 'PA_PROJECT_PARTIES_UTILS',
358 p_procedure_name => pa_debug.g_err_stack,
359 p_error_text => SUBSTRB(SQLERRM,1,240));
360 RAISE;
361 END GET_SCHEDULED_FLAG;
362
363
364 FUNCTION VALIDATE_SCHEDULE_ALLOWED(p_project_role_id IN NUMBER) RETURN VARCHAR2 IS
365 x_sch_flag VARCHAR2(1) := 'N';
366 BEGIN
367
368 pa_debug.set_err_stack('Validate_scheduled_allowed');
369 x_sch_flag := pa_role_utils.get_schedulable_flag(p_role_id => p_project_role_id);
370
371 pa_debug.reset_err_stack;
372
373 RETURN x_sch_flag;
374
375 EXCEPTION WHEN OTHERS THEN
376 fnd_msg_pub.add_exc_msg(p_pkg_name => 'PA_PROJECT_PARTIES_UTILS',
377 p_procedure_name => pa_debug.g_err_stack,
378 p_error_text => SUBSTRB(SQLERRM,1,240));
379 RAISE;
380 END VALIDATE_SCHEDULE_ALLOWED;
381
382
383 PROCEDURE GET_PERSON_PARTY_ID(p_object_type IN VARCHAR2,
384 p_object_id IN NUMBER,
385 p_project_role_id IN NUMBER,
386 p_resource_type_id IN NUMBER DEFAULT 101,
387 p_resource_source_id IN NUMBER,
388 p_start_date_active IN DATE,
389 p_end_date_active IN DATE,
390 x_project_party_id OUT NOCOPY NUMBER, --File.Sql.39 bug 4440895
391 x_record_version_number OUT NOCOPY NUMBER) IS --File.Sql.39 bug 4440895
392 BEGIN
393 pa_debug.set_err_stack('Get_person_party_id');
394 x_project_party_id := -999;
395
396 SELECT project_party_id, record_version_number INTO x_project_party_id, x_record_version_number
397 FROM pa_project_parties
398 WHERE object_type = p_object_type
399 AND object_id = p_object_id
400 AND project_role_id = p_project_role_id
401 AND resource_type_id = p_resource_type_id
402 AND resource_source_id = p_resource_source_id
403 AND start_date_active = TRUNC(p_start_date_active)
404 AND end_date_active = TRUNC(p_end_date_active);
405
406 pa_debug.reset_err_stack;
407
408 EXCEPTION WHEN NO_DATA_FOUND THEN
409 x_project_party_id := -999;
410 WHEN OTHERS THEN
411 fnd_msg_pub.add_exc_msg(p_pkg_name => 'PA_PROJECT_PARTIES_UTILS',
412 p_procedure_name => pa_debug.g_err_stack,
413 p_error_text => SUBSTRB(SQLERRM,1,240));
414 RAISE;
415 END GET_PERSON_PARTY_ID;
416
417
418 PROCEDURE CHECK_MANDATORY_FIELDS(p_project_Role_id IN NUMBER,
419 p_resource_type_id IN NUMBER DEFAULT 101,
420 p_resource_source_id IN NUMBER,
421 p_start_date_active IN DATE,
422 p_end_date_active IN OUT NOCOPY DATE, --File.Sql.39 bug 4440895
423 p_project_end_date IN DATE,
424 p_scheduled_flag IN VARCHAR2,
425 x_error_occured OUT NOCOPY VARCHAR2) IS --File.Sql.39 bug 4440895
426
427 BEGIN
428 pa_debug.set_err_stack('Check_mandatory_fields');
429 IF p_project_Role_id IS NULL THEN
430 fnd_message.set_name('PA','PA_XC_NO_ROLE_TYPE');
431 --fnd_message.set_token('PKG_NAME','PA_PROJECT_PARTIES_UTILS');
432 --fnd_message.set_token('PROCEDURE_NAME','CHECK_MANDATORY_FIELDS');
433 fnd_msg_pub.ADD;
434 --dbms_output.put_line('PA_XC_NO_ROLE_TYPE');
435 x_error_occured := 'Y';
436 END IF;
437
438 IF p_resource_source_id IS NULL THEN
439 fnd_message.set_name('PA','PA_XC_NO_PERSON_ID');
440 --fnd_message.set_token('PKG_NAME','PA_PROJECT_PARTIES_UTILS');
441 --fnd_message.set_token('PROCEDURE_NAME','CHECK_MANDATORY_FIELDS');
442 fnd_msg_pub.ADD;
443 --dbms_output.put_line('PA_XC_NO_PERSON_ID');
444 x_error_occured := 'Y';
445 END IF;
446
447 IF p_start_date_active IS NULL THEN
448 fnd_message.set_name('PA','PA_START_DATE_IS_MISSING');
449 --fnd_message.set_token('PKG_NAME','PA_PROJECT_PARTIES_UTILS');
450 --fnd_message.set_token('PROCEDURE_NAME','CHECK_MANDATORY_FIELDS');
451 fnd_msg_pub.ADD;
452 --dbms_output.put_line('PA_START_DATE_IS_MISSING');
453 x_error_occured := 'Y';
454 END IF;
455
456 IF p_end_date_active IS NULL THEN
457 IF (p_scheduled_flag = 'Y' AND pa_project_parties_utils.validate_schedule_allowed(p_project_role_id)='Y') THEN
458 IF p_project_end_date IS NULL OR p_project_end_date < p_start_date_active THEN
459 fnd_message.set_name('PA','PA_END_DATE_IS_MISSING');
460 --fnd_message.set_token('PKG_NAME','PA_PROJECT_PARTIES_UTILS');
461 --fnd_message.set_token('PROCEDURE_NAME','CHECK_MANDATORY_FIELDS');
462 fnd_msg_pub.ADD;
463 x_error_occured := 'Y';
464 --dbms_output.put_line('PA_END_DATE_IS_MISSING');
465 ELSE
466 p_end_date_active := p_project_end_date;
467 END IF;
468
469 END IF;
470
471 END IF;
472 pa_debug.reset_err_stack;
473
474 END CHECK_MANDATORY_FIELDS;
475
476
477 PROCEDURE VALIDATE_DATES( p_start_date_active IN DATE,
478 p_end_date_active IN DATE,
479 x_error_occured OUT NOCOPY VARCHAR2) IS --File.Sql.39 bug 4440895
480 BEGIN
481
482 pa_debug.set_err_stack('Validate_dates');
483 IF p_end_date_active IS NOT NULL THEN
484 IF (p_end_date_active < p_start_date_active) THEN
485 fnd_message.set_name('PA','PA_SU_INVALID_DATES');
486 --fnd_message.set_token('PKG_NAME','PA_PROJECT_PARTIES_UTILS');
487 --fnd_message.set_token('PROCEDURE_NAME',pa_debug.g_err_stack);
488 fnd_msg_pub.ADD;
489 x_error_occured := 'Y';
490 END IF;
491 END IF;
492 pa_debug.reset_err_stack;
493
494 END VALIDATE_DATES;
495
496
497 PROCEDURE VALIDATE_NO_OVERLAP_MANAGER( p_object_type IN VARCHAR2,
498 p_object_id IN NUMBER,
499 p_project_role_id IN NUMBER,
500 p_project_party_id IN NUMBER,
501 p_start_date_active IN DATE,
502 p_end_date_active IN DATE,
503 x_error_occured OUT NOCOPY VARCHAR2) IS --File.Sql.39 bug 4440895
504 l_error_occured VARCHAR2(1);
505 BEGIN
506 pa_debug.set_err_stack('Validate_no_overlap_manager');
507
508 SELECT 'Y' INTO l_error_occured
509 FROM pa_project_parties
510 WHERE object_type = p_object_type
511 AND object_id = p_object_id
512 AND project_role_id = p_project_role_id
513 AND project_party_id <> NVL(p_project_party_id,-999)
514 AND (p_start_date_active BETWEEN start_date_active AND NVL(end_date_active,start_date_active)
515 OR NVL(p_end_date_active, p_start_date_active) BETWEEN start_date_active AND NVL(end_date_active,start_date_active)
516 OR start_date_active BETWEEN p_start_date_active AND NVL(p_end_date_active,start_date_active+1)
517 OR NVL(end_Date_active,start_date_active) BETWEEN p_start_date_active AND NVL(p_end_date_active,start_date_active+1)
518 OR (p_start_date_active > start_date_active AND end_date_active IS NULL));
519
520 x_error_occured := l_error_occured;
521 fnd_message.set_name('PA','PA_PR_TOO_MANY_MGRS');
522 --fnd_message.set_token('PKG_NAME','PA_PROJECT_PARTIES_UTILS');
523 --fnd_message.set_token('PROCEDURE_NAME','VALIDATE_NO_OVERLAP_MANAGER');
524 fnd_msg_pub.ADD;
525 --dbms_output.put_line('here');
526 pa_debug.reset_err_stack;
527
528 EXCEPTION
529 WHEN NO_DATA_FOUND THEN
530 x_error_occured := 'N';
531 WHEN TOO_MANY_ROWS THEN
532 fnd_message.set_name('PA','PA_PR_TOO_MANY_MGRS');
533 fnd_msg_pub.ADD;
534 x_error_occured := 'Y';
535 WHEN OTHERS THEN
536 fnd_msg_pub.add_exc_msg(p_pkg_name => 'PA_PROJECT_PARTIES_UTILS',
537 p_procedure_name => pa_debug.g_err_stack,
538 p_error_text => SUBSTRB(SQLERRM,1,240));
539 RAISE;
540 END VALIDATE_NO_OVERLAP_MANAGER;
541
542
543 PROCEDURE VALIDATE_PERSON_NOT_OVERLAPPED( p_object_type IN VARCHAR2,
544 p_object_id IN NUMBER,
545 p_project_role_id IN NUMBER,
546 p_project_party_id IN NUMBER,
547 p_resource_type_id IN NUMBER DEFAULT 101,
548 p_resource_source_id IN NUMBER,
549 p_start_date_active IN DATE,
550 p_end_date_active IN DATE,
551 x_error_occured OUT NOCOPY VARCHAR2) IS --File.Sql.39 bug 4440895
552 l_error_occured VARCHAR2(1);
553 BEGIN
554 pa_debug.set_err_stack('Validate_person_not_overlapped');
555
556 SELECT 'Y' INTO l_error_occured
557 FROM pa_project_parties
558 WHERE object_type = p_object_type
559 AND object_id = p_object_id
560 AND project_role_id = p_project_role_id
561 AND resource_type_id = p_resource_type_id
562 AND resource_source_id = p_resource_source_id
563 AND project_party_id <> NVL(p_project_party_id,-999)
564 AND (p_start_date_active BETWEEN start_date_active AND NVL(end_date_active,start_date_active)
565 OR NVL(p_end_date_active, p_start_date_active) BETWEEN start_date_active AND NVL(end_date_active,start_date_active)
566 OR start_date_active BETWEEN p_start_date_active AND NVL(p_end_date_active,start_date_active+1)
567 OR NVL(end_date_active,start_date_active) BETWEEN p_start_date_active AND NVL(p_end_date_active,start_date_active+1)
568 OR (p_start_date_active > start_date_active AND end_date_active IS NULL));
569
570 x_error_occured := l_error_occured;
571 --dbms_output.put_line(l_error_occured);
572 fnd_message.set_name('PA','PA_XC_TOO_MANY_OMGRS');
573 --fnd_message.set_token('PKG_NAME',to_char(p_project_role_id));
574 --fnd_message.set_token('PROCEDURE_NAME',to_char(p_resource_source_id));
575 fnd_msg_pub.ADD;
576 pa_debug.reset_err_stack;
577 EXCEPTION WHEN NO_DATA_FOUND THEN
578 x_error_occured := 'N';
579 WHEN TOO_MANY_ROWS THEN
580 fnd_message.set_name('PA','PA_XC_TOO_MANY_OMGRS');
581 fnd_msg_pub.ADD;
582 x_error_occured := 'Y';
583 WHEN OTHERS THEN
584 fnd_msg_pub.add_exc_msg(p_pkg_name => 'PA_PROJECT_PARTIES_UTILS',
585 p_procedure_name => pa_debug.g_err_stack,
586 p_error_text => SUBSTRB(SQLERRM,1,240));
587 RAISE;
588
589 END VALIDATE_PERSON_NOT_OVERLAPPED;
590
591
592 FUNCTION get_project_role_id(p_project_role_type IN VARCHAR2,
593 p_calling_module IN VARCHAR2) RETURN NUMBER IS
594 l_project_role_id NUMBER;
595 BEGIN
596 IF p_project_role_type IS NOT NULL THEN
597 BEGIN
598 SELECT project_role_id INTO l_project_role_id
599 FROM pa_project_role_types_vl
600 WHERE (meaning = p_project_role_type AND p_calling_module <> 'FORM')
601 OR (project_role_type = p_project_role_type AND p_calling_module = 'FORM');
602 RETURN l_project_role_id;
603 EXCEPTION WHEN NO_DATA_FOUND THEN
604 fnd_message.set_name('PA','PA_XC_NO_ROLE_TYPE');
605 --fnd_message.set_token('PKG_NAME','PA_PROJECT_PARTIES_UTILS');
606 --fnd_message.set_token('PROCEDURE_NAME','GET_PROJECT_ROLE_ID');
607 fnd_msg_pub.ADD;
608 RETURN -999;
609 END;
610 ELSE
611 fnd_message.set_name('PA','PA_XC_NO_ROLE_TYPE');
612 --fnd_message.set_token('PKG_NAME','PA_PROJECT_PARTIES_UTILS');
613 --fnd_message.set_token('PROCEDURE_NAME','GET_PROJECT_ROLE_ID');
614 fnd_msg_pub.ADD;
615 RETURN -999;
616 END IF;
617 END;
618
619 FUNCTION get_resource_source_id(p_resource_name IN VARCHAR2) RETURN NUMBER IS
620 l_resource_id NUMBER;
621 BEGIN
622 IF p_resource_name IS NOT NULL THEN
623 BEGIN
624 SELECT person_id INTO l_resource_id
625 FROM pa_employees
626 WHERE full_name = p_resource_name
627 AND active = '*';
628 RETURN l_resource_id;
629 EXCEPTION WHEN NO_DATA_FOUND THEN
630 fnd_message.set_name('PA','PA_XC_NO_PERSON_ID');
631 --fnd_message.set_token('PKG_NAME','PA_PROJECT_PARTIES_UTILS');
632 --fnd_message.set_token('PROCEDURE_NAME','GET_RESOURCE_SOURCE_ID');
633 fnd_msg_pub.ADD;
634 RETURN -999;
635 WHEN TOO_MANY_ROWS THEN
636 fnd_message.set_name('PA','PA_TOO_MANY_PERSONS');
637 --fnd_message.set_token('PKG_NAME','PA_PROJECT_PARTIES_UTILS');
638 --fnd_message.set_token('PROCEDURE_NAME','GET_RESOURCE_SOURCE_ID');
639 fnd_msg_pub.ADD;
640 RETURN -999;
641 END;
642 ELSE
643 fnd_message.set_name('PA','PA_XC_NO_PERSON_ID');
644 --fnd_message.set_token('PKG_NAME','PA_PROJECT_PARTIES_UTILS');
645 --fnd_message.set_token('PROCEDURE_NAME','GET_RESOURCE_SOURCE_ID');
646 fnd_msg_pub.ADD;
647 RETURN -999;
648 END IF;
649 END;
650 -------------
651 FUNCTION ENABLE_EDIT_LINK(p_project_id IN NUMBER,
652 p_scheduled_flag IN VARCHAR2,
653 p_assignment_id IN NUMBER) RETURN VARCHAR2 IS
654
655 BEGIN
656 IF p_scheduled_flag = 'Y' THEN
657 RETURN 'S';
658 ELSE
659 RETURN 'T';
660 END IF;
661 END;
662
663 FUNCTION get_grant_id(p_project_party_id IN NUMBER) RETURN RAW IS
664 l_grant_id RAW(16);
665
666 BEGIN
667 pa_debug.set_err_stack('get_grant_id');
668 SELECT grant_id INTO l_grant_id
669 FROM pa_project_parties
670 WHERE project_party_id = p_project_party_id;
671 pa_debug.reset_err_stack;
672
673 RETURN l_grant_id;
674
675 EXCEPTION WHEN NO_DATA_FOUND THEN
676 RETURN NULL;
677 WHEN OTHERS THEN
678 fnd_msg_pub.add_exc_msg(p_pkg_name => 'PA_PROJECT_PARTIES_UTILS',
679 p_procedure_name => pa_debug.g_err_stack,
680 p_error_text => SUBSTRB(SQLERRM,1,240));
681 RAISE;
682 END;
683
684 PROCEDURE GET_CURR_PROJ_MGR_DETAILS(p_project_id IN NUMBER,
685 x_manager_person_id OUT NOCOPY NUMBER, --File.Sql.39 bug 4440895
686 x_manager_name OUT NOCOPY VARCHAR2, --File.Sql.39 bug 4440895
687 x_project_party_id OUT NOCOPY NUMBER, --File.Sql.39 bug 4440895
688 x_project_role_id OUT NOCOPY NUMBER, --File.Sql.39 bug 4440895
689 x_project_role_name OUT NOCOPY VARCHAR2, --File.Sql.39 bug 4440895
690 x_return_status OUT NOCOPY VARCHAR2, --File.Sql.39 bug 4440895
691 x_error_message_code OUT NOCOPY VARCHAR2) IS --File.Sql.39 bug 4440895
692 BEGIN
693 x_return_status := FND_API.G_RET_STS_SUCCESS;
694
695 pa_debug.set_err_stack('get_current_project_manager_details');
696
697 BEGIN
698 SELECT ppp.resource_source_id,
699 ppp.project_party_id,
700 ppp.project_role_id,
701 pprt.meaning,
702 pe.full_name
703 INTO x_manager_person_id,
704 x_project_party_id,
705 x_project_role_id,
706 x_project_role_name,
707 x_manager_name
708 FROM pa_project_parties ppp,
709 pa_project_role_types pprt,
710 per_all_people_f pe
711 WHERE ppp.project_id = p_project_id
712 AND ppp.project_role_id = 1
713 AND ppp.project_role_id = pprt.project_role_id
714 AND ppp.resource_type_id = 101
715 AND ppp.resource_source_id = pe.person_id
716 AND TRUNC(SYSDATE) BETWEEN pe.effective_start_date
717 AND pe.effective_end_date
718 AND ppp.object_type = 'PA_PROJECTS'
719 AND TRUNC(SYSDATE) BETWEEN ppp.start_date_active AND NVL(ppp.end_date_active,TRUNC(SYSDATE)+1);
720
721 EXCEPTION WHEN NO_DATA_FOUND THEN
722 SELECT ppp.resource_source_id,
723 ppp.project_party_id,
724 ppp.project_role_id,
725 pprt.meaning,
726 pe.full_name
727 INTO x_manager_person_id,
728 x_project_party_id,
729 x_project_role_id,
730 x_project_role_name,
731 x_manager_name
732 FROM pa_project_parties ppp,
733 pa_project_role_types pprt,
734 per_all_people_f pe
735 WHERE ppp.project_id = p_project_id
736 AND ppp.project_role_id = 1
737 AND ppp.project_role_id = pprt.project_role_id
738 AND ppp.resource_type_id = 101
739 AND ppp.resource_source_id = pe.person_id
740 AND TRUNC(SYSDATE) BETWEEN pe.effective_start_date
741 AND pe.effective_end_date
742 AND ppp.object_type = 'PA_PROJECTS'
743 AND ppp.start_date_active > TRUNC(SYSDATE)
744 AND ppp.start_date_active = (SELECT MIN(ppp1.start_date_active)
745 FROM pa_project_parties ppp1
746 WHERE ppp1.project_id = p_project_id
747 AND ppp1.project_role_id = 1
748 AND ppp1.start_date_active > TRUNC(SYSDATE));
749 END;
750
751 pa_debug.reset_err_stack;
752 EXCEPTION
753 WHEN NO_DATA_FOUND THEN
754 x_return_status := FND_API.G_RET_STS_ERROR;
755 x_error_message_code := 'PA_NO_PROJ_MGR_EXISTS';
756 WHEN OTHERS THEN
757 fnd_msg_pub.add_exc_msg(p_pkg_name => 'PA_PROJECT_PARTIES_UTILS',
758 p_procedure_name => pa_debug.g_err_stack,
759 p_error_text => SUBSTRB(SQLERRM,1,240));
760 RAISE;
761 END GET_CURR_PROJ_MGR_DETAILS;
762
763
764 FUNCTION get_customer_project_party_id (
765 p_project_id IN NUMBER,
766 p_customer_id IN NUMBER) RETURN NUMBER
767
768 IS
769 ret NUMBER;
770 BEGIN
771 SELECT project_party_id
772 INTO ret
773 FROM pa_project_parties p,
774 pa_project_role_types_b r,
775 pa_customers_v c
776 WHERE r.role_party_class = 'CUSTOMER'
777 AND p.project_role_id = r.project_role_id
778 AND p.project_id = p_project_id
779 AND p.resource_type_id = 112
780 AND c.party_id = p.resource_source_id
781
782 AND c.customer_id = p_customer_id;
783
784 RETURN ret;
785 EXCEPTION
786 WHEN NO_DATA_FOUND THEN
787 RETURN NULL;
788 END get_customer_project_party_id;
789
790 PROCEDURE VALIDATE_ROLE_PARTY( p_project_role_id IN NUMBER,
791 p_resource_type_id IN NUMBER DEFAULT 101,
792 p_resource_source_id IN NUMBER,
793 x_error_occured OUT NOCOPY VARCHAR2) IS --File.Sql.39 bug 4440895
794
795 l_party_type VARCHAR2(30) := 'PERSON';
796 l_role_party_class pa_project_role_types_b.role_party_class%TYPE;
797 BEGIN
798 pa_debug.set_err_stack('Validate_role_party');
799
800 -- Check if the resource is a Person/Organization.
801 IF p_resource_type_id = 112 THEN
802 SELECT party_type
803 INTO l_party_type
804 FROM hz_parties
805 WHERE party_id = p_resource_source_id;
806 END IF;
807
808 -- Check if the role is for Person/Organization.
809 SELECT role_party_class
810 INTO l_role_party_class
811 FROM pa_project_role_types_b
812 WHERE project_role_id = p_project_role_id;
813
814 x_error_occured := 'N';
815
816 IF (l_role_party_class = 'PERSON' AND l_party_type <> 'PERSON') OR
817 (l_role_party_class <> 'PERSON' AND l_party_type = 'PERSON') THEN
818 fnd_message.set_name('PA','PA_XC_NO_ROLE_TYPE');
819 fnd_msg_pub.ADD;
820 x_error_occured := 'Y';
821 END IF;
822
823 pa_debug.reset_err_stack;
824 EXCEPTION
825 WHEN OTHERS THEN
826 fnd_msg_pub.add_exc_msg(p_pkg_name => 'PA_PROJECT_PARTIES_UTILS',
827 p_procedure_name => pa_debug.g_err_stack,
828 p_error_text => SUBSTRB(SQLERRM,1,240));
829 RAISE;
830 END VALIDATE_ROLE_PARTY;
831
832
833 FUNCTION GET_PROJECT_MANAGER( p_project_id IN NUMBER)
834 RETURN NUMBER
835 IS
836
837 CURSOR C1 (c_as_of_date DATE) IS
838 Select PPP.RESOURCE_SOURCE_ID
839 FROM PA_PROJECT_PARTIES PPP ,
840 --PA_PROJECT_ROLE_TYPES PPRT --bug 4004821
841 PA_PROJECT_ROLE_TYPES_B PPRT
842 WHERE
843 PPP.PROJECT_ID = p_project_id
844 AND PPP.PROJECT_ROLE_ID = PPRT.PROJECT_ROLE_ID
845 AND ppp.resource_type_id = 101 --Added this condition to improve performance. Bug:4752054
846 AND PPRT.PROJECT_ROLE_TYPE ='PROJECT MANAGER'
847 AND trunc(c_as_of_date) between trunc(PPP.start_date_active)
848 AND NVL(trunc(PPP.end_date_active),c_as_of_date);
849
850 l_return_value NUMBER(10);
851 l_project_finish_date DATE;
852 l_project_start_date DATE;
853
854 BEGIN
855
856 PA_PROJECT_PARTIES_UTILS.G_PROJECT_MANAGER_ID := null;
857
858 l_project_finish_date := PA_PROJECT_DATES_UTILS.Get_Project_Finish_Date(p_project_id);
859
860 -- return project manager as of project finish date for past projects
861 IF l_project_finish_date < sysdate THEN
862 OPEN C1 (l_project_finish_date);
863 FETCH C1 INTO l_return_value;
864 CLOSE C1;
865 ELSE
866 -- Bug 4361712
867 l_project_start_date := PA_PROJECT_DATES_UTILS.Get_Project_Start_Date(p_project_id);
868
869 -- return project manager as of project start date for future projects
870 IF l_project_start_date > sysdate THEN
871 OPEN C1 (l_project_start_date);
872 FETCH C1 INTO l_return_value;
873 CLOSE C1;
874 -- return project manager as of today for current projects
875 ELSE
876 OPEN C1 (sysdate);
877 FETCH C1 INTO l_return_value;
878 CLOSE C1;
879 END IF;
880
881 END IF;
882
883 PA_PROJECT_PARTIES_UTILS.G_PROJECT_MANAGER_ID := l_return_value;
884 RETURN l_return_value;
885
886 END;
887
888 FUNCTION GET_PROJECT_MANAGER_NAME
889 RETURN VARCHAR2
890 IS
891
892 CURSOR C1(c_person_id NUMBER)
893 IS
894 Select full_name
895 FROM per_all_people_f
896 WHERE PERSON_ID = c_person_id
897 AND trunc(SYSDATE) between trunc(effective_start_date) and trunc(effective_end_date); -- Bug 3283351
898
899 l_return_value VARCHAR2(250);
900 BEGIN
901
902 IF PA_PROJECT_PARTIES_UTILS.G_PROJECT_MANAGER_ID is not null THEN
903
904 OPEN C1(PA_PROJECT_PARTIES_UTILS.G_PROJECT_MANAGER_ID);
905 FETCH C1 INTO l_return_value;
906 CLOSE C1;
907 END IF;
908
909 RETURN l_return_value;
910 END;
911
912 FUNCTION GET_PROJECT_MANAGER_NAME( p_project_id IN NUMBER)
913 RETURN VARCHAR2
914 IS
915
916 CURSOR C1 (c_as_of_date DATE) IS
917 Select ppf.full_name
918 FROM PA_PROJECT_PARTIES PPP,
919 --PA_PROJECT_ROLE_TYPES PPRT, --bug 4004821
920 PA_PROJECT_ROLE_TYPES_B PPRT,
921 per_all_people_f PPF
922 WHERE
923 PPP.PROJECT_ID = p_project_id
924 AND PPP.PROJECT_ROLE_ID = PPRT.PROJECT_ROLE_ID
925 AND ppp.resource_type_id = 101 --Added this condition to improve performance. Bug:4752054
926 AND PPRT.PROJECT_ROLE_TYPE ='PROJECT MANAGER'
927 AND trunc(c_as_of_date) between trunc(PPP.start_date_active)
928 AND NVL(trunc(PPP.end_date_active),c_as_of_date)
929 AND ppf.person_id = ppp.resource_source_id
930 AND trunc(c_as_of_date) between trunc(PPF.effective_start_date) AND trunc(PPF.effective_end_date); -- Added for bug 3283351
931
932 l_return_value VARCHAR2(250);
933 l_project_finish_date DATE;
934 l_project_start_date DATE;
935
936 BEGIN
937
938 l_project_finish_date := PA_PROJECT_DATES_UTILS.Get_Project_Finish_Date(p_project_id);
939
940 -- return project manager as of project finish date for past projects
941 IF l_project_finish_date < sysdate THEN
942 OPEN C1 (l_project_finish_date);
943 FETCH C1 INTO l_return_value;
944 CLOSE C1;
945 ELSE
946
947 -- 4361712
948 l_project_start_date := PA_PROJECT_DATES_UTILS.Get_Project_Start_Date(p_project_id);
949
950 -- return project manager as of project start date for future projects
951 IF l_project_start_date > sysdate THEN
952 OPEN C1 (l_project_start_date);
953 FETCH C1 INTO l_return_value;
954 CLOSE C1;
955 -- return project manager as of today for current projects
956 ELSE
957 OPEN C1 (sysdate);
958 FETCH C1 INTO l_return_value;
959 CLOSE C1;
960 END IF;
961
962 END IF;
963
964 RETURN l_return_value;
965 END;
966
967 /* Added the following API for bug #2111806.
968 This API will check if a Project Manager is available for the entire
969 duration of a Project.
970 */
971
972 PROCEDURE VALIDATE_MANAGER_DATE_RANGE( p_mode IN VARCHAR2,
973 p_project_id IN NUMBER,
974 x_start_no_mgr_date OUT NOCOPY DATE, --File.Sql.39 bug 4440895
975 x_end_no_mgr_date OUT NOCOPY DATE, --File.Sql.39 bug 4440895
976 x_error_occured OUT NOCOPY VARCHAR2) IS --File.Sql.39 bug 4440895
977 l_error_occured VARCHAR2(50);
978 l_proj_status pa_projects_all.project_status_code%TYPE;
979 l_proj_type_class pa_project_types_all.project_type_class_code%TYPE;
980 l_proj_type pa_project_types_all.project_type%TYPE; -- Added for bug#5098966
981 l_proj_start_date pa_projects_all.start_date%TYPE;
982 l_proj_end_date pa_projects_all.completion_date%TYPE;
983 l_person_id pa_project_players.person_id%TYPE;
984 l_party_id pa_project_parties.project_party_id%TYPE;
985 l_start_date pa_project_players.start_date_active%TYPE;
986 l_end_date pa_project_players.end_date_active%TYPE;
987 l_end_date_old pa_project_players.end_date_active%TYPE;
988
989 /* Changing the query to base table to improve performance instead of pa_projects_v view. Bug no. 4940945*/
990 CURSOR c_prj IS
991 select ps.project_system_status_code
992 ,type.project_type_class_code
993 ,proj.project_type -- Added for bug#5098966
994 ,trunc(proj.start_date)
995 ,trunc(proj.completion_date)
996 from pa_projects_all proj
997 ,pa_project_statuses ps
998 ,pa_project_types type
999 where proj.project_status_code = ps.project_status_code
1000 and proj.project_type = type.project_type
1001 and proj.project_id = p_project_id
1002 and ps.STATUS_TYPE = 'PROJECT';
1003
1004 /* changes end for Bug 4940945 */
1005
1006 /* commented by sunkalya for fix bug#4636169
1007 CURSOR c_project_players IS
1008 select person_id
1009 ,start_date_active
1010 ,end_date_active
1011 from pa_project_players
1012 where project_id = p_project_id
1013 and project_role_type='PROJECT MANAGER'
1014 order by start_date_active;
1015
1016 CURSOR c_project_parties IS
1017 select project_party_id
1018 ,start_date_active
1019 ,end_date_active
1020 from pa_project_parties
1021 where project_id = p_project_id
1022 and project_role_id = 1
1023 order by start_date_active;
1024 */ --End of commenting by sunkalya for bug#4636169
1025
1026 BEGIN
1027
1028 pa_debug.set_err_stack('Validate Manager Date Range');
1029
1030 IF p_project_id IS NOT NULL THEN
1031 OPEN c_prj;
1032 -- Added l_proj_type for bug#5098966
1033 FETCH c_prj INTO l_proj_status, l_proj_type_class, l_proj_type, l_proj_start_date, l_proj_end_date;
1034 CLOSE c_prj;
1035 END IF;
1036
1037 -- begin changes for bug 4636169 by sunkalya
1038 DECLARE
1039 CURSOR c_project_players IS
1040 select person_id
1041 ,trunc(start_date_active)
1042 ,trunc(end_date_active)
1043 from pa_project_players
1044 where project_id = p_project_id
1045 and project_role_type='PROJECT MANAGER'
1046 AND NOT (
1047 exists(
1048 SELECT 'y' FROM dual WHERE trunc(start_date_active) > trunc(l_proj_end_date)
1049 )
1050 OR
1051 exists(
1052 SELECT 'y' FROM dual WHERE trunc(end_date_active) < trunc(l_proj_start_date)
1053 )
1054 )
1055 order by start_date_active;
1056
1057 CURSOR c_project_parties IS
1058 select project_party_id
1059 ,trunc(start_date_active)
1060 ,trunc(end_date_active)
1061 from pa_project_parties
1062 where project_id = p_project_id
1063 and project_role_id = 1
1064 AND NOT (
1065 exists(
1066 SELECT 'y' FROM dual WHERE trunc(start_date_active) > trunc(l_proj_end_date)
1067 )
1068 OR
1069 exists(
1070 SELECT 'y' FROM dual WHERE trunc(end_date_active) < trunc(l_proj_start_date)
1071 )
1072 )
1073 order by start_date_active;
1074
1075 BEGIN --This begin added for Bug#4636169 by sunkalya
1076
1077 /* Do the checking for the Manager date only for an Approved Contract Type project. */
1078 IF (nvl(l_proj_type_class,'NONE') = 'CONTRACT' AND
1079 nvl(l_proj_status,'UNAPPROVED') = 'APPROVED') AND
1080 nvl(l_proj_type, 'AWARD_PROJECT') <> 'AWARD_PROJECT' THEN -- Added for bug#5098966
1081
1082
1083 OPEN c_project_players;
1084 OPEN c_project_parties;
1085 LOOP
1086 IF p_mode = 'AMG' THEN
1087 IF P_DEBUG_MODE = 'Y' THEN
1088 pa_debug.write('VALIDATE_MANAGER_DATE_RANGE: ','Mode is AMG',3 );
1089 END IF;
1090 FETCH c_project_players INTO l_person_id,l_start_date,l_end_date;
1091 ELSIF p_mode = 'SS' THEN
1092 IF P_DEBUG_MODE = 'Y' THEN
1093 pa_debug.write('VALIDATE_MANAGER_DATE_RANGE: ','Mode is SS',3 );
1094 END IF;
1095 FETCH c_project_parties INTO l_party_id,l_start_date,l_end_date;
1096 END IF;
1097
1098 IF (l_proj_end_date is null) THEN
1099
1100 IF (( p_mode = 'AMG' and c_project_players%NOTFOUND and l_end_date_old is not null) OR
1101 ( p_mode = 'SS' and c_project_parties%NOTFOUND and l_end_date_old is not null))THEN
1102 x_start_no_mgr_date := l_end_date_old+1;
1103 x_end_no_mgr_date := l_proj_end_date;
1104 l_error_occured := 'PA_PR_NO_MGR_DATE_RANGE';
1105 EXIT;
1106 END IF;
1107 IF (l_start_date > l_proj_start_date) THEN
1108 x_start_no_mgr_date := l_proj_start_date;
1109 x_end_no_mgr_date := l_start_date-1;
1110 l_error_occured := 'PA_PR_NO_MGR_DATE_RANGE';
1111 EXIT;
1112 ELSE
1113 IF (l_end_date is null) THEN
1114 EXIT ;
1115 ELSE
1116 l_proj_start_date :=l_end_date + 1;
1117 l_end_date_old :=l_end_date;
1118 END IF;
1119 END IF;
1120 END IF;
1121
1122 IF (l_proj_end_date is not null) THEN
1123 IF (( p_mode = 'AMG' and c_project_players%NOTFOUND and l_end_date_old <> l_proj_end_date) OR
1124 ( p_mode = 'SS' and c_project_parties%NOTFOUND and l_end_date_old <> l_proj_end_date)) THEN
1125 x_start_no_mgr_date := l_end_date_old+1;
1126 x_end_no_mgr_date := l_proj_end_date;
1127 l_error_occured := 'PA_PR_NO_MGR_DATE_RANGE';
1128 EXIT;
1129 END IF;
1130 --bug 9543613 - start
1131 IF (l_start_date is null and l_end_date is null) THEN
1132 x_start_no_mgr_date := l_proj_start_date;
1133 x_end_no_mgr_date := l_proj_end_date;
1134 l_error_occured := 'PA_PR_NO_MGR_DATE_RANGE';
1135 EXIT;
1136 ELSE
1137 --bug 9543613 - end
1138 IF (l_start_date > l_proj_start_date) THEN
1139 x_start_no_mgr_date := l_proj_start_date;
1140 x_end_no_mgr_date := l_start_date-1;
1141 l_error_occured := 'PA_PR_NO_MGR_DATE_RANGE';
1142 EXIT;
1143 ELSE
1144 IF (l_end_date is null or l_end_date >=l_proj_end_date) THEN
1145 EXIT ;
1146 ELSE
1147 IF (l_end_date <l_proj_end_date) THEN
1148 l_proj_start_date :=l_end_date + 1;
1149 l_end_date_old := l_end_date;
1150 END IF;
1151 END IF;
1152 END IF;
1153 --bug 9543613 - start
1154 END IF;
1155 --bug 9543613 - end
1156 END IF;
1157 END LOOP;
1158
1159 CLOSE c_project_players;
1160 CLOSE c_project_parties;
1161 END IF;
1162
1163 IF P_DEBUG_MODE = 'Y' THEN
1164 pa_debug.write('VALIDATE_MANAGER_DATE_RANGE: ','l_error_occured - '||l_error_occured,3 );
1165 END IF;
1166 x_error_occured := l_error_occured;
1167 pa_debug.reset_err_stack;
1168
1169 EXCEPTION
1170 WHEN NO_DATA_FOUND THEN
1171 x_error_occured := 'N';
1172 WHEN OTHERS THEN
1173 x_error_occured := 'Y';
1174 IF c_project_players%ISOPEN THEN
1175 CLOSE c_project_players;
1176 END IF;
1177 IF c_project_parties%ISOPEN THEN
1178 CLOSE c_project_parties;
1179 END IF;
1180 fnd_msg_pub.add_exc_msg(p_pkg_name => 'VALIDATE_MANAGER_DATE_RANGE',
1181 p_procedure_name => pa_debug.g_err_stack,
1182 p_error_text => SUBSTRB(SQLERRM,1,240));
1183 RAISE;
1184
1185 END; --This END is for the BEGIN added by sunkalya for Bug#4636169
1186 END VALIDATE_MANAGER_DATE_RANGE;
1187
1188
1189 /* Added the following API for bug #2111806.
1190 This API will check if atleast one Project Manager exists
1191 for the Project if it is an Approved Contract Project.
1192 */
1193
1194 PROCEDURE VALIDATE_ONE_MANAGER_EXISTS( p_project_id IN NUMBER,
1195 x_return_status OUT NOCOPY VARCHAR2, --File.Sql.39 bug 4440895
1196 x_msg_count OUT NOCOPY NUMBER, --File.Sql.39 bug 4440895
1197 x_msg_data OUT NOCOPY VARCHAR2) IS --File.Sql.39 bug 4440895
1198 /* Changing the query to base tables instaed of pa_projects_v view to improve perfromance. Bug 4940945 */
1199 CURSOR c_prj IS
1200 select ps.project_system_status_code
1201 ,type.project_type_class_code
1202 from pa_projects_all proj
1203 ,pa_project_statuses ps
1204 ,pa_project_types type
1205 where proj.project_status_code = ps.project_status_code
1206 and proj.project_type=type.project_type
1207 and proj.project_id = p_project_id
1208 and ps.STATUS_TYPE ='PROJECT';
1209 /* changes end for Bug 4940945 */
1210
1211 CURSOR c_prj_count IS
1212 select count(*)
1213 from pa_project_parties
1214 where project_id = p_project_id
1215 and project_role_id = 1;
1216
1217 l_proj_status pa_projects_all.project_status_code%TYPE;
1218 l_proj_type_class pa_project_types_all.project_type_class_code%TYPE;
1219 l_prj_mgr_count NUMBER := 0;
1220 l_start_no_mgr_date DATE;
1221 l_end_no_mgr_date DATE;
1222
1223
1224 BEGIN
1225
1226 pa_debug.set_err_stack('VALIDATE_ONE_MANAGER_EXISTS');
1227 x_msg_count := 0;
1228 x_return_status := FND_API.G_RET_STS_SUCCESS;
1229
1230 /* Do the checking for the Manager date only for an Approved Contract Type project. */
1231 IF p_project_id IS NOT NULL THEN
1232 OPEN c_prj;
1233 FETCH c_prj INTO l_proj_status, l_proj_type_class;
1234 CLOSE c_prj;
1235 END IF;
1236
1237 /* The check has to be done only for an Approved Contract Type project. */
1238 IF (nvl(l_proj_type_class,'NONE') = 'CONTRACT' AND
1239 nvl(l_proj_status,'UNAPPROVED') = 'APPROVED') THEN
1240 IF P_DEBUG_MODE = 'Y' THEN
1241 pa_debug.write('VALIDATE_ONE_MANAGER_EXISTS: ','This is an Approved Contract Project',3 );
1242 END IF;
1243 OPEN c_prj_count;
1244 FETCH c_prj_count INTO l_prj_mgr_count;
1245 CLOSE c_prj_count;
1246 IF l_prj_mgr_count = 0 THEN
1247 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
1248 pa_utils.add_message
1249 ( p_app_short_name => 'PA'
1250 ,p_msg_name => 'PA_PR_INSUF_PROJ_MGR'
1251 );
1252 x_return_status := FND_API.G_RET_STS_ERROR;
1253 x_msg_count := 1;
1254 x_msg_data := 'PA_PR_INSUF_PROJ_MGR';
1255 END IF;
1256 END IF;
1257 END IF;
1258 pa_debug.reset_err_stack;
1259
1260 EXCEPTION
1261
1262 WHEN OTHERS THEN
1263 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1264 x_msg_count := 1;
1265 x_msg_data := SQLERRM;
1266 FND_MSG_PUB.add_exc_msg
1267 ( p_pkg_name => 'PA_PROJECT_PARTIES_UTILS.VALIDATE_ONE_MANAGER_EXISTS'
1268 ,p_procedure_name => pa_debug.G_Err_Stack );
1269 IF P_DEBUG_MODE = 'Y' THEN
1270 pa_debug.write('VALIDATE_ONE_MANAGER_EXISTS: ', SQLERRM, 3);
1271 pa_debug.write('VALIDATE_ONE_MANAGER_EXISTS: ', pa_debug.G_Err_Stack, 3);
1272 END IF;
1273 pa_debug.reset_err_stack;
1274 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1275
1276 END VALIDATE_ONE_MANAGER_EXISTS;
1277
1278 -- API name : get_current_project_manager
1279 -- Type : Public
1280 -- Pre-reqs : None.
1281 -- Parameters :
1282 -- p_project_id IN NUMBER
1283 -- Return : NUMBER
1284 -- Details: This function is created so as to return the project manager who is
1285 -- active on the project as on the sysdate.
1286 -- History
1287 --
1288 -- 23-May-2005 adarora - Created
1289 --
1290 FUNCTION GET_CURRENT_PROJECT_MANAGER ( p_project_id IN NUMBER)
1291 RETURN NUMBER
1292 IS
1293
1294 CURSOR C1 (c_as_of_date DATE) IS
1295 Select PPP.RESOURCE_SOURCE_ID
1296 FROM PA_PROJECT_PARTIES PPP ,
1297 --PA_PROJECT_ROLE_TYPES PPRT --bug 4004821
1298 PA_PROJECT_ROLE_TYPES_B PPRT
1299 WHERE
1300 PPP.PROJECT_ID = p_project_id
1301 AND PPP.PROJECT_ROLE_ID = PPRT.PROJECT_ROLE_ID
1302 AND ppp.resource_type_id = 101 --Added this condition to improve performance. Bug:4752054
1303 AND PPRT.PROJECT_ROLE_TYPE ='PROJECT MANAGER'
1304 AND trunc(c_as_of_date) between trunc(PPP.start_date_active)
1305 AND NVL(trunc(PPP.end_date_active),c_as_of_date);
1306
1307 l_return_value NUMBER(10);
1308 BEGIN
1309
1310 PA_PROJECT_PARTIES_UTILS.G_PROJECT_MANAGER_ID := null;
1311
1312 OPEN C1 (sysdate);
1313 FETCH C1 INTO l_return_value;
1314 CLOSE C1;
1315
1316
1317 PA_PROJECT_PARTIES_UTILS.G_PROJECT_MANAGER_ID := l_return_value;
1318 RETURN l_return_value;
1319
1320 END GET_CURRENT_PROJECT_MANAGER;
1321
1322 -- API name : GET_CURRENT_PROJ_MANAGER_NAME
1323 -- Type : Public
1324 -- Pre-reqs : None.
1325 -- Parameters :
1326 -- p_project_id IN NUMBER
1327 -- Return : VARCHAR2
1328 -- Details: This function is created so as to return the project manager name who is
1329 -- active on the project as on the sysdate.
1330 -- History
1331 --
1332 -- 23-May-2005 adarora - Created
1333 --
1334
1335 FUNCTION GET_CURRENT_PROJ_MANAGER_NAME( p_project_id IN NUMBER)
1336 RETURN VARCHAR2
1337 IS
1338
1339 CURSOR C1 (c_as_of_date DATE) IS
1340 Select ppf.full_name
1341 FROM PA_PROJECT_PARTIES PPP,
1342 --PA_PROJECT_ROLE_TYPES PPRT, --bug 4004821
1343 PA_PROJECT_ROLE_TYPES_B PPRT,
1344 per_all_people_f PPF
1345 WHERE
1346 PPP.PROJECT_ID = p_project_id
1347 AND PPP.PROJECT_ROLE_ID = PPRT.PROJECT_ROLE_ID
1348 AND ppp.resource_type_id = 101 --Added this condition to improve performance. Bug:4752054
1349 AND PPRT.PROJECT_ROLE_TYPE ='PROJECT MANAGER'
1350 AND trunc(c_as_of_date) between trunc(PPP.start_date_active)
1351 AND NVL(trunc(PPP.end_date_active),c_as_of_date)
1352 AND ppf.person_id = ppp.resource_source_id
1353 AND trunc(c_as_of_date) between trunc(PPF.effective_start_date) AND trunc(PPF.effective_end_date) -- Added for bug 3283351
1354 and ppp.object_type = 'PA_PROJECTS' --Added for Bug 10071170
1355 and ppp.object_id = p_project_id; --Added for Bug 10071170
1356
1357 l_return_value VARCHAR2(250);
1358
1359 BEGIN
1360
1361
1362
1363 OPEN C1 (sysdate);
1364 FETCH C1 INTO l_return_value;
1365 CLOSE C1;
1366
1367 RETURN l_return_value;
1368 END GET_CURRENT_PROJ_MANAGER_NAME;
1369
1370 END PA_PROJECT_PARTIES_UTILS;
1371