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