DBA Data[Home] [Help]

PACKAGE BODY: APPS.PA_TASK_ASSIGNMENT_UTILS

Source


1 PACKAGE BODY PA_TASK_ASSIGNMENT_UTILS as
2 --/* $Header: PATAUTLB.pls 120.21.12020000.3 2013/05/23 15:58:39 djambhek ship $ */
3 
4 P_DEBUG_MODE varchar2(1) := NVL(FND_PROFILE.value('PA_DEBUG_MODE'), 'N');
5 L_MODULE varchar2(100) := 'PA_TASK_ASSIGNMENT_UTILS';
6 li_message_level NUMBER := 1;
7 li_curr_level NUMBER := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
8 
9 
10 
11 
12 
13 --
14 --  FUNCTION
15 --              Get_Task_Resources
16 --  PURPOSE
17 --              Returns VARCHAR - a string of planning resource aliases on a given task.
18 -- Input parameters
19 -- Parameters                   Type           Required  Description
20 -- p_element_version_id         NUMBER          YES      Element Version Id
21 --  Author : jraj 01/08/03
22 /*
23 FUNCTION Get_Task_Resources(p_element_version_id IN NUMBER) RETURN VARCHAR2 IS
24 
25 l_resource_aliases VARCHAR2(20000);
26 
27 CURSOR C1_GTR(p_element_version_id in NUMBER) IS
28 	SELECT pr.alias
29 	FROM pa_resource_assignments ra, pa_resource_list_members pr
30 	WHERE ra.resource_list_member_id = pr.resource_list_member_id
31 	AND ra.wbs_element_version_id = p_element_version_id
32 	AND ra.resource_class_code = 'PEOPLE'
33 	AND ra.ta_display_flag = 'Y'
34 	AND rownum <= 5
35 
36 	UNION ALL
37 
38 	SELECT pr.alias
39 	FROM pa_resource_assignments ra, pa_resource_list_members pr
40 	WHERE ra.resource_list_member_id = pr.resource_list_member_id
41 	AND ra.wbs_element_version_id = p_element_version_id
42 	AND ra.resource_class_code = 'EQUIPMENT'
43 	AND ra.ta_display_flag = 'Y'
44 	AND rownum <= 5
45 
46 	UNION ALL
47 
48 	SELECT pr.alias
49 	FROM pa_resource_assignments ra, pa_resource_list_members pr
50 	WHERE ra.resource_list_member_id = pr.resource_list_member_id
51 	AND ra.wbs_element_version_id = p_element_version_id
52 	AND ra.resource_class_code = 'MATERIAL_ITEMS'
53 	AND ra.ta_display_flag = 'Y'
54 	AND rownum <= 5
55 
56 	UNION ALL
57 
58 	SELECT pr.alias
59 	FROM pa_resource_assignments ra, pa_resource_list_members pr
60 	WHERE ra.resource_list_member_id = pr.resource_list_member_id
61 	AND ra.wbs_element_version_id = p_element_version_id
62 	AND ra.resource_class_code = 'FINANCIAL_ELEMENTS'
63 	AND ra.ta_display_flag = 'Y'
64 	AND rownum <= 5;
65 
66 L_FuncProc varchar2(250) := 'DEFAULT';
67 v_C1_GTR C1_GTR%ROWTYPE;
68 
69 BEGIN
70 
71    L_FuncProc := 'Get_Task_Resources';
72 
73    IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 3) THEN
74        PA_DEBUG.write_log (x_module      => L_Module,
75                            x_msg         => 'Entered' || L_FuncProc,
76                            x_log_level   => 3);
77    END IF;
78 
79    OPEN C1_GTR( p_element_version_id);
80 
81    FOR loop_index in 1..6 LOOP
82 
83       FETCH C1_GTR INTO v_C1_GTR;
84       EXIT WHEN C1_GTR%NOTFOUND;
85       IF loop_index = 1 THEN
86          l_resource_aliases := v_C1_GTR.alias;
87       ELSIF loop_index < 6 THEN
88          l_resource_aliases := l_resource_aliases || ',' || v_C1_GTR.alias;
89       ELSIF loop_index = 6 THEN
90          l_resource_aliases := l_resource_aliases || '...';
91       END IF;
92 
93    END LOOP;
94 
95    CLOSE C1_GTR;
96 
97    IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 3) THEN
98        PA_DEBUG.write_log (x_module    => L_Module,
99                            x_msg       => 'Returning:' || L_FuncProc,
100                            x_log_level => 3);
101    END IF;
102 
103    RETURN (l_resource_aliases);
104 
105    EXCEPTION
106 
107        WHEN NO_DATA_FOUND THEN
108            IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 5) THEN
109                PA_DEBUG.write_log (x_module    => L_Module,
110                                    x_msg       => 'Error:' || L_FuncProc || SQLERRM,
111                                    x_log_level => 5);
112            END IF;
113 
114        WHEN OTHERS THEN
115            IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 6) THEN
116                PA_DEBUG.write_log (x_module    => L_Module,
117                                    x_msg       => 'Unexp. Error:' || L_FuncProc || SQLERRM,
118                                    x_log_level => 6);
119            END IF;
120            FND_MSG_PUB.add_exc_msg( p_pkg_name       => 'PA_TASK_ASSIGNMENT_UTILS',
121                                     p_procedure_name => 'Get_Task_Resources');
122            RAISE;
123 
124 END  Get_Task_Resources;
125 */
126 
127 --
128 --  FUNCTION
129 --              Get_Task_Resources_Count
130 --  PURPOSE
131 --              Returns VARCHAR - No of planning resource  on a given task.
132 -- Bug 16461684
133 
134 FUNCTION Get_Task_Resources(p_element_version_id IN NUMBER) RETURN VARCHAR2 IS
135 
136 CURSOR C1_GTR(p_element_version_id in NUMBER) IS
137 	SELECT count(*) resource_count
138 	FROM pa_resource_assignments ra, pa_resource_list_members pr
139 	WHERE ra.resource_list_member_id = pr.resource_list_member_id
140 	AND ra.wbs_element_version_id = p_element_version_id
141 	AND ra.ta_display_flag = 'Y';
142 
143 
144 L_FuncProc varchar2(250) := 'DEFAULT';
145 v_C1_GTR   varchar2(15);
146 
147 BEGIN
148 
149    L_FuncProc := 'Get_Task_Resources';
150 
151    IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 3) THEN
152        PA_DEBUG.write_log (x_module      => L_Module,
153                            x_msg         => 'Entered' || L_FuncProc,
154                            x_log_level   => 3);
155    END IF;
156 
157    OPEN C1_GTR( p_element_version_id);
158    FETCH C1_GTR INTO v_C1_GTR;
159    CLOSE C1_GTR;
160 
161    IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 3) THEN
162        PA_DEBUG.write_log (x_module    => L_Module,
163                            x_msg       => 'Returning:' || L_FuncProc,
164                            x_log_level => 3);
165    END IF;
166 	IF v_C1_GTR = 0 THEN
167 	  v_C1_GTR:=NULL;
168 	END IF;
169    RETURN (v_C1_GTR);
170 
171    EXCEPTION
172 
173        WHEN NO_DATA_FOUND THEN
174            IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 5) THEN
175                PA_DEBUG.write_log (x_module    => L_Module,
176                                    x_msg       => 'Error:' || L_FuncProc || SQLERRM,
177                                    x_log_level => 5);
178            END IF;
179 
180        WHEN OTHERS THEN
181            IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 6) THEN
182                PA_DEBUG.write_log (x_module    => L_Module,
183                                    x_msg       => 'Unexp. Error:' || L_FuncProc || SQLERRM,
184                                    x_log_level => 6);
185            END IF;
186            FND_MSG_PUB.add_exc_msg( p_pkg_name       => 'PA_TASK_ASSIGNMENT_UTILS',
187                                     p_procedure_name => 'Get_Task_Resources');
188            RAISE;
189 
190 END  Get_Task_Resources;
191 
192 
193 
194 
195 --
196 --  FUNCTION
197 --              Check_Asgmt Exists in Task
198 --  PURPOSE
199 --              Returns VARCHAR - 'Y' if task assignment exists in the given workplan task version.
200 -- Input parameters
201 -- Parameters                   Type           Required  Description
202 -- p_element_version_id         NUMBER          YES      Element Version Id
203 --  Author : jraj 01/08/03
204 
205 FUNCTION Check_Asgmt_Exists_In_Task(p_element_version_id IN NUMBER) RETURN VARCHAR2
206 
207 IS
208 
209 l_exists varchar2(1) := 'N';
210 
211 CURSOR C1_Check_Exists(p_element_version_id IN NUMBER) IS
212    SELECT 'Y'
213    FROM pa_resource_assignments ra
214    WHERE ra.ta_display_flag = 'Y'
215    AND ra.wbs_element_version_id = p_element_version_id
216    AND rownum = 1;
217 
218 L_FuncProc varchar2(250) ;
219 
220 BEGIN
221 
222     L_FuncProc := 'Check_Asgmt_Exists_In_Task';
223 
224     IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 3) THEN
225         PA_DEBUG.write_log (x_module    => L_Module,
226                             x_msg       => 'Entered' || L_FuncProc,
227                             x_log_level => 3);
228     END IF;
229 
230     OPEN C1_Check_Exists(p_element_version_id);
231     FETCH C1_Check_Exists INTO L_exists;
232     CLOSE C1_Check_Exists;
233 
234     IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 3) THEN
235         PA_DEBUG.write_log (x_module => L_Module,
236                             x_msg         => 'Returning:' || L_FuncProc ||':'|| L_EXISTS,
237                             x_log_level   => 3);
238     END IF;
239 
240     RETURN L_EXISTS;
241 
242 EXCEPTION
243 
244     WHEN NO_DATA_FOUND THEN
245         IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 5) THEN
246             PA_DEBUG.write_log (x_module    => L_Module,
247                                 x_msg       => 'Error:' || L_FuncProc || SQLERRM,
248                                 x_log_level => 5);
249         END IF;
250         RETURN 'N';
251 
252     WHEN OTHERS THEN
253         IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 6) THEN
254             PA_DEBUG.write_log (x_module => L_Module,
255                                 x_msg         => 'Unexp. Error:' || L_FuncProc || SQLERRM,
256                                 x_log_level   => 6);
257         END IF;
258         FND_MSG_PUB.add_exc_msg( p_pkg_name       => 'PA_TASK_ASSIGNMENT_UTILS',
259                                  p_procedure_name => 'Check_Asgmt_Exists_In_Task');
260         RAISE;
261 
262 END Check_Asgmt_Exists_In_Task;
263 
264 
265 
266 
267 
268 --DOOSAN 2
269 --
270 --  FUNCTION
271 --              	Check_Task_Asgmt_Exists
272 --  PURPOSE
273 --  If task assignment exists in the given financial task on the given ei date
274 --  for a person, return 'Y'; otherwise, return 'N'.
275 -- Input parameters
276 -- Parameters                   Type           Required  Description
277 -- p_element_version_id         NUMBER          YES      Element Version Id
278 -- p_person_id                  NUMBER          YES      Person Id
279 -- p_financial_task_id          NUMBER          YES      Financial Task Id
280 -- p_ei_date                    DATE            YES
281 --  Author : jraj 01/08/03
282 
283 FUNCTION Check_Task_Asgmt_Exists(
284          p_person_id IN NUMBER,
285          p_financial_task_id IN NUMBER,
286          p_ei_date IN DATE) RETURN VARCHAR2
287 IS
288 
289 l_exists VARCHAR2(1) := 'N';
290 --l_wp_task_id NUMBER;
291 
292 --CURSOR C1_Check_Exists(p_wp_task_id IN NUMBER, p_ei_date IN DATE) IS
293 CURSOR C1_Check_Exists(p_ei_date IN DATE, p_project_id IN NUMBER) IS
294 	SELECT 'Y'
295 	FROM pa_resource_assignments ra, pa_map_wp_to_fin_tasks_v map
296 	WHERE p_ei_date BETWEEN ra.planning_start_date AND ra.planning_end_Date
297 	AND ra.person_id = p_person_id
298 	AND ra.ta_display_flag = 'Y'
299 	AND ra.wbs_element_version_id = map.element_version_id
300 	AND map.mapped_fin_task_id = p_financial_task_id
301 	AND map.project_id = p_project_id
302 	AND ROWNUM = 1;
303 
304 CURSOR C_Get_Project_Id IS
305 	SELECT project_id
306 	FROM pa_proj_elements
307 	WHERE proj_element_id = p_financial_task_id;
308 
309 l_project_id NUMBER := to_number(NULL);
310 L_FuncProc VARCHAR2(250) ;
311 
312 BEGIN
313 
314     L_FuncProc := 'Check_Task_Asgmt_Exists';
315 
316     IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 3) THEN
317         PA_DEBUG.write_log (x_module => L_Module,
318                             x_msg         => 'Entered:' || L_FuncProc,
319                             x_log_level   => 3);
320     END IF;
321 
322 	OPEN C_Get_Project_Id;
323 	FETCH C_Get_Project_Id INTO l_project_id;
324 	CLOSE C_Get_Project_Id;
325 
326 	IF l_project_id IS NOT NULL THEN
327 
328 	    OPEN C1_Check_Exists(p_ei_date, l_project_id);
329 	    FETCH C1_Check_Exists INTO L_exists;
330 	    CLOSE C1_Check_Exists;
331 
332 	END IF;
333 
334     IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 3) THEN
335         PA_DEBUG.write_log (x_module => L_Module,
336                             x_msg         => 'Returning:' || L_FuncProc ||':'|| L_EXISTS,
337                             x_log_level   => 3);
338     END IF;
339 
340     RETURN L_EXISTS;
341 
342 EXCEPTION
343 
344     WHEN NO_DATA_FOUND THEN
345         IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 5) THEN
346           PA_DEBUG.write_log (x_module => L_Module,
347                               x_msg         => 'Error:' || L_FuncProc || SQLERRM,
348                               x_log_level   => 5);
349         END IF;
350         RETURN 'N';
351 
352     WHEN OTHERS THEN
353         IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 6) THEN
354           PA_DEBUG.write_log (x_module => L_Module,
355                               x_msg         => 'Error:' || L_FuncProc || SQLERRM,
356                               x_log_level   => 6);
357         END IF;
358         FND_MSG_PUB.add_exc_msg( p_pkg_name       => L_Module,
359                                  p_procedure_name => L_FuncProc);
360         RAISE;
361 
362 END Check_Task_Asgmt_Exists;
363 
364 
365 
366 
367 
368 --
369 --  FUNCTION
370 --              Compare Dates
371 --  PURPOSE
372 --              Returns VARCHAR - 'E ' if first date is earlier than second and
373 --                                'L' if first date is greater than second and
374 --                                'S' otherwise.
375 -- Input parameters
376 -- Parameters                   Type           Required  Description
377 -- P_First_Date                 DATE            YES       First  Date for Comparison
378 -- P_Second_Date                DATE            YES       Second Date for Comparison
379 --  Author : jraj 01/08/03
380 
381 FUNCTION Compare_Dates(p_first_date IN DATE, p_second_date IN DATE) RETURN VARCHAR2
382 
383 IS
384 
385 L_value varchar2(1) := 'L';
386 L_FuncProc varchar2(250) ;
387 
388 BEGIN
389 
390     L_FuncProc := 'Compare_Dates';
391 
392     IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 3) THEN
393         PA_DEBUG.write_log (x_module => L_Module,
394                             x_msg         => 'Entered:' || L_FuncProc,
395                             x_log_level   => 3);
396     END IF;
397 
398     IF p_first_date < p_second_date THEN
399         RETURN 'E';
400     ELSIF p_first_date > p_second_date THEN
401         RETURN 'L';
402     ELSE
403         RETURN 'S';
404     END IF;
405 
406 EXCEPTION
407 
408     WHEN NO_DATA_FOUND THEN
409         IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 5) THEN
410             PA_DEBUG.write_log (x_module => L_Module,
411                                 x_msg         => 'Error:' || L_FuncProc || SQLERRM,
412                                 x_log_level   => 5);
413         END IF;
414         RETURN 'N';
415 
416     WHEN OTHERS THEN
417         IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 6) THEN
418           PA_DEBUG.write_log (x_module => L_Module,
419                               x_msg         => 'Error:' || L_FuncProc || SQLERRM,
420                               x_log_level   => 6);
421         END IF;
422         FND_MSG_PUB.add_exc_msg( p_pkg_name       => L_Module,
423                                  p_procedure_name => L_FuncProc);
424         RAISE;
425 
426 END Compare_Dates;
427 
428 
429 
430 
431 
432 -- This procedure will Adjust the Task Assignment Dates
433 -- upon changes on a Task's Scheduled Dates.
434 -- Input parameters
435 -- Parameters                   Type           Required  Description
436 --p_context                     VARCHAR        NO        'COPY' - does not call
437 --                                                       update planning transaction.
438 --                                                       Returns the new dates.
439 --                                                       'UPDATE' - calls update
440 --                                                       planning transaction.
441 --                                                       'INSERT_VALUES' - insert
442 --                                                       values into temp table.
443 --p_element_version_id          NUMBER,        YES       Element Version Id
444 --p_old_task_sch_start          DATE,          YES       Old Task Scheduled Start
445 --p_old_task_sch_finish         DATE,          YES       Old Task Sch. Finish
446 --p_new_task_sch_start          DATE,          YES       New Task Sch. Start
447 --p_new_task_sch_finish         DATE,          YES       New Task Sch. Finish
448 -- Out parameters
449 -- Standard
450 
451 
452 PROCEDURE Adjust_Asgmt_Dates
453 (
454 	p_context                IN   VARCHAR2 DEFAULT 'UPDATE',
455 	p_element_version_id     IN   NUMBER,
456 	p_old_task_sch_start     IN   DATE,
457 	p_old_task_sch_finish    IN   DATE DEFAULT NULL,
458 	p_new_task_sch_start     IN   DATE,
459 	p_new_task_sch_finish    IN   DATE,
460 	x_res_assignment_id_tbl  OUT NOCOPY  SYSTEM.PA_NUM_TBL_TYPE,
461 	x_planning_start_tbl     OUT NOCOPY  SYSTEM.PA_DATE_TBL_TYPE,
462 	x_planning_end_tbl       OUT NOCOPY  SYSTEM.PA_DATE_TBL_TYPE,
463 	x_return_status          OUT NOCOPY  VARCHAR2
464 )
465 
466 IS
467 
468 l_struct_ver_id number;
469 l_budget_ver_id number;
470 l_use_task_sch_asgmt_tbl     SYSTEM.pa_num_tbl_type  := SYSTEM.pa_num_tbl_type();
471 l_use_task_quantity_tbl      SYSTEM.pa_num_tbl_type  := SYSTEM.pa_num_tbl_type();
472 l_use_task_task_ver_tbl      SYSTEM.pa_num_tbl_type  := SYSTEM.pa_num_tbl_type();
473 l_adj_dates_asgmt_tbl	     SYSTEM.pa_num_tbl_type  := SYSTEM.pa_num_tbl_type();
474 l_adj_task_quantity_tbl      SYSTEM.pa_num_tbl_type  := SYSTEM.pa_num_tbl_type();
475 l_adj_task_task_ver_tbl      SYSTEM.pa_num_tbl_type  := SYSTEM.pa_num_tbl_type();
476 l_quantity_tbl               SYSTEM.pa_num_tbl_type  := SYSTEM.pa_num_tbl_type();
477 l_finish_flg_tbl             SYSTEM.pa_varchar2_1_tbl_type  := SYSTEM.pa_varchar2_1_tbl_type();
478 k                            number;
479 l_task_elem_version_id_tbl   SYSTEM.pa_num_tbl_type  := SYSTEM.pa_num_tbl_type();
480 l_resource_assignment_id_tbl SYSTEM.pa_num_tbl_type  := SYSTEM.pa_num_tbl_type();
481 l_schedule_start_date_tbl    SYSTEM.pa_date_tbl_type  := SYSTEM.pa_date_tbl_type();
482 l_schedule_end_date_tbl      SYSTEM.pa_date_tbl_type  := SYSTEM.pa_date_tbl_type();
483 l_delay_tbl                  SYSTEM.pa_num_tbl_type  := SYSTEM.pa_num_tbl_type();
484 l_duration_tbl               SYSTEM.pa_num_tbl_type  := SYSTEM.pa_num_tbl_type();
485 l_new_start_tbl              SYSTEM.pa_date_tbl_type  := SYSTEM.pa_date_tbl_type();
486 l_new_end_tbl                SYSTEM.pa_date_tbl_type  := SYSTEM.pa_date_tbl_type();
487 l_resource_rec_tbl           l_resource_rec_tbl_type;
488 l_task_rec                   task_rec_type;
489 l_msg_data                   VARCHAR2(4000);
490 l_msg_count                  NUMBER;
491 l_x_return_status            VARCHAR2(1) := FND_API.G_RET_STS_SUCCESS;
492 l_new_task_sch_start         SYSTEM.pa_date_tbl_type  := SYSTEM.pa_date_tbl_type();
493 l_new_task_sch_finish        SYSTEM.pa_date_tbl_type  := SYSTEM.pa_date_tbl_type();
494 l_use_task_new_sch_start     SYSTEM.pa_date_tbl_type  := SYSTEM.pa_date_tbl_type();
495 l_use_task_new_sch_end       SYSTEM.pa_date_tbl_type  := SYSTEM.pa_date_tbl_type();
496 l_num_of_tasks               NUMBER;
497 l_db_block_size              NUMBER;
498 l_num_blocks                 NUMBER;
499 
500 cursor get_bvid IS
501 	SELECT bv.budget_version_id, pev.parent_structure_version_id
502 	from pa_proj_element_versions pev, pa_budget_versions bv
503 	where pev.element_version_id = p_element_version_id
504 	and pev.parent_structure_version_id = bv.project_structure_version_id;
505 
506 L_FuncProc varchar2(250) ;
507 
508 BEGIN
509 
510     L_FuncProc := 'Adjust_Asgmt_Dates';
511     x_return_status :=   l_x_return_status ;
512 
513     IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 3) THEN
514 	    pa_debug.g_err_stage:='Beginning of TA: Adjust_Asgmt_Dates: ';
515 	    pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
516 	    pa_debug.g_err_stage:= 'p_context: ' || p_context;
517 	    pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
518 	    pa_debug.g_err_stage:= 'p_element_version_id :' || p_element_version_id ;
519 	    pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
520 	    pa_debug.g_err_stage:='p_old_task_sch_start: ' || p_old_task_sch_start;
521 	    pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
522 	    pa_debug.g_err_stage:= 'p_new_task_sch_start: ' || p_new_task_sch_start;
523 	    pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
524 	    pa_debug.g_err_stage:= 'p_new_task_sch_finish: ' || p_new_task_sch_finish ;
525 	    pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
526 	END IF;
527 
528     IF p_old_task_sch_start <> p_new_task_sch_start OR
529        p_old_task_sch_finish <> p_new_task_sch_finish OR
530        p_old_task_sch_finish is null THEN
531 
532        -- Bug 4153366: If p_context = 'INSERT_VALUES' or 'COPY' or 'UPDATE,
533        -- just insert the IN parameters into temp table.
534 
535 	    IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 3) THEN
536 	        pa_debug.g_err_stage:= 'insert into temp table:';
537 	        pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
538 		END IF;
539 
540  /*Bug 4377886 : Included explicitly the column names in the INSERT statement
541                  to remove the GSCC Warning File.Sql.33 */
542 
543         INSERT INTO pa_copy_asgmts_temp
544         (
545 	SRC_ELEM_VER_ID,
546 	TARG_ELEM_VER_ID,
547 	OLD_TASK_SCH_START,
548 	OLD_TASK_SCH_END,
549 	NEW_TASK_SCH_START,
550 	NEW_TASK_SCH_END
551 	)
552         VALUES
553 	(p_element_version_id, null,
554          p_old_task_sch_start,p_old_task_sch_finish,
555          p_new_task_sch_start,p_new_task_sch_finish);
556 
557 
558     END IF;
559 
560     -- Bug 4153366: If p_context = 'UPDATE' or 'COPY'
561     -- proceed on deriving new assignment dates
562     IF p_context = 'UPDATE' OR p_context = 'COPY' THEN
563 
564       SELECT count(SRC_ELEM_VER_ID)
565       INTO l_num_of_tasks
566       FROM pa_copy_asgmts_temp;
567 
568       IF l_num_of_tasks > 0 THEN
569 
570         x_res_assignment_id_tbl  := SYSTEM.PA_NUM_TBL_TYPE() ;
571         x_planning_start_tbl     := SYSTEM.PA_DATE_TBL_TYPE() ;
572         x_planning_end_tbl       := SYSTEM.PA_DATE_TBL_TYPE() ;
573 
574         OPEN get_bvid;
575         FETCH get_bvid into l_budget_ver_id, l_struct_ver_id;
576         CLOSE get_bvid;
577 
578 	    IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 3) THEN
579 	        pa_debug.g_err_stage:= 'l_budget_ver_id: ' || l_budget_ver_id;
580 	        pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
581 	        pa_debug.g_err_stage:= 'l_struct_ver_id: ' || l_struct_ver_id ;
582 	        pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
583 		END IF;
584 
585         -- Bug 4153366: Manually seed the statistics for the temporary table.
586 	SELECT to_number(value)
587 	INTO   l_db_block_size
588 	FROM   v$parameter
589 	WHERE  name = 'db_block_size';
590 
591 	l_num_blocks := 1.25 * (l_num_of_tasks * 75) / l_db_block_size;
592 
593 	-- Manually seed the statistics for the temporary table.
594 	-- Bug 8261905, Replaced 'PA' by PJI_UTILS.GET_PA_SCHEMA_NAME
595 	set_table_stats(PJI_UTILS.GET_PA_SCHEMA_NAME,'PA_COPY_ASGMTS_TEMP', l_num_of_tasks, l_num_blocks, 75);
596 
597         --Get all task assignments in the given task with '
598     	--Assignment same as Task Duration' flag checked
599         --Bug 4153366: Select task versions from temp table.
600         SELECT  ra.resource_assignment_id, ra.total_plan_quantity,
601                 tasks.src_elem_ver_id, tasks.new_task_sch_start, tasks.new_task_sch_end
602         BULK COLLECT INTO l_use_task_sch_asgmt_tbl, l_use_task_quantity_tbl,
603                           l_use_task_task_ver_tbl, l_use_task_new_sch_start, l_use_task_new_sch_end --Bug 4153366
604         FROM    pa_resource_assignments ra, pa_copy_asgmts_temp tasks
605         WHERE   ra.use_task_schedule_flag = 'Y'
606         AND     ra.ta_display_flag is not null
607         AND     ra.budget_version_id =  l_budget_ver_id -- Bug 4229020
608         AND     ra.wbs_element_version_id = tasks.src_elem_ver_id;
609 
610 	    IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 3) THEN
611 			pa_debug.g_err_stage:= 'Use task sch case found' ;
612 	        pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
613 		END IF;
614 
615         -- Get all task assignments without the above flag checked and with start or
616         -- end date outside the new task dates range:
617         -- IB2 Unplanned Actual changes
618         -- Replace planning dates with schedule dates
619         --Bug 4153366: Select task versions from temp table.
620         SELECT ra.resource_assignment_id, ra.total_plan_quantity,
621         (ra.schedule_start_date - tasks.OLD_TASK_SCH_START) old_delay,
622         (ra.schedule_end_date - ra.schedule_start_date) old_duration,
623         (tasks.NEW_TASK_SCH_START + (ra.schedule_start_date - tasks.OLD_TASK_SCH_START)) new_start_date,
624         (tasks.NEW_TASK_SCH_START + (ra.schedule_start_date - tasks.OLD_TASK_SCH_START)
625                             + (ra.schedule_end_date - ra.schedule_start_date)) new_end_date,
626         Compare_Dates((tasks.NEW_TASK_SCH_START + (ra.schedule_start_date - tasks.OLD_TASK_SCH_START)
627         + (ra.schedule_end_date - ra.schedule_start_date)), tasks.NEW_TASK_SCH_END),
628         -- compare 'new assignment start + old duration' to 'task new end'
629         tasks.NEW_TASK_SCH_START,
630         tasks.NEW_TASK_SCH_END,
631         tasks.src_elem_ver_id
632         BULK COLLECT INTO
633         l_adj_dates_asgmt_tbl, l_adj_task_quantity_tbl, l_delay_tbl, l_duration_tbl,
634   	    l_new_start_tbl,  l_new_end_tbl, l_finish_flg_tbl, l_new_task_sch_start, l_new_task_sch_finish, l_adj_task_task_ver_tbl
635         FROM pa_resource_assignments ra, pa_copy_asgmts_temp tasks
636         WHERE nvl(ra.use_task_schedule_flag, 'N') <> 'Y'
637         AND ra.ta_display_flag is not null
638         AND ra.budget_version_id =  l_budget_ver_id
639         AND ra.wbs_element_version_id = tasks.src_elem_ver_id;
640 
641 	    IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 3) THEN
642 			pa_debug.g_err_stage:= 'Use Adj. sch case found' ;
643 	        pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
644 	        pa_debug.g_err_stage:= 'B4 check for dates NULL or not';
645 	        pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
646 		END IF;
647 
648         IF (l_use_task_sch_asgmt_tbl is not null OR l_adj_dates_asgmt_tbl is not NULL)
649            AND ( l_use_task_sch_asgmt_tbl.COUNT  + l_adj_dates_asgmt_tbl.COUNT > 0) THEN
650 
651 		    IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 3) THEN
652 	            pa_debug.g_err_stage:= 'A4 check for dates NULL or not';
653 	            pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
654 			END IF;
655 
656             l_resource_assignment_id_tbl.extend(l_use_task_sch_asgmt_tbl.COUNT+l_adj_dates_asgmt_tbl.COUNT);
657             l_schedule_start_date_tbl.extend(l_use_task_sch_asgmt_tbl.COUNT+l_adj_dates_asgmt_tbl.COUNT);
658             l_schedule_end_date_tbl.extend(l_use_task_sch_asgmt_tbl.COUNT+l_adj_dates_asgmt_tbl.COUNT);
659             l_quantity_tbl.extend(l_use_task_sch_asgmt_tbl.COUNT+l_adj_dates_asgmt_tbl.COUNT);
660             l_task_elem_version_id_tbl.extend(l_use_task_sch_asgmt_tbl.COUNT+l_adj_dates_asgmt_tbl.COUNT); --Bug 4153366
661 
662             For i IN 1..l_use_task_sch_asgmt_tbl.COUNT LOOP
663 
664                 l_resource_assignment_id_tbl(i) := l_use_task_sch_asgmt_tbl(i);
665 	        l_quantity_tbl(i)               := l_use_task_quantity_tbl(i);
666                 l_schedule_start_date_tbl(i)    := l_use_task_new_sch_start(i); --Bug 4153366
667                 l_schedule_end_date_tbl(i)      := l_use_task_new_sch_end(i); --Bug 4153366
668                 l_task_elem_version_id_tbl(i)   := l_use_task_task_ver_tbl(i); --Bug 4153366
669 
670 				IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 3) THEN
671 	                pa_debug.g_err_stage:=' l_task_elem_version_id_tbl(i): ' ||  l_task_elem_version_id_tbl(i);
672 	                pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
673 	                pa_debug.g_err_stage:='l_resource_assignment_id_tbl(' || i || ') : ' || l_resource_assignment_id_tbl(i);
674 			        pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
675 			        pa_debug.g_err_stage:='l_schedule_start_date_tbl(' || i || ') : ' || l_schedule_start_date_tbl(i);
676 	                pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
677 	                pa_debug.g_err_stage:='l_schedule_end_date_tbl(' || i || ') : ' || l_schedule_end_date_tbl(i);
678 	                pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
679 				END IF;
680 
681 	    END LOOP;
682 
683             k := 1;
684 
685             FOR i IN (l_use_task_sch_asgmt_tbl.COUNT+1)..(l_use_task_sch_asgmt_tbl.COUNT+l_adj_dates_asgmt_tbl.COUNT) LOOP
686 
687     		l_resource_assignment_id_tbl(i)   := l_adj_dates_asgmt_tbl(k);
688                 l_quantity_tbl(i)                 := l_adj_task_quantity_tbl(k);
689                 l_task_elem_version_id_tbl(i)     := l_adj_task_task_ver_tbl(k); --Bug 4153366
690 
691                 --Bug 4153366
692     	        IF l_delay_tbl(k) <=  (l_new_task_sch_finish(k) - l_new_task_sch_start(k)) THEN
693 
694     		    --new assignment start date = task new start + delay
695                     l_schedule_start_date_tbl(i) := l_new_start_tbl(k);
696 
697                     IF l_finish_flg_tbl(k) = 'L' THEN
698                         --Bug 4153366
699                         l_schedule_end_date_tbl(i)  := l_new_task_sch_finish(k);
700                     ELSE
701                         l_schedule_end_date_tbl(i)  := l_new_end_tbl(k);
702                     END IF;
703 
704                 ELSIF l_delay_tbl(k) > (p_new_task_sch_finish - p_new_task_sch_start ) THEN
705 
706                     --Assignment dates should be defaulted to task dates:
707                     --Bug 4153366
708     	            l_schedule_start_date_tbl(i) := l_new_task_sch_start(k);
709                     l_schedule_end_date_tbl(i)   := l_new_task_sch_finish(k);
710 
711                 END IF;
712 
713 				IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 3) THEN
714 	                pa_debug.g_err_stage:='l_resource_assignment_id_tbl(' || i || ') : ' || l_resource_assignment_id_tbl(i);
715 	                pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
716 	                pa_debug.g_err_stage:='l_schedule_start_date_tbl(' || i || ') : ' || l_schedule_start_date_tbl(i);
717 	                pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
718 	                pa_debug.g_err_stage:='l_schedule_end_date_tbl(' || i || ') : ' || l_schedule_end_date_tbl(i);
719 	                pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
720 				END IF;
721 
722     		k := k + 1;
723 
724             END LOOP;
725 
726             IF p_context = 'UPDATE' THEN
727 
728 	    	   	IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 3) THEN
729 	                pa_debug.g_err_stage:= ' B4 update planning transaction call  update in adjust dates:  ' ||  x_return_status;
730 	                pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
731 				END IF;
732 
733                 pa_fp_planning_transaction_pub.update_planning_transactions
734                 (
735                     p_context                      =>          'TASK_ASSIGNMENT',
736                     p_struct_elem_version_id       =>          l_struct_ver_id,
737                     p_budget_version_id            =>          l_budget_ver_id,
738                     p_task_elem_version_id_tbl     =>          l_task_elem_version_id_tbl,
739                     p_resource_assignment_id_tbl   =>          l_resource_assignment_id_tbl,
740                     p_schedule_start_date_tbl      =>          l_schedule_start_date_tbl,
741                     p_schedule_end_date_tbl        =>          l_schedule_end_date_tbl,
742                     X_Return_Status		   =>          x_return_status,
743                     X_Msg_Data		           =>          l_msg_data,
744                     X_Msg_Count		           =>          l_msg_count
745 		);
746 
747 			    IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 3) THEN
748 	                pa_debug.g_err_stage:= 'x_return_status after update in adjust dates ' ||  x_return_status;
749 	                pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
750 				END IF;
751 
752                 -- Bug 4153366 - clear the temp table
753 		DELETE pa_copy_asgmts_temp;
754 
755             ELSIF p_context = 'COPY' THEN
756 
757                 x_res_assignment_id_tbl  := l_resource_assignment_id_tbl ;
758                 x_planning_start_tbl     := l_schedule_start_date_tbl ;
759                 x_planning_end_tbl       := l_schedule_end_date_tbl ;
760 
761                 -- Bug 4153366 - clear the temp table
762                 -- Bug 4164909 - Should also empty the temp table upon copy
763                 DELETE pa_copy_asgmts_temp;
764 
765             END IF; -- p_context
766 
767         END IF; -- IF (l_use_task_sch_asgmt_tbl is not null...
768 
769        END IF; -- IF l_num_of_tasks > 0 THEN
770 
771       END IF; --  IF p_context = 'UPDATE' OR p_context = 'COPY' THEN
772 
773 EXCEPTION
774 
775     WHEN FND_API.G_EXC_ERROR THEN
776 
777 	-- 4537865
778 	x_res_assignment_id_tbl :=  NULL ;
779         x_planning_start_tbl    := NULL ;
780         x_planning_end_tbl      := NULL ;
781 	-- 4537865
782 
783         x_return_status := FND_API.G_RET_STS_ERROR;
784         IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 5) THEN
785             PA_DEBUG.write_log (x_module => L_Module,
786                                 x_msg         => 'Error:' || L_FuncProc || SQLERRM,
787                                 x_log_level   => 5);
788         END IF;
789 
790     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
791 
792         -- 4537865
793         x_res_assignment_id_tbl :=  NULL ;
794         x_planning_start_tbl    := NULL ;
795         x_planning_end_tbl      := NULL ;
796         -- 4537865
797         -- Bug 4153366 - clear the temp table
798         DELETE pa_copy_asgmts_temp;
799 
800         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
801         IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 6) THEN
802             PA_DEBUG.write_log (x_module => L_Module,
803                                 x_msg         => 'Unexpected Error:' || L_FuncProc || SQLERRM,
804                                 x_log_level   => 6);
805         END IF;
806         RAISE;
807 
808     WHEN OTHERS THEN
809         -- 4537865
810         x_res_assignment_id_tbl :=  NULL ;
811         x_planning_start_tbl    := NULL ;
812         x_planning_end_tbl      := NULL ;
813         -- 4537865
814         -- Bug 4153366 - clear the temp table
815         DELETE pa_copy_asgmts_temp;
816 
817         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
818         IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 6) THEN
819             PA_DEBUG.write_log (x_module => L_Module,
820                                 x_msg         => 'Unexpected Error:' || L_FuncProc || SQLERRM,
821                                 x_log_level   => 6);
822         END IF;
823         FND_MSG_PUB.add_exc_msg( p_pkg_name       => L_Module,
824                                  p_procedure_name => L_FuncProc);
825         RAISE;
826 
827 END Adjust_Asgmt_Dates;
828 
829 
830 
831 
832 
833 -- This procedure will Validate the Creation
834 -- and also obtain task assignment specific attributes upon
835 -- Planning transaction creation.
836 
837 PROCEDURE Validate_Create_Assignment
838 (
839 	p_calling_context              IN            VARCHAR2 DEFAULT NULL,   -- Added for Bug 6856934
840 	p_one_to_one_mapping_flag      IN VARCHAR2 DEFAULT 'N',
841 	p_task_rec_tbl                 IN            l_task_rec_tbl_type,
842 	p_task_assignment_tbl          IN OUT NOCOPY l_resource_rec_tbl_type,
843 	x_del_task_level_rec_code_tbl  OUT NOCOPY     SYSTEM.PA_VARCHAR2_30_TBL_TYPE,
844 	x_return_status                OUT NOCOPY     VARCHAR2
845 )
846 
847 IS
848 
849 l_task_sch_start  DATE;
850 l_task_sch_end    DATE;
851 l_people_index    NUMBER;
852 l_equip_index     NUMBER;
853 l_people_count    NUMBER;
854 l_equip_count     NUMBER;
855 l_task_people_effort NUMBER;
856 l_task_equip_effort  NUMBER;
857 l_task_number    VARCHAR2(240);
858 l_task_name      VARCHAR2(240);
859 l_resource_class_code VARCHAR2(240);
860 l_msg_count NUMBER;
861 l_msg_data VARCHAR2(2000);
862 l_task_effort_asgmt_exist_flag VARCHAR2(1) := 'N';
863 L_FuncProc varchar2(250) ;
864 
865 CURSOR C1_Task_Info(p_elem_version_id IN NUMBER) IS
866     SELECT pevs.scheduled_start_date, pevs.scheduled_finish_date,
867 	   pe.name task_name, pe.element_number task_number,
868            pe.proj_element_id
869     FROM pa_proj_elem_ver_schedule pevs, pa_proj_element_versions pev,
870 	     pa_proj_elements pe
871     WHERE pev.element_version_id = pevs.element_version_id
872     AND pev.element_version_id = p_elem_version_id
873 	AND pev.proj_element_id = pe.proj_element_id;
874 
875 CURSOR C_Named_Role(p_project_assignment_id IN NUMBER) IS
876 	SELECT assignment_name, project_role_id
877 	FROM pa_project_assignments
878 	WHERE assignment_id = p_project_assignment_id;
879 
880 l_planning_resource_alias varchar2(240);
881 l_edit_task_ok VARCHAR2(1);
882 l_task_people_act_effort NUMBER;
883 l_task_equip_act_effort NUMBER;
884 l_task_rec_project_id_tbl SYSTEM.pa_num_tbl_type := SYSTEM.pa_num_tbl_type();
885 l_task_rec_task_ver_id_tbl SYSTEM.pa_num_tbl_type := SYSTEM.pa_num_tbl_type();
886 
887 -- IB2 Unplanned Actual changes
888 l_task_version_id_tbl SYSTEM.pa_num_tbl_type := SYSTEM.pa_num_tbl_type();
889 l_task_planned_effort_tbl SYSTEM.pa_num_tbl_type := SYSTEM.pa_num_tbl_type();
890 
891 l_progress_task_id SYSTEM.pa_num_tbl_type := SYSTEM.pa_num_tbl_type();
892 l_progress_rlm_id SYSTEM.pa_num_tbl_type := SYSTEM.pa_num_tbl_type();
893 l_task_proj_element_id NUMBER := NULL;
894 l_progress_exists VARCHAR2(1);
895 l_progress_rollup_required VARCHAR2(1) := 'N';
896 l_return_status VARCHAR2(1);
897 
898 -- rbruno added for bug 9468665 - start
899 cursor c_use_task_schedule_flag(p_project_id in number) is
900   select use_task_schedule_flag
901   from pa_workplan_options_v
902   where project_id = p_project_id;
903 l_use_task_schedule_flag VARCHAR2(1);
904 -- rbruno added for bug 9468665 - end
905 
906 
907 BEGIN
908 
909     L_FuncProc := 'Validate_Create_Assignment';
910     x_return_status := FND_API.G_RET_STS_SUCCESS;
911     g_require_progress_rollup := 'N'; -- End of Bug 4492493
912 
913     --Loop through each task record in p_task_rec_tbl
914     --Get default Planning Dates:
915     IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 3) THEN
916 	    pa_debug.g_err_stage:='Beginning of PA_TASK_ASSIGNMENT_UTILS.Validate_Create_Assignment';
917 	    pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
918 	END IF;
919 
920     x_del_task_level_rec_code_tbl := system.pa_varchar2_30_tbl_type();
921     x_del_task_level_rec_code_tbl.extend(p_task_rec_tbl.COUNT);
922 
923     IF p_task_rec_tbl.COUNT > 0 THEN
924 
925         l_task_rec_project_id_tbl.extend(p_task_rec_tbl.COUNT);
926         l_task_rec_task_ver_id_tbl.extend(p_task_rec_tbl.COUNT);
927 
928         --Bug 4492493: Check if Progress Rollup is required on CREATION
929         l_progress_rollup_required := Is_Progress_Rollup_Required(p_task_rec_tbl(1).project_id);
930         -- End of Bug 4492493
931 
932         FOR k in 1..p_task_rec_tbl.COUNT LOOP
933 
934             -- IB2 Unplanned Actual changes
935             -- Allow creation of unplanned transaction on published version
936             IF p_task_assignment_tbl.COUNT > 0 AND p_task_assignment_tbl(1).unplanned_flag = 'Y' THEN
937                 l_edit_task_ok := 'Y';
938             ELSE
939                 -- Bug 6856934
940                 if nvl(p_calling_context,'X') = 'PA_PROJECT_ASSIGNMENT' then
941                         l_edit_task_ok := 'Y';
942                 else
943 
944                 l_edit_task_ok := check_edit_task_ok(
945                                       P_PROJECT_ID	     => p_task_rec_tbl(k).project_id,
946                                       P_STRUCTURE_VERSION_ID	=> p_task_rec_tbl(k).struct_elem_version_id,
947                                       P_CURR_STRUCT_VERSION_ID	=> p_task_rec_tbl(k).struct_elem_version_id);
948                 end if;
949                 -- Bug 6856934
950             END IF;
951 
952             IF 'Y' = l_edit_task_ok THEN
953 
954                 --get task info:
955                 OPEN C1_Task_Info(p_task_rec_tbl(k).task_elem_version_id);
956                 FETCH C1_Task_Info INTO l_task_sch_start, l_task_sch_end, l_task_name, l_task_number, l_task_proj_element_id;
957                 CLOSE C1_Task_Info;
958 
959                 IF (p_task_rec_tbl(k).start_date is not null AND
960                     p_task_rec_tbl(k).start_date <> FND_API.G_MISS_DATE  AND
961                     p_task_rec_tbl(k).end_date is not null AND
962                     p_task_rec_tbl(k).end_date <> FND_API.G_MISS_DATE) THEN
963 
964                     l_task_sch_start := p_task_rec_tbl(k).start_date;
965                     l_task_sch_end :=  p_task_rec_tbl(k).end_date;
966 
967                 END IF;
968 
969                 --Initialize per task..
970                 l_people_count    := 0;
971                 l_equip_count     := 0;
972                 l_task_people_effort := 0;
973                 l_task_equip_effort  := 0;
974                 l_people_index := 1;
975                 l_equip_index := 1;
976 
977                 IF p_task_assignment_tbl.COUNT > 0 AND x_return_status = FND_API.G_RET_STS_SUCCESS THEN
978 
979                     IF p_one_to_one_mapping_flag <> 'Y' THEN
980 
981                         FOR i in 1..p_task_assignment_tbl.COUNT LOOP
982 
983                             --0. Bug 4492493: Check if Progress Rollup is required on CREATION
984                             IF g_require_progress_rollup = 'N' AND
985                                l_progress_rollup_required = 'Y' AND
986                                p_task_assignment_tbl(i).total_quantity IS NOT NULL AND
987                                p_task_assignment_tbl(i).total_quantity <> FND_API.G_MISS_NUM THEN
988                               g_require_progress_rollup := 'Y';
989                             END IF;
990                             -- End of Bug 4492493
991 
992                             --1. RESOURCE INFORMATION VALIDATION.
993                             --Validate Financial Category:
994                             --Get default Procure Resource in Resource Information:
995                             If p_task_assignment_tbl(i).supplier_id IS NOT NULL THEN
996                                 p_task_assignment_tbl(i).procure_resource_flag := 'Y';
997                             else
998                                 p_task_assignment_tbl(i).procure_resource_flag := 'N';
999                             End If;
1000 
1001 	    					IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 3) THEN
1002 	                            pa_debug.g_err_stage:='TA: p_task_assignment_tbl(i).procure_resource_flag'||p_task_assignment_tbl(i).procure_resource_flag;
1003 	                            pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
1004 							END IF;
1005 
1006                             --2. SCHEDULE INFORMATION VALIDATION
1007                             -- Bug 3793623
1008                             -- Should honor Scheduled Dates provided by user before
1009                             -- defaulting to task scheduled dates
1010                             -- Should also honor Planning Dates
1011                             IF p_task_assignment_tbl(i).schedule_start_date IS NOT NULL AND
1012                                p_task_assignment_tbl(i).schedule_start_date <> FND_API.G_MISS_DATE THEN
1013 
1014                                 p_task_assignment_tbl(i).planning_start_date := p_task_assignment_tbl(i).schedule_start_date;
1015 
1016 					        ELSIF p_task_assignment_tbl(i).planning_start_date IS NOT NULL AND
1017                                   p_task_assignment_tbl(i).planning_start_date <> FND_API.G_MISS_DATE THEN
1018 
1019                                 p_task_assignment_tbl(i).schedule_start_date := p_task_assignment_tbl(i).planning_start_date;
1020 
1021                             ELSE
1022 
1023                                 p_task_assignment_tbl(i).planning_start_date := l_task_sch_start;
1024                                 p_task_assignment_tbl(i).schedule_start_date := l_task_sch_start;
1025 
1026                             END IF;
1027 
1028                             IF p_task_assignment_tbl(i).schedule_end_date IS NOT NULL AND
1029                                p_task_assignment_tbl(i).schedule_end_date <> FND_API.G_MISS_DATE THEN
1030 
1031                                 p_task_assignment_tbl(i).planning_end_date := p_task_assignment_tbl(i).schedule_end_date;
1032 
1033                             ELSIF p_task_assignment_tbl(i).planning_end_date IS NOT NULL AND
1034                                   p_task_assignment_tbl(i).planning_end_date <> FND_API.G_MISS_DATE THEN
1035 
1036                                 p_task_assignment_tbl(i).schedule_end_date := p_task_assignment_tbl(i).planning_end_date;
1037 
1038                             ELSE
1039 
1040                                 p_task_assignment_tbl(i).planning_end_date := l_task_sch_end;
1041                                 p_task_assignment_tbl(i).schedule_end_date := l_task_sch_end;
1042 
1043                             END IF;
1044 
1045                             --rbruno bug 9468665 - start
1046                             -- validate whether assignment same as task duration is checked at workplan level.
1047                             -- if the flag is checked at workplan level and the task and assignment dates
1048                             -- are not same, then set the flag to 'N' at assignment level during amg flow.
1049                             open c_use_task_schedule_flag(p_task_rec_tbl(k).project_id);
1050                             fetch c_use_task_schedule_flag into l_use_task_schedule_flag;
1051                             close c_use_task_schedule_flag;
1052                             if (l_use_task_schedule_flag = 'Y' )
1053              			               AND (trunc(p_task_assignment_tbl(i).schedule_start_date) <> trunc(l_task_sch_start) OR
1054 		                                  trunc(p_task_assignment_tbl(i).schedule_end_date) <> trunc(l_task_sch_end)) THEN
1055                               p_task_assignment_tbl(i).use_task_schedule_flag := 'N';
1056                             end if;
1057                             -- rbruno bug 9468665 - end
1058 
1059 
1060                             -- Validate that assignment dates should be within task dates
1061                             IF trunc(p_task_assignment_tbl(i).schedule_start_date) < trunc(l_task_sch_start) OR
1062                                trunc(p_task_assignment_tbl(i).schedule_start_date) > trunc(l_task_sch_end) OR
1063                                trunc(p_task_assignment_tbl(i).schedule_end_date) < trunc(l_task_sch_start) OR
1064                                trunc(p_task_assignment_tbl(i).schedule_end_date) > trunc(l_task_sch_end) THEN
1065 
1066                                 PA_UTILS.ADD_MESSAGE
1067                                     (p_app_short_name => 'PA',
1068                                      p_msg_name       => 'PA_PL_TXN_SCH_DATES_ERR',
1069                                      p_token1         => 'TASK_NAME',
1070                                      p_value1         =>  l_task_name,
1071                                      p_token2         => 'TASK_NUMBER',
1072                                      p_value2         =>  l_task_number,
1073                                      p_token3         => 'PL_RES_ALIAS',
1074                                      p_value3         =>  p_task_assignment_tbl(i).planning_resource_alias);
1075                                 x_return_status := FND_API.G_RET_STS_ERROR;
1076                             END IF;
1077                             -- End of fix: Bug 3793623
1078 
1079 							-- scheduled_delay must be positive or null
1080 							IF nvl(p_task_assignment_tbl(i).scheduled_delay, 0) < 0 THEN
1081 
1082                                 PA_UTILS.ADD_MESSAGE
1083                                 (
1084 									p_app_short_name => 'PA',
1085                                     p_msg_name       => 'PA_SCHED_DELAY_ERR'
1086 								);
1087                                 x_return_status := FND_API.G_RET_STS_ERROR;
1088 							END IF;
1089 
1090 		                    -- Bug 3818133: Copy the assignment name in the named_role cell
1091 		                    IF (p_task_assignment_tbl(i).project_assignment_id IS NOT NULL) AND
1092 		                       (p_task_assignment_tbl(i).project_assignment_id <> FND_API.G_MISS_NUM) AND
1093 		                       (p_task_assignment_tbl(i).project_assignment_id <> -1) THEN
1094 
1095 		                    	OPEN C_Named_Role(p_task_assignment_tbl(i).project_assignment_id);
1096 		                    	FETCH C_Named_Role INTO p_task_assignment_tbl(i).named_role, p_task_assignment_tbl(i).project_role_id;
1097 		                    	CLOSE C_Named_Role;
1098 
1099                     		END IF;
1100 
1101 
1102                             -- Default this to 'N' always
1103                             -- rbruno commenting for bug 9468665
1104                             --p_task_assignment_tbl(i).use_task_schedule_flag := 'N';
1105 
1106                                     IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 3) THEN
1107 	                            pa_debug.g_err_stage:='TA: p_task_assignment_tbl(i).planning_start_date'||p_task_assignment_tbl(i).planning_start_date;
1108 	                            pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
1109 	                            pa_debug.g_err_stage:='TA: p_task_assignment_tbl(i).planning_end_date'||p_task_assignment_tbl(i).planning_end_date;
1110 	                            pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
1111 	                            pa_debug.g_err_stage:='TA: l_task_people_effort'||l_task_people_effort;
1112 	                            pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
1113 	                            pa_debug.g_err_stage:='TA: l_task_equip_effort'||l_task_equip_effort;
1114 	                            pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
1115 	                            pa_debug.g_err_stage:='TA: p_task_assignment_tbl(i).total_quantity'||p_task_assignment_tbl(i).total_quantity;
1116 	                            pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
1117 	                            pa_debug.g_err_stage:='TA: p_task_assignment_tbl(i).use_task_schedule_flag'||p_task_assignment_tbl(i).use_task_schedule_flag;
1118 	                            pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
1119 							END IF;
1120 
1121                         END LOOP;
1122 
1123                     ELSIF p_one_to_one_mapping_flag = 'Y' THEN
1124 
1125                         If p_task_assignment_tbl(k).supplier_id is not null THEN
1126                             p_task_assignment_tbl(k).procure_resource_flag := 'Y';
1127                         else
1128                             p_task_assignment_tbl(k).procure_resource_flag := 'N';
1129                         End If;
1130 
1131 						IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 3) THEN
1132 	                        pa_debug.g_err_stage:='TA: p_task_assignment_tbl(k).procure_resource_flag'||p_task_assignment_tbl(k).procure_resource_flag;
1133 	                        pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
1134 						END IF;
1135 
1136                         --2. SCHEDULE INFORMATION VALIDATION
1137                         -- Bug 3793623
1138                         -- Should honor Scheduled Dates provided by user before
1139                         -- defaulting to task scheduled dates
1140                         -- Should also honor Planning Dates
1141                         IF p_task_assignment_tbl(k).schedule_start_date IS NOT NULL AND
1142                            p_task_assignment_tbl(k).schedule_start_date <> FND_API.G_MISS_DATE THEN
1143 
1144                             p_task_assignment_tbl(k).planning_start_date := p_task_assignment_tbl(k).schedule_start_date;
1145 
1146                         ELSIF p_task_assignment_tbl(k).planning_start_date IS NOT NULL AND
1147                               p_task_assignment_tbl(k).planning_start_date <> FND_API.G_MISS_DATE THEN
1148 
1149                             p_task_assignment_tbl(k).schedule_start_date := p_task_assignment_tbl(k).planning_start_date;
1150 
1151                         ELSE
1152 
1153                             p_task_assignment_tbl(k).planning_start_date := l_task_sch_start;
1154                             p_task_assignment_tbl(k).schedule_start_date := l_task_sch_start;
1155 
1156                         END IF;
1157 
1158                         IF p_task_assignment_tbl(k).schedule_end_date IS NOT NULL AND
1159                            p_task_assignment_tbl(k).schedule_end_date <> FND_API.G_MISS_DATE THEN
1160 
1161                             p_task_assignment_tbl(k).planning_end_date := p_task_assignment_tbl(k).schedule_end_date;
1162 
1163                         ELSIF p_task_assignment_tbl(k).planning_end_date IS NOT NULL AND
1164                               p_task_assignment_tbl(k).planning_end_date <> FND_API.G_MISS_DATE THEN
1165 
1166                             p_task_assignment_tbl(k).schedule_end_date := p_task_assignment_tbl(k).planning_end_date;
1167 
1168                         ELSE
1169 
1170                             p_task_assignment_tbl(k).planning_end_date := l_task_sch_end;
1171                             p_task_assignment_tbl(k).schedule_end_date := l_task_sch_end;
1172 
1173                         END IF;
1174 
1175                             -- rbruno bug 9468665 - start
1176                          -- validate whether assignment same as task duration is checked at workplan level.
1177                          -- if the flag is checked at workplan level and the task and assignment dates
1178                          -- are not same, then set the flag to 'N' at assignment level during amg flow.
1179                          open c_use_task_schedule_flag(p_task_rec_tbl(k).project_id);
1180                          fetch c_use_task_schedule_flag into l_use_task_schedule_flag;
1181                          close c_use_task_schedule_flag;
1182                          if (l_use_task_schedule_flag = 'Y' )
1183                             AND (trunc(p_task_assignment_tbl(k).schedule_start_date) <> trunc(l_task_sch_start) OR
1184                                  trunc(p_task_assignment_tbl(k).schedule_end_date) <> trunc(l_task_sch_end)) THEN
1185                            p_task_assignment_tbl(k).use_task_schedule_flag := 'N';
1186                          end if;
1187                          -- rbruno bug 9468665 - end
1188 
1189 
1190                         -- Validate that assignment dates should be within task dates
1191                         IF trunc(p_task_assignment_tbl(k).schedule_start_date) < trunc(l_task_sch_start) OR
1192                            trunc(p_task_assignment_tbl(k).schedule_start_date) > trunc(l_task_sch_end) OR
1193                            trunc(p_task_assignment_tbl(k).schedule_end_date) < trunc(l_task_sch_start) OR
1194                            trunc(p_task_assignment_tbl(k).schedule_end_date) > trunc(l_task_sch_end) THEN
1195 
1196                             PA_UTILS.ADD_MESSAGE
1197                                 (p_app_short_name => 'PA',
1198                                  p_msg_name       => 'PA_PL_TXN_SCH_DATES_ERR',
1199                                  p_token1         => 'TASK_NAME',
1200                                  p_value1         =>  l_task_name,
1201                                  p_token2         => 'TASK_NUMBER',
1202                                  p_value2         =>  l_task_number,
1203                                  p_token3         => 'PL_RES_ALIAS',
1204                                  p_value3         =>  p_task_assignment_tbl(k).planning_resource_alias);
1205                             x_return_status := FND_API.G_RET_STS_ERROR;
1206                         END IF;
1207                         -- End of fix: Bug 3793623
1208 
1209 			IF nvl(p_task_assignment_tbl(k).scheduled_delay, 0) < 0 THEN
1210 
1211                                PA_UTILS.ADD_MESSAGE
1212                                (   p_app_short_name => 'PA',
1213                                    p_msg_name       => 'PA_SCHED_DELAY_ERR'
1214 		               );
1215                                x_return_status := FND_API.G_RET_STS_ERROR;
1216 
1217 			END IF;
1218 
1219 		                -- Bug 3818133: Copy the assignment name in the named_role cell
1220 		                IF (p_task_assignment_tbl(k).project_assignment_id IS NOT NULL) AND
1221 		                   (p_task_assignment_tbl(k).project_assignment_id <> FND_API.G_MISS_NUM) AND
1222 		                   (p_task_assignment_tbl(k).project_assignment_id <> -1) THEN
1223 
1224 		                	OPEN C_Named_Role(p_task_assignment_tbl(k).project_assignment_id);
1225 		                	FETCH C_Named_Role INTO p_task_assignment_tbl(k).named_role, p_task_assignment_tbl(k).project_role_id;
1226 		                	CLOSE C_Named_Role;
1227 
1228 		                END IF;
1229 
1230 						IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 3) THEN
1231 	                        pa_debug.g_err_stage:='TA: p_task_assignment_tbl(k).planning_start_date'||p_task_assignment_tbl(k).planning_start_date;
1232 	                        pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
1233 	                        pa_debug.g_err_stage:='TA: p_task_assignment_tbl(k).planning_end_date'||p_task_assignment_tbl(k).planning_end_date;
1234 	                        pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
1235 	                        pa_debug.g_err_stage:='TA: l_task_people_effort'||l_task_people_effort;
1236 	                        pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
1237 	                        pa_debug.g_err_stage:='TA: l_task_equip_effort'||l_task_equip_effort;
1238 	                        pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
1239 	                        pa_debug.g_err_stage:='TA: p_task_assignment_tbl(k).total_quantity'||p_task_assignment_tbl(k).total_quantity;
1240 	                        pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
1241 						END IF;
1242 
1243 
1244                         --Get default 'Assignment same as Task Duration' flag:
1245                          -- rbruno commenting for bug 9468665
1246                         -- p_task_assignment_tbl(k).use_task_schedule_flag := 'N';
1247 
1248 
1249 						IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 3) THEN
1250 	                        pa_debug.g_err_stage:='TA: p_task_assignment_tbl(k).use_task_schedule_flag'||p_task_assignment_tbl(k).use_task_schedule_flag;
1251 	                        pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
1252 						END IF;
1253 
1254                     END IF; -- p_one_to_one_mapping_flag = 'N'
1255 
1256                 END IF; -- p_task_assignment_tbl.COUNT > 0 AND x_return_status = FND_API.G_RET_STS_SUCCESS
1257 
1258 
1259             ELSE -- check task edit ok
1260 
1261                 -- Bug 4533152
1262                 --PA_UTILS.ADD_MESSAGE
1263                 --    (p_app_short_name => 'PA',
1264                 --     p_msg_name       => 'PA_UPDATE_PUB_VER_ERR');
1265                 x_return_status := FND_API.G_RET_STS_ERROR;
1266 
1267             END IF;
1268 
1269             -- Bug 3640647
1270             l_task_rec_project_id_tbl(k) := p_task_rec_tbl(k).project_id;
1271             l_task_rec_task_ver_id_tbl(k) := p_task_rec_tbl(k).task_elem_version_id;
1272             -- END of Bug 3640647
1273 
1274         END LOOP; -- FOR k in 1..p_task_rec_tbl.COUNT LOOP
1275 
1276         -- Bug 3640647
1277         -- 9/23/04: It was agreed by Sakthi, Angela and Kaushik that the system
1278         -- generated (ta_display_flag='N') assignment should be converted
1279         -- into a regular assignment as soon as the first assignment is created
1280         -- on the task version.
1281         -- 10/12/04: This is only allowed on the published version when unplanned
1282         --           assignment is created. Need to convert the progress record from
1283         --           PA_TASKS to PA_ASSIGNMENT.
1284 
1285 	    IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 3) THEN
1286 	        pa_debug.g_err_stage:='Validate_Create_Assignment - Updating ta_display_flag to Y';
1287 			pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
1288 		END IF;
1289 
1290        -- 10/19/04: Discussed with Sakthi, Koushik and Ansari. We should not
1291        --  convert ta_display_flag from 'N' to 'Y' on published version
1292        --  when unplanned assignents are created.
1293         -- 5/12/05:  Discussed with Ansari, Saima and Koushik.  We need to convert
1294         --           hidden assignment to regular assignment even on published version
1295         --           upon creation of unplanned assignment.  Due to bug 4354041.
1296 
1297        IF l_task_rec_project_id_tbl.COUNT > 0 THEN
1298 --          (p_task_assignment_tbl(1).unplanned_flag IS NULL OR
1299 --           p_task_assignment_tbl(1).unplanned_flag = FND_API.G_MISS_CHAR OR
1300 --           p_task_assignment_tbl(1).unplanned_flag <> 'Y') THEN
1301 
1302         FORALL k IN l_task_rec_project_id_tbl.FIRST .. l_task_rec_project_id_tbl.LAST
1303             UPDATE pa_resource_assignments
1304             SET ta_display_flag = 'Y',
1305                 record_version_number = record_version_number + 1
1306             WHERE project_id = l_task_rec_project_id_tbl(k)
1307             AND wbs_element_version_id = l_task_rec_task_ver_id_tbl(k)
1308             AND ta_display_flag = 'N'
1309         RETURNING task_id, resource_list_member_id
1310          BULK COLLECT INTO l_progress_task_id, l_progress_rlm_id;
1311        END IF;
1312 
1313 /* 10/14/04: Spoke with Ansari.  I will comment this out until after IB6.
1314 
1315        IF l_progress_task_id.COUNT > 0 AND
1316           p_task_assignment_tbl(1).unplanned_flag = 'Y' THEN
1317 
1318         FOR k IN l_progress_task_id.FIRST .. l_progress_task_id.LAST LOOP
1319           --dbms_output.put_line('rlm id:'||l_progress_rlm_id(k));
1320           --dbms_output.put_line('p_task_rec_tbl(1).project_id:'||p_task_rec_tbl(1).project_id);
1321           --dbms_output.put_line('l_progress_task_id(k):'||l_progress_task_id(k));
1322           --dbms_output.put_line('p_task_rec_tbl(1).struct_elem_version_id:'||p_task_rec_tbl(1).struct_elem_version_id);
1323 
1324          PA_PROGRESS_PVT.Convert_Task_Prog_To_Assgn(
1325              p_resource_list_mem_id => l_progress_rlm_id(k),
1326              p_project_id           => p_task_rec_tbl(1).project_id,
1327              p_task_id              => l_progress_task_id(k),
1328              p_structure_version_id => p_task_rec_tbl(1).struct_elem_version_id,
1329              x_return_status        => l_return_status,
1330              x_msg_count            => l_msg_count,
1331              x_msg_data             => l_msg_data
1332           );
1333           IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
1334             x_return_status := l_return_status;
1335           END IF;
1336 
1337         END LOOP;
1338        END IF;
1339        -- END of Bug 3640647
1340 
1341  10/14/04: Spoke with Ansari.  I will comment this out until after IB6
1342 */
1343 
1344 
1345     END IF; -- IF p_task_rec_tbl.count > 0
1346 
1347     IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 3) THEN
1348 	    pa_debug.g_err_stage:='End of PA_TASK_ASSIGNMENT_UTILS.Validate_Create_Assignment';
1349 	    pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
1350 	END IF;
1351 
1352 EXCEPTION
1353 
1354     WHEN FND_API.G_EXC_ERROR THEN
1355         x_return_status := FND_API.G_RET_STS_ERROR;
1356         IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 5) THEN
1357             PA_DEBUG.write_log (x_module => L_Module,
1358                                 x_msg         => 'Error:' || L_FuncProc || SQLERRM,
1359                                 x_log_level   => 5);
1360         END IF;
1361 
1362 	WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
1363         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1364         IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 6) THEN
1365             PA_DEBUG.write_log (x_module => L_Module,
1366                                 x_msg         => 'Unexpected Error:' || L_FuncProc || SQLERRM,
1367                                 x_log_level   => 6);
1368         END IF;
1369         RAISE;
1370 
1371     WHEN OTHERS THEN
1372         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1373         IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 6) THEN
1374             PA_DEBUG.write_log (x_module => L_Module,
1375                                 x_msg         => 'Unexpected Error:' || L_FuncProc || SQLERRM,
1376                                 x_log_level   => 6);
1377         END IF;
1378         FND_MSG_PUB.add_exc_msg( p_pkg_name       => L_Module,
1379                                  p_procedure_name => L_FuncProc);
1380         RAISE;
1381 
1382 END Validate_Create_Assignment;
1383 
1384 
1385 
1386 
1387 
1388 -- This procedure will Validate the Update of Planning Transactions
1389 
1390 PROCEDURE Validate_Update_Assignment
1391 (
1392     p_calling_context        IN            VARCHAR2 DEFAULT NULL,  -- Added for Bug 6856934
1393     p_task_assignment_tbl    IN OUT NOCOPY l_resource_rec_tbl_type,
1394     x_return_status             OUT NOCOPY VARCHAR2
1395 )
1396 
1397 IS
1398 
1399 l_task_sch_start DATE;
1400 l_task_sch_end   DATE;
1401 l_task_number    VARCHAR2(240);
1402 l_task_name      VARCHAR2(240);
1403 l_published_flag pa_proj_elem_ver_structure.latest_eff_published_flag%TYPE;
1404 l_return_status VARCHAR2(1);
1405 x_msg_data VARCHAR2(4000);
1406 x_msg_count NUMBER;
1407 l_wbs_element_version_id NUMBER;
1408 l_struct_ver_id NUMBER;
1409 l_project_id NUMBER;
1410 l_budget_version_id NUMBER;
1411 l_actual_start_date DATE;
1412 l_actual_end_date DATE;
1413 l_error_msg_code VARCHAR2(100);
1414 l_task_assignment_rec resource_rec_type;
1415 l_viol_indicator NUMBER;
1416 l_P_Resource_List_Member_Id  l_task_assignment_rec.resource_list_member_id%TYPE;
1417 l_P_Project_Role_Id	       l_task_assignment_rec.project_role_id%TYPE;
1418 l_P_Organization_Id	       l_task_assignment_rec.organization_id%TYPE;
1419 l_P_Supplier_Id		       l_task_assignment_rec.supplier_id%TYPE;
1420 l_prog_finish_date  DATE;
1421 l_progress_exists  VARCHAR2(1);
1422 l_ta_display_flag VARCHAR2(1);
1423 l_rlm_id NUMBER;
1424 L_FuncProc varchar2(250) ;
1425 l_valid_member_flag VARCHAR(1);
1426 l_sp_fixed_date DATE;
1427 
1428 CURSOR C1_Task_Dates(p_elem_version_id IN NUMBER) IS
1429     SELECT pevs.scheduled_start_date, pevs.scheduled_finish_date,
1430 	       pe.name task_name, pe.element_number task_number
1431     FROM pa_proj_elem_ver_schedule pevs, pa_proj_element_versions pev,
1432 	     pa_proj_elements pe
1433     WHERE pev.element_version_id = pevs.element_version_id
1434     AND pev.element_version_id = p_elem_version_id
1435 	AND pev.proj_element_id = pe.proj_element_id;
1436 
1437 CURSOR C2_Published_Flag(p_elem_version_id IN NUMBER) IS
1438     SELECT latest_eff_published_flag
1439     FROM pa_proj_elem_ver_structure pevs, pa_proj_element_versions pev
1440     WHERE pev.element_version_id = p_elem_version_id
1441     AND pev.parent_structure_version_id = pevs.element_version_id
1442     AND pev.project_id = pevs.project_id;
1443 
1444 CURSOR C_Res_Assignment_Info(p_resource_assignment_id IN NUMBER) IS
1445     SELECT *
1446     FROM pa_resource_assignments
1447     WHERE resource_assignment_id = p_resource_assignment_id;
1448 
1449 CURSOR C_Budget_Version_Info (p_resource_assignment_id IN NUMBER) IS
1450     SELECT budget_version_id
1451     FROM pa_resource_assignments
1452     WHERE resource_assignment_id = p_resource_assignment_id;
1453 
1454 CURSOR C2_Task_Effort_Assignment(p_resource_assignment_id IN NUMBER) IS
1455     SELECT ra.ta_display_flag, ra.resource_list_member_id, ra.project_id, ra.task_id, bv.project_structure_version_id
1456     FROM pa_resource_assignments ra, pa_budget_versions bv
1457     WHERE ra.resource_assignment_id = p_resource_assignment_id
1458       AND ra.budget_version_id = bv.budget_version_id;
1459 
1460 CURSOR C_Get_Actuals(p_resource_assignment_id IN NUMBER) IS
1461     SELECT actual_effort
1462     FROM pa_assgn_cost_effort_v
1463     WHERE resource_assignment_id = p_resource_assignment_id
1464 	AND progress_rollup_id IS NOT NULL
1465     and rownum = 1;
1466 
1467 CURSOR C_Get_Project_Id IS
1468     SELECT project_id
1469       FROM pa_resource_assignments
1470      WHERE resource_assignment_id = p_task_assignment_tbl(1).resource_assignment_id;
1471 
1472 R_Res_Assignment_Rec C_Res_Assignment_Info%ROWTYPE;
1473 l_proj_element_id NUMBER;
1474 L_Incur_By_Resource_Type VARCHAR2(240);
1475 l_P_named_role  VARCHAR2(80);
1476 
1477 -- For Resource defaults
1478 --Start of variables for Variable for Resource Attributes
1479 lr_resource_class_flag_tbl         SYSTEM.PA_VARCHAR2_1_TBL_TYPE     := SYSTEM.PA_VARCHAR2_1_TBL_TYPE();
1480 lr_resource_class_code_tbl         SYSTEM.PA_VARCHAR2_30_TBL_TYPE    := SYSTEM.PA_VARCHAR2_30_TBL_TYPE();
1481 lr_resource_class_id_tbl           SYSTEM.PA_NUM_TBL_TYPE            := SYSTEM.PA_NUM_TBL_TYPE();
1482 lr_res_type_code_tbl               SYSTEM.PA_VARCHAR2_30_TBL_TYPE    := SYSTEM.PA_VARCHAR2_30_TBL_TYPE();
1483 lr_incur_by_res_type_tbl           SYSTEM.PA_VARCHAR2_30_TBL_TYPE    := SYSTEM.PA_VARCHAR2_30_TBL_TYPE();
1484 lr_job_id_tbl                      SYSTEM.PA_NUM_TBL_TYPE            := SYSTEM.PA_NUM_TBL_TYPE();
1485 lr_person_id_tbl                   SYSTEM.PA_NUM_TBL_TYPE            := SYSTEM.PA_NUM_TBL_TYPE();
1486 lr_person_type_code_tbl            SYSTEM.PA_VARCHAR2_30_TBL_TYPE    := SYSTEM.PA_VARCHAR2_30_TBL_TYPE();
1487 lr_named_role_tbl                  SYSTEM.PA_VARCHAR2_80_TBL_TYPE    := SYSTEM.PA_VARCHAR2_80_TBL_TYPE();
1488 lr_bom_resource_id_tbl             SYSTEM.PA_NUM_TBL_TYPE            := SYSTEM.PA_NUM_TBL_TYPE();
1489 lr_non_labor_resource_tbl          SYSTEM.PA_VARCHAR2_20_TBL_TYPE    := SYSTEM.PA_VARCHAR2_20_TBL_TYPE();
1490 lr_inventory_item_id_tbl           SYSTEM.PA_NUM_TBL_TYPE            := SYSTEM.PA_NUM_TBL_TYPE();
1491 lr_item_category_id_tbl            SYSTEM.PA_NUM_TBL_TYPE            := SYSTEM.PA_NUM_TBL_TYPE();
1492 lr_project_role_id_tbl             SYSTEM.PA_NUM_TBL_TYPE            := SYSTEM.PA_NUM_TBL_TYPE();
1493 lr_organization_id_tbl             SYSTEM.PA_NUM_TBL_TYPE            := SYSTEM.PA_NUM_TBL_TYPE();
1494 lr_fc_res_type_code_tbl            SYSTEM.PA_VARCHAR2_30_TBL_TYPE    := SYSTEM.PA_VARCHAR2_30_TBL_TYPE();
1495 lr_expenditure_type_tbl            SYSTEM.PA_VARCHAR2_30_TBL_TYPE    := SYSTEM.PA_VARCHAR2_30_TBL_TYPE();
1496 lr_expenditure_category_tbl        SYSTEM.PA_VARCHAR2_30_TBL_TYPE    := SYSTEM.PA_VARCHAR2_30_TBL_TYPE();
1497 lr_event_type_tbl                  SYSTEM.PA_VARCHAR2_30_TBL_TYPE    := SYSTEM.PA_VARCHAR2_30_TBL_TYPE();
1498 lr_revenue_category_code_tbl       SYSTEM.PA_VARCHAR2_30_TBL_TYPE    := SYSTEM.PA_VARCHAR2_30_TBL_TYPE();
1499 lr_supplier_id_tbl                 SYSTEM.PA_NUM_TBL_TYPE            := SYSTEM.PA_NUM_TBL_TYPE();
1500 lr_unit_of_measure_tbl             SYSTEM.PA_VARCHAR2_30_TBL_TYPE    := SYSTEM.PA_VARCHAR2_30_TBL_TYPE();
1501 lr_spread_curve_id_tbl             SYSTEM.PA_NUM_TBL_TYPE            := SYSTEM.PA_NUM_TBL_TYPE();
1502 lr_etc_method_code_tbl             SYSTEM.PA_VARCHAR2_30_TBL_TYPE    := SYSTEM.PA_VARCHAR2_30_TBL_TYPE();
1503 lr_mfc_cost_type_id_tbl            SYSTEM.PA_NUM_TBL_TYPE            := SYSTEM.PA_NUM_TBL_TYPE();
1504 lr_procure_resource_flag_tbl       SYSTEM.PA_VARCHAR2_1_TBL_TYPE     := SYSTEM.PA_VARCHAR2_1_TBL_TYPE();
1505 lr_incurred_by_res_flag_tbl        SYSTEM.PA_VARCHAR2_1_TBL_TYPE     := SYSTEM.PA_VARCHAR2_1_TBL_TYPE();
1506 lr_Incur_by_res_class_code_tbl     SYSTEM.PA_VARCHAR2_30_TBL_TYPE    := SYSTEM.PA_VARCHAR2_30_TBL_TYPE();
1507 lr_Incur_by_role_id_tbl            SYSTEM.PA_NUM_TBL_TYPE            := SYSTEM.PA_NUM_TBL_TYPE();
1508 lr_org_id_tbl                      SYSTEM.PA_NUM_TBL_TYPE            := SYSTEM.PA_NUM_TBL_TYPE();
1509 lr_rate_based_flag_tbl             SYSTEM.PA_VARCHAR2_1_TBL_TYPE     := SYSTEM.PA_VARCHAR2_1_TBL_TYPE();
1510 lr_rate_expenditure_type_tbl       SYSTEM.PA_VARCHAR2_30_TBL_TYPE    := SYSTEM.PA_VARCHAR2_30_TBL_TYPE();
1511 lr_rate_func_curr_code_tbl         SYSTEM.PA_VARCHAR2_30_TBL_TYPE    := SYSTEM.PA_VARCHAR2_30_TBL_TYPE();
1512 lr_rate_incurred_by_org_id_tbl     SYSTEM.PA_NUM_TBL_TYPE            := SYSTEM.PA_NUM_TBL_TYPE();
1513 lr_resource_assignment_id_tbl      SYSTEM.PA_NUM_TBL_TYPE            := SYSTEM.PA_NUM_TBL_TYPE();
1514 lr_assignment_description_tbl      SYSTEM.PA_VARCHAR2_240_TBL_TYPE   := SYSTEM.PA_VARCHAR2_240_TBL_TYPE();
1515 lr_planning_resource_alias_tbl     SYSTEM.PA_VARCHAR2_80_TBL_TYPE    := SYSTEM.PA_VARCHAR2_80_TBL_TYPE();
1516 lr_resource_name_tbl               SYSTEM.PA_VARCHAR2_30_TBL_TYPE    := SYSTEM.PA_VARCHAR2_30_TBL_TYPE();
1517 lr_project_role_name_tbl           SYSTEM.PA_VARCHAR2_150_TBL_TYPE   := SYSTEM.PA_VARCHAR2_150_TBL_TYPE();
1518 lr_organization_name_tbl           SYSTEM.PA_VARCHAR2_240_TBL_TYPE   := SYSTEM.PA_VARCHAR2_240_TBL_TYPE();
1519 lr_financial_category_code_tbl     SYSTEM.PA_VARCHAR2_80_TBL_TYPE    := SYSTEM.PA_VARCHAR2_80_TBL_TYPE();
1520 lr_project_assignment_id_tbl       SYSTEM.PA_NUM_TBL_TYPE            := SYSTEM.PA_NUM_TBL_TYPE();
1521 lr_use_task_schedule_flag_tbl      SYSTEM.PA_VARCHAR2_1_TBL_TYPE     := SYSTEM.PA_VARCHAR2_1_TBL_TYPE();
1522 lr_planning_start_date_tbl         SYSTEM.PA_DATE_TBL_TYPE           := SYSTEM.PA_DATE_TBL_TYPE();
1523 lr_planning_end_date_tbl           SYSTEM.PA_DATE_TBL_TYPE           := SYSTEM.PA_DATE_TBL_TYPE();
1524 lr_total_quantity_tbl              SYSTEM.PA_NUM_TBL_TYPE            := SYSTEM.PA_NUM_TBL_TYPE();
1525 lr_override_currency_code_tbl      SYSTEM.PA_VARCHAR2_30_TBL_TYPE    := SYSTEM.PA_VARCHAR2_30_TBL_TYPE();
1526 lr_billable_percent_tbl            SYSTEM.PA_NUM_TBL_TYPE            := SYSTEM.PA_NUM_TBL_TYPE();
1527 lr_cost_rate_override_tbl          SYSTEM.PA_NUM_TBL_TYPE            := SYSTEM.PA_NUM_TBL_TYPE();
1528 lr_burdened_rate_override_tbl      SYSTEM.PA_NUM_TBL_TYPE            := SYSTEM.PA_NUM_TBL_TYPE();
1529 lr_sp_fixed_date_tbl               SYSTEM.PA_DATE_TBL_TYPE           := SYSTEM.PA_DATE_TBL_TYPE();
1530 lr_financial_category_name_tbl     SYSTEM.PA_VARCHAR2_30_TBL_TYPE    := SYSTEM.PA_VARCHAR2_30_TBL_TYPE();
1531 lr_supplier_name_tbl               SYSTEM.PA_VARCHAR2_240_TBL_TYPE   := SYSTEM.PA_VARCHAR2_240_TBL_TYPE();
1532 --End of variables for Variable for Resource Attributes
1533 
1534   lr_eligible_rlm_id_tbl        SYSTEM.PA_NUM_TBL_TYPE := SYSTEM.PA_NUM_TBL_TYPE();
1535 
1536   l_progress_project_id NUMBER;
1537   l_progress_task_id NUMBER;
1538   l_progress_struct_ver_id NUMBER;
1539   l_progress_rollup_required VARCHAR2(1) := 'N';
1540   l_msg_added_flag VARCHAR2(1) := 'N'; -- Fix for Bug # 4319137.
1541 
1542    -- 4537865
1543    l_new_resource_list_member_id NUMBER ;
1544 
1545   l_edit_task_ok VARCHAR2(1) := 'N'; -- Bug 6856934
1546 
1547 BEGIN
1548 
1549     L_FuncProc := 'Validate_Update_Assignment';
1550     x_return_status := FND_API.G_RET_STS_SUCCESS;
1551     g_require_progress_rollup := 'N'; -- End of Bug 4492493
1552 
1553     IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 3) THEN
1554 	    pa_debug.g_err_stage:='Beginning of TA:Validate_Update_Assignment';
1555 	    pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
1556 	END IF;
1557 
1558 	l_msg_added_flag := 'N'; -- Fix for Bug # 4319137.
1559 
1560 
1561     --Bug 4492493: Check if Progress Rollup is required on UPDATE
1562     OPEN C_Get_Project_Id;
1563     FETCH C_Get_Project_Id INTO l_project_id;
1564     CLOSE C_Get_Project_Id;
1565 
1566     l_progress_rollup_required := Is_Progress_Rollup_Required(l_project_id);
1567     -- End of Bug 4492493
1568 
1569     FOR i in 1..p_task_assignment_tbl.COUNT LOOP
1570 
1571         -- Initialize the error indicator
1572         l_viol_indicator := null;
1573 
1574 	    IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 3) THEN
1575 	        pa_debug.g_err_stage:='P_resource_assignment_id:' ||   i   ||  ' :  ' ||  p_task_assignment_tbl(i).resource_assignment_id;
1576 	        pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
1577 	        pa_debug.g_err_stage:='P_Planning_Resource_Alias:' ||  i || p_task_assignment_tbl(i).planning_resource_alias;
1578 	        pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
1579 	        pa_debug.g_err_stage:='P_resource_list_member_id:' ||   i   ||  ' :  ' ||  p_task_assignment_tbl(i).resource_list_member_id;
1580 	        pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
1581 	        pa_debug.g_err_stage:='P_resource_class_code:' ||   i   ||  ' :  ' ||  p_task_assignment_tbl(i).resource_class_code;
1582 	        pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
1583 	        pa_debug.g_err_stage:='P_res_type_code:' ||   i   ||  ' :  ' ||  p_task_assignment_tbl(i).res_type_code;
1584 	        pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
1585 	        pa_debug.g_err_stage:='P_resource_code:' ||   i   ||  ' :  ' ||  p_task_assignment_tbl(i).resource_code;
1586 	        pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
1587 	        pa_debug.g_err_stage:='P_resource_name:' ||   i   ||  ' :  ' ||  p_task_assignment_tbl(i).resource_name;
1588 	        pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
1589 	        pa_debug.g_err_stage:='P_project_role_id:' ||   i   ||  ' :  ' ||  p_task_assignment_tbl(i).project_role_id;
1590 	        pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
1591 	        pa_debug.g_err_stage:='P_project_role_name:' ||   i   ||  ' :  ' ||  p_task_assignment_tbl(i).project_role_name;
1592 	        pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
1593 	        pa_debug.g_err_stage:='P_organization_id:' ||   i   ||  ' :  ' ||  p_task_assignment_tbl(i).organization_id;
1594 	        pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
1595 	        pa_debug.g_err_stage:='P_organization_name:' ||   i   ||  ' :  ' ||  p_task_assignment_tbl(i).organization_name;
1596 	        pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
1597 	        pa_debug.g_err_stage:='P_FC_Res_Type_Code:' ||   i   ||  ' :  ' ||  p_task_assignment_tbl(i).fc_res_type_code;
1598 	        pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
1599 	        pa_debug.g_err_stage:='P_Fin_Category_Name:' ||   i   ||  ' :  ' ||  p_task_assignment_tbl(i).financial_category_name;
1600 	        pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
1601 	        pa_debug.g_err_stage:='P_Supplier_id:' ||   i   ||  ' :  ' ||  p_task_assignment_tbl(i).supplier_id;
1602 	        pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
1603 	        pa_debug.g_err_stage:='P_Supplier_name:' ||   i   ||  ' :  ' ||  p_task_assignment_tbl(i).supplier_name;
1604 	        pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
1605 	        pa_debug.g_err_stage:='P_INcur_By_Resource_Code:' ||   i   ||  ' :  ' ||  p_task_assignment_tbl(i).incur_by_resource_code;
1606 	        pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
1607 	        pa_debug.g_err_stage:='P_planning_start_date:' ||   i   ||  ' :  ' || p_task_assignment_tbl(i).planning_start_date;
1608 	        pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
1609 	        pa_debug.g_err_stage:='P_planning_end_date : ' ||   i   ||  ' :  ' || p_task_assignment_tbl(i).planning_end_date;
1610 	        pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
1611 	        pa_debug.g_err_stage:='P_schedule_start_date:' ||   i   ||  ' :  ' || p_task_assignment_tbl(i).schedule_start_date;
1612 	        pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
1613 	        pa_debug.g_err_stage:='P_schedule_end_date : ' ||   i   ||  ' :  ' || p_task_assignment_tbl(i).schedule_end_date;
1614 	        pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
1615 		END IF;
1616 
1617         -- get old assignment data
1618         OPEN  C_Res_Assignment_Info(p_task_assignment_tbl(i).resource_assignment_id);
1619         FETCH C_Res_Assignment_Info INTO R_Res_Assignment_Rec;
1620         CLOSE C_Res_Assignment_Info;
1621         l_sp_fixed_date := NULL;
1622 
1623 
1624         -- Bug 4492493: Check if Progress Rollup is required on UPDATE
1625         IF g_require_progress_rollup = 'N' AND
1626            l_progress_rollup_required = 'Y' AND
1627            p_task_assignment_tbl(i).total_quantity IS NOT NULL AND
1628            (R_Res_Assignment_Rec.total_plan_quantity <> p_task_assignment_tbl(i).total_quantity OR
1629             R_Res_Assignment_Rec.total_plan_quantity IS NULL) THEN
1630           g_require_progress_rollup := 'Y';
1631         END IF;
1632         -- End of Bug 4492493
1633 
1634         -- Bug 3640647
1635         -- If the resource list member of a task effort assignment is changed
1636         -- toggle the ta_display_flag
1637         -- 10/12/04: Do not allow the rlm of the ta_display_flag = 'N' record to be
1638         --           updated if progress/actual exists on the published version
1639         OPEN C2_Task_Effort_Assignment(p_task_assignment_tbl(i).resource_assignment_id);
1640         FETCH C2_Task_Effort_Assignment INTO l_ta_display_flag, l_rlm_id, l_progress_project_id, l_progress_task_id, l_progress_struct_ver_id;
1641         CLOSE C2_Task_Effort_Assignment;
1642 
1643         l_progress_exists := 'N';
1644 
1645         IF l_rlm_id <> p_task_assignment_tbl(i).resource_list_member_id AND
1646            l_ta_display_flag = 'N' THEN
1647 
1648             UPDATE pa_resource_assignments
1649             SET ta_display_flag = 'Y'
1650             WHERE resource_assignment_id = p_task_assignment_tbl(i).resource_assignment_id;
1651 
1652         END IF; -- l_rlm_id <> p_task_assignment_tbl(i).resource_list_member_id
1653         -- END OF Bug 3640647
1654 
1655 
1656 		l_wbs_element_version_id := R_Res_Assignment_Rec.wbs_element_version_id;
1657 
1658 		BEGIN
1659 
1660 			l_struct_ver_id := -99;
1661 			l_project_id := -99;
1662 
1663 	        SELECT parent_structure_version_id, project_id, proj_element_id
1664 			INTO l_struct_ver_id, l_project_id, l_proj_element_id
1665             from pa_proj_element_versions
1666             where element_version_id = l_wbs_element_version_id;
1667 
1668         EXCEPTION
1669             WHEN NO_DATA_FOUND THEN
1670 	            NULL;
1671 		    WHEN OTHERS THEN
1672 		        RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1673 	    END;
1674 
1675 			-- Bug 6856934
1676 			if nvl(p_calling_context,'X') = 'PA_PROJECT_ASSIGNMENT' then
1677 			    l_edit_task_ok := 'Y';
1678 			else
1679 
1680 			    l_edit_task_ok := check_edit_task_ok(P_PROJECT_ID => l_project_id,
1681                              P_STRUCTURE_VERSION_ID   => l_struct_ver_id,
1682                              P_CURR_STRUCT_VERSION_ID => l_struct_ver_id);
1683 			end if;
1684 			-- Bug 6856934
1685 
1686 			IF 'Y' = l_edit_task_ok then
1687 			/*check_edit_task_ok(P_PROJECT_ID => l_project_id,
1688                            P_STRUCTURE_VERSION_ID   => l_struct_ver_id,
1689                            P_CURR_STRUCT_VERSION_ID => l_struct_ver_id) THEN Bug 6856934*/
1690 
1691 			OPEN C1_Task_Dates(l_wbs_element_version_id);
1692 	        FETCH C1_Task_Dates INTO l_task_sch_start, l_task_sch_end, l_task_name, l_task_number;
1693 	        CLOSE C1_Task_Dates;
1694 
1695 	    	IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 3) THEN
1696 	            pa_debug.g_err_stage:='TA: alias:'||p_task_assignment_tbl(i).planning_resource_alias;
1697 	            pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
1698 	            pa_debug.g_err_stage:='TA: resource_list_member_id:'||p_task_assignment_tbl(i).resource_list_member_id;
1699 	            pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
1700 			END IF;
1701 
1702             L_Incur_By_Resource_Type := NULL;
1703             --reinitialize..
1704 			Lr_eligible_rlm_id_tbl := SYSTEM.PA_NUM_TBL_TYPE();
1705 
1706             -- Added by clevesqu on 2004/09/08 for bug 3877543
1707 			-- If the user re-select the same planning resource with via the planning resource LOV
1708 			-- (e.g. when the user selects the same planning resource but picks one with a team role)
1709 			-- Keep the attributes which have been defaulted.
1710 			IF (p_task_assignment_tbl(i).resource_list_member_id = R_Res_Assignment_Rec.resource_list_member_id
1711 				OR p_task_assignment_tbl(i).resource_list_member_id IS NULL) THEN
1712 
1713 				p_task_assignment_tbl(i).organization_id := R_Res_Assignment_Rec.organization_id;
1714 				p_task_assignment_tbl(i).expenditure_type := R_Res_Assignment_Rec.expenditure_type;
1715 				p_task_assignment_tbl(i).person_type_code := R_Res_Assignment_Rec.person_type_code;
1716 				p_task_assignment_tbl(i).job_id := R_Res_Assignment_Rec.job_id;
1717 
1718 			END IF;
1719 			-- End added by clevesqu on 2004/09/08 for bug 3877543
1720 
1721 			IF (p_task_assignment_tbl(i).resource_list_member_id IS NOT NULL OR
1722 			    p_task_assignment_tbl(i).planning_resource_alias IS NOT NULL) AND
1723 			   (p_task_assignment_tbl(i).resource_list_member_id <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM OR
1724 				p_task_assignment_tbl(i).planning_resource_alias <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR) AND
1725 			   (p_task_assignment_tbl(i).resource_list_member_id <> FND_API.G_MISS_NUM OR
1726 				p_task_assignment_tbl(i).planning_resource_alias <> FND_API.G_MISS_CHAR) AND
1727 			   nvl(p_task_assignment_tbl(i).resource_list_member_id, -99) <> nvl(R_Res_Assignment_Rec.resource_list_member_id, -99) THEN
1728 
1729 				-- Added by clevesqu on 2004/09/03 for bug 3861936
1730 				PA_PLANNING_RESOURCE_UTILS.check_list_member_on_list(
1731 				    p_resource_list_id          => Get_WP_Resource_List_Id(l_project_id),
1732 					p_resource_list_member_id   => p_task_assignment_tbl(i).resource_list_member_id,
1733 					p_project_id                => l_project_id,
1734 					p_alias                     => p_task_assignment_tbl(i).planning_resource_alias,
1735 			-- 4537865 x_resource_list_member_id   => p_task_assignment_tbl(i).resource_list_member_id,
1736 					x_resource_list_member_id => l_new_resource_list_member_id , -- 4537865
1737 					x_valid_member_flag         => l_valid_member_flag,
1738 					x_return_status             => x_return_status,
1739 					x_msg_count                 => x_msg_count,
1740 					x_msg_data                  => x_msg_data);
1741 			IF x_return_status = FND_API.G_RET_STS_SUCCESS THEN
1742 
1743 				p_task_assignment_tbl(i).resource_list_member_id := l_new_resource_list_member_id ;  -- 4537865
1744 			END IF ;
1745 
1746 				IF(x_return_status = FND_API.G_RET_STS_UNEXP_ERROR) THEN
1747 				    RAISE  FND_API.G_EXC_UNEXPECTED_ERROR;
1748 				ELSIF(x_return_status = FND_API.G_RET_STS_ERROR) THEN
1749 				    RAISE  FND_API.G_EXC_ERROR;
1750 				END IF;
1751 				-- End added by clevesqu on 2004/09/03 for bug 3861936
1752 
1753 				Lr_eligible_rlm_id_tbl.extend(1);
1754 				Lr_eligible_rlm_id_tbl(1) := p_task_assignment_tbl(i).resource_list_member_id;
1755 
1756 				IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 3) THEN
1757 	                pa_debug.g_err_stage:='About to call PA_PLANNING_RESOURCE_UTILS.get_resource_defaults w/ret.status='||x_return_status;
1758 					pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
1759 				END IF;
1760 
1761 				PA_PLANNING_RESOURCE_UTILS.get_resource_defaults(
1762 				    p_resource_list_members        =>  Lr_eligible_rlm_id_tbl,
1763 				    p_project_id                   =>  l_project_id,
1764 				    x_resource_class_flag          =>  lr_resource_class_flag_tbl,
1765 				    x_resource_class_code          =>  lr_resource_class_code_tbl,
1766 				    x_resource_class_id            =>  lr_resource_class_id_tbl,
1767 				    x_res_type_code                =>  lr_res_type_code_tbl,
1768 				    x_incur_by_res_type            =>  lr_incur_by_res_type_tbl,
1769 				    x_person_id                    =>  lr_person_id_tbl,
1770 				    x_job_id                       =>  lr_job_id_tbl,
1771 				    x_person_type_code             =>  lr_person_type_code_tbl,
1772 				    x_named_role                   =>  lr_named_role_tbl,
1773 				    x_bom_resource_id              =>  lr_bom_resource_id_tbl,
1774 				    x_non_labor_resource           =>  lr_non_labor_resource_tbl,
1775 				    x_inventory_item_id            =>  lr_inventory_item_id_tbl,
1776 				    x_item_category_id             =>  lr_item_category_id_tbl,
1777 				    x_project_role_id              =>  lr_project_role_id_tbl,
1778 				    x_organization_id              =>  lr_organization_id_tbl,
1779 				    x_fc_res_type_code             =>  lr_fc_res_type_code_tbl,
1780 				    x_expenditure_type             =>  lr_expenditure_type_tbl,
1781 				    x_expenditure_category         =>  lr_expenditure_category_tbl,
1782 				    x_event_type                   =>  lr_event_type_tbl,
1783 				    x_revenue_category_code        =>  lr_revenue_category_code_tbl,
1784 				    x_supplier_id                  =>  lr_supplier_id_tbl,
1785 				    x_unit_of_measure              =>  lr_unit_of_measure_tbl,
1786 				    x_spread_curve_id              =>  lr_spread_curve_id_tbl,
1787 				    x_etc_method_code              =>  lr_etc_method_code_tbl,
1788 				    x_mfc_cost_type_id             =>  lr_mfc_cost_type_id_tbl,
1789 				    x_incurred_by_res_flag         =>  lr_incurred_by_res_flag_tbl,
1790 				    x_incur_by_res_class_code      =>  lr_incur_by_res_class_code_tbl,
1791 				    x_Incur_by_role_id             =>  lr_Incur_by_role_id_tbl,
1792 			        x_org_id                       =>  lr_org_id_tbl,
1793 				    X_rate_based_flag              =>  lr_rate_based_flag_tbl,
1794 				    x_rate_expenditure_type        =>  lr_rate_expenditure_type_tbl,
1795 				    x_rate_func_curr_code          =>  lr_rate_func_curr_code_tbl,
1796 					x_msg_data                     =>  x_msg_data,
1797 				    x_msg_count                    =>  x_msg_count,
1798 				    x_return_status                =>  x_return_status);
1799 
1800 				IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 3) THEN
1801 	                pa_debug.g_err_stage:='After PA_PLANNING_RESOURCE_UTILS.get_resource_defaults='||x_return_status;
1802 	                pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
1803 	                pa_debug.g_err_stage:='X_Resource_List_Member_Id  => ' ||    i    ||   ' : ' ||  p_task_assignment_tbl(i).resource_list_member_id ;
1804 	                pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
1805 	                pa_debug.g_err_stage:='x_resource_class_flag_tbl => ' ||  lr_resource_class_flag_tbl(1) ;
1806 	                pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
1807 	                pa_debug.g_err_stage:='x_resource_class_code_tbl => ' ||  lr_resource_class_code_tbl(1) ;
1808 	                pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
1809 	                pa_debug.g_err_stage:='x_resource_class_id_tbl => ' ||  lr_resource_class_id_tbl(1) ;
1810 	                pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
1811 	                pa_debug.g_err_stage:='x_res_type_code_tbl => ' ||  lr_res_type_code_tbl(1) ;
1812 	                pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
1813 	                pa_debug.g_err_stage:='x_incur_by_res_type_tbl => ' ||  lr_incur_by_res_type_tbl(1) ;
1814 	                pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
1815 	                pa_debug.g_err_stage:='x_person_id_tbl => ' ||  lr_person_id_tbl(1) ;
1816 	                pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
1817 	                pa_debug.g_err_stage:='x_person_type_code_tbl => ' ||  lr_person_type_code_tbl(1) ;
1818 	                pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
1819 	                pa_debug.g_err_stage:='x_named_role_tbl => ' ||  lr_named_role_tbl(1) ;
1820 	                pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
1821 	                pa_debug.g_err_stage:='x_bom_resource_id_tbl => ' ||  lr_bom_resource_id_tbl(1) ;
1822 	                pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
1823 	                pa_debug.g_err_stage:='x_non_labor_resource_tbl => ' ||  lr_non_labor_resource_tbl(1) ;
1824 	                pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
1825 	                pa_debug.g_err_stage:='x_inventory_item_id_tbl => ' ||  lr_inventory_item_id_tbl(1) ;
1826 	                pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
1827 	                pa_debug.g_err_stage:='x_item_category_id_tbl => ' ||  lr_item_category_id_tbl(1) ;
1828 	                pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
1829 	                pa_debug.g_err_stage:='x_project_role_id_tbl => ' ||  lr_project_role_id_tbl(1) ;
1830 	                pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
1831 	                pa_debug.g_err_stage:='x_organization_id_tbl => ' ||  lr_organization_id_tbl(1) ;
1832 	                pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
1833 	                pa_debug.g_err_stage:='x_fc_res_type_code_tbl => ' ||  lr_fc_res_type_code_tbl(1) ;
1834 	                pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
1835 	                pa_debug.g_err_stage:='x_expenditure_type_tbl => ' ||  lr_expenditure_type_tbl(1) ;
1836 	                pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
1837 	                pa_debug.g_err_stage:='x_event_type_tbl => ' ||  lr_event_type_tbl(1) ;
1838 	                pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
1839 	                pa_debug.g_err_stage:='x_revenue_category_code_tbl => ' ||  lr_revenue_category_code_tbl(1) ;
1840 	                pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
1841 	                pa_debug.g_err_stage:='x_supplier_id            =>' ||  lr_supplier_id_tbl(1);
1842 	                pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
1843 	                pa_debug.g_err_stage:='x_unit_of_measure        =>' ||  lr_unit_of_measure_tbl(1);
1844 	                pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
1845 	                pa_debug.g_err_stage:='x_spread_curve_id        =>' ||  lr_spread_curve_id_tbl(1);
1846 	                pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
1847 	                pa_debug.g_err_stage:='x_etc_method_code        =>' ||  lr_etc_method_code_tbl(1);
1848 	                pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
1849 	                pa_debug.g_err_stage:='x_mfc_cost_type_id       =>' ||  lr_mfc_cost_type_id_tbl(1);
1850 	                pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
1851 	                pa_debug.g_err_stage:='x_incurred_by_res_flag   =>' ||  lr_incurred_by_res_flag_tbl(1);
1852 	                pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
1853 	                pa_debug.g_err_stage:='x_incur_by_res_class_code=>' ||  lr_incur_by_res_class_code_tbl(1);
1854 	                pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
1855 	                pa_debug.g_err_stage:='x_Incur_by_role_id       =>' ||  lr_Incur_by_role_id_tbl(1);
1856 	                pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
1857 	                pa_debug.g_err_stage:='x_org_id                 =>' ||  lr_org_id_tbl(1);
1858 	                pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
1859 	                pa_debug.g_err_stage:='x_rate_based_flag        =>' ||  lr_rate_based_flag_tbl(1);
1860 	                pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
1861 	                pa_debug.g_err_stage:='x_rate_expenditure_type  =>' ||  lr_rate_expenditure_type_tbl(1);
1862 	                pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
1863 	                pa_debug.g_err_stage:='x_rate_func_curr_code    =>' ||  lr_rate_func_curr_code_tbl(1);
1864 	                pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
1865 				END IF;
1866 
1867 				-- DHI Fix: override currency
1868 				R_Res_Assignment_Rec.rate_based_flag := lr_rate_based_flag_tbl(1);
1869 
1870 				IF (x_return_status = FND_API.G_RET_STS_UNEXP_ERROR) THEN
1871 				    RAISE  FND_API.G_EXC_UNEXPECTED_ERROR;
1872 				ELSIF  (x_return_status = FND_API.G_RET_STS_ERROR) THEN
1873 				    RAISE  FND_API.G_EXC_ERROR;
1874 				END IF;
1875 
1876 				P_task_assignment_tbl(i).resource_class_flag     := gchar(lr_resource_class_flag_tbl(1), 'B');
1877 				P_task_assignment_tbl(i).resource_class_code     := gchar(lr_resource_class_code_tbl(1), 'B');
1878 				P_task_assignment_tbl(i).resource_class_id       := gnum(lr_resource_class_id_tbl(1), 'B');
1879 				P_task_assignment_tbl(i).res_type_code           := gchar(lr_res_type_code_tbl(1), 'B');
1880 				P_task_assignment_tbl(i).incur_by_res_type       := gchar(lr_incur_by_res_type_tbl(1), 'B');
1881 				P_task_assignment_tbl(i).Person_Id               := gnum(lr_Person_Id_tbl(1), 'B');
1882 				P_task_assignment_tbl(i).Job_Id                  := gnum(lr_Job_Id_tbl(1), 'B');
1883 				P_task_assignment_tbl(i).Person_Type_Code        := gchar(lr_Person_Type_Code_tbl(1), 'B');
1884 				P_task_assignment_tbl(i).named_role              := NVL(gchar(p_task_assignment_tbl(i).named_role),gchar(lr_named_role_tbl(1), 'B'));
1885 				P_task_assignment_tbl(i).bom_resource_id         := gnum(lr_bom_resource_id_tbl(1), 'B');
1886 				P_task_assignment_tbl(i).non_labor_resource      := gchar(lr_non_labor_resource_tbl(1), 'B');
1887 				P_task_assignment_tbl(i).inventory_item_id       := gnum(lr_inventory_item_id_tbl(1), 'B');
1888 				P_task_assignment_tbl(i).item_category_id        := gnum(lr_item_category_id_tbl(1), 'B');
1889 				P_task_assignment_tbl(i).project_role_id         := gnum(lr_project_role_id_tbl(1), 'B');
1890 				P_task_assignment_tbl(i).organization_id         := gnum(lr_organization_id_tbl(1), 'B');
1891 				P_task_assignment_tbl(i).fc_res_type_code        := gchar(lr_fc_res_type_code_tbl(1), 'B');
1892 				P_task_assignment_tbl(i).expenditure_type        := gchar(lr_expenditure_type_tbl(1), 'B');
1893 				P_task_assignment_tbl(i).expenditure_category    := gchar(lr_expenditure_category_tbl(1),'B');
1894 				P_task_assignment_tbl(i).event_type              := gchar(lr_event_type_tbl(1), 'B');
1895 				P_task_assignment_tbl(i).revenue_category_code   := gchar(lr_revenue_category_code_tbl(1), 'B');
1896 				P_task_assignment_tbl(i).supplier_id             := gnum(lr_supplier_id_tbl(1), 'B');
1897 				P_task_assignment_tbl(i).unit_of_measure         := gchar(lr_unit_of_measure_tbl(1), 'B');
1898 				P_task_assignment_tbl(i).spread_curve_id         := gnum(lr_spread_curve_id_tbl(1), 'B');
1899 				P_task_assignment_tbl(i).etc_method_code         := gchar(lr_etc_method_code_tbl(1), 'B');
1900 				P_task_assignment_tbl(i).mfc_cost_type_id        := gnum(lr_mfc_cost_type_id_tbl(1), 'B');
1901 				P_task_assignment_tbl(i).incurred_by_res_flag    := gchar(lr_incurred_by_res_flag_tbl(1), 'B');
1902 				P_task_assignment_tbl(i).incur_by_res_class_code := gchar(lr_incur_by_res_class_code_tbl(1), 'B');
1903 				P_task_assignment_tbl(i).Incur_by_role_id        := gnum(lr_Incur_by_role_id_tbl(1), 'B');
1904 				P_task_assignment_tbl(i).org_id                  := gnum(lr_org_id_tbl(1), 'B');
1905 				P_task_assignment_tbl(i).rate_based_flag         := gchar(lr_rate_based_flag_tbl(1), 'B');
1906 				P_task_assignment_tbl(i).rate_expenditure_type   := gchar(lr_rate_expenditure_type_tbl(1), 'B');
1907 				P_task_assignment_tbl(i).rate_func_curr_code     := gchar(lr_rate_func_curr_code_tbl(1), 'B');
1908 
1909             ELSIF p_task_assignment_tbl(i).resource_list_member_id is not Null Then
1910 
1911 				--1. Resource Information
1912                 IF (p_task_assignment_tbl(i).incur_by_resource_code IS NOT NULL AND
1913                     p_task_assignment_tbl(i).incur_by_resource_code <> FND_API.G_MISS_CHAR)
1914                    OR
1915                    (p_task_assignment_tbl(i).incur_by_resource_name IS NOT NULL AND
1916                     p_task_assignment_tbl(i).incur_by_resource_name <> FND_API.G_MISS_CHAR) THEN
1917 
1918 			        L_Incur_By_Resource_Type	:= gchar(p_task_assignment_tbl(i).res_type_code);
1919 
1920 		        END IF;
1921 
1922         		l_P_Resource_List_Member_Id := gnum(p_task_assignment_tbl(i).resource_list_member_id);
1923         		l_P_Project_Role_Id	        := gnum(p_task_assignment_tbl(i).project_role_id);
1924         		l_P_Organization_Id	        := gnum(p_task_assignment_tbl(i).organization_id);
1925         		l_P_Supplier_Id		        := gnum(p_task_assignment_tbl(i).supplier_id);
1926                 l_P_named_role              := gchar(p_task_assignment_tbl(i).named_role);
1927 
1928 				IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 3) THEN
1929 	                pa_debug.g_err_stage:='Before validate_planning_resource call in task assignment utils, return status='||x_return_status;
1930 	                pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
1931 				END IF;
1932 
1933 				PA_PLANNING_RESOURCE_UTILS.Validate_Planning_Resource(
1934         		    P_Task_Name		           => l_task_name,
1935         		    P_Task_Number		       => l_task_number,
1936         		    P_Planning_Resource_Alias  => gchar(p_task_assignment_tbl(i).planning_resource_alias),
1937         		    P_Resource_List_Member_Id  => l_p_resource_list_member_id,
1938         		    P_Res_Format_Id		       => null,
1939         		    P_Resource_Class_Code      => gchar(p_task_assignment_tbl(i).resource_class_code),
1940         		    P_Res_Type_Code		       => gchar(p_task_assignment_tbl(i).res_type_code),
1941         		    P_Resource_Code		       => gchar(p_task_assignment_tbl(i).resource_code),
1942         		    P_Resource_Name		       => gchar(p_task_assignment_tbl(i).resource_name),
1943         		    P_Project_Role_Id	       => l_p_project_role_id,
1944         		    P_Project_Role_Name	       => gchar(p_task_assignment_tbl(i).project_role_name),
1945 				    P_Team_Role     	       => l_p_named_role,
1946         		    P_Organization_Id	       => l_p_organization_id,
1947         		    P_Organization_Name	       => gchar(p_task_assignment_tbl(i).organization_name),
1948         		    P_FC_Res_Type_Code	       => gchar(p_task_assignment_tbl(i).fc_res_type_code),
1949         		    P_Fin_Category_Name	       => gchar(p_task_assignment_tbl(i).financial_category_name),
1950         		    P_Supplier_Id		       => l_p_supplier_id,
1951         		    P_Supplier_Name		       => gchar(p_task_assignment_tbl(i).supplier_name),
1952         		    P_Incur_By_Resource_Code   => gchar(p_task_assignment_tbl(i).incur_by_resource_code),
1953         		    P_Incur_By_Resource_Type   => L_Incur_By_Resource_Type,
1954         		    X_Resource_List_Member_Id  => P_task_assignment_tbl(i).Resource_List_Member_Id,
1955         		    X_Person_Id		           => P_task_assignment_tbl(i).Person_Id,
1956         		    X_Bom_Resource_Id	       => P_task_assignment_tbl(i).Bom_Resource_Id,
1957         		    X_Job_Id		           => P_task_assignment_tbl(i).Job_Id,
1958         		    X_Person_Type_Code	       => P_task_assignment_tbl(i).Person_Type_Code,
1959         		    X_Non_Labor_Resource       => P_task_assignment_tbl(i).Non_Labor_Resource ,
1960         		    X_Inventory_Item_Id	       => P_task_assignment_tbl(i).Inventory_Item_Id,
1961         		    X_Item_Category_Id	       => P_task_assignment_tbl(i).item_category_id,
1962         		    X_Project_Role_Id	       => P_task_assignment_tbl(i).project_role_id,
1963 				    X_Team_Role     	       => p_task_assignment_tbl(i).named_role,
1964         	    	X_Organization_Id	       => P_task_assignment_tbl(i).organization_id,
1965         	    	X_Expenditure_Type	       => P_task_assignment_tbl(i).expenditure_type,
1966         	    	X_Expenditure_Category	   => P_task_assignment_tbl(i).expenditure_category,
1967         	    	X_Event_Type		       => P_task_assignment_tbl(i).event_type,
1968         	    	X_Revenue_Category_Code	   => P_task_assignment_tbl(i).revenue_category_code,
1969         	    	X_Supplier_Id		       => P_task_assignment_tbl(i).supplier_id,
1970         	    	X_Resource_Class_Id	       => P_task_assignment_tbl(i).resource_class_id,
1971         	    	X_Incur_By_Role_Id	       => P_task_assignment_tbl(i).incur_by_role_id,
1972         	    	X_Incur_By_Res_Class_Code  => P_task_assignment_tbl(i).incur_by_res_class_code,
1973         	    	X_Incur_By_Res_Flag	       => P_task_assignment_tbl(i).incurred_by_res_flag,
1974           	    	X_Resource_Class_Flag      => P_task_assignment_tbl(i).resource_class_flag,
1975         	    	X_Return_Status		       => x_return_status,
1976         	    	X_Msg_Data		           => x_msg_data,
1977         	    	X_Msg_Count		           => x_msg_count);
1978 
1979 				IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 3) THEN
1980 	                pa_debug.g_err_stage:='After validate_planning_resource, return status='||x_return_status;
1981 	                pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
1982 				END IF;
1983 
1984                 IF x_return_status = FND_API.G_RET_STS_ERROR THEN
1985                     RAISE FND_API.G_EXC_ERROR;
1986 	          	ELSIF x_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
1987                     RAISE  FND_API.G_EXC_UNEXPECTED_ERROR;
1988                 END IF;
1989 
1990 				P_task_assignment_tbl(i).expenditure_type := NULL; --nvl(P_task_assignment_tbl(i).expenditure_type, FND_API.G_MISS_CHAR);
1991 				P_task_assignment_tbl(i).expenditure_category := NULL; --nvl(P_task_assignment_tbl(i).expenditure_category,FND_API.G_MISS_CHAR);
1992 	        	P_task_assignment_tbl(i).event_type := NULL; --nvl(P_task_assignment_tbl(i).event_type, FND_API.G_MISS_CHAR);
1993 	        	P_task_assignment_tbl(i).revenue_category_code := NULL; --nvl(P_task_assignment_tbl(i).revenue_category_code, FND_API.G_MISS_CHAR);
1994 	            P_task_assignment_tbl(i).fc_res_type_code := NULL; --nvl(p_task_assignment_tbl(i).fc_res_type_code, FND_API.G_MISS_CHAR);
1995 				P_task_assignment_tbl(i).incur_by_role_id := NULL; --nvl(P_task_assignment_tbl(i).incur_by_role_id, FND_API.G_MISS_NUM);
1996 	        	P_task_assignment_tbl(i).incur_by_res_class_code := NULL; --nvl(P_task_assignment_tbl(i).incur_by_res_class_code, FND_API.G_MISS_CHAR);
1997 
1998 				-- Setting to null for bug 3664052
1999 				P_task_assignment_tbl(i).Person_Id := NULL;
2000 				P_task_assignment_tbl(i).Bom_Resource_Id := NULL;
2001 				P_task_assignment_tbl(i).Job_Id := NULL;
2002 				P_task_assignment_tbl(i).Person_Type_Code := NULL;
2003 				P_task_assignment_tbl(i).Non_Labor_Resource := NULL;
2004 				P_task_assignment_tbl(i).Inventory_Item_Id := NULL;
2005 				P_task_assignment_tbl(i).Item_Category_Id := NULL;
2006 
2007 	            -- Distinguishing new output params that are converted. 5/24/04
2008 	        	P_task_assignment_tbl(i).project_role_id := gnum(P_task_assignment_tbl(i).project_role_id, 'B');
2009 				p_task_assignment_tbl(i).named_role := gchar(p_task_assignment_tbl(i).named_role, 'B');
2010 
2011 	        	P_task_assignment_tbl(i).organization_id := NULL; --gnum(P_task_assignment_tbl(i).organization_id, 'B');
2012 	        	P_task_assignment_tbl(i).supplier_id := NULL; --gnum(P_task_assignment_tbl(i).supplier_id, 'B');
2013 	        	P_task_assignment_tbl(i).resource_class_id := NULL; --gnum(P_task_assignment_tbl(i).resource_class_id, 'B');
2014 	        	P_task_assignment_tbl(i).incur_by_role_id := NULL; --gnum(P_task_assignment_tbl(i).incur_by_role_id, 'B');
2015 	            P_task_assignment_tbl(i).incur_by_res_class_code := NULL; --gchar(P_task_assignment_tbl(i).incur_by_res_class_code, 'B');
2016 	            P_task_assignment_tbl(i).incurred_by_res_flag := NULL; --gchar(P_task_assignment_tbl(i).incurred_by_res_flag, 'B');
2017 	          	P_task_assignment_tbl(i).resource_class_flag := NULL; --gchar(P_task_assignment_tbl(i).resource_class_flag, 'B');
2018 
2019 				IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 3) THEN
2020 	                pa_debug.g_err_stage:='X_Resource_List_Member_Id  => ' ||    i    ||   ' : ' ||  p_task_assignment_tbl(i).resource_list_member_id ;
2021 	                pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
2022 	                pa_debug.g_err_stage:='X_Person_Id		           => ' ||    i    ||   ' : ' ||   p_task_assignment_tbl(i).person_id;
2023 	                pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
2024 	                pa_debug.g_err_stage:='X_Bom_Resource_Id	       => ' ||    i    ||   ' : ' ||  p_task_assignment_tbl(i).bom_resource_id;
2025 	                pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
2026 	                pa_debug.g_err_stage:='X_Job_Id		           => ' ||    i    ||   ' : ' ||  p_task_assignment_tbl(i).job_id;
2027 	                pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
2028 	                pa_debug.g_err_stage:='X_Person_Type_Code	       => ' ||    i    ||   ' : ' ||  p_task_assignment_tbl(i).person_type_code;
2029 	                pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
2030 	                pa_debug.g_err_stage:='X_Non_Labor_Resource       => ' ||    i    ||   ' : ' ||  p_task_assignment_tbl(i).non_labor_resource;
2031 	                pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
2032 	                pa_debug.g_err_stage:='X_Inventory_Item_Id	       => ' ||    i    ||   ' : ' ||  p_task_assignment_tbl(i).inventory_item_id;
2033 	                pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
2034 	                pa_debug.g_err_stage:='X_Item_Category_Id	       => ' ||    i    ||   ' : ' ||  p_task_assignment_tbl(i).item_category_id;
2035 	                pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
2036 	                pa_debug.g_err_stage:='X_Project_Role_Id	       => ' ||    i    ||   ' : ' ||  p_task_assignment_tbl(i).project_role_id;
2037 	                pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
2038 	                pa_debug.g_err_stage:='X_Organization_Id	       => ' ||    i    ||   ' : ' ||  p_task_assignment_tbl(i).organization_id;
2039 	                pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
2040 	                pa_debug.g_err_stage:='X_Expenditure_Type	       => ' ||    i    ||   ' : ' ||  p_task_assignment_tbl(i).expenditure_type;
2041 	                pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
2042 	                pa_debug.g_err_stage:='X_Expenditure_Category	   => ' ||    i    ||   ' : ' ||  p_task_assignment_tbl(i).expenditure_category;
2043 	                pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
2044 	                pa_debug.g_err_stage:='X_Event_Type		       => ' ||    i    ||   ' : ' ||  p_task_assignment_tbl(i).event_type;
2045 	                pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
2046 	                pa_debug.g_err_stage:='X_Revenue_Category_Code	   => ' ||    i    ||   ' : ' ||  p_task_assignment_tbl(i).revenue_category_code;
2047 	                pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
2048 	                pa_debug.g_err_stage:='X_Supplier_Id		       => ' ||    i    ||   ' : ' ||  p_task_assignment_tbl(i).supplier_id;
2049 	                pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
2050 	                pa_debug.g_err_stage:='X_Resource_Class_Id	       => ' ||    i    ||   ' : ' ||  p_task_assignment_tbl(i).resource_class_id;
2051 	                pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
2052 	                pa_debug.g_err_stage:='X_Incur_By_Role_Id	       => ' ||    i    ||   ' : ' ||  p_task_assignment_tbl(i).incur_by_role_id;
2053 	                pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
2054 	                pa_debug.g_err_stage:='X_Incur_By_Res_Class_Code  => ' ||    i    ||   ' : ' ||  p_task_assignment_tbl(i).incur_by_res_class_code;
2055 	                pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
2056 	                pa_debug.g_err_stage:='X_Incur_By_Res_Flag	       => ' ||    i    ||   ' : ' ||  p_task_assignment_tbl(i).incurred_by_res_flag;
2057 	                pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
2058 	                pa_debug.g_err_stage:='X_Resource_Class_Flag      => ' ||    i    ||   ' : ' ||  p_task_assignment_tbl(i).resource_class_flag;
2059 	                pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
2060 	                pa_debug.g_err_stage:='X_Return_Status		       => ' ||    i    ||   ' : ' ||  x_return_status;
2061 	                pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
2062 				END IF;
2063 
2064 	        END IF;
2065 
2066 			IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 3) THEN
2067 	            pa_debug.g_err_stage:='B4 Validate Fin Cat for WP: ' || L_FuncProc || ':return_status:' || x_return_status;
2068 	            pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
2069 			END IF;
2070 
2071 		    IF Validate_Fin_Cat_For_WP(p_task_assignment_tbl(i).fc_res_type_code ) <> 'Y' THEN
2072 			    x_return_status := FND_API.G_RET_STS_ERROR;
2073 	        END IF;
2074 
2075 			IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 3) THEN
2076 	            pa_debug.g_err_stage:='B4 Validate Pl_Res_For_WP: ' || L_FuncProc || ':return_status:' || x_return_status;
2077 	            pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
2078 			END IF;
2079 
2080 		    IF Validate_Pl_Res_For_WP(p_task_assignment_tbl(i).resource_list_member_id) <> 'Y' THEN
2081 			    x_return_status := FND_API.G_RET_STS_ERROR;
2082 	        END IF;
2083 
2084 			IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 3) THEN
2085 	            pa_debug.g_err_stage:='After Validate Pl_Res_For_WP: ' || L_FuncProc || ':return_status:' || x_return_status;
2086 	            pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
2087 			END IF;
2088 
2089             --2. Schedule Information
2090             --Validate the assignment Scheduled Dates:
2091             --first, if use_task_schedule_flag is set to Y, then assignment dates must be the same as task dates
2092 
2093             -- IB2 Unplanned Actual changes
2094             -- Replaced planning_start/end_date with schedule_start/end_date
2095             IF p_task_assignment_tbl(i).schedule_start_date IS NOT NULL OR
2096                p_task_assignment_tbl(i).schedule_end_date IS NOT NULL THEN
2097 
2098                 IF p_task_assignment_tbl(i).schedule_start_date IS NULL THEN
2099                   p_task_assignment_tbl(i).schedule_start_date := R_Res_Assignment_Rec.schedule_start_date;
2100                 ELSIF p_task_assignment_tbl(i).schedule_end_date IS NULL THEN
2101                   p_task_assignment_tbl(i).schedule_end_date := R_Res_Assignment_Rec.schedule_end_date;
2102                 END IF;
2103 
2104                 IF p_task_assignment_tbl(i).use_task_schedule_flag IS NULL THEN
2105                    p_task_assignment_tbl(i).use_task_schedule_flag := R_Res_Assignment_Rec.use_task_schedule_flag;
2106                 END IF;
2107 
2108 
2109 
2110                 -- Bug 4339939: Check if schedule start is greater than schedule end date
2111                 IF p_task_assignment_tbl(i).schedule_start_date > p_task_assignment_tbl(i).schedule_end_date THEN
2112 
2113 		   PA_UTILS.ADD_MESSAGE
2114                     (
2115 			p_app_short_name => 'PA',
2116                         p_msg_name       => 'PA_PL_TXN_DATES_ERR',
2117                         p_token1         => 'TASK_NAME',
2118                         p_value1         =>  l_task_name,
2119                         p_token2         => 'TASK_NUMBER',
2120                         p_value2         =>  l_task_number,
2121                         p_token3         => 'PL_RES_ALIAS',
2122                         p_value3         =>  p_task_assignment_tbl(i).planning_resource_alias
2123                     );
2124                     x_return_status := FND_API.G_RET_STS_ERROR;
2125 
2126                 -- CASE 1: If use_task_schedule_flag is set, make sure task and ta schedule
2127                 -- dates are the same
2128                -- rbruno modified for bug 9468665 - start
2129                 -- if use_task_schedule_flag is set and task and ta schedule dates are not
2130                 -- same, then reset use_task_schedule_flag to 'N'
2131 
2132                 ELSIF ((p_task_assignment_tbl(i).use_task_schedule_flag = 'Y')
2133 			        AND (trunc(p_task_assignment_tbl(i).schedule_start_date) <> trunc(l_task_sch_start) OR
2134 		                 trunc(p_task_assignment_tbl(i).schedule_end_date) <> trunc(l_task_sch_end))) THEN
2135                     p_task_assignment_tbl(i).use_task_schedule_flag := 'N';
2136                   -- rbruno modified for bug 9468665 - end
2137                 -- CASE2: otherwise if use_task_schedule_flag is not set,
2138                 -- then assignment dates should be within task dates
2139                 ELSIF trunc(p_task_assignment_tbl(i).schedule_start_date) < trunc(l_task_sch_start) OR
2140                       trunc(p_task_assignment_tbl(i).schedule_start_date) > trunc(l_task_sch_end) OR
2141                       trunc(p_task_assignment_tbl(i).schedule_end_date) < trunc(l_task_sch_start) OR
2142                       trunc(p_task_assignment_tbl(i).schedule_end_date) > trunc(l_task_sch_end) THEN
2143 
2144                     PA_UTILS.ADD_MESSAGE
2145                     (
2146 					    p_app_short_name => 'PA',
2147                         p_msg_name       => 'PA_PL_TXN_SCH_DATES_ERR',
2148                         p_token1         => 'TASK_NAME',
2149                         p_value1         =>  l_task_name,
2150                         p_token2         => 'TASK_NUMBER',
2151                         p_value2         =>  l_task_number,
2152                         p_token3         => 'PL_RES_ALIAS',
2153                         p_value3         =>  p_task_assignment_tbl(i).planning_resource_alias
2154                     );
2155                     x_return_status := FND_API.G_RET_STS_ERROR;
2156 
2157                 END IF;
2158 
2159 				-- scheduled_delay must be positive or null
2160 				IF nvl(p_task_assignment_tbl(i).scheduled_delay, 0) < 0 THEN
2161 
2162 					PA_UTILS.ADD_MESSAGE
2163 					(
2164 						p_app_short_name => 'PA',
2165 						p_msg_name       => 'PA_SCHED_DELAY_ERR'
2166 					);
2167 					x_return_status := FND_API.G_RET_STS_ERROR;
2168 				END IF;
2169 
2170                 -- CASE3: IB2 Unplanned Actual changes
2171                 -- Set planning dates to schedule dates
2172                 -- Bug 3676062
2173                 OPEN C_Budget_Version_Info (p_task_assignment_tbl(i).resource_assignment_id);
2174                 FETCH C_Budget_Version_Info INTO l_budget_version_id;
2175                 CLOSE C_Budget_Version_Info;
2176 
2177                 PA_FIN_PLAN_UTILS2.get_blactual_dates
2178                 (
2179 		    	 	p_budget_version_id       => l_budget_version_id,
2180                     p_resource_assignment_id  => p_task_assignment_tbl(i).resource_assignment_id,
2181                     x_bl_actual_start_date    => l_actual_start_date,
2182                     x_bl_actual_end_date      => l_actual_end_date,
2183                     x_return_status           => l_return_status,
2184                     x_error_msg_code          => l_error_msg_code
2185                 );
2186 
2187                 IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
2188 		   x_return_status := l_return_status;
2189 		END IF;
2190 
2191 		IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 3) THEN
2192 	                pa_debug.g_err_stage:='l_actual_start_date => ' || l_actual_start_date;
2193 	                pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
2194 	                pa_debug.g_err_stage:='l_actual_end_date => ' || l_actual_end_date;
2195 	                pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
2196 	                pa_debug.g_err_stage:='schedule_start_date => ' || p_task_assignment_tbl(i).schedule_start_date;
2197 	                pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
2198 	                pa_debug.g_err_stage:='schedule_end_date => ' || p_task_assignment_tbl(i).schedule_end_date;
2199 	                pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
2200 				END IF;
2201 
2202                 IF (l_actual_start_date IS NULL) OR (p_task_assignment_tbl(i).schedule_start_date <= l_actual_start_date) THEN
2203                     p_task_assignment_tbl(i).planning_start_date := p_task_assignment_tbl(i).schedule_start_date;
2204                 ELSE
2205                     p_task_assignment_tbl(i).planning_start_date := R_Res_Assignment_Rec.planning_start_date;
2206                 END IF;
2207 
2208                 IF (l_actual_end_date IS NULL) OR (p_task_assignment_tbl(i).schedule_end_date >= l_actual_end_date) THEN
2209                     p_task_assignment_tbl(i).planning_end_date := p_task_assignment_tbl(i).schedule_end_date;
2210                 ELSE
2211                     p_task_assignment_tbl(i).planning_end_date := R_Res_Assignment_Rec.planning_end_date;
2212                 END IF;
2213 
2214                 -- Shift sp_fixed_date accordingly if it is in Adjust
2215                 -- Adjust Date flow
2216                 -- new sp_fixed_date = min(old sp_fixed_date +(new planning
2217                 -- start date - old planning start date), new planning end date)
2218 				-- 10/14/04 Kaushik: Fixed Date should be shifted regardless of
2219                 --   the flow.
2220                 l_sp_fixed_date := p_task_assignment_tbl(i).sp_fixed_date;
2221 
2222                 IF (l_sp_fixed_date is NULL OR
2223                     l_sp_fixed_date = FND_API.G_MISS_DATE) THEN
2224                     l_sp_fixed_date := R_Res_Assignment_Rec.sp_fixed_date;
2225                 END IF;
2226 
2227                 IF l_sp_fixed_date is not NULL AND
2228                    l_sp_fixed_date <> FND_API.G_MISS_DATE AND
2229                    (l_sp_fixed_date > p_task_assignment_tbl(i).planning_end_date OR
2230                     l_sp_fixed_date < p_task_assignment_tbl(i).planning_start_date) THEN
2231 
2232                     p_task_assignment_tbl(i).sp_fixed_date := R_Res_Assignment_Rec.sp_fixed_date +
2233                         (p_task_assignment_tbl(i).planning_start_date - R_Res_Assignment_Rec.planning_start_date);
2234 
2235                     IF p_task_assignment_tbl(i).sp_fixed_date > p_task_assignment_tbl(i).planning_end_date THEN
2236                         p_task_assignment_tbl(i).sp_fixed_date := p_task_assignment_tbl(i).planning_end_date;
2237                     ELSIF p_task_assignment_tbl(i).sp_fixed_date < p_task_assignment_tbl(i).planning_start_date THEN
2238                         p_task_assignment_tbl(i).sp_fixed_date := p_task_assignment_tbl(i).planning_start_date;
2239 
2240                     END IF;
2241 
2242                 END IF; -- IF (l_sp_fixed_date is not NULL..
2243 
2244             END IF; -- p_task_assignment_tbl(i).schedule_*_date IS NOT NULL
2245 
2246             --Validate default Spread Curve - handled by the generic create planning transaction API.
2247 
2248             -- DHI Fix
2249             -- If no progress and no published version exists, override currency is only allowed
2250             -- if override rate also exists for rate based assignments
2251 		    IF (R_Res_Assignment_Rec.rate_based_flag = 'Y' AND
2252 			    p_task_assignment_tbl(i).override_currency_code <> FND_API.G_MISS_CHAR AND
2253 				p_task_assignment_tbl(i).override_currency_code IS NOT NULL AND
2254 				(p_task_assignment_tbl(i).cost_rate_override = FND_API.G_MISS_NUM OR
2255 				 p_task_assignment_tbl(i).cost_rate_override IS NULL)) THEN
2256 
2257                 l_viol_indicator := 8.7;
2258 
2259 			END IF;
2260 
2261 			IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 3) THEN
2262 				pa_debug.g_err_stage:='After Progress violation checks: l_viol_indicator' || l_viol_indicator;
2263 	            pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
2264 			END IF;
2265 
2266        	    IF l_viol_indicator is not null THEN
2267                 -- override currency must goes with override raw cost rate for rate-based asgmts
2268                 IF (l_viol_indicator = 8.7) THEN
2269                     PA_UTILS.ADD_MESSAGE
2270                     (
2271 					    p_app_short_name => 'PA',
2272                         p_msg_name       => 'PA_UP_TA_OVR_CUR_ERR'
2273     				);
2274                     x_return_status := FND_API.G_RET_STS_ERROR;
2275 	    	END IF;
2276 	    END IF;
2277 
2278         --4. Financial Summary Validation handled by generic update planning transaction API
2279         ELSE -- check task edit ok
2280 
2281             -- Bug 4533152
2282             --PA_UTILS.ADD_MESSAGE
2283             --(
2284 	    --	p_app_short_name => 'PA',
2285             --    p_msg_name       => 'PA_UPDATE_PUB_VER_ERR'
2286 	    --);
2287             x_return_status := FND_API.G_RET_STS_ERROR;
2288         END IF;
2289 
2290 	-- Begin fix for Bug # 4319137.
2291 
2292 	if (x_return_status = FND_API.G_RET_STS_ERROR) then
2293 
2294 		l_msg_added_flag := 'Y';
2295 
2296 	end if;
2297 
2298         -- End fix for Bug # 4319137.
2299 
2300     END LOOP;
2301 
2302 
2303         -- Begin fix for Bug # 4319137.
2304 
2305 	if (l_msg_added_flag = 'Y') then
2306 
2307 		x_return_status := FND_API.G_RET_STS_ERROR;
2308 	end if;
2309 
2310         -- End fix for Bug # 4319137.
2311 
2312     -- Finally, check the progress business rules.
2313     IF x_return_status = FND_API.G_RET_STS_SUCCESS THEN
2314     	PA_PROGRESS_UTILS.check_prog_for_update_asgmts
2315 	    (
2316 		    p_task_assignment_tbl => p_task_assignment_tbl,
2317 		    x_return_status => x_return_status
2318 	    );
2319     END IF;
2320 
2321 	IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 3) THEN
2322 	    pa_debug.g_err_stage:='End of TA:Validate_Update_Assignment';
2323 	    pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
2324 	END IF;
2325 
2326 EXCEPTION
2327 
2328     WHEN FND_API.G_EXC_ERROR THEN
2329         x_return_status := FND_API.G_RET_STS_ERROR;
2330         IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 5) THEN
2331             PA_DEBUG.write_log (x_module => L_Module,
2332                                 x_msg         => 'Error:' || L_FuncProc || SQLERRM,
2333                                 x_log_level   => 5);
2334 
2335         END IF;
2336 
2337 	WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
2338         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2339         IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 6) THEN
2340             PA_DEBUG.write_log (x_module => L_Module,
2341                                 x_msg         => 'Unexpected Error:' || L_FuncProc || SQLERRM,
2342                                 x_log_level   => 6);
2343         END IF;
2344         RAISE;
2345 
2346     WHEN OTHERS THEN
2347         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2348         IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 6) THEN
2349             PA_DEBUG.write_log (x_module => L_Module,
2350                                 x_msg         => 'Unexpected Error:' || L_FuncProc || SQLERRM,
2351                                 x_log_level   => 6);
2352         END IF;
2353         FND_MSG_PUB.add_exc_msg( p_pkg_name       => L_Module,
2354                                  p_procedure_name => L_FuncProc);
2355         RAISE;
2356 
2357 END Validate_Update_Assignment;
2358 
2359 
2360 
2361 
2362 
2363 -- This procedure will Validate the Deletion of Planning Transactions
2364 -- and return Assignments that can be deleted.
2365 
2366 -- Case 1: Delete tasks
2367 -- p_context = 'WORKPLAN' and p_task_or_res = 'TASKS'
2368 -- p_elem_ver_id_tbl is required = all task versions to be delete
2369 -- returns x_delete_task_flag_tbl which indicate whether all assignment
2370 -- under the task can be deleted or not.
2371 
2372 -- Case 2: Create subtask and delete parent task's task effort assignment
2373 -- p_context = 'WORKPLAN' and p_task_or_res = 'ASSIGNMENT'
2374 -- p_resource_assignment_id_tbl is required = ta_display_flag = 'N' records
2375 -- for the given task versions
2376 -- returns x_delete_asgmt_flag_tbl which indicate whether the given
2377 -- assignments can be deleted
2378 
2379 -- Case 3: Delete selected task assignments
2380 -- p_context = 'TASK_ASSIGNMENT' and p_task_or_res = 'ASSIGNMENT'
2381 -- p_resource_assignment_id_tbl is required = select assignments
2382 -- returns x_delete_asgmt_flag_tbl which indicate whether the given
2383 -- assignments can be deleted
2384 
2385 --Bug 4951422. Added the OUT parameter x_task_assmt_ids_tbl. This tbl will be populated
2386 --when p_task_or_res parameter is TASKS and p_context is WORKPLAN. This table will contain
2387 --the resource assignment ids that are eligible for deletion so that delete_planning_transactions
2388 --uses these ids instead of element_version_ids for deleting data
2389 
2390 PROCEDURE Validate_Delete_Assignment
2391 (
2392     p_context                    IN   VARCHAR2,
2393     p_calling_context            IN   VARCHAR2 DEFAULT NULL,   -- Added for Bug 6856934
2394     p_task_or_res                IN   VARCHAR2 DEFAULT 'ASSIGNMENT',
2395     p_elem_ver_id_tbl            IN   SYSTEM.PA_NUM_TBL_TYPE,
2396     p_task_name_tbl              IN   SYSTEM.PA_VARCHAR2_240_TBL_TYPE,
2397     p_task_number_tbl            IN   SYSTEM.PA_VARCHAR2_240_TBL_TYPE,
2398     p_resource_assignment_id_tbl IN   SYSTEM.PA_NUM_TBL_TYPE,
2399     x_delete_task_flag_tbl       OUT  NOCOPY SYSTEM.PA_VARCHAR2_1_TBL_TYPE,
2400     x_delete_asgmt_flag_tbl      OUT  NOCOPY SYSTEM.PA_VARCHAR2_1_TBL_TYPE,
2401     x_task_assmt_ids_tbl         OUT  NOCOPY SYSTEM.PA_NUM_TBL_TYPE, --Bug 4951422
2402     x_return_status              OUT  NOCOPY VARCHAR2
2403 )
2404 
2405 IS
2406 
2407 L_FuncProc varchar2(250) ;
2408 
2409 CURSOR C_Element_Info(p_wbs_element_version_id IN NUMBER) IS
2410     SELECT pev.project_id, pev.parent_structure_version_id, pev.proj_element_id, pe.name, pe.element_number
2411     FROM  pa_proj_element_versions pev, pa_proj_elements pe
2412     WHERE pev.element_version_id = p_wbs_element_version_id AND pe.proj_element_id = pev.proj_element_id;
2413 
2414 CURSOR C_Element_Info2(p_resource_assignment_id IN NUMBER) IS
2415     SELECT ra.wbs_element_version_id, ra.project_id, pev.proj_element_id, ra.resource_list_member_id, ra.ta_display_flag, ra.task_id, ra.unplanned_flag, ra.total_plan_quantity
2416     FROM pa_resource_assignments ra, pa_proj_element_versions pev
2417     WHERE resource_assignment_id = p_resource_assignment_id
2418 	and pev.element_version_id = ra.wbs_element_version_id;
2419 
2420 CURSOR C_Task_Asgmts(p_element_version_id IN NUMBER) IS
2421     SELECT resource_assignment_id
2422     FROM pa_resource_assignments
2423     WHERE wbs_element_version_id = p_element_version_id;
2424 
2425 -- Bug 4492493: Check if Progress Rollup is required on DELETION
2426 CURSOR C_Planned_Effort_Exists(p_element_version_id IN NUMBER) IS
2427     SELECT 'Y'
2428       FROM pa_resource_assignments
2429      WHERE wbs_element_version_id = p_element_version_id
2430        AND total_plan_quantity > 0
2431        AND rownum = 1;
2432 
2433 CURSOR C_Asgmt_Planned_Effort_Exists(p_resource_assignment_id IN NUMBER) IS
2434     SELECT 'Y'
2435       FROM pa_resource_assignments
2436      WHERE resource_assignment_id = p_resource_assignment_id
2437        AND total_plan_quantity > 0;
2438 
2439 CURSOR C_Task_Get_Project_Id(p_elem_version_id IN NUMBER) IS
2440     SELECT project_id
2441       FROM pa_proj_element_versions
2442      WHERE element_version_id = p_elem_version_id;
2443 
2444 CURSOR C_Asgmt_Get_Project_Id(p_resource_assignment_id IN NUMBER) IS
2445     SELECT project_id
2446       FROM pa_resource_assignments
2447      WHERE resource_assignment_id = p_resource_assignment_id;
2448 -- Added for Bug16847708
2449 CURSOR C_getCbsElementId(c_resource_assignment_id IN NUMBER) IS
2450       Select cbs_element_id
2451 	  FROM pa_resource_assignments
2452      WHERE resource_assignment_id = c_resource_assignment_id;
2453 	 l_Cbs_Enabled	  VARCHAR2(1) := 'N';
2454 	 l_cbs_element_id Number;
2455 
2456 -- End of Bug 4492493
2457 
2458 l_task_asgmts_tbl SYSTEM.PA_NUM_TBL_TYPE;
2459 l_struct_ver_id NUMBER;
2460 l_project_id NUMBER;
2461 l_wbs_element_version_id NUMBER;
2462 l_planning_resource_alias VARCHAR2(240);
2463 l_proj_element_id NUMBER;
2464 l_progress_exists VARCHAR2(1);
2465 l_rlm_id NUMBER;
2466 l_structure_version_id NUMBER;
2467 l_return_status VARCHAR2(1);
2468 l_msg_data VARCHAR2(4000);
2469 l_msg_count NUMBER;
2470 l_task_name VARCHAR2(240);
2471 l_task_number VARCHAR2(100);
2472 l_alias VARCHAR2(240);
2473 l_task_id NUMBER;
2474 l_ta_display_flag VARCHAR2(1);
2475 l_unplanned_flag VARCHAR2(1);
2476 l_planned_effort_exists VARCHAR2(1);
2477 l_progress_rollup_required VARCHAR2(1) := 'N';
2478 l_total_plan_quantity NUMBER;
2479 l_edit_task_ok varchar2(1) := 'N'; -- Bug 6856934
2480 
2481 BEGIN
2482 
2483     x_return_status := FND_API.G_RET_STS_SUCCESS;
2484     g_require_progress_rollup := 'N'; -- End of Bug 4492493
2485     L_FuncProc := 'Validate_Delete_Assignment';
2486 
2487 	IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 3) THEN
2488 	    pa_debug.g_err_stage:='Beginning of TA:Validate_Delete_Assignment';
2489 	    pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
2490 	END IF;
2491 
2492     x_delete_task_flag_tbl  := SYSTEM.PA_VARCHAR2_1_TBL_TYPE();
2493     x_delete_asgmt_flag_tbl := SYSTEM.PA_VARCHAR2_1_TBL_TYPE();
2494 
2495     --Bug 4951422
2496     x_task_assmt_ids_tbl := SYSTEM.PA_NUM_TBL_TYPE();
2497 
2498     --Bug 4492493: Check if Progress Rollup is required on CREATION
2499     IF p_context = 'WORKPLAN' and p_task_or_res = 'TASKS' THEN
2500       OPEN C_Task_Get_Project_Id(p_elem_ver_id_tbl(1));
2501       FETCH C_Task_Get_Project_Id INTO l_project_id;
2502       CLOSE C_Task_Get_Project_Id;
2503     ELSE
2504       OPEN C_Asgmt_Get_Project_Id(p_resource_assignment_id_tbl(1));
2505       FETCH C_Asgmt_Get_Project_Id INTO l_project_id;
2506       CLOSE C_Asgmt_Get_Project_Id;
2507     END IF;
2508 
2509     l_progress_rollup_required := Is_Progress_Rollup_Required(l_project_id);
2510     -- End of Bug 4492493
2511 
2512     -- Case 1: Delete Tasks
2513     IF p_context = 'WORKPLAN' AND p_task_or_res = 'TASKS' THEN
2514 
2515         x_delete_task_flag_tbl.extend(p_elem_ver_id_tbl.COUNT);
2516 
2517         FOR i in 1..p_elem_ver_id_tbl.COUNT LOOP
2518 
2519             OPEN C_Element_Info(p_elem_ver_id_tbl(i));
2520             FETCH C_Element_Info
2521             INTO l_project_id, l_structure_version_id, l_proj_element_id, l_task_name, l_task_number;
2522             CLOSE C_Element_Info;
2523 
2524             -- Bug 4492493: Check if Progress Rollup is required on DELETION
2525             IF g_require_progress_rollup = 'N' AND
2526                l_progress_rollup_required = 'Y' THEN
2527 
2528               l_planned_effort_exists := 'N';
2529               OPEN C_Planned_Effort_Exists(p_elem_ver_id_tbl(i));
2530               FETCH C_Planned_Effort_Exists INTO l_planned_effort_exists;
2531               CLOSE C_Planned_Effort_Exists;
2532               IF l_planned_effort_exists = 'Y' THEN
2533                 g_require_progress_rollup := 'Y';
2534               END IF;
2535 
2536             END IF;
2537             -- End of Bug 4492493
2538 
2539             l_progress_exists := 'N';
2540 
2541             -- Bug 4073659
2542             -- Use this new API to check for published progress only and delete progress
2543             l_progress_exists := PA_PROGRESS_UTILS.check_prog_exists_and_delete(
2544 
2545 	                                         l_project_id,
2546                                                  l_proj_element_id,
2547                                                  'PA_TASKS',
2548                                                  l_proj_element_id,
2549                                                  'WORKPLAN');
2550 
2551 
2552             IF l_progress_exists = 'Y' THEN
2553                 x_delete_task_flag_tbl(i) := 'N';
2554                 PA_UTILS.ADD_MESSAGE
2555                 (
2556 				    p_app_short_name => 'PA',
2557                     p_msg_name       => 'PA_DL_TASK_PROG_ERR',
2558                     p_token1         => 'TASK_NAME',
2559                     p_value1         =>  l_task_name,
2560                     p_token2         => 'TASK_NUMBER',
2561                     p_value2         =>  l_task_number,
2562                     p_token3         => 'PL_RES_ALIAS',
2563                     p_value3         =>  l_alias
2564                 );
2565                 x_return_status := FND_API.G_RET_STS_ERROR;
2566 
2567             ELSE
2568 
2569                 x_delete_task_flag_tbl(i) := 'Y';
2570 
2571                 -- use cursor to query up all task assignments in the task version
2572 		--Bug 4951422. Initialize the table before loading it.
2573                 l_task_asgmts_tbl:=SYSTEM.pa_num_tbl_type();
2574 
2575                 OPEN C_Task_Asgmts(p_elem_ver_id_tbl(i));
2576                 FETCH C_Task_Asgmts BULK COLLECT INTO l_task_asgmts_tbl;
2577                 CLOSE C_Task_Asgmts;
2578 
2579                 IF l_task_asgmts_tbl.COUNT > 0 THEN
2580 
2581                     -- LOOP through the l_task_asgmts_tbl and call the following API per assingment
2582                     -- use PA_ASSIGNMENT context
2583                     FOR j IN 1..l_task_asgmts_tbl.COUNT LOOP
2584 
2585 		        --Bug 4951422. Populate x_task_assmt_ids_tbl with the Resource Assignment ids
2586                         --that should be deleted.
2587                         x_task_assmt_ids_tbl.extend;
2588                         x_task_assmt_ids_tbl(x_task_assmt_ids_tbl.COUNT) := l_task_asgmts_tbl(j);
2589 
2590 	              pa_deliverable_pub.delete_dlv_task_asscn_in_bulk
2591 				    (
2592 					p_init_msg_list     => FND_API.G_FALSE,
2593 			                p_calling_context   => 'PA_ASSIGNMENTS',
2594 			                p_task_element_id   => l_task_asgmts_tbl(j),
2595 			                p_task_version_id   => NULL,
2596 			                p_project_id        => l_project_id,
2597 			                x_return_status     => l_return_status,
2598 			                x_msg_count         => l_msg_count,
2599 			                x_msg_data          => l_msg_data
2600 			            );
2601 
2602                      -- Bug 4317547: Should check the return status
2603                      IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
2604                         x_return_status := FND_API.G_RET_STS_ERROR;
2605                      END IF;
2606 
2607 	           END LOOP;
2608 
2609                 END IF;
2610 
2611             END IF;
2612 
2613         END LOOP;
2614 
2615     ELSIF p_task_or_res = 'ASSIGNMENT' THEN
2616 
2617         -- Bug 3888432
2618         -- Case 2: Create subtask and delete sys generated assignment on parent task
2619         IF p_context = 'WORKPLAN' THEN
2620 
2621             x_delete_asgmt_flag_tbl.extend(p_resource_assignment_id_tbl.COUNT);
2622 
2623             FOR i in 1..p_resource_assignment_id_tbl.COUNT LOOP
2624 
2625               -- Bug 4492493: Check if Progress Rollup is required on DELETION
2626               IF g_require_progress_rollup = 'N' AND
2627                  l_progress_rollup_required = 'Y' THEN
2628 
2629                 l_planned_effort_exists := 'N';
2630                 OPEN C_Asgmt_Planned_Effort_Exists(p_resource_assignment_id_tbl(i));
2631                 FETCH C_Asgmt_Planned_Effort_Exists INTO l_planned_effort_exists;
2632                 CLOSE C_Asgmt_Planned_Effort_Exists;
2633                 IF l_planned_effort_exists = 'Y' THEN
2634                   g_require_progress_rollup := 'Y';
2635                 END IF;
2636 
2637               END IF;
2638               -- End of Bug 4492493
2639 
2640                 x_delete_asgmt_flag_tbl(i) := 'Y';
2641             END LOOP;
2642 
2643         -- Case 3: Delete selected task assignments
2644         ELSIF p_context = 'TASK_ASSIGNMENT' THEN
2645 
2646             x_delete_asgmt_flag_tbl.extend(p_resource_assignment_id_tbl.COUNT);
2647 
2648             FOR i in 1..p_resource_assignment_id_tbl.COUNT LOOP
2649 
2650 	            OPEN C_Element_Info2(p_resource_assignment_id_tbl(i));
2651 	            FETCH C_Element_Info2
2652 	            INTO l_wbs_element_version_id, l_project_id, l_proj_element_id, l_rlm_id, l_ta_display_flag, l_task_id, l_unplanned_flag, l_total_plan_quantity;
2653 	            CLOSE C_Element_Info2;
2654 
2655                     -- Bug 4492493: Check if Progress Rollup is required on DELETION
2656                     IF g_require_progress_rollup = 'N' AND
2657                        l_progress_rollup_required = 'Y' AND
2658                        l_total_plan_quantity > 0 THEN
2659 
2660                       g_require_progress_rollup := 'Y';
2661                     END IF;
2662                     -- End of Bug 4492493
2663 
2664                         -- Bug 6856934
2665                         if nvl(p_calling_context,'X') = 'PA_PROJECT_ASSIGNMENT' then
2666                                 l_edit_task_ok := 'Y';
2667                         else
2668 
2669                                 l_edit_task_ok := check_edit_task_ok(P_PROJECT_ID           => l_project_id,
2670                                  P_STRUCTURE_VERSION_ID    => l_struct_ver_id,
2671                                  P_CURR_STRUCT_VERSION_ID  => l_struct_ver_id,
2672                                  P_Element_Id              => NULL,
2673                                  P_Element_Version_Id      => NULL,
2674                                  P_Task_Assignment_Id      => p_resource_assignment_id_tbl(i));
2675                         end if;
2676                         -- Bug 6856934
2677 
2678                     -- Bug 4073659: Allow unplanned assignment to be deleted
2679                     IF l_unplanned_flag = 'Y' OR
2680                        'Y' = l_edit_task_ok then
2681                        /*check_edit_task_ok(P_PROJECT_ID           => l_project_id,
2682                                  P_STRUCTURE_VERSION_ID    => l_struct_ver_id,
2683                                  P_CURR_STRUCT_VERSION_ID  => l_struct_ver_id,
2684                                  P_Element_Id              => NULL,
2685                                  P_Element_Version_Id      => NULL,
2686                                  P_Task_Assignment_Id      => p_resource_assignment_id_tbl(i)) THEN Bug 6856934*/
2687 
2688 
2689 
2690                         -- Bug 4073659
2691                         -- Use this new API to check for published progress only and delete progress
2692 								--Changed for bug 16847708 need to pass cbs element id
2693 						l_Cbs_Enabled := PA_ALTERNATE_TASK_PVT.Is_Cbs_Enabled(p_Project_Id => l_project_id); -- bug#16847708
2694 						l_cbs_element_id :=null;
2695 						if l_Cbs_Enabled='Y' Then
2696 								Open C_getCbsElementId(p_resource_assignment_id_tbl(i));
2697 								fetch C_getCbsElementId into l_cbs_element_id;
2698 								close C_getCbsElementId;
2699 						end if;
2700 
2701                         l_progress_exists := PA_PROGRESS_UTILS.check_prog_exists_and_delete(
2702 	                                         p_project_id=>l_project_id,
2703                                                  p_task_id=>l_proj_element_id,
2704                                                  p_object_type=>'PA_ASSIGNMENTS',
2705                                                 p_object_id=> l_rlm_id,
2706                                                  p_structure_type=>'WORKPLAN',
2707 												 p_cbs_element_id=>l_cbs_element_id);
2708 
2709 	                IF l_progress_exists = 'Y' THEN
2710 	                    x_delete_asgmt_flag_tbl(i) := 'N';
2711 	                    PA_UTILS.ADD_MESSAGE
2712 	                    (
2713 						    p_app_short_name => 'PA',
2714 	                        p_msg_name       => 'PA_DL_TA_PROG_ERR'
2715 	                    );
2716 	                    x_return_status := FND_API.G_RET_STS_ERROR;
2717 	                ELSE
2718 	                    x_delete_asgmt_flag_tbl(i) := 'Y';
2719 	                    pa_deliverable_pub.delete_dlv_task_asscn_in_bulk
2720 	                    (
2721 					p_init_msg_list     => FND_API.G_FALSE,
2722 					p_calling_context   => 'PA_ASSIGNMENTS',
2723 	                 		p_task_element_id   => p_resource_assignment_id_tbl(i),
2724 					p_task_version_id   => l_wbs_element_version_id,
2725 	                  		p_project_id        => l_project_id,
2726 					x_return_status     => l_return_status,
2727 					x_msg_count         => l_msg_count,
2728 					x_msg_data          => l_msg_data
2729 			    );
2730 
2731                             -- Bug 4317547: Should check the return status
2732                             IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
2733                               x_return_status := FND_API.G_RET_STS_ERROR;
2734                             END IF;
2735 
2736 		        END IF;
2737 
2738 				ELSE -- check task edit ok
2739 
2740                                         -- Bug 4533152
2741 					--PA_UTILS.ADD_MESSAGE
2742 					--(
2743 					--    p_app_short_name => 'PA',
2744 					--    p_msg_name       => 'PA_UPDATE_PUB_VER_ERR'
2745 					--);
2746 					x_return_status := FND_API.G_RET_STS_ERROR;
2747 
2748 				END IF; -- check task edit ok
2749 
2750 			END LOOP;
2751 
2752 		END IF; -- ELSIF p_context = 'TASK_ASSIGNMENT' THEN
2753 
2754 	END IF;
2755 
2756 	IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 3) THEN
2757 		pa_debug.g_err_stage:='End of TA:Validate_Delete_Assignment';
2758 		pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
2759 	END IF;
2760 
2761 EXCEPTION
2762 
2763     WHEN FND_API.G_EXC_ERROR THEN
2764         x_return_status := FND_API.G_RET_STS_ERROR;
2765         IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 5) THEN
2766             PA_DEBUG.write_log (x_module => L_Module,
2767                                 x_msg         => 'Error:' || L_FuncProc || SQLERRM,
2768                                 x_log_level   => 5);
2769         END IF;
2770 
2771 	WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
2772 	    x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2773 	    IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 6) THEN
2774             PA_DEBUG.write_log (x_module => L_Module,
2775                                 x_msg         => 'Unexpected Error:' || L_FuncProc || SQLERRM,
2776                                 x_log_level   => 6);
2777         END IF;
2778         RAISE;
2779 
2780     WHEN OTHERS THEN
2781         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2782         IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 6) THEN
2783             PA_DEBUG.write_log (x_module => L_Module,
2784                                 x_msg         =>'Unexpected Error:' || L_FuncProc || SQLERRM,
2785                                 x_log_level   => 6);
2786         END IF;
2787         FND_MSG_PUB.add_exc_msg( p_pkg_name       => L_Module,
2788                                  p_procedure_name => L_FuncProc);
2789         RAISE;
2790 
2791 END Validate_Delete_Assignment;
2792 
2793 
2794 
2795 
2796 
2797 -- This procedure will Validate the Copying of Planning Transaction
2798 -- and return Assignments that can be copied.
2799 
2800 PROCEDURE Validate_Copy_Assignment
2801 (
2802     p_src_project_id         IN NUMBER,
2803     p_target_project_id      IN NUMBER,
2804     p_src_elem_ver_id_tbl    IN SYSTEM.PA_NUM_TBL_TYPE,
2805     p_targ_elem_ver_id_tbl   IN SYSTEM.PA_NUM_TBL_TYPE,
2806     p_copy_people_flag       IN VARCHAR2,
2807     p_copy_equip_flag        IN VARCHAR2,
2808     p_copy_mat_item_flag     IN VARCHAR2,
2809     p_copy_fin_elem_flag     IN VARCHAR2,
2810     p_copy_external_flag     IN VARCHAR2   DEFAULT 'N',
2811     x_resource_rec_tbl       OUT NOCOPY l_resource_rec_tbl_type,
2812     x_calculate_flag         OUT NOCOPY VARCHAR2,
2813 	x_rbs_diff_flag          OUT NOCOPY VARCHAR2,
2814     x_return_status          OUT NOCOPY VARCHAR2
2815 )
2816 
2817 IS
2818 
2819 -- Declare a dynamic cursor and variables:
2820 l_index NUMBER := 1;
2821 L_FuncProc varchar2(250) ;
2822 l_res_class1 varchar2(500);
2823 l_res_class2 varchar2(500);
2824 l_res_class3 varchar2(500);
2825 l_res_class4 varchar2(500);
2826 l_res_class5 varchar2(500);
2827 
2828 l_ta_structure_version_tbl SYSTEM.pa_num_tbl_type := SYSTEM.pa_num_tbl_type();
2829 l_ta_resource_assgt_tbl SYSTEM.pa_num_tbl_type   := SYSTEM.pa_num_tbl_type();
2830 l_ta_project_assgt_tbl  SYSTEM.pa_num_tbl_type   := SYSTEM.pa_num_tbl_type();
2831 -- Bug 4097749.
2832 l_ta_named_role_tbl     SYSTEM.pa_varchar2_80_tbl_type := SYSTEM.pa_varchar2_80_tbl_type();
2833 l_ta_role_in_format_flag_tbl   SYSTEM.pa_varchar2_1_tbl_type := SYSTEM.pa_varchar2_1_tbl_type();
2834 -- \Bug 4097749.
2835 l_ta_wbs_elem_ver_tbl   SYSTEM.pa_num_tbl_type   := SYSTEM.pa_num_tbl_type();
2836 l_ta_schedule_start_tbl SYSTEM.pa_date_tbl_type  := SYSTEM.pa_date_tbl_type();
2837 l_ta_schedule_end_tbl   SYSTEM.pa_date_tbl_type  := SYSTEM.pa_date_tbl_type();
2838 l_ta_planning_start_tbl SYSTEM.pa_date_tbl_type  := SYSTEM.pa_date_tbl_type();
2839 l_ta_planning_end_tbl   SYSTEM.pa_date_tbl_type  := SYSTEM.pa_date_tbl_type();
2840 l_ta_res_mem_id_tbl     SYSTEM.pa_num_tbl_type   := SYSTEM.pa_num_tbl_type();
2841 l_ta_display_flag_tbl   SYSTEM.pa_varchar2_1_tbl_type := SYSTEM.pa_varchar2_1_tbl_type();
2842 l_t_src_start_tbl      SYSTEM.pa_date_tbl_type  := SYSTEM.pa_date_tbl_type();
2843 l_t_src_end_tbl        SYSTEM.pa_date_tbl_type  := SYSTEM.pa_date_tbl_type();
2844 l_t_target_start_tbl   SYSTEM.pa_date_tbl_type  := SYSTEM.pa_date_tbl_type();
2845 l_t_target_end_tbl     SYSTEM.pa_date_tbl_type  := SYSTEM.pa_date_tbl_type();
2846 l_c_resource_assgt_tbl SYSTEM.pa_num_tbl_type   := SYSTEM.pa_num_tbl_type();
2847 l_c_schedule_start_tbl SYSTEM.pa_date_tbl_type  := SYSTEM.pa_date_tbl_type();
2848 l_c_schedule_end_tbl   SYSTEM.pa_date_tbl_type  := SYSTEM.pa_date_tbl_type();
2849 l_c_planning_start_tbl SYSTEM.pa_date_tbl_type  := SYSTEM.pa_date_tbl_type();
2850 l_c_planning_end_tbl   SYSTEM.pa_date_tbl_type  := SYSTEM.pa_date_tbl_type();
2851 l_c_res_mem_id_tbl     SYSTEM.pa_num_tbl_type   := SYSTEM.pa_num_tbl_type();
2852 l_src_res_mem_id_tbl   SYSTEM.pa_num_tbl_type   := SYSTEM.pa_num_tbl_type();
2853 
2854 l_src_resource_list_id NUMBER;
2855 l_target_resource_list_id NUMBER;
2856 l_published VARCHAR2(1);
2857 l_ta_structure_version_id NUMBER;
2858 l_t_target_start_date DATE;
2859 l_t_target_end_date DATE;
2860 l_t_src_start_date DATE;
2861 l_t_src_end_date DATE;
2862 l_ta_resource_assgt_id NUMBER;
2863 l_ta_project_assgt_id NUMBER;
2864 l_ta_wbs_elem_ver_id NUMBER;
2865 l_ta_planning_start_date DATE;
2866 l_ta_planning_end_date DATE;
2867 l_ta_schedule_start_date DATE;
2868 l_ta_schedule_end_date DATE;
2869 l_ta_display_flag VARCHAR2(1);
2870 l_ta_res_mem_id NUMBER;
2871 l_accum_people_qty NUMBER;
2872 l_accum_equip_qty NUMBER;
2873 l_accum_mat_item_cost NUMBER;
2874 l_accum_fin_elem_cost NUMBER;
2875 l_people_class_index NUMBER := -999;
2876 l_equip_class_index NUMBER := -999;
2877 l_mat_item_class_index NUMBER := -999;
2878 l_fin_elem_class_index NUMBER := -999;
2879 l_ta_res_type_code  pa_resource_assignments.res_type_code%TYPE;
2880 l_ta_resource_class_code pa_resource_assignments.resource_class_code%TYPE;
2881 l_ta_resource_class_flag pa_resource_assignments.resource_class_flag%TYPE;
2882 l_ta_total_plan_quantity pa_resource_assignments.total_plan_quantity%TYPE;
2883 l_ta_total_plan_raw_cost pa_resource_assignments.total_plan_raw_cost%TYPE;
2884 l_ta_total_proj_raw_cost pa_resource_assignments.total_project_raw_cost%TYPE;
2885 l_ta_rate_based_flag pa_resource_assignments.rate_based_flag%TYPE;
2886 l_ta_tar_res_mem_id_tbl SYSTEM.pa_num_tbl_type   := SYSTEM.pa_num_tbl_type();
2887 l_ta_budget_version_id pa_resource_assignments.budget_version_id%TYPE;
2888 l_class_rlm_id pa_resource_list_members.resource_list_member_id%TYPE;
2889 l_ta_tr_res_list_member_id pa_project_assignments.resource_list_member_id%TYPE;
2890 l_ta_task_id pa_resource_assignments.task_id%TYPE;
2891 l_ta_res_type_code_tbl  SYSTEM.pa_varchar2_30_tbl_type   := SYSTEM.pa_varchar2_30_tbl_type();
2892 l_ta_resource_class_code_tbl SYSTEM.pa_varchar2_30_tbl_type   := SYSTEM.pa_varchar2_30_tbl_type();
2893 l_ta_resource_class_flag_tbl SYSTEM.pa_varchar2_1_tbl_type   := SYSTEM.pa_varchar2_1_tbl_type();
2894 l_ta_total_plan_quantity_tbl SYSTEM.pa_num_tbl_type   := SYSTEM.pa_num_tbl_type();
2895 l_ta_total_plan_raw_cost_tbl SYSTEM.pa_num_tbl_type   := SYSTEM.pa_num_tbl_type();
2896 l_ta_total_proj_raw_cost_tbl SYSTEM.pa_num_tbl_type   := SYSTEM.pa_num_tbl_type();
2897 l_ta_rate_based_flag_tbl SYSTEM.pa_varchar2_1_tbl_type   := SYSTEM.pa_varchar2_1_tbl_type();
2898 l_ta_budget_version_id_tbl SYSTEM.pa_num_tbl_type   := SYSTEM.pa_num_tbl_type();
2899 l_previous_elem_version_id NUMBER;
2900 l_add_elem_version_id_tbl SYSTEM.pa_num_tbl_type   := SYSTEM.pa_num_tbl_type();
2901 l_add_res_list_member_id_tbl SYSTEM.pa_num_tbl_type   := SYSTEM.pa_num_tbl_type();
2902 l_add_qty_tbl SYSTEM.pa_num_tbl_type   := SYSTEM.pa_num_tbl_type();
2903 l_add_raw_cost_tbl SYSTEM.pa_num_tbl_type   := SYSTEM.pa_num_tbl_type();
2904 l_ta_tr_res_list_member_id_tbl SYSTEM.pa_num_tbl_type   := SYSTEM.pa_num_tbl_type();
2905 l_add_projfunc_cur_code_tbl SYSTEM.pa_varchar2_15_tbl_type   := SYSTEM.pa_varchar2_15_tbl_type();
2906 l_ta_task_id_tbl SYSTEM.pa_num_tbl_type := SYSTEM.pa_num_tbl_type();
2907 l_target_budget_version_id pa_resource_assignments.budget_version_id%TYPE;
2908 l_target_structure_version_id pa_budget_versions.project_structure_version_id%TYPE;
2909 l_target_workplan_costs_flag pa_proj_fp_options.track_workplan_costs_flag%TYPE;
2910 l_source_workplan_costs_flag pa_proj_fp_options.track_workplan_costs_flag%TYPE;
2911 l_source_cost_time_phased_code pa_proj_fp_options.cost_time_phased_code%TYPE;
2912 l_target_cost_time_phased_code pa_proj_fp_options.cost_time_phased_code%TYPE;
2913 
2914 l_element_version_index NUMBER;
2915 -- NEW plsql table to hold the ordered src date
2916 l_adj_src_t_start_tbl SYSTEM.pa_date_tbl_type  := SYSTEM.pa_date_tbl_type();
2917 l_adj_src_t_end_tbl SYSTEM.pa_date_tbl_type  := SYSTEM.pa_date_tbl_type();
2918 l_adj_tar_t_start_tbl SYSTEM.pa_date_tbl_type  := SYSTEM.pa_date_tbl_type();
2919 l_adj_tar_t_end_tbl SYSTEM.pa_date_tbl_type  := SYSTEM.pa_date_tbl_type();
2920 l_t_src_elem_ver_id NUMBER;
2921 l_t_src_elem_ver_id_tbl SYSTEM.pa_num_tbl_type   := SYSTEM.pa_num_tbl_type();
2922 l_t_target_elem_ver_id NUMBER;
2923 l_t_target_elem_ver_id_tbl SYSTEM.pa_num_tbl_type   := SYSTEM.pa_num_tbl_type();
2924 -- Variables for the Currency Conversion API
2925 l_api_version NUMBER;
2926 l_init_msg_list VARCHAR2(32767);
2927 l_commit VARCHAR2(32767);
2928 l_validate_only VARCHAR2(32767);
2929 l_validation_level NUMBER;
2930 l_calling_module VARCHAR2(32767);
2931 l_debug_mode VARCHAR2(32767);
2932 l_max_msg_count NUMBER;
2933 l_txn_curr_code VARCHAR2(32767);
2934 l_structure_version_id NUMBER;
2935 l_project_curr_code VARCHAR2(32767);
2936 l_project_rate_type VARCHAR2(32767);
2937 l_project_rate_date DATE;
2938 l_project_exch_rate NUMBER;
2939 l_project_raw_cost NUMBER;
2940 l_projfunc_curr_code VARCHAR2(32767);
2941 l_projfunc_cost_rate_type VARCHAR2(32767);
2942 l_projfunc_cost_rate_date DATE;
2943 l_projfunc_cost_exch_rate NUMBER;
2944 l_projfunc_raw_cost NUMBER;
2945 l_txn_mat_item_cost NUMBER;
2946 l_txn_fin_elem_cost NUMBER;
2947 l_src_project_curr_code VARCHAR2(15);
2948 l_src_projfunc_curr_code VARCHAR2(15);
2949 l_tar_projfunc_cur_code VARCHAR2(15);
2950 l_tar_proj_cur_code VARCHAR2(15);
2951 
2952 CURSOR get_target_project_info (p_target_element_version_id IN NUMBER) IS
2953 	select pev.parent_structure_version_id structure_version_id, bv.budget_version_id, fpo.track_workplan_costs_flag
2954 	from pa_proj_element_versions pev, pa_budget_versions bv, pa_proj_fp_options fpo
2955 	where bv.project_structure_version_id = pev.parent_structure_version_id
2956 	and bv.project_id = fpo.project_id
2957 	and bv.fin_plan_type_id = fpo.fin_plan_type_id
2958 	and bv.budget_version_id = fpo.fin_plan_version_id
2959 	and fpo.fin_plan_option_level_code = 'PLAN_VERSION'
2960 	and bv.wp_version_flag = 'Y'
2961 	and pev.element_version_id = p_target_element_version_id;
2962 
2963 -- Bug 3951947 get the PC and PFC of the project
2964 CURSOR get_proj_currency_code (c_project_id IN NUMBER) IS
2965 	select projfunc_currency_code, project_currency_code
2966 	from pa_projects_all
2967 	where project_id = c_project_id;
2968 
2969 CURSOR get_txn_currency_code (p_resource_assignment_id NUMBER) IS
2970 	select txn_currency_code
2971 	from pa_budget_lines
2972 	where resource_assignment_id = p_resource_assignment_id
2973 	and rownum = 1;
2974 
2975 l_add_cnt NUMBER := 0;
2976 l_msg_count NUMBER;
2977 l_msg_data VARCHAR2(4000);
2978 
2979 -- IMPORTANT
2980 -- These 2 cursors HAVE to be ordered by wbs_element_version_id.
2981 CURSOR c_get_asgmts_for_copy(p_res_class1 VARCHAR2, p_res_class2 VARCHAR2, p_res_class3 VARCHAR2, p_res_class4 VARCHAR2) IS
2982 	SELECT * FROM
2983 	(
2984 		SELECT
2985 		ra.resource_assignment_id,
2986 		ra.project_assignment_id,
2987 		ra.named_role,
2988 		rf.role_enabled_flag,
2989 		ra.wbs_element_version_id,
2990 		ra.planning_start_date,
2991 		ra.planning_end_date,
2992 		ra.schedule_start_date,
2993 		ra.schedule_end_date,
2994 		ra.ta_display_flag,
2995 		ra.resource_list_member_id res_mem_list_id,
2996 		pev.parent_structure_version_id,
2997 		ra.res_type_code,
2998 		ra.resource_class_code,
2999 		ra.resource_class_flag,
3000 		sum(bl.quantity),
3001 		sum(bl.txn_raw_cost),
3002 		-- Bug 3951947: Should sum up raw cost in projfunc currency
3003 		sum(bl.raw_cost),
3004 		ra.rate_based_flag,
3005 		ra.budget_version_id,
3006 		asgn.resource_list_member_id tr_res_mem_list_id,
3007 		ra.task_id,
3008 		'RES_ASSIGNMENT',
3009 		ra.person_id,
3010 		ra.job_id,
3011 		ra.organization_id,
3012 		ra.supplier_id,
3013 		ra.expenditure_type,
3014 		ra.event_type,
3015 		ra.expenditure_category,
3016 		ra.revenue_category_code,
3017 		ra.project_role_id,
3018 		ra.item_category_id,
3019 		ra.person_type_code,
3020 		ra.bom_resource_id,
3021 		ra.non_labor_resource,
3022 		ra.inventory_item_id
3023 		FROM
3024 		pa_copy_asgmts_temp temp,
3025 		pa_proj_element_versions pev,
3026 		pa_resource_assignments ra,
3027 		pa_project_assignments asgn,
3028 		pa_budget_lines bl,
3029 		pa_resource_list_members rlm,
3030 		pa_res_formats_b rf
3031 		WHERE
3032 		pev.element_version_id = temp.src_elem_ver_id AND
3033 		pev.element_version_id = ra.wbs_element_version_id AND
3034 		bl.resource_assignment_id = ra.resource_assignment_id AND
3035 		ra.ta_display_flag IS NOT NULL AND
3036 		(ra.unplanned_flag = 'N' OR ra.unplanned_flag IS NULL) AND
3037 		decode(ra.project_assignment_id, -1, null, ra.project_assignment_id) = asgn.assignment_id(+) AND
3038 		ra.resource_class_code IN ( p_res_class1 , p_res_class2 , p_res_class3, p_res_class4 ) AND
3039 		rlm.resource_list_member_id = ra.resource_list_member_id AND
3040 		rf.res_format_id = rlm.res_format_id
3041 		GROUP BY
3042 		ra.resource_assignment_id,
3043 		ra.project_assignment_id,
3044 		ra.named_role,
3045 		rf.role_enabled_flag,
3046 		ra.wbs_element_version_id,
3047 		ra.planning_start_date,
3048 		ra.planning_end_date,
3049 		ra.schedule_start_date,
3050 		ra.schedule_end_date,
3051 		ra.ta_display_flag,
3052 		ra.resource_list_member_id,
3053 		pev.parent_structure_version_id,
3054 		ra.res_type_code,
3055 		ra.resource_class_code,
3056 		ra.resource_class_flag,
3057 		ra.rate_based_flag,
3058 		ra.budget_version_id,
3059 		asgn.resource_list_member_id,
3060 		ra.task_id,
3061 		ra.person_id,
3062 		ra.job_id,
3063 		ra.organization_id,
3064 		ra.supplier_id,
3065 		ra.expenditure_type,
3066 		ra.event_type,
3067 		ra.expenditure_category,
3068 		ra.revenue_category_code,
3069 		ra.project_role_id,
3070 		ra.item_category_id,
3071 		ra.person_type_code,
3072 		ra.bom_resource_id,
3073 		ra.non_labor_resource,
3074 		ra.inventory_item_id
3075 
3076 		UNION ALL
3077 
3078 		SELECT
3079 		ra.resource_assignment_id,
3080 		ra.project_assignment_id,
3081 		ra.named_role,
3082 		rf.role_enabled_flag,
3083 		ra.wbs_element_version_id,
3084 		ra.planning_start_date,
3085 		ra.planning_end_date,
3086 		ra.schedule_start_date,
3087 		ra.schedule_end_date,
3088 		ra.ta_display_flag,
3089 		ra.resource_list_member_id res_mem_list_id,
3090 		pev.parent_structure_version_id,
3091 		ra.res_type_code,
3092 		ra.resource_class_code,
3093 		ra.resource_class_flag,
3094 		to_number(NULL),
3095 		to_number(NULL),
3096 		to_number(NULL),
3097 		ra.rate_based_flag,
3098 		ra.budget_version_id,
3099 		asgn.resource_list_member_id tr_res_mem_list_id,
3100 		ra.task_id,
3101 		'RES_ASSIGNMENT',
3102 		ra.person_id,
3103 		ra.job_id,
3104 		ra.organization_id,
3105 		ra.supplier_id,
3106 		ra.expenditure_type,
3107 		ra.event_type,
3108 		ra.expenditure_category,
3109 		ra.revenue_category_code,
3110 		ra.project_role_id,
3111 		ra.item_category_id,
3112 		ra.person_type_code,
3113 		ra.bom_resource_id,
3114 		ra.non_labor_resource,
3115 		ra.inventory_item_id
3116 		FROM
3117 		pa_copy_asgmts_temp temp,
3118 		pa_proj_element_versions pev,
3119 		pa_resource_assignments ra,
3120 		pa_project_assignments asgn,
3121 		pa_resource_list_members rlm,
3122 		pa_res_formats_b rf
3123 		WHERE
3124 		pev.element_version_id = temp.src_elem_ver_id AND
3125 		pev.element_version_id = ra.wbs_element_version_id AND
3126 		ra.ta_display_flag IS NOT NULL AND
3127 		(ra.unplanned_flag = 'N' OR ra.unplanned_flag IS NULL) AND
3128 		decode(ra.project_assignment_id, -1, NULL, ra.project_assignment_id) = asgn.assignment_id(+) AND
3129 		ra.resource_class_code IN ( p_res_class1 , p_res_class2 , p_res_class3, p_res_class4 ) AND
3130 		rlm.resource_list_member_id = ra.resource_list_member_id AND
3131 		rf.res_format_id = rlm.res_format_id AND
3132 		NOT EXISTS
3133 		(SELECT 1 FROM pa_budget_lines bl WHERE bl.resource_assignment_id = ra.resource_assignment_id)
3134 	) ORDER BY 5;
3135 
3136 CURSOR c_get_asgmts_for_copy_proj(p_res_class1 VARCHAR2, p_res_class2 VARCHAR2, p_res_class3 VARCHAR2, p_res_class4 VARCHAR2) IS
3137 	SELECT * FROM
3138 	(
3139 		SELECT
3140 		ra.resource_assignment_id,
3141 		ra.project_assignment_id,
3142 		ra.named_role,
3143 		rf.role_enabled_flag,
3144 		ra.wbs_element_version_id,
3145 		ra.planning_start_date,
3146 		ra.planning_end_date,
3147 		ra.schedule_start_date,
3148 		ra.schedule_end_date,
3149 		ra.ta_display_flag,
3150 		source_rlm.resource_list_member_id src_res_mem_list_id,
3151 		target_rlm.resource_list_member_id tar_res_mem_list_id,
3152 		pev.parent_structure_version_id,
3153 		ra.res_type_code,
3154 		ra.resource_class_code,
3155 		ra.resource_class_flag,
3156 		sum(bl.quantity),
3157 		sum(bl.txn_raw_cost),
3158 		-- Bug 3951947: Should sum up raw cost in projfunc currency
3159 		sum(bl.raw_cost),
3160 		ra.rate_based_flag,
3161 		ra.budget_version_id,
3162 		asgn.resource_list_member_id tr_res_mem_list_id,
3163 		ra.task_id,
3164 		'RES_ASSIGNMENT',
3165 		ra.person_id,
3166 		ra.job_id,
3167 		ra.organization_id,
3168 		ra.supplier_id,
3169 		ra.expenditure_type,
3170 		ra.event_type,
3171 		ra.expenditure_category,
3172 		ra.revenue_category_code,
3173 		ra.project_role_id,
3174 		ra.item_category_id,
3175 		ra.person_type_code,
3176 		ra.bom_resource_id,
3177 		ra.non_labor_resource,
3178 		ra.inventory_item_id
3179 		FROM
3180 		pa_copy_asgmts_temp temp,
3181 		pa_proj_element_versions pev,
3182 		pa_resource_assignments ra,
3183 		pa_project_assignments asgn,
3184 		pa_budget_lines bl,
3185 		pa_resource_list_members source_rlm,
3186 		pa_resource_list_members target_rlm,
3187 		pa_res_formats_b rf
3188 		WHERE
3189 		pev.element_version_id = temp.src_elem_ver_id AND
3190 		pev.element_version_id = ra.wbs_element_version_id AND
3191 		bl.resource_assignment_id = ra.resource_assignment_id AND
3192 		ra.ta_display_flag IS NOT NULL AND
3193 		(ra.unplanned_flag = 'N' OR ra.unplanned_flag IS NULL) AND
3194 		decode(ra.project_assignment_id, -1, null, ra.project_assignment_id) = asgn.assignment_id(+) AND
3195 		ra.resource_class_code IN ( p_res_class1 , p_res_class2 , p_res_class3, p_res_class4 ) AND
3196 		source_rlm.resource_list_member_id = ra.resource_list_member_id AND
3197 		target_rlm.resource_list_id  = source_rlm.resource_list_id AND
3198 		target_rlm.alias  = source_rlm.alias AND
3199 		target_rlm.object_type = source_rlm.object_type AND
3200 		target_rlm.object_id = p_target_project_id AND
3201 		rf.res_format_id = target_rlm.res_format_id
3202 		GROUP BY
3203 		ra.resource_assignment_id,
3204 		ra.project_assignment_id,
3205 		ra.named_role,
3206 		rf.role_enabled_flag,
3207 		ra.wbs_element_version_id,
3208 		ra.planning_start_date,
3209 		ra.planning_end_date,
3210 		ra.schedule_start_date,
3211 		ra.schedule_end_date,
3212 		ra.ta_display_flag,
3213 		source_rlm.resource_list_member_id,
3214 		target_rlm.resource_list_member_id,
3215 		pev.parent_structure_version_id,
3216 		ra.res_type_code,
3217 		ra.resource_class_code,
3218 		ra.resource_class_flag,
3219 		ra.rate_based_flag,
3220 		ra.budget_version_id,
3221 		asgn.resource_list_member_id,
3222 		ra.task_id,
3223 		ra.person_id,
3224 		ra.job_id,
3225 		ra.organization_id,
3226 		ra.supplier_id,
3227 		ra.expenditure_type,
3228 		ra.event_type,
3229 		ra.expenditure_category,
3230 		ra.revenue_category_code,
3231 		ra.project_role_id,
3232 		ra.item_category_id,
3233 		ra.person_type_code,
3234 		ra.bom_resource_id,
3235 		ra.non_labor_resource,
3236 		ra.inventory_item_id
3237 
3238 		UNION ALL
3239 
3240 		SELECT
3241 		ra.resource_assignment_id,
3242 		ra.project_assignment_id,
3243 		ra.named_role,
3244 		rf.role_enabled_flag,
3245 		ra.wbs_element_version_id,
3246 		ra.planning_start_date,
3247 		ra.planning_end_date,
3248 		ra.schedule_start_date,
3249 		ra.schedule_end_date,
3250 		ra.ta_display_flag,
3251 		source_rlm.resource_list_member_id src_res_mem_list_id,
3252 		target_rlm.resource_list_member_id tar_res_mem_list_id,
3253 		pev.parent_structure_version_id,
3254 		ra.res_type_code,
3255 		ra.resource_class_code,
3256 		ra.resource_class_flag,
3257 		to_number(NULL),
3258 		to_number(NULL),
3259 		to_number(NULL),
3260 		ra.rate_based_flag,
3261 		ra.budget_version_id,
3262 		asgn.resource_list_member_id tr_res_mem_list_id,
3263 		ra.task_id,
3264 		'RES_ASSIGNMENT',
3265 		ra.person_id,
3266 		ra.job_id,
3267 		ra.organization_id,
3268 		ra.supplier_id,
3269 		ra.expenditure_type,
3270 		ra.event_type,
3271 		ra.expenditure_category,
3272 		ra.revenue_category_code,
3273 		ra.project_role_id,
3274 		ra.item_category_id,
3275 		ra.person_type_code,
3276 		ra.bom_resource_id,
3277 		ra.non_labor_resource,
3278 		ra.inventory_item_id
3279 		FROM
3280 		pa_copy_asgmts_temp temp,
3281 		pa_proj_element_versions pev,
3282 		pa_resource_assignments ra,
3283 		pa_project_assignments asgn,
3284 		pa_resource_list_members source_rlm,
3285 		pa_resource_list_members target_rlm,
3286 		pa_res_formats_b rf
3287 		WHERE
3288 		pev.element_version_id = temp.src_elem_ver_id AND
3289 		pev.element_version_id = ra.wbs_element_version_id AND
3290 		ra.ta_display_flag IS NOT NULL AND
3291 		(ra.unplanned_flag = 'N' OR ra.unplanned_flag IS NULL) AND
3292 		source_rlm.resource_list_member_id = ra.resource_list_member_id AND
3293 		target_rlm.resource_list_id  = source_rlm.resource_list_id AND
3294 		target_rlm.alias  = source_rlm.alias AND
3295 		target_rlm.object_type = source_rlm.object_type AND
3296 		target_rlm.object_id =  p_target_project_id AND
3297 		decode(ra.project_assignment_id, -1, NULL, ra.project_assignment_id) = asgn.assignment_id(+) AND
3298 		ra.resource_class_code IN ( p_res_class1 , p_res_class2 , p_res_class3, p_res_class4 ) AND
3299 		rf.res_format_id = target_rlm.res_format_id AND
3300 		NOT EXISTS
3301 		(SELECT 1 FROM pa_budget_lines bl WHERE bl.resource_assignment_id = ra.resource_assignment_id)
3302 	) ORDER BY 5;
3303 
3304 
3305 l_num_of_tasks NUMBER;
3306 l_db_block_size NUMBER;
3307 l_num_blocks NUMBER;
3308 
3309 CURSOR c_get_src_sched_dates IS
3310 	SELECT pev.element_version_id, pevs.scheduled_start_date, pevs.scheduled_finish_date
3311 	FROM pa_copy_asgmts_temp temp, pa_proj_element_versions pev, pa_proj_elem_ver_schedule pevs
3312 	WHERE pev.element_version_id = pevs.element_version_id
3313 	AND pev.element_version_id = temp.src_elem_ver_id;
3314 
3315 CURSOR c_get_targ_sched_dates IS
3316 	SELECT pev.element_version_id, pevs.scheduled_start_date, pevs.scheduled_finish_date
3317 	FROM pa_copy_asgmts_temp temp, pa_proj_element_versions pev, pa_proj_elem_ver_schedule pevs
3318 	WHERE pev.element_version_id = pevs.element_version_id
3319 	AND pev.element_version_id = temp.targ_elem_ver_id;
3320 
3321 CURSOR get_rl_proj_specific_flag(c_resource_list_id NUMBER) IS
3322 	SELECT decode(rlab.control_flag, 'Y', 'N', 'Y'), rl.uncategorized_flag
3323 	FROM pa_resource_lists_all_bg rlab, pa_resource_lists rl
3324 	WHERE rlab.resource_list_id = c_resource_list_id
3325         AND rlab.resource_list_id = rl.resource_list_id;
3326 
3327 l_rl_proj_specific_flag VARCHAR2(1);
3328 l_tar_rl_none_flag VARCHAR2(1) := null;
3329 
3330 -- Bug 3974569.
3331 CURSOR c_get_bv_and_rbs_id(c_evid NUMBER) IS
3332 	SELECT bv.budget_version_id, pfo.rbs_version_id
3333 	FROM pa_proj_element_versions pev, pa_budget_versions bv, pa_proj_fp_options pfo
3334 	WHERE pev.element_version_id = c_evid
3335 	AND bv.project_structure_version_id = pev.parent_structure_version_id
3336 	AND pfo.fin_plan_version_id = bv.budget_version_id;
3337 
3338 CURSOR get_multi_cur_flag(c_project_id NUMBER) IS
3339 select nvl(PLAN_IN_MULTI_CURR_FLAG, 'N'), nvl(track_workplan_costs_flag, 'N'), nvl(cost_time_phased_code, 'N')
3340 from   pa_proj_fp_options
3341 where fin_plan_type_id = (select fin_plan_type_id
3342                           from pa_fin_plan_types_b
3343 			  where use_for_workplan_flag = 'Y')
3344 and project_id = c_project_id
3345 and fin_plan_option_level_code = 'PLAN_TYPE';
3346 
3347 
3348 l_src_bvid NUMBER;
3349 l_tar_bvid NUMBER;
3350 l_src_rbs_ver_id NUMBER;
3351 l_tar_rbs_ver_id NUMBER;
3352 l_src_multi_cur_flag VARCHAR2(1);
3353 l_tar_multi_cur_flag VARCHAR2(1);
3354 l_copy_res_mem_id_tbl  SYSTEM.PA_NUM_TBL_TYPE         := SYSTEM.PA_NUM_TBL_TYPE();
3355 
3356 l_txn_source_type_code_tbl  SYSTEM.PA_VARCHAR2_30_TBL_TYPE := SYSTEM.PA_VARCHAR2_30_TBL_TYPE();
3357 l_person_id_tbl             SYSTEM.PA_NUM_TBL_TYPE         := SYSTEM.PA_NUM_TBL_TYPE();
3358 l_job_id_tbl                SYSTEM.PA_NUM_TBL_TYPE         := SYSTEM.PA_NUM_TBL_TYPE();
3359 l_organization_id_tbl       SYSTEM.PA_NUM_TBL_TYPE         := SYSTEM.PA_NUM_TBL_TYPE();
3360 l_supplier_id_tbl           SYSTEM.PA_NUM_TBL_TYPE         := SYSTEM.PA_NUM_TBL_TYPE();
3361 l_expenditure_type_tbl      SYSTEM.PA_VARCHAR2_30_TBL_TYPE := SYSTEM.PA_VARCHAR2_30_TBL_TYPE();
3362 l_event_type_tbl            SYSTEM.PA_VARCHAR2_30_TBL_TYPE := SYSTEM.PA_VARCHAR2_30_TBL_TYPE();
3363 l_expenditure_category_tbl  SYSTEM.PA_VARCHAR2_30_TBL_TYPE := SYSTEM.PA_VARCHAR2_30_TBL_TYPE();
3364 l_revenue_category_code_tbl SYSTEM.PA_VARCHAR2_30_TBL_TYPE := SYSTEM.PA_VARCHAR2_30_TBL_TYPE();
3365 l_project_role_id_tbl       SYSTEM.PA_NUM_TBL_TYPE         := SYSTEM.PA_NUM_TBL_TYPE();
3366 l_item_category_id_tbl      SYSTEM.PA_NUM_TBL_TYPE         := SYSTEM.PA_NUM_TBL_TYPE();
3367 l_person_type_code_tbl      SYSTEM.PA_VARCHAR2_30_TBL_TYPE := SYSTEM.PA_VARCHAR2_30_TBL_TYPE();
3368 l_bom_resource_id_tbl       SYSTEM.PA_NUM_TBL_TYPE         := SYSTEM.PA_NUM_TBL_TYPE();
3369 l_non_labor_resource_tbl    SYSTEM.PA_VARCHAR2_20_TBL_TYPE := SYSTEM.PA_VARCHAR2_20_TBL_TYPE();
3370 l_inventory_item_id_tbl     SYSTEM.PA_NUM_TBL_TYPE         := SYSTEM.PA_NUM_TBL_TYPE();
3371 
3372 l_txn_source_id_tab         SYSTEM.PA_NUM_TBL_TYPE         := SYSTEM.PA_NUM_TBL_TYPE();
3373 l_res_list_member_id_tab    SYSTEM.PA_NUM_TBL_TYPE         := SYSTEM.PA_NUM_TBL_TYPE();
3374 l_rbs_element_id_tab        SYSTEM.PA_NUM_TBL_TYPE         := SYSTEM.PA_NUM_TBL_TYPE();
3375 l_txn_accum_header_id_tab   SYSTEM.PA_NUM_TBL_TYPE         := SYSTEM.PA_NUM_TBL_TYPE();
3376 -- \Bug 3974569.
3377 l_progress_rollup_required  VARCHAR2(1) := 'N';
3378 
3379 BEGIN
3380 
3381 	x_return_status := FND_API.G_RET_STS_SUCCESS;
3382         g_require_progress_rollup := 'N'; -- End of Bug 4492493
3383 	L_FuncProc := 'Validate_Copy_Assignment';
3384 	x_calculate_flag := 'N';
3385 	x_rbs_diff_flag := 'N';
3386 
3387 	IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 3) THEN
3388 		PA_DEBUG.write(x_module => L_Module, x_msg => 'p_src_project_id: ' || p_src_project_id, x_log_level => 3);
3389 		PA_DEBUG.write(x_module => L_Module, x_msg => 'p_target_project_id: ' || p_target_project_id, x_log_level => 3);
3390 
3391 		FOR temp_i IN 1..p_src_elem_ver_id_tbl.COUNT LOOP
3392 			PA_DEBUG.write(x_module => L_Module, x_msg => 'p_src_elem_ver_id_tbl(' || temp_i || '): ' || p_src_elem_ver_id_tbl(temp_i), x_log_level => 3);
3393 		END LOOP;
3394 
3395 		FOR temp_i IN 1..p_targ_elem_ver_id_tbl.COUNT LOOP
3396 			PA_DEBUG.write(x_module => L_Module, x_msg => 'p_targ_elem_ver_id_tbl(' || temp_i || '): ' || p_targ_elem_ver_id_tbl(temp_i), x_log_level => 3);
3397 		END LOOP;
3398 
3399 		PA_DEBUG.write(x_module => L_Module, x_msg => 'p_copy_people_flag: ' || p_copy_people_flag, x_log_level => 3);
3400 		PA_DEBUG.write(x_module => L_Module, x_msg => 'p_copy_equip_flag: ' || p_copy_equip_flag, x_log_level => 3);
3401 		PA_DEBUG.write(x_module => L_Module, x_msg => 'p_copy_mat_item_flag: ' || p_copy_mat_item_flag, x_log_level => 3);
3402 		PA_DEBUG.write(x_module => L_Module, x_msg => 'p_copy_fin_elem_flag: ' || p_copy_fin_elem_flag, x_log_level => 3);
3403 	END IF;
3404 
3405 	IF (p_copy_people_flag is null) AND
3406            (p_copy_equip_flag is null) AND
3407            (p_copy_mat_item_flag is null) AND
3408            (p_copy_fin_elem_flag is null) THEN
3409              x_calculate_flag := 'N';
3410              RETURN;
3411         ELSIF (p_copy_people_flag = 'N') AND
3412           (p_copy_equip_flag = 'N') AND
3413           (p_copy_mat_item_flag = 'N') AND
3414           (p_copy_fin_elem_flag = 'N') THEN
3415              x_calculate_flag := 'N';
3416              RETURN;
3417         END IF;
3418 
3419         -- Get the source and target resource lists
3420 	l_src_resource_list_id := Get_WP_Resource_List_Id(p_src_project_id);
3421 	l_target_resource_list_id := Get_WP_Resource_List_Id(p_target_project_id);
3422 
3423 	-- Check whether the target resource list is project specific or centrally controlled
3424 	OPEN get_rl_proj_specific_flag(l_target_resource_list_id);
3425 	FETCH get_rl_proj_specific_flag INTO l_rl_proj_specific_flag, l_tar_rl_none_flag;
3426 	CLOSE get_rl_proj_specific_flag;
3427 
3428         -- ER 4127235: Get the multi-currency setup for the 2 projects
3429         OPEN get_multi_cur_flag(p_src_project_id);
3430         FETCH get_multi_cur_flag INTO l_src_multi_cur_flag, l_source_workplan_costs_flag, l_source_cost_time_phased_code;
3431         CLOSE get_multi_cur_flag;
3432 
3433         OPEN get_multi_cur_flag(p_target_project_id);
3434         FETCH get_multi_cur_flag INTO l_tar_multi_cur_flag, l_target_workplan_costs_flag, l_target_cost_time_phased_code;
3435         CLOSE get_multi_cur_flag;
3436 
3437 	-- Bug 3951947: get target project's project functional currency code
3438 	OPEN get_proj_currency_code(p_target_project_id);
3439 	FETCH get_proj_currency_code INTO l_tar_projfunc_cur_code,  l_tar_proj_cur_code;
3440 	CLOSE get_proj_currency_code;
3441 
3442 	OPEN get_proj_currency_code(p_src_project_id);
3443 	FETCH get_proj_currency_code INTO l_src_projfunc_curr_code,  l_src_project_curr_code;
3444 	CLOSE get_proj_currency_code;
3445 
3446         -- Do not allow Copy External if the target project's Resource List is None
3447         IF l_tar_rl_none_flag = 'Y' and p_copy_external_flag='Y' THEN
3448                PA_UTILS.ADD_MESSAGE
3449                (p_app_short_name => 'PA',
3450                 p_msg_name       => 'PA_RES_LIST_NONE_ERR'
3451                );
3452                x_return_status := FND_API.G_RET_STS_ERROR;
3453                RAISE FND_API.G_EXC_ERROR;
3454         END IF;
3455 
3456 	IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 3) THEN
3457 		PA_DEBUG.write(x_module => L_Module, x_msg => 'l_src_resource_list_id: ' || l_src_resource_list_id, x_log_level => 3);
3458 		PA_DEBUG.write(x_module => L_Module, x_msg => 'l_target_resource_list_id: ' || l_target_resource_list_id, x_log_level => 3);
3459 	END IF;
3460 
3461 	IF p_targ_elem_ver_id_tbl.COUNT > 0 THEN
3462 		OPEN get_target_project_info (p_targ_elem_ver_id_tbl(1));
3463 		FETCH get_target_project_info INTO l_target_structure_version_id, l_target_budget_version_id, l_target_workplan_costs_flag;
3464 		CLOSE get_target_project_info;
3465 	END IF;
3466 
3467 	IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 3) THEN
3468 		PA_DEBUG.write(x_module => L_Module, x_msg => 'l_target_structure_version_id: ' || l_target_structure_version_id, x_log_level => 3);
3469 		PA_DEBUG.write(x_module => L_Module, x_msg => 'l_target_budget_version_id: ' || l_target_budget_version_id, x_log_level   => 3);
3470 		PA_DEBUG.write(x_module  => L_Module, x_msg => 'l_target_track_workplan_costs_flag: ' || l_target_workplan_costs_flag, x_log_level   => 3);
3471 
3472 		pa_debug.g_err_stage:='Beginning of TA: ' || L_FuncProc;
3473 		pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
3474 	END IF;
3475 
3476 
3477 
3478         -- ER 4127235: re-calculate in Copy External flow only if any of the
3479         --   followings are different  on source and target projects:
3480         --    resource list
3481         --    track workplan costR
3482         --    multi-currency settings
3483         --    time phase setting
3484         --    PC/PFC
3485 	IF p_copy_external_flag = 'Y' AND
3486            (l_source_workplan_costs_flag <> l_target_workplan_costs_flag OR
3487             l_src_resource_list_id <> l_target_resource_list_id OR
3488             l_src_multi_cur_flag <> l_tar_multi_cur_flag OR
3489             l_target_cost_time_phased_code <> l_source_cost_time_phased_code OR
3490             l_tar_projfunc_cur_code <> l_src_projfunc_curr_code OR
3491             l_tar_proj_cur_code <> l_src_project_curr_code OR
3492             l_rl_proj_specific_flag = 'Y') THEN
3493 		x_calculate_flag := 'Y';
3494 
3495 	END IF;
3496 
3497         --Bug 4492493: Check if Progress Rollup is required on CREATION
3498         l_progress_rollup_required := Is_Progress_Rollup_Required(p_target_project_id);
3499         -- End of Bug 4492493
3500 
3501 	--Construct predicate depending on the copy resource class flag.
3502 	IF p_copy_people_flag = 'Y' THEN
3503 		l_res_class1  := 'PEOPLE';
3504 	END IF;
3505 	IF p_copy_equip_flag = 'Y' THEN
3506 		l_res_class2 := 'EQUIPMENT';
3507 	END IF;
3508 	IF p_copy_mat_item_flag = 'Y' THEN
3509 		l_res_class3 := 'MATERIAL_ITEMS';
3510 	END IF;
3511 	IF p_copy_fin_elem_flag = 'Y' THEN
3512 		l_res_class4 := 'FINANCIAL_ELEMENTS';
3513 	END IF;
3514 
3515 	IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 3) THEN
3516 		pa_debug.g_err_stage:= 'TA: ' || L_FuncProc || ' class1: ' || l_res_class1 || ' 2:' || l_res_class2 || ' 3: ' || l_res_class3 || ' 4: ' || l_res_class4;
3517 	    pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
3518 	END IF;
3519 
3520 	IF p_src_elem_ver_id_tbl IS NOT NULL THEN
3521 
3522 		l_num_of_tasks := p_src_elem_ver_id_tbl.COUNT;
3523 
3524 		SELECT to_number(value)
3525 		INTO   l_db_block_size
3526 		FROM   v$parameter
3527 		WHERE  name = 'db_block_size';
3528 
3529 		l_num_blocks := 1.25 * (l_num_of_tasks * 75) / l_db_block_size;
3530 
3531 		-- Manually seed the statistics for the temporary table.
3532 		-- Bug 8261905, Replaced 'PA' by PJI_UTILS.GET_PA_SCHEMA_NAME
3533 		set_table_stats(PJI_UTILS.GET_PA_SCHEMA_NAME,'PA_COPY_ASGMTS_TEMP', l_num_of_tasks, l_num_blocks, 75);
3534 
3535 		DELETE pa_copy_asgmts_temp;
3536 		FORALL i IN 1..p_src_elem_ver_id_tbl.COUNT
3537 
3538 			/*Bug 4377886 : Included explicitly the column names in the INSERT statement
3539 					to remove the GSCC Warning File.Sql.33 */
3540                         -- Changed due to bug 4153366
3541 			INSERT INTO pa_copy_asgmts_temp
3542 			        (
3543         			SRC_ELEM_VER_ID,
3544         			TARG_ELEM_VER_ID,
3545         			OLD_TASK_SCH_START,
3546         			OLD_TASK_SCH_END,
3547         			NEW_TASK_SCH_START,
3548         			NEW_TASK_SCH_END
3549         			)
3550 			VALUES
3551 			(p_src_elem_ver_id_tbl(i), p_targ_elem_ver_id_tbl(i),null,null,null,null);
3552 
3553 		-- If copy project and resource list is project specific.
3554 		IF p_src_project_id <> p_target_project_id
3555 		   AND p_copy_external_flag <> 'Y'
3556 		   AND l_rl_proj_specific_flag = 'Y' THEN
3557 
3558 
3559 			OPEN c_get_asgmts_for_copy_proj(l_res_class1, l_res_class2, l_res_class3, l_res_class4);
3560 			FETCH c_get_asgmts_for_copy_proj BULK COLLECT INTO
3561 				l_ta_resource_assgt_tbl, l_ta_project_assgt_tbl, l_ta_named_role_tbl, l_ta_role_in_format_flag_tbl,
3562 				l_ta_wbs_elem_ver_tbl, l_ta_planning_start_tbl,
3563 				l_ta_planning_end_tbl, l_ta_schedule_start_tbl, l_ta_schedule_end_tbl, l_ta_display_flag_tbl,
3564 				l_ta_res_mem_id_tbl, l_ta_tar_res_mem_id_tbl, l_ta_structure_version_tbl, l_ta_res_type_code_tbl,
3565 				l_ta_resource_class_code_tbl, l_ta_resource_class_flag_tbl, l_ta_total_plan_quantity_tbl,
3566 				l_ta_total_plan_raw_cost_tbl, l_ta_total_proj_raw_cost_tbl, l_ta_rate_based_flag_tbl,
3567 				l_ta_budget_version_id_tbl, l_ta_tr_res_list_member_id_tbl, l_ta_task_id_tbl,
3568 				l_txn_source_type_code_tbl, l_person_id_tbl, l_job_id_tbl, l_organization_id_tbl, l_supplier_id_tbl,
3569 				l_expenditure_type_tbl, l_event_type_tbl, l_expenditure_category_tbl, l_revenue_category_code_tbl,
3570 				l_project_role_id_tbl, l_item_category_id_tbl, l_person_type_code_tbl, l_bom_resource_id_tbl,
3571 				l_non_labor_resource_tbl, l_inventory_item_id_tbl;
3572 			CLOSE c_get_asgmts_for_copy_proj;
3573 
3574 		ELSE
3575 
3576 			OPEN c_get_asgmts_for_copy(l_res_class1, l_res_class2, l_res_class3, l_res_class4);
3577 			FETCH c_get_asgmts_for_copy BULK COLLECT INTO
3578 				l_ta_resource_assgt_tbl, l_ta_project_assgt_tbl, l_ta_named_role_tbl, l_ta_role_in_format_flag_tbl,
3579 				l_ta_wbs_elem_ver_tbl, l_ta_planning_start_tbl,
3580 				l_ta_planning_end_tbl, l_ta_schedule_start_tbl, l_ta_schedule_end_tbl, l_ta_display_flag_tbl,
3581 				l_ta_res_mem_id_tbl, l_ta_structure_version_tbl, l_ta_res_type_code_tbl, l_ta_resource_class_code_tbl,
3582 				l_ta_resource_class_flag_tbl, l_ta_total_plan_quantity_tbl, l_ta_total_plan_raw_cost_tbl,
3583 				l_ta_total_proj_raw_cost_tbl, l_ta_rate_based_flag_tbl, l_ta_budget_version_id_tbl,
3584 				l_ta_tr_res_list_member_id_tbl, l_ta_task_id_tbl, l_txn_source_type_code_tbl, l_person_id_tbl,
3585 				l_job_id_tbl, l_organization_id_tbl, l_supplier_id_tbl, l_expenditure_type_tbl, l_event_type_tbl,
3586 				l_expenditure_category_tbl, l_revenue_category_code_tbl, l_project_role_id_tbl, l_item_category_id_tbl,
3587 				l_person_type_code_tbl, l_bom_resource_id_tbl, l_non_labor_resource_tbl, l_inventory_item_id_tbl;
3588 			CLOSE c_get_asgmts_for_copy;
3589 
3590 		END IF;
3591 
3592 		IF l_ta_resource_assgt_tbl.COUNT > 0 THEN
3593 
3594 			IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 3) THEN
3595 				pa_debug.g_err_stage:='TA: ' || L_FuncProc || ' Res assgt. count ' || l_ta_resource_assgt_tbl.COUNT;
3596 				pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
3597 			END IF;
3598 
3599 			l_index := 0;
3600 			l_previous_elem_version_id := l_ta_wbs_elem_ver_tbl(1);
3601 			l_accum_people_qty := 0;
3602 			l_accum_equip_qty := 0;
3603 			l_accum_mat_item_cost := 0;
3604 			l_accum_fin_elem_cost := 0;
3605 
3606 			-- Bug 3974569: Get the budget_version_id for the detination.
3607 			OPEN c_get_bv_and_rbs_id(p_targ_elem_ver_id_tbl(1));
3608 			FETCH c_get_bv_and_rbs_id INTO l_tar_bvid, l_tar_rbs_ver_id;
3609 			CLOSE c_get_bv_and_rbs_id;
3610 
3611 			OPEN c_get_bv_and_rbs_id(p_src_elem_ver_id_tbl(1));
3612 			FETCH c_get_bv_and_rbs_id INTO l_src_bvid, l_src_rbs_ver_id;
3613 			CLOSE c_get_bv_and_rbs_id;
3614 			-- \Bug 3974569.
3615 /* moved up
3616 			-- Bug 3951947: get target project's project functional currency code
3617 			OPEN get_proj_currency_code(p_target_project_id);
3618 			FETCH get_proj_currency_code INTO l_tar_projfunc_cur_code;
3619 			CLOSE get_proj_currency_code;
3620 */
3621                         -- ER 4127235: Move this outside the loop
3622                         --  Call Copy Planning Resource only in Copy External
3623                         --  flow when src and tar projects are different,
3624                         --  and resource list are the same and are centrally controlled
3625 		        IF p_src_project_id <> p_target_project_id AND
3626                            p_copy_external_flag = 'Y' AND
3627                            (l_src_resource_list_id <> l_target_resource_list_id OR
3628                             l_rl_proj_specific_flag = 'Y') THEN
3629 
3630 			  IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 3) THEN
3631 				PA_DEBUG.write(x_module      => L_Module,
3632 					       x_msg         => 'Calling Copy_Planning Resources',
3633 					       x_log_level   => 3);
3634 				PA_DEBUG.write(x_module      => L_Module,
3635 					       x_msg         => 'p_source_resource_list_id: ' || l_src_resource_list_id,
3636 					       x_log_level   => 3);
3637 				PA_DEBUG.write(x_module      => L_Module,
3638 					       x_msg         => 'p_destination_resource_list_id: ' || l_target_resource_list_id,
3639 					       x_log_level   => 3);
3640 				PA_DEBUG.write(x_module      => L_Module,
3641 					       x_msg         => 'p_destination_project_id: ' || p_target_project_id,
3642 					       x_log_level   => 3);
3643 				FOR temp_i IN 1..l_ta_res_mem_id_tbl.COUNT LOOP
3644 					PA_DEBUG.write(x_module      => L_Module,
3645 						       x_msg         => 'p_src_res_list_member_id_tbl(' || temp_i || '): ' || l_ta_res_mem_id_tbl(temp_i),
3646 						       x_log_level   => 3);
3647 				END LOOP;
3648 			  END IF;
3649 
3650  			  -- Call Copy Planning Resource API to get a valid
3651 			  -- rlm id in the target project
3652 			  Pa_Planning_Resource_Pvt.Copy_Planning_Resources(
3653 						p_source_resource_list_id       => l_src_resource_list_id,
3654 						p_destination_resource_list_id  => l_target_resource_list_id,
3655 						p_destination_project_id        => p_target_project_id,
3656 						p_src_res_list_member_id_tbl    => l_ta_res_mem_id_tbl,
3657 						x_dest_res_list_member_id_tbl   => l_copy_res_mem_id_tbl);
3658 
3659                         END IF; -- IF p_src_project_id <> p_target_project_id
3660 
3661 
3662 			FOR i in 1..l_ta_resource_assgt_tbl.COUNT+1 LOOP
3663 
3664 				IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 3) THEN
3665 					PA_DEBUG.write(x_module      => L_Module,
3666 					               x_msg         => 'Iteration through assignments: ' || i,
3667 					               x_log_level   => 3);
3668 				END IF;
3669 
3670 
3671                                 -- Bug 4492493: Check if Progress Rollup is required on COPY
3672 
3673                                 -- Bug 4492493: Check if Progress Rollup is required on COPY
3674                                 -- Bug Fix 5632835.
3675                                 -- The following unconditional code is causing the subscript beyond count issue.
3676                                 -- As per sheenie we need to skip this for the count+1 iteration, hence adding an additional if condition.
3677 
3678                               IF i <> l_ta_resource_assgt_tbl.COUNT+1 THEN
3679                                 IF g_require_progress_rollup = 'N' AND
3680                                    l_progress_rollup_required = 'Y' AND
3681                                    l_ta_total_plan_quantity_tbl(i) IS NOT NULL AND
3682                                    l_ta_total_plan_quantity_tbl(i) > 0 THEN
3683                                   g_require_progress_rollup := 'Y';
3684                                 END IF;
3685                                 -- End of Bug 4492493
3686                               END IF;
3687                               -- End of Bug Fix 5632835.
3688 
3689 
3690 				-- Initialize accum values per task
3691 				IF i = l_ta_resource_assgt_tbl.COUNT+1 OR
3692 				   l_previous_elem_version_id <> l_ta_wbs_elem_ver_tbl(i) THEN
3693 
3694 					IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 3) THEN
3695 					   PA_DEBUG.write(x_module      => L_Module,
3696 					                  x_msg         => 'End of Previous Task',
3697 					                  x_log_level   => 3);
3698 					END IF;
3699 
3700 					-- creation or update of resource class TA
3701 					IF l_accum_people_qty > 0 THEN
3702 
3703 						IF l_people_class_index <> -999 THEN
3704 
3705 							IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 3) THEN
3706 								PA_DEBUG.write(x_module      => L_Module,
3707 								               x_msg         => 'l_people_class_index: ' || l_people_class_index,
3708 								               x_log_level   => 3);
3709 								PA_DEBUG.write(x_module      => L_Module,
3710 								               x_msg         => 'l_accum_people_qty: ' || l_accum_people_qty,
3711 								               x_log_level   => 3);
3712 								PA_DEBUG.write(x_module      => L_Module,
3713 								               x_msg         => 'x_resource_rec_qty: ' || x_resource_rec_tbl(l_people_class_index).total_quantity,
3714 								               x_log_level   => 3);
3715 							END IF;
3716 
3717 							x_resource_rec_tbl(l_people_class_index).total_quantity := x_resource_rec_tbl(l_people_class_index).total_quantity + nvl(l_accum_people_qty,0);
3718 
3719 							IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 3) THEN
3720 								PA_DEBUG.write(x_module      => L_Module,
3721 								               x_msg         => 'x_resource_rec_qty: ' || x_resource_rec_tbl(l_people_class_index).total_quantity,
3722 								               x_log_level   => 3);
3723 							END IF;
3724 
3725 						ELSE -- l_people_class_index <> -999
3726 
3727 							IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 3) THEN
3728 								PA_DEBUG.write(x_module      => L_Module,
3729 								               x_msg         => 'Calling get_class_member_id function for PEOPLE',
3730 								               x_log_level   => 3);
3731 								PA_DEBUG.write(x_module      => L_Module,
3732 								               x_msg         => 'l_target_resource_list_id: ' || l_target_resource_list_id,
3733 								               x_log_level   => 3);
3734 							END IF;
3735 
3736 							l_class_rlm_id := PA_PLANNING_RESOURCE_UTILS.get_class_member_id(
3737                                                                     p_project_id          => p_target_project_id,
3738                                                                     p_resource_list_id    => l_target_resource_list_id,
3739                                                                     p_resource_class_code => 'PEOPLE');
3740 
3741 							IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 3) THEN
3742 								PA_DEBUG.write(x_module      => L_Module,
3743 								               x_msg         => 'l_class_rlm_id: ' || l_class_rlm_id,
3744 								               x_log_level   => 3);
3745 							END IF;
3746 
3747 							l_add_cnt := l_add_cnt +1;
3748 							l_add_res_list_member_id_tbl.extend(1);
3749 							l_add_res_list_member_id_tbl(l_add_cnt) := l_class_rlm_id;
3750 
3751 
3752 
3753                                                         FOR l IN 1 .. p_src_elem_ver_id_tbl.COUNT LOOP
3754 							  l_element_version_index := l;
3755 						          EXIT WHEN p_src_elem_ver_id_tbl(l_element_version_index) = l_previous_elem_version_id;
3756 						        END LOOP;
3757 
3758 						        l_add_elem_version_id_tbl.extend(1);
3759 						        l_add_elem_version_id_tbl(l_add_cnt) := p_targ_elem_ver_id_tbl(l_element_version_index);
3760 
3761 							l_add_qty_tbl.extend(1);
3762 							l_add_qty_tbl(l_add_cnt) :=  l_accum_people_qty;
3763 							l_add_raw_cost_tbl.extend(1);
3764 							l_add_raw_cost_tbl(l_add_cnt) := NULL;
3765                                                         -- Bug 3951947 get the project functional currency code
3766 							l_add_projfunc_cur_code_tbl.extend(1);
3767 							l_add_projfunc_cur_code_tbl(l_add_cnt) := l_tar_projfunc_cur_code;
3768 
3769 						END IF; -- l_people_class_index <> -999
3770 
3771 					END IF; -- l_accum_people_qty > 0
3772 
3773 					IF l_accum_equip_qty > 0 THEN
3774 
3775 						IF l_equip_class_index <> -999 THEN
3776 
3777 							x_resource_rec_tbl(l_equip_class_index).total_quantity := x_resource_rec_tbl(l_equip_class_index).total_quantity + nvl(l_accum_equip_qty,0);
3778 
3779 						ELSE
3780 
3781 							IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 3) THEN
3782 								PA_DEBUG.write(x_module      => L_Module,
3783 								               x_msg         => 'Calling get_class_member_id function for EQUIPEMENT',
3784 								               x_log_level   => 3);
3785 								PA_DEBUG.write(x_module      => L_Module,
3786 								               x_msg         => 'l_target_resource_list_id: ' || l_target_resource_list_id,
3787 								               x_log_level   => 3);
3788 							END IF;
3789 
3790 							l_class_rlm_id := PA_PLANNING_RESOURCE_UTILS.get_class_member_id(
3791 				                		p_project_id          => p_target_project_id,
3792 				                		p_resource_list_id    => l_target_resource_list_id,
3793 				                		p_resource_class_code => 'EQUIPMENT');
3794 
3795 							IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 3) THEN
3796 								PA_DEBUG.write(x_module      => L_Module,
3797 								               x_msg         => 'l_class_rlm_id: ' || l_class_rlm_id,
3798 								               x_log_level   => 3);
3799 							END IF;
3800 
3801 							l_add_cnt := l_add_cnt +1;
3802 							l_add_res_list_member_id_tbl.extend(1);
3803 							l_add_res_list_member_id_tbl(l_add_cnt) := l_class_rlm_id;
3804                                                         FOR l IN 1 .. p_src_elem_ver_id_tbl.COUNT LOOP
3805 							  l_element_version_index := l;
3806 						          EXIT WHEN p_src_elem_ver_id_tbl(l_element_version_index) = l_previous_elem_version_id;
3807 						        END LOOP;
3808 
3809 						        l_add_elem_version_id_tbl.extend(1);
3810 						        l_add_elem_version_id_tbl(l_add_cnt) := p_targ_elem_ver_id_tbl(l_element_version_index);
3811 
3812 							l_add_qty_tbl.extend(1);
3813 							l_add_qty_tbl(l_add_cnt) :=  l_accum_equip_qty;
3814 							l_add_raw_cost_tbl.extend(1);
3815 							l_add_raw_cost_tbl(l_add_cnt) :=  NULL;
3816                                                         -- Bug 3951947 get the project functional currency code
3817 							l_add_projfunc_cur_code_tbl.extend(1);
3818 							l_add_projfunc_cur_code_tbl(l_add_cnt) := l_tar_projfunc_cur_code;
3819 
3820 						END IF; -- l_equip_class_index <> -999
3821 
3822 					END IF; -- l_accum_equip_qty > 0
3823 
3824 					IF l_accum_mat_item_cost > 0 THEN
3825 
3826 						IF l_target_workplan_costs_flag <> 'N' THEN
3827 
3828 							IF l_mat_item_class_index <> -999 THEN
3829 
3830 								OPEN get_txn_currency_code(x_resource_rec_tbl(l_mat_item_class_index).resource_assignment_id);
3831 								FETCH get_txn_currency_code INTO l_txn_curr_code;
3832 								CLOSE get_txn_currency_code;
3833 
3834 								-- Get exchange rate to convert project_currency to txn_currency
3835 								pa_progress_utils.convert_currency_amounts(
3836 									p_api_version             => l_api_version,
3837 									p_init_msg_list           => l_init_msg_list,
3838 									p_commit                  => l_commit,
3839 									p_validate_only           => l_validate_only,
3840 									p_validation_level        => l_validation_level,
3841 									p_calling_module          => l_calling_module,
3842 									p_debug_mode              => l_debug_mode,
3843 									p_max_msg_count           => l_max_msg_count,
3844 									p_project_id              => p_src_project_id,
3845                                                                         p_calling_mode            => 'PLAN_RATES', -- 4372462
3846                                                                         p_budget_version_id       => l_src_bvid, -- 4372462
3847                                                                         p_res_assignment_id       => -999, -- 4372462
3848 									p_task_id                 => x_resource_rec_tbl(l_mat_item_class_index).task_id,
3849 									p_as_of_date              => trunc(sysdate),
3850 									p_txn_cost                => 0,
3851 									p_txn_curr_code           => l_txn_curr_code,
3852 									p_structure_version_id    => x_resource_rec_tbl(l_mat_item_class_index).structure_version_id,
3853 									p_project_curr_code       => l_project_curr_code,
3854 									p_project_rate_type       => l_project_rate_type,
3855 									p_project_rate_date       => l_project_rate_date,
3856 									p_project_exch_rate       => l_project_exch_rate,
3857 									p_project_raw_cost        => l_project_raw_cost,
3858 									p_projfunc_curr_code      => l_projfunc_curr_code,
3859 									p_projfunc_cost_rate_type => l_projfunc_cost_rate_type,
3860 									p_projfunc_cost_rate_date => l_projfunc_cost_rate_date,
3861 									p_projfunc_cost_exch_rate => l_projfunc_cost_exch_rate,
3862 									p_projfunc_raw_cost       => l_projfunc_raw_cost,
3863 									x_return_status           => x_return_status,
3864 									x_msg_count               => l_msg_count,
3865 									x_msg_data                => l_msg_data);
3866 
3867 								IF x_return_status = FND_API.G_RET_STS_ERROR THEN
3868 									RAISE FND_API.G_EXC_ERROR;
3869 								ELSIF x_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
3870 									RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3871 								END IF;
3872 
3873 								IF l_txn_curr_code = l_projfunc_curr_code THEN
3874 									l_projfunc_cost_exch_rate := 1;
3875 								END IF;
3876 
3877 								IF nvl(l_projfunc_cost_exch_rate,0) <> 0 THEN
3878 									l_txn_mat_item_cost := nvl(l_accum_mat_item_cost,0) / l_projfunc_cost_exch_rate;
3879 								END IF;
3880 
3881 
3882 								x_resource_rec_tbl(l_mat_item_class_index).total_raw_cost := x_resource_rec_tbl(l_mat_item_class_index).total_raw_cost + nvl(l_txn_mat_item_cost,0);
3883 
3884 							ELSE -- l_mat_item_class_index <> -999
3885 
3886 								IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 3) THEN
3887 									PA_DEBUG.write(x_module      => L_Module,
3888 									               x_msg         => 'Calling get_class_member_id function for MATERIAL ITEM',
3889 									               x_log_level   => 3);
3890 									PA_DEBUG.write(x_module      => L_Module,
3891 									               x_msg         => 'l_target_resource_list_id: ' || l_target_resource_list_id,
3892 									               x_log_level   => 3);
3893 								END IF;
3894 								l_class_rlm_id := PA_PLANNING_RESOURCE_UTILS.get_class_member_id(
3895 									p_project_id          => p_target_project_id,
3896 									p_resource_list_id    => l_target_resource_list_id,
3897 									p_resource_class_code => 'MATERIAL_ITEMS');
3898 
3899 								IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 3) THEN
3900 									PA_DEBUG.write(x_module      => L_Module,
3901 									               x_msg         => 'l_class_rlm_id: ' || l_class_rlm_id,
3902 									               x_log_level   => 3);
3903 								END IF;
3904 /* moved up
3905 								OPEN get_proj_currency_code(p_src_project_id);
3906 								FETCH get_proj_currency_code INTO l_src_project_curr_code;
3907 								CLOSE get_proj_currency_code;
3908 */
3909 								-- Get exchange rate to convert source project_currency to target project currency
3910 								pa_progress_utils.convert_currency_amounts(
3911 									p_api_version             => l_api_version,
3912 									p_init_msg_list           => l_init_msg_list,
3913 									p_commit                  => l_commit,
3914 									p_validate_only           => l_validate_only,
3915 									p_validation_level        => l_validation_level,
3916 									p_calling_module          => l_calling_module,
3917 									p_debug_mode              => l_debug_mode,
3918 									p_max_msg_count           => l_max_msg_count,
3919 									p_project_id              => p_target_project_id,
3920                                                                         p_calling_mode            => 'PLAN_RATES', -- 4372462
3921                                                                         p_budget_version_id       => l_tar_bvid, -- 4372462
3922                                                                         p_res_assignment_id       => -999, -- 4372462
3923 									p_task_id                 => null,
3924 									p_as_of_date              => trunc(sysdate),
3925 									p_txn_cost                => 0,
3926 									p_txn_curr_code           => l_src_project_curr_code,
3927 									p_structure_version_id    => null,
3928 									p_project_curr_code       => l_project_curr_code,
3929 									p_project_rate_type       => l_project_rate_type,
3930 									p_project_rate_date       => l_project_rate_date,
3931 									p_project_exch_rate       => l_project_exch_rate,
3932 									p_project_raw_cost        => l_project_raw_cost,
3933 									p_projfunc_curr_code      => l_projfunc_curr_code,
3934 									p_projfunc_cost_rate_type => l_projfunc_cost_rate_type,
3935 									p_projfunc_cost_rate_date => l_projfunc_cost_rate_date,
3936 									p_projfunc_cost_exch_rate => l_projfunc_cost_exch_rate,
3937 									p_projfunc_raw_cost       => l_projfunc_raw_cost,
3938 									x_return_status           => x_return_status,
3939 									x_msg_count               => l_msg_count,
3940 									x_msg_data                => l_msg_data);
3941 
3942 								IF x_return_status = FND_API.G_RET_STS_ERROR THEN
3943 									RAISE FND_API.G_EXC_ERROR;
3944 								ELSIF x_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
3945 									RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3946 								END IF;
3947 
3948 								-- Bug 3951947 Should compare the source and target
3949 								--  projects' project currencies
3950 								IF l_src_project_curr_code = l_projfunc_curr_code THEN
3951 									l_projfunc_cost_exch_rate := 1;
3952 								END IF;
3953 
3954 								IF nvl(l_projfunc_cost_exch_rate,0) <> 0 THEN
3955 									l_txn_mat_item_cost := nvl(l_accum_mat_item_cost,0) / l_projfunc_cost_exch_rate;
3956 								END IF;
3957 
3958 
3959 								l_add_cnt := l_add_cnt +1;
3960 								l_add_res_list_member_id_tbl.extend(1);
3961 								l_add_res_list_member_id_tbl(l_add_cnt) := l_class_rlm_id;
3962 
3963                                                                 FOR l IN 1 .. p_src_elem_ver_id_tbl.COUNT LOOP
3964 							          l_element_version_index := l;
3965 						                  EXIT WHEN p_src_elem_ver_id_tbl(l_element_version_index) = l_previous_elem_version_id;
3966 						                END LOOP;
3967 
3968 						                l_add_elem_version_id_tbl.extend(1);
3969 						                l_add_elem_version_id_tbl(l_add_cnt) := p_targ_elem_ver_id_tbl(l_element_version_index);
3970 
3971 								l_add_qty_tbl.extend(1);
3972 								l_add_qty_tbl(l_add_cnt) :=  NULL;
3973 								l_add_raw_cost_tbl.extend(1);
3974 								l_add_raw_cost_tbl(l_add_cnt) :=  nvl(l_txn_mat_item_cost,0);
3975 								-- Bug 3951947 get the project functional currency code
3976 								l_add_projfunc_cur_code_tbl.extend(1);
3977 								l_add_projfunc_cur_code_tbl(l_add_cnt) := l_tar_projfunc_cur_code;
3978 
3979 							END IF; -- l_mat_item_class_index <> -999
3980 
3981 						END IF; -- l_target_workplan_costs_flag <> 'N'
3982 
3983 					END IF; -- l_accum_mat_item_cost > 0
3984 
3985 					IF l_accum_fin_elem_cost > 0 THEN
3986 
3987 						IF l_target_workplan_costs_flag <> 'N' THEN
3988 
3989 							IF l_fin_elem_class_index <> -999 THEN
3990 
3991 								OPEN get_txn_currency_code(x_resource_rec_tbl(l_fin_elem_class_index).resource_assignment_id);
3992 								FETCH get_txn_currency_code INTO l_txn_curr_code;
3993 								CLOSE get_txn_currency_code;
3994 
3995 								-- Get exchange rate to convert project_currency to txn_currency
3996 								pa_progress_utils.convert_currency_amounts(
3997 									p_api_version             => l_api_version,
3998 									p_init_msg_list           => l_init_msg_list,
3999 									p_commit                  => l_commit,
4000 									p_validate_only           => l_validate_only,
4001 									p_validation_level        => l_validation_level,
4002 									p_calling_module          => l_calling_module,
4003 									p_debug_mode              => l_debug_mode,
4004 									p_max_msg_count           => l_max_msg_count,
4005 									p_project_id              => p_src_project_id,
4006                                                                         p_calling_mode            => 'PLAN_RATES', -- 4372462
4007                                                                         p_budget_version_id       => l_src_bvid, -- 4372462
4008                                                                         p_res_assignment_id       => -999, -- 4372462
4009 									p_task_id                 => x_resource_rec_tbl(l_fin_elem_class_index).task_id,
4010 									p_as_of_date              => trunc(sysdate),
4011 									p_txn_cost                => 0,
4012 									p_txn_curr_code           => l_txn_curr_code,
4013 									p_structure_version_id    => x_resource_rec_tbl(l_fin_elem_class_index).structure_version_id,
4014 									p_project_curr_code       => l_project_curr_code,
4015 									p_project_rate_type       => l_project_rate_type,
4016 									p_project_rate_date       => l_project_rate_date,
4017 									p_project_exch_rate       => l_project_exch_rate,
4018 									p_project_raw_cost        => l_project_raw_cost,
4019 									p_projfunc_curr_code      => l_projfunc_curr_code,
4020 									p_projfunc_cost_rate_type => l_projfunc_cost_rate_type,
4021 									p_projfunc_cost_rate_date => l_projfunc_cost_rate_date,
4022 									p_projfunc_cost_exch_rate => l_projfunc_cost_exch_rate,
4023 									p_projfunc_raw_cost       => l_projfunc_raw_cost,
4024 									x_return_status           => x_return_status,
4025 									x_msg_count               => l_msg_count,
4026 									x_msg_data                => l_msg_data);
4027 
4028 								IF x_return_status = FND_API.G_RET_STS_ERROR THEN
4029 									RAISE FND_API.G_EXC_ERROR;
4030 								ELSIF x_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
4031 									RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4032 								END IF;
4033 
4034 								IF l_txn_curr_code = l_projfunc_curr_code THEN
4035 									l_projfunc_cost_exch_rate := 1;
4036 								END IF;
4037 
4038 								IF nvl(l_projfunc_cost_exch_rate,0) <> 0 THEN
4039 									l_txn_fin_elem_cost := nvl(l_accum_fin_elem_cost,0) / l_projfunc_cost_exch_rate;
4040 								END IF;
4041 
4042 								x_resource_rec_tbl(l_fin_elem_class_index).total_raw_cost := x_resource_rec_tbl(l_fin_elem_class_index).total_raw_cost + nvl(l_txn_fin_elem_cost,0);
4043 
4044 							ELSE -- l_fin_elem_class_index <> -999
4045 
4046 								IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 3) THEN
4047 									PA_DEBUG.write(x_module      => L_Module,
4048 												   x_msg         => 'Calling get_class_member_id function for FINANCIAL ELEMENT',
4049 												   x_log_level   => 3);
4050 									PA_DEBUG.write(x_module      => L_Module,
4051 									               x_msg         => 'l_target_resource_list_id: ' || l_target_resource_list_id,
4052 									               x_log_level   => 3);
4053 								END IF;
4054 
4055 								l_class_rlm_id := PA_PLANNING_RESOURCE_UTILS.get_class_member_id(
4056 									p_project_id          => p_target_project_id,
4057 									p_resource_list_id    => l_target_resource_list_id,
4058 									p_resource_class_code => 'FINANCIAL_ELEMENTS'); -- Bug 3800726
4059 
4060 								IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 3) THEN
4061 									PA_DEBUG.write(x_module      => L_Module,
4062 									               x_msg         => 'l_class_rlm_id: ' || l_class_rlm_id,
4063 									               x_log_level   => 3);
4064 								END IF;
4065 /* moved up
4066 								OPEN get_proj_currency_code(p_src_project_id);
4067 								FETCH get_proj_currency_code INTO l_src_project_curr_code;
4068 								CLOSE get_proj_currency_code;
4069 */
4070 								-- Get exchange rate to convert source project_currency to target project currency
4071 								pa_progress_utils.convert_currency_amounts(
4072 									p_api_version             => l_api_version,
4073 									p_init_msg_list           => l_init_msg_list,
4074 									p_commit                  => l_commit,
4075 									p_validate_only           => l_validate_only,
4076 									p_validation_level        => l_validation_level,
4077 									p_calling_module          => l_calling_module,
4078 									p_debug_mode              => l_debug_mode,
4079 									p_max_msg_count           => l_max_msg_count,
4080 									p_project_id              => p_target_project_id,
4081                                                                         p_calling_mode            => 'PLAN_RATES', -- 4372462
4082                                                                         p_budget_version_id       => l_tar_bvid, -- 4372462
4083                                                                         p_res_assignment_id       => -999, -- 4372462
4084 									p_task_id                 => null,
4085 									p_as_of_date              => trunc(sysdate),
4086 									p_txn_cost                => 0,
4087 									p_txn_curr_code           => l_src_project_curr_code,
4088 									p_structure_version_id    => null,
4089 									p_project_curr_code       => l_project_curr_code,
4090 									p_project_rate_type       => l_project_rate_type,
4091 									p_project_rate_date       => l_project_rate_date,
4092 									p_project_exch_rate       => l_project_exch_rate,
4093 									p_project_raw_cost        => l_project_raw_cost,
4094 									p_projfunc_curr_code      => l_projfunc_curr_code,
4095 									p_projfunc_cost_rate_type => l_projfunc_cost_rate_type,
4096 									p_projfunc_cost_rate_date => l_projfunc_cost_rate_date,
4097 									p_projfunc_cost_exch_rate => l_projfunc_cost_exch_rate,
4098 									p_projfunc_raw_cost       => l_projfunc_raw_cost,
4099 									x_return_status           => x_return_status,
4100 									x_msg_count               => l_msg_count,
4101 									x_msg_data                => l_msg_data);
4102 
4103 								IF x_return_status = FND_API.G_RET_STS_ERROR THEN
4104 									RAISE FND_API.G_EXC_ERROR;
4105 								ELSIF x_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
4106 									RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4107 								END IF;
4108 
4109 								-- Bug 3951947 Should compare the source and target
4110 								--  projects' project currencies
4111 								IF l_src_project_curr_code = l_projfunc_curr_code THEN
4112 									l_projfunc_cost_exch_rate := 1;
4113 								END IF;
4114 
4115 								IF nvl(l_projfunc_cost_exch_rate,0) <> 0 THEN
4116 									l_txn_fin_elem_cost := nvl(l_accum_fin_elem_cost,0) / l_projfunc_cost_exch_rate;
4117 								END IF;
4118 
4119 
4120 								l_add_cnt := l_add_cnt +1;
4121 								l_add_res_list_member_id_tbl.extend(1);
4122 								l_add_res_list_member_id_tbl(l_add_cnt) := l_class_rlm_id;
4123 
4124                                                                 FOR l IN 1 .. p_src_elem_ver_id_tbl.COUNT LOOP
4125 							          l_element_version_index := l;
4126 						                  EXIT WHEN p_src_elem_ver_id_tbl(l_element_version_index) = l_previous_elem_version_id;
4127 						                END LOOP;
4128 
4129 						                l_add_elem_version_id_tbl.extend(1);
4130 						                l_add_elem_version_id_tbl(l_add_cnt) := p_targ_elem_ver_id_tbl(l_element_version_index);
4131 
4132 								l_add_qty_tbl.extend(1);
4133 								l_add_qty_tbl(l_add_cnt) :=  NULL;
4134 								l_add_raw_cost_tbl.extend(1);
4135 								l_add_raw_cost_tbl(l_add_cnt) :=  nvl(l_txn_fin_elem_cost,0);
4136                                                                 -- Bug 3951947 get the project functional currency code
4137 							        l_add_projfunc_cur_code_tbl.extend(1);
4138 							        l_add_projfunc_cur_code_tbl(l_add_cnt) := l_tar_projfunc_cur_code;
4139 
4140 
4141 							END IF; -- l_fin_elem_class_index <> -999
4142 
4143 						END IF; -- l_target_workplan_costs_flag <> 'N'
4144 
4145 					END IF; -- l_accum_fin_elem_cost > 0
4146 
4147 					-- initialize accum values and indexes
4148 					l_accum_people_qty := 0;
4149 					l_accum_equip_qty := 0;
4150 					l_accum_mat_item_cost := 0;
4151 					l_accum_fin_elem_cost := 0;
4152 					l_people_class_index := -999;
4153 					l_equip_class_index := -999;
4154 					l_mat_item_class_index := -999;
4155 					l_fin_elem_class_index := -999;
4156 
4157 					-- Bug 3831695, 3834509: update elem version id in the loop
4158 					IF i < l_ta_resource_assgt_tbl.COUNT+1 THEN
4159 						l_previous_elem_version_id := l_ta_wbs_elem_ver_tbl(i);
4160 					END IF;
4161 
4162 				END IF; -- i = l_ta_resource_assgt_tbl.COUNT+1 OR l_previous_elem_version_id <> l_ta_wbs_elem_ver_tbl(i)
4163 
4164    				EXIT WHEN i = l_ta_resource_assgt_tbl.COUNT+1;
4165 
4166 				--Initialize every time..
4167 				l_c_res_mem_id_tbl := system.pa_num_tbl_type();
4168 
4169 				IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 3) THEN
4170 					pa_debug.g_err_stage:='TA: ' || L_FuncProc || ' b4  copy planning resources.';
4171 					pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
4172 				END IF;
4173 
4174 				-- CASE 1: Copy External
4175 				--   call Copy_Planning_Resource
4176 				-- CASE 2: Copy Project flow and RLs are project specific
4177 				--   do not call Copy_Planning_Resource but return back the re-derived
4178 				--   rlm ids from the above SQL
4179 				-- CASE 3: Copy Project flow and RLs are centrally controlled OR
4180 				--         Copy Task flow within the same project
4181 				--   return the same source rlm ids
4182 
4183 				-- CASE 1: Copy External
4184 				IF p_src_project_id <> p_target_project_id AND p_copy_external_flag = 'Y' THEN
4185 
4186 					IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 3) THEN
4187 
4188 						PA_DEBUG.write(x_module      => L_Module,
4189 						               x_msg         => 'p_source_resource_list_id: ' || l_src_resource_list_id,
4190 						               x_log_level   => 3);
4191 						PA_DEBUG.write(x_module      => L_Module,
4192 						               x_msg         => 'p_destination_resource_list_id: ' || l_target_resource_list_id,
4193 						               x_log_level   => 3);
4194 						PA_DEBUG.write(x_module      => L_Module,
4195 						               x_msg         => 'p_destination_project_id: ' || p_target_project_id,
4196 						               x_log_level   => 3);
4197 					END IF;
4198 
4199                                         IF l_src_resource_list_id = l_target_resource_list_id AND
4200                                            l_rl_proj_specific_flag = 'N' THEN
4201 
4202 					   -- if source and target resource list are the same
4203                                            -- and if they are both centrally controlled
4204                                            -- just return the same rlm id
4205 					   l_c_res_mem_id_tbl.extend(1);
4206 					   l_c_res_mem_id_tbl(1) := l_ta_res_mem_id_tbl(i);
4207 
4208                                         ELSE
4209 
4210                                          --  ER 4127235: copy planning resource is called outside the loop
4211                                          l_c_res_mem_id_tbl.extend(1);
4212                                          l_c_res_mem_id_tbl(1) := l_copy_res_mem_id_tbl(i);
4213 
4214                                         END IF;
4215 
4216 				-- CASE 2: Copy Project flow and RLs are project specific
4217 				ELSIF p_src_project_id <> p_target_project_id
4218 					  AND p_copy_external_flag <> 'Y'
4219 					  AND l_rl_proj_specific_flag = 'Y' THEN
4220 
4221 					l_c_res_mem_id_tbl.extend(1);
4222 					l_c_res_mem_id_tbl(1) := l_ta_tar_res_mem_id_tbl(i);
4223 
4224 				-- CASE 3: Copy Project flow and RLs are centrally controlled OR
4225 				ELSE -- p_src_project_id <> p_target_project_id
4226 
4227 					-- if copying to and from the same project, just
4228 					-- use the same rlm from the target assignment
4229 					l_c_res_mem_id_tbl.extend(1);
4230 					l_c_res_mem_id_tbl(1) := l_ta_res_mem_id_tbl(i);
4231 
4232 				END IF; -- p_src_project_id <> p_target_project_id
4233 
4234 				IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 3) THEN
4235 
4236 					pa_debug.g_err_stage:='TA: ' || L_FuncProc || ' a4 calling copy planning resources.';
4237 					pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
4238 
4239 					FOR temp_i IN 1..l_c_res_mem_id_tbl.COUNT LOOP
4240 						PA_DEBUG.write(x_module      => L_Module,
4241 						               x_msg         => 'l_c_res_mem_id_tbl(' || temp_i || '): ' || l_c_res_mem_id_tbl(temp_i),
4242 						               x_log_level   => 3);
4243 					END LOOP;
4244 
4245 				END IF;
4246 
4247 				IF l_c_res_mem_id_tbl.exists(1) and l_c_res_mem_id_tbl(1) IS NOT NULL THEN
4248 
4249 					l_index := l_index + 1;
4250 					x_resource_rec_tbl(l_index).resource_assignment_id  := l_ta_resource_assgt_tbl(i);
4251 					l_published := 'N';
4252 
4253 					IF l_ta_res_type_code_tbl(i) = 'RESOURCE_CLASS' AND
4254 					   l_ta_resource_class_flag_tbl(i) = 'Y' THEN
4255 
4256 						IF l_ta_resource_class_code_tbl(i) = 'PEOPLE' THEN
4257 							l_people_class_index := l_index;
4258 						ELSIF l_ta_resource_class_code_tbl(i) = 'EQUIPMENT' THEN
4259 							l_equip_class_index := l_index;
4260 						ELSIF l_ta_resource_class_code_tbl(i) = 'MATERIAL_ITEMS' THEN
4261 							l_mat_item_class_index := l_index;
4262 						ELSE
4263 							l_fin_elem_class_index := l_index;
4264 						END IF;
4265 
4266 					END IF;
4267 
4268 					-- Bug 3745338, disallow copy of TR if the resource list member has changed.
4269 					-- Bug 4097749 - Do not copy project_assignment_id if copying to another project,
4270 					IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 3) THEN
4271 						pa_debug.g_err_stage:='TA: ' || L_FuncProc || 'l_ta_tr_res_list_member_id_tbl(i): ' || l_ta_tr_res_list_member_id_tbl(i);
4272 						pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
4273 						pa_debug.g_err_stage:='TA: ' || L_FuncProc || 'l_c_res_mem_id_tbl(1): ' || l_c_res_mem_id_tbl(1);
4274 						pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
4275 					END IF;
4276 
4277 					IF l_ta_tr_res_list_member_id_tbl(i) <> l_c_res_mem_id_tbl(1) OR
4278 					   p_src_project_id <> p_target_project_id THEN
4279 
4280 						x_resource_rec_tbl(l_index).project_assignment_id := -1;
4281 						IF l_ta_role_in_format_flag_tbl(i) = 'N' THEN
4282 							x_resource_rec_tbl(l_index).named_role := NULL;
4283 						ELSE
4284 							x_resource_rec_tbl(l_index).named_role := l_ta_named_role_tbl(i);
4285 						END IF;
4286 
4287 					ELSE
4288 
4289 						x_resource_rec_tbl(l_index).project_assignment_id := l_ta_project_assgt_tbl(i);
4290 						x_resource_rec_tbl(l_index).named_role := l_ta_named_role_tbl(i);
4291 
4292 					END IF;
4293 
4294 					-- Bug 3850848
4295 					-- When copy from another project, actuals are not copied and therefore
4296 					--  we are defaulted planning dates back to scheduled dates
4297 					IF p_src_project_id <> p_target_project_id THEN
4298 						x_resource_rec_tbl(l_index).planning_start_date     := l_ta_schedule_start_tbl(i);
4299 						x_resource_rec_tbl(l_index).planning_end_date       := l_ta_schedule_end_tbl(i);
4300 					ELSE
4301 						x_resource_rec_tbl(l_index).planning_start_date     := l_ta_planning_start_tbl(i);
4302 						x_resource_rec_tbl(l_index).planning_end_date       := l_ta_planning_end_tbl(i);
4303 					END IF;
4304 
4305 					x_resource_rec_tbl(l_index).schedule_start_date     := l_ta_schedule_start_tbl(i);
4306 					x_resource_rec_tbl(l_index).schedule_end_date       := l_ta_schedule_end_tbl(i);
4307 					x_resource_rec_tbl(l_index).resource_list_member_id := l_c_res_mem_id_tbl(1);
4308 
4309 					IF  l_ta_rate_based_flag_tbl(i) = 'N' THEN
4310 						x_resource_rec_tbl(l_index).total_quantity := l_ta_total_plan_quantity_tbl(i);
4311 						x_resource_rec_tbl(l_index).total_raw_cost := l_ta_total_plan_raw_cost_tbl(i);
4312 					ELSE
4313 						x_resource_rec_tbl(l_index).total_quantity := l_ta_total_plan_quantity_tbl(i);
4314 					END IF;
4315 
4316 					-- Bug 4646016 : In Copy Assignments flow from one version to other
4317 					-- we should make plan as 0 if it is -ve
4318 					-- Begin
4319 					IF nvl(PA_TASK_ASSIGNMENT_UTILS.g_process_flow,'XYZ') <> 'PUBLISH' THEN
4320 						IF  l_ta_rate_based_flag_tbl(i) = 'N' THEN
4321 							IF x_resource_rec_tbl(l_index).total_quantity < 0  THEN
4322 								x_resource_rec_tbl(l_index).total_quantity := 0;
4323 								x_resource_rec_tbl(l_index).total_raw_cost := 0;
4324 								x_calculate_flag := 'Y';
4325 							END IF;
4326 						ELSE
4327 							IF x_resource_rec_tbl(l_index).total_quantity < 0 THEN
4328 								x_resource_rec_tbl(l_index).total_quantity := 0;
4329 								x_calculate_flag := 'Y';
4330 							END IF;
4331 						END IF;
4332 					END IF;
4333 					-- End
4334 
4335 					x_resource_rec_tbl(l_index).task_id := l_ta_task_id_tbl(i);
4336 					x_resource_rec_tbl(l_index).structure_version_id := l_ta_structure_version_tbl(i);
4337 
4338 				ELSE -- IF rlm id is NULL
4339 					IF l_ta_resource_class_code_tbl(i) = 'PEOPLE' THEN
4340 						l_accum_people_qty := l_accum_people_qty + nvl(l_ta_total_plan_quantity_tbl(i),0);
4341 					ELSIF l_ta_resource_class_code_tbl(i) = 'EQUIPMENT' THEN
4342 						l_accum_equip_qty := l_accum_equip_qty + nvl(l_ta_total_plan_quantity_tbl(i),0);
4343 					ELSIF l_ta_resource_class_code_tbl(i) = 'MATERIAL_ITEMS' THEN
4344 						l_accum_mat_item_cost := l_accum_mat_item_cost + nvl(l_ta_total_proj_raw_cost_tbl(i),0);
4345 					ELSE
4346 						l_accum_fin_elem_cost := l_accum_fin_elem_cost + nvl(l_ta_total_proj_raw_cost_tbl(i),0);
4347 					END IF;
4348 
4349 				END IF; -- IF l_c_res_mem_id_tbl.exists(1) and l_c_res_mem_id_tbl(1) IS NOT NULL THEN
4350 
4351 			END LOOP; -- FOR i in 1..l_ta_resource_assgt_tbl.COUNT+1 LOOP
4352 
4353 
4354 			IF p_src_project_id <> p_target_project_id THEN
4355 
4356 				IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 3) THEN
4357 					pa_debug.g_err_stage:='TA: ' || L_FuncProc || ' Src project N.E. to target ' ;
4358 					pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
4359 				END IF;
4360 
4361 
4362 				--Get the task scheduled dates of all tasks in p_src_version_id_tbl
4363 				--Assign the dates to p_src_start_tbl, p_src_end_tbl
4364 				-- Bug 3850848
4365 				OPEN c_get_src_sched_dates;
4366 				FETCH c_get_src_sched_dates BULK COLLECT INTO l_t_src_elem_ver_id_tbl, l_t_src_start_tbl, l_t_src_end_tbl;
4367 				CLOSE c_get_src_sched_dates;
4368 
4369 				OPEN c_get_targ_sched_dates;
4370 				FETCH c_get_targ_sched_dates BULK COLLECT INTO l_t_target_elem_ver_id_tbl, l_t_target_start_tbl, l_t_target_end_tbl;
4371 				CLOSE c_get_targ_sched_dates;
4372 
4373 				-- Bug 3850848
4374 				IF p_src_elem_ver_id_tbl.COUNT > 0 THEN
4375 					-- Bug3820625
4376 					l_adj_src_t_start_tbl.extend(p_src_elem_ver_id_tbl.COUNT);
4377 					l_adj_src_t_end_tbl.extend(p_src_elem_ver_id_tbl.COUNT);
4378 					FOR src_index IN 1..p_src_elem_ver_id_tbl.COUNT LOOP
4379 						FOR src_date_index IN 1..l_t_src_elem_ver_id_tbl.COUNT LOOP
4380 							IF p_src_elem_ver_id_tbl(src_index) = l_t_src_elem_ver_id_tbl(src_date_index) THEN
4381 								-- Bug3820625
4382 								--l_adj_src_t_start_tbl.extend(1);
4383 								--l_adj_src_t_end_tbl.extend(1);
4384 								l_adj_src_t_start_tbl(src_index) := l_t_src_start_tbl(src_date_index);
4385 								l_adj_src_t_end_tbl(src_index) := l_t_src_end_tbl(src_date_index);
4386 							END IF;
4387 						END LOOP; -- FOR src_date_index IN 1..l_t_src_elem_ver_id_tbl.COUNT LOOP
4388 					END LOOP; --FOR src_index IN 1..p_src_elem_ver_id_tbl.COUNT LOOP
4389 				END IF; -- IF p_src_elem_ver_id_tbl.COUNT > 0 THEN
4390 
4391 				IF p_targ_elem_ver_id_tbl.COUNT > 0 THEN
4392 					-- Bug3820625
4393 					l_adj_tar_t_start_tbl.extend(p_targ_elem_ver_id_tbl.COUNT);
4394 					l_adj_tar_t_end_tbl.extend(p_targ_elem_ver_id_tbl.COUNT);
4395 					FOR target_index IN 1..p_targ_elem_ver_id_tbl.COUNT LOOP
4396 						FOR target_date_index IN 1..l_t_target_elem_ver_id_tbl.COUNT LOOP
4397 							IF p_targ_elem_ver_id_tbl(target_index) = l_t_target_elem_ver_id_tbl(target_date_index) THEN
4398 							-- Bug3820625
4399 							--l_adj_tar_t_start_tbl.extend(1);
4400 							--l_adj_tar_t_end_tbl.extend(1);
4401 							l_adj_tar_t_start_tbl(target_index) := l_t_target_start_tbl(target_date_index);
4402 							l_adj_tar_t_end_tbl(target_index) := l_t_target_end_tbl(target_date_index);
4403 							END IF;
4404 						END LOOP; -- FOR src_date_index IN 1..l_t_src_elem_ver_id_tbl.COUNT LOOP
4405 					END LOOP; --FOR src_index IN 1..p_src_elem_ver_id_tbl.COUNT LOOP
4406 				END IF; -- IF p_src_elem_ver_id_tbl.COUNT > 0 THEN
4407 				-- End of Bug 3850848
4408 
4409 			END IF; -- IF p_src_project_id <> p_target_project_id THEN
4410 
4411 
4412 			IF ( l_adj_src_t_start_tbl.COUNT > 0 AND l_adj_tar_t_start_tbl.COUNT > 0 ) OR
4413 			   ( l_adj_src_t_start_tbl.COUNT > 0 AND l_adj_tar_t_end_tbl.COUNT > 0 ) THEN
4414 
4415 				FOR k in 1..l_adj_src_t_start_tbl.COUNT LOOP
4416 
4417 					IF l_adj_src_t_start_tbl(k) <> l_adj_tar_t_start_tbl(k) OR
4418 					   l_adj_src_t_end_tbl(k) <> l_adj_tar_t_end_tbl(k) THEN
4419 
4420 
4421 						IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 3) THEN
4422 							pa_debug.g_err_stage:='TA: ' || L_FuncProc || ' adjusting dates here ' ;
4423 							pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
4424 						END IF;
4425 
4426 						x_calculate_flag := 'Y';
4427 
4428 
4429                                                 -- Clear pa_copy_asgmt_temp before calling Adjust_Asgmt_Dates
4430                                                 -- since this temp table is also being used.
4431                                                 DELETE pa_copy_asgmts_temp;
4432 
4433 						Adjust_Asgmt_Dates(
4434 							p_context                => 'COPY',
4435 							p_element_version_id     => p_src_elem_ver_id_tbl(k),
4436 							p_old_task_sch_start     => l_adj_src_t_start_tbl(k),
4437 							p_new_task_sch_start     => l_adj_tar_t_start_tbl(k),
4438 							p_new_task_sch_finish    => l_adj_tar_t_end_tbl(k),
4439 							x_res_assignment_id_tbl  => l_c_resource_assgt_tbl,
4440 							x_planning_start_tbl     => l_c_schedule_start_tbl,
4441 							x_planning_end_tbl       => l_c_schedule_end_tbl,
4442 							x_return_status          => x_return_status);
4443 
4444 						IF x_return_status = FND_API.G_RET_STS_ERROR THEN
4445 							RAISE FND_API.G_EXC_ERROR;
4446 						ELSIF x_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
4447 							RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4448 						END IF;
4449 
4450 						IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 3) THEN
4451 							pa_debug.g_err_stage:= 'TA: ' || L_FuncProc || ' Returned count on adjust: ' || l_c_resource_assgt_tbl.COUNT ;
4452 							pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
4453 						END IF;
4454 
4455 						FOR i in 1..x_resource_rec_tbl.COUNT LOOP
4456 
4457 							FOR j in 1..l_c_resource_assgt_tbl.COUNT LOOP
4458 
4459 								IF x_resource_rec_tbl(i).resource_assignment_id = l_c_resource_assgt_tbl(j) THEN
4460 
4461 									x_resource_rec_tbl(i).project_assignment_id  := -1;
4462 									-- IB2 Unplanned Actual changes
4463 									x_resource_rec_tbl(i).schedule_start_date     := l_c_schedule_start_tbl(j);
4464 									x_resource_rec_tbl(i).schedule_end_date := l_c_schedule_end_tbl(j);
4465 									-- Bug 3850848
4466 									-- make planning dates equal to scheduled dates
4467 									x_resource_rec_tbl(i).planning_start_date := l_c_schedule_start_tbl(j);
4468 									x_resource_rec_tbl(i).planning_end_date := l_c_schedule_end_tbl(j);
4469 
4470 									IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 3) THEN
4471 										PA_DEBUG.write(x_module      => L_Module,
4472 										        x_msg         => '1: x_resource_rec_tbl(' || i || ').planning_start_date: ' || x_resource_rec_tbl(i).planning_start_date,
4473 										        x_log_level   => 3);
4474 										PA_DEBUG.write(x_module      => L_Module,
4475 										        x_msg         => '1: x_resource_rec_tbl(' || i || ').planning_end_date: ' || x_resource_rec_tbl(i).planning_end_date,
4476 										        x_log_level   => 3);
4477 									END IF;
4478 
4479 								END IF; -- IF x_resource_rec_tbl(i).resource_assignment_id = l_c_resource_assgt_tbl(j) THEN
4480 
4481 							END LOOP; -- FOR j in 1..l_c_resource_assgt_tbl.COUNT LOOP
4482 
4483 /*
4484 -- Bug 4541039: Task level effort assignment should be treated in the same way
4485 
4486 							IF l_ta_display_flag_tbl(i) = 'N' THEN
4487 
4488 								-- IB2 Unplanned Actual changes
4489 								x_resource_rec_tbl(i).schedule_start_date := l_adj_tar_t_start_tbl(k);
4490 								x_resource_rec_tbl(i).schedule_end_date := l_adj_tar_t_end_tbl(k);
4491                                                                 x_resource_rec_tbl(i).planning_start_date := l_adj_tar_t_start_tbl(k);
4492                                                                 x_resource_rec_tbl(i).planning_end_date := l_adj_tar_t_end_tbl(k);
4493                                                                 --Bug 4188138
4494 								-- Planning dates should be shifted according to the task dates
4495 								--x_resource_rec_tbl(i).planning_start_date := x_resource_rec_tbl(i).planning_start_date + (l_adj_tar_t_start_tbl(k) - l_adj_src_t_start_tbl(k));
4496 								--x_resource_rec_tbl(i).planning_end_date := x_resource_rec_tbl(i).planning_end_date + (l_adj_tar_t_start_tbl(k) - l_adj_src_t_start_tbl(k));
4497 
4498 								IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 3) THEN
4499 	                                PA_DEBUG.write(x_module      => L_Module,
4500 	                                               x_msg         => '2: l_adj_tar_t_start_tbl(k): ' || l_adj_tar_t_start_tbl(k),
4501 	                                               x_log_level   => 3);
4502 	                                PA_DEBUG.write(x_module      => L_Module,
4503 	                                               x_msg         => '2: l_adj_src_t_start_tbl(k): ' || l_adj_src_t_start_tbl(k),
4504 	                                               x_log_level   => 3);
4505 	                                PA_DEBUG.write(x_module      => L_Module,
4506 	                                               x_msg         => '2: x_resource_rec_tbl(' || i || ').planning_start_date: ' || x_resource_rec_tbl(i).planning_start_date,
4507 	                                               x_log_level   => 3);
4508 	                                PA_DEBUG.write(x_module      => L_Module,
4509 	                                               x_msg         => '2: x_resource_rec_tbl(' || i || ').planning_end_date: ' || x_resource_rec_tbl(i).planning_end_date,
4510 	                                               x_log_level   => 3);
4511 								END IF;
4512 
4513 								IF x_resource_rec_tbl(i).planning_start_date > x_resource_rec_tbl(i).schedule_start_date THEN
4514 									x_resource_rec_tbl(i).planning_start_date := x_resource_rec_tbl(i).schedule_start_date;
4515 								END IF;
4516 
4517 								IF x_resource_rec_tbl(i).planning_end_date < x_resource_rec_tbl(i).schedule_end_date THEN
4518 									x_resource_rec_tbl(i).planning_end_date := x_resource_rec_tbl(i).schedule_end_date;
4519 								END IF;
4520 
4521 								IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 3) THEN
4522 	                                PA_DEBUG.write(x_module      => L_Module,
4523 	                                               x_msg         => '3: x_resource_rec_tbl(' || i || ').planning_start_date: ' || x_resource_rec_tbl(i).planning_start_date,
4524 	                                               x_log_level   => 3);
4525 	                                PA_DEBUG.write(x_module      => L_Module,
4526 	                                               x_msg         => '3: x_resource_rec_tbl(' || i || ').planning_end_date: ' || x_resource_rec_tbl(i).planning_end_date,
4527 	                                               x_log_level   => 3);
4528 								END IF;
4529 
4530 							END IF; -- IF l_ta_display_flag_tbl(i) = 'N' THEN
4531 -- End of Bug 4541039
4532 */
4533 
4534 						END LOOP; -- FOR i in 1..x_resource_rec_tbl.COUNT LOOP
4535 
4536 					END IF; -- l_adj_src_t_*_tbl(k) <> l_adj_tar_t_*_tbl(k)
4537 
4538 				END LOOP; -- FOR k in 1..l_t_src_start_tbl.COUNT LOOP
4539 
4540 			END IF; -- l_adj_*_t_*_tbl.COUNT > 0
4541 
4542                         -- Bug 4200146: Should call add_planning_transaction once only instead for each task
4543 	                IF l_add_res_list_member_id_tbl.COUNT > 0 THEN
4544 
4545 
4546 				IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 3) THEN
4547 					PA_DEBUG.write(x_module      => L_Module,
4548 						       x_msg         => 'Calling Add_Planning_Transactions',
4549 						       x_log_level   => 3);
4550 					PA_DEBUG.write(x_module      => L_Module,
4551 						       x_msg         => 'p_project_id: ' || p_target_project_id,
4552 						       x_log_level   => 3);
4553 					PA_DEBUG.write(x_module      => L_Module,
4554 						       x_msg         => 'p_budget_version_id: ' || l_target_budget_version_id,
4555 						       x_log_level   => 3);
4556 					PA_DEBUG.write(x_module      => L_Module,
4557 						       x_msg         => 'p_struct_elem_version_id: ' || l_target_structure_version_id,
4558 						       x_log_level   => 3);
4559 					FOR temp_i IN 1..l_add_elem_version_id_tbl.COUNT LOOP
4560 
4561 						PA_DEBUG.write(x_module      => L_Module,
4562 							       x_msg         => 'p_task_elem_version_id_tbl(' || temp_i || '): ' || l_add_elem_version_id_tbl(temp_i),
4563 							       x_log_level   => 3);
4564 					END LOOP;
4565 					FOR temp_i IN 1..l_add_res_list_member_id_tbl.COUNT LOOP
4566 
4567 								PA_DEBUG.write(x_module      => L_Module,
4568 								               x_msg         => 'p_resource_list_member_id_tbl(' || temp_i || '): ' || l_add_res_list_member_id_tbl(temp_i),
4569 								               x_log_level   => 3);
4570 
4571 					END LOOP;
4572 					FOR temp_i IN 1..l_add_qty_tbl.COUNT LOOP
4573 
4574 								PA_DEBUG.write(x_module      => L_Module,
4575 								               x_msg         => 'p_quantity_tbl(' || temp_i || '): ' || l_add_qty_tbl(temp_i),
4576 								               x_log_level   => 3);
4577 					END LOOP;
4578 					FOR temp_i IN 1..l_add_raw_cost_tbl.COUNT LOOP
4579 								PA_DEBUG.write(x_module      => L_Module,
4580 								               x_msg         => 'p_raw_cost_tbl(' || temp_i || '): ' || l_add_raw_cost_tbl(temp_i),
4581 								               x_log_level   => 3);
4582 					END LOOP;
4583 				END IF; -- P_DEBUG_MODE = 'Y' AND (li_curr_level <= 3)
4584 
4585 
4586                                 -- Set this mask flag to prevent PJI rollup
4587                                 PA_TASK_PUB1.G_CALL_PJI_ROLLUP := 'N';
4588 
4589 				PA_FP_PLANNING_TRANSACTION_PUB.Add_Planning_Transactions(
4590 							p_context                     => 'TASK_ASSIGNMENT',
4591                                                         p_one_to_one_mapping_flag     => 'Y',
4592 							p_project_id                  => p_target_project_id,
4593 							p_budget_version_id           => l_target_budget_version_id,
4594 							p_struct_elem_version_id      => l_target_structure_version_id,
4595 							p_task_elem_version_id_tbl    => l_add_elem_version_id_tbl,
4596 							p_resource_list_member_id_tbl => l_add_res_list_member_id_tbl,
4597 							p_quantity_tbl                => l_add_qty_tbl,
4598 							p_raw_cost_tbl                => l_add_raw_cost_tbl,
4599 							-- Bug 3951947 use the project functional currency code
4600 							p_currency_code_tbl           => l_add_projfunc_cur_code_tbl,
4601 							x_return_status               => x_return_status,
4602 							x_msg_count                   => l_msg_count,
4603 							x_msg_data                    => l_msg_data);
4604 
4605                                 PA_TASK_PUB1.G_CALL_PJI_ROLLUP := null;
4606 
4607 				IF x_return_status = FND_API.G_RET_STS_ERROR THEN
4608 					RAISE FND_API.G_EXC_ERROR;
4609 				ELSIF x_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
4610 					RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4611 				END IF;
4612 
4613 				IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 3) THEN
4614 					pa_debug.g_err_stage:='TA: ' || L_FuncProc || 'Add_Planning_Transactions return status: ' || x_return_status;
4615 					pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
4616 				END IF;
4617 			END IF; -- IF l_add_res_list_member_id_tbl.COUNT > 0 THEN
4618                         -- End of Bug 4200146
4619 
4620 			-- Bug 3974569.
4621 			IF (p_copy_external_flag = 'Y') AND
4622 			   (l_tar_rbs_ver_id IS NOT NULL) AND -- Bug 4043709
4623 			   ((l_src_rbs_ver_id <> l_tar_rbs_ver_id) OR (l_src_resource_list_id <> l_target_resource_list_id)) THEN
4624 
4625 				x_rbs_diff_flag := 'Y';
4626 
4627 				PA_RLMI_RBS_MAP_PUB.Map_Rlmi_Rbs(
4628 					p_budget_version_id           => l_tar_bvid,
4629 					p_resource_list_id            => l_target_resource_list_id,
4630 					p_rbs_version_id              => l_tar_rbs_ver_id,
4631 					p_calling_process             => 'RBS_REFRESH',
4632 					p_calling_context             => 'PLSQL',
4633 					p_process_code                => 'RBS_MAP',
4634 					p_calling_mode                => 'PLSQL_TABLE',
4635 					p_init_msg_list_flag          => 'N',
4636 					p_commit_flag                 => 'N',
4637 					p_txn_source_id_tab           => l_ta_resource_assgt_tbl,
4638 					p_txn_source_type_code_tab    => l_txn_source_type_code_tbl,
4639 					p_person_id_tab               => l_person_id_tbl,
4640 					p_job_id_tab                  => l_job_id_tbl,
4641 					p_organization_id_tab         => l_organization_id_tbl,
4642 					p_vendor_id_tab               => l_supplier_id_tbl,
4643 					p_expenditure_type_tab        => l_expenditure_type_tbl,
4644 					p_event_type_tab              => l_event_type_tbl,
4645 					p_expenditure_category_tab    => l_expenditure_category_tbl,
4646 					p_revenue_category_code_tab   => l_revenue_category_code_tbl,
4647 					p_project_role_id_tab         => l_project_role_id_tbl,
4648 					p_resource_class_code_tab     => l_ta_resource_class_code_tbl,
4649 					p_item_category_id_tab        => l_item_category_id_tbl,
4650 					p_person_type_code_tab        => l_person_type_code_tbl,
4651 					p_bom_resource_id_tab         => l_bom_resource_id_tbl,
4652 					p_non_labor_resource_tab      => l_non_labor_resource_tbl,
4653 					p_inventory_item_id_tab       => l_inventory_item_id_tbl,
4654 					x_txn_source_id_tab           => l_txn_source_id_tab,
4655 					x_res_list_member_id_tab      => l_res_list_member_id_tab,
4656 					x_rbs_element_id_tab          => l_rbs_element_id_tab,
4657 					x_txn_accum_header_id_tab     => l_txn_accum_header_id_tab,
4658 					x_return_status               => x_return_status,
4659 					x_msg_count                   => l_msg_count,
4660 					x_msg_data                    => l_msg_data);
4661 
4662 				IF x_return_status = FND_API.G_RET_STS_ERROR THEN
4663 					RAISE FND_API.G_EXC_ERROR;
4664 				ELSIF x_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
4665 					RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4666 				END IF;
4667 
4668 			END IF;
4669 			-- \Bug 3974569.
4670 
4671 		END IF; -- l_ta_resource_assgt_tbl.COUNT > 0
4672 
4673 	END IF; -- p_src_elem_ver_id_tbl IS NOT NULL
4674 
4675 	IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 3) THEN
4676 		FOR temp_i IN 1..x_resource_rec_tbl.COUNT LOOP
4677 			PA_DEBUG.write(x_module      => L_Module,
4678 			               x_msg         => 'x_resource_rec_tbl(' || temp_i || ').resource_assignment_id: ' || x_resource_rec_tbl(temp_i).resource_assignment_id,
4679 			               x_log_level   => 3);
4680 			PA_DEBUG.write(x_module      => L_Module,
4681 			               x_msg         => 'x_resource_rec_tbl(' || temp_i || ').resource_list_member_id: ' || x_resource_rec_tbl(temp_i).resource_list_member_id,
4682 			               x_log_level   => 3);
4683 			PA_DEBUG.write(x_module      => L_Module,
4684 			               x_msg         => 'x_resource_rec_tbl(' || temp_i || ').total_quantity: ' || x_resource_rec_tbl(temp_i).total_quantity,
4685 			               x_log_level   => 3);
4686 			PA_DEBUG.write(x_module      => L_Module,
4687 			               x_msg         => 'x_resource_rec_tbl(' || temp_i || ').total_raw_cost: ' || x_resource_rec_tbl(temp_i).total_raw_cost,
4688 			               x_log_level   => 3);
4689 			PA_DEBUG.write(x_module      => L_Module,
4690 			               x_msg         => 'x_resource_rec_tbl(' || temp_i || ').schedule_start_date: ' || x_resource_rec_tbl(temp_i).schedule_start_date,
4691 			               x_log_level   => 3);
4692 			PA_DEBUG.write(x_module      => L_Module,
4693 			               x_msg         => 'x_resource_rec_tbl(' || temp_i || ').schedule_end_date: ' || x_resource_rec_tbl(temp_i).schedule_end_date,
4694 			               x_log_level   => 3);
4695 			PA_DEBUG.write(x_module      => L_Module,
4696 			               x_msg         => 'x_resource_rec_tbl(' || temp_i || ').planning_start_date: ' || x_resource_rec_tbl(temp_i).planning_start_date,
4697 			               x_log_level   => 3);
4698 			PA_DEBUG.write(x_module      => L_Module,
4699 			               x_msg         => 'x_resource_rec_tbl(' || temp_i || ').planning_end_date: ' || x_resource_rec_tbl(temp_i).planning_end_date,
4700 			               x_log_level   => 3);
4701 
4702 		END LOOP; -- FOR temp_i IN 1..x_resource_rec_tbl.COUNT LOOP
4703 
4704 
4705 		pa_debug.g_err_stage:='End of TA: ' || L_FuncProc;
4706 		pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
4707 
4708 	END IF;
4709 
4710 	IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 3) THEN
4711 		pa_debug.g_err_stage:= 'x_calculate_flag :=' || x_calculate_flag;
4712 		pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
4713 	END IF;
4714 
4715         -- should clear this temporary table after being used since the table will be
4716         -- reused in adjust_asgmt_date right away in the same session in publishing flow.
4717         -- Otherwise, publishing flow may error out.
4718         DELETE pa_copy_asgmts_temp;
4719 
4720 EXCEPTION
4721 
4722 	WHEN FND_API.G_EXC_ERROR THEN
4723 		x_return_status := FND_API.G_RET_STS_ERROR;
4724                 DELETE pa_copy_asgmts_temp;
4725 		IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 5) THEN
4726 			PA_DEBUG.write_log (x_module => L_Module,
4727 								x_msg         => 'Error:' || L_FuncProc || SQLERRM,
4728 								x_log_level   => 5);
4729 		END IF;
4730 
4731 	WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
4732 		x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4733                 DELETE pa_copy_asgmts_temp;
4734 		IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 6) THEN
4735 			PA_DEBUG.write_log (x_module => L_Module,
4736 								x_msg         => 'Unexpected Error:' || L_FuncProc || SQLERRM,
4737 								x_log_level   => 6);
4738 		END IF;
4739 		RAISE;
4740 
4741 	WHEN OTHERS THEN
4742 		x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4743                 DELETE pa_copy_asgmts_temp;
4744                 PA_TASK_PUB1.G_CALL_PJI_ROLLUP := null;
4745 		IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 6) THEN
4746 			PA_DEBUG.write_log (x_module => L_Module,
4747 								x_msg         => 'Unexpected Error:' || L_FuncProc || SQLERRM,
4748 								x_log_level   => 6);
4749 		END IF;
4750 		FND_MSG_PUB.add_exc_msg( p_pkg_name       => L_Module,
4751 								 p_procedure_name => L_FuncProc);
4752 		RAISE;
4753 
4754 END Validate_Copy_Assignment;
4755 
4756 
4757 
4758 
4759 
4760 -- This function will Validates the Planning Resources for a Workplan
4761 
4762 FUNCTION Validate_Pl_Res_For_WP( p_resource_list_member_id  IN   NUMBER ) RETURN VARCHAR2 IS
4763 
4764 
4765 
4766 CURSOR C_pl_check(p_res_list_member_id IN NUMBER) IS
4767 
4768 select par.alias, restype.name Res_type from  pa_resource_list_members par,
4769 
4770 pa_res_types_vl restype
4771 
4772 where par.fc_res_type_code = restype.RES_TYPE_CODE
4773 
4774 and par.resource_list_member_id =  p_res_list_member_id;
4775 
4776 
4777 
4778 R_Pl_Check C_Pl_Check%ROWTYPE;
4779 
4780 L_FuncProc varchar2(250) ;
4781 
4782 BEGIN
4783 
4784 L_FuncProc := 'Validate_Pl_Res_For_WP';
4785 
4786 
4787 
4788 IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 3) THEN
4789 	pa_debug.g_err_stage:='Entering: ' || L_FuncProc;
4790 	pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
4791 END IF;
4792 
4793 
4794 IF p_resource_list_member_id is NOT NULL AND
4795    p_resource_list_member_id <> FND_API.G_MISS_NUM THEN
4796 
4797 
4798 IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 3) THEN
4799 	pa_debug.g_err_stage:='B4 query : ' || L_FuncProc;
4800 	pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
4801 END IF;
4802 
4803 
4804   OPEN C_Pl_Check(p_resource_list_member_id);
4805   FETCH C_Pl_Check into R_Pl_Check;
4806   CLOSE C_Pl_Check;
4807 
4808 
4809 
4810 	IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 3) THEN
4811 		pa_debug.g_err_stage:='A4 Query: ' || L_FuncProc;
4812 		pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
4813 	END IF;
4814 
4815 
4816   IF R_Pl_Check.res_type in ('REVENUE_CATEGORY', 'EVENT_TYPE') THEN
4817 
4818 
4819 
4820        PA_UTILS.ADD_MESSAGE
4821 
4822                                (p_app_short_name => 'PA',
4823 
4824                                 p_msg_name       => 'PA_PL_RES_FC_RES_TYPE_ERR',
4825 
4826                                 p_token1         => 'PLANNING_RESOURCE',
4827 
4828                                 p_value1         =>  R_Pl_Check.alias,
4829 
4830 								p_token2         => 'RES_TYPE',
4831 
4832                                 p_value2         =>  R_Pl_Check.Res_type
4833 
4834                                 );
4835 
4836 		IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 3) THEN
4837 		   pa_debug.g_err_stage:='Wrong Res type: ' || L_FuncProc;
4838 	       pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
4839 		END IF;
4840 
4841 	   RETURN 'N';
4842 
4843   END IF;
4844 
4845 
4846 
4847 END IF;
4848 
4849 
4850 
4851 RETURN 'Y';
4852 
4853 IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 3) THEN
4854 	pa_debug.g_err_stage:='End of TA: ' || L_FuncProc;
4855 	pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
4856 END IF;
4857 
4858 EXCEPTION
4859 
4860     WHEN NO_DATA_FOUND THEN
4861 
4862 	   IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 5) THEN
4863 
4864           PA_DEBUG.write_log (x_module => L_Module
4865 
4866                           ,x_msg         => 'Error:' || L_FuncProc || SQLERRM
4867 
4868                           ,x_log_level   => 5);
4869 
4870         END IF;
4871 
4872       RETURN 'N';
4873 
4874     WHEN OTHERS THEN
4875 
4876 	  IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 6) THEN
4877 
4878           PA_DEBUG.write_log (x_module => L_Module
4879 
4880                           ,x_msg         => 'Error:' || L_FuncProc || SQLERRM
4881 
4882                           ,x_log_level   => 6);
4883 
4884         END IF;
4885 
4886       FND_MSG_PUB.add_exc_msg( p_pkg_name       => L_Module,
4887 
4888                                p_procedure_name => L_FuncProc);
4889 
4890     RAISE;
4891 
4892 END Validate_Pl_Res_For_WP;
4893 
4894 
4895 
4896 
4897 
4898 
4899 
4900 -- This function will Validate whether a financial category is valid for workplan
4901 
4902 -- Returns error if the given fc_res_type_code is 'REVENUE_CATEGORY' or 'EVENT_TYPE'.
4903 
4904 
4905 
4906 FUNCTION Validate_Fin_Cat_For_WP( p_fc_res_type_code  IN  VARCHAR2) RETURN VARCHAR2 IS
4907 
4908 CURSOR C_Fc_Check(p_fc_res_type_code  IN VARCHAR2) IS
4909 
4910 select restype.name Res_type from
4911 
4912 pa_res_types_vl restype
4913 
4914 where p_fc_res_type_code = restype.RES_TYPE_CODE;
4915 
4916 
4917 
4918 R_Fc_Check C_Fc_Check%ROWTYPE;
4919 
4920 L_FuncProc varchar2(250) ;
4921 
4922 BEGIN
4923 
4924 L_FuncProc := 'Validate_Fin_Cat_For_WP';
4925 
4926 
4927 
4928 IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 3) THEN
4929 	pa_debug.g_err_stage:='Entering: ' || L_FuncProc;
4930 	pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
4931 END IF;
4932 
4933 
4934 IF p_fc_res_type_code is NOT NULL AND
4935 
4936    p_fc_res_type_code <> FND_API.G_MISS_CHAR THEN
4937 
4938 
4939 
4940   OPEN C_Fc_Check(p_fc_res_type_code);
4941 
4942   FETCH C_Fc_Check into R_Fc_Check;
4943 
4944   CLOSE C_Fc_Check;
4945 
4946 
4947 
4948 
4949 
4950   IF p_fc_res_type_code in ('REVENUE_CATEGORY', 'EVENT_TYPE') THEN
4951 
4952 
4953 
4954        PA_UTILS.ADD_MESSAGE(p_app_short_name => 'PA',
4955 
4956                                 p_msg_name       => 'PA_FC_RES_TYPE_ERR',
4957 
4958 								p_token1         => 'RES_TYPE',
4959 
4960                                 p_value1         =>  R_Fc_Check.Res_type
4961 
4962                                 );
4963 
4964 		RETURN 'N';
4965 
4966   END IF;
4967 
4968 
4969 
4970 END IF;
4971 
4972 
4973 
4974 RETURN 'Y';
4975 
4976 IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 3) THEN
4977 	pa_debug.g_err_stage:='End of TA: ' || L_FuncProc;
4978 	pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
4979 END IF;
4980 
4981 EXCEPTION
4982 
4983     WHEN NO_DATA_FOUND THEN
4984 
4985 	   IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 5) THEN
4986 
4987           PA_DEBUG.write_log (x_module => L_Module
4988 
4989                           ,x_msg         => 'Error:' || L_FuncProc || SQLERRM
4990 
4991                           ,x_log_level   => 5);
4992 
4993         END IF;
4994 
4995       RETURN 'N';
4996 
4997     WHEN OTHERS THEN
4998 
4999 	  IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 6) THEN
5000 
5001           PA_DEBUG.write_log (x_module => L_Module
5002 
5003                           ,x_msg         => 'Error:' || L_FuncProc || SQLERRM
5004 
5005                           ,x_log_level   => 6);
5006 
5007         END IF;
5008 
5009       FND_MSG_PUB.add_exc_msg( p_pkg_name       => L_Module,
5010 
5011                                p_procedure_name => L_FuncProc);
5012 
5013     RAISE;
5014 
5015 END Validate_Fin_Cat_For_WP;
5016 
5017 
5018 
5019 
5020 
5021 
5022 
5023 
5024 
5025 FUNCTION Get_WP_Resource_List_Id(
5026 
5027             p_project_id         IN   NUMBER)
5028 
5029 RETURN   pa_proj_fp_options.all_resource_list_id%TYPE
5030 
5031 IS
5032 
5033 L_FuncProc varchar2(250) ;
5034 
5035 CURSOR get_res_list_id IS
5036 
5037 select cost_Resource_list_id
5038 
5039 from   pa_proj_fp_options
5040 
5041 where fin_plan_type_id = (select fin_plan_type_id
5042 
5043                           from pa_fin_plan_types_b
5044 
5045 			  where use_for_workplan_flag = 'Y')
5046 
5047 and project_id = p_project_id
5048 
5049 and fin_plan_option_level_code = 'PLAN_TYPE';
5050 
5051 
5052 
5053 l_bv_id NUMBER;
5054 
5055 l_resource_list_id NUMBER := NULL;
5056 
5057 
5058 
5059 BEGIN
5060 
5061 
5062 
5063   -- Get the workplan resource list id
5064 
5065   OPEN get_res_list_id;
5066 
5067   FETCH get_res_list_id INTO l_resource_list_id;
5068 
5069   CLOSE get_res_list_id;
5070 
5071 
5072 
5073   RETURN l_resource_list_id;
5074 
5075 
5076 
5077 END Get_WP_Resource_List_Id;
5078 
5079 
5080 
5081 FUNCTION Check_Edit_Task_Ok(P_PROJECT_ID        IN NUMBER default NULL,
5082   P_STRUCTURE_VERSION_ID    IN NUMBER default NULL,
5083   P_CURR_STRUCT_VERSION_ID IN NUMBER default NULL,
5084   P_Element_Id IN NUMBER default NULL,
5085   P_Element_Version_Id IN NUMBER default NULL,
5086   P_Task_Assignment_Id IN NUMBER default NULL) RETURN VARCHAR2
5087 
5088   IS
5089 
5090   L_FuncProc varchar2(250) ;
5091   L_status varchar2(1);
5092   M_status varchar2(1);
5093   Process_Status varchar2(20);
5094   l_structure_version_id number;
5095   l_project_id number;
5096   l_wbs_element_version_id number;
5097 
5098   CURSOR C_Wbs_Element_Version_Id(p_resource_assignment_id IN NUMBER) IS
5099    SELECT wbs_element_version_id
5100    FROM pa_resource_assignments
5101    WHERE resource_assignment_id = p_resource_assignment_id;
5102 
5103   CURSOR C_structure_Version_Id(p_element_version_id IN NUMBER) IS
5104    SELECT parent_structure_version_id, project_id
5105    from pa_proj_element_versions
5106    where element_version_id = p_element_version_id;
5107 
5108 -- Begin fix for Bug # 4373055.
5109   l_str_ver_id	 	NUMBER:= null;
5110   l_conc_request_id	NUMBER := null;
5111   l_message_name  VARCHAR2(30) := null;
5112   l_message_type  VARCHAR2(30) := null;
5113 -- End fix for Bug # 4373055.
5114 
5115   BEGIN
5116 
5117   L_FuncProc := 'Check_Edit_Task_Ok';
5118 
5119   IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 3) THEN
5120 	pa_debug.g_err_stage:='Entering: ' || L_FuncProc;
5121 	pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
5122   END IF;
5123 
5124   IF P_structure_version_id is null or
5125      P_Project_Id is null THEN
5126 
5127      IF P_Element_Version_Id  IS NULL THEN
5128        OPEN C_Wbs_Element_Version_Id(p_task_assignment_id);
5129        FETCH C_Wbs_Element_Version_Id INTO l_wbs_element_version_id;
5130        CLOSE C_Wbs_Element_Version_Id;
5131      ELSE
5132        l_wbs_element_version_id := P_Element_Version_Id ;
5133      END IF;
5134 
5135      OPEN C_Structure_Version_Id(l_wbs_element_version_id);
5136      FETCH C_Structure_Version_Id INTO l_structure_version_id, l_project_id;
5137      CLOSE C_Structure_Version_Id;
5138 
5139   ELSE
5140 
5141      L_Structure_Version_Id := p_structure_version_id;
5142      L_Project_Id           := p_project_id;
5143 
5144   END IF;
5145 
5146   L_Status := pa_proj_elements_utils.check_edit_task_ok(
5147               P_PROJECT_ID                => l_project_id,
5148               P_STRUCTURE_VERSION_ID      => l_structure_version_id,
5149               P_CURR_STRUCT_VERSION_ID    => l_structure_version_id,
5150               p_require_lock_flag         => 'N',
5151               p_add_error_flag            => 'Y' -- Bug 4533152
5152               ) ;
5153 
5154   IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 3) THEN
5155 	pa_debug.g_err_stage:='g_apply_progress_flag='||g_apply_progress_flag;
5156 	pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
5157   END IF;
5158 
5159   IF L_Status = 'N' then
5160 
5161     RETURN 'N';
5162 
5163   -- Bug 4286558
5164   -- skip progress update check in apply progress mode
5165   -- because apply progress can be done within process update
5166   ELSIF g_apply_progress_flag = 'Y' THEN
5167 
5168    RETURN 'Y';
5169 
5170   ELSE
5171 
5172    IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 3) THEN
5173 	pa_debug.g_err_stage:='check process update';
5174 	pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
5175    END IF;
5176 
5177    M_Status := PA_PROJECT_STRUCTURE_UTILS.GET_UPDATE_WBS_FLAG(
5178                P_PROJECT_ID         => l_project_id,
5179                P_STRUCTURE_VERSION_ID    => l_structure_version_id);
5180 
5181    IF (M_Status = 'Y') THEN
5182 
5183 -- Begin fix for Bug # 4373055.
5184 
5185 /*
5186      Process_Status :=  PA_PROJECT_STRUCTURE_UTILS.GET_PROCESS_STATUS_CODE(
5187                P_PROJECT_ID         => l_project_id,
5188                P_STRUCTURE_VERSION_ID    => l_structure_version_id);
5189 
5190 
5191        -- Confirmed w/Sakthi to use Structure Version & not project leve for TA
5192        -- jraj
5193        --As above is being used for a particular Structure version basis perspective..
5194        --Only on Task level, one would go on project level as P_STRUCTURE_TYPE     => 'WORKPLAN');
5195 
5196      IF Process_Status = 'WUE' THEN
5197         L_Status := 'Y';
5198      ELSIF Process_Status is NULL THEN
5199         L_Status := 'Y';
5200      ELSIF Process_Status = 'WUP' THEN
5201         L_Status := 'N';
5202      END IF;
5203 
5204 */
5205 
5206         PA_PROJECT_STRUCTURE_UTILS.GET_PROCESS_STATUS_MSG(
5207         p_project_id              => l_project_id
5208         , p_structure_type        => NULL
5209         , p_structure_version_id  => l_structure_version_id
5210         , p_context               => null
5211         , x_message_name          => l_message_name
5212         , x_message_type          => l_message_type
5213         , x_structure_version_id  => l_str_ver_id
5214         , x_conc_request_id       => l_conc_request_id);
5215 
5216 
5217 	IF l_message_type = 'ERROR' THEN
5218           L_Status := 'Y';
5219 	ELSIF l_message_type = 'PROCESS' THEN
5220           L_Status := 'N';
5221           -- Bug 4533152
5222           PA_UTILS.ADD_MESSAGE
5223                     (p_app_short_name => 'PA',
5224                      p_msg_name       => 'PA_PS_UDTWBS_PRC_INPROC');
5225           -- End of Bug 4533152
5226 	ELSIF l_message_type is null THEN
5227           L_Status := 'Y';
5228 	END IF;
5229 
5230 -- End fix for Bug # 4373055.
5231 
5232    ELSIF (M_Status = 'N') THEN
5233 
5234      L_Status := 'Y';
5235 
5236    END IF;       --to implement..
5237 
5238   RETURN L_Status;
5239 
5240   END IF;
5241 
5242   IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 3) THEN
5243 	pa_debug.g_err_stage:='End of TA: ' || L_FuncProc;
5244 	pa_debug.write('PA_TASK_ASSIGNMENT_UTILS',pa_debug.g_err_stage,3);
5245   END IF;
5246 
5247 EXCEPTION
5248 
5249    WHEN NO_DATA_FOUND THEN
5250 
5251      IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 5) THEN
5252          PA_DEBUG.write_log (x_module => L_Module
5253                          ,x_msg         => 'Error:' || L_FuncProc || SQLERRM
5254                          ,x_log_level   => 5);
5255      END IF;
5256      RETURN 'N';
5257 
5258    WHEN OTHERS THEN
5259 
5260      IF P_DEBUG_MODE = 'Y' AND (li_curr_level <= 6) THEN
5261          PA_DEBUG.write_log (x_module => L_Module
5262                          ,x_msg         => 'Error:' || L_FuncProc || SQLERRM
5263                          ,x_log_level   => 6);
5264      END IF;
5265 
5266      FND_MSG_PUB.add_exc_msg( p_pkg_name       => L_Module,
5267                               p_procedure_name => L_FuncProc);
5268      RAISE;
5269 
5270 END ;
5271 
5272 
5273 
5274 
5275 
5276 FUNCTION Get_Min_Max_Task_Asgmt_Date(p_resource_list_member_id IN NUMBER, p_mode IN VARCHAR2,
5277 
5278   p_project_id IN NUMBER, p_budget_version_id IN NUMBER, p_unstaffed_only IN VARCHAR2 default 'N') RETURN DATE IS
5279 
5280   L_FuncProc varchar2(250) ;
5281 
5282   Cursor C_Min_Date IS
5283   select min(ra.SCHEDULE_START_DATE)
5284   from pa_resource_assignments ra
5285   where resource_list_member_id = p_resource_list_member_id
5286   and project_id = p_project_id
5287   and budget_version_id = p_budget_version_id
5288   and ('Y' <> p_unstaffed_only or nvl(project_assignment_id, -1) = -1);
5289 
5290   Cursor C_Max_Date IS
5291   select max(ra.SCHEDULE_END_DATE)
5292   from pa_resource_assignments ra
5293   where resource_list_member_id = p_resource_list_member_id
5294   and project_id = p_project_id
5295   and budget_version_id = p_budget_version_id
5296   and ('Y' <> p_unstaffed_only or nvl(project_assignment_id, -1) = -1);
5297 
5298   L_Date Date;
5299 
5300 
5301 
5302   BEGIN
5303 
5304 
5305 
5306   IF P_MODE = 'MIN' THEN
5307 
5308 
5309 
5310    OPEN C_Min_Date;
5311 
5312    Fetch C_Min_Date INTO L_DATE;
5313 
5314    CLOSE C_Min_Date;
5315 
5316    RETURN L_Date;
5317 
5318 
5319 
5320   ELSE
5321 
5322 
5323 
5324    OPEN C_Max_Date;
5325 
5326    Fetch C_Max_Date INTO L_DATE;
5327 
5328    CLOSE C_Max_Date;
5329 
5330    RETURN L_Date;
5331 
5332 
5333 
5334    END IF;
5335 
5336 
5337 
5338    END;
5339 
5340 
5341 /**
5342 Based on Resource Class find out Count of distinct UOM for a project, budget Version
5343 Author: JRAJ
5344 **/
5345 
5346 
5347 FUNCTION Get_Class_UOM(p_project_id IN NUMBER,
5348                        p_budget_version_id IN NUMBER,
5349 					   p_class IN VARCHAR2 )
5350 RETURN VARCHAR2 IS
5351 
5352 L_FuncProc varchar2(250) ;
5353 
5354 Cursor C_Single_UOM IS
5355 select count(distinct ra.unit_of_measure) cnt
5356 from pa_resource_assignments ra
5357 where ta_display_flag = 'Y' and
5358 ra.project_id = p_project_id and
5359 ra.budget_version_id = p_budget_version_id and
5360 ra.resource_class_code = p_class;
5361 
5362 L_Single_UOM VARCHAR2(2000) := -1;
5363 
5364 
5365 BEGIN
5366 
5367 
5368    OPEN C_Single_UOM;
5369 
5370    Fetch C_Single_UOM INTO L_Single_UOM ;
5371 
5372 
5373    CLOSE C_Single_UOM;
5374 
5375 
5376 
5377    RETURN L_Single_UOM;
5378 
5379 
5380 EXCEPTION
5381 
5382 WHEN OTHERS THEN
5383 
5384    NULL;
5385 
5386    RETURN L_Single_UOM;
5387 
5388 END Get_Class_UOM;
5389 
5390 
5391 FUNCTION Get_Role(p_resource_list_member_id IN NUMBER DEFAULT NULL, p_project_id IN NUMBER default NULL)
5392 
5393 RETURN VARCHAR2 IS
5394 
5395 L_FuncProc varchar2(250) ;
5396 
5397 Cursor C_Role IS
5398 
5399 select distinct ro.meaning project_role
5400 
5401 from pa_project_assignments pa,
5402 
5403 pa_proj_roles_v ro
5404 
5405 where
5406 
5407 pa.project_role_id = ro.project_role_id (+)
5408 
5409 and pa.resource_list_member_id = p_resource_list_member_id
5410 
5411 and pa.project_id = p_project_id;
5412 
5413 
5414 
5415 C_Role_rec C_Role%ROWTYPE;
5416 
5417 
5418 
5419 L_Role VARCHAR2(2000);
5420 
5421 
5422 
5423 BEGIN
5424 
5425 
5426 
5427 IF p_resource_list_member_id IS NOT NULL THEN
5428 
5429    OPEN C_Role;
5430 
5431    Fetch C_Role INTO C_Role_rec;
5432 
5433 
5434 
5435    L_Role := C_Role_rec.project_role;
5436 
5437 
5438 
5439    WHILE C_Role%FOUND
5440 
5441    LOOP
5442 
5443 
5444 
5445       Fetch C_Role INTO C_Role_rec;
5446 
5447 
5448 
5449       L_Role := L_Role || ',' || C_Role_rec.project_role;
5450 
5451 
5452 
5453    END LOOP;
5454 
5455 
5456 
5457    CLOSE C_Role;
5458 
5459 
5460 
5461    RETURN L_Role;
5462 
5463 ELSE
5464 
5465    RETURN L_Role;
5466 
5467 END IF;
5468 
5469 EXCEPTION
5470 
5471 WHEN OTHERS THEN
5472 
5473    NULL;
5474 
5475    RETURN L_Role;
5476 
5477 END;
5478 
5479 
5480 
5481 
5482 
5483 FUNCTION Get_Assignment_Effort
5484 RETURN NUMBER IS
5485 begin
5486 return pa_task_assignment_utils.p_assignment_effort;
5487 exception when others then
5488 return pa_task_assignment_utils.p_assignment_effort;
5489 end;
5490 
5491 FUNCTION Get_Team_Role(p_resource_list_member_id IN NUMBER default NULL, p_project_id IN NUMBER default NULL)
5492 
5493 RETURN VARCHAR2 IS
5494 
5495 L_FuncProc varchar2(250) ;
5496 
5497 Cursor C_Team_Role IS
5498 
5499 select distinct pap.assignment_name Team_Role, pap.assignment_effort
5500 
5501 from pa_project_assignments pap, pa_project_statuses stat
5502 
5503 where
5504 
5505 pap.resource_list_member_id = p_resource_list_member_id
5506 
5507 and pap.project_id = p_project_id
5508 and
5509 pap.STATUS_CODE = stat.PROJECT_STATUS_CODE (+) and
5510 nvl(stat.PROJECT_SYSTEM_STATUS_CODE, '-1') not  in
5511 ('OPEN_ASGMT_CANCEL','STAFFED_ASGMT_CANCEL', 'OPEN_ASGMT_FILLED');
5512 
5513 
5514 
5515 C_Team_Role_rec C_Team_Role%ROWTYPE;
5516 
5517 
5518 
5519 L_Team_Role VARCHAR2(2000);
5520 
5521 
5522 
5523 BEGIN
5524 
5525 PA_TASK_ASSIGNMENT_UTILS.p_multi_asgmt_req_flag := 'N';
5526 pa_task_assignment_utils.p_assignment_effort := to_number(NULL);
5527 
5528 
5529 IF p_resource_list_member_id IS NOT NULL THEN
5530 
5531    OPEN C_Team_Role;
5532 
5533    Fetch C_Team_Role INTO C_Team_Role_rec;
5534 
5535 
5536 
5537    L_Team_Role := C_Team_Role_rec.team_role;
5538    pa_task_assignment_utils.p_assignment_effort := C_Team_Role_rec.assignment_effort;
5539 
5540 
5541    WHILE C_Team_Role%FOUND
5542 
5543    LOOP
5544 
5545 
5546 
5547       Fetch C_Team_Role INTO C_Team_Role_rec;
5548 
5549 
5550 
5551       IF C_Team_Role%FOUND THEN
5552 
5553         L_Team_Role := L_Team_Role || ',' || C_Team_Role_rec.team_role;
5554         PA_TASK_ASSIGNMENT_UTILS.p_multi_asgmt_req_flag := 'Y'; /* Added for bug ???? */
5555         pa_task_assignment_utils.p_assignment_effort := pa_task_assignment_utils.p_assignment_effort + C_Team_Role_rec.assignment_effort;
5556 
5557 
5558       END IF;
5559 
5560 
5561 
5562    END LOOP;
5563 
5564 
5565 
5566    CLOSE C_Team_Role;
5567 
5568 
5569 
5570    RETURN L_Team_Role;
5571 
5572 ELSE
5573 
5574    RETURN L_Team_Role;
5575 
5576 END IF;
5577 
5578 
5579 
5580 EXCEPTION
5581 
5582 WHEN OTHERS THEN
5583 
5584    NULL;
5585 
5586    RETURN L_Team_Role;
5587 
5588 END;
5589 
5590 
5591 
5592 -----------------------------------------------------------------
5593 
5594 --
5595 
5596 -- This API is designed specifically for pa_task_assignments_v.
5597 
5598 --
5599 
5600 -----------------------------------------------------------------
5601 
5602 FUNCTION get_baselined_asgmt_dates(
5603 
5604   p_project_id             IN pa_projects_all.project_id%TYPE,
5605 
5606   p_element_version_id     IN pa_proj_element_versions.element_version_id%TYPE,
5607 
5608   p_resource_assignment_id IN pa_resource_assignments.resource_assignment_id%TYPE,
5609 
5610   p_txn_currency_code      IN pa_budget_lines.txn_currency_code%TYPE,
5611 
5612   p_proj_currency_code     IN pa_projects_all.project_currency_code%TYPE,
5613 
5614   p_projfunc_currency_code IN pa_projects_all.projfunc_currency_code%TYPE,
5615 
5616   p_code IN VARCHAR2) RETURN DATE IS
5617 
5618 
5619 
5620 l_current_version_id      pa_budget_versions.budget_version_id%TYPE;
5621 
5622 l_baselined_version_id    pa_budget_versions.budget_version_id%TYPE;
5623 
5624 l_new_baselined_version_id pa_budget_versions.budget_version_id%TYPE; -- 4537865
5625 
5626 l_published_version_id    pa_budget_versions.budget_version_id%TYPE;
5627 
5628 l_planning_start_date     pa_resource_assignments.planning_start_date%TYPE;
5629 
5630 l_planning_end_date       pa_resource_assignments.planning_start_date%TYPE;
5631 
5632 
5633 l_init_raw_cost_rate      pa_budget_lines.txn_standard_cost_rate%TYPE;
5634 
5635 l_avg_raw_cost_rate       pa_budget_lines.txn_standard_cost_rate%TYPE;
5636 
5637 l_init_burd_cost_rate     pa_budget_lines.txn_standard_cost_rate%TYPE;
5638 
5639 l_avg_burd_cost_rate      pa_budget_lines.txn_standard_cost_rate%TYPE;
5640 
5641 
5642 
5643 l_revenue_txn_cur         pa_budget_lines.txn_revenue%TYPE;
5644 
5645 l_revenue_proj_cur        pa_resource_assignments.total_project_revenue%TYPE;
5646 
5647 l_revenue_proj_func_cur   pa_resource_assignments.total_plan_revenue%TYPE;
5648 
5649 l_init_rev_rate           pa_budget_lines.txn_standard_bill_rate%TYPE;
5650 
5651 l_avg_rev_rate            pa_budget_lines.txn_standard_bill_rate%TYPE;
5652 
5653 l_margin_txn_cur          NUMBER;
5654 
5655 l_margin_proj_cur         NUMBER;
5656 
5657 l_margin_proj_func_cur    NUMBER;
5658 
5659 l_margin_pct              NUMBER;
5660 
5661 l_etc_avg_rev_rate	      pa_budget_lines.txn_standard_bill_rate%TYPE;
5662 
5663 l_etc_avg_raw_cost_rate   pa_budget_lines.txn_standard_bill_rate%TYPE;
5664 
5665 l_etc_avg_burd_cost_rate  pa_budget_lines.txn_standard_bill_rate%TYPE;
5666 
5667 l_txn_currency_code       pa_budget_lines.txn_currency_code%TYPE;
5668 
5669 l_return_status           VARCHAR2(1);
5670 
5671 l_msg_count               NUMBER;
5672 
5673 l_msg_data                VARCHAR2(200);
5674 
5675 
5676 CURSOR get_txn_currency_code (p_resource_assignment_id IN pa_resource_assignments.resource_assignment_id%TYPE) IS
5677 SELECT bl.txn_currency_code
5678 FROM pa_budget_lines bl
5679 WHERE bl.resource_assignment_id = p_resource_assignment_id
5680 AND rownum = 1;
5681 
5682 
5683 BEGIN
5684 
5685   -- 3956324: Remove caching logic
5686   --IF g_resource_assignment_id <> p_resource_assignment_id THEN
5687     OPEN get_txn_currency_code(p_resource_assignment_id);
5688     FETCH get_txn_currency_code INTO l_txn_currency_code;
5689     CLOSE get_txn_currency_code;
5690 
5691     PA_PLANNING_ELEMENT_UTILS.get_workplan_bvids
5692     (p_project_id           => p_project_id,
5693      p_element_version_id   => p_element_version_id,
5694      x_current_version_id   => l_current_version_id,
5695      x_baselined_version_id => l_baselined_version_id,
5696      x_published_version_id => l_published_version_id,
5697      x_return_status        => l_return_status,
5698      x_msg_count            => l_msg_count,
5699      x_msg_data             => l_msg_data);
5700 
5701     -- get baselined budget version amounts
5702     PA_PLANNING_ELEMENT_UTILS.get_common_budget_version_info
5703     (p_budget_version_id       => l_baselined_version_id,
5704      p_resource_assignment_id  => p_resource_assignment_id,
5705      p_project_currency_code   => p_proj_currency_code,
5706      p_projfunc_currency_code  => p_projfunc_currency_code,
5707      p_txn_currency_code       => l_txn_currency_code,
5708  -- 4537865    x_budget_version_id       => l_baselined_version_id,
5709      x_budget_version_id       => l_new_baselined_version_id, -- 4537865
5710      x_planning_start_date     => l_planning_start_date,
5711      x_planning_end_date       => l_planning_end_date,
5712 	 x_schedule_start_date     => g_baselined_asgmt_start_date,
5713    	 x_schedule_end_date       => g_baselined_asgmt_end_date,
5714      x_quantity                => g_baselined_planned_qty,
5715      x_revenue_txn_cur         => l_revenue_txn_cur,
5716      x_revenue_proj_cur        => l_revenue_proj_cur,
5717      x_revenue_proj_func_cur   => l_revenue_proj_func_cur,
5718      x_raw_cost_txn_cur        => g_bl_planned_raw_cost_txn_cur,
5719      x_raw_cost_proj_cur       => g_bl_raw_cost_proj_cur,
5720      x_raw_cost_proj_func_cur  => g_bl_raw_cost_projfunc_cur,
5721      x_burd_cost_txn_cur       => g_bl_planned_bur_cost_txn_cur,
5722      x_burd_cost_proj_cur      => g_bl_bur_cost_proj_cur,
5723      x_burd_cost_proj_func_cur => g_bl_bur_cost_projfunc_cur,
5724      x_init_rev_rate           => l_init_rev_rate,
5725      x_avg_rev_rate            => l_avg_rev_rate,
5726      x_init_raw_cost_rate      => l_init_raw_cost_rate,
5727      x_avg_raw_cost_rate       => l_avg_raw_cost_rate,
5728      x_init_burd_cost_rate     => l_init_burd_cost_rate,
5729      x_avg_burd_cost_rate      => l_avg_burd_cost_rate,
5730      x_margin_txn_cur          => l_margin_txn_cur,
5731      x_margin_proj_cur         => l_margin_proj_cur,
5732      x_margin_proj_func_cur    => l_margin_proj_func_cur,
5733      x_margin_pct              => l_margin_pct,
5734      x_etc_avg_rev_rate	       => l_etc_avg_rev_rate,
5735      x_etc_avg_raw_cost_rate   => l_etc_avg_raw_cost_rate,
5736      x_etc_avg_burd_cost_rate  => l_etc_avg_burd_cost_rate,
5737      x_return_status           => l_return_status,
5738      x_msg_count               => l_msg_count,
5739      x_msg_data                => l_msg_data          );
5740 
5741     IF l_return_status = FND_API.G_RET_STS_SUCCESS THEN
5742       -- 4537865
5743      l_baselined_version_id := l_new_baselined_version_id ; -- Though not used further ,assigning back to l_baselined_version_id to
5744 							    --  retain the older meaning
5745     END IF;
5746     --g_resource_assignment_id := p_resource_assignment_id;
5747   --END IF;
5748 
5749   IF p_code = 'baselined_asgmt_start_date' THEN
5750 
5751    RETURN g_baselined_asgmt_start_date;
5752 
5753   ELSIF p_code = 'baselined_asgmt_end_date' THEN
5754 
5755    RETURN g_baselined_asgmt_end_date;
5756 
5757   ELSE
5758 
5759     RETURN NULL;
5760 
5761   END IF;
5762 
5763 EXCEPTION
5764 
5765 WHEN OTHERS THEN
5766 
5767    RETURN NULL;
5768 
5769 
5770 
5771  END get_baselined_asgmt_dates;
5772 
5773 
5774 
5775 -----------------------------------------------------------------
5776 
5777 --
5778 
5779 -- This API is designed specifically for pa_task_assignments_v.
5780 
5781 --
5782 
5783 -----------------------------------------------------------------
5784 
5785 FUNCTION get_baselined_asgmt_amounts(
5786 
5787   p_project_id             IN pa_projects_all.project_id%TYPE,
5788 
5789   p_element_version_id     IN pa_proj_element_versions.element_version_id%TYPE,
5790 
5791   p_resource_assignment_id IN pa_resource_assignments.resource_assignment_id%TYPE,
5792 
5793   p_txn_currency_code      IN pa_budget_lines.txn_currency_code%TYPE,
5794 
5795   p_proj_currency_code     IN pa_projects_all.project_currency_code%TYPE,
5796 
5797   p_projfunc_currency_code IN pa_projects_all.projfunc_currency_code%TYPE,
5798 
5799   p_code IN VARCHAR2) RETURN NUMBER IS
5800 
5801 
5802 
5803 l_current_version_id      pa_budget_versions.budget_version_id%TYPE;
5804 
5805 l_baselined_version_id    pa_budget_versions.budget_version_id%TYPE;
5806 
5807 l_new_baselined_version_id pa_budget_versions.budget_version_id%TYPE; -- 4537865
5808 
5809 l_published_version_id    pa_budget_versions.budget_version_id%TYPE;
5810 
5811 l_planning_start_date     pa_resource_assignments.planning_start_date%TYPE;
5812 
5813 l_planning_end_date       pa_resource_assignments.planning_start_date%TYPE;
5814 
5815 
5816 l_init_raw_cost_rate      pa_budget_lines.txn_standard_cost_rate%TYPE;
5817 
5818 l_avg_raw_cost_rate       pa_budget_lines.txn_standard_cost_rate%TYPE;
5819 
5820 l_init_burd_cost_rate     pa_budget_lines.txn_standard_cost_rate%TYPE;
5821 
5822 l_avg_burd_cost_rate      pa_budget_lines.txn_standard_cost_rate%TYPE;
5823 
5824 
5825 
5826 l_revenue_txn_cur         pa_budget_lines.txn_revenue%TYPE;
5827 
5828 l_revenue_proj_cur        pa_resource_assignments.total_project_revenue%TYPE;
5829 
5830 l_revenue_proj_func_cur   pa_resource_assignments.total_plan_revenue%TYPE;
5831 
5832 l_init_rev_rate           pa_budget_lines.txn_standard_bill_rate%TYPE;
5833 
5834 l_avg_rev_rate            pa_budget_lines.txn_standard_bill_rate%TYPE;
5835 
5836 l_margin_txn_cur          NUMBER;
5837 
5838 l_margin_proj_cur         NUMBER;
5839 
5840 l_margin_proj_func_cur    NUMBER;
5841 
5842 l_margin_pct              NUMBER;
5843 
5844 l_etc_avg_rev_rate	      pa_budget_lines.txn_standard_bill_rate%TYPE;
5845 
5846 l_etc_avg_raw_cost_rate   pa_budget_lines.txn_standard_bill_rate%TYPE;
5847 
5848 l_etc_avg_burd_cost_rate  pa_budget_lines.txn_standard_bill_rate%TYPE;
5849 
5850 l_txn_currency_code       pa_budget_lines.txn_currency_code%TYPE;
5851 
5852 l_return_status           VARCHAR2(1);
5853 
5854 l_msg_count               NUMBER;
5855 
5856 l_msg_data                VARCHAR2(200);
5857 
5858 
5859 CURSOR get_txn_currency_code (p_resource_assignment_id IN pa_resource_assignments.resource_assignment_id%TYPE) IS
5860 SELECT bl.txn_currency_code
5861 FROM pa_budget_lines bl
5862 WHERE bl.resource_assignment_id = p_resource_assignment_id
5863 AND rownum = 1;
5864 
5865 
5866 BEGIN
5867 
5868   -- 3956324: Remove caching logic
5869   --IF g_resource_assignment_id <> p_resource_assignment_id THEN
5870     OPEN get_txn_currency_code(p_resource_assignment_id);
5871     FETCH get_txn_currency_code INTO l_txn_currency_code;
5872     CLOSE get_txn_currency_code;
5873 
5874     PA_PLANNING_ELEMENT_UTILS.get_workplan_bvids
5875     (p_project_id           => p_project_id,
5876      p_element_version_id   => p_element_version_id,
5877      x_current_version_id   => l_current_version_id,
5878      x_baselined_version_id => l_baselined_version_id,
5879      x_published_version_id => l_published_version_id,
5880      x_return_status        => l_return_status,
5881      x_msg_count            => l_msg_count,
5882      x_msg_data             => l_msg_data);
5883 
5884     -- get baselined budget version amounts
5885     PA_PLANNING_ELEMENT_UTILS.get_common_budget_version_info
5886     (p_budget_version_id       => l_baselined_version_id,
5887      p_resource_assignment_id  => p_resource_assignment_id,
5888      p_project_currency_code   => p_proj_currency_code,
5889      p_projfunc_currency_code  => p_projfunc_currency_code,
5890      p_txn_currency_code       => l_txn_currency_code,
5891    -- 4537865  x_budget_version_id       => l_baselined_version_id,
5892      x_budget_version_id       => l_new_baselined_version_id , -- 4537865
5893      x_planning_start_date     => l_planning_start_date,
5894      x_planning_end_date       => l_planning_end_date,
5895 	 x_schedule_start_date     => g_baselined_asgmt_start_date,
5896    	 x_schedule_end_date       => g_baselined_asgmt_end_date,
5897      x_quantity                => g_baselined_planned_qty,
5898      x_revenue_txn_cur         => l_revenue_txn_cur,
5899      x_revenue_proj_cur        => l_revenue_proj_cur,
5900      x_revenue_proj_func_cur   => l_revenue_proj_func_cur,
5901      x_raw_cost_txn_cur        => g_bl_planned_raw_cost_txn_cur,
5902      x_raw_cost_proj_cur       => g_bl_raw_cost_proj_cur,
5903      x_raw_cost_proj_func_cur  => g_bl_raw_cost_projfunc_cur,
5904      x_burd_cost_txn_cur       => g_bl_planned_bur_cost_txn_cur,
5905      x_burd_cost_proj_cur      => g_bl_bur_cost_proj_cur,
5906      x_burd_cost_proj_func_cur => g_bl_bur_cost_projfunc_cur,
5907      x_init_rev_rate           => l_init_rev_rate,
5908      x_avg_rev_rate            => l_avg_rev_rate,
5909      x_init_raw_cost_rate      => l_init_raw_cost_rate,
5910      x_avg_raw_cost_rate       => l_avg_raw_cost_rate,
5911      x_init_burd_cost_rate     => l_init_burd_cost_rate,
5912      x_avg_burd_cost_rate      => l_avg_burd_cost_rate,
5913      x_margin_txn_cur          => l_margin_txn_cur,
5914      x_margin_proj_cur         => l_margin_proj_cur,
5915      x_margin_proj_func_cur    => l_margin_proj_func_cur,
5916      x_margin_pct              => l_margin_pct,
5917    	 x_etc_avg_rev_rate	       => l_etc_avg_rev_rate,
5918    	 x_etc_avg_raw_cost_rate   => l_etc_avg_raw_cost_rate,
5919    	 x_etc_avg_burd_cost_rate  => l_etc_avg_burd_cost_rate,
5920      x_return_status           => l_return_status,
5921      x_msg_count               => l_msg_count,
5922      x_msg_data                => l_msg_data          );
5923 
5924      -- 4537865
5925      -- Though not used further ,assigning l_new_baselined_version_id back to l_baselined_version_id to retain the older meaning
5926    IF l_return_status = FND_API.G_RET_STS_SUCCESS THEN
5927      l_baselined_version_id := l_new_baselined_version_id ;
5928    END IF;
5929      --g_resource_assignment_id := p_resource_assignment_id;
5930   --END IF;
5931 
5932   IF p_code = 'baselined_planned_qty' THEN
5933 
5934    RETURN g_baselined_planned_qty;
5935 
5936   ELSIF p_code = 'bl_planned_bur_cost_txn_cur' THEN
5937 
5938    RETURN g_bl_planned_bur_cost_txn_cur;
5939 
5940   ELSIF p_code = 'bl_bur_cost_proj_cur' THEN
5941 
5942    RETURN g_bl_bur_cost_proj_cur;
5943 
5944   ELSIF p_code = 'bl_bur_cost_projfunc_cur' THEN
5945 
5946    RETURN g_bl_bur_cost_projfunc_cur;
5947 
5948   ELSIF p_code = 'bl_raw_cost_txn_cur' THEN
5949 
5950    RETURN g_bl_planned_raw_cost_txn_cur;
5951 
5952   ELSIF p_code = 'bl_raw_cost_proj_cur' THEN
5953 
5954    RETURN g_bl_raw_cost_proj_cur;
5955 
5956   ELSIF p_code = 'bl_raw_cost_projfunc_cur' THEN
5957 
5958    RETURN g_bl_raw_cost_projfunc_cur;
5959 
5960   ELSE
5961 
5962     RETURN NULL;
5963 
5964   END IF;
5965 
5966 EXCEPTION
5967 
5968 WHEN OTHERS THEN
5969 
5970    RETURN null;
5971 
5972 END get_baselined_asgmt_amounts;
5973 
5974 /* Commented for 4994791
5975 
5976 FUNCTION get_planned_asgmt_amounts(
5977   p_resource_assignment_id IN pa_resource_assignments.resource_assignment_id%TYPE,
5978   p_code IN VARCHAR2) RETURN NUMBER IS
5979 
5980 
5981 CURSOR get_resource_assignment_info (p_resource_assignment_id IN pa_resource_assignments.resource_assignment_id%TYPE) IS
5982 
5983 SELECT
5984    SUM(bl.quantity) as planned_quantity,
5985    SUM(bl.txn_burdened_cost) as planned_bur_cost_txn_cur,
5986    SUM(bl.txn_raw_cost) as planned_raw_cost_txn_cur,
5987    SUM(bl.init_quantity) as actual_quantity,
5988    SUM(bl.txn_init_burdened_cost) as act_bur_cost_txn_cur,
5989    SUM(bl.txn_init_raw_cost) as act_raw_cost_txn_cur,
5990    SUM(bl.project_init_burdened_cost) as act_bur_cost_pc_cur,
5991    SUM(bl.project_init_raw_cost) as act_raw_cost_pc_cur,
5992    SUM(bl.init_burdened_cost) as act_bur_cost_pfc_cur,
5993    SUM(bl.init_raw_cost) as act_raw_cost_pfc_cur,
5994    AVG(nvl(bl.txn_cost_rate_override, bl.txn_standard_cost_rate)) as avg_raw_cost_rate,
5995    AVG(bl.burden_cost_rate) as avg_bur_cost_rate
5996 FROM pa_budget_lines bl
5997 WHERE bl.resource_assignment_id = p_resource_assignment_id
5998 GROUP BY bl.resource_assignment_id;
5999 
6000 l_act_bur_cost_pc_cur NUMBER;
6001 l_act_raw_cost_pc_cur NUMBER;
6002 l_act_bur_cost_pfc_cur NUMBER;
6003 l_act_raw_cost_pfc_cur NUMBER;
6004 
6005 BEGIN
6006 
6007 -- Bug 3956324: Remove the caching logic
6008 --IF g_pl_resource_assignment_id <> p_resource_assignment_id THEN
6009    g_planned_quantity         := NULL;
6010    g_planned_bur_cost_txn_cur := NULL;
6011    g_planned_raw_cost_txn_cur := NULL;
6012    g_actual_quantity          := NULL;
6013    g_act_bur_cost_txn_cur     := NULL;
6014    g_act_raw_cost_txn_cur     := NULL;
6015    g_avg_raw_cost_rate        := NULL;
6016    g_avg_bur_cost_rate        := NULL;
6017 
6018    OPEN get_resource_assignment_info(p_resource_assignment_id);
6019    FETCH get_resource_assignment_info INTO
6020       g_planned_quantity, g_planned_bur_cost_txn_cur, g_planned_raw_cost_txn_cur,
6021       g_actual_quantity, g_act_bur_cost_txn_cur, g_act_raw_cost_txn_cur, l_act_bur_cost_pc_cur,
6022       l_act_raw_cost_pc_cur, l_act_bur_cost_pfc_cur, l_act_raw_cost_pfc_cur,
6023       g_avg_raw_cost_rate, g_avg_bur_cost_rate;
6024    CLOSE get_resource_assignment_info;
6025 
6026 --   g_pl_resource_assignment_id := p_resource_assignment_id;
6027 --END IF;
6028 
6029 IF p_code = 'planned_quantity' THEN
6030 
6031    return g_planned_quantity;
6032 
6033 ELSIF p_code = 'planned_bur_cost_txn_cur' THEN
6034 
6035    return g_planned_bur_cost_txn_cur;
6036 
6037 ELSIF p_code = 'planned_raw_cost_txn_cur' THEN
6038 
6039    return g_planned_raw_cost_txn_cur;
6040 
6041 ELSIF p_code = 'actual_quantity' THEN
6042 
6043    return g_actual_quantity;
6044 
6045 ELSIF p_code = 'act_bur_cost_txn_cur' THEN
6046 
6047    return g_act_bur_cost_txn_cur;
6048 
6049 ELSIF p_code = 'act_raw_cost_txn_cur' THEN
6050 
6051    return g_act_raw_cost_txn_cur;
6052 
6053 ELSIF p_code = 'act_bur_cost_pc_cur' THEN
6054 
6055    return l_act_bur_cost_pc_cur;
6056 
6057 ELSIF p_code = 'act_raw_cost_pc_cur' THEN
6058 
6059    return l_act_raw_cost_pc_cur;
6060 
6061 ELSIF p_code = 'act_bur_cost_pfc_cur' THEN
6062 
6063    return l_act_bur_cost_pfc_cur;
6064 
6065 ELSIF p_code = 'act_raw_cost_pfc_cur' THEN
6066 
6067    return l_act_raw_cost_pfc_cur;
6068 
6069 ELSIF p_code = 'avg_raw_cost_rate' THEN
6070 
6071    return g_avg_raw_cost_rate;
6072 
6073 ELSIF p_code = 'avg_bur_cost_rate' THEN
6074 
6075    return g_avg_bur_cost_rate;
6076 
6077 ELSE
6078 
6079    return null;
6080 
6081 END IF;
6082 
6083 END get_planned_asgmt_amounts;
6084 
6085 End of Bug Fix 4994791 */
6086 
6087 
6088 FUNCTION get_planned_currency_info (
6089 
6090   p_resource_assignment_id IN pa_resource_assignments.resource_assignment_id%TYPE,
6091 
6092   p_project_id IN pa_projects_all.project_id%TYPE,
6093 
6094   p_code IN VARCHAR2) RETURN VARCHAR2 IS
6095 
6096 -- Bug 9675606
6097 CURSOR get_bl_currency_info (p_resource_assignment_id IN pa_resource_assignments.resource_assignment_id%TYPE) IS
6098 SELECT prac.txn_currency_code as txn_currency_code
6099 FROM pa_resource_asgn_curr prac
6100 WHERE prac.resource_assignment_id = p_resource_assignment_id
6101 AND rownum = 1;
6102 
6103 /* Commented for bug 9675606
6104 CURSOR get_bl_currency_info (p_resource_assignment_id IN pa_resource_assignments.resource_assignment_id%TYPE) IS
6105 SELECT bl.txn_currency_code as txn_currency_code
6106 FROM pa_budget_lines bl
6107 WHERE bl.resource_assignment_id = p_resource_assignment_id
6108 AND rownum = 1;
6109 */
6110 
6111 CURSOR get_proj_currency_info (p_project_id IN pa_projects_all.project_id%TYPE) IS
6112 SELECT proj.project_currency_code as txn_currency_code
6113 FROM pa_projects_all proj
6114 WHERE proj.project_id = p_project_id
6115 AND rownum = 1;
6116 
6117 BEGIN
6118 
6119 -- Bug 3956324: Remove the caching logic
6120 --IF g_cur_resource_assignment_id <> p_resource_assignment_id THEN
6121    g_txn_currency_code := null;
6122 
6123    OPEN get_bl_currency_info(p_resource_assignment_id);
6124    FETCH get_bl_currency_info INTO g_txn_currency_code;
6125    CLOSE get_bl_currency_info;
6126 
6127    IF g_txn_currency_code IS NULL THEN
6128      OPEN get_proj_currency_info(p_project_id);
6129      FETCH get_proj_currency_info INTO g_txn_currency_code;
6130      CLOSE get_proj_currency_info;
6131    END IF;
6132 
6133    g_cur_resource_assignment_id := p_resource_assignment_id;
6134 --END IF;
6135 
6136 IF p_code = 'txn_currency_code' THEN
6137 
6138    return g_txn_currency_code;
6139 
6140 ELSE
6141 
6142    return null;
6143 
6144 END IF;
6145 
6146 END get_planned_currency_info;
6147 
6148 
6149 FUNCTION get_task_level_record(
6150 
6151   p_project_id             IN pa_projects_all.project_id%TYPE,
6152 
6153   p_element_version_id     IN pa_proj_element_versions.element_version_id%TYPE
6154 
6155 ) RETURN NUMBER IS
6156 
6157 
6158 
6159 CURSOR get_task_level_record IS
6160 
6161 select resource_assignment_id
6162 
6163 from pa_resource_assignments
6164 
6165 where ta_display_flag = 'N'
6166 
6167 and wbs_element_version_id = p_element_version_id
6168 
6169 and project_id = p_project_id
6170 
6171 and rownum = 1;
6172 
6173 
6174 
6175 l_resource_assignment_id NUMBER := NULL;
6176 
6177 
6178 
6179 BEGIN
6180 
6181 
6182 
6183   OPEN get_task_level_record;
6184 
6185   FETCH get_task_level_record INTO l_resource_assignment_id;
6186 
6187   CLOSE get_task_level_record;
6188 
6189 
6190 
6191   RETURN l_resource_assignment_id;
6192 
6193 
6194 
6195 EXCEPTION
6196 
6197 WHEN OTHERS THEN
6198 
6199    RETURN null;
6200 
6201 
6202 
6203 END get_task_level_record;
6204 
6205 
6206 
6207 
6208 
6209 function gchar(p_char IN VARCHAR2 default NULL, p_mode IN VARCHAR2 default 'F') return varchar2 IS
6210 
6211 begin
6212 
6213 
6214 
6215 
6216 
6217 if p_mode = 'F' and
6218 
6219 (p_char is NULL  OR p_char = fnd_api.g_miss_char) THEN
6220 
6221 
6222 
6223   return to_char(NULL);
6224 
6225 
6226 
6227 elsif p_mode = 'B' and
6228 
6229 (p_char is NULL  OR p_char = fnd_api.g_miss_char) THEN
6230 
6231 
6232 
6233   return fnd_api.g_miss_char;
6234 
6235 
6236 
6237 elsif p_char is NOT NULL THEN
6238 
6239 
6240 
6241   return p_char;
6242 
6243 
6244 
6245 end if;
6246 
6247 
6248 
6249 exception when others then
6250 
6251 return p_char;
6252 
6253 
6254 
6255 end gchar;
6256 
6257 
6258 
6259 function gnum(p_num IN NUMBER default NULL, p_mode IN VARCHAR2 default 'F') return NUMBER IS
6260 
6261 begin
6262 
6263 
6264 
6265 
6266 
6267 if p_mode = 'F' and
6268 
6269 ( p_num is NULL  OR p_num = fnd_api.g_miss_num ) THEN
6270 
6271 
6272 
6273   return to_number(NULL);
6274 
6275 
6276 
6277 elsif p_mode = 'B' and
6278 
6279 ( p_num is NULL  OR p_num = fnd_api.g_miss_num ) THEN
6280 
6281 
6282 
6283   return fnd_api.g_miss_num;
6284 
6285 elsif p_num is NOT NULL THEN
6286 
6287 
6288 
6289   return p_num;
6290 
6291 end if;
6292 
6293 
6294 
6295 exception when others then
6296 
6297 return p_num;
6298 
6299 
6300 
6301 end gnum;
6302 
6303 
6304 
6305 function gdate(p_date IN DATE default NULL, p_mode IN VARCHAR2 default 'F') return DATE IS
6306 
6307 begin
6308 
6309 
6310 
6311 
6312 
6313 if p_mode = 'F' and
6314 
6315 (p_date is NULL  OR p_date = fnd_api.g_miss_date ) THEN
6316 
6317 
6318 
6319   return to_date(NULL);
6320 
6321 
6322 
6323 
6324 
6325 elsif p_mode = 'B' and
6326 
6327 (p_date is NULL  OR p_date = fnd_api.g_miss_date ) THEN
6328 
6329 
6330 
6331   return fnd_api.g_miss_date;
6332 
6333 elsif p_date is NOT NULL THEN
6334 
6335 
6336 
6337   return p_date;
6338 
6339 end if;
6340 
6341 
6342 
6343 exception when others then
6344 
6345 return p_date;
6346 
6347 
6348 
6349 end gdate;
6350 
6351 
6352 
6353 /************************************************************************/
6354 /* Procedure: SET_TABLE_STATS                                           */
6355 /* Desciption: Sets table stats to certain values.                      */
6356 /************************************************************************/
6357 PROCEDURE set_table_stats(ownname IN VARCHAR2,
6358                           tabname IN VARCHAR2,
6359                           numrows IN NUMBER,
6360                           numblks IN NUMBER,
6361                           avgrlen IN NUMBER)
6362 IS
6363 	PRAGMA AUTONOMOUS_TRANSACTION;
6364 BEGIN
6365     DBMS_STATS.set_table_stats(ownname,
6366                                tabname,
6367                                NULL,
6368                                NULL,
6369                                NULL,
6370                                numrows,
6371                                numblks,
6372                                avgrlen,
6373                                NULL,
6374                                NULL);
6375 END; /* SET_TABLE_STATS */
6376 
6377 ------------------BUG 4373411 , rtarway, DHIER refresh rates-----------------------
6378 
6379 -- Procedure            : CHECK_EDIT_OK
6380 -- Type                 : Public Procedure
6381 -- Purpose              : This API validates whether it is fine to update the task assignments in
6382 --                      : the workplan by the logged in user
6383 -- Note                 : This API adds all the validation errors to the error stack and return status
6384 --                      : is 'E'/'U' when error occurs or 'S' if sucess.
6385 -- Assumptions          :
6386 
6387 -- Parameters           Type     Required        Description and Purpose
6388 ------------------------------------------------------------------------
6389 -- p_project_id         NUMBER   Yes             Project Id
6390 -- p_pa_structure_version_id NUMBER Yes          Structure Version Id
6391 -- x_budget_version_id  NUMBER    NA             Returns budget version id
6392 
6393 
6394 PROCEDURE CHECK_EDIT_OK(
6395   p_api_version_number    IN   NUMBER   := 1.0
6396 , p_init_msg_list         IN   VARCHAR2 := FND_API.G_FALSE
6397 , p_commit                IN   VARCHAR2 := FND_API.G_FALSE
6398 , p_project_id            IN NUMBER
6399 , p_pa_structure_version_id IN NUMBER
6400 , px_budget_version_id    IN OUT NOCOPY NUMBER
6401 , x_return_status OUT NOCOPY VARCHAR2 -- 4537865
6402 , x_msg_data      OUT NOCOPY VARCHAR2 -- 4537865
6403 , x_msg_count     OUT NOCOPY NUMBER ) -- 4537865
6404 
6405 IS
6406 
6407 l_msg_count                     NUMBER := 0;
6408 l_data                          VARCHAR2(2000);
6409 l_msg_data                      VARCHAR2(2000);
6410 l_msg_index_out                 NUMBER;
6411 l_debug_mode                    VARCHAR2(1);
6412 l_user_id                        NUMBER;
6413 l_login_id                       NUMBER;
6414 l_resp_id                        NUMBER;
6415 l_return_status                 VARCHAR2(1);
6416 
6417 l_function_allowed            VARCHAR2(1);
6418 
6419 l_project_id                     NUMBER;
6420 l_budget_version_id              NUMBER;
6421 l_str_version_id                 NUMBER;
6422 
6423 l_debug_level2                   CONSTANT NUMBER := 2;
6424 l_debug_level3                   CONSTANT NUMBER := 3;
6425 l_debug_level4                   CONSTANT NUMBER := 4;
6426 l_debug_level5                   CONSTANT NUMBER := 5;
6427 
6428 g_module_name                    VARCHAR2(30) := 'PA_TASK_ASSIGNMENT_UTILS';
6429 
6430 l_module_name                    VARCHAR2(80) := 'PA_PM_UPDATE_TASK_ASSIGNMENT';
6431 
6432 l_struct_elem_version_id         NUMBER;
6433 L_VALID                          VARCHAR2(1);
6434 L_CURR_WORKING_VERSION           NUMBER;
6435 
6436 
6437 CURSOR C_validate_Budget_Version_Id (l_budget_version_id NUMBER , l_project_id NUMBER) IS
6438    SELECT budget_version_id, project_structure_version_id
6439    FROM   pa_budget_versions
6440    WHERE  budget_version_id = l_budget_version_id
6441    AND    project_id = l_project_id
6442    AND    project_structure_version_id is not null;
6443 
6444 CURSOR c_validate_str_version_id (l_str_ver_id NUMBER, l_project_id NUMBER) IS
6445    SELECT 'Y'
6446    FROM dual
6447    WHERE EXISTS
6448 	   (SELECT ppev.element_version_id
6449 	   FROM pa_proj_element_versions ppev,
6450 	        pa_proj_elem_ver_structure ppevs,
6451 		pa_proj_structure_types ppst
6452 	   WHERE
6453 	       ppev.element_version_id = l_str_ver_id
6454 	   and ppev.project_id = l_project_id
6455 	   and ppev.object_type='PA_STRUCTURES'
6456 	   and ppev.element_version_id=ppevs.element_version_id
6457 	   and ppev.project_id=ppevs.project_id
6458            and ppevs.proj_element_id = ppst.proj_element_id
6459 	   and ppst.structure_type_id = 1);
6460 
6461 CURSOR C_Get_Budget_Version_Id(l_structure_version_id IN NUMBER) is
6462    select budget_version_id
6463    from pa_budget_versions
6464    where project_structure_version_id = l_structure_version_id
6465    and project_id = p_project_id;
6466 
6467 l_dummy varchar2(1);
6468 
6469 BEGIN
6470 
6471      x_msg_count := 0;
6472      x_return_status := FND_API.G_RET_STS_SUCCESS;
6473 
6474      l_user_id := fnd_global.user_id;
6475      l_login_id := fnd_global.login_id;
6476      l_resp_id := FND_GLOBAL.Resp_id;
6477      l_debug_mode  := NVL(FND_PROFILE.value_specific('PA_DEBUG_MODE',l_user_id, l_login_id,275,null,null),'N');
6478 
6479      IF l_debug_mode = 'Y' THEN
6480           PA_DEBUG.set_curr_function( p_function   => 'CHECK_EDIT_OK',
6481                                       p_debug_mode => l_debug_mode );
6482      END IF;
6483 
6484      IF FND_API.TO_BOOLEAN(nvl(p_init_msg_list,FND_API.G_TRUE)) THEN
6485            FND_MSG_PUB.initialize;
6486      END IF;
6487 
6488      --Print All Input Params
6489      IF l_debug_mode = 'Y' THEN
6490           Pa_Debug.g_err_stage:= 'PA_TASK_ASSIGNMENT_UTILS :CHECK_EDIT_OK: Printing Input parameters';
6491           Pa_Debug.WRITE(g_module_name,Pa_Debug.g_err_stage,
6492                                      l_debug_level3);
6493 
6494           Pa_Debug.WRITE(g_module_name,'p_project_id'||':'||p_project_id,
6495                                      l_debug_level3);
6496           Pa_Debug.WRITE(g_module_name,'p_pa_structure_version_id'||':'||p_pa_structure_version_id,
6497                                      l_debug_level3);
6498           Pa_Debug.WRITE(g_module_name,'px_budget_version_id'||':'||px_budget_version_id,
6499                                      l_debug_level3);
6500      END IF;
6501 
6502     -- As part of enforcing project security, which would determine
6503     -- whether the user has the necessary privileges to update the project
6504     -- need to call the pa_security package
6505      IF l_debug_mode = 'Y' THEN
6506 	Pa_Debug.g_err_stage:= 'PA_TASK_ASSIGNMENT_UTILS :CHECK_EDIT_OK: Checking Security: UPDATE_TASK_ASSIGNMENT';
6507 	Pa_Debug.WRITE(g_module_name,Pa_Debug.g_err_stage,l_debug_level3);
6508      END IF;
6509      pa_security.initialize (X_user_id        => l_user_id,
6510                             X_calling_module => l_module_name);
6511 
6512     -- Actions performed using the APIs would be subject to
6513     -- function security. If the responsibility does not allow
6514     -- such functions to be executed, the API should not proceed further
6515     -- since the user does not have access to such functions
6516 
6517     -- Function security procedure check whether user have the
6518     -- privilege to UPDATE task or not
6519 
6520       PA_INTERFACE_UTILS_PUB.G_PROJECT_ID := p_project_id;
6521 
6522       PA_PM_FUNCTION_SECURITY_PUB.check_function_security
6523       (p_api_version_number => p_api_version_number,
6524        p_responsibility_id  => l_resp_id,
6525        p_function_name      => 'PA_PM_UPDATE_TASK_ASSIGNMENT',
6526        p_msg_count          => l_msg_count,
6527        p_msg_data           => l_msg_data,
6528        p_return_status      => l_return_status,
6529        p_function_allowed   => l_function_allowed);
6530 
6531        IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR
6532        THEN
6533             RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
6534        ELSIF l_return_status = FND_API.G_RET_STS_ERROR
6535        THEN
6536             RAISE FND_API.G_EXC_ERROR;
6537        END IF;
6538 
6539        IF l_function_allowed = 'N' THEN
6540          pa_interface_utils_pub.map_new_amg_msg
6541            ( p_old_message_code => 'PA_FUNCTION_SECURITY_ENFORCED'
6542             ,p_msg_attribute    => 'CHANGE'
6543             ,p_resize_flag      => 'Y'
6544             ,p_msg_context      => 'GENERAL'
6545             ,p_attribute1       => ''
6546             ,p_attribute2       => ''
6547             ,p_attribute3       => ''
6548             ,p_attribute4       => ''
6549             ,p_attribute5       => '');
6550          x_return_status := FND_API.G_RET_STS_ERROR;
6551          RAISE FND_API.G_EXC_ERROR;
6552        END IF;
6553       IF l_debug_mode = 'Y' THEN
6554          Pa_Debug.g_err_stage:= 'PA_TASK_ASSIGNMENT_UTILS :CHECK_EDIT_OK: Checking Security: UPDATE_TASK_ASSIGNMENT: Suceess';
6555          Pa_Debug.WRITE(g_module_name,Pa_Debug.g_err_stage,l_debug_level3);
6556       END IF;
6557        -- Now verify whether project security allows the user to update
6558        -- the project
6559        -- The user does not have query privileges on this project
6560        -- Hence, cannot update the project.Raise error
6561        -- If the user has query privileges, then check whether
6562        -- update privileges are also available
6563       IF l_debug_mode = 'Y' THEN
6564 	 Pa_Debug.g_err_stage:= 'PA_TASK_ASSIGNMENT_UTILS :CHECK_EDIT_OK: Checking Security: Update/Query Project';
6565          Pa_Debug.WRITE(g_module_name,Pa_Debug.g_err_stage,l_debug_level3);
6566       END IF;
6567 
6568        IF pa_security.allow_query(x_project_id => p_project_id ) = 'N'
6569           OR pa_security.allow_update(x_project_id => p_project_id ) = 'N'
6570 	  THEN
6571             -- The user does not have update privileges on this project
6572             -- Hence , raise error
6573          pa_interface_utils_pub.map_new_amg_msg
6574            ( p_old_message_code => 'PA_PROJECT_SECURITY_ENFORCED'
6575             ,p_msg_attribute    => 'CHANGE'
6576             ,p_resize_flag      => 'Y'
6577             ,p_msg_context      => 'GENERAL'
6578             ,p_attribute1       => ''
6579             ,p_attribute2       => ''
6580             ,p_attribute3       => ''
6581             ,p_attribute4       => ''
6582             ,p_attribute5       => '');
6583           x_return_status := FND_API.G_RET_STS_ERROR;
6584          RAISE FND_API.G_EXC_ERROR;
6585        END IF;
6586       IF l_debug_mode = 'Y' THEN
6587          Pa_Debug.g_err_stage:= 'PA_TASK_ASSIGNMENT_UTILS :CHECK_EDIT_OK: Checking Security: Update/Query Project: Success';
6588          Pa_Debug.WRITE(g_module_name,Pa_Debug.g_err_stage,l_debug_level3);
6589 
6590          Pa_Debug.g_err_stage:= 'PA_TASK_ASSIGNMENT_UTILS :CHECK_EDIT_OK: Checking Security: Validating Str Version';
6591          Pa_Debug.WRITE(g_module_name,Pa_Debug.g_err_stage,l_debug_level3);
6592       END IF;
6593       IF  NVL(PA_PROJ_TASK_STRUC_PUB.WP_STR_EXISTS( p_project_id ), 'N') = 'N' THEN
6594         IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
6595         THEN
6596             pa_interface_utils_pub.map_new_amg_msg
6597               ( p_old_message_code => 'PA_PS_WP_NOT_SEP_FN'
6598                   ,p_msg_attribute    => 'CHANGE'
6599                   ,p_resize_flag      => 'N'
6600                   ,p_msg_context      => 'GENERAL'
6601                   ,p_attribute1       => ''
6602                   ,p_attribute2       => ''
6603                   ,p_attribute3       => ''
6604                   ,p_attribute4       => ''
6605                   ,p_attribute5       => '');
6606         END IF;
6607         RAISE FND_API.G_EXC_ERROR;
6608        END IF;
6609 
6610        IF (px_budget_version_id is not null and px_budget_version_id <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM) THEN
6611            OPEN  C_validate_Budget_Version_Id(px_budget_version_id,p_project_id);
6612            FETCH C_validate_Budget_Version_Id INTO l_budget_version_id,l_struct_elem_version_id;
6613            IF   (C_validate_Budget_Version_Id%NOTFOUND) THEN
6614                    PA_UTILS.ADD_MESSAGE(
6615                         p_app_short_name  => 'PA'
6616                        ,p_msg_name        => 'PA_FP_INVALID_VERSION_ID'
6617                        ,p_token1          => 'BUDGET_VERSION_ID'
6618                        ,p_value1          => px_budget_version_id);
6619 		    CLOSE C_validate_Budget_Version_Id ;
6620 		    raise FND_API.G_EXC_ERROR;
6621            END IF;
6622 	   CLOSE C_validate_Budget_Version_Id ;
6623        ELSIF ( p_pa_structure_version_id IS NOT NULL AND
6624              ( p_pa_structure_version_id <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM) )THEN
6625              l_struct_elem_version_id := p_pa_structure_version_id;
6626 	     OPEN  c_validate_str_version_id(l_struct_elem_version_id, p_project_id);
6627              FETCH c_validate_str_version_id INTO l_valid;
6628              IF   (c_validate_str_version_id%NOTFOUND) THEN
6629                   PA_UTILS.ADD_MESSAGE
6630                   ( p_app_short_name => 'PA',
6631                     p_msg_name       => 'PA_INVALID_STR_VERSION_ID'
6632 	          );
6633 	          CLOSE c_validate_str_version_id;
6634                   RAISE FND_API.G_EXC_ERROR;
6635              END IF;
6636              CLOSE c_validate_str_version_id;
6637 	     --Get the budget version_id
6638 	     OPEN  C_Get_Budget_Version_Id(l_struct_elem_version_id);
6639              FETCH C_Get_Budget_Version_Id INTO l_budget_version_id;
6640              CLOSE C_Get_Budget_Version_Id;
6641        END IF;
6642 
6643       IF l_debug_mode = 'Y' THEN
6644         Pa_Debug.g_err_stage:= 'PA_TASK_ASSIGNMENT_UTILS :CHECK_EDIT_OK: Validating Str/budget Version: Success';
6645         Pa_Debug.WRITE(g_module_name,Pa_Debug.g_err_stage,l_debug_level3);
6646       END IF;
6647       --Get Current Working Version Id
6648       l_curr_working_version := PA_PROJECT_STRUCTURE_UTILS.get_current_working_ver_id(
6649                                                      p_project_id => p_project_id);
6650       IF l_debug_mode = 'Y' THEN
6651         Pa_Debug.g_err_stage:= 'PA_TASK_ASSIGNMENT_UTILS :CHECK_EDIT_OK: Checking Security: Calling Check_edit_ok';
6652         Pa_Debug.WRITE(g_module_name,Pa_Debug.g_err_stage,l_debug_level3);
6653       END IF;
6654       IF 'N' = pa_task_assignment_utils.check_edit_task_ok
6655                     ( P_PROJECT_ID              => p_project_id,
6656                       P_STRUCTURE_VERSION_ID    => l_struct_elem_version_id,
6657                       P_CURR_STRUCT_VERSION_ID  => l_curr_working_version) THEN
6658                -- Bug 4533152
6659                -- PA_UTILS.ADD_MESSAGE
6660                --( p_app_short_name => 'PA',
6661                --  p_msg_name       => 'PA_UPDATE_PUB_VER_ERR'
6662 	       --);
6663                x_return_status := FND_API.G_RET_STS_ERROR;
6664                RAISE FND_API.G_EXC_ERROR;
6665       END IF;
6666       IF l_debug_mode = 'Y' THEN
6667          Pa_Debug.g_err_stage:= 'PA_TASK_ASSIGNMENT_UTILS :CHECK_EDIT_OK: Calling Check_edit_ok: Success';
6668          Pa_Debug.WRITE(g_module_name,Pa_Debug.g_err_stage,l_debug_level3);
6669       END IF;
6670 
6671       IF ( l_budget_version_id = PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM OR
6672            l_budget_version_id IS NULL  ) THEN
6673           IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
6674           THEN
6675                 PA_UTILS.ADD_MESSAGE
6676                   (p_app_short_name => 'PA',
6677                    p_msg_name       => 'PA_FP_PROJ_VERSION_MISMATCH'
6678                   );
6679           END IF;
6680           x_return_status    := FND_API.G_RET_STS_ERROR;
6681 	  px_budget_version_id := null;
6682           RAISE FND_API.G_EXC_ERROR;
6683       ELSE
6684           px_budget_version_id := l_budget_version_id;
6685       END IF;
6686       IF l_debug_mode = 'Y' THEN
6687 	      Pa_Debug.g_err_stage:= 'PA_TASK_ASSIGNMENT_UTILS :CHECK_EDIT_OK: Check_edit_ok: Budget Version Id'||l_budget_version_id;
6688 	      Pa_Debug.WRITE(g_module_name,Pa_Debug.g_err_stage,l_debug_level3);
6689 
6690 	      Pa_Debug.g_err_stage:= 'PA_TASK_ASSIGNMENT_UTILS :CHECK_EDIT_OK: Check_edit_ok: End';
6691 	      Pa_Debug.WRITE(g_module_name,Pa_Debug.g_err_stage,l_debug_level3);
6692       END IF;
6693 
6694 EXCEPTION
6695 
6696 WHEN FND_API.G_EXC_ERROR THEN
6697 
6698      x_return_status := Fnd_Api.G_RET_STS_ERROR;
6699      l_msg_count := Fnd_Msg_Pub.count_msg;
6700 
6701      -- 4537865
6702      px_budget_version_id := NULL ;
6703 
6704      IF c_validate_str_version_id%ISOPEN THEN
6705         CLOSE c_validate_str_version_id;
6706      END IF;
6707 
6708      IF C_Get_Budget_Version_Id%ISOPEN THEN
6709         CLOSE C_Get_Budget_Version_Id;
6710      END IF;
6711 
6712      IF C_validate_Budget_Version_Id%ISOPEN THEN
6713         CLOSE C_validate_Budget_Version_Id;
6714      END IF;
6715 
6716      IF l_msg_count = 1 AND x_msg_data IS NULL
6717       THEN
6718           Pa_Interface_Utils_Pub.get_messages
6719               ( p_encoded        => Fnd_Api.G_TRUE
6720               , p_msg_index      => 1
6721               , p_msg_count      => l_msg_count
6722               , p_msg_data       => l_msg_data
6723               , p_data           => l_data
6724               , p_msg_index_out  => l_msg_index_out);
6725           x_msg_data := l_data;
6726           x_msg_count := l_msg_count;
6727      ELSE
6728           x_msg_count := l_msg_count;
6729      END IF;
6730      IF l_debug_mode = 'Y' THEN
6731           Pa_Debug.reset_curr_function;
6732      END IF;
6733 
6734 WHEN OTHERS THEN
6735 
6736      x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
6737      x_msg_count     := 1;
6738      x_msg_data      := SQLERRM;
6739      -- 4537865
6740      px_budget_version_id := NULL ;
6741 
6742      IF c_validate_str_version_id%ISOPEN THEN
6743         CLOSE c_validate_str_version_id;
6744      END IF;
6745 
6746      IF C_Get_Budget_Version_Id%ISOPEN THEN
6747         CLOSE C_Get_Budget_Version_Id;
6748      END IF;
6749 
6750      IF C_validate_Budget_Version_Id%ISOPEN THEN
6751         CLOSE C_validate_Budget_Version_Id;
6752      END IF;
6753 
6754      Fnd_Msg_Pub.add_exc_msg
6755                    ( p_pkg_name         => 'PA_TASK_ASSIGNMENT_UTILS'
6756                     , p_procedure_name  => 'CHECK_EDIT_OK'
6757                     , p_error_text      => x_msg_data);
6758 
6759      IF l_debug_mode = 'Y' THEN
6760           Pa_Debug.g_err_stage:= 'Unexpected Error'||x_msg_data;
6761           Pa_Debug.WRITE(g_module_name,Pa_Debug.g_err_stage,
6762                               l_debug_level5);
6763           Pa_Debug.reset_curr_function;
6764      END IF;
6765      RAISE;
6766 END  CHECK_EDIT_OK;
6767 ------------------BUG 4373411 , rtarway, DHIER refresh rates-----------------------
6768 
6769 
6770 -- Bug 4492493
6771 FUNCTION Is_Progress_Rollup_Required(
6772   p_project_id             IN pa_projects_all.project_id%TYPE
6773 ) RETURN VARCHAR2 IS
6774 
6775 -- Bug 4492493:
6776 --Need to do progress rollup if ALL of the following are true:
6777 -- 1. This is a creation, update or deletion of workplan task assignment with
6778 --    Planned Effort, i.e. which changes the rollup planned effort.
6779 -- 2. This is a version disabled workplan structure
6780 -- 3. There exists progress data for the project or workplan structure
6781 CURSOR Does_Progress_Exists IS
6782 select 'Y'
6783 from pa_progress_rollup
6784 where project_id = p_project_id
6785   and object_Type = 'PA_STRUCTURES'
6786   and structure_version_id is null
6787   and structure_type = 'WORKPLAN'
6788   and current_flag = 'Y';
6789 
6790 l_progress_exists_flag VARCHAR2(1) := 'N';
6791 
6792 BEGIN
6793 
6794   OPEN Does_Progress_Exists;
6795   FETCH Does_Progress_Exists INTO l_progress_exists_flag;
6796   CLOSE Does_Progress_Exists;
6797 
6798   IF l_progress_exists_flag = 'Y' AND
6799      PA_WORKPLAN_ATTR_UTILS.CHECK_WP_VERSIONING_ENABLED(p_project_id) = 'N' THEN
6800     RETURN 'Y';
6801   ELSE
6802     RETURN 'N';
6803   END IF;
6804 
6805 EXCEPTION
6806    WHEN OTHERS THEN
6807      RETURN 'N';
6808 
6809 END Is_Progress_Rollup_Required;
6810 
6811 /* Added for bug 6023345*/
6812 -- This function is to check if a planning resource list (PRL) is an uncategorized resource list or not.
6813 -- Input params : We can pass either :
6814 --  i)p_resource_list_id
6815 --    OR
6816 --  ii)p_project_id - which will get the PRL for the project using get_wp_resource_list_id
6817 --  This function call is used in
6818 --    a)PA_PLANNING_RESOURCE_UTILS.Get_Res_Format_for_Team_Role
6819 --    b)AssignmentUtils.getPLSMissingMsg in java
6820 
6821 FUNCTION is_uncategorized_res_list
6822 ( p_resource_list_id        IN pa_resource_lists_all_bg.resource_list_id%TYPE := NULL
6823   ,p_project_id             IN pa_projects_all.project_id%TYPE := NULL
6824  ) RETURN VARCHAR2 IS
6825 
6826 CURSOR get_uncat_flag (c_resource_list_id pa_resource_lists_all_bg.resource_list_id%TYPE)
6827 IS
6828 SELECT UNCATEGORIZED_FLAG
6829 FROM pa_resource_lists_all_bg
6830 WHERE RESOURCE_LIST_ID = c_resource_list_id;
6831 
6832 l_uncat_flag VARCHAR2(1) := 'N';
6833 l_resource_list_id pa_resource_lists_all_bg.resource_list_id%TYPE;
6834 BEGIN
6835         l_resource_list_id := p_resource_list_id;
6836 
6837         IF l_resource_list_id IS NULL THEN
6838                 l_resource_list_id := pa_task_assignment_utils.get_wp_resource_list_id(p_project_id);
6839         END IF;
6840 
6841         OPEN get_uncat_flag(l_resource_list_id);
6842         FETCH get_uncat_flag INTO l_uncat_flag;
6843         CLOSE get_uncat_flag;
6844 
6845         RETURN l_uncat_flag;
6846 
6847 END is_uncategorized_res_list;
6848 /* End for bug 6023345*/
6849 
6850 END PA_TASK_ASSIGNMENT_UTILS;
6851