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