1 PACKAGE BODY pa_assignment_utils AS
2 -- $Header: PARAUTLB.pls 120.10.12010000.2 2008/09/23 17:22:56 jcgeorge ship $
3
4 --
5 -- PROCEDURE
6 -- Check_Status_Is_In_use
7 -- PURPOSE
8 -- This procedure Checks whether a given status is used in
9 -- Assignments and assignment schedules
10 -- HISTORY
11 -- 16-JUL-2000 R. Krishnamurthy Created
12 --
13 li_message_level NUMBER := 1;
14
15 PROCEDURE check_status_is_in_use
16 ( p_status_code IN pa_project_statuses.project_status_code%TYPE
17 ,x_in_use_flag OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
18 ,x_return_status OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
19 ,x_error_message_code OUT NOCOPY VARCHAR2) IS --File.Sql.39 bug 4440895
20 BEGIN
21 pa_debug.init_err_stack ('pa_assignment_utils.check_status_is_in_use');
22 x_error_message_code := NULL;
23 x_in_use_flag := 'N';
24 x_return_status := FND_API.G_RET_STS_SUCCESS;
25
26 --change due to performance reason
27 /*
28 SELECT 'Y', 'PA_STATUS_EXIST_IN_ASGMT'
29 INTO x_in_use_flag, x_error_message_code
30 FROM dual
31 WHERE EXISTS
32 (SELECT 'x' FROM pa_project_assignments
33 WHERE status_code = p_status_code)
34 OR EXISTS
35 (SELECT 'x' FROM pa_schedules
36 WHERE status_code = p_status_code)
37 OR EXISTS
38 (SELECT 'x' FROM pa_project_assignments
39 WHERE apprvl_status_code = p_status_code);
40
41 SELECT 'Y', 'PA_STATUS_EXIST_IN_ASGMT'
42 INTO x_in_use_flag, x_error_message_code
43 FROM pa_project_assignments ppa,
44 pa_schedules ps
45 WHERE
46 ( ( ppa.status_code = p_status_code)
47 OR ( ps.status_code = p_status_code)
48 OR ( ppa.apprvl_status_code = p_status_code))
49 AND rownum = 1;
50 */
51
52 BEGIN
53 SELECT 'Y', 'PA_STATUS_EXIST_IN_ASGMT'
54 INTO x_in_use_flag, x_error_message_code
55 FROM pa_project_assignments
56 WHERE status_code = p_status_code
57 AND rownum = 1;
58 EXCEPTION
59 WHEN NO_DATA_FOUND THEN
60 null;
61 END;
62
63 BEGIN
64 IF x_in_use_flag = 'N' THEN
65 SELECT 'Y', 'PA_STATUS_EXIST_IN_ASGMT'
66 INTO x_in_use_flag, x_error_message_code
67 FROM pa_project_assignments
68 WHERE apprvl_status_code = p_status_code
69 AND rownum = 1;
70 END IF;
71 EXCEPTION
72 WHEN NO_DATA_FOUND THEN
73 null;
74 END;
75
76 BEGIN
77 IF x_in_use_flag = 'N' THEN
78 SELECT 'Y', 'PA_STATUS_EXIST_IN_ASGMT'
79 INTO x_in_use_flag, x_error_message_code
80 FROM pa_schedules
81 WHERE status_code = p_status_code
82 AND rownum = 1;
83 END IF;
84 EXCEPTION
85 WHEN NO_DATA_FOUND THEN
86 null;
87 END;
88
89 pa_debug.reset_err_stack;
90 EXCEPTION
91 WHEN NO_DATA_FOUND THEN
92 x_return_status := FND_API.G_RET_STS_SUCCESS;
93 x_in_use_flag := 'N';
94
95 -- 4537865 : RESET Out params to proper values
96 -- Make x_error_message_code as NULL as in this case we consider return status as 'S'
97
98 x_error_message_code := NULL ;
99
100 -- 4537865 : End
101
102 pa_debug.reset_err_stack;
103 WHEN OTHERS THEN
104 -- 4537865 : RESET Out params to proper values
105 x_error_message_code := SQLCODE ;
106 x_in_use_flag := NULL ;
107 -- 4537865 : End
108
109 fnd_msg_pub.add_exc_msg
110 (p_pkg_name => 'PA_ASSIGNMENT_UTILS',
111 p_procedure_name => pa_debug.g_err_stack );
112 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
113 RAISE;
114 END check_status_is_in_use;
115
116 --
117 -- PROCEDURE
118 -- Validate_Asgmt_Competency
119 -- PURPOSE
120 -- This procedure validates the competencies for an assignment
121 -- HISTORY
122 -- 17-JUL-2000 R. Krishnamurthy Created
123 --
124 -- 27-Jul-2001 Vijay Ranganathan Changed API Validate_Asgmt_Competency
125 -- to get project business group
126 -- BUG: 1904822
127 PROCEDURE Validate_Asgmt_Competency
128 ( p_project_id IN pa_projects_all.project_id%TYPE
129 ,p_assignment_id IN pa_project_assignments.assignment_id%TYPE
130 ,p_competence_id IN per_competences.competence_id%TYPE
131 ,x_return_status OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
132 ,x_error_message_code OUT NOCOPY VARCHAR2) IS --File.Sql.39 bug 4440895
133 l_comp_bg_id NUMBER := 0;
134 l_proj_bg_id NUMBER := 0;
135 CURSOR l_bg_csr IS
136 SELECT business_group_id FROM per_competences
137 WHERE competence_id = p_competence_id;
138
139 BEGIN
140 pa_debug.init_err_stack ('pa_assignment_utils.Validate_Asgmt_Competency');
141 OPEN l_bg_csr;
142 FETCH l_bg_csr INTO l_comp_bg_id;
143 IF l_bg_csr%NOTFOUND THEN
144 x_return_status := FND_API.G_RET_STS_ERROR;
145 x_error_message_code := 'PA_COMPETENCY_INVALID_AMBIGOUS';
146 CLOSE l_bg_csr;
147 pa_debug.reset_err_stack;
148 RETURN;
149 ELSE
150 CLOSE l_bg_csr;
151 END IF;
152
153 --BUG: 1904822 Get project business group id instead of from pa_implementations
154 IF ( l_comp_bg_id IS NOT NULL
155 AND l_comp_bg_id <> pa_project_utils2.Get_project_business_group ( p_project_id)) THEN
156 x_return_status := FND_API.G_RET_STS_ERROR;
157 x_error_message_code := 'PA_ASGMT_COMPETENCY_INVALID';
158 pa_debug.reset_err_stack;
159 RETURN;
160 END IF;
161 x_return_status := FND_API.G_RET_STS_SUCCESS;
162 pa_debug.reset_err_stack;
163 EXCEPTION
164 WHEN OTHERS THEN
165 -- 4537865 : RESET Out params to proper values
166 x_error_message_code := SQLCODE ;
167 -- 4537865 : End
168
169 fnd_msg_pub.add_exc_msg
170 (p_pkg_name => 'PA_ASSIGNMENT_UTILS',
171 p_procedure_name => pa_debug.g_err_stack );
172 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
173 RAISE;
174 END Validate_Asgmt_Competency;
175
176 -- PROCEDURE
177 -- Get_Def_Asgmt_Statuses
178 -- This procedure returns the default assignment statuses
179 -- 17-JUL-2000 R. Krishnamurthy Created
180
181 PROCEDURE Get_Def_Asgmt_Statuses
182 (x_starting_oa_status OUT NOCOPY pa_project_statuses.project_status_code%TYPE, --File.Sql.39 bug 4440895
183 x_starting_sa_status OUT NOCOPY pa_project_statuses.project_status_code%TYPE, --File.Sql.39 bug 4440895
184 x_starting_fa_status OUT NOCOPY pa_project_statuses.project_status_code%TYPE, --File.Sql.39 bug 4440895
185 x_return_status OUT NOCOPY VARCHAR2, --File.Sql.39 bug 4440895
186 x_error_message_code OUT NOCOPY VARCHAR2) IS --File.Sql.39 bug 4440895
187
188 BEGIN
189 pa_debug.init_err_stack ('pa_assignment_utils.Get_Def_Asgmt_Statuses');
190 x_starting_oa_status := fnd_profile.value ('DEF_OA_STARTING_STATUS');
191 x_starting_sa_status := fnd_profile.value ('DEF_SA_STARTING_STATUS');
192 x_starting_fa_status := fnd_profile.value ('DEF_FA_STATUS');
193 -- While it is ok for the other two statuses to be not defined,
194 -- an installation must always have a default filled status defined
195 -- in order for the assignments to be marked as filled whenever
196 -- an open assignment is filled with a resource
197
198 IF x_starting_fa_status IS NULL THEN
199 x_return_status := FND_API.G_RET_STS_ERROR;
200 x_error_message_code := 'PA_NO_DEF_FA_STATUS';
201 ELSE
202 x_return_status := FND_API.G_RET_STS_SUCCESS;
203 END IF;
204 pa_debug.reset_err_stack;
205 EXCEPTION
206 WHEN OTHERS THEN
207
208 -- 4537865 : RESET OUT params to proper values
209 x_starting_oa_status := NULL ;
210 x_starting_sa_status := NULL ;
211 x_starting_fa_status := NULL ;
212 x_error_message_code := SQLCODE;
213 -- 4537865 :ENd
214
215 fnd_msg_pub.add_exc_msg
216 (p_pkg_name => 'PA_ASSIGNMENT_UTILS',
217 p_procedure_name => pa_debug.g_err_stack );
218 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
219 RAISE;
220 END Get_Def_Asgmt_Statuses;
221
222 -- FUNCTION
223 -- Get_project_id
224 -- This function returns the project id for a given assignment
225
226 -- 17-JUL-2000 R. Krishnamurthy Created
227 FUNCTION Get_Project_Id (p_assignment_id IN NUMBER) RETURN NUMBER IS
228 l_project_id NUMBER ;
229 BEGIN
230 pa_debug.init_err_stack ('pa_assignment_utils.Get_Project_Id');
231 SELECT project_id
232 INTO l_project_id
233 FROM pa_project_assignments
234 WHERE assignment_id = p_assignment_id ;
235 pa_debug.reset_err_stack;
236 RETURN l_project_id ;
237 EXCEPTION
238 WHEN NO_DATA_FOUND THEN
239 RETURN NULL;
240 WHEN OTHERS THEN
241 fnd_msg_pub.add_exc_msg
242 (p_pkg_name => 'PA_ASSIGNMENT_UTILS',
243 p_procedure_name => pa_debug.g_err_stack );
244 RAISE;
245 END Get_Project_Id;
246
247 -- This function returns whether a given assignment status is
248 -- a confirmed status or not
249 -- 18-JUL-2000 R. Krishnamurthy Created
250 FUNCTION Is_Confirmed_Status
251 (p_status_code IN pa_project_statuses.project_status_code%TYPE ,
252 p_status_type IN pa_project_statuses.status_type%TYPE )
253 return VARCHAR2 IS
254 BEGIN
255 RETURN check_input_system_status (
256 p_status_code,
257 p_status_type,
258 'STAFFED_ASGMT_CONF');
259 EXCEPTION
260 WHEN OTHERS THEN
261 RAISE;
262 END Is_Confirmed_Status ;
263
264 -- This function returns whether a given assignment status is
265 -- a Provisional status or not
266 -- 18-JUL-2000 R. Krishnamurthy Created
267 FUNCTION Is_Provisional_Status
268 (p_status_code IN pa_project_statuses.project_status_code%TYPE ,
269 p_status_type IN pa_project_statuses.status_type%TYPE )
270 return VARCHAR2 IS
271 BEGIN
272 RETURN check_input_system_status (
273 p_status_code,
274 p_status_type,
275 'STAFFED_ASGMT_PROV');
276 EXCEPTION
277 WHEN OTHERS THEN
278 RAISE;
279 END Is_provisional_status;
280
281 -- This function returns whether a given assignment status is
282 -- a Filled status or not
283 -- 18-JUL-2000 R. Krishnamurthy Created
284 FUNCTION Is_Asgmt_Filled
285 (p_status_code IN pa_project_statuses.project_status_code%TYPE ,
286 p_status_type IN pa_project_statuses.status_type%TYPE )
287 return VARCHAR2 IS
288 BEGIN
289 RETURN check_input_system_status (
290 p_status_code,
291 p_status_type,
292 'OPEN_ASGMT_FILLED');
293 EXCEPTION
294 WHEN OTHERS THEN
295 RAISE;
296 END Is_Asgmt_Filled ;
297
298 -- This function returns whether a given assignment status is
299 -- an Open status or not
300 -- 18-JUL-2000 R. Krishnamurthy Created
301 FUNCTION Is_Asgmt_In_Open_Status
302 (p_status_code IN pa_project_statuses.project_status_code%TYPE ,
303 p_status_type IN pa_project_statuses.status_type%TYPE )
304 return VARCHAR2 IS
305 BEGIN
306 RETURN check_input_system_status (
307 p_status_code,
308 p_status_type,
309 'OPEN_ASGMT');
310 EXCEPTION
311 WHEN OTHERS THEN
312 RAISE;
313 END Is_Asgmt_In_Open_Status ;
314
315 -- This function returns whether a given open assignment status is
316 -- a cancelled status or not
317 -- 18-JUL-2000 R. Krishnamurthy Created
318 FUNCTION Is_Open_Asgmt_Cancelled
319 (p_status_code IN pa_project_statuses.project_status_code%TYPE ,
320 p_status_type IN pa_project_statuses.status_type%TYPE )
321 return VARCHAR2 IS
322 BEGIN
323 RETURN check_input_system_status (
324 p_status_code,
325 p_status_type,
326 'OPEN_ASGMT_CANCEL');
327 EXCEPTION
328 WHEN OTHERS THEN
329 RAISE;
330 END Is_Open_Asgmt_Cancelled ;
331
332 -- This function returns whether a given staffed assignment status is
333 -- a cancelled status or not
334 -- 18-JUL-2000 R. Krishnamurthy Created
335 FUNCTION Is_Staffed_Asgmt_Cancelled
336 (p_status_code IN pa_project_statuses.project_status_code%TYPE ,
337 p_status_type IN pa_project_statuses.status_type%TYPE )
338 return VARCHAR2 IS
339 BEGIN
340 RETURN check_input_system_status (
341 p_status_code,
342 p_status_type,
343 'STAFFED_ASGMT_CANCEL');
344 EXCEPTION
345 WHEN OTHERS THEN
346 RAISE;
347 END Is_Staffed_Asgmt_Cancelled ;
348
349 -- This function returns whether a given status is
350 -- has the specified system status
351 -- 18-JUL-2000 R. Krishnamurthy Created
352 FUNCTION Check_input_system_status
353 (p_status_code IN pa_project_statuses.project_status_code%TYPE ,
354 p_status_type IN pa_project_statuses.status_type%TYPE ,
355 p_in_system_status_code IN pa_project_statuses.project_system_status_code%TYPE)
356 RETURN VARCHAR2 IS
357 l_ret_val VARCHAR2(1);
358 BEGIN
359 SELECT DECODE (project_system_status_code,
360 p_in_system_status_code,'Y','N')
361 INTO l_ret_val
362 FROM pa_project_statuses
363 WHERE project_status_code = p_status_code
364 AND status_type = p_status_type;
365 RETURN l_ret_val;
366 EXCEPTION
367 WHEN OTHERS THEN
368 RAISE;
369 END check_input_system_status ;
370
371 PROCEDURE Check_proj_Assignments_Exist
372 (p_project_id IN NUMBER
373 ,x_assignments_exist_flag OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
374 ,x_return_status OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
375 ,x_error_message_code OUT NOCOPY VARCHAR2) IS --File.Sql.39 bug 4440895
376 BEGIN
377 pa_debug.init_err_stack ('pa_assignment_utils.Check_proj_Assignments_Exist');
378 x_assignments_exist_flag := 'N';
379 x_error_message_code := NULL;
380 x_return_status := FND_API.G_RET_STS_SUCCESS;
381
382 --Change due to Performance Reason
383 /*
384 SELECT 'Y', 'PA_PROJ_ASSIGNMENTS_EXIST'
385 INTO x_assignments_exist_flag, x_error_message_code
386 FROM dual
387 WHERE EXISTS
388 (SELECT 'x' FROM pa_project_assignments
389 WHERE project_id = p_project_id);
390 */
391 SELECT 'Y', 'PA_PROJ_ASSIGNMENTS_EXIST'
392 INTO x_assignments_exist_flag, x_error_message_code
393 FROM pa_project_assignments
394 WHERE project_id = p_project_id
395 AND rownum=1;
396
397 pa_debug.reset_err_stack;
398 EXCEPTION
399 WHEN NO_DATA_FOUND THEN
400 x_return_status := FND_API.G_RET_STS_SUCCESS;
401 x_assignments_exist_flag := 'N';
402 WHEN OTHERS THEN
403 -- 4537865 : Start : RESET OUT PARAMS to proper values
404 x_assignments_exist_flag := NULL ;
405 x_error_message_code := SQLCODE ;
406 -- 4537865 : End
407
408 fnd_msg_pub.add_exc_msg
409 (p_pkg_name => 'PA_ASSIGNMENT_UTILS',
410 p_procedure_name => pa_debug.g_err_stack );
411 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
412 RAISE;
413 END check_proj_assignments_exist;
414
415 PROCEDURE Check_Assignment_Number_Or_Id( p_assignment_id IN pa_project_assignments.assignment_id%TYPE
416 ,p_assignment_number IN pa_project_assignments.assignment_number%TYPE
417 ,p_check_id_flag IN VARCHAR2 := 'A'
418 ,x_assignment_id OUT NOCOPY pa_project_assignments.assignment_id%TYPE --File.Sql.39 bug 4440895
419 ,x_return_status OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
420 ,x_error_message_code OUT NOCOPY VARCHAR2) IS --File.Sql.39 bug 4440895
421 CURSOR c_ids IS
422 SELECT assignment_id
423 FROM pa_project_assignments
424 WHERE assignment_number = p_assignment_number;
425
426 l_id_found_flag VARCHAR2(1);
427 l_current_id pa_project_assignments.assignment_id%TYPE;
428 l_num_ids NUMBER;
429 BEGIN
430 pa_debug.init_err_stack ('pa_assignment_utils.check_assignment_number_or_id');
431 IF p_assignment_id IS NOT NULL AND p_assignment_id <> FND_API.G_MISS_NUM THEN
432 IF p_check_id_flag = 'Y' THEN
433 SELECT assignment_id
434 INTO x_assignment_id
435 FROM pa_project_assignments
436 WHERE assignment_number = p_assignment_number;
437 ELSIF p_check_id_flag = 'N' THEN
438 x_assignment_id := p_assignment_id;
439 ELSIF p_check_id_flag = 'A' THEN
440 IF (p_assignment_number IS NULL) THEN
441 -- Return a null ID since the name is null.
442 x_assignment_id := NULL;
443 ELSE
444 -- Find the ID which matches the Name passed
445 OPEN c_ids;
446 LOOP
447 FETCH c_ids INTO l_current_id;
448 EXIT WHEN c_ids%NOTFOUND;
449 IF (l_current_id = p_assignment_id) THEN
450 l_id_found_flag := 'Y';
451 x_assignment_id := p_assignment_id;
452 END IF;
453 END LOOP;
454 l_num_ids := c_ids%ROWCOUNT;
455 CLOSE c_ids;
456
457 IF (l_num_ids = 0) THEN
458 -- No IDs for name
459 RAISE NO_DATA_FOUND;
460 ELSIF (l_num_ids = 1) THEN
461 -- Since there is only one ID for the name use it.
462 x_assignment_id := l_current_id;
463 ELSIF (l_id_found_flag = 'N') THEN
464 -- More than one ID for the name and none of the IDs matched
465 -- the ID passed in.
466 RAISE TOO_MANY_ROWS;
467 END IF;
468 END IF;
469 END IF;
470 ELSE
471 IF (p_assignment_number IS NOT NULL) THEN
472 SELECT assignment_id
473 INTO x_assignment_id
474 FROM pa_project_assignments
475 WHERE assignment_number = p_assignment_number;
476 ELSE
477 x_assignment_id := NULL;
478 END IF;
479 END IF;
480 x_return_status := FND_API.G_RET_STS_SUCCESS;
481 pa_debug.reset_err_stack;
482 EXCEPTION
483 WHEN NO_DATA_FOUND THEN
484 x_return_status := FND_API.G_RET_STS_ERROR;
485 x_error_message_code := 'PA_ASGN_NUMBER_INV_AMBIGOUS';
486 x_assignment_id := NULL;
487 WHEN TOO_MANY_ROWS THEN
488 x_assignment_id := NULL;
489 x_return_status := FND_API.G_RET_STS_ERROR;
490 x_error_message_code := 'PA_ASGN_NUMBER_INV_AMBIGOUS';
491 WHEN OTHERS THEN
492 -- 4537865 : Start : RESET OUT PARAMS to proper values
493 x_error_message_code := SQLCODE;
494 -- 4537865 : End
495
496 fnd_msg_pub.add_exc_msg
497 (p_pkg_name => 'PA_ASSIGNMENT_UTILS',
498 p_procedure_name => pa_debug.g_err_stack );
499 x_return_status:= FND_API.G_RET_STS_UNEXP_ERROR;
500 x_assignment_id := NULL;
501 RAISE;
502 END Check_Assignment_Number_Or_Id;
503
504 PROCEDURE Check_STF_PriorityName_Or_Code (p_staffing_priority_code IN pa_project_assignments.staffing_priority_code%TYPE
505 ,p_staffing_priority_name IN pa_lookups.meaning%TYPE
506 ,p_check_id_flag IN VARCHAR2
507 ,x_staffing_priority_code OUT NOCOPY pa_project_assignments.staffing_priority_code%TYPE --File.Sql.39 bug 4440895
508 ,x_return_status OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
509 ,x_error_message_code OUT NOCOPY VARCHAR2) IS --File.Sql.39 bug 4440895
510 BEGIN
511 pa_debug.init_err_stack ('pa_assignment_utils.Check_STF_PriorityName_Or_Code');
512
513 IF p_staffing_priority_code IS NOT NULL AND p_staffing_priority_code<>FND_API.G_MISS_CHAR THEN
514 IF p_check_id_flag = 'Y' THEN
515 SELECT lookup_code
516 INTO x_staffing_priority_code
517 FROM pa_lookups
518 WHERE lookup_type = 'STAFFING_PRIORITY_CODE'
519 AND lookup_code = p_staffing_priority_code;
520 ELSE
521 x_staffing_priority_code := p_staffing_priority_code;
522
523 END IF;
524 ELSE
525 SELECT lookup_code
526 INTO x_staffing_priority_code
527 FROM pa_lookups
528 WHERE lookup_type = 'STAFFING_PRIORITY_CODE'
529 AND meaning = p_staffing_priority_name;
530 END IF;
531
532 x_return_status := FND_API.G_RET_STS_SUCCESS;
533
534 EXCEPTION
535 WHEN NO_DATA_FOUND THEN
536 x_return_status := FND_API.G_RET_STS_ERROR;
537 x_error_message_code := 'PA_STF_PRIORITY_INVALID';
538 WHEN TOO_MANY_ROWS THEN
539 x_return_status := FND_API.G_RET_STS_ERROR;
540 x_error_message_code := 'PA_STF_PRIORITY_INVALID';
541 WHEN OTHERS THEN
542 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
543 -- 4537865 : Start
544 x_staffing_priority_code := p_staffing_priority_code ;
545 x_error_message_code := SQLCODE ;
546 -- 4537865 : End
547 END Check_STF_PriorityName_Or_Code;
548
549 --
550 --Possible values for return: 'Roll On', 'Roll Off', 'Pending Approval'
551 --
552 --Use the dates passed in to decided if the assignment is rolling on, or rolling off or pending approval.
553
554 FUNCTION get_role_activity_text (p_assignment_id IN NUMBER,
555 p_start_date IN DATE,
556 p_end_date IN DATE,
557 p_apprvl_status_code IN VARCHAR2,
558 p_num_of_weeks IN NUMBER) RETURN VARCHAR2
559 IS
560
561 l_lookup_code pa_lookups.lookup_code%TYPE;
562 l_meaning pa_lookups.meaning%TYPE;
563 l_today_date pa_project_assignments.start_date%TYPE;
564
565 CURSOR get_meaning IS
566 SELECT meaning
567 FROM pa_lookups
568 WHERE lookup_code = l_lookup_code
569 AND lookup_type = 'TEAM_ROLE_ACTIVITY_TYPE';
570
571 BEGIN
572
573 l_today_date := TRUNC (sysdate);
574
575 IF p_apprvl_status_code = PA_ASSIGNMENT_APPROVAL_PUB.g_submitted THEN
576 l_lookup_code := 'PENDING';
577 ELSIF ( l_today_date <= p_start_date) AND (l_today_date >= (p_start_date - p_num_of_weeks*7)) THEN
578 l_lookup_code := 'ROLL_ON';
579 ELSIF (l_today_date <= p_end_date) AND (l_today_date >= (p_end_date - p_num_of_weeks*7)) THEN
580 l_lookup_code := 'ROLL_OFF';
581 END IF;
582
583 IF l_lookup_code IS NOT NULL THEN
584 OPEN get_meaning;
585 FETCH get_meaning INTO l_meaning;
586 CLOSE get_meaning;
587 END IF;
588
589 RETURN l_meaning;
590
591
592 END get_role_activity_text;
593
594
595 --
596 --Possible values for return: start_date, end_date
597 --
598 --IF assignment rolling on, then return start_date
599 --IF assignment rolling off, then return end_date
600 --IF pending approval, then return start_date
601
602 FUNCTION get_role_activity_date (p_assignment_id IN NUMBER,
603 p_start_date IN DATE,
604 p_end_date IN DATE,
605 p_apprvl_status_code IN VARCHAR2,
606 p_num_of_weeks IN NUMBER) RETURN DATE
607 IS
608
609 l_date DATE;
610 l_today_date pa_project_assignments.start_date%TYPE;
611
612 BEGIN
613
614 l_today_date := TRUNC(sysdate);
615
616 IF p_apprvl_status_code = PA_ASSIGNMENT_APPROVAL_PUB.g_submitted THEN
617 l_date := p_start_date;
618 ELSIF (l_today_date <= p_start_date) AND (l_today_date >= (p_start_date - p_num_of_weeks*7)) THEN
619 l_date := p_start_date;
620 ELSIF (l_today_date <= p_end_date) AND (l_today_date >= (p_end_date - p_num_of_weeks*7)) THEN
621 l_date := p_end_date;
622 END IF;
623
624 RETURN l_date;
625
626 END get_role_activity_date;
627
628 PROCEDURE Add_Message(p_app_short_name IN VARCHAR2,
629 p_msg_name IN VARCHAR2,
630 p_token1 IN VARCHAR2 DEFAULT NULL,
631 p_value1 IN VARCHAR2 DEFAULT NULL)
632 IS
633
634 l_message_text FND_NEW_MESSAGES.message_text%TYPE;
635
636 /* 2708879 - Added two conditions for application id and language code for the cursor get_message below */
637 CURSOR get_message IS
638 SELECT message_text
639 FROM fnd_new_messages
640 WHERE message_name = p_msg_name
641 and application_id = 275
642 and language_code = userenv('LANG');
643
644 CURSOR get_team_template_name IS
645 SELECT team_template_name
646 FROM pa_team_templates
647 WHERE team_template_id = g_team_template_id;
648
649 BEGIN
650
651 --when applying a team template to a project, multiple team templates containing
652 --multiple assignments will be created.
653 --if the team_template_name and/or team_role_name global variables are set and there
654 --are any validation errors, then the team_template_name and assignment_name will
655 --be prepended to the error message.
656 --If the globals are NULL then the message will appear normally (nothing prepended).
657 IF pa_assignment_utils.g_team_template_name_token IS NULL AND pa_assignment_utils.g_team_role_name_token IS NULL THEN
658
659 IF p_token1 IS NULL THEN
660 --message text appear with no prepended values.
661 PA_UTILS.Add_Message(p_app_short_name => p_app_short_name,
662 p_msg_name => p_msg_name);
663 ELSE
664 --message text appear with no prepended values.
665 PA_UTILS.Add_Message(p_app_short_name => p_app_short_name,
666 p_msg_name => p_msg_name,
667 p_token1 => p_token1,
668 p_value1 => p_value1);
669 END IF;
670
671 ELSIF pa_assignment_utils.g_team_template_id IS NOT NULL THEN
672
673 --get the message text
674 OPEN get_message;
675 FETCH get_message INTO l_message_text;
676 CLOSE get_message;
677
678 --if the team_template_id token is set but the name is not then get the name.
679 --the apply_team_template API does not have the team_template_name but does have the
680 --id, so in this way we only get the name if required.
681 IF g_team_template_name_token IS NULL THEN
682 OPEN get_team_template_name;
683 FETCH get_team_template_name INTO g_team_template_name_token;
684 CLOSE get_team_template_name;
685 END IF;
686
687 --if the team template name token value is set and
688 --the team role name token value is not set then this a team template level
689 --error, so the message will be displayed in the format:
690 --"Team Template Name: Error Message"
691 --both the team template name and error message are tokens.
692 IF pa_assignment_utils.g_team_role_name_token IS NULL THEN
693
694 IF p_token1 IS NULL THEN
695 PA_UTILS.Add_Message(p_app_short_name => p_app_short_name,
696 p_msg_name => 'PA_TEAM_TEMP_ERR_MSG',
697 p_token1 => 'TEAM_TEMPLATE_NAME',
698 p_value1 => pa_assignment_utils.g_team_template_name_token,
699 p_token2 => 'ERROR_MESSAGE',
700 p_value2 => l_message_text);
701 ELSE
702 PA_UTILS.Add_Message(p_app_short_name => p_app_short_name,
703 p_msg_name => 'PA_TEAM_TEMP_ERR_MSG',
704 p_token1 => 'TEAM_TEMPLATE_NAME',
705 p_value1 => pa_assignment_utils.g_team_template_name_token,
706 p_token2 => 'ERROR_MESSAGE',
707 p_value2 => l_message_text,
708 p_token3 => p_token1,
709 p_value3 => p_value1);
710 END IF;
711
712 --if the team template name token value is set and
713 --the team role name token value is set then this a requirement level which occurs when
714 --the team template is being applied to a project.
715 --The message will be displayed in the format:
716 --"Team Template Name: Team Role Name: Error Message"
717 --The team template name, team role name, and error message are tokens.
718 ELSIF pa_assignment_utils.g_team_role_name_token IS NOT NULL THEN
719
720 IF pa_assignment_utils.g_team_role_name_token IS NULL THEN
721 PA_UTILS.Add_Message(p_app_short_name => p_app_short_name,
722 p_msg_name => 'PA_TEAM_TEMP_ROLE_ERR_MSG',
723 p_token1 => 'TEAM_TEMPLATE_NAME',
724 p_value1 => pa_assignment_utils.g_team_template_name_token,
725 p_token2 => 'TEAM_ROLE_NAME',
726 p_value2 => pa_assignment_utils.g_team_role_name_token,
727 p_token3 => 'ERROR_MESSAGE',
728 p_value3 => l_message_text);
729 ELSE
730 PA_UTILS.Add_Message(p_app_short_name => p_app_short_name,
731 p_msg_name => 'PA_TEAM_TEMP_ROLE_ERR_MSG',
732 p_token1 => 'TEAM_TEMPLATE_NAME',
733 p_value1 => pa_assignment_utils.g_team_template_name_token,
734 p_token2 => 'TEAM_ROLE_NAME',
735 p_value2 => pa_assignment_utils.g_team_role_name_token,
736 p_token3 => 'ERROR_MESSAGE',
737 p_value3 => l_message_text,
738 p_token4 => p_token1,
739 p_value4 => p_value1);
740 END IF;
741
742 END IF;
743
744 END IF;
745
746 END Add_Message;
747
748
749 FUNCTION is_asgmt_allow_stus_ctl_check(p_asgmt_status_code IN pa_project_statuses.project_status_code%TYPE,
750 p_project_id IN pa_projects_all.project_id%TYPE,
751 p_add_message IN VARCHAR2)
752 RETURN VARCHAR2 IS
753
754 CURSOR get_status_info IS
755 SELECT proj.project_status_code, ps.project_status_name, ps2.project_system_status_code, ps2.project_status_name
756 FROM pa_projects_all proj,
757 pa_project_statuses ps,
758 pa_project_statuses ps2
759 WHERE project_id = p_project_id
760 AND proj.project_status_code = ps.project_status_code
761 AND ps2.project_status_code = p_asgmt_status_code;
762
763 l_project_status_code pa_project_statuses.project_status_code%TYPE;
764 l_project_status_name pa_project_statuses.project_status_name%TYPE;
765 l_asgmt_system_status_code pa_project_statuses.project_system_status_code%TYPE;
766 l_asgmt_status_name pa_project_statuses.project_status_name%TYPE;
767 l_allow_asgmt VARCHAR2(1);
768 l_status_control_code pa_project_status_controls.action_code%TYPE;
769
770 BEGIN
771
772 OPEN get_status_info;
773 FETCH get_status_info INTO l_project_status_code
774 , l_project_status_name
775 , l_asgmt_system_status_code
776 , l_asgmt_status_name;
777 CLOSE get_status_info;
778
779 IF l_asgmt_system_status_code = 'STAFFED_ASGMT_CONF' THEN
780
781 l_status_control_code := 'PROJ_ASSIGN_RESOURCES';
782
783 ELSIF l_asgmt_system_status_code = 'STAFFED_ASGMT_PROV' THEN
784
785 l_status_control_code := 'PROJ_PROVISIONAL_ASSIGN';
786
787 ELSIF l_asgmt_system_status_code = 'STAFFED_ASGMT_CANCEL' THEN
788
789 RETURN 'Y';
790
791 END IF;
792
793 l_allow_asgmt := PA_PROJECT_UTILS.Check_prj_stus_action_allowed
794 ( x_project_status_code => l_project_status_code
795 ,x_action_code => l_status_control_code);
796
797 IF p_add_message = 'Y' AND l_allow_asgmt = 'N' THEN
798
799 PA_UTILS.Add_Message( p_app_short_name => 'PA'
800 ,p_msg_name => 'PA_ASGN_STUS_NOT_FOR_PROJ_STUS'
801 ,p_token1 => 'PROJ_STATUS'
802 ,p_value1 => l_project_status_name
803 ,p_token2 => 'ASGN_STATUS'
804 ,p_value2 => l_asgmt_status_name);
805
806 END IF;
807
808 RETURN l_allow_asgmt;
809
810 EXCEPTION
811 WHEN OTHERS THEN
812 --
813 -- Set the excetption Message and the stack
814 FND_MSG_PUB.add_exc_msg ( p_pkg_name => 'PA_ASSIGNMENT_UTILS.is_asgmt_allow_stus_ctl_check'
815 ,p_procedure_name => PA_DEBUG.G_Err_Stack );
816 --
817 RAISE; -- This is optional depending on the needs
818
819 END is_asgmt_allow_stus_ctl_check;
820
821
822 --
823 -- PROCEDURE
824 -- Get_Person_Asgmt
825 -- PURPOSE
826 -- This procedure returns the assignment with the given
827 -- person, in the given project and with the given date
828 -- PARAMETERS
829 -- p_person_id IN - mandatory
830 -- p_project_id IN - mandatory
831 -- p_ei_date IN - mandatory
832 -- x_assignment_name IN OUT - may not be passed in
833 -- x_assignment_id OUT - NULL if not found or multiple found
834 -- x_return_status OUT - S if single assignment found
835 -- E if not found or multiple found
836 -- U otherwise
837 -- x_error_message_code OUT
838 --
839 PROCEDURE Get_Person_Asgmt
840 ( p_person_id IN pa_resources_denorm.person_id%TYPE
841 ,p_project_id IN pa_project_assignments.project_id%TYPE
842 ,p_ei_date IN DATE
843 ,x_assignment_name IN OUT NOCOPY pa_project_assignments.assignment_name%TYPE --File.Sql.39 bug 4440895
844 ,x_assignment_id OUT NOCOPY pa_project_assignments.assignment_id%TYPE --File.Sql.39 bug 4440895
845 ,x_return_status OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
846 ,x_error_message_code OUT NOCOPY VARCHAR2) IS --File.Sql.39 bug 4440895
847
848 l_row_count NUMBER := 0;
849 l_found boolean := FALSE;
850 l_assignment_id pa_project_assignments.assignment_id%TYPE;
851 l_assignment_name pa_project_assignments.assignment_name%TYPE;
852
853 CURSOR get_assignment_with_name IS
854 SELECT assignment_id, assignment_name
855 FROM pa_proj_assignments_actuals_v
856 WHERE project_id = p_project_id
857 AND person_id = p_person_id
858 AND p_ei_date between start_date and end_date
859 AND assignment_name = x_assignment_name
860 ORDER BY assignment_start_date DESC;
861
862 CURSOR get_assignment_without_name IS
863 SELECT assignment_id, assignment_name
864 FROM pa_proj_assignments_actuals_v
865 WHERE project_id = p_project_id
866 AND person_id = p_person_id
867 AND p_ei_date between start_date and end_date
868 ORDER BY assignment_start_date DESC;
869
870 BEGIN
871
872 x_return_status := FND_API.G_RET_STS_SUCCESS;
873 --dbms_output.put_line ('Assignment Name is ' || x_assignment_name);
874
875 IF x_assignment_name IS NOT NULL AND x_assignment_name <> FND_API.G_MISS_CHAR THEN
876
877 IF p_person_id = g_person_id_w_name AND p_project_id = g_project_id_w_name AND p_ei_date = g_ei_date_w_name AND x_assignment_name = g_in_asgmt_name THEN
878 l_found := TRUE;
879 --x_assignment_name := x_assignment_name;
880 x_assignment_id := g_assignment_id_w_name;
881 --dbms_output.put_line ('Flow 1. Reading cache value');
882 ELSE
883 l_found := FALSE;
884 OPEN get_assignment_with_name;
885 LOOP
886 FETCH get_assignment_with_name INTO l_assignment_id, l_assignment_name;
887 EXIT WHEN get_assignment_with_name%NOTFOUND;
888 END LOOP;
889 l_row_count := get_assignment_with_name%ROWCOUNT;
890 CLOSE get_assignment_with_name;
891
892 IF l_row_count <> 0 THEN
893 g_person_id_w_name := p_person_id;
894 g_project_id_w_name := p_project_id;
895 g_ei_date_w_name := p_ei_date;
896 g_in_asgmt_name := l_assignment_name;
897 g_assignment_id_w_name := l_assignment_id;
898 END IF;
899
900 END IF;
901
902 ELSE
903
904 IF p_person_id = g_person_id_wo_name AND p_project_id = g_project_id_wo_name AND p_ei_date = g_ei_date_wo_name THEN
905 l_found := TRUE;
906 x_assignment_name := g_out_asgmt_name;
907 x_assignment_id := g_assignment_id_wo_name;
908 --dbms_output.put_line ('Flow 2. Reading cache value');
909 ELSE
910 l_found := FALSE;
911 OPEN get_assignment_without_name;
912 LOOP
913 FETCH get_assignment_without_name INTO l_assignment_id, l_assignment_name;
914 EXIT WHEN get_assignment_without_name%NOTFOUND;
915 END LOOP;
916 l_row_count := get_assignment_without_name%ROWCOUNT;
917 CLOSE get_assignment_without_name;
918
919 IF l_row_count <> 0 THEN
920 g_person_id_wo_name := p_person_id;
921 g_project_id_wo_name := p_project_id;
922 g_ei_date_wo_name := p_ei_date;
923 g_assignment_id_wo_name := l_assignment_id;
924 g_out_asgmt_name := l_assignment_name;
925 END IF;
926 END IF;
927
928 END IF;
929
930 IF NOT l_found THEN
931 IF l_row_count = 0 THEN
932 g_person_id_w_name := NULL;
933 g_project_id_w_name := NULL;
934 g_ei_date_w_name := NULL;
935 g_person_id_wo_name := NULL;
936 g_project_id_wo_name := NULL;
937 g_ei_date_wo_name := NULL;
938
939 g_in_asgmt_name := NULL;
940 g_assignment_id_w_name := NULL;
941 g_assignment_id_wo_name := NULL;
942
943 RAISE no_data_found;
944 ELSE
945 x_assignment_id := l_assignment_id;
946 x_assignment_name := l_assignment_name;
947 END IF;
948 END IF;
949
950 x_return_status := FND_API.G_RET_STS_SUCCESS;
951
952 EXCEPTION
953
954 WHEN NO_DATA_FOUND THEN
955 x_assignment_id := NULL;
956 x_assignment_name := NULL;
957 x_return_status := FND_API.G_RET_STS_ERROR;
958 x_error_message_code := 'PA_NO_ASSIGNMENT';
959 WHEN OTHERS THEN
960 x_assignment_id := NULL;
961 x_assignment_name := NULL;
962 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
963 RAISE;
964 END Get_Person_Asgmt;
965
966 ------------------------------------------------------------------------------------
967 --
968 -- FUNCTION : Get_Assignment_Measures
969 -- DESCRIPTION: This function gets the capacity hours of the resource who is working
970 -- on the project. Also sets the global variables
971 -- g_prvisional_hours - provisional hours of the assignment
972 -- g_confirmed_hours - confirmed hours of the assignment
973 -- NOTE: This Function is solely used in discoverer report TR2
974 -- Workbook: Team Role Details Worksheet: Assignment Details
975 ------------------------------------------------------------------------------------
976 FUNCTION Get_Assignment_Measures
977 ( p_assignment_id IN pa_project_assignments.assignment_id%TYPE
978 ,p_resource_id IN pa_project_assignments.resource_id%TYPE
979 ,p_asgn_effort IN pa_project_assignments.assignment_effort%TYPE
980 ,p_asgn_start_date IN pa_project_assignments.start_date%TYPE
981 ,p_asgn_end_date IN pa_project_assignments.end_date%TYPE
982 ,p_multiple_status_flag IN pa_project_assignments.multiple_status_flag%TYPE)
983 RETURN NUMBER
984 IS
985 l_res_capacity_hrs NUMBER;
986 l_provisional_flag VARCHAR2(1);
987 BEGIN
988 SELECT sum(capacity_quantity)
989 INTO l_res_capacity_hrs
990 FROM pa_forecast_items
991 WHERE forecast_item_type = 'U'
992 AND delete_flag = 'N'
993 AND resource_id = p_resource_id
994 AND item_date BETWEEN p_asgn_start_date AND p_asgn_end_date;
995
996 IF l_res_capacity_hrs IS NULL THEN
997 l_res_capacity_hrs := 0;
998 END IF;
999
1000 IF (p_multiple_status_flag = 'Y') THEN
1001 SELECT sum(item_quantity)
1002 INTO g_provisional_hours
1003 FROM pa_forecast_items
1004 WHERE forecast_item_type = 'A'
1005 AND delete_flag = 'N'
1006 AND provisional_flag = 'Y'
1007 AND assignment_id = p_assignment_id;
1008 ELSE
1009 SELECT provisional_flag
1010 INTO l_provisional_flag
1011 FROM pa_forecast_items
1012 WHERE forecast_item_type = 'A'
1013 AND delete_flag = 'N'
1014 AND provisional_flag = 'Y'
1015 AND assignment_id = p_assignment_id
1016 AND resource_id = p_resource_id
1017 AND item_date = p_asgn_start_date;
1018
1019 IF l_provisional_flag = 'Y' THEN
1020 g_provisional_hours := p_asgn_effort;
1021 ELSE
1022 g_provisional_hours := 0;
1023 END IF;
1024 END IF;
1025
1026 g_confirmed_hours := p_asgn_effort - g_provisional_hours;
1027
1028 RETURN l_res_capacity_hrs;
1029
1030 EXCEPTION
1031 WHEN NO_DATA_FOUND THEN
1032 g_provisional_hours := 0;
1033 g_confirmed_hours := p_asgn_effort;
1034 RETURN l_res_capacity_hrs;
1035 END Get_Assignment_Measures;
1036
1037 ------------------------------------------------------------------------------------
1038 --
1039 -- FUNCTION : Get_Asgn_Provisional_Hours
1040 -- DESCRIPTION: This function gets the provisional hours of the assignment from
1041 -- the global variable g_prvisional_hours
1042 -- NOTE: This Function is solely used in discoverer report TR2
1043 -- Workbook: Team Role Details Worksheet: Assignment Details
1044 ------------------------------------------------------------------------------------
1045 FUNCTION Get_Asgn_Provisional_Hours
1046 RETURN NUMBER
1047 IS
1048 BEGIN
1049 RETURN g_provisional_hours;
1050 END Get_Asgn_Provisional_Hours;
1051
1052 ------------------------------------------------------------------------------------
1053 --
1054 -- FUNCTION : Get_Asgn_Confirmed_Hours
1055 -- DESCRIPTION: This function gets the confirmed hours of the assignment from
1056 -- the global variable g_confirmed_hours
1057 -- NOTE: This Function is solely used in discoverer report TR2
1058 -- Workbook: Team Role Details Worksheet: Assignment Details
1059 ------------------------------------------------------------------------------------
1060 FUNCTION Get_Asgn_Confirmed_Hours
1061 RETURN NUMBER
1062 IS
1063 BEGIN
1064 RETURN g_confirmed_hours;
1065 END Get_Asgn_Confirmed_Hours;
1066
1067
1068 ------------------------------------------------------------------------------
1069 -- PROCEDURE
1070 -- Get Default Staffing Owner
1071 -- PURPOSE
1072 -- This procedure returns the default team role
1073 -- staffing owner given the project_id and exp_org_id
1074 -- HISTORY
1075 -- 29-APR-2003 shyugen Created
1076 -- 10-JAN-2005 anigam Bug 4103207.Added a condition in the cursor 'get_team_member' to check that current date lies between
1077 -- effective_start_date and effective_end_date. And commented of the condition ROWNUM =1
1078 ------------------------------------------------------------------------------
1079 PROCEDURE Get_Default_Staffing_Owner
1080 ( p_project_id IN pa_projects_all.project_id%TYPE
1081 ,p_exp_org_id IN pa_project_assignments.expenditure_org_id%TYPE := NULL
1082 ,x_person_id OUT NOCOPY NUMBER --File.Sql.39 bug 4440895
1083 ,x_person_name OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
1084 ,x_return_status OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
1085 ,x_error_message_code OUT NOCOPY VARCHAR2) IS --File.Sql.39 bug 4440895
1086
1087 l_person_id NUMBER := null;
1088 l_person_name PER_PEOPLE_F.full_name%TYPE := null;
1089 l_exp_org_id pa_project_assignments.expenditure_org_id%TYPE := null;
1090
1091 CURSOR get_team_member(c_project_role_id NUMBER) IS
1092 SELECT pp.resource_source_id, res.full_name
1093 FROM pa_project_parties pp
1094 ,per_all_people_f res
1095 WHERE pp.project_role_id = c_project_role_id
1096 AND pp.resource_type_id = 101 -- Bug 4752052 - added to improve performance
1097 AND TRUNC(sysdate) between TRUNC(pp.start_date_active) and TRUNC(nvl(pp.end_date_active, sysdate))
1098 AND pp.project_id = p_project_id
1099 AND pp.resource_source_id = res.person_id
1100 AND trunc(SYSDATE) BETWEEN res.effective_start_date AND res.effective_end_date --added for bug 4103207
1101 AND (res.current_employee_flag = 'Y' OR res.current_npw_flag = 'Y')-- Added for bug 4938392
1102 and pp.object_type = 'PA_PROJECTS'
1103 and pp.object_id = p_project_id; -- Bug Ref # 6802604
1104 --AND ROWNUM=1; Commented for bug 4103207
1105
1106
1107 BEGIN
1108
1109 IF p_exp_org_id IS NULL THEN
1110 SELECT carrying_out_organization_id INTO l_exp_org_id
1111 FROM pa_projects_all
1112 WHERE project_id = p_project_id;
1113 ELSE
1114 l_exp_org_id := p_exp_org_id;
1115 END IF;
1116
1117 -- 1. Check if Project Staffing Owner exists
1118 OPEN get_team_member(8);
1119 FETCH get_team_member INTO l_person_id, l_person_name;
1120 CLOSE get_team_member;
1121
1122 -- 2. If not, check if Primary Resource Contact exists
1123 IF (l_person_id IS NULL or l_person_name IS NULL) AND l_exp_org_id IS NOT NULL THEN
1124 l_person_id := PA_RESOURCE_UTILS.Get_Org_Prim_Contact_id(l_exp_org_id, 'PA_PRM_RES_PRMRY_CONTACT');
1125 l_person_name := PA_RESOURCE_UTILS.Get_Org_Prim_Contact_Name(l_exp_org_id, 'PA_PRM_RES_PRMRY_CONTACT');
1126 END IF;
1127
1128 -- 3. If not, check if Project Manager exists
1129 IF l_person_id IS NULL or l_person_name IS NULL THEN
1130 OPEN get_team_member(1);
1131 FETCH get_team_member INTO l_person_id, l_person_name;
1132 CLOSE get_team_member;
1133 END IF;
1134
1135 x_person_id := l_person_id;
1136 x_person_name := l_person_name;
1137 x_return_status := 'S';
1138
1139 EXCEPTION
1140 WHEN OTHERS THEN
1141 x_return_status := 'S';
1142 x_person_id := null;
1143 x_person_name := null;
1144
1145 END Get_Default_Staffing_Owner;
1146
1147
1148 ------------------------------------------------------------------------------
1149 -- PROCEDURE
1150 -- Get All Staffing Owner
1151 -- PURPOSE
1152 -- This procedure returns the project and team role
1153 -- staffing owners for a team role
1154 -- HISTORY
1155 -- 29-APR-2003 shyugen Created
1156 ------------------------------------------------------------------------------
1157 PROCEDURE Get_All_Staffing_Owners
1158 ( p_assignment_id IN pa_project_assignments.assignment_id%TYPE
1159 ,p_project_id IN pa_projects_all.project_id%TYPE
1160 ,x_person_id_tbl OUT NOCOPY system.pa_num_tbl_type --File.Sql.39 bug 4440895
1161 ,x_return_status OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
1162 ,x_error_message_code OUT NOCOPY VARCHAR2) IS --File.Sql.39 bug 4440895
1163
1164
1165 l_person_id_tbl system.pa_num_tbl_type;
1166
1167 CURSOR get_all_staffing_owners IS
1168 SELECT resource_source_id
1169 FROM pa_project_parties ,
1170 per_all_people_f ppf
1171 WHERE project_role_id = 8
1172 AND resource_type_id = 101 -- Bug 4752052 - added to improve performance
1173 AND TRUNC ( sysdate ) BETWEEN TRUNC ( start_date_active ) AND TRUNC ( NVL ( end_date_active, sysdate ) )
1174 AND project_id = p_project_id
1175 AND object_type = 'PA_PROJECTS' -- Bug Ref # 6802604
1176 AND object_id = p_project_id -- Bug Ref # 6802604
1177 AND ppf.person_id = resource_source_id -- Bug Ref # 6802697
1178 AND TRUNC ( sysdate ) BETWEEN effective_start_date AND effective_end_date
1179 AND ( ppf.current_employee_flag = 'Y' OR ppf.current_npw_flag = 'Y' )
1180 UNION ALL
1181 SELECT staffing_owner_person_id
1182 FROM pa_project_assignments,
1183 per_all_people_f ppf
1184 WHERE assignment_id = p_assignment_id
1185 AND ppf.person_id = staffing_owner_person_id -- Bug Ref # 6802697
1186 AND TRUNC ( sysdate ) BETWEEN effective_start_date AND effective_end_date
1187 AND ( ppf.current_employee_flag = 'Y' OR ppf.current_npw_flag = 'Y' ) ;
1188
1189 BEGIN
1190
1191 OPEN get_all_staffing_owners;
1192 FETCH get_all_staffing_owners BULK COLLECT INTO l_person_id_tbl;
1193 CLOSE get_all_staffing_owners;
1194
1195 x_person_id_tbl := l_person_id_tbl;
1196 x_return_status := 'S';
1197
1198 EXCEPTION
1199 WHEN OTHERS THEN
1200 x_return_status := 'S';
1201 x_person_id_tbl := null;
1202 -- 4537865 : Start
1203 x_error_message_code := NULL ;
1204 -- 4537865 :End
1205 END Get_All_Staffing_Owners;
1206
1207 ------------------------------------------------------------------------------
1208 -- PROCEDURE
1209 -- Associate Planning Resource
1210 -- PURPOSE
1211 -- This procedure finds and associate planning resource to
1212 -- existing Team Roles when Resource List is changed on
1213 -- the Workplan
1214 -- HISTORY
1215 -- 11-MAR-2004 shyugen Created
1216 ------------------------------------------------------------------------------
1217 PROCEDURE Associate_Planning_Resources
1218 ( p_project_id IN NUMBER
1219 ,p_old_resource_list_id IN NUMBER
1220 ,p_new_resource_list_id IN NUMBER
1221 ,x_return_status OUT NOCOPY VARCHAR2 --File.Sql.39 bug 4440895
1222 ,x_msg_count OUT NOCOPY NUMBER --File.Sql.39 bug 4440895
1223 ,x_msg_data OUT NOCOPY VARCHAR2) --File.Sql.39 bug 4440895
1224 IS
1225
1226
1227
1228 TYPE number_table_type IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
1229 TYPE var30_table_type IS TABLE OF VARCHAR2(30) INDEX BY BINARY_INTEGER;
1230 TYPE var80_table_type IS TABLE OF VARCHAR2(80) INDEX BY BINARY_INTEGER;
1231
1232 l_msg_index_out NUMBER;
1233
1234 l_asgmt_res_format_id NUMBER := NULL;
1235 l_req_res_format_id NUMBER := NULL;
1236 l_proj_rec_ver_num NUMBER := NULL;
1237
1238 l_assignment_id_tbl number_table_type;
1239 l_res_list_member_id_tbl number_table_type;
1240
1241 l_resource_source_id_tbl number_table_type;
1242 l_fcst_job_id_tbl number_table_type;
1243 l_exp_org_id_tbl number_table_type;
1244 l_expenditure_type_tbl var30_table_type;
1245 l_project_role_id_tbl number_table_type;
1246 l_person_type_tbl var30_table_type;
1247 l_assignment_name_tbl var80_table_type;
1248
1249
1250 l_return_status VARCHAR2(30) := FND_API.G_RET_STS_SUCCESS;
1251
1252 cursor get_proj_rec_ver_num is
1253 select record_version_number
1254 from pa_projects_all
1255 where project_id = p_project_id;
1256
1257 -- for FP-M, person_type is not tracked on a requirement
1258
1259 cursor get_req_res_list_member(c_req_res_format_id NUMBER) is
1260 select asgn.assignment_id,
1261 asgn.fcst_job_id,
1262 asgn.expenditure_organization_id,
1263 asgn.expenditure_type,
1264 asgn.project_role_id,
1265 asgn.assignment_name
1266 from pa_project_assignments asgn,
1267 pa_project_statuses ps
1268 where asgn.project_id = p_project_id
1269 and asgn.assignment_type = 'OPEN_ASSIGNMENT'
1270 and asgn.status_code = ps.project_status_code(+)
1271 and (ps.project_system_status_code = 'OPEN_ASGMT'
1272 OR ps.project_system_status_code IS NULL);
1273 -- for FP-M, only 2 person types are supported in PA: CWK and EMP
1274 -- A given person can be in multiple person types. However, person cannot
1275 -- be both CWK and EMP at the same time.
1276
1277 -- Bug 4221383: Cursor modified to get correct org_id, job_id and person_type
1278 cursor get_asgmt_res_list_member(c_asgmt_res_format_id NUMBER) is
1279 select asgn.assignment_id,
1280 rta.person_id,
1281 aaf.job_id, --asgn.fcst_job_id,
1282 rd.resource_organization_id, --asgn.expenditure_organization_id,
1283 asgn.expenditure_type,
1284 asgn.project_role_id,
1285 decode(peo.current_employee_flag, 'Y', 'EMP', 'CWK'), --ppt.system_person_type,
1286 asgn.assignment_name
1287 from pa_project_assignments asgn,
1288 pa_project_statuses ps,
1289 per_person_type_usages_f ptuf,
1290 per_person_types ppt,
1291 per_all_assignments_f aaf,
1292 pa_resource_txn_attributes rta,
1293 pa_resources_denorm rd,
1294 per_all_people_f peo
1295 where asgn.project_id = p_project_id
1296 and asgn.resource_id = rta.resource_id
1297 and rta.person_id = aaf.person_id
1298 and asgn.start_date between aaf.effective_start_date AND aaf.effective_end_date
1299 and asgn.assignment_type <> 'OPEN_ASSIGNMENT'
1300 and asgn.status_code = ps.project_status_code(+)
1301 and ps.project_system_status_code <> 'STAFFED_ASGMT_CANCEL'
1302 and rta.person_id = ptuf.person_id
1303 and ptuf.person_type_id = ppt.person_type_id
1304 and ppt.system_person_type in ('CWK', 'EMP')
1305 and asgn.start_date between ptuf.effective_start_date AND ptuf.effective_end_date
1306 and asgn.start_date between rd.resource_effective_start_date AND rd.resource_effective_end_date
1307 and rd.resource_id = asgn.resource_id
1308 and aaf.assignment_type in ('C','E')
1309 and aaf.primary_flag = 'Y'
1310 and peo.person_id = aaf.person_id
1311 and asgn.start_date between peo.effective_start_date AND peo.effective_end_date;
1312 /*select asgn.assignment_id,
1313 rta.person_id,
1314 asgn.fcst_job_id,
1315 asgn.expenditure_organization_id,
1316 asgn.expenditure_type,
1317 asgn.project_role_id,
1318 ppt.system_person_type,
1319 asgn.assignment_name
1320 from pa_project_assignments asgn,
1321 pa_project_statuses ps,
1322 per_person_type_usages_f ptuf,
1323 per_person_types ppt,
1324 per_all_assignments_f aaf,
1325 pa_resource_txn_attributes rta
1326 where asgn.project_id = p_project_id
1327 and asgn.resource_id = rta.resource_id
1328 and rta.person_id = aaf.person_id
1329 and asgn.start_date between aaf.effective_start_date AND aaf.effective_end_date
1330 and asgn.assignment_type <> 'OPEN_ASSIGNMENT'
1331 and asgn.status_code = ps.project_status_code(+)
1332 and ps.project_system_status_code <> 'STAFFED_ASGMT_CANCEL'
1333 and rta.person_id = ptuf.person_id
1334 and ptuf.person_type_id = ppt.person_type_id
1335 and ppt.system_person_type in ('CWK', 'EMP')
1336 and asgn.start_date between ptuf.effective_start_date AND ptuf.effective_end_date;
1337 */
1338 cursor team_role_exists is
1339 SELECT 'T'
1340 from pa_project_assignments
1341 where resource_list_member_id is not null
1342 and project_id = p_project_id
1343 and rownum = 1;
1344
1345 l_team_role_exists VARCHAR2(1):= 'F';
1346 l_debug_mode VARCHAR2(1) := NVL(FND_PROFILE.value('PA_DEBUG_MODE'), 'N'); -- 5345129
1347
1348 BEGIN
1349 IF l_debug_mode = 'Y' THEN -- 5345129
1350 pa_debug.write(x_module => 'pa.plsql.PA_ASSIGNMENT_UTILS.Associate_Planning_Resources'
1351 ,x_msg => 'old_pls_id='||p_old_resource_list_id||
1352 'new_pls_id='||p_new_resource_list_id
1353 ,x_log_level => li_message_level);
1354 END IF;
1355
1356 -- Get the default resource formats for team role creation/update
1357 -- if the resource list has been changed on the workplan
1358 IF NOT(p_old_resource_list_id is null and p_new_resource_list_id is null) AND
1359 NOT(p_old_resource_list_id is not null AND
1360 p_new_resource_list_id is not null AND
1361 p_old_resource_list_id = p_new_resource_list_id) THEN
1362
1363 /* Bug 3647692
1364 -- Disallow workplan resource list from changing if
1365 -- there exist project team roles already associated to
1366 -- planning resources in the resource list
1367 OPEN team_role_exists;
1368 FETCH team_role_exists INTO l_team_role_exists;
1369 CLOSE team_role_exists;
1370
1371 IF l_team_role_exists = 'T' THEN
1372 PA_UTILS.Add_Message(p_app_short_name => 'PA',
1373 p_msg_name => 'PA_NO_UP_RL_TR');
1374 x_return_status := FND_API.G_RET_STS_ERROR;
1375 RETURN;
1376 END IF;
1377 */
1378 IF p_new_resource_list_id is not null THEN
1379 PA_PLANNING_RESOURCE_UTILS.Get_Res_Format_for_Team_Role(
1380 p_resource_list_id => p_new_resource_list_id
1381 ,x_asgmt_res_format_id => l_asgmt_res_format_id
1382 ,x_req_res_format_id => l_req_res_format_id
1383 ,x_return_status => l_return_status);
1384 --dbms_output.put_line ('x_return_status ' || l_return_status);
1385 --dbms_output.put_line ('Assignment res format ' || l_asgmt_res_format_id);
1386 --dbms_output.put_line ('Requirement res format ' || l_req_res_format_id);
1387 IF l_debug_mode = 'Y' THEN -- 5345129
1388 pa_debug.write(x_module => 'pa.plsql.PA_ASSIGNMENT_UTILS.Associate_Planning_Resources'
1389 ,x_msg => 'asgmt_format_id='||l_asgmt_res_format_id||
1390 'req_format_id='||l_req_res_format_id
1391 ,x_log_level => li_message_level);
1392 END IF;
1393
1394 IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
1395 x_return_status := l_return_status;
1396 RETURN;
1397 END IF;
1398
1399 ELSE
1400 l_asgmt_res_format_id := null;
1401 l_req_res_format_id := null;
1402
1403 END IF;
1404
1405 OPEN get_proj_rec_ver_num;
1406 FETCH get_proj_rec_ver_num INTO l_proj_rec_ver_num;
1407 CLOSE get_proj_rec_ver_num;
1408
1409 -- store default formats
1410 pa_resource_setup_pvt.UPDATE_ADDITIONAL_STAFF_INFO
1411 ( p_init_msg_list => FND_API.G_FALSE
1412 ,p_validate_only => FND_API.G_FALSE
1413 ,p_project_id => p_project_id
1414 ,p_record_version_number => l_proj_rec_ver_num
1415 ,p_proj_req_res_format_id => l_req_res_format_id
1416 ,p_proj_asgmt_res_format_id => l_asgmt_res_format_id
1417 ,x_return_status => l_return_status
1418 ,x_msg_count => x_msg_count
1419 ,x_msg_data => x_msg_data );
1420
1421 IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
1422 x_return_status := l_return_status;
1423 RETURN;
1424 END IF;
1425
1426 -- get all requirements and corresponding planning resource
1427 OPEN get_req_res_list_member(l_req_res_format_id);
1428 FETCH get_req_res_list_member BULK COLLECT INTO
1429 l_assignment_id_tbl,
1430 l_fcst_job_id_tbl,
1431 l_exp_org_id_tbl,
1432 l_expenditure_type_tbl,
1433 l_project_role_id_tbl,
1434 l_assignment_name_tbl;
1435 CLOSE get_req_res_list_member;
1436
1437 --dbms_output.put_line ('Assignments to be updated' || l_assignment_id_tbl.COUNT);
1438
1439 -- update planning resource on Project team roles only because
1440 -- resource list cannot be changed on the workplan once task
1441 -- assignment has been created.
1442 IF l_assignment_id_tbl.COUNT > 0 THEN
1443
1444 FOR j IN l_assignment_id_tbl.FIRST .. l_assignment_id_tbl.LAST LOOP
1445
1446 IF l_req_res_format_id IS NOT NULL THEN
1447 l_res_list_member_id_tbl(j) := Pa_Planning_Resource_Utils.Derive_Resource_List_Member(p_project_id,
1448 l_req_res_format_id,
1449 NULL,
1450 l_fcst_job_id_tbl(j),
1451 l_exp_org_id_tbl(j),
1452 l_expenditure_type_tbl(j),
1453 NULL,
1454 l_project_role_id_tbl(j),
1455 NULL,
1456 l_assignment_name_tbl(j));
1457 ELSE
1458 l_res_list_member_id_tbl(j) := NULL;
1459 END IF;
1460 END LOOP;
1461
1462 FORALL i IN l_assignment_id_tbl.FIRST .. l_assignment_id_tbl.LAST
1463 UPDATE pa_project_assignments
1464 SET resource_list_member_id = l_res_list_member_id_tbl(i),
1465 record_version_number = nvl(record_version_number,0) + 1
1466 WHERE assignment_id = l_assignment_id_tbl(i);
1467
1468 END IF;
1469
1470 -- get all assignment and corresponding planning resource
1471 OPEN get_asgmt_res_list_member(l_asgmt_res_format_id);
1472 FETCH get_asgmt_res_list_member BULK COLLECT INTO
1473 l_assignment_id_tbl,
1474 l_resource_source_id_tbl,
1475 l_fcst_job_id_tbl,
1476 l_exp_org_id_tbl,
1477 l_expenditure_type_tbl,
1478 l_project_role_id_tbl,
1479 l_person_type_tbl,
1480 l_assignment_name_tbl;
1481 CLOSE get_asgmt_res_list_member;
1482
1483 -- dbms_output.put_line ('Requirements to be updated' || l_assignment_id_tbl.COUNT);
1484
1485 -- update planning resource on Project team roles only because
1486 -- resource list cannot be changed on the workplan once task
1487 -- assignment has been created.
1488 IF l_assignment_id_tbl.COUNT > 0 THEN
1489
1490 FOR j IN l_assignment_id_tbl.FIRST .. l_assignment_id_tbl.LAST LOOP
1491
1492 IF l_asgmt_res_format_id IS NOT NULL THEN
1493 l_res_list_member_id_tbl(j) := Pa_Planning_Resource_Utils.Derive_Resource_List_Member(p_project_id,
1494 l_asgmt_res_format_id,
1495 l_resource_source_id_tbl(j),
1496 l_fcst_job_id_tbl(j),
1497 l_exp_org_id_tbl(j),
1498 l_expenditure_type_tbl(j),
1499 NULL,
1500 l_project_role_id_tbl(j),
1501 l_person_type_tbl(j),
1502 l_assignment_name_tbl(j));
1503 ELSE
1504 l_res_list_member_id_tbl(j) := NULL;
1505 END IF;
1506 END LOOP;
1507
1508 FORALL i IN l_assignment_id_tbl.FIRST .. l_assignment_id_tbl.LAST
1509 UPDATE pa_project_assignments
1510 SET resource_list_member_id = l_res_list_member_id_tbl(i),
1511 record_version_number = nvl(record_version_number, 0) + 1
1512 WHERE assignment_id = l_assignment_id_tbl(i);
1513
1514 END IF;
1515
1516 END IF; -- resource list changed
1517
1518 x_return_status := l_return_status;
1519
1520 x_msg_count := FND_MSG_PUB.Count_Msg;
1521
1522 IF x_msg_count = 1 THEN
1523 pa_interface_utils_pub.get_messages ( p_encoded => FND_API.G_TRUE
1524 ,p_msg_index => 1
1525 ,p_data => x_msg_data
1526 ,p_msg_index_out => l_msg_index_out
1527 );
1528 END IF;
1529 -- 4537865 : Included Exception block
1530 EXCEPTION
1531 WHEN OTHERS THEN
1532 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
1533 x_msg_count := 1 ;
1534 x_msg_data := SUBSTRB(SQLERRM,1,240);
1535
1536 Fnd_Msg_Pub.add_exc_msg
1537 ( p_pkg_name => 'PA_ASSIGNMENT_UTILS'
1538 , p_procedure_name => 'ASSOCIATE_PLANNING_RESOURCES'
1539 , p_error_text => x_msg_data);
1540
1541 RAISE;
1542 END Associate_Planning_Resources;
1543
1544 /* Added new function to check if team role is associated with multiple assignement
1545 or requirement for bug 3724780*/
1546
1547 FUNCTION Get_multi_team_role_flag
1548
1549 RETURN VARCHAR2 IS
1550
1551 l_flag varchar2(1) ;
1552
1553 BEGIN
1554
1555 l_flag := 'N';
1556
1557 l_flag := PA_TASK_ASSIGNMENT_UTILS.p_multi_asgmt_req_flag;
1558
1559 RETURN l_flag;
1560
1561 EXCEPTION
1562
1563 WHEN OTHERS THEN
1564
1565 NULL;
1566
1567 RETURN l_flag;
1568
1569 END;
1570
1571 /* the query logic must be same as pa_task_assignment_utils.Get_Team_Role */
1572
1573 FUNCTION Get_project_assignment_id
1574 (p_resource_list_member_id IN NUMBER,
1575 p_project_id IN NUMBER) RETURN NUMBER IS
1576
1577 Cursor C_ASMT_ID IS
1578 select distinct pap.assignment_id
1579 from pa_project_assignments pap, pa_project_statuses stat
1580 where pap.resource_list_member_id = p_resource_list_member_id
1581 and pap.project_id = p_project_id
1582 and pap.STATUS_CODE = stat.PROJECT_STATUS_CODE (+)
1583 and nvl(stat.PROJECT_SYSTEM_STATUS_CODE, '-1') not in ('OPEN_ASGMT_CANCEL','STAFFED_ASGMT_CANCEL', 'OPEN_ASGMT_FILLED');
1584
1585 l_asmt_id NUMBER;
1586
1587 BEGIN
1588 IF p_resource_list_member_id IS NOT NULL THEN
1589 OPEN C_ASMT_ID;
1590 Fetch C_ASMT_ID INTO l_asmt_id;
1591 CLOSE C_ASMT_ID;
1592 RETURN l_asmt_id;
1593 ELSE
1594 RETURN null;
1595 END IF;
1596 EXCEPTION
1597 WHEN OTHERS THEN
1598 RETURN null;
1599 END;
1600
1601 /* the query logic must be same as pa_task_assignment_utils.Get_Team_Role */
1602 FUNCTION Get_project_assignment_type
1603 (p_resource_list_member_id IN NUMBER,
1604 p_project_id IN NUMBER) RETURN VARCHAR2 IS
1605
1606 Cursor C_ASMT_TYPE IS
1607 select distinct pap.assignment_type
1608 from pa_project_assignments pap, pa_project_statuses stat
1609 where pap.resource_list_member_id = p_resource_list_member_id
1610 and pap.project_id = p_project_id
1611 and pap.STATUS_CODE = stat.PROJECT_STATUS_CODE (+)
1612 and nvl(stat.PROJECT_SYSTEM_STATUS_CODE, '-1') not in ('OPEN_ASGMT_CANCEL','STAFFED_ASGMT_CANCEL', 'OPEN_ASGMT_FILLED');
1613
1614 l_asmt_type VARCHAR2(30);
1615
1616 BEGIN
1617 IF p_resource_list_member_id IS NOT NULL THEN
1618 OPEN C_ASMT_TYPE;
1619 Fetch C_ASMT_TYPE INTO l_asmt_type;
1620 CLOSE C_ASMT_TYPE;
1621 RETURN l_asmt_type;
1622 ELSE
1623 RETURN null;
1624 END IF;
1625 EXCEPTION
1626 WHEN OTHERS THEN
1627 RETURN null;
1628 END;
1629
1630
1631
1632
1633 FUNCTION Check_Res_Format_Used_For_TR(p_res_format_id IN NUMBER, p_resource_list_id IN NUMBER)
1634 RETURN VARCHAR2
1635 IS
1636 l_format_used_flag VARCHAR2(1);
1637 BEGIN
1638 SELECT 'Y'
1639 INTO l_format_used_flag
1640 FROM pa_projects_all pa,
1641 pa_proj_fp_options pfo
1642 WHERE (pa.proj_req_res_format_id = p_res_format_id OR pa.proj_asgmt_res_format_id = p_res_format_id)
1643 AND pa.project_id = pfo.project_id
1644 AND pfo.cost_resource_list_id = p_resource_list_id
1645 AND pfo.fin_plan_type_id = (SELECT fin_plan_type_id
1646 FROM pa_fin_plan_types_b
1647 WHERE use_for_workplan_flag = 'Y')
1648 AND pfo.fin_plan_option_level_code = 'PLAN_TYPE'
1649 AND rownum = 1;
1650
1651 RETURN l_format_used_flag;
1652 EXCEPTION
1653 WHEN OTHERS THEN
1654 RETURN 'N';
1655 END;
1656
1657 FUNCTION Get_single_submitted_status(p_project_id IN NUMBER, p_resource_list_member_id IN NUMBER)
1658 RETURN VARCHAR2 IS
1659 Cursor C_Team_Role_Count IS
1660 select count(*) from pa_project_assignments pa
1661 where pa.project_id = p_project_id
1662 and pa.resource_list_member_id = p_resource_list_member_id;
1663
1664 Cursor C_Submitted_Count IS
1665 select count(*) from pa_project_assignments pa
1666 where pa.project_id = p_project_id
1667 and pa.resource_list_member_id = p_resource_list_member_id
1668 and pa.APPRVL_STATUS_CODE = 'ASGMT_APPRVL_SUBMITTED';
1669
1670 l_team_role_count NUMBER;
1671 l_submitted_count NUMBER;
1672 l_single_submitted_flag VARCHAR2(1) := 'N';
1673
1674 BEGIN
1675
1676 OPEN C_Team_Role_Count;
1677 Fetch C_Team_Role_Count INTO l_team_role_count;
1678 CLOSE C_Team_Role_Count;
1679
1680 IF l_team_role_count = 1 THEN
1681
1682 OPEN C_Submitted_Count;
1683 Fetch C_Submitted_Count INTO l_submitted_count;
1684 CLOSE C_Submitted_Count;
1685
1686 IF l_submitted_count = 1 THEN
1687 l_single_submitted_flag := 'Y';
1688 END IF;
1689
1690 END IF;
1691
1692 return l_single_submitted_flag;
1693
1694 EXCEPTION WHEN OTHERS THEN
1695
1696 RETURN 'N';
1697 END;
1698
1699 ------------------------------------------------------------------------------
1700 -- FUNCTION
1701 --
1702 -- PURPOSE
1703 -- This function checks if the resource list member_id has task assignment's beyond team role dates
1704 -- HISTORY
1705 -- 09-15-2004 jraj Created
1706 ------------------------------------------------------------------------------
1707 FUNCTION Get_At_Risk_Status(p_project_id IN NUMBER, p_resource_list_member_id IN NUMBER, p_budget_version_id IN NUMBER, p_start IN VARCHAR2)
1708 RETURN VARCHAR2 IS
1709
1710 Cursor C_At_Risk_Start IS
1711 select ra.schedule_start_date, pa.start_date, pa.end_date
1712 from pa_resource_assignments ra , pa_project_assignments pa
1713 where pa.assignment_id = ra.project_assignment_id
1714 and ra.project_id = p_project_id
1715 and ra.budget_version_id = p_budget_version_id
1716 and ra.resource_list_member_id = p_resource_list_member_id;
1717 C_At_Risk_Start_Rec C_At_Risk_Start%ROWTYPE;
1718
1719 Cursor C_At_Risk_End IS
1720 select ra.schedule_end_date, pa.end_date, pa.start_date
1721 from pa_resource_assignments ra , pa_project_assignments pa
1722 where pa.assignment_id = ra.project_assignment_id
1723 and ra.project_id = p_project_id
1724 and ra.budget_version_id = p_budget_version_id
1725 and ra.resource_list_member_id = p_resource_list_member_id;
1726 C_At_Risk_End_Rec C_At_Risk_End%ROWTYPE;
1727
1728 l_risk_status VARCHAR2(1) := 'N';
1729
1730 BEGIN
1731
1732 IF p_start = 'Y' THEN
1733
1734 OPEN C_At_Risk_Start;
1735 Fetch C_At_Risk_Start INTO C_At_Risk_Start_rec;
1736
1737
1738 IF (C_At_Risk_Start_Rec.start_date > C_At_Risk_Start_Rec.schedule_start_date) OR
1739 (C_At_Risk_Start_Rec.end_date < C_At_Risk_Start_Rec.schedule_start_date) THEN
1740
1741 l_risk_status := 'Y';
1742
1743 END IF;
1744
1745 WHILE C_At_Risk_Start%FOUND LOOP
1746 Fetch C_At_Risk_Start INTO C_At_Risk_Start_rec;
1747
1748
1749 IF (C_At_Risk_Start_Rec.start_date > C_At_Risk_Start_Rec.schedule_start_date) OR
1750 (C_At_Risk_Start_Rec.end_date < C_At_Risk_Start_Rec.schedule_start_date) THEN
1751
1752 l_risk_status := 'Y';
1753
1754 END IF;
1755
1756 END LOOP;
1757
1758 CLOSE C_At_Risk_Start;
1759
1760 ELSIF p_start = 'N' THEN
1761 OPEN C_At_Risk_End;
1762 Fetch C_At_Risk_End INTO C_At_Risk_End_rec;
1763
1764 IF (C_At_Risk_End_Rec.end_date < C_At_Risk_End_Rec.schedule_end_date) OR
1765 (C_At_Risk_End_Rec.start_date > C_At_Risk_End_Rec.schedule_end_date) THEN
1766
1767 l_risk_status := 'Y';
1768
1769 END IF;
1770
1771 WHILE C_At_Risk_End%FOUND LOOP
1772 Fetch C_At_Risk_End INTO C_At_Risk_End_rec;
1773 IF (C_At_Risk_End_Rec.end_date < C_At_Risk_End_Rec.schedule_end_date) OR
1774 (C_At_Risk_End_Rec.start_date > C_At_Risk_End_Rec.schedule_end_date) THEN
1775
1776 l_risk_status := 'Y';
1777
1778 END IF;
1779 END LOOP;
1780 CLOSE C_At_Risk_End;
1781 END IF;
1782
1783
1784
1785 return l_risk_status;
1786
1787 EXCEPTION WHEN OTHERS THEN
1788
1789 RETURN 'N';
1790 END;
1791
1792
1793
1794 FUNCTION Get_Team_Role_Start(p_project_id IN NUMBER, p_resource_list_member_id IN NUMBER)
1795 RETURN DATE IS
1796 Cursor C_Team_Role_Start IS
1797
1798 select min(pap.start_date) team_role_start
1799 from pa_project_assignments pap, pa_project_statuses stat
1800 where
1801 pap.resource_list_member_id = p_resource_list_member_id
1802 and pap.project_id = p_project_id
1803 and
1804 pap.STATUS_CODE = stat.PROJECT_STATUS_CODE (+) and
1805 nvl(stat.PROJECT_SYSTEM_STATUS_CODE, '-1') not in
1806 ('OPEN_ASGMT_CANCEL','STAFFED_ASGMT_CANCEL', 'OPEN_ASGMT_FILLED');
1807 C_Team_Role_Start_Rec C_Team_Role_Start%ROWTYPE;
1808
1809
1810 BEGIN
1811 OPEN C_Team_Role_Start;
1812 FETCH C_Team_Role_Start INTO C_Team_Role_Start_Rec;
1813 CLOSE C_Team_Role_Start;
1814
1815 RETURN C_Team_Role_Start_Rec.team_role_start;
1816 EXCEPTION WHEN OTHERS THEN
1817 RETURN to_date(NULL);
1818 END;
1819
1820
1821
1822 FUNCTION Get_Team_Role_End(p_project_id IN NUMBER, p_resource_list_member_id IN NUMBER)
1823 RETURN DATE IS
1824 Cursor C_Team_Role_End IS
1825 select max(pap.End_date) team_role_End
1826 from pa_project_assignments pap, pa_project_statuses stat
1827 where
1828 pap.resource_list_member_id = p_resource_list_member_id
1829 and pap.project_id = p_project_id
1830 and
1831 pap.STATUS_CODE = stat.PROJECT_STATUS_CODE (+) and
1832 nvl(stat.PROJECT_SYSTEM_STATUS_CODE, '-1') not in
1833 ('OPEN_ASGMT_CANCEL','STAFFED_ASGMT_CANCEL', 'OPEN_ASGMT_FILLED');
1834 C_Team_Role_End_Rec C_Team_Role_End%ROWTYPE;
1835
1836
1837 BEGIN
1838 OPEN C_Team_Role_End;
1839 FETCH C_Team_Role_End INTO C_Team_Role_End_Rec;
1840 CLOSE C_Team_Role_End;
1841
1842 RETURN C_Team_Role_End_Rec.team_role_End;
1843 EXCEPTION WHEN OTHERS THEN
1844 RETURN to_date(NULL);
1845 END;
1846
1847 -- 4363092 Added following function for MOAC Changes
1848 -- returns default org_id
1849
1850 FUNCTION Get_Dft_Info
1851 RETURN NUMBER IS
1852
1853 l_dflt_ou hr_operating_units.organization_id%TYPE;
1854 l_ou_count NUMBER;
1855 l_dflt_ou_name hr_operating_units.name%TYPE;
1856
1857 l_proj_imp_flag VARCHAR2(1) := 'N';
1858
1859 Cursor c_imp_ous IS
1860 select org_id
1861 from pa_implementations where rownum = 1;
1862
1863 Cursor c_check_proj_imp(p_org_id NUMBER ) IS
1864 select 'Y'
1865 from pa_implementations
1866 where org_id = p_org_id ;
1867
1868 l_ou_id hr_operating_units.organization_id%TYPE;
1869
1870 BEGIN
1871
1872 PA_MOAC_UTILS.GET_DEFAULT_OU
1873 (
1874 p_product_code => 'PA',
1875 p_default_org_id => l_dflt_ou,
1876 p_default_ou_name => l_dflt_ou_name,
1877 p_ou_count => l_ou_count
1878 );
1879
1880 IF l_dflt_ou IS NOT NULL THEN
1881
1882 OPEN c_check_proj_imp(l_dflt_ou);
1883 FETCH c_check_proj_imp INTO l_proj_imp_flag;
1884 CLOSE c_check_proj_imp;
1885
1886 IF l_proj_imp_flag = 'Y' THEN
1887 l_ou_id := l_dflt_ou;
1888 END IF;
1889
1890 END IF;
1891
1892 IF l_dflt_ou IS NULL OR l_proj_imp_flag = 'N' THEN
1893
1894 OPEN c_imp_ous;
1895 FETCH c_imp_ous INTO l_ou_id;
1896 CLOSE c_imp_ous;
1897
1898 END IF;
1899
1900 RETURN l_ou_id;
1901
1902 END Get_Dft_Info;
1903
1904 END PA_ASSIGNMENT_UTILS;