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