DBA Data[Home] [Help]

PACKAGE BODY: APPS.PA_PROJECT_PARTIES_UTILS

Source


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