[Home] [Help]
PACKAGE BODY: APPS.PA_PROJECT_PVT
Source
1 package body PA_PROJECT_PVT as
2 /*$Header: PAPMPRVB.pls 120.42.12020000.6 2013/04/10 09:45:34 jlraj ship $*/
3
4 --Global constants to be used in error messages
5 G_PKG_NAME CONSTANT VARCHAR2(30) :='PA_PROJECT_PVT';
6 G_PROJECT_CODE CONSTANT VARCHAR2(100) :='PROJECT';
7 G_TASK_CODE CONSTANT VARCHAR2(100) :='TASK';
8 G_KEY_MEMBER_CODE CONSTANT VARCHAR2(100) :='KEY_MEMBER';
9 G_CLASS_CAT_CODE CONSTANT VARCHAR2(100) :='CLASS_CATEGORY';
10 G_USER_ID CONSTANT NUMBER := FND_GLOBAL.user_id;
11 G_LOGIN_ID CONSTANT NUMBER := FND_GLOBAL.login_id;
12 -- anlee org role changes
13 G_KEY_MEMBER_CODE CONSTANT VARCHAR2(100) :='ORG_ROLE';
14 l_pm_product_code VARCHAR2(2) :='Z'; /*for bug 2413400 a new variable defined.*/
15
16 -- scope of these four global variables pertains within this package body
17 g_rev_ind_rate_sch_id pa_ind_rate_schedules.ind_rate_sch_id%TYPE := NULL; -- added for bug 3975253 (or can also init to PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM )
18 g_rev_rate_sch_type pa_ind_rate_schedules.ind_rate_schedule_type%TYPE := NULL; -- added for bug 3975253
19 g_inv_ind_rate_sch_id pa_ind_rate_schedules.ind_rate_sch_id%TYPE := NULL; -- added for bug 3975253
20 g_inv_rate_sch_type pa_ind_rate_schedules.ind_rate_schedule_type%TYPE := NULL; -- added for bug 3975253
21
22 /*code added for bug no:2413400 */
23 Cursor p_product_code_csr (p_pm_product_code IN VARCHAR2)
24 Is
25 Select 'X'
26 from pa_lookups
27 where lookup_type='PM_PRODUCT_CODE'
28 and lookup_code = p_pm_product_code;
29
30
31 --====================================================================================
32 --Name: add_key_members
33 --Type: Procedure
34 --Description: This procedure can be used to add key members
35 -- to a new or already existing project using
36 -- the overridable view.
37 --
38 --Called subprograms: none
39 --
40 --
41 --
42 --History:
43 -- 15-AUG-1996 L. de Werker Created
44 -- 17-JUL-2000 Mohnish
45 -- added code for ROLE BASED SECURITY:
46 -- added the call to PA_PROJECT_PARTIES_PUB.CREATE_PROJECT_PARTY
47 -- 19-JUL-2000 Mohnish incorporated PA_PROJECT_PARTIES_PUB API changes
48 --
49 PROCEDURE add_key_members
50 ( p_return_status OUT NOCOPY VARCHAR2 , --4537865 Added nocopy hint
51 p_pa_source_template_id IN NUMBER ,
52 p_project_id IN NUMBER ,
53 p_key_members IN pa_project_pub.project_role_tbl_type )
54 IS
55
56 --needed to get the overridable fields for this project template source
57 /* commented the code for the Bug#1891621, starts here */
58 /* CURSOR l_override_fields_csr
59 (p_pa_source_template_id NUMBER)
60 IS
61 SELECT DISTINCT *
62 FROM pa_override_fields_v pof
63 WHERE pof.pa_source_template_id = p_pa_source_template_id;
64
65 TYPE override_fields_table_type IS TABLE OF l_override_fields_csr%rowtype
66 INDEX BY BINARY_INTEGER;
67 */
68 /* commented the code for the Bug#1891621, ends here */
69
70 /* modified the following cursor for Bug#5196996
71 CURSOR l_project_role_types_csr (p_role_type IN VARCHAR2)
72 IS
73 SELECT 'x' FROM
74 pa_project_role_types
75 WHERE project_role_type = p_role_type; */
76
77 --This is the modified cursor Bug#5196996
78
79 CURSOR l_project_role_types_csr(p_role_type IN VARCHAR2,p_project_id IN number)
80 IS
81 SELECT 'x'
82 FROM pa_project_role_types_v roles,
83 pa_role_controls controls,
84 pa_projects_all proj
85 WHERE proj.project_id = p_project_id
86 AND proj.ROLE_LIST_ID is null
87 AND roles.project_role_id = controls.project_role_id
88 AND roles.PROJECT_ROLE_TYPE = p_role_type
89 AND controls.role_control_code = 'ALLOW_AS_PROJ_MEMBER'
90 AND trunc(sysdate) between start_date_active and nvl(end_date_active,sysdate)
91 UNION ALL
92 SELECT 'x'
93 FROM pa_project_role_types_v roles,
94 pa_role_controls controls,
95 pa_projects_all proj,
96 pa_role_list_members prlm
97 WHERE proj.project_id = p_project_id
98 AND proj.ROLE_LIST_ID = prlm.role_list_id
99 AND prlm.project_role_id = roles.project_role_id
100 AND roles.project_role_id = controls.project_role_id
101 AND roles.PROJECT_ROLE_TYPE = p_role_type
102 AND controls.role_control_code = 'ALLOW_AS_PROJ_MEMBER'
103 AND trunc(sysdate) between start_date_active and nvl(end_date_active,sysdate);
104
105 -- the above cusroe has been modified for Bug#5196996
106
107 /* Bug 2480072 - Modified the following cursor to add cursor
108 parameters p_start_date and p_end_date and
109 added the AND clause in where */
110
111 /* added the code for the Bug#1891621, starts here */
112 CURSOR l_project_manager_counter_csr( p_project_id NUMBER,
113 p_start_date DATE,
114 p_end_date DATE
115 ) IS
116 select count(*)
117 from pa_project_players
118 where project_id = p_project_id
119 and project_role_type = 'PROJECT MANAGER'
120 and (( nvl(end_date_active,nvl(p_start_date,sysdate)) between
121 nvl(p_start_date,sysdate) and nvl(p_end_date,sysdate))
122 OR
123 (start_date_active between nvl(p_start_date,sysdate) and nvl(p_end_date,sysdate)));
124 /* added the code for the Bug#1891621, ends here */
125
126 l_api_name CONSTANT VARCHAR2(30) := 'add_key_members';
127 -- l_override_fields_rec l_override_fields_csr%rowtype;
128 -- l_override_fields_tab override_fields_table_type;
129 i BINARY_INTEGER :=0;
130 j BINARY_INTEGER :=0;
131 -- l_field_is_overridable BINARY_INTEGER :=0;
132 l_project_manager_counter NUMBER := 0;
133 l_max_number_of_proj_managers CONSTANT NUMBER := 1;
134 l_dummy VARCHAR2(1);
135 l_amg_segment1 VARCHAR2(25);
136 l_completion_date DATE;
137 v_start_date_active DATE;
138 v_end_date_active DATE;
139 v_project_role_id NUMBER;
140 v_project_role_type VARCHAR2(20);
141 v_person_id NUMBER;
142 v_null_number NUMBER;
143 v_null_char VARCHAR2(1);
144 x_return_status VARCHAR2(255);
145 x_msg_count NUMBER;
146 x_msg_data VARCHAR2(255);
147 x_project_party_id NUMBER;
148 x_resource_id NUMBER;
149 l_wf_item_type VARCHAR2(30);
150 l_wf_type VARCHAR2(30);
151 l_wf_party_process VARCHAR2(30);
152 l_assignment_id NUMBER;
153 l_resource_id NUMBER;
154
155
156 --needed to get the field values associated to a AMG message
157
158 CURSOR l_amg_project_csr
159 (p_pa_project_id pa_projects.project_id%type)
160 IS
161 SELECT segment1,COMPLETION_DATE
162 FROM pa_projects p
163 WHERE p.project_id = p_pa_project_id;
164
165 BEGIN
166
167 -- Standard begin of API savepoint
168
169 SAVEPOINT add_key_members_pvt;
170
171
172 -- Set API return status to success
173
174 p_return_status := FND_API.G_RET_STS_SUCCESS;
175
176 --get all the overridable fields for this project template source
177 /* commented the code for the Bug#1891621, starts here */
178 /* OPEN l_override_fields_csr(p_pa_source_template_id);
179 i := 0;
180 LOOP
181 i := i + 1;
182 FETCH l_override_fields_csr INTO l_override_fields_rec;
183 EXIT WHEN l_override_fields_csr%NOTFOUND;
184 l_override_fields_tab(i) := l_override_fields_rec;
185
186 END LOOP;
187
188 CLOSE l_override_fields_csr;
189 */
190 /* commented the code for the Bug#1891621, ends here */
191 -- Get segment1 for AMG messages
192
193 OPEN l_amg_project_csr( p_project_id );
194 FETCH l_amg_project_csr INTO l_amg_segment1,l_completion_date;
195 CLOSE l_amg_project_csr;
196
197 /* Bug 2480072 Commenting the open, fetch and close of the following cursor and
198 shifting it to the inside while loop */
199
200 /* added the code for the Bug#1891621, starts here
201 OPEN l_project_manager_counter_csr( p_project_id );
202 FETCH l_project_manager_counter_csr INTO l_project_manager_counter;
203 CLOSE l_project_manager_counter_csr;
204 added the code for the Bug#1891621, ends here
205 */
206 i := p_key_members.first;
207
208 WHILE i IS NOT NULL LOOP
209
210 /* Bug 2480072 - Added the following curosr fetch, open and close call */
211 OPEN l_project_manager_counter_csr( p_project_id ,p_key_members(i).start_date,p_key_members(i).end_date);
212 FETCH l_project_manager_counter_csr INTO l_project_manager_counter;
213 CLOSE l_project_manager_counter_csr;
214
215 -- l_field_is_overridable := 0;
216 -- Check whether this is a valid employee
217
218 IF (p_key_members(i).person_id <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM) AND
219 (p_key_members(i).person_id IS NOT NULL) THEN
220 IF check_valid_employee (p_key_members(i).person_id) = 'N'
221 THEN
222 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
223 THEN
224 pa_interface_utils_pub.map_new_amg_msg
225 ( p_old_message_code => 'PA_INVALID_KEY_MEMBER'
226 ,p_msg_attribute => 'CHANGE'
227 ,p_resize_flag => 'N'
228 ,p_msg_context => 'PROJ'
229 ,p_attribute1 => l_amg_segment1
230 ,p_attribute2 => ''
231 ,p_attribute3 => ''
232 ,p_attribute4 => ''
233 ,p_attribute5 => '');
234 END IF;
235 RAISE FND_API.G_EXC_ERROR;
236 END IF;
237
238 -- validate the role type
239 OPEN l_project_role_types_csr (p_key_members(i).project_role_type,p_project_id); --New parameter for bug 5196996
240 FETCH l_project_role_types_csr INTO l_dummy;
241 IF l_project_role_types_csr%NOTFOUND THEN
242 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
243 THEN
244 pa_interface_utils_pub.map_new_amg_msg
245 ( p_old_message_code => 'PA_INVALID_ROLE_TYPE'
246 ,p_msg_attribute => 'CHANGE'
247 ,p_resize_flag => 'N'
248 ,p_msg_context => 'PROJ'
249 ,p_attribute1 => l_amg_segment1
250 ,p_attribute2 => ''
251 ,p_attribute3 => ''
252 ,p_attribute4 => ''
253 ,p_attribute5 => '');
254 END IF;
255 CLOSE l_project_role_types_csr;
256 RAISE FND_API.G_EXC_ERROR;
257 ELSE
258 CLOSE l_project_role_types_csr;
259 END IF;
260
261
262 IF p_key_members(i).start_date <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE
263 AND p_key_members(i).end_date <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE
264 THEN
265 IF p_key_members(i).end_date < p_key_members(i).start_date
266 THEN
267
268 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
269 THEN
270 pa_interface_utils_pub.map_new_amg_msg
271 ( p_old_message_code => 'PA_SU_INVALID_DATES'
272 ,p_msg_attribute => 'CHANGE'
273 ,p_resize_flag => 'N'
274 ,p_msg_context => 'PROJ'
275 ,p_attribute1 => l_amg_segment1
276 ,p_attribute2 => ''
277 ,p_attribute3 => ''
278 ,p_attribute4 => ''
279 ,p_attribute5 => '');
280 END IF;
281
282 RAISE FND_API.G_EXC_ERROR;
283 END IF;
284 END IF;
285 /* commented the code for the Bug#1891621, starts here */
286 /* j := l_override_fields_tab.first;
287
288 --check whether this project role type is overridable
289 WHILE j IS NOT NULL LOOP
290 -- dbms_output.put_line('field_name = '||l_override_fields_tab(j).pa_field_name);
291 -- dbms_output.put_line('display_name = '||l_override_fields_tab(j).pa_display_name);
292 IF l_override_fields_tab(j).pa_field_name = 'KEY_MEMBER'
293 AND upper(l_override_fields_tab(j).type) = upper(p_key_members(i).project_role_type)
294 THEN
295 l_field_is_overridable := 1;
296
297 IF upper(p_key_members(i).project_role_type) = 'PROJECT MANAGER'
298 THEN l_project_manager_counter := l_project_manager_counter + 1;
299 END IF;
300
301 EXIT;
302 END IF;
303 j := l_override_fields_tab.next(j);
304 END LOOP;
305
306 IF l_field_is_overridable <> 1
307 --if not overridable RAISE ERROR else insert
308 THEN
309
310 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
311 THEN
312 pa_interface_utils_pub.map_new_amg_msg
313 ( p_old_message_code => 'PA_ROLE_TYPE_NOT_OVERRIDABLE'
314 ,p_msg_attribute => 'CHANGE'
315 ,p_resize_flag => 'Y'
316 ,p_msg_context => 'PROJ'
317 ,p_attribute1 => l_amg_segment1
318 ,p_attribute2 => ''
319 ,p_attribute3 => ''
320 ,p_attribute4 => ''
321 ,p_attribute5 => '');
322 END IF;
323
324 RAISE FND_API.G_EXC_ERROR;
325
326 ELSE
327 */
328 /* commented the code for the Bug#1891621, ends here */
329
330 IF upper(p_key_members(i).project_role_type) = 'PROJECT MANAGER'
331 AND l_project_manager_counter > l_max_number_of_proj_managers
332 THEN
333 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
334 THEN
335 pa_interface_utils_pub.map_new_amg_msg
336 ( p_old_message_code => 'PA_PR_TOO_MANY_MGRS'
337 ,p_msg_attribute => 'CHANGE'
338 ,p_resize_flag => 'N'
339 ,p_msg_context => 'PROJ'
340 ,p_attribute1 => l_amg_segment1
341 ,p_attribute2 => ''
342 ,p_attribute3 => ''
343 ,p_attribute4 => ''
344 ,p_attribute5 => '');
345 END IF;
346 RAISE FND_API.G_EXC_ERROR;
347 ELSE
348
349 /*
350 -- begin OLD code before changes for ROLE BASED SECURITY
351 INSERT INTO pa_project_players
352 (project_id
353 ,person_id
354 ,project_role_type
355 ,start_date_active
356 ,end_date_active
357 ,last_update_date
358 ,last_updated_by
359 ,creation_date
360 ,created_by
361 ,last_update_login )
362 VALUES
363 ( p_project_id
364 ,p_key_members(i).person_id
365 ,p_key_members(i).project_role_type
366 ,DECODE(p_key_members(i).start_date,
367 PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE,
368 TRUNC(SYSDATE),
369 NULL,TRUNC(SYSDATE),
370 p_key_members(i).start_date)
371 ,p_key_members(i).end_date
372 ,sysdate
373 ,fnd_global.user_id
374 ,sysdate
375 ,fnd_global.user_id
376 ,fnd_global.login_id );
377 -- end OLD code before changes for ROLE BASED SECURITY
378 */
379 -- begin NEW code for ROLE BASED SECURITY
380 /* Select
381 DECODE(p_key_members(i).start_date,
382 PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE, TRUNC(SYSDATE),
383 NULL,TRUNC(SYSDATE),
384 p_key_members(i).start_date)
385 Into v_start_date_active
386 From dual;
387 */ --commented and added following line. --Ansari
388
389 -- v_start_date_active := PA_PROJECT_PARTIES_PUB.GET_KEY_MEMBER_START_DATE (p_project_id);
390
391 /*Commented the below code for the bug 2910972*/
392
393 /* IF p_key_members(i).start_date is null OR
394 p_key_members(i).start_date = PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE
395 THEN
396 v_start_date_active := PA_PROJECT_PARTIES_PUB.GET_KEY_MEMBER_START_DATE (p_project_id);
397 ELSE
398 Code addition starts for the bug 2686120
399 IF p_key_members(i).start_date > sysdate THEN
400 v_start_date_active := p_key_members(i).start_date;
401 ELSE
402 v_start_date_active := PA_PROJECT_PARTIES_PUB.GET_KEY_MEMBER_START_DATE (p_project_id);
403 END IF;
404 Code addition ends for the bug 2686120
405 END IF; */
406
407 /*Added the below code for the bug 2910972*/
408
409 IF p_key_members(i).start_date is null OR
410 p_key_members(i).start_date = PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE
411 THEN
412 v_start_date_active := NULL;
413 ELSE
414 v_start_date_active := p_key_members(i).start_date;
415 END IF;
416
417 /*End of the code added for the bug 2910972*/
418
419 Select project_role_id
420 Into v_project_role_id
421 From pa_project_role_types
422 Where project_role_type=p_key_members(i).project_role_type;
423
424 v_end_date_active := p_key_members(i).end_date;
425 v_project_role_type := p_key_members(i).project_role_type;
426 v_person_id := p_key_members(i).person_id;
427 v_null_number := to_number(NULL);
428
429 PA_PROJECT_PARTIES_PUB.CREATE_PROJECT_PARTY(
430 p_api_version => 1.0 -- p_api_version
431 , p_init_msg_list => FND_API.G_TRUE -- p_init_msg_list
432 , p_commit => FND_API.G_FALSE -- p_commit
433 , p_validate_only => FND_API.G_FALSE -- p_validate_only
434 , p_validation_level => FND_API.G_VALID_LEVEL_FULL -- p_validation_level
435 , p_debug_mode => 'N' -- p_debug_mode
436 , p_object_id => p_project_id -- p_object_id
437 , p_OBJECT_TYPE => 'PA_PROJECTS' -- p_OBJECT_TYPE
438 , p_project_role_id => v_project_role_id -- p_project_role_id
439 , p_project_role_type => NULL -- p_project_role_type
440 , p_RESOURCE_TYPE_ID => 101 -- p_RESOURCE_TYPE_ID
441 , p_resource_source_id => v_person_id -- p_resource_source_id
442 , p_resource_name => v_null_char -- p_resource_name
443 , p_start_date_active => v_start_date_active -- p_start_date_active
444 , p_scheduled_flag => 'N' -- p_scheduled_flag
445 -- , p_record_version_number => 1 -- p_record_version_number
446 , p_calling_module => 'FORM' -- p_calling_module
447 , p_project_id => p_project_id -- p_project_id
448 , p_project_end_date => l_completion_date -- p_project_end_date
449 , p_end_date_active => v_end_date_active -- p_end_date_active
450 , x_project_party_id => x_project_party_id -- x_project_party_id
451 , x_resource_id => x_resource_id -- x_resource_id
452 , x_wf_item_type =>l_wf_item_type
453 , x_wf_type => l_wf_type
454 , x_wf_process => l_wf_party_process
455 , x_assignment_id => l_assignment_id
456 , x_return_status => x_return_status -- x_return_status
457 , x_msg_count => x_msg_count -- x_msg_count
458 , x_msg_data => x_msg_data -- x_msg_data
459 );
460 IF (x_return_status <> FND_API.G_RET_STS_SUCCESS) Then
461 p_return_status := x_return_status;
462 -- p_msg_count := x_msg_count;
463 -- p_msg_data := SUBSTR(p_msg_data||x_msg_data,1,2000);
464 if (x_return_status = FND_API.G_RET_STS_ERROR) then
465 raise FND_API.G_EXC_UNEXPECTED_ERROR;
466 else -- (x_return_status = FND_API.G_RET_STS_UNEXP_ERROR) then
467 raise FND_API.G_EXC_ERROR;
468 end if;
469 END IF;
470 -- end NEW code for ROLE BASED SECURITY
471 END IF;
472
473 -- END IF;
474
475 END IF; -- IF(p_key_members(i).person_id <>
476 -- PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM)
477 i := p_key_members.next(i);
478
479 END LOOP; --key members
480
481
482 EXCEPTION
483
484 WHEN FND_API.G_EXC_ERROR
485 THEN
486 /* dbms_output.put_line('handling an G_EXC_ERROR exception'); */
487 ROLLBACK TO add_key_members_pvt;
488
489 p_return_status := FND_API.G_RET_STS_ERROR;
490
491 WHEN FND_API.G_EXC_UNEXPECTED_ERROR
492 THEN
493 /* dbms_output.put_line('handling an G_EXC_UNEXPECTED_ERROR exception'); */
494 ROLLBACK TO add_key_members_pvt;
495
496 p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
497
498 WHEN OTHERS THEN
499 /* dbms_output.put_line('handling an OTHERS exception'); */
500 ROLLBACK TO add_key_members_pvt;
501
502 p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
503
504 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
505 THEN
506 FND_MSG_PUB.add_exc_msg
507 ( p_pkg_name => G_PKG_NAME
508 , p_procedure_name => l_api_name );
509
510 END IF;
511
512 END add_key_members;
513
514 --====================================================================================
515 --Name: add_class_categories
516 --Type: Procedure
517 --Description: This procedure can be used to add class categories
518 -- to a new or already existing project using
519 -- the overridable view.
520 --
521 --Called subprograms: none
522 --
523 --
524 --
525 --History:
526 -- 07-AUG-2002 gjain Added code for Bug 2448159. Now if
527 -- pick_one_code_only_flag for a class_category
528 -- is 'Y' then no more than a single class code
529 -- can be added for that class category
530 --
531 -- 15-AUG-1996 L. de Werker Created
532 --
533 PROCEDURE add_class_categories
534 ( p_return_status OUT NOCOPY VARCHAR2 , -- 4537865 Added the nocopy hint
535 p_pa_source_template_id IN NUMBER ,
536 p_project_id IN NUMBER ,
537 p_class_categories IN pa_project_pub.class_category_tbl_type )
538 IS
539
540 --needed to get the overridable fields for this project template source
541 /* code commented for the bug#1891621, starts here */
542 /* CURSOR l_override_fields_csr
543 (p_pa_source_template_id NUMBER)
544 IS
545 SELECT DISTINCT *
546 FROM pa_override_fields_v pof
547 WHERE pof.pa_source_template_id = p_pa_source_template_id;
548
549 TYPE override_fields_table_type IS TABLE OF l_override_fields_csr%rowtype
550 INDEX BY BINARY_INTEGER;
551 */
552 /* code commented for the bug#1891621, ends here */
553 l_api_name CONSTANT VARCHAR2(30) := 'add_class_categories';
554 -- l_override_fields_rec l_override_fields_csr%rowtype;
555 -- l_override_fields_tab override_fields_table_type;
556 i BINARY_INTEGER :=0;
557 j BINARY_INTEGER :=0;
558 -- l_field_is_overridable BINARY_INTEGER :=0;
559 l_amg_segment1 VARCHAR2(25);
560
561 /* added the below two local variables for bug 2448159 */
562 l_pick_one_code_only VARCHAR2(1);
563 l_count NUMBER;
564
565 --needed to get the field values associated to a AMG message
566
567 CURSOR l_amg_project_csr
568 (p_pa_project_id pa_projects.project_id%type)
569 IS
570 SELECT segment1
571 FROM pa_projects p
572 WHERE p.project_id = p_pa_project_id;
573
574 p_multiple_task_msg VARCHAR2(1) := 'T';
575
576 /* Following Cursor l_valid_category_csr has been commented
577 for Performance Bug # 3693217
578
579 This cursor has been split into two for the Performance Fix
580
581
582 CURSOR l_valid_category_csr (c_project_id NUMBER, c_class_category VARCHAR2)
583 IS
584 SELECT 'Y'
585 FROM PA_VALID_CATEGORIES_V vc,
586 PA_PROJECTS_ALL ppa,
587 PA_PROJECT_TYPES_ALL ppta
588 WHERE ppa.project_id = c_project_id
589 AND ppa.project_type = ppta.project_type
590 AND nvl(ppa.org_id, -99) = nvl(ppta.org_id, -99)
591 AND ppta.project_type_id = vc.object_type_id
592 AND vc.class_category = c_class_category; */
593
594 /* Start of code for Performance Bug # 3693217*/
595 CURSOR l_valid_category_csr1 (c_project_id NUMBER, c_class_category VARCHAR2)
596 IS
597 SELECT 'Y'
598 FROM DUAL
599 WHERE EXISTS
600 (
601 SELECT 'Y'
602 FROM PA_CLASS_CATEGORIES cc,
603 PA_VALID_CATEGORIES vc,
604 PA_PROJECT_TYPES_ALL PPTA,
605 PA_PROJECTS_ALL PPA
606 WHERE PPA.PROJECT_ID = c_project_id
607 AND PPA.PROJECT_TYPE = PPTA.PROJECT_TYPE
608 -- AND nvl(PPA.ORG_ID, -99) = nvl(PPTA.ORG_ID, -99) - R12: Bug 4364092
609 AND PPA.ORG_ID = PPTA.ORG_ID
610 AND VC.CLASS_CATEGORY = c_class_category
611 AND VC.CLASS_CATEGORY = cc.CLASS_CATEGORY
612 AND TRUNC(SYSDATE) BETWEEN TRUNC(CC.START_DATE_ACTIVE)
613 AND TRUNC(NVL(CC.END_DATE_ACTIVE, SYSDATE))
614 AND VC.OBJECT_TYPE_ID = PPTA.PROJECT_TYPE_ID
615 AND TRUNC(SYSDATE) BETWEEN TRUNC(PPTA.START_DATE_ACTIVE)
616 AND TRUNC(NVL(PPTA.END_DATE_ACTIVE, SYSDATE))
617 ) ;
618
619 CURSOR l_valid_category_csr2 ( c_class_category VARCHAR2)
620 IS
621 SELECT 'Y'
622 FROM DUAL
623 WHERE EXISTS
624 (
625 SELECT 'Y'
626 FROM PA_CLASS_CATEGORIES cc
627 WHERE CC.OBJECT_TYPE = 'PA_PROJECTS'
628 AND CC.ALL_TYPES_VALID_FLAG = 'Y'
629 AND TRUNC(SYSDATE) BETWEEN TRUNC(CC.START_DATE_ACTIVE)
630 AND TRUNC(NVL(CC.END_DATE_ACTIVE, SYSDATE))
631 AND cc.CLASS_CATEGORY = c_class_category
632 ) ;
633
634 /* End of code for Performance Bug # 3693217*/
635
636 CURSOR l_check_percentage_csr (c_class_category VARCHAR2)
637 IS
638 SELECT 'Y'
639 FROM PA_CLASS_CATEGORIES
640 WHERE class_category = c_class_category
641 AND allow_percent_flag = 'Y';
642
643 CURSOR l_get_percent_flag_csr (c_class_category VARCHAR2)
644 IS
645 SELECT allow_percent_flag
646 FROM PA_CLASS_CATEGORIES
647 WHERE class_category = c_class_category;
648
649 /* code addition for bug 2448159 starts*/
650 CURSOR l_pick_one_code_only_flag (c_class_category VARCHAR2)
651 IS
652 SELECT PICK_ONE_CODE_ONLY_FLAG
653 FROM PA_CLASS_CATEGORIES
654 WHERE class_category = c_class_category;
655
656 CURSOR l_get_code_count (c_project_id NUMBER, c_class_category VARCHAR2)
657 IS
658 select count(*)
659 from PA_PROJECT_CLASSES
660 WHERE Project_id = c_project_id
661 AND class_category = c_class_category;
662 /* code addition for bug 2448159 ends */
663
664 l_dummy VARCHAR2(1) := 'Y';
665 l_dummy2 VARCHAR2(1) := 'Y';
666 l_allow_percent_flag VARCHAR2(1);
667 l_code_percentage NUMBER;
668
669 BEGIN
670
671
672 -- Standard begin of API savepoint
673
674 SAVEPOINT add_class_categories_pvt;
675
676
677 -- Set API return status to success
678
679 p_return_status := FND_API.G_RET_STS_SUCCESS;
680
681 -- get all the overridable fields for this project template source
682 /* code commented for the Bug#1891621, starts here */
683 /* OPEN l_override_fields_csr(p_pa_source_template_id);
684 i := 0;
685 LOOP
686 i := i + 1;
687 FETCH l_override_fields_csr INTO l_override_fields_rec;
688 EXIT WHEN l_override_fields_csr%NOTFOUND;
689 l_override_fields_tab(i) := l_override_fields_rec;
690
691 END LOOP;
692
693 CLOSE l_override_fields_csr;
694 */
695 /* code commented for the Bug#1891621, ends here */
696 -- Get segment1 for AMG messages
697
698 OPEN l_amg_project_csr( p_project_id );
699 FETCH l_amg_project_csr INTO l_amg_segment1;
700 CLOSE l_amg_project_csr;
701
702 i := p_class_categories.first;
703
704 WHILE i IS NOT NULL LOOP
705
706 -- Process only if a class category and class code are filled up
707
708 IF (p_class_categories(i).class_category <>
709 PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR ) AND
710 (p_class_categories(i).class_category IS NOT NULL )
711 AND (p_class_categories(i).class_code <>
712 PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR ) AND
713 (p_class_categories(i).class_code IS NOT NULL )
714
715 THEN
716 /* code commented for the bug#1891621, starts here */
717 /* l_field_is_overridable := 0;
718 j := l_override_fields_tab.first;
719
720 --check whether this class category type is overridable
721 WHILE j IS NOT NULL LOOP
722 IF l_override_fields_tab(j).pa_field_name = 'CLASSIFICATION'
723 AND upper(l_override_fields_tab(j).type) = upper(p_class_categories(i).class_category)
724 THEN
725 l_field_is_overridable := 1;
726 EXIT;
727
728 END IF;
729 j := l_override_fields_tab.next(j);
730 END LOOP;
731
732 IF l_field_is_overridable <> 1 --if not overridable error else insert
733 THEN
734
735 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
736 THEN
737 pa_interface_utils_pub.map_new_amg_msg
738 ( p_old_message_code => 'PA_CLASS_CAT_NOT_OVERRIDABLE'
739 ,p_msg_attribute => 'CHANGE'
740 ,p_resize_flag => 'Y'
741 ,p_msg_context => 'PROJ'
742 ,p_attribute1 => l_amg_segment1
743 ,p_attribute2 => ''
744 ,p_attribute3 => ''
745 ,p_attribute4 => ''
746 ,p_attribute5 => '');
747 END IF;
748
749 p_multiple_task_msg := 'F';
750 -- RAISE FND_API.G_EXC_ERROR;
751
752 ELSE
753 */
754 /* code commented for the bug#1891621, ends here */
755 /* dbms_output.put_line('Trying to insert'); */
756
757 /* dbms_output.put_line('1:'||p_class_categories(i).class_category
758 ||'2:'||p_class_categories(i).class_code
759 ||'3:'||fnd_global.user_id
760 ||'4:'||sysdate
761 ||'5:'||fnd_global.user_id
762 ||'6:'||fnd_global.login_id
763 ||'7:'||p_project_id
764 ||'8:'||sysdate); */
765
766
767 -- Check whether the category is valid for this project type
768
769 /* commented for performance bug fix 3693217
770 OPEN l_valid_category_csr(p_project_id, p_class_categories(i).class_category);
771 FETCH l_valid_category_csr INTO l_dummy;
772 if l_valid_category_csr%NOTFOUND then
773 l_dummy := 'N';
774 end if;
775 CLOSE l_valid_category_csr;*/
776
777 /* Start of Code for Performance Bug Fix 3693217 */
778
779 -- Review Comment Incorporated - If not found in Cursor1 ,then go for the cursor2
780 -- If not found in Cursor2 also ,then only set l_dummy as 'N'
781
782 OPEN l_valid_category_csr1(p_project_id, p_class_categories(i).class_category);
783 FETCH l_valid_category_csr1 INTO l_dummy;
784 if l_valid_category_csr1%NOTFOUND then
785 OPEN l_valid_category_csr2(p_class_categories(i).class_category);
786 FETCH l_valid_category_csr2 INTO l_dummy;
787 if l_valid_category_csr2%NOTFOUND then
788 l_dummy := 'N';
789 end if;
790 CLOSE l_valid_category_csr2;
791 end if;
792 CLOSE l_valid_category_csr1;
793 /* End of Code for Performance Bug Fix 3693217 */
794
795 -- Check whether percentage is allowed for this category
796 -- Also check that percentage is between 0 and 100
797 /* Bug#2474078 Added a condition to check whether code_percentage has been passed or not, the default value for
798 this parameter is PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM, hence code_percentage should not be equal to it */
799 if p_class_categories(i).code_percentage is not null and
800 p_class_categories(i).code_percentage <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM then
801 OPEN l_check_percentage_csr(p_class_categories(i).class_category);
802 FETCH l_check_percentage_csr INTO l_dummy2;
803 if l_check_percentage_csr%NOTFOUND then
804 l_dummy2 := 'N';
805 elsif (p_class_categories(i).code_percentage < 0) OR
806 (p_class_categories(i).code_percentage > 100) then
807 l_dummy2 := 'N';
808 end if;
809 CLOSE l_check_percentage_csr;
810 end if;
811
812 IF (check_class_code_valid
813 (p_class_categories(i).class_category,
814 p_class_categories(i).class_code) = 'N') OR
815 (l_dummy = 'N') OR (l_dummy2 = 'N')
816 THEN
817 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
818 THEN
819 pa_interface_utils_pub.map_new_amg_msg
820 ( p_old_message_code => 'PA_INVALID_CLASS_CATEGORY'
821 ,p_msg_attribute => 'CHANGE'
822 ,p_resize_flag => 'N'
823 ,p_msg_context => 'PROJ'
824 ,p_attribute1 => l_amg_segment1
825 ,p_attribute2 => ''
826 ,p_attribute3 => ''
827 ,p_attribute4 => ''
828 ,p_attribute5 => '');
829 END IF;
830
831 p_multiple_task_msg := 'F';
832 -- RAISE FND_API.G_EXC_ERROR;
833
834 END IF;
835
836 /* Modified the following code for bug #3629840. */
837 if p_class_categories(i).code_percentage = PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM then
838 l_code_percentage := NULL;
839 else
840 l_code_percentage := p_class_categories(i).code_percentage;
841 end if;
842
843 -- If allow_percent_flag is 'Y' and code_percentage is NULL, default to 0
844 if p_class_categories(i).code_percentage is null then
845 OPEN l_get_percent_flag_csr(p_class_categories(i).class_category);
846 FETCH l_get_percent_flag_csr INTO l_allow_percent_flag;
847 if l_get_percent_flag_csr%FOUND then
848 if l_allow_percent_flag = 'Y' then
849 l_code_percentage := 0;
850 end if;
851 end if;
852
853 /* below line of code also added for Bug 2448159
854 cursor l_get_percent_flag_csr should be closed otherwise we get error
855 'ORA-06511: PL/SQL: cursor already open' while adding multiple class categories */
856 CLOSE l_get_percent_flag_csr;
857 end if;
858
859 BEGIN -- 5348726 : Added for Bug#5294891
860 INSERT INTO pa_project_classes
861 (project_id
862 ,class_category
863 ,class_code
864 ,code_percentage
865 ,object_id
866 ,object_type
867 ,last_update_date
868 ,last_updated_by
869 ,creation_date
870 ,created_by
871 ,last_update_login
872 ,record_version_number /* Added For bug#2766416 */
873 )
874 VALUES
875 ( p_project_id
876 ,p_class_categories(i).class_category
877 ,p_class_categories(i).class_code
878 ,l_code_percentage
879 ,p_project_id
880 ,'PA_PROJECTS'
881 ,sysdate
882 ,fnd_global.user_id
883 ,sysdate
884 ,fnd_global.user_id
885 ,fnd_global.login_id
886 ,0 /* Added for bug#2766416 */
887 );
888
889 EXCEPTION -- 5348726 : Exception block added for Bug#5294891
890 WHEN DUP_VAL_ON_INDEX THEN
891 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
892 pa_interface_utils_pub.map_new_amg_msg
893 ( p_old_message_code => 'PA_DUPLICATE_CLASS_CATG'
894 ,p_msg_attribute => 'CHANGE'
895 ,p_resize_flag => 'Y'
896 ,p_msg_context => ''
897 ,p_attribute1 => ''
898 ,p_attribute2 => ''
899 ,p_attribute3 => ''
900 ,p_attribute4 => ''
901 ,p_attribute5 => '');
902 p_multiple_task_msg := 'F';
903 exit;
904 END IF;
905 END;
906
907 END IF;--IF (p_class_categories(i).class_category <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR )
908
909 i := p_class_categories.next(i);
910
911 END LOOP; --class categories
912
913 /* code addition for bug 2448159 starts*/
914 /* check if after insertion the constraint is being violated or not */
915
916 i := p_class_categories.first;
917
918 WHILE i IS NOT NULL LOOP
919
920 OPEN l_pick_one_code_only_flag (p_class_categories(i).class_category);
921 FETCH l_pick_one_code_only_flag INTO l_pick_one_code_only;
922 if l_pick_one_code_only_flag%NOTFOUND then
923 l_pick_one_code_only := null;
924 end if;
925 CLOSE l_pick_one_code_only_flag;
926
927 IF l_pick_one_code_only = 'Y' THEN
928
929 Open l_get_code_count(p_project_id , p_class_categories(i).class_category);
930 FETCH l_get_code_count into l_count;
931 CLOSE l_get_code_count;
932
933 IF l_count > 1 THEN
934 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
935 pa_interface_utils_pub.map_new_amg_msg
936 ( p_old_message_code => 'PA_ONE_CODE_ONLY_CLASS'
937 ,p_msg_attribute => 'CHANGE'
938 ,p_resize_flag => 'Y' /* Bug 2888297 Changed N to Y */
939 ,p_msg_context => 'PROJ'
940 ,p_attribute1 => l_amg_segment1
941 ,p_attribute2 => ''
942 ,p_attribute3 => ''
943 ,p_attribute4 => ''
944 ,p_attribute5 => '');
945
946 p_multiple_task_msg := 'F';
947 END IF;
948
949 END IF;
950 END IF;
951 i := p_class_categories.next(i);
952 END LOOP;
953 /* code addition for bug 2448159 ends */
954
955 IF p_multiple_task_msg = 'F'
956 THEN
957 RAISE FND_API.G_EXC_ERROR;
958 END IF;
959
960 EXCEPTION
961
962 WHEN FND_API.G_EXC_ERROR
963 THEN
964 /* dbms_output.put_line('handling an G_EXC_ERROR exception'); */
965 ROLLBACK TO add_class_categories_pvt;
966
967 p_return_status := FND_API.G_RET_STS_ERROR;
968
969 WHEN FND_API.G_EXC_UNEXPECTED_ERROR
970 THEN
971 /* dbms_output.put_line('handling an G_EXC_UNEXPECTED_ERROR exception'); */
972 ROLLBACK TO add_class_categories_pvt;
973
974 p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
975
976 WHEN OTHERS THEN
977 /* dbms_output.put_line('handling an OTHERS exception'); */
978 ROLLBACK TO add_class_categories_pvt;
979
980 p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
981
982 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
983 THEN
984 FND_MSG_PUB.add_exc_msg
985 ( p_pkg_name => G_PKG_NAME
986 , p_procedure_name => l_api_name );
987
988 END IF;
989
990 END add_class_categories;
991
992 --====================================================================================
993 --Name: add_task_round_one
994 --Type: Procedure
995 --Description: This procedure can be used to add a task to a new or already
996 -- existing project. This procedure should always be used together
997 -- with add_task_round_two.
998 --
999 --
1000 --Called subprograms: none
1001 --
1002 --
1003 --
1004 --History:
1005 -- 15-AUG-1996 L. de Werker Created
1006 -- 10_dec-1996 L. de Werker Enabled the use of task addresses
1007 -- 09-01-2006 vkadimes Changes are tagged with Bug Number 4689326.
1008 PROCEDURE add_task_round_one
1009 (p_return_status OUT NOCOPY VARCHAR2 -- 4537865 Added nocopy hint
1010 ,p_project_rec IN pa_projects%rowtype
1011 ,p_task_rec IN pa_project_pub.task_in_rec_type
1012 ,p_project_type_class_code IN pa_project_types.project_type_class_code%type
1013 ,p_service_type_code IN pa_project_types.service_type_code%type
1014 ,p_task_id OUT NOCOPY NUMBER ) -- 4537865 Added nocopy hint
1015 IS
1016
1017 CURSOR l_customer_csr( p_project_id NUMBER )
1018 IS
1019 SELECT customer_id
1020 FROM pa_project_customers
1021 WHERE project_id = p_project_id;
1022
1023 -- 4363092 TCA changes, replaced RA views with HZ tables
1024
1025 /*
1026 CURSOR l_address_csr(p_customer_id NUMBER, p_address_id NUMBER )
1027 IS
1028 SELECT 'x'
1029 FROM ra_addresses
1030 WHERE customer_id = p_customer_id
1031 AND address_id = p_address_id;
1032 */
1033
1034 CURSOR l_address_csr(p_customer_id NUMBER, p_address_id NUMBER )
1035 IS
1036 SELECT 'x'
1037 FROM
1038 hz_cust_acct_sites_all acct_site
1039 WHERE
1040 acct_site.cust_account_id = p_customer_id
1041 AND acct_site.cust_acct_site_id = p_address_id;
1042 -- 4363092 end
1043
1044 CURSOR l_service_type_csr( p_service_type_code VARCHAR2 )
1045 IS
1046 SELECT 'x'
1047 FROM pa_lookups
1048 WHERE lookup_type = 'SERVICE TYPE'
1049 AND lookup_code = p_service_type_code;
1050
1051 l_api_name CONSTANT VARCHAR2(30) := 'add_task_round_one';
1052 l_task_id NUMBER;
1053 l_project_id NUMBER;
1054 l_task_in_rec pa_project_pub.task_in_rec_type;
1055 l_wbs_level NUMBER :=1;
1056 l_dummy VARCHAR2(1);
1057 l_customer_id NUMBER;
1058 l_address_id NUMBER;
1059 l_address_valid VARCHAR2(1);
1060 l_attribute_category VARCHAR2(30);
1061 l_attribute1 VARCHAR2(150);
1062 l_attribute2 VARCHAR2(150);
1063 l_attribute3 VARCHAR2(150);
1064 l_attribute4 VARCHAR2(150);
1065 l_attribute5 VARCHAR2(150);
1066 l_attribute6 VARCHAR2(150);
1067 l_attribute7 VARCHAR2(150);
1068 l_attribute8 VARCHAR2(150);
1069 l_attribute9 VARCHAR2(150);
1070 l_attribute10 VARCHAR2(150);
1071 --bug 6153503
1072 l_return_msg varchar2(2000);
1073 l_validate_status varchar2(1);
1074 --end bug 6153503
1075 l_allow_cross_charge_flag VARCHAR2(1);
1076 l_project_rate_type PA_PROJECTS.PROJECT_RATE_TYPE%type ; --bug2170388
1077 l_project_rate_date DATE;
1078 l_actual_start_date DATE;
1079 l_actual_finish_date DATE;
1080 l_early_start_date DATE;
1081 l_early_finish_date DATE;
1082 l_late_start_date DATE;
1083 l_late_finish_date DATE;
1084 l_scheduled_start_date DATE;
1085 l_scheduled_finish_date DATE;
1086 l_cc_process_labor_flag VARCHAR2(1);
1087 l_labor_tp_schedule_id NUMBER;
1088 l_labor_tp_fixed_date DATE;
1089 l_cc_process_nl_flag VARCHAR2(1);
1090 l_nl_tp_schedule_id NUMBER;
1091 l_nl_tp_fixed_date DATE;
1092 l_receive_project_invoice_flag VARCHAR2(1);
1093 l_work_type_id NUMBER;
1094 l_emp_bill_rate_schedule_id NUMBER;
1095 l_job_bill_rate_schedule_id NUMBER;
1096
1097 --Sakthi MCB
1098 l_non_lab_std_bill_rt_sch_id NUMBER;
1099 l_taskfunc_cost_rate_date DATE;
1100 l_taskfunc_cost_rate_type VARCHAR2(30);
1101
1102 l_non_labor_disc_reason_code VARCHAR2(30);
1103 l_labor_disc_reason_code VARCHAR2(30);
1104
1105 l_competence_match_wt NUMBER;
1106 l_availability_match_wt NUMBER;
1107 l_job_level_match_wt NUMBER;
1108 l_enable_automated_search VARCHAR2(1);
1109 l_search_min_availability NUMBER;
1110 l_search_org_hier_id NUMBER;
1111 l_search_starting_org_id NUMBER;
1112 l_search_country_code VARCHAR2(2);
1113 l_min_cand_score_reqd_for_num NUMBER;
1114 l_invproc_currency_type VARCHAR2(30);
1115 l_revproc_currency_code VARCHAR2(15);
1116 l_project_bil_rate_date_code VARCHAR2(30);
1117 l_project_bil_rate_type VARCHAR2(30);
1118 l_project_bil_rate_date DATE;
1119 l_project_bil_exchange_rate NUMBER;
1120 l_projfunc_currency_code VARCHAR2(15);
1121 l_projfunc_bil_rate_date_code VARCHAR2(30);
1122 l_projfunc_bil_rate_type VARCHAR2(30);
1123 l_projfunc_bil_rate_date DATE;
1124 l_projfunc_bil_exchange_rate NUMBER;
1125 l_funding_rate_date_code VARCHAR2(30);
1126 l_funding_rate_type VARCHAR2(30);
1127 l_funding_rate_date DATE;
1128 l_funding_exchange_rate NUMBER;
1129 l_baseline_funding_flag VARCHAR2(1);
1130 l_projfunc_cost_rate_type VARCHAR2(30);
1131 l_projfunc_cost_rate_date DATE;
1132 l_inv_by_bill_trans_curr_flag VARCHAR2(1);
1133 l_multi_currency_billing_flag VARCHAR2(1);
1134 --Sakthi MCB
1135
1136 --Sakthi Structure
1137
1138 l_assign_precedes_task VARCHAR2(1);
1139 l_split_cost_from_wokplan_flag VARCHAR2(1);
1140 l_split_cost_from_bill_flag VARCHAR2(1);
1141
1142 --Sakthi Structure
1143
1144 --PA L Changes 2872708
1145 l_retirement_cost_flag VARCHAR2(1):= 'N'; --bug 2959252; defaulting to 'N'
1146 l_cint_eligible_flag VARCHAR2(1):= 'N'; --bug 2959252; defaulting to 'N'
1147 l_cint_stop_date DATE;
1148 --End PA L Changes 2872708
1149
1150
1151 --Sakthi MCB
1152
1153 l_out_start_date DATE;
1154 l_out_completion_date DATE;
1155 l_error_code NUMBER;
1156 l_error_message VARCHAR2(100);
1157 l_temp VARCHAR2(1);
1158 i NUMBER; -- added for bug 13923366
1159
1160 l_amg_segment1 VARCHAR2(25);
1161 l_amg_task_number VARCHAR2(50);
1162 l_adj_on_std_inv VARCHAR2(2); /* Added for 12.2Payroll billing ER 11899223 */
1163 l_pa_parent_task_id number; /* Added for 12.2Payroll billing ER 11899223 */
1164 --needed to get the field values associated to a AMG message
1165
1166 CURSOR l_amg_project_csr
1167 (p_pa_project_id pa_projects.project_id%type)
1168 IS
1169 SELECT segment1
1170 FROM pa_projects p
1171 WHERE p.project_id = p_pa_project_id;
1172
1173 --needed to get the default field values
1174
1175 CURSOR l_default_project_csr
1176 (p_pa_project_id pa_projects.project_id%type)
1177 IS
1178 SELECT allow_cross_charge_flag,
1179 project_rate_date,
1180 project_rate_type,
1181 cc_process_labor_flag,
1182 labor_tp_schedule_id,
1183 labor_tp_fixed_date,
1184 cc_process_nl_flag,
1185 nl_tp_schedule_id,
1186 nl_tp_fixed_date,
1187 work_type_id,
1188 emp_bill_rate_schedule_id,
1189 job_bill_rate_schedule_id,
1190 projfunc_cost_rate_type,
1191 projfunc_cost_rate_date,
1192 non_lab_std_bill_rt_sch_id
1193 --Sakthi MCB
1194 /*
1195 competence_match_wt,
1196 availability_match_wt,
1197 job_level_match_wt,
1198 enable_automated_search,
1199 search_min_availability,
1200 search_org_hier_id,
1201 search_starting_org_id,
1202 search_country_code,
1203 min_cand_score_reqd_for_nom,
1204 non_lab_std_bill_rt_scr_id,
1205 invproc_currency_type,
1206 revproc_currency_code,
1207 project_bil_rate_date_code,
1208 project_bil_rate_type,
1209 project_bil_rate_date,
1210 project_bil_exchange_rate,
1211 profunc_currency_code,
1212 projfunc_bil_rate_date_Code,
1213 projfunc_bil_rate_type,
1214 projfunc_bil_rate_date,
1215 projfunc_bil_exchange_rate,
1216 funding_rate_date_Code,
1217 funding_rate_type,
1218 funding_rate_date,
1219 funding_exchange_rate,
1220 baseline_funding_flag,
1221 projfunc_cost_rate_type,
1222 projfunc_cost_rate_date,
1223 inv_by_bill_trans_curr_flag,
1224 multi_currency_billing_flag,
1225 --Sakthi MCB
1226 --Sakthi Structure
1227 assign_precedes_task,
1228 split_cost_from_workplan_flag,
1229 split_cost_from_bill_flag
1230 --Sakthi Structure
1231 */
1232 FROM pa_projects p
1233 WHERE p.project_id = p_pa_project_id;
1234
1235 -- Fix for Bug # 1335417
1236 -- needed for update of Fixed Date( p_cost_ind_sch_fixed_date)
1237
1238 CURSOR l_ind_rate_schedule_type_csr( p_cost_ind_rate_sch_id NUMBER)
1239 IS
1240 SELECT ind_rate_schedule_type
1241 FROM pa_ind_rate_schedules
1242 WHERE ind_rate_sch_id = p_cost_ind_rate_sch_id;
1243
1244 --Bug 3279981
1245 --The revenue acrual method for the task needs to be defaulted from the (new) project
1246 CURSOR cur_get_rev_acc_mth IS
1247 SELECT revenue_accrual_method
1248 FROM pa_projects_all
1249 WHERE project_id = p_project_rec.project_id;
1250
1251 CURSOR cur_get_inv_mth IS
1252 SELECT invoice_method
1253 FROM pa_projects_all
1254 WHERE project_id = p_project_rec.project_id;
1255
1256 CURSOR cur_get_def_top_task_cust IS
1257 SELECT customer_id
1258 FROM pa_project_customers
1259 WHERE project_id = p_project_rec.project_id
1260 AND default_top_task_cust_flag = 'Y';
1261
1262
1263 -- Fix for Bug # 1335417
1264 l_temp_var_sch_type VARCHAR2(1);
1265
1266 -- (Begin Venkat) FP_M changes
1267 l_revenue_accrual_method VARCHAR2(30) := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR;
1268 l_invoice_method VARCHAR2(30) := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR;
1269 l_customer_id1 NUMBER;
1270 l_gen_etc_source_code VARCHAR2(30) := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR;
1271 -- (End Venkat) FP_M changes
1272
1273 -- rtarway, 3658479
1274 l_labor_cost_multiplier_name VARCHAR2(30) := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR;
1275
1276 --BUG 3924597, added by rtarway for etc source default
1277 l_ref_task_id NUMBER ;
1278 L_WP_SEPARATE_FROM_FIN VARCHAR2(1);
1279 L_RETURN_STATUS VARCHAR2(1);
1280
1281 CURSOR get_gen_etc_source_code (l_task_id NUMBER, l_project_id NUMBER)
1282 IS
1283 select gen_etc_source_code
1284 from pa_tasks
1285 where
1286 task_id = l_task_id
1287 and project_id = l_project_id ;
1288 --End BUG 3924597, added by rtarway for etc source default
1289
1290 -- Start of addition for 4378507
1291 CURSOR l_task_csr
1292 (p_project_id NUMBER
1293 ,p_pm_task_reference VARCHAR2)
1294 IS
1295 SELECT t.TOP_TASK_ID
1296 FROM pa_tasks t
1297 WHERE t.project_id = p_project_id
1298 AND t.pm_task_reference = p_pm_task_reference;
1299
1300
1301 CURSOR l_task_id_csr
1302 (p_project_id NUMBER
1303 ,p_task_id NUMBER)
1304 IS
1305 SELECT t.TOP_TASK_ID
1306 FROM pa_tasks t
1307 WHERE t.project_id = p_project_id
1308 AND t.task_id = p_task_id;
1309
1310 l_parent_TOP_TASK_ID pa_tasks.TOP_TASK_ID%type;
1311 --End of addition for 4378507
1312 -- Added for bug# 4689326
1313 CURSOR l_customer_parent_task (l_p_parent_task_id NUMBER) IS
1314 SELECT customer_id FROM pa_tasks WHERE task_id=l_p_parent_task_id;
1315
1316 BEGIN
1317
1318 -- Standard begin of API savepoint
1319
1320 SAVEPOINT add_task_round_one_pvt;
1321
1322
1323 -- Set API return status to success
1324
1325 p_return_status := FND_API.G_RET_STS_SUCCESS;
1326
1327 -- copy the incoming parameters to local variables
1328 l_task_in_rec := p_task_rec;
1329 l_project_id := p_project_rec.project_id;
1330
1331 -- Get segment1 for AMG messages
1332
1333 OPEN l_amg_project_csr( l_project_id );
1334 FETCH l_amg_project_csr INTO l_amg_segment1;
1335 CLOSE l_amg_project_csr;
1336
1337 l_amg_task_number := pa_interface_utils_pub.get_task_number_amg
1338 (p_task_number=> l_task_in_rec.task_name
1339 ,p_task_reference => l_task_in_rec.pm_task_reference
1340 ,p_task_id => '');
1341
1342 --Refuse tasks if pm_task_reference is not provided
1343 --Refuse tasks if task_name is not provided
1344
1345 IF l_task_in_rec.pm_task_reference IS NULL
1346 OR l_task_in_rec.pm_task_reference = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
1347 THEN
1348 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
1349 THEN
1350 pa_interface_utils_pub.map_new_amg_msg
1351 ( p_old_message_code => 'PA_TASK_REF_IS_NULL'
1352 ,p_msg_attribute => 'CHANGE'
1353 ,p_resize_flag => 'N'
1354 ,p_msg_context => 'PROJ'
1355 ,p_attribute1 => l_amg_segment1
1356 ,p_attribute2 => ''
1357 ,p_attribute3 => ''
1358 ,p_attribute4 => ''
1359 ,p_attribute5 => '');
1360 END IF;
1361
1362 RAISE FND_API.G_EXC_ERROR;
1363
1364 END IF;
1365
1366 IF l_task_in_rec.task_name IS NULL
1367 OR l_task_in_rec.task_name = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
1368 THEN
1369 p_return_status := FND_API.G_RET_STS_ERROR;
1370
1371 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
1372 THEN
1373 pa_interface_utils_pub.map_new_amg_msg
1374 ( p_old_message_code => 'PA_TASK_NAME_IS_NULL'
1375 ,p_msg_attribute => 'CHANGE'
1376 ,p_resize_flag => 'N'
1377 ,p_msg_context => 'TASK'
1378 ,p_attribute1 => l_amg_segment1
1379 ,p_attribute2 => l_amg_task_number
1380 ,p_attribute3 => ''
1381 ,p_attribute4 => ''
1382 ,p_attribute5 => '');
1383 END IF;
1384
1385 RAISE FND_API.G_EXC_ERROR;
1386
1387 END IF;
1388 IF l_task_in_rec.pa_task_number IS NULL OR
1389 l_task_in_rec.pa_task_number = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR THEN
1390 l_task_in_rec.pa_task_number := l_task_in_rec.pm_task_reference;
1391 END IF;
1392
1393 --setting defaults for MISSING values if appropriate
1394 IF l_task_in_rec.ready_to_bill_flag = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
1395 OR l_task_in_rec.ready_to_bill_flag IS NULL
1396 THEN
1397 l_task_in_rec.ready_to_bill_flag := 'N'; --will be defaulted to 'Y' for the top task
1398 END IF; -- in the second round
1399
1400 IF l_task_in_rec.ready_to_distribute_flag = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
1401 OR l_task_in_rec.ready_to_distribute_flag IS NULL
1402 THEN
1403 l_task_in_rec.ready_to_distribute_flag := 'N'; -- will be defaulted to 'Y' for the top task
1404 END IF; -- in the second round
1405
1406 /* Added for bug#2666913 */
1407
1408 If l_task_in_rec.billable_flag = 'Y' and p_project_type_class_code = 'INDIRECT'
1409 THEN
1410 p_return_status := FND_API.G_RET_STS_ERROR;
1411
1412 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
1413 THEN
1414 pa_interface_utils_pub.map_new_amg_msg
1415 ( p_old_message_code => 'PA_PR_INDIRECT_NO_BILLING'
1416 ,p_msg_attribute => 'CHANGE'
1417 ,p_resize_flag => 'N'
1418 ,p_msg_context => 'TASK'
1419 ,p_attribute1 => l_amg_segment1
1420 ,p_attribute2 => l_amg_task_number
1421 ,p_attribute3 => ''
1422 ,p_attribute4 => ''
1423 ,p_attribute5 => '');
1424 END IF;
1425
1426 RAISE FND_API.G_EXC_ERROR;
1427
1428 END IF;
1429
1430 /* end of code added for bug #2666913 */
1431
1432
1433 IF l_task_in_rec.billable_flag = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
1434 AND (l_task_in_rec.pm_parent_task_reference IS NULL
1435 OR l_task_in_rec.pm_parent_task_reference = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR )
1436 THEN
1437 IF p_project_type_class_code = 'INDIRECT' --will be defaulted to the billable_flag of the
1438 THEN l_task_in_rec.billable_flag := 'N'; --parent_task for non top_level tasks
1439 ELSE l_task_in_rec.billable_flag := 'Y'; --in the second round
1440 END IF;
1441 END IF;
1442
1443 IF l_task_in_rec.chargeable_flag = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
1444 THEN l_task_in_rec.chargeable_flag := 'Y';
1445 END IF;
1446
1447 IF l_task_in_rec.limit_to_txn_controls_flag = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
1448 THEN l_task_in_rec.limit_to_txn_controls_flag := 'N';
1449 END IF;
1450
1451 --Defaulting for task manager (same as task manager of the parent) is done in the second round.
1452 IF l_task_in_rec.task_manager_person_id = PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
1453 THEN
1454 l_task_in_rec.task_manager_person_id := NULL;
1455 END IF;
1456
1457
1458 --check whether this is the address of one of the project customers
1459 /* dbms_output.put_line('Ref : '||l_task_in_rec.pm_task_reference); */
1460
1461 IF l_task_in_rec.address_id IS NOT NULL
1462 AND l_task_in_rec.address_id <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
1463 THEN
1464
1465 OPEN l_customer_csr( p_project_rec.project_id );
1466 FETCH l_customer_csr INTO l_customer_id;
1467
1468 /* dbms_output.put_line('Customer: '||l_customer_id); */
1469
1470 l_address_valid:= 'N';
1471
1472 WHILE l_customer_csr%FOUND LOOP
1473
1474 OPEN l_address_csr(l_customer_id, l_task_in_rec.address_id);
1475 FETCH l_address_csr INTO l_dummy;
1476
1477 IF l_address_csr%FOUND
1478 THEN
1479 l_address_valid:= 'Y';
1480 EXIT;
1481 END IF;
1482
1483 CLOSE l_address_csr;
1484
1485 FETCH l_customer_csr INTO l_customer_id;
1486 END LOOP;
1487
1488 CLOSE l_customer_csr;
1489
1490 IF l_address_valid = 'N'
1491 THEN
1492 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
1493 THEN
1494 pa_interface_utils_pub.map_new_amg_msg
1495 ( p_old_message_code => 'PA_TASK_ADDRESS_INVALID'
1496 ,p_msg_attribute => 'CHANGE'
1497 ,p_resize_flag => 'N'
1498 ,p_msg_context => 'TASK'
1499 ,p_attribute1 => l_amg_segment1
1500 ,p_attribute2 => l_amg_task_number
1501 ,p_attribute3 => ''
1502 ,p_attribute4 => ''
1503 ,p_attribute5 => '');
1504 END IF;
1505 RAISE FND_API.G_EXC_ERROR;
1506 ELSE
1507
1508 l_address_id := l_task_in_rec.address_id;
1509 END IF;
1510
1511
1512 ELSE
1513 l_address_id := NULL;
1514 END IF;
1515
1516 -- SERVICE_TYPE_CODE
1517
1518 IF p_service_type_code <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
1519 AND nvl(p_service_type_code,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR)
1520 <> nvl(l_task_in_rec.service_type_code,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR)
1521 AND p_service_type_code IS NOT NULL --redundant, but added for clarity
1522 THEN
1523
1524 OPEN l_service_type_csr( p_service_type_code );
1525 FETCH l_service_type_csr INTO l_temp;
1526
1527 IF l_service_type_csr%NOTFOUND
1528 THEN
1529
1530 CLOSE l_service_type_csr;
1531 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
1532 THEN
1533 pa_interface_utils_pub.map_new_amg_msg
1534 ( p_old_message_code => 'PA_SERVICE_TYPE_INVALID'
1535 ,p_msg_attribute => 'CHANGE'
1536 ,p_resize_flag => 'N'
1537 ,p_msg_context => 'TASK'
1538 ,p_attribute1 => l_amg_segment1
1539 ,p_attribute2 => l_amg_task_number
1540 ,p_attribute3 => ''
1541 ,p_attribute4 => ''
1542 ,p_attribute5 => '');
1543 END IF;
1544 RAISE FND_API.G_EXC_ERROR;
1545
1546 END IF;
1547
1548 CLOSE l_service_type_csr;
1549
1550 END IF;
1551
1552 -- Start fix for Bug #1335417
1553
1554 IF (l_task_in_rec.cost_ind_sch_fixed_date <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE)
1555 AND (nvl(l_task_in_rec.cost_ind_sch_fixed_date,PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE)
1556 <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE)
1557 AND l_task_in_rec.cost_ind_sch_fixed_date IS NOT NULL --redundant, but added for clarity
1558 THEN
1559 OPEN l_ind_rate_schedule_type_csr( l_task_in_rec.cost_ind_rate_sch_id);
1560 FETCH l_ind_rate_schedule_type_csr INTO l_temp_var_sch_type;
1561 IF l_temp_var_sch_type = 'P'
1562 THEN
1563 CLOSE l_ind_rate_schedule_type_csr;
1564 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
1565 THEN
1566 pa_interface_utils_pub.map_new_amg_msg
1567 ( p_old_message_code => 'PA_CANT_FIX_DATE_PROV_SCH'
1568 ,p_msg_attribute => 'CHANGE'
1569 ,p_resize_flag => 'N'
1570 ,p_msg_context => 'TASK'
1571 ,p_attribute1 => l_amg_segment1
1572 ,p_attribute2 => l_amg_task_number
1573 ,p_attribute3 => ''
1574 ,p_attribute4 => ''
1575 ,p_attribute5 => '');
1576 END IF;
1577 RAISE FND_API.G_EXC_ERROR;
1578 END IF;
1579 CLOSE l_ind_rate_schedule_type_csr;
1580 END IF;
1581
1582 -- End fix for bug # 1335417
1583
1584
1585 --The following fields will be defaulted for non top_level tasks to be the same as their parent task
1586 --in the second ROUND.
1587
1588 IF l_task_in_rec.service_type_code = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
1589 OR l_task_in_rec.service_type_code IS NULL
1590 THEN
1591 l_task_in_rec.service_type_code := p_service_type_code; --defaulted from the project type
1592 END IF;
1593 /* dbms_output.put_line('service_type_code: '||l_task_in_rec.service_type_code); */
1594
1595 /* dbms_output.put_line('org id (task rec): - before init- '||
1596 to_char(l_task_in_rec.carrying_out_organization_id) ||
1597 'org id of project rec before init- '||
1598 to_char(p_project_rec.carrying_out_organization_id));
1599 */
1600
1601 IF l_task_in_rec.carrying_out_organization_id = PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
1602 OR l_task_in_rec.carrying_out_organization_id IS NULL
1603 THEN
1604 l_task_in_rec.carrying_out_organization_id := p_project_rec.carrying_out_organization_id;
1605 END IF;
1606
1607 /* dbms_output.put_line('Carrying out org id (task rec): '||l_task_in_rec.carrying_out_organization_id); */
1608
1609 IF l_task_in_rec.task_description =
1610 PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR THEN
1611 l_task_in_rec.task_description := NULL;
1612 END IF;
1613 -- Call the client extension to override the default values for
1614 -- project start/completion dates
1615
1616 /*
1617 IF l_task_in_rec.actual_start_date IS NULL OR
1618 l_task_in_rec.actual_start_date =
1619 PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE THEN
1620 l_actual_start_date := NULL;
1621 ELSE
1622 l_actual_start_date := l_task_in_rec.actual_start_date;
1623 END IF;
1624
1625 IF l_task_in_rec.actual_finish_date IS NULL OR
1626 l_task_in_rec.actual_finish_date =
1627 PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE THEN
1628 l_actual_finish_date := NULL;
1629 ELSE
1630 l_actual_finish_date := l_task_in_rec.actual_finish_date;
1631 END IF;
1632 */ --Task progress cahnegs : These dates should be passed from task progress and ignore from AMG
1633
1634 l_actual_start_date := null;
1635 l_actual_finish_date := null;
1636
1637 IF l_task_in_rec.early_start_date IS NULL OR
1638 l_task_in_rec.early_start_date =
1639 PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE THEN
1640 l_early_start_date := NULL;
1641 ELSE
1642 l_early_start_date := l_task_in_rec.early_start_date;
1643 END IF;
1644
1645 /* Added for 12.2Payroll billing ER 11899223 */
1646 BEGIN
1647 IF (l_task_in_rec.pa_task_id <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM) AND (l_task_in_rec.pa_task_id IS NOT NULL) THEN
1648 SELECT parent_task_id
1649 INTO l_pa_parent_task_id
1650 FROM pa_tasks
1651 WHERE task_id = l_task_in_rec.pa_task_id
1652 AND project_id =l_project_id;
1653 ELSE
1654 SELECT parent_task_id
1655 INTO l_pa_parent_task_id
1656 FROM pa_tasks
1657 WHERE task_number = l_task_in_rec.pa_task_number
1658 AND project_id =l_project_id;
1659 END IF;
1660 EXCEPTION -- Added exception as a part of bug 12379321
1661 WHEN no_data_found THEN
1662 l_pa_parent_task_id:=NULL;
1663 END;
1664
1665
1666 if l_pa_parent_task_id is null then
1667
1668 IF (l_task_in_rec.adj_on_std_inv <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR) AND
1669 (l_task_in_rec.adj_on_std_inv IS NOT NULL) then
1670
1671 l_adj_on_std_inv := l_task_in_rec.adj_on_std_inv;
1672
1673 else
1674
1675
1676 /* select adj_on_std_inv into l_adj_on_std_inv from pa_projects_all where project_id =p_project_rec.project_id ;
1677 commented for bug 12659208*/
1678
1679 l_adj_on_std_inv := NULL;
1680
1681 end if;
1682
1683 else
1684
1685 select adj_on_std_inv into l_adj_on_std_inv from pa_tasks where task_id =l_task_in_rec.pa_parent_task_id;
1686
1687 end if;
1688
1689 /* Added for 12.2Payroll billing ER 11899223 */
1690
1691 IF l_task_in_rec.early_start_date IS NULL OR
1692 l_task_in_rec.early_start_date =
1693 PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE THEN
1694 l_early_start_date := NULL;
1695 ELSE
1696 l_early_start_date := l_task_in_rec.early_start_date;
1697 END IF;
1698
1699
1700 IF l_task_in_rec.early_finish_date IS NULL OR
1701 l_task_in_rec.early_finish_date =
1702 PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE THEN
1703 l_early_finish_date := NULL;
1704 ELSE
1705 l_early_finish_date := l_task_in_rec.early_finish_date;
1706 END IF;
1707
1708
1709 IF l_task_in_rec.late_start_date IS NULL OR
1710 l_task_in_rec.late_start_date =
1711 PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE THEN
1712 l_late_start_date := NULL;
1713 ELSE
1714 l_late_start_date := l_task_in_rec.late_start_date;
1715 END IF;
1716
1717 IF l_task_in_rec.late_finish_date IS NULL OR
1718 l_task_in_rec.late_finish_date =
1719 PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE THEN
1720 l_late_finish_date := NULL;
1721 ELSE
1722 l_late_finish_date := l_task_in_rec.late_finish_date;
1723 END IF;
1724
1725 IF l_task_in_rec.scheduled_start_date IS NULL OR
1726 l_task_in_rec.scheduled_start_date =
1727 PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE THEN
1728 l_scheduled_start_date := NULL;
1729 ELSE
1730 l_scheduled_start_date := l_task_in_rec.scheduled_start_date;
1731 END IF;
1732
1733 IF l_task_in_rec.scheduled_finish_date IS NULL OR
1734 l_task_in_rec.scheduled_finish_date =
1735 PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE THEN
1736 l_scheduled_finish_date := NULL;
1737 ELSE
1738 l_scheduled_finish_date := l_task_in_rec.scheduled_finish_date;
1739 END IF;
1740
1741 PA_Client_Extn_PM.customize_dates (
1742 p_pm_task_reference => l_task_in_rec.pm_task_reference,
1743 p_pm_product_code => p_project_rec.pm_product_code,
1744 p_in_start_date => l_task_in_rec.task_start_date,
1745 p_in_completion_date => l_task_in_rec.task_completion_date,
1746 p_actual_start_date => l_actual_start_date,
1747 p_actual_finish_date => l_actual_finish_date,
1748 p_early_start_date => l_early_start_date,
1749 p_early_finish_date => l_early_finish_date,
1750 p_late_start_date => l_late_start_date,
1751 p_late_finish_date => l_late_finish_date,
1752 p_scheduled_start_date => l_scheduled_start_date,
1753 p_scheduled_finish_date => l_scheduled_finish_date,
1754 p_out_start_date => l_out_start_date,
1755 p_out_completion_date => l_out_completion_date,
1756 p_error_code => l_error_code,
1757 p_error_message => l_error_message );
1758
1759 IF l_error_code <> 0 THEN
1760 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
1761 pa_interface_utils_pub.map_new_amg_msg
1762 ( p_old_message_code => 'PA_ERROR_IN_CLIENT_EXTN'
1763 ,p_msg_attribute => 'CHANGE'
1764 ,p_resize_flag => 'N'
1765 ,p_msg_context => 'TASK'
1766 ,p_attribute1 => l_amg_segment1
1767 ,p_attribute2 => l_amg_task_number
1768 ,p_attribute3 => ''
1769 ,p_attribute4 => ''
1770 ,p_attribute5 => '');
1771 END IF;
1772 RAISE FND_API.G_EXC_ERROR;
1773 END IF;
1774 l_task_in_rec.task_start_date := l_out_start_date;
1775 l_task_in_rec.task_completion_date := l_out_completion_date;
1776
1777 --bug 2732788
1778 IF ( l_task_in_rec.task_start_date IS NULL AND
1779 l_task_in_rec.task_completion_date IS NOT NULL )
1780 THEN
1781 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
1782 THEN
1783 pa_interface_utils_pub.map_new_amg_msg
1784 ( p_old_message_code => 'PA_TASK_ST_DATE_NULL'
1785 ,p_msg_attribute => 'CHANGE'
1786 ,p_resize_flag => 'N'
1787 ,p_msg_context => 'TASK'
1788 ,p_attribute1 => l_amg_segment1
1789 ,p_attribute2 => l_amg_task_number
1790 ,p_attribute3 => ''
1791 ,p_attribute4 => ''
1792 ,p_attribute5 => '');
1793 END IF;
1794 RAISE FND_API.G_EXC_ERROR;
1795 END IF;
1796 --bug 2732788
1797
1798 IF ( l_task_in_rec.task_start_date <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE
1799 AND l_task_in_rec.task_start_date IS NOT NULL )
1800 THEN
1801 IF l_task_in_rec.task_completion_date
1802 <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE AND
1803 l_task_in_rec.task_completion_date IS NOT NULL
1804 AND l_task_in_rec.task_completion_date < l_task_in_rec.task_start_date
1805 THEN
1806 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
1807 THEN
1808 pa_interface_utils_pub.map_new_amg_msg
1809 ( p_old_message_code => 'PA_TASK_DATES_INVALID'
1810 ,p_msg_attribute => 'CHANGE'
1811 ,p_resize_flag => 'N'
1812 ,p_msg_context => 'TASK'
1813 ,p_attribute1 => l_amg_segment1
1814 ,p_attribute2 => l_amg_task_number
1815 ,p_attribute3 => ''
1816 ,p_attribute4 => ''
1817 ,p_attribute5 => '');
1818 END IF;
1819 RAISE FND_API.G_EXC_ERROR;
1820 END IF;
1821 END IF;
1822
1823 /* Bug#2530525-Commenting the condition which checks for date being null as project
1824 start date should not be assigned when null is passed for the date variable */
1825
1826 IF l_task_in_rec.task_start_date = PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE
1827 /* OR l_task_in_rec.task_start_date IS NULL Commented for bug#2530525 */
1828 THEN
1829 l_task_in_rec.task_start_date := p_project_rec.start_date;
1830 END IF;
1831
1832 IF l_task_in_rec.task_completion_date =
1833 PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE
1834 /* OR l_task_in_rec.task_completion_date IS NULL Commented for bug#2530525 */
1835 THEN
1836 l_task_in_rec.task_completion_date := p_project_rec.completion_date;
1837 END IF;
1838
1839 IF l_task_in_rec.task_start_date < p_project_rec.start_date OR
1840 l_task_in_rec.task_start_date > p_project_rec.completion_date
1841 THEN
1842 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
1843 THEN
1844 pa_interface_utils_pub.map_new_amg_msg
1845 ( p_old_message_code => 'PA_TK_OUTSIDE_PROJECT_RANGE'
1846 ,p_msg_attribute => 'CHANGE'
1847 ,p_resize_flag => 'Y'
1848 ,p_msg_context => 'TASK'
1849 ,p_attribute1 => l_amg_segment1
1850 ,p_attribute2 => l_amg_task_number
1851 ,p_attribute3 => ''
1852 ,p_attribute4 => ''
1853 ,p_attribute5 => '');
1854 END IF;
1855 RAISE FND_API.G_EXC_ERROR;
1856 END IF;
1857
1858
1859 IF l_task_in_rec.task_completion_date < p_project_rec.start_date OR
1860 l_task_in_rec.task_completion_date > p_project_rec.completion_date
1861 THEN
1862 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
1863 THEN
1864 pa_interface_utils_pub.map_new_amg_msg
1865 ( p_old_message_code => 'PA_TK_OUTSIDE_PROJECT_RANGE'
1866 ,p_msg_attribute => 'CHANGE'
1867 ,p_resize_flag => 'Y'
1868 ,p_msg_context => 'TASK'
1869 ,p_attribute1 => l_amg_segment1
1870 ,p_attribute2 => l_amg_task_number
1871 ,p_attribute3 => ''
1872 ,p_attribute4 => ''
1873 ,p_attribute5 => '');
1874 END IF;
1875 RAISE FND_API.G_EXC_ERROR;
1876 END IF;
1877
1878 IF l_task_in_rec.cost_ind_rate_sch_id = PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
1879 THEN
1880 l_task_in_rec.cost_ind_rate_sch_id := p_project_rec.cost_ind_rate_sch_id;
1881 END IF;
1882
1883 IF l_task_in_rec.cost_ind_sch_fixed_date = PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE
1884 THEN
1885 l_task_in_rec.cost_ind_sch_fixed_date := p_project_rec.cost_ind_sch_fixed_date;
1886 END IF;
1887
1888 IF l_task_in_rec.labor_sch_type = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
1889 THEN
1890 l_task_in_rec.labor_sch_type := p_project_rec.labor_sch_type;
1891 END IF;
1892
1893 IF l_task_in_rec.labor_bill_rate_org_id = PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
1894 THEN
1895 l_task_in_rec.labor_bill_rate_org_id := p_project_rec.labor_bill_rate_org_id;
1896 END IF;
1897
1898 IF l_task_in_rec.labor_std_bill_rate_schdl = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
1899 THEN
1900 l_task_in_rec.labor_std_bill_rate_schdl := p_project_rec.labor_std_bill_rate_schdl;
1901 END IF;
1902
1903 IF l_task_in_rec.labor_schedule_discount = PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
1904 THEN
1905 l_task_in_rec.labor_schedule_discount := p_project_rec.labor_schedule_discount;
1906 END IF;
1907
1908 IF l_task_in_rec.labor_schedule_fixed_date = PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE
1909 THEN
1910 l_task_in_rec.labor_schedule_fixed_date := p_project_rec.labor_schedule_fixed_date;
1911 END IF;
1912
1913 IF l_task_in_rec.non_labor_sch_type = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
1914 THEN
1915 l_task_in_rec.non_labor_sch_type := p_project_rec.non_labor_sch_type;
1916 END IF;
1917
1918 IF l_task_in_rec.non_labor_bill_rate_org_id = PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
1919 THEN
1920 l_task_in_rec.non_labor_bill_rate_org_id := p_project_rec.non_labor_bill_rate_org_id;
1921 END IF;
1922
1923 IF l_task_in_rec.non_labor_std_bill_rate_schdl = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
1924 THEN
1925 l_task_in_rec.non_labor_std_bill_rate_schdl := p_project_rec.non_labor_std_bill_rate_schdl;
1926 END IF;
1927
1928 IF l_task_in_rec.non_labor_schedule_discount = PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
1929 THEN
1930 l_task_in_rec.non_labor_schedule_discount := p_project_rec.non_labor_schedule_discount;
1931 END IF;
1932
1933 IF l_task_in_rec.non_labor_schedule_fixed_date = PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE
1934 THEN
1935 l_task_in_rec.non_labor_schedule_fixed_date := p_project_rec.non_labor_schedule_fixed_date;
1936 END IF;
1937
1938 IF l_task_in_rec.rev_ind_rate_sch_id = PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
1939 THEN
1940 l_task_in_rec.rev_ind_rate_sch_id := p_project_rec.rev_ind_rate_sch_id;
1941 END IF;
1942
1943 IF l_task_in_rec.rev_ind_sch_fixed_date = PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE
1944 THEN
1945 l_task_in_rec.rev_ind_sch_fixed_date := p_project_rec.rev_ind_sch_fixed_date;
1946 END IF;
1947
1948 IF l_task_in_rec.inv_ind_rate_sch_id = PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
1949 THEN
1950 l_task_in_rec.inv_ind_rate_sch_id := p_project_rec.inv_ind_rate_sch_id;
1951 END IF;
1952
1953 IF l_task_in_rec.inv_ind_sch_fixed_date = PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE
1954 THEN
1955 l_task_in_rec.inv_ind_sch_fixed_date := p_project_rec.inv_ind_sch_fixed_date;
1956 END IF;
1957 --bug 6153503 added below if condition
1958 IF l_task_in_rec.tasks_dff = 'Y' THEN
1959 --When descriptive flex fields are not passed set them to NULL
1960 IF l_task_in_rec.attribute_category = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
1961 THEN
1962 l_attribute_category := NULL;
1963 ELSE
1964 l_attribute_category := l_task_in_rec.attribute_category;
1965 END IF;
1966 IF l_task_in_rec.attribute1 = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
1967 THEN
1968 l_attribute1 := NULL;
1969 ELSE
1970 l_attribute1 := l_task_in_rec.attribute1;
1971 END IF;
1972 IF l_task_in_rec.attribute2 = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
1973 THEN
1974 l_attribute2 := NULL;
1975 ELSE
1976 l_attribute2 := l_task_in_rec.attribute2;
1977 END IF;
1978 IF l_task_in_rec.attribute3 = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
1979 THEN
1980 l_attribute3 := NULL;
1981 ELSE
1982 l_attribute3 := l_task_in_rec.attribute3;
1983 END IF;
1984 IF l_task_in_rec.attribute4 = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
1985 THEN
1986 l_attribute4 := NULL;
1987 ELSE
1988 l_attribute4 := l_task_in_rec.attribute4;
1989 END IF;
1990
1991 IF l_task_in_rec.attribute5 = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
1992 THEN
1993 l_attribute5 := NULL;
1994 ELSE
1995 l_attribute5 := l_task_in_rec.attribute5;
1996 END IF;
1997
1998 IF l_task_in_rec.attribute6 = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
1999 THEN
2000 l_attribute6 := NULL;
2001 ELSE
2002 l_attribute6 := l_task_in_rec.attribute6;
2003 END IF;
2004
2005 IF l_task_in_rec.attribute7 = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
2006 THEN
2007 l_attribute7 := NULL;
2008 ELSE
2009 l_attribute7 := l_task_in_rec.attribute7;
2010 END IF;
2011
2012 IF l_task_in_rec.attribute8 = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
2013 THEN
2014 l_attribute8 := NULL;
2015 ELSE
2016 l_attribute8 := l_task_in_rec.attribute8;
2017 END IF;
2018 IF l_task_in_rec.attribute9 = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
2019 THEN
2020 l_attribute9 := NULL;
2021 ELSE
2022 l_attribute9 := l_task_in_rec.attribute9;
2023 END IF;
2024 IF l_task_in_rec.attribute10 = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
2025 THEN
2026 l_attribute10 := NULL;
2027 ELSE
2028 l_attribute10 := l_task_in_rec.attribute10;
2029 END IF;
2030
2031 --bug 6153503 added below validation.
2032 pa_task_utils.validate_flex_fields(
2033 p_desc_flex_name => 'PA_TASKS_DESC_FLEX'
2034 ,p_attribute_category => l_attribute_category
2035 ,p_attribute1 => l_attribute1
2036 ,p_attribute2 => l_attribute2
2037 ,p_attribute3 => l_attribute3
2038 ,p_attribute4 => l_attribute4
2039 ,p_attribute5 => l_attribute5
2040 ,p_attribute6 => l_attribute6
2041 ,p_attribute7 => l_attribute7
2042 ,p_attribute8 => l_attribute8
2043 ,p_attribute9 => l_attribute9
2044 ,p_attribute10 => l_attribute10
2045 ,p_RETURN_msg => l_return_msg
2046 ,p_validate_status => l_validate_status
2047 );
2048
2049 IF l_validate_status = 'N'
2050 THEN
2051 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
2052 THEN
2053 pa_interface_utils_pub.map_new_amg_msg
2054 ( p_old_message_code => 'PA_INVALID_FF_VALUES'
2055 ,p_msg_attribute => 'CHANGE'
2056 ,p_resize_flag => 'N'
2057 ,p_msg_context => 'FLEX'
2058 ,p_attribute1 => l_return_msg
2059 ,p_attribute2 => ''
2060 ,p_attribute3 => ''
2061 ,p_attribute4 => ''
2062 ,p_attribute5 => '');
2063 END IF;
2064 RAISE FND_API.G_EXC_ERROR;
2065 END IF;
2066 -- Added ELSE condition for Huawei enhancement to update both Workplan and financial tasks DFFs Bug 13923366
2067 ELSIF (l_task_in_rec.tasks_dff = 'N' AND
2068 (PA_PROJECT_PUB.G_MASS_ADD_TASKS = 'Y' OR PA_PROJECT_PUB.G_MASS_UPDATE_TASKS = 'Y') AND
2069 (PA_PROJECT_PUB.G_FP_DFF_TBL.COUNT > 0)) THEN
2070
2071 i := PA_PROJECT_PUB.G_FP_DFF_TBL.FIRST;
2072 WHILE i IS NOT NULL LOOP
2073 IF PA_PROJECT_PUB.G_FP_DFF_TBL(i).pa_task_name = l_task_in_rec.task_name AND
2074 PA_PROJECT_PUB.G_FP_DFF_TBL(i).pm_task_reference = l_task_in_rec.pm_task_reference THEN
2075 EXIT;
2076 ELSE
2077 i := PA_PROJECT_PUB.G_FP_DFF_TBL.NEXT(i);
2078 END IF;
2079 END LOOP;
2080
2081 IF PA_PROJECT_PUB.G_FP_DFF_TBL(i).attribute_category = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
2082 THEN
2083 l_attribute_category := NULL;
2084 ELSE
2085 l_attribute_category := PA_PROJECT_PUB.G_FP_DFF_TBL(i).attribute_category;
2086 END IF;
2087 IF PA_PROJECT_PUB.G_FP_DFF_TBL(i).attribute1 = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
2088 THEN
2089 l_attribute1 := NULL;
2090 ELSE
2091 l_attribute1 := PA_PROJECT_PUB.G_FP_DFF_TBL(i).attribute1;
2092 END IF;
2093 IF PA_PROJECT_PUB.G_FP_DFF_TBL(i).attribute2 = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
2094 THEN
2095 l_attribute2 := NULL;
2096 ELSE
2097 l_attribute2 := PA_PROJECT_PUB.G_FP_DFF_TBL(i).attribute2;
2098 END IF;
2099 IF PA_PROJECT_PUB.G_FP_DFF_TBL(i).attribute3 = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
2100 THEN
2101 l_attribute3 := NULL;
2102 ELSE
2103 l_attribute3 := PA_PROJECT_PUB.G_FP_DFF_TBL(i).attribute3;
2104 END IF;
2105 IF PA_PROJECT_PUB.G_FP_DFF_TBL(i).attribute4 = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
2106 THEN
2107 l_attribute4 := NULL;
2108 ELSE
2109 l_attribute4 := PA_PROJECT_PUB.G_FP_DFF_TBL(i).attribute4;
2110 END IF;
2111
2112 IF PA_PROJECT_PUB.G_FP_DFF_TBL(i).attribute5 = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
2113 THEN
2114 l_attribute5 := NULL;
2115 ELSE
2116 l_attribute5 := PA_PROJECT_PUB.G_FP_DFF_TBL(i).attribute5;
2117 END IF;
2118
2119 IF PA_PROJECT_PUB.G_FP_DFF_TBL(i).attribute6 = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
2120 THEN
2121 l_attribute6 := NULL;
2122 ELSE
2123 l_attribute6 := PA_PROJECT_PUB.G_FP_DFF_TBL(i).attribute6;
2124 END IF;
2125
2126 IF PA_PROJECT_PUB.G_FP_DFF_TBL(i).attribute7 = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
2127 THEN
2128 l_attribute7 := NULL;
2129 ELSE
2130 l_attribute7 := PA_PROJECT_PUB.G_FP_DFF_TBL(i).attribute7;
2131 END IF;
2132
2133 IF PA_PROJECT_PUB.G_FP_DFF_TBL(i).attribute8 = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
2134 THEN
2135 l_attribute8 := NULL;
2136 ELSE
2137 l_attribute8 := PA_PROJECT_PUB.G_FP_DFF_TBL(i).attribute8;
2138 END IF;
2139 IF PA_PROJECT_PUB.G_FP_DFF_TBL(i).attribute9 = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
2140 THEN
2141 l_attribute9 := NULL;
2142 ELSE
2143 l_attribute9 := PA_PROJECT_PUB.G_FP_DFF_TBL(i).attribute9;
2144 END IF;
2145 IF PA_PROJECT_PUB.G_FP_DFF_TBL(i).attribute10 = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
2146 THEN
2147 l_attribute10 := NULL;
2148 ELSE
2149 l_attribute10 := PA_PROJECT_PUB.G_FP_DFF_TBL(i).attribute10;
2150 END IF;
2151
2152 --bug 6153503 added below validation.
2153 pa_task_utils.validate_flex_fields(
2154 p_desc_flex_name => 'PA_TASKS_DESC_FLEX'
2155 ,p_attribute_category => l_attribute_category
2156 ,p_attribute1 => l_attribute1
2157 ,p_attribute2 => l_attribute2
2158 ,p_attribute3 => l_attribute3
2159 ,p_attribute4 => l_attribute4
2160 ,p_attribute5 => l_attribute5
2161 ,p_attribute6 => l_attribute6
2162 ,p_attribute7 => l_attribute7
2163 ,p_attribute8 => l_attribute8
2164 ,p_attribute9 => l_attribute9
2165 ,p_attribute10 => l_attribute10
2166 ,p_RETURN_msg => l_return_msg
2167 ,p_validate_status => l_validate_status
2168 );
2169
2170 IF l_validate_status = 'N'
2171 THEN
2172 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
2173 THEN
2174 pa_interface_utils_pub.map_new_amg_msg
2175 ( p_old_message_code => 'PA_INVALID_FF_VALUES'
2176 ,p_msg_attribute => 'CHANGE'
2177 ,p_resize_flag => 'N'
2178 ,p_msg_context => 'FLEX'
2179 ,p_attribute1 => l_return_msg
2180 ,p_attribute2 => ''
2181 ,p_attribute3 => ''
2182 ,p_attribute4 => ''
2183 ,p_attribute5 => '');
2184 END IF;
2185 RAISE FND_API.G_EXC_ERROR;
2186 END IF; -- End of changes for bug 13923366 : Huawei enhancement
2187
2188 END IF;
2189
2190 -- Multi National Currency changes Starts ...
2191
2192 -- Get segment1 for AMG messages
2193
2194 OPEN l_default_project_csr( l_project_id );
2195 FETCH l_default_project_csr
2196 INTO l_allow_cross_charge_flag,
2197 l_project_rate_date,
2198 l_project_rate_type,
2199 l_cc_process_labor_flag,
2200 l_labor_tp_schedule_id,
2201 l_labor_tp_fixed_date,
2202 l_cc_process_nl_flag,
2203 l_nl_tp_schedule_id,
2204 l_nl_tp_fixed_date,
2205 l_work_type_id,
2206 l_emp_bill_rate_schedule_id,
2207 l_job_bill_rate_schedule_id,
2208 l_taskfunc_cost_rate_type,
2209 l_taskfunc_cost_rate_date,
2210 l_non_lab_std_bill_rt_sch_id;
2211 CLOSE l_default_project_csr;
2212
2213 IF l_task_in_rec.allow_cross_charge_flag <>
2214 PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
2215 THEN
2216 l_allow_cross_charge_flag := l_task_in_rec.allow_cross_charge_flag;
2217 END IF;
2218
2219 IF l_task_in_rec.project_rate_type <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
2220 THEN
2221 l_project_rate_type := l_task_in_rec.project_rate_type;
2222 END IF;
2223
2224 IF l_task_in_rec.project_rate_date <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE
2225 THEN
2226 l_project_rate_date := l_task_in_rec.project_rate_date;
2227 END IF;
2228
2229 -- Multi National Currency changes Ends ...
2230
2231 -- IC_CHANGES Starts ...
2232
2233 IF l_task_in_rec.cc_process_labor_flag <>
2234 PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
2235 THEN
2236 l_cc_process_labor_flag := l_task_in_rec.cc_process_labor_flag;
2237 END IF;
2238
2239 --Added NVL for Bug 6026370
2240 IF nvl( l_task_in_rec.labor_tp_schedule_id,-999) <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
2241 THEN
2242 l_labor_tp_schedule_id := l_task_in_rec.labor_tp_schedule_id;
2243 END IF;
2244
2245 --Added NVL for Bug 6026370
2246 IF nvl(l_task_in_rec.labor_tp_fixed_date,sysdate) <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE
2247 THEN
2248 l_labor_tp_fixed_date := l_task_in_rec.labor_tp_fixed_date;
2249 END IF;
2250
2251 IF l_task_in_rec.cc_process_nl_flag <>
2252 PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
2253 THEN
2254 l_cc_process_nl_flag := l_task_in_rec.cc_process_nl_flag;
2255 END IF;
2256
2257 --Added NVL for Bug 6026370
2258 IF nvl(l_task_in_rec.nl_tp_schedule_id,-999) <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
2259 THEN
2260 l_nl_tp_schedule_id := l_task_in_rec.nl_tp_schedule_id;
2261 END IF;
2262
2263 --Added NVL for Bug 6026370
2264 IF nvl(l_task_in_rec.nl_tp_fixed_date,sysdate) <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE
2265 THEN
2266 l_nl_tp_fixed_date := l_task_in_rec.nl_tp_fixed_date;
2267 END IF;
2268
2269 IF l_task_in_rec.receive_project_invoice_flag =
2270 PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
2271 THEN
2272 l_receive_project_invoice_flag := 'N';
2273 ELSE
2274 l_receive_project_invoice_flag := l_task_in_rec.receive_project_invoice_flag;
2275 END IF;
2276
2277 IF l_task_in_rec.work_type_id <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
2278 THEN
2279 l_work_type_id := l_task_in_rec.work_type_id;
2280 END IF;
2281
2282 -- IC_CHANGES Ends ...
2283
2284 IF l_task_in_rec.emp_bill_rate_schedule_id <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
2285 THEN
2286 l_emp_bill_rate_schedule_id := l_task_in_rec.emp_bill_rate_schedule_id;
2287 END IF;
2288
2289 IF l_task_in_rec.job_bill_rate_schedule_id <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
2290 THEN
2291 l_job_bill_rate_schedule_id := l_task_in_rec.job_bill_rate_schedule_id;
2292 END IF;
2293
2294 --Sakthi MCB
2295
2296 IF l_task_in_rec.non_lab_std_bill_rt_sch_id <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
2297 THEN
2298 l_non_lab_std_bill_rt_sch_id := l_task_in_rec.non_lab_std_bill_rt_sch_id;
2299 END IF;
2300
2301 IF l_task_in_rec.taskfunc_cost_rate_date <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE
2302 THEN
2303 l_taskfunc_cost_rate_date := l_task_in_rec.taskfunc_cost_rate_date;
2304 END IF;
2305
2306 IF l_task_in_rec.taskfunc_cost_rate_type <>
2307 PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
2308 THEN
2309 l_taskfunc_cost_rate_type := l_task_in_rec.taskfunc_cost_rate_type;
2310 END IF;
2311
2312 --Sakthi MCB
2313
2314 IF l_task_in_rec.labor_disc_reason_code <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
2315 THEN
2316 l_labor_disc_reason_code := l_task_in_rec.labor_disc_reason_code;
2317 END IF;
2318
2319 IF l_task_in_rec.non_labor_disc_reason_code <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
2320 THEN
2321 l_non_labor_disc_reason_code := l_task_in_rec.non_labor_disc_reason_code;
2322 END IF;
2323
2324
2325 --PA L Changes 2872708
2326
2327 IF l_task_in_rec.retirement_cost_flag <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
2328 THEN
2329 l_retirement_cost_flag := l_task_in_rec.retirement_cost_flag;
2330 END IF;
2331
2332 IF l_task_in_rec.cint_eligible_flag <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
2333 THEN
2334 l_cint_eligible_flag := l_task_in_rec.cint_eligible_flag;
2335 END IF;
2336
2337 IF l_task_in_rec.cint_stop_date <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE
2338 THEN
2339 l_cint_stop_date := l_task_in_rec.cint_stop_date;
2340 END IF;
2341
2342 --End PA L Changes 2872708
2343
2344 --(Begin Venkat) FP_M changes -------------------------------------
2345
2346 IF l_task_in_rec.invoice_method <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
2347 THEN
2348 l_invoice_method := l_task_in_rec.invoice_method;
2349 END IF;
2350
2351 /* Commented For Bug 4689326
2352 IF l_task_in_rec.customer_id <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
2353 THEN
2354 l_customer_id1 := l_task_in_rec.customer_id;
2355 END IF;*/
2356 --null check added , BUg # 4101696, rtarway
2357 IF l_task_in_rec.gen_etc_source_code is not null and
2358 l_task_in_rec.gen_etc_source_code <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
2359 THEN
2360 l_gen_etc_source_code := l_task_in_rec.gen_etc_source_code;
2361 --BUG 3924597, added by rtarway for etc source default
2362 else
2363 --Add the logic to default the gen_etc_source_code
2364 --1. get the structure sharing type
2365 l_wp_separate_from_fin := PA_PROJ_TASK_STRUC_PUB.IS_WP_SEPARATE_FROM_FN( l_project_id );
2366 --2. get if it is top task, assuming for top task, p_pa_parent_task_id/P_pm_parent_task_reference is null
2367 if (
2368 ( l_task_in_rec.pa_parent_task_id is null
2369 or l_task_in_rec.pa_parent_task_id = PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
2370 )
2371 and
2372 ( l_task_in_rec.pm_parent_task_reference is null
2373 or l_task_in_rec.pm_parent_task_reference = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
2374 )
2375 )
2376 then
2377 if (nvl(l_wp_separate_from_fin,'N') = 'N')
2378 then
2379 l_gen_etc_source_code := 'WORKPLAN_RESOURCES';
2380 else
2381 l_gen_etc_source_code := 'FINANCIAL_PLAN';
2382 end if;
2383 else
2384 --if not top task , get the l_gen_etc_source_code from its parent task
2385 if l_task_in_rec.pa_parent_task_id is not null
2386 then
2387 l_ref_task_id := l_task_in_rec.pa_parent_task_id ;
2388 elsif (
2389 l_task_in_rec.pm_parent_task_reference is not null
2390 and l_task_in_rec.pm_parent_task_reference <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
2391 )
2392 then
2393 -- 5262740 Changed Convert_pm_taskref_to_id to PA_PROJECT_PVT.Convert_pm_taskref_to_id_all
2394 PA_PROJECT_PVT.Convert_pm_taskref_to_id_all
2395 ( p_pa_project_id => l_project_id
2396 , p_pa_task_id => l_task_in_rec.pa_parent_task_id
2397 , p_pm_task_reference => l_task_in_rec.pm_parent_task_reference
2398 , p_out_task_id => l_ref_task_id
2399 , p_return_status => l_return_status );
2400 IF (l_return_status <> FND_API.G_RET_STS_SUCCESS)
2401 THEN
2402 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2403 END IF;
2404 end if;
2405 OPEN get_gen_etc_source_code(l_ref_task_id,l_project_id );
2406 FETCH get_gen_etc_source_code into l_gen_etc_source_code;
2407 CLOSE get_gen_etc_source_code;
2408 if (l_gen_etc_source_code is null or l_gen_etc_source_code = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR)
2409 then
2410 if (nvl(l_wp_separate_from_fin,'N') = 'N')
2411 then
2412 l_gen_etc_source_code := 'WORKPLAN_RESOURCES';
2413 else
2414 l_gen_etc_source_code := 'FINANCIAL_PLAN';
2415 end if;
2416 end if;
2417 end if;
2418 --End BUG 3924597, added by rtarway for etc source default
2419 END IF;
2420 --(End Venkat) FP_M changes ---------------------------------------
2421 --( Begin Changes by rtarway for BUG 3658479 )
2422 -- Bug No 3798594 Added elsif to the following if block
2423 IF l_task_in_rec.labor_cost_multiplier_name <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
2424 THEN
2425 l_labor_cost_multiplier_name := l_task_in_rec.labor_cost_multiplier_name ;
2426 ELSIF(l_task_in_rec.labor_cost_multiplier_name = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR OR l_task_in_rec.labor_cost_multiplier_name is null) THEN
2427 -- Bug No 4609326 Added 'or' condition
2428 l_labor_cost_multiplier_name := null;
2429 END IF;
2430 --( End Changes by rtarway for BUG 3658479 )
2431
2432
2433
2434 --get the unique task id from the Oracle Sequence
2435
2436 SELECT pa_tasks_s.nextval
2437 INTO l_task_id
2438 FROM DUAL;
2439 /* dbms_output.put_line('Task ID:'||l_task_id); */
2440
2441 --insert the intermediate result in the database
2442
2443 /* dbms_output.put_line('Task Ref:'||l_task_in_rec.pm_task_reference); */
2444 /* dbms_output.put_line('Task Name:'||l_task_in_rec.task_name); */
2445
2446 --Bug 3279981
2447 --The revenue acrual method for the task needs to be defaulted from the project
2448 --Default the invoice method if it has not been passed as a parameter
2449 --Set the customer_id if it has not been passed as a parameter
2450 OPEN cur_get_rev_acc_mth;
2451 FETCH cur_get_rev_acc_mth INTO l_revenue_accrual_method;
2452 CLOSE cur_get_rev_acc_mth;
2453
2454 IF l_task_in_rec.invoice_method = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR OR
2455 l_task_in_rec.invoice_method IS Null THEN --For bug 4273729
2456 OPEN cur_get_inv_mth;
2457 FETCH cur_get_inv_mth INTO l_invoice_method;
2458 CLOSE cur_get_inv_mth;
2459 END IF;
2460
2461 /* Commented for Bug 4689326
2462 IF l_task_in_rec.customer_id = PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM THEN
2463 OPEN cur_get_def_top_task_cust;
2464 FETCH cur_get_def_top_task_cust INTO l_customer_id1;
2465 CLOSE cur_get_def_top_task_cust;
2466 END IF;*/
2467 -- Start of Bug Number 4689326 Added this Part of Code
2468 -- to check its a parent task or child task and to add customers accodingly.
2469 IF (l_task_in_rec.pa_parent_task_id IS NULL OR
2470 l_task_in_rec.pa_parent_task_id = PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM) AND
2471 (l_task_in_rec.pm_parent_task_reference is NULL OR
2472 l_task_in_rec.pm_parent_task_reference = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR) THEN
2473 IF l_task_in_rec.customer_id = PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM THEN
2474 OPEN cur_get_def_top_task_cust;
2475 FETCH cur_get_def_top_task_cust INTO l_customer_id1;
2476 CLOSE cur_get_def_top_task_cust;
2477 ELSE
2478 l_customer_id1 := l_task_in_rec.customer_id;
2479 END IF;
2480 ELSE
2481 OPEN l_customer_parent_task(l_task_in_rec.pa_parent_task_id);
2482 FETCH l_customer_parent_task INTO l_customer_id1;
2483 CLOSE l_customer_parent_task;
2484 END IF;
2485 -- End of Bug Number 4689326 .
2486 -- Start of Addition for Bug 4378507.
2487
2488 IF (l_task_in_rec.pa_parent_task_id IS NOT NULL
2489 AND l_task_in_rec.pa_parent_task_id <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM) OR
2490 (l_task_in_rec.pm_parent_task_reference <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
2491 AND l_task_in_rec.pm_parent_task_reference IS NOT NULL)
2492 THEN
2493 IF(l_task_in_rec.pm_parent_task_reference <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
2494 AND l_task_in_rec.pm_parent_task_reference IS NOT NULL)
2495 THEN
2496 OPEN l_task_csr(p_project_rec.project_id,l_task_in_rec.pm_parent_task_reference);
2497 FETCH l_task_csr INTO l_parent_TOP_TASK_ID;
2498
2499 IF l_task_csr%NOTFOUND
2500 THEN
2501 CLOSE l_task_csr;
2502 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
2503 THEN
2504 pa_interface_utils_pub.map_new_amg_msg
2505 ( p_old_message_code => 'PA_PARENT_TASK_MISSING'
2506 ,p_msg_attribute => 'CHANGE'
2507 ,p_resize_flag => 'N'
2508 ,p_msg_context => 'TASK'
2509 ,p_attribute1 => l_amg_segment1
2510 ,p_attribute2 => l_amg_task_number
2511 ,p_attribute3 => ''
2512 ,p_attribute4 => ''
2513 ,p_attribute5 => '');
2514 END IF;
2515 RAISE FND_API.G_EXC_ERROR;
2516 END IF;
2517 CLOSE l_task_csr;
2518 ELSE
2519 IF (l_task_in_rec.pa_parent_task_id IS NOT NULL AND
2520 l_task_in_rec.pa_parent_task_id <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM)
2521 THEN
2522 OPEN l_task_id_csr(p_project_rec.project_id,l_task_in_rec.pa_parent_task_id);
2523 FETCH l_task_id_csr INTO l_parent_TOP_TASK_ID; --l_parent_task_id_rec;
2524 IF l_task_id_csr%NOTFOUND
2525 THEN
2526 CLOSE l_task_id_csr;
2527 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
2528 THEN
2529 pa_interface_utils_pub.map_new_amg_msg
2530 ( p_old_message_code => 'PA_PARENT_TASK_MISSING'
2531 ,p_msg_attribute => 'CHANGE'
2532 ,p_resize_flag => 'N'
2533 ,p_msg_context => 'TASK'
2534 ,p_attribute1 => l_amg_segment1
2535 ,p_attribute2 => l_amg_task_number
2536 ,p_attribute3 => ''
2537 ,p_attribute4 => ''
2538 ,p_attribute5 => '');
2539 END IF;
2540 RAISE FND_API.G_EXC_ERROR;
2541 END IF;
2542 CLOSE l_task_id_csr;
2543 Else
2544 l_parent_TOP_TASK_ID := l_task_id;
2545 END IF;
2546 END IF ;
2547 Else
2548 l_parent_TOP_TASK_ID := l_task_id;
2549 END IF;
2550
2551 -- End of Addition for Bug 4378507.
2552
2553 INSERT INTO pa_tasks
2554 ( task_id
2555 ,project_id
2556 ,pm_task_reference
2557 ,task_number
2558 ,task_name
2559 ,long_task_name
2560 ,last_update_date
2561 ,last_updated_by
2562 ,creation_date
2563 ,created_by
2564 ,last_update_login
2565 ,wbs_level
2566 ,top_task_id
2567 ,parent_task_id
2568 ,address_id
2569 ,ready_to_bill_flag
2570 ,ready_to_distribute_flag
2571 ,billable_flag
2572 ,chargeable_flag
2573 ,limit_to_txn_controls_flag
2574 ,description
2575 ,service_type_code
2576 ,task_manager_person_id
2577 ,carrying_out_organization_id
2578 ,start_date
2579 ,completion_date
2580 ,labor_std_bill_rate_schdl
2581 ,labor_bill_rate_org_id
2582 ,labor_schedule_fixed_date
2583 ,labor_schedule_discount
2584 ,non_labor_std_bill_rate_schdl
2585 ,non_labor_bill_rate_org_id
2586 ,non_labor_schedule_fixed_date
2587 ,non_labor_schedule_discount
2588 ,cost_ind_rate_sch_id
2589 ,rev_ind_rate_sch_id
2590 ,inv_ind_rate_sch_id
2591 ,cost_ind_sch_fixed_date
2592 ,rev_ind_sch_fixed_date
2593 ,inv_ind_sch_fixed_date
2594 ,labor_sch_type
2595 ,non_labor_sch_type
2596 ,attribute_category
2597 ,attribute1
2598 ,attribute2
2599 ,attribute3
2600 ,attribute4
2601 ,attribute5
2602 ,attribute6
2603 ,attribute7
2604 ,attribute8
2605 ,attribute9
2606 ,attribute10
2607 ,allow_cross_charge_flag
2608 ,project_rate_type
2609 ,project_rate_date
2610 ,pm_product_code
2611 ,actual_start_date
2612 ,actual_finish_date
2613 ,early_start_date
2614 ,early_finish_date
2615 ,late_start_date
2616 ,late_finish_date
2617 ,scheduled_start_date
2618 ,scheduled_finish_date
2619 ,cc_process_labor_flag
2620 ,labor_tp_schedule_id
2621 ,labor_tp_fixed_date
2622 ,cc_process_nl_flag
2623 ,nl_tp_schedule_id
2624 ,nl_tp_fixed_date
2625 ,receive_project_invoice_flag
2626 ,work_type_id
2627 ,emp_bill_rate_schedule_id
2628 ,job_bill_rate_schedule_id
2629 ,non_lab_std_bill_rt_sch_id
2630 ,taskfunc_cost_rate_type
2631 ,taskfunc_cost_rate_date
2632 ,labor_disc_reason_code
2633 ,non_labor_disc_reason_code
2634 --PA L 2872708
2635 ,retirement_cost_flag
2636 ,cint_eligible_flag
2637 ,cint_stop_date
2638 --PA L 2872708
2639
2640 --(Begin Venkat) FP_M changes --------------------------------
2641 ,revenue_accrual_method
2642 ,invoice_method
2643 ,customer_id
2644 ,gen_etc_source_code
2645 --(End Venkat) FP_M changes --------------------------------
2646 --(Begin Rtarway)
2647 , LABOR_COST_MULTIPLIER_NAME
2648 , RECORD_VERSION_NUMBER
2649 --(End rtarway)
2650 ,adj_on_std_inv /* Added for 12.2Payroll billing ER 11899223 */
2651
2652
2653 )
2654 VALUES
2655 ( l_task_id
2656 ,l_project_id
2657 ,rtrim(l_task_in_rec.pm_task_reference)
2658 ,substrb(rtrim(l_task_in_rec.pa_task_number),1,25) -- bug 6193314 . added substrb
2659 ,substrb(rtrim(l_task_in_rec.task_name),1,20) -- bug 6193314 . added substrb
2660 ,rtrim(l_task_in_rec.long_task_name)
2661 ,sysdate
2662 ,fnd_global.user_id
2663 ,sysdate
2664 ,fnd_global.user_id
2665 ,fnd_global.login_id
2666 ,l_wbs_level --wbs_level will be updated in the 2 round.
2667 ,l_parent_TOP_TASK_ID -- top task id is updated in this round itself Bug 4378507
2668 --,l_task_id -- Commented for Bug 4378507 top task id will be updated in the 2 round.
2669 ,null --parent task id, will be updated in the 2 round
2670 ,l_address_id
2671 ,l_task_in_rec.ready_to_bill_flag
2672 ,l_task_in_rec.ready_to_distribute_flag
2673 ,l_task_in_rec.billable_flag
2674 ,l_task_in_rec.chargeable_flag
2675 ,l_task_in_rec.limit_to_txn_controls_flag
2676 ,rtrim(l_task_in_rec.task_description)
2677 ,l_task_in_rec.service_type_code
2678 ,l_task_in_rec.task_manager_person_id
2679 ,l_task_in_rec.carrying_out_organization_id
2680 ,l_task_in_rec.task_start_date
2681 ,l_task_in_rec.task_completion_date
2682 ,l_task_in_rec.labor_std_bill_rate_schdl
2683 ,l_task_in_rec.labor_bill_rate_org_id
2684 ,l_task_in_rec.labor_schedule_fixed_date
2685 ,l_task_in_rec.labor_schedule_discount
2686 ,l_task_in_rec.non_labor_std_bill_rate_schdl
2687 ,l_task_in_rec.non_labor_bill_rate_org_id
2688 ,l_task_in_rec.non_labor_schedule_fixed_date
2689 ,l_task_in_rec.non_labor_schedule_discount
2690 ,l_task_in_rec.cost_ind_rate_sch_id
2691 ,l_task_in_rec.rev_ind_rate_sch_id
2692 ,l_task_in_rec.inv_ind_rate_sch_id
2693 ,l_task_in_rec.cost_ind_sch_fixed_date
2694 ,l_task_in_rec.rev_ind_sch_fixed_date
2695 ,l_task_in_rec.inv_ind_sch_fixed_date
2696 ,l_task_in_rec.labor_sch_type
2697 ,l_task_in_rec.non_labor_sch_type
2698 ,rtrim(l_attribute_category)
2699 ,rtrim(l_attribute1)
2700 ,rtrim(l_attribute2)
2701 ,rtrim(l_attribute3)
2702 ,rtrim(l_attribute4)
2703 ,rtrim(l_attribute5)
2704 ,rtrim(l_attribute6)
2705 ,rtrim(l_attribute7)
2706 ,rtrim(l_attribute8)
2707 ,rtrim(l_attribute9)
2708 ,rtrim(l_attribute10)
2709 ,l_allow_cross_charge_flag
2710 ,l_project_rate_type
2711 ,l_project_rate_date
2712 ,p_project_rec.pm_product_code
2713 ,l_actual_start_date
2714 ,l_actual_finish_date
2715 ,l_early_start_date
2716 ,l_early_finish_date
2717 ,l_late_start_date
2718 ,l_late_finish_date
2719 ,l_scheduled_start_date
2720 ,l_scheduled_finish_date
2721 ,l_cc_process_labor_flag
2722 ,l_labor_tp_schedule_id
2723 ,l_labor_tp_fixed_date
2724 ,l_cc_process_nl_flag
2725 ,l_nl_tp_schedule_id
2726 ,l_nl_tp_fixed_date
2727 ,l_receive_project_invoice_flag
2728 ,l_work_type_id
2729 ,l_emp_bill_rate_schedule_id
2730 ,l_job_bill_rate_schedule_id
2731 ,l_non_lab_std_bill_rt_sch_id
2732 ,l_taskfunc_cost_rate_type
2733 ,l_taskfunc_cost_rate_date
2734 ,l_labor_disc_reason_code
2735 ,l_non_labor_disc_reason_code
2736 --PA L 2872708
2737 ,l_retirement_cost_flag
2738 ,l_cint_eligible_flag
2739 ,l_cint_stop_date
2740 --PA L 2872708
2741
2742 --(Begin Venkat) FP_M changes --------------------------------
2743 ,l_revenue_accrual_method
2744 ,l_invoice_method
2745 ,l_customer_id1
2746 ,l_gen_etc_source_code
2747 --(End Venkat) FP_M changes --------------------------------
2748 --(Begin Rtarway, 3658479)
2749 , l_labor_cost_multiplier_name
2750 , 1
2751 --(End rtarway , 3658479)
2752 ,l_adj_on_std_inv /* Added for 12.2Payroll billing ER 11899223 */
2753 );
2754 p_task_id := l_task_id;
2755
2756 EXCEPTION
2757 /* Added for Bug 6497559 */
2758 WHEN DUP_VAL_ON_INDEX THEN
2759 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
2760 IF p_project_rec.pm_product_code = 'MSPROJECT'
2761 THEN
2762 PA_UTILS.ADD_MESSAGE(p_app_short_name => 'PA',
2763 p_msg_name => 'PA_PS_TASK_NOT_NUM_UNIQ_MSP',
2764 p_token1 => 'TASK_NAME',
2765 p_value1 => l_task_in_rec.task_name,
2766 p_token2 => 'TASK_NUMBER',
2767 p_value2 => l_task_in_rec.pa_task_number
2768 );
2769 raise FND_API.G_EXC_ERROR;
2770 ELSE
2771 PA_UTILS.ADD_MESSAGE(p_app_short_name => 'PA',
2772 p_msg_name => 'PA_PS_TASK_NOT_NUM_UNIQ_AMG',
2773 p_token1 => 'TASK_ID',
2774 p_value1 => l_task_id
2775 );
2776 raise FND_API.G_EXC_ERROR;
2777 END IF;
2778 END IF;
2779 WHEN FND_API.G_EXC_ERROR
2780 THEN
2781 /* dbms_output.put_line('handling an G_EXC_ERROR exception'); */
2782 ROLLBACK TO add_task_round_one_pvt;
2783 p_return_status := FND_API.G_RET_STS_ERROR;
2784 -- 4537865 RESET OUT PARAMS
2785 p_task_id := NULL ;
2786 WHEN FND_API.G_EXC_UNEXPECTED_ERROR
2787 THEN
2788 /* dbms_output.put_line('handling an G_EXC_UNEXPECTED_ERROR exception'); */
2789 ROLLBACK TO add_task_round_one_pvt;
2790
2791 p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2792
2793 -- 4537865 RESET OUT PARAMS
2794 p_task_id := NULL ;
2795
2796 WHEN OTHERS THEN
2797 /* dbms_output.put_line('handling an OTHERS exception'); */
2798 ROLLBACK TO add_task_round_one_pvt;
2799
2800 p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2801
2802 -- 4537865 RESET OUT PARAMS
2803 p_task_id := NULL ;
2804
2805 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
2806 THEN
2807 FND_MSG_PUB.add_exc_msg
2808 ( p_pkg_name => G_PKG_NAME
2809 , p_procedure_name => l_api_name );
2810
2811 END IF;
2812
2813 END add_task_round_one;
2814
2815 --====================================================================================
2816 --Name: add_task_round_two
2817 --Type: Procedure
2818 --Description: This procedure can be used to add a task to a new or already
2819 -- existing project. This procedure should always be used together
2820 -- with add_task_round_one.
2821 --
2822 --
2823 --Called subprograms: none
2824 --
2825 --
2826 --
2827 --History:
2828 -- 15-AUG-1996 L. de Werker Created
2829 -- 28-MAY-1999 ODEO Fixed the three bugs mentioned in header
2830 --
2831 PROCEDURE add_task_round_two
2832 (p_return_status OUT NOCOPY VARCHAR2 -- 4537865 Added nocopy hint
2833 ,p_project_rec IN pa_projects%rowtype
2834 ,p_task_id IN NUMBER
2835 ,p_task_rec IN pa_project_pub.task_in_rec_type
2836 --Project Structures
2837 ,p_ref_task_id IN NUMBER
2838 ,p_tasks_in IN pa_project_pub.task_in_tbl_type
2839 ,p_tasks_out IN pa_project_pub.task_out_tbl_type
2840 ,p_task_version_id OUT NOCOPY NUMBER -- 4537865 Added nocopy hint
2841 ,p_create_task_structure IN VARCHAR2 -- Added new parameter for performance changes. Bug 2931183
2842 --Project Structures
2843 )
2844
2845 IS
2846
2847 --needed to get data of a task using project_id and task_reference.
2848
2849 CURSOR l_task_csr
2850 (p_project_id NUMBER
2851 ,p_pm_task_reference VARCHAR2)
2852 IS
2853 SELECT *
2854 FROM pa_tasks t
2855 WHERE t.project_id = p_project_id
2856 AND t.pm_task_reference = p_pm_task_reference;
2857
2858 --*O
2859 CURSOR l_task_id_csr
2860 (p_project_id NUMBER
2861 ,p_task_id NUMBER)
2862 IS
2863 SELECT *
2864 FROM pa_tasks t
2865 WHERE t.project_id = p_project_id
2866 AND t.task_id = p_task_id;
2867
2868
2869 l_api_name CONSTANT VARCHAR2(30) := 'add_task_round_two';
2870 l_parent_task_rec l_task_csr%rowtype;
2871 l_task_id NUMBER;
2872
2873 -- 4537865
2874 l_new_task_id NUMBER;
2875
2876 l_task_in_rec pa_project_pub.task_in_rec_type;
2877 l_wbs_level NUMBER :=1;
2878 l_project_id NUMBER;
2879 l_top_task_id NUMBER;
2880 l_parent_task_id NUMBER;
2881 l_customer_id NUMBER; /* added variable for bug 7495993*/
2882 -- l_address_id NUMBER; --address does not get inherited
2883 l_amg_segment1 VARCHAR2(25);
2884 l_amg_task_number VARCHAR2(50);
2885
2886 --bug 6153503 added below variables
2887 l_validate_dff VARCHAR2(1);
2888 l_attribute_category VARCHAR2(30);
2889 l_attribute1 VARCHAR2(150);
2890 l_attribute2 VARCHAR2(150);
2891 l_attribute3 VARCHAR2(150);
2892 l_attribute4 VARCHAR2(150);
2893 l_attribute5 VARCHAR2(150);
2894 l_attribute6 VARCHAR2(150);
2895 l_attribute7 VARCHAR2(150);
2896 l_attribute8 VARCHAR2(150);
2897 l_attribute9 VARCHAR2(150);
2898 l_attribute10 VARCHAR2(150);
2899 l_attribute11 VARCHAR2(150);
2900 l_attribute12 VARCHAR2(150);
2901 l_attribute13 VARCHAR2(150);
2902 l_attribute14 VARCHAR2(150);
2903 l_attribute15 VARCHAR2(150);
2904
2905 --needed to get the field values associated to a AMG message
2906
2907 CURSOR l_amg_project_csr
2908 (p_pa_project_id pa_projects.project_id%type)
2909 IS
2910 SELECT segment1
2911 FROM pa_projects p
2912 WHERE p.project_id = p_pa_project_id;
2913
2914 CURSOR l_amg_task_csr
2915 (p_pa_task_id pa_tasks.task_id%type)
2916 IS
2917 SELECT task_number
2918 FROM pa_tasks p
2919 WHERE p.task_id = p_pa_task_id;
2920
2921 BEGIN
2922
2923 -- Standard begin of API savepoint
2924
2925 SAVEPOINT add_task_round_two_pvt;
2926
2927
2928 -- Set API return status to success
2929
2930 p_return_status := FND_API.G_RET_STS_SUCCESS;
2931
2932 --copy the incoming parameters to local variables
2933 l_task_in_rec := p_task_rec;
2934 l_task_id := p_task_id;
2935 l_project_id := p_project_rec.project_id;
2936
2937 -- Get segment1 for AMG messages
2938
2939 OPEN l_amg_project_csr( l_project_id );
2940 FETCH l_amg_project_csr INTO l_amg_segment1;
2941 CLOSE l_amg_project_csr;
2942 /*
2943 OPEN l_amg_task_csr( l_task_id );
2944 FETCH l_amg_task_csr INTO l_amg_task_number;
2945 CLOSE l_amg_task_csr;
2946 */
2947 l_amg_task_number := pa_interface_utils_pub.get_task_number_amg
2948 (p_task_number=> l_task_in_rec.task_name
2949 ,p_task_reference => l_task_in_rec.pm_task_reference
2950 ,p_task_id => l_task_id);
2951
2952 --get the task data of the parent task when task is not top task
2953 -- *O
2954 IF (l_task_in_rec.pa_parent_task_id IS NOT NULL
2955 AND l_task_in_rec.pa_parent_task_id <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM) OR
2956 (l_task_in_rec.pm_parent_task_reference <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
2957 AND l_task_in_rec.pm_parent_task_reference IS NOT NULL)
2958 THEN
2959 IF(l_task_in_rec.pm_parent_task_reference <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
2960 AND l_task_in_rec.pm_parent_task_reference IS NOT NULL)
2961 THEN
2962 OPEN l_task_csr(p_project_rec.project_id,l_task_in_rec.pm_parent_task_reference);
2963 FETCH l_task_csr INTO l_parent_task_rec;
2964
2965 IF l_task_csr%NOTFOUND
2966 THEN
2967 CLOSE l_task_csr;
2968 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
2969 THEN
2970 pa_interface_utils_pub.map_new_amg_msg
2971 ( p_old_message_code => 'PA_PARENT_TASK_MISSING'
2972 ,p_msg_attribute => 'CHANGE'
2973 ,p_resize_flag => 'N'
2974 ,p_msg_context => 'TASK'
2975 ,p_attribute1 => l_amg_segment1
2976 ,p_attribute2 => l_amg_task_number
2977 ,p_attribute3 => ''
2978 ,p_attribute4 => ''
2979 ,p_attribute5 => '');
2980 END IF;
2981 RAISE FND_API.G_EXC_ERROR;
2982 END IF;
2983 CLOSE l_task_csr;
2984 ELSE
2985 IF (l_task_in_rec.pa_parent_task_id IS NOT NULL AND
2986 l_task_in_rec.pa_parent_task_id <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM)
2987 THEN
2988 OPEN l_task_id_csr(p_project_rec.project_id,l_task_in_rec.pa_parent_task_id);
2989 FETCH l_task_id_csr INTO l_parent_task_rec; --l_parent_task_id_rec;
2990
2991 IF l_task_id_csr%NOTFOUND
2992 THEN
2993 CLOSE l_task_id_csr;
2994 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
2995 THEN
2996 pa_interface_utils_pub.map_new_amg_msg
2997 ( p_old_message_code => 'PA_PARENT_TASK_MISSING'
2998 ,p_msg_attribute => 'CHANGE'
2999 ,p_resize_flag => 'N'
3000 ,p_msg_context => 'TASK'
3001 ,p_attribute1 => l_amg_segment1
3002 ,p_attribute2 => l_amg_task_number
3003 ,p_attribute3 => ''
3004 ,p_attribute4 => ''
3005 ,p_attribute5 => '');
3006 END IF;
3007 RAISE FND_API.G_EXC_ERROR;
3008 END IF;
3009 CLOSE l_task_id_csr;
3010 --l_parent_task_rec := l_parent_task_id_rec; -- assign to this rec, because rest of code uses this
3011 END IF;
3012 END IF ;
3013 END IF;
3014
3015 --make a distinction between "top level tasks" and "non top level tasks"
3016 -- *O
3017
3018 IF (l_task_in_rec.pa_parent_task_id IS NULL
3019 OR l_task_in_rec.pa_parent_task_id = PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM) AND
3020 (l_task_in_rec.pm_parent_task_reference IS NULL
3021 OR l_task_in_rec.pm_parent_task_reference = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR)
3022 THEN
3023 l_wbs_level := 1;
3024 l_top_task_id := l_task_id;
3025 l_parent_task_id := NULL;
3026
3027 IF l_task_in_rec.ready_to_bill_flag = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
3028 OR l_task_in_rec.ready_to_bill_flag IS NULL
3029 THEN l_task_in_rec.ready_to_bill_flag := 'Y';
3030 END IF;
3031
3032 IF l_task_in_rec.ready_to_distribute_flag = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
3033 OR l_task_in_rec.ready_to_distribute_flag IS NULL
3034 THEN l_task_in_rec.ready_to_distribute_flag := 'Y';
3035 END IF;
3036
3037
3038 UPDATE PA_TASKS
3039 SET
3040 wbs_level = l_wbs_level
3041 ,top_task_id = l_top_task_id
3042 ,parent_task_id = l_parent_task_id
3043 ,ready_to_bill_flag = l_task_in_rec.ready_to_bill_flag
3044 ,ready_to_distribute_flag = l_task_in_rec.ready_to_distribute_flag
3045 WHERE project_id = l_project_id
3046 AND task_id = l_task_id;
3047
3048 ELSE
3049
3050 l_wbs_level := l_parent_task_rec.wbs_level + 1;
3051 l_top_task_id := l_parent_task_rec.top_task_id;
3052 l_parent_task_id := l_parent_task_rec.task_id;
3053
3054 select customer_id into l_customer_id
3055 from pa_tasks where task_id =l_parent_task_id; /* added for bug 7495993 */
3056
3057 IF l_task_in_rec.service_type_code = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
3058 OR l_task_in_rec.service_type_code IS NULL
3059 THEN
3060 l_task_in_rec.service_type_code :=
3061 l_parent_task_rec.service_type_code;
3062 END IF;
3063
3064 IF l_task_in_rec.billable_flag = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
3065 THEN
3066 l_task_in_rec.billable_flag :=
3067 l_parent_task_rec.billable_flag;
3068 END IF;
3069
3070 IF l_task_in_rec.task_manager_person_id = PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
3071 THEN
3072 l_task_in_rec.task_manager_person_id :=
3073 l_parent_task_rec.task_manager_person_id;
3074 END IF;
3075
3076 IF l_task_in_rec.carrying_out_organization_id = PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
3077 OR l_task_in_rec.carrying_out_organization_id IS NULL
3078 THEN
3079 l_task_in_rec.carrying_out_organization_id :=
3080 l_parent_task_rec.carrying_out_organization_id;
3081 END IF;
3082
3083 IF l_task_in_rec.task_start_date = PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE
3084 THEN
3085 l_task_in_rec.task_start_date := l_parent_task_rec.start_date;
3086 END IF;
3087
3088 IF l_task_in_rec.task_completion_date = PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE
3089 THEN
3090 l_task_in_rec.task_completion_date := l_parent_task_rec.completion_date;
3091 END IF;
3092
3093 IF l_task_in_rec.cost_ind_rate_sch_id = PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
3094 THEN
3095 l_task_in_rec.cost_ind_rate_sch_id := l_parent_task_rec.cost_ind_rate_sch_id;
3096 END IF;
3097
3098 IF l_task_in_rec.cost_ind_sch_fixed_date = PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE
3099 THEN
3100 l_task_in_rec.cost_ind_sch_fixed_date := l_parent_task_rec.cost_ind_sch_fixed_date;
3101 END IF;
3102
3103 -- l_address_id := l_parent_task_rec.address_id; --address does not get inherited
3104
3105 IF l_task_in_rec.labor_sch_type = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
3106 THEN
3107 l_task_in_rec.labor_sch_type := l_parent_task_rec.labor_sch_type;
3108 END IF;
3109
3110 IF l_task_in_rec.labor_bill_rate_org_id = PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
3111 THEN
3112 l_task_in_rec.labor_bill_rate_org_id := l_parent_task_rec.labor_bill_rate_org_id;
3113 END IF;
3114
3115 IF l_task_in_rec.labor_std_bill_rate_schdl = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
3116 THEN
3117 l_task_in_rec.labor_std_bill_rate_schdl := l_parent_task_rec.labor_std_bill_rate_schdl;
3118 END IF;
3119
3120 IF l_task_in_rec.labor_schedule_discount = PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
3121 THEN
3122 l_task_in_rec.labor_schedule_discount := l_parent_task_rec.labor_schedule_discount;
3123 END IF;
3124
3125 IF l_task_in_rec.labor_schedule_fixed_date = PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE
3126 THEN
3127 l_task_in_rec.labor_schedule_fixed_date := l_parent_task_rec.labor_schedule_fixed_date;
3128 END IF;
3129
3130 IF l_task_in_rec.non_labor_sch_type = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
3131 THEN
3132 l_task_in_rec.non_labor_sch_type := l_parent_task_rec.non_labor_sch_type;
3133 END IF;
3134
3135 IF l_task_in_rec.non_labor_bill_rate_org_id = PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
3136 THEN
3137 l_task_in_rec.non_labor_bill_rate_org_id := l_parent_task_rec.non_labor_bill_rate_org_id;
3138 END IF;
3139
3140 IF l_task_in_rec.non_labor_std_bill_rate_schdl = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
3141 THEN
3142 l_task_in_rec.non_labor_std_bill_rate_schdl := l_parent_task_rec.non_labor_std_bill_rate_schdl;
3143 END IF;
3144
3145 IF l_task_in_rec.non_labor_schedule_discount = PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
3146 THEN
3147 l_task_in_rec.non_labor_schedule_discount := l_parent_task_rec.non_labor_schedule_discount;
3148 END IF;
3149
3150 IF l_task_in_rec.non_labor_schedule_fixed_date = PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE
3151 THEN
3152 l_task_in_rec.non_labor_schedule_fixed_date := l_parent_task_rec.non_labor_schedule_fixed_date;
3153 END IF;
3154
3155 IF l_task_in_rec.rev_ind_rate_sch_id = PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
3156 THEN
3157 l_task_in_rec.rev_ind_rate_sch_id := l_parent_task_rec.rev_ind_rate_sch_id;
3158 END IF;
3159
3160 IF l_task_in_rec.rev_ind_sch_fixed_date = PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE
3161 THEN
3162 l_task_in_rec.rev_ind_sch_fixed_date := l_parent_task_rec.rev_ind_sch_fixed_date;
3163 END IF;
3164
3165 IF l_task_in_rec.inv_ind_rate_sch_id = PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
3166 THEN
3167 l_task_in_rec.inv_ind_rate_sch_id := l_parent_task_rec.inv_ind_rate_sch_id;
3168 END IF;
3169
3170 IF l_task_in_rec.inv_ind_sch_fixed_date = PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE
3171 THEN
3172 l_task_in_rec.inv_ind_sch_fixed_date :=
3173 l_parent_task_rec.inv_ind_sch_fixed_date;
3174 END IF;
3175 --BUG 3924597 Added by rtarway for FP.M, etc_source defaulting changes
3176 --null check added , bug # 4101696, rtarway,
3177 --since gen_etc_source_code will never be null, we should default it in case it is passed as null.
3178 IF l_task_in_rec.gen_etc_source_code is null OR
3179 l_task_in_rec.gen_etc_source_code = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
3180 THEN
3181 if ( l_parent_task_rec.gen_etc_source_code is not null AND --BUG 4101696 , rtarway , or modified to and
3182 l_parent_task_rec.gen_etc_source_code <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR)
3183 then l_task_in_rec.gen_etc_source_code :=
3184 l_parent_task_rec.gen_etc_source_code;
3185 else
3186 if (nvl (PA_PROJ_TASK_STRUC_PUB.IS_WP_SEPARATE_FROM_FN ( l_project_id ), 'N') = 'N')
3187 then
3188 l_task_in_rec.gen_etc_source_code := 'WORKPLAN_RESOURCES';
3189 else
3190 l_task_in_rec.gen_etc_source_code := 'FINANCIAL_PLAN';
3191 end if;
3192 end if;
3193 END IF;
3194 --End Add BUG 3924597 Added by rtarway for FP.M, etc_source defaulting changes
3195
3196 /* Added following code to fix the bug # 878682 */
3197 /* This code was added to validate child task dates with its
3198 parent task. Child Task should always fall in the date range
3199 of its parent task. */
3200
3201 IF l_task_in_rec.task_start_date < l_parent_task_rec.start_date OR
3202 l_task_in_rec.task_start_date > l_parent_task_rec.completion_date
3203
3204 THEN
3205 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
3206 THEN
3207 pa_interface_utils_pub.map_new_amg_msg
3208 ( p_old_message_code => 'PA_PARENT_START_LATER'
3209 ,p_msg_attribute => 'CHANGE'
3210 ,p_resize_flag => 'N'
3211 ,p_msg_context => 'TASK'
3212 ,p_attribute1 => l_amg_segment1
3213 ,p_attribute2 => l_amg_task_number
3214 ,p_attribute3 => ''
3215 ,p_attribute4 => ''
3216 ,p_attribute5 => '');
3217 END IF;
3218 RAISE FND_API.G_EXC_ERROR;
3219 END IF;
3220
3221 IF l_task_in_rec.task_completion_date < l_parent_task_rec.start_date OR
3222 l_task_in_rec.task_completion_date > l_parent_task_rec.completion_date
3223
3224 THEN
3225 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
3226 THEN
3227 pa_interface_utils_pub.map_new_amg_msg
3228 ( p_old_message_code => 'PA_PARENT_COMPL_EARLIER'
3229 ,p_msg_attribute => 'CHANGE'
3230 ,p_resize_flag => 'N'
3231 ,p_msg_context => 'TASK'
3232 ,p_attribute1 => l_amg_segment1
3233 ,p_attribute2 => l_amg_task_number
3234 ,p_attribute3 => ''
3235 ,p_attribute4 => ''
3236 ,p_attribute5 => '');
3237 END IF;
3238 RAISE FND_API.G_EXC_ERROR;
3239 END IF;
3240
3241 /* Patch ends for the bug # 878682 */
3242
3243 UPDATE PA_TASKS
3244 SET
3245 wbs_level = l_wbs_level
3246 ,top_task_id = l_top_task_id
3247 ,parent_task_id = l_parent_task_id
3248 ,billable_flag = l_task_in_rec.billable_flag
3249 ,customer_id = l_customer_id /* added for bug 7495993*/
3250 ,service_type_code = l_task_in_rec.service_type_code
3251 ,task_manager_person_id = l_task_in_rec.task_manager_person_id
3252 ,carrying_out_organization_id = l_task_in_rec.carrying_out_organization_id
3253 ,start_date = l_task_in_rec.task_start_date
3254 ,completion_date = l_task_in_rec.task_completion_date
3255 ,labor_std_bill_rate_schdl = l_task_in_rec.labor_std_bill_rate_schdl
3256 ,labor_bill_rate_org_id = l_task_in_rec.labor_bill_rate_org_id
3257 ,labor_schedule_fixed_date = l_task_in_rec.labor_schedule_fixed_date
3258 ,labor_schedule_discount = l_task_in_rec.labor_schedule_discount
3259 ,non_labor_std_bill_rate_schdl = l_task_in_rec.non_labor_std_bill_rate_schdl
3260 ,non_labor_bill_rate_org_id = l_task_in_rec.non_labor_bill_rate_org_id
3261 ,non_labor_schedule_fixed_date = l_task_in_rec.non_labor_schedule_fixed_date
3262 ,non_labor_schedule_discount = l_task_in_rec.non_labor_schedule_discount
3263 ,cost_ind_rate_sch_id = l_task_in_rec.cost_ind_rate_sch_id
3264 ,rev_ind_rate_sch_id = l_task_in_rec.rev_ind_rate_sch_id
3265 ,inv_ind_rate_sch_id = l_task_in_rec.inv_ind_rate_sch_id
3266 ,cost_ind_sch_fixed_date = l_task_in_rec.cost_ind_sch_fixed_date
3267 ,rev_ind_sch_fixed_date = l_task_in_rec.rev_ind_sch_fixed_date
3268 ,inv_ind_sch_fixed_date = l_task_in_rec.inv_ind_sch_fixed_date
3269 ,labor_sch_type = l_task_in_rec.labor_sch_type
3270 ,non_labor_sch_type = l_task_in_rec.non_labor_sch_type
3271 ,gen_etc_source_code = l_task_in_rec.gen_etc_source_code -- BUG 3924597 Added by rtarway for FP.M, etc_source defaulting changes
3272 WHERE project_id = l_project_id
3273 AND task_id = l_task_id;
3274
3275 -- Update chargeable_flag for parent if chargeable_flag = 'Y' since
3276 -- we have now created a sub-task
3277 IF l_parent_task_rec.chargeable_flag = 'Y' THEN
3278 UPDATE pa_tasks
3279 SET chargeable_flag = 'N'
3280 WHERE task_id = l_parent_task_rec.task_id;
3281 END IF;
3282
3283 END IF; --distinction between top level tasks and non top level tasks
3284
3285 /* 4490532
3286 --bug 4279634
3287 --if a lowest level task has sub-projects then make the chargeable flag to 'N'
3288 IF PA_RELATIONSHIP_UTILS.check_task_has_sub_proj(l_project_id,l_task_id,null) = 'Y'
3289 THEN
3290 UPDATE pa_tasks
3291 SET chargeable_flag = 'N'
3292 WHERE task_id = l_task_id;
3293 END IF;
3294 --end bug 4279634
3295 */
3296
3297 --Project Structures Changes
3298
3299 IF p_create_task_structure <> 'N' THEN -- Performance changes. Bug 2931183
3300 -- Donot do any structures processing in bulk calling context ie from create_project.
3301 DECLARE
3302 CURSOR cur_pa_tasks
3303 IS
3304 SELECT task_number, long_task_name, description, --bug 2833194
3305 parent_task_id,carrying_out_organization_id,
3306 pm_task_reference, address_id, task_manager_person_id
3307 FROM pa_tasks
3308 WHERE project_id = l_project_id
3309 AND task_id = l_task_id;
3310
3311 l_pa_tasks_rec cur_pa_tasks%ROWTYPE;
3312 v_task_id_above NUMBER;
3313 l_msg_count NUMBER ;
3314 l_msg_data VARCHAR2(2000);
3315 l_return_status VARCHAR2(1);
3316
3317 l_last_index1 Number;
3318 l_first_index1 Number;
3319
3320 l_index_number number;
3321 l_task_version_id NUMBER;
3322 BEGIN
3323
3324 l_first_index1 := p_tasks_in.first;
3325 l_last_index1 := p_tasks_in.last;
3326
3327 IF l_first_index1 IS NOT NULL AND l_last_index1 IS NOT NULL
3328 THEN
3329 for i in l_first_index1..l_last_index1 loop
3330
3331 IF l_task_id IS NOT NULL AND p_tasks_out(i).pa_task_id IS NOT NULL AND
3332 l_task_id = p_tasks_out(i).pa_task_id
3333 THEN
3334 l_index_number := i;
3335 exit;
3336 END IF;
3337 end loop;
3338 END IF;
3339
3340 -- IF p_ref_task_id IS NULL --called from create_project or update_proejct.
3341 IF l_task_id IS NOT NULL AND p_ref_task_id IS NULL AND
3342 l_first_index1 IS NOT NULL AND l_last_index1 IS NOT NULL --called from create_project or update_proejct.
3343 THEN
3344 IF l_index_number > l_first_index1 AND
3345 p_tasks_in(l_index_number-1).pa_task_id IS NOT NULL AND
3346 p_tasks_in(l_index_number-1).pa_task_id <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
3347 --existing task becomes the ref_task_id
3348 THEN
3349 v_task_id_above := p_tasks_in(l_index_number-1).pa_task_id; --Get the task above.
3350 ELSIF l_index_number > l_first_index1 AND
3351 p_tasks_out(l_index_number-1).pa_task_id IS NOT NULL AND
3352 p_tasks_out(l_index_number-1).pa_task_id <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
3353 --new task becomes the ref_task_id
3354 THEN
3355 v_task_id_above := p_tasks_out(l_index_number-1).pa_task_id; --Get the task above created newly
3356 ELSIF ( p_tasks_in(l_index_number).pa_task_id = PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM OR
3357 p_tasks_in(l_index_number).pa_task_id IS NULL
3358 ) AND
3359 l_index_number = l_first_index1
3360 THEN
3361 v_task_id_above := null; --ref is the structure version. structure version is
3362 --derived in PA_PROJ_TASK_STRUC_PUB.create_task_structure API.
3363 END IF;
3364 ELSE --Called from PA_PROJECT_PUB.ADD_TASK API.
3365 v_task_id_above := p_ref_task_id;
3366 END IF;
3367
3368 IF l_task_id IS NOT NULL
3369 THEN
3370 OPEN cur_pa_tasks;
3371 FETCH cur_pa_tasks INTO l_pa_tasks_rec;
3372 CLOSE cur_pa_tasks;
3373
3374 --bug 6153503 added below code
3375 IF l_task_in_rec.tasks_dff = 'Y' THEN
3376 l_validate_dff := 'N';
3377 l_attribute_category := null;
3378 l_attribute1 := null;
3379 l_attribute2 := null;
3380 l_attribute3 := null;
3381 l_attribute4 := null;
3382 l_attribute5 := null;
3383 l_attribute6 := null;
3384 l_attribute7 := null;
3385 l_attribute8 := null;
3386 l_attribute9 := null;
3387 l_attribute10 := null;
3388 l_attribute11 := null;
3389 l_attribute12 := null;
3390 l_attribute13 := null;
3391 l_attribute14 := null;
3392 l_attribute15 := null;
3393
3394 ELSIF l_task_in_rec.tasks_dff = 'N' THEN
3395
3396 l_validate_dff := 'Y';
3397 l_attribute_category := l_task_in_rec.attribute_category;
3398 l_attribute1 := l_task_in_rec.attribute1;
3399 l_attribute2 := l_task_in_rec.attribute2;
3400 l_attribute3 := l_task_in_rec.attribute3;
3401 l_attribute4 := l_task_in_rec.attribute4;
3402 l_attribute5 := l_task_in_rec.attribute5;
3403 l_attribute6 := l_task_in_rec.attribute6;
3404 l_attribute7 := l_task_in_rec.attribute7;
3405 l_attribute8 := l_task_in_rec.attribute8;
3406 l_attribute9 := l_task_in_rec.attribute9;
3407 l_attribute10 := l_task_in_rec.attribute10;
3408 l_attribute11 := l_task_in_rec.attribute11;
3409 l_attribute12 := l_task_in_rec.attribute12;
3410 l_attribute13 := l_task_in_rec.attribute13;
3411 l_attribute14 := l_task_in_rec.attribute14;
3412 l_attribute15 := l_task_in_rec.attribute15;
3413 END IF;
3414
3415 PA_PROJ_TASK_STRUC_PUB.CREATE_TASK_STRUCTURE(
3416 p_calling_module => 'AMG'
3417 ,p_project_id => l_project_id
3418 ,p_task_id => l_task_id
3419 ,p_parent_task_id => l_pa_tasks_rec.parent_task_id
3420 ,p_ref_task_id => v_task_id_above
3421 ,p_task_number => l_pa_tasks_rec.task_number
3422 ,p_task_name => l_pa_tasks_rec.long_task_name --bug 2833194
3423 ,p_task_description => l_pa_tasks_rec.description
3424 ,p_carrying_out_organization_id => l_pa_tasks_rec.carrying_out_organization_id
3425 ,p_structure_type => 'FINANCIAL'
3426 ,P_PM_SOURCE_CODE => nvl(l_task_in_rec.PM_SOURCE_CODE,p_project_rec.pm_product_code) -- Bug 13923366
3427 ,P_PM_SOURCE_reference => l_pa_tasks_rec.pm_task_reference
3428 ,p_location_id => l_pa_tasks_rec.address_id
3429 ,p_manager_person_id => l_pa_tasks_rec.task_manager_person_id
3430 ,x_task_version_id => l_task_version_id
3431 ,x_task_id => l_new_task_id -- 4537865 Replaced l_task_id with l_new_task_id
3432 --for shared structures
3433 ,p_OBLIGATION_START_DATE => l_task_in_rec.OBLIGATION_START_DATE
3434 ,p_OBLIGATION_FINISH_DATE => l_task_in_rec.OBLIGATION_FINISH_DATE
3435 ,p_ESTIMATED_START_DATE => l_task_in_rec.ESTIMATED_START_DATE
3436 ,p_ESTIMATED_FINISH_DATE => l_task_in_rec.ESTIMATED_FINISH_DATE
3437 ,p_BASELINE_START_DATE => l_task_in_rec.BASELINE_START_DATE
3438 ,p_BASELINE_FINISH_DATE => l_task_in_rec.BASELINE_FINISH_DATE
3439 ,p_CLOSED_DATE => l_task_in_rec.CLOSED_DATE
3440 ,p_WQ_UOM_CODE => l_task_in_rec.WQ_UOM_CODE
3441 ,p_WQ_ITEM_CODE => l_task_in_rec.WQ_ITEM_CODE
3442 ,p_STATUS_CODE => l_task_in_rec.STATUS_CODE
3443 ,p_WF_STATUS_CODE => l_task_in_rec.WF_STATUS_CODE
3444 ,p_PRIORITY_CODE => l_task_in_rec.PRIORITY_CODE
3445 ,p_MILESTONE_FLAG => l_task_in_rec.MILESTONE_FLAG
3446 ,p_CRITICAL_FLAG => l_task_in_rec.CRITICAL_FLAG
3447 ,p_INC_PROJ_PROGRESS_FLAG => l_task_in_rec.INC_PROJ_PROGRESS_FLAG
3448 ,p_LINK_TASK_FLAG => l_task_in_rec.LINK_TASK_FLAG
3449 ,p_CALENDAR_ID => l_task_in_rec.CALENDAR_ID
3450 ,p_PLANNED_EFFORT => l_task_in_rec.PLANNED_EFFORT
3451 ,p_DURATION => l_task_in_rec.DURATION
3452 ,p_PLANNED_WORK_QUANTITY => l_task_in_rec.PLANNED_WORK_QUANTITY
3453 ,p_TASK_TYPE => l_task_in_rec.TASK_TYPE
3454 ,p_actual_start_date => l_task_in_rec.actual_start_date
3455 ,p_actual_finish_date => l_task_in_rec.actual_finish_date
3456 ,p_early_start_date => l_task_in_rec.early_start_date
3457 ,p_early_finish_date => l_task_in_rec.early_finish_date
3458 ,p_late_start_date => l_task_in_rec.late_start_date
3459 ,p_late_finish_date => l_task_in_rec.late_finish_date
3460 ,p_scheduled_start_date => l_task_in_rec.scheduled_start_date
3461 ,p_scheduled_finish_date => l_task_in_rec.scheduled_finish_date
3462 -- (Begin venkat) new params for bug #3450684 ----------------------------------------------
3463 ,p_ext_act_duration => l_task_in_rec.ext_act_duration
3464 ,p_ext_remain_duration => l_task_in_rec.ext_remain_duration
3465 ,p_ext_sch_duration => l_task_in_rec.ext_sch_duration
3466 -- (End venkat) new params for bug #3450684 -------------------------------------------------
3467
3468 -- set the new params - bug #3654243 ----------------------------------------------
3469 ,p_base_percent_comp_deriv_code => l_task_in_rec.base_percent_comp_deriv_code
3470 ,p_sch_tool_tsk_type_code => l_task_in_rec.sch_tool_tsk_type_code
3471 ,p_constraint_type_code => l_task_in_rec.constraint_type_code
3472 ,p_constraint_date => l_task_in_rec.constraint_date
3473 ,p_free_slack => l_task_in_rec.free_slack
3474 ,p_total_slack => l_task_in_rec.total_slack
3475 ,p_effort_driven_flag => l_task_in_rec.effort_driven_flag
3476 ,p_level_assignments_flag => l_task_in_rec.level_assignments_flag
3477 ,p_invoice_method => l_task_in_rec.invoice_method
3478 ,p_customer_id => l_task_in_rec.customer_id
3479 ,p_gen_etc_source_code => l_task_in_rec.gen_etc_source_code
3480 -- set the new params - bug #3654243 -------------------------------------------------
3481 --bug 6153503
3482 ,p_validate_dff => l_validate_dff
3483 ,p_attribute_category => l_attribute_category
3484 ,p_attribute1 => l_attribute1
3485 ,p_attribute2 => l_attribute2
3486 ,p_attribute3 => l_attribute3
3487 ,p_attribute4 => l_attribute4
3488 ,p_attribute5 => l_attribute5
3489 ,p_attribute6 => l_attribute6
3490 ,p_attribute7 => l_attribute7
3491 ,p_attribute8 => l_attribute8
3492 ,p_attribute9 => l_attribute9
3493 ,p_attribute10 => l_attribute10
3494 ,p_attribute11 => l_attribute11
3495 ,p_attribute12 => l_attribute12
3496 ,p_attribute13 => l_attribute13
3497 ,p_attribute14 => l_attribute14
3498 ,p_attribute15 => l_attribute15
3499 ,x_msg_count => l_msg_count
3500 ,x_msg_data => l_msg_data
3501 ,x_return_status => l_return_status
3502 );
3503
3504 l_task_id := l_new_task_id ; -- 4537865
3505 IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR
3506 THEN
3507 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3508 ELSIF l_return_status = FND_API.G_RET_STS_ERROR
3509 THEN
3510 RAISE FND_API.G_EXC_ERROR;
3511 END IF;
3512 p_task_version_id := l_task_version_id;
3513
3514 END IF;
3515 END;
3516 END IF; -- p_create_task_structure <> 'N' Performance change. Bug 2931183
3517 --Project Structures Changes
3518
3519
3520 EXCEPTION
3521
3522 WHEN FND_API.G_EXC_ERROR
3523 THEN
3524 /* dbms_output.put_line('handling an G_EXC_ERROR exception'); */
3525 ROLLBACK TO add_task_round_two_pvt;
3526
3527 p_return_status := FND_API.G_RET_STS_ERROR;
3528
3529 -- 4537865 RESET OUT PARAMS
3530 p_task_version_id := NULL ;
3531
3532 WHEN FND_API.G_EXC_UNEXPECTED_ERROR
3533 THEN
3534 /* dbms_output.put_line('handling an G_EXC_UNEXPECTED_ERROR exception'); */
3535 ROLLBACK TO add_task_round_two_pvt;
3536
3537 p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
3538
3539 -- 4537865 RESET OUT PARAMS
3540 p_task_version_id := NULL ;
3541
3542 WHEN OTHERS THEN
3543 /* dbms_output.put_line('handling an OTHERS exception'); */
3544 ROLLBACK TO add_task_round_two_pvt;
3545
3546 p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
3547
3548 -- 4537865 RESET OUT PARAMS
3549 p_task_version_id := NULL ;
3550
3551 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
3552 THEN
3553 FND_MSG_PUB.add_exc_msg
3554 ( p_pkg_name => G_PKG_NAME
3555 , p_procedure_name => l_api_name );
3556
3557 END IF;
3558
3559 END add_task_round_two;
3560
3561 --====================================================================================
3562 --
3563 --Name: fetch_project_id
3564 --Type: Function
3565 --Description: This function will return the project ID
3566 -- when giving it the project reference
3567 --
3568 --
3569 --Called subprograms: none
3570 --
3571 --
3572 --
3573 --History:
3574 -- 19-AUG-1996 R. Krishna. Created
3575 --
3576 FUNCTION Fetch_project_id
3577 (p_pm_project_reference IN VARCHAR2 ) RETURN NUMBER
3578
3579 IS
3580
3581 CURSOR c_projects_csr IS
3582 SELECT project_id
3583 FROM
3584 pa_projects
3585 WHERE
3586 pm_project_reference = p_pm_project_reference;
3587
3588 l_project_rec c_projects_csr%ROWTYPE;
3589
3590 BEGIN
3591
3592 OPEN c_projects_csr;
3593 FETCH c_projects_csr INTO l_project_rec.project_id;
3594 IF c_projects_csr%NOTFOUND THEN
3595 CLOSE c_projects_csr;
3596 RETURN NULL;
3597 ELSE
3598 CLOSE c_projects_csr;
3599 RETURN l_project_rec.project_id;
3600 END IF;
3601
3602 END Fetch_project_id;
3603
3604 --====================================================================================
3605 --
3606 --Name: fetch_task_id
3607 --Type: Function
3608 --Description: This function will return the task ID
3609 -- when giving it the task reference
3610 --
3611 --
3612 --Called subprograms: none
3613 --
3614 --
3615 --
3616 --History:
3617 -- 19-AUG-1996 R. Krishna. Created
3618 --
3619 FUNCTION Fetch_task_id
3620 ( p_pa_project_id IN NUMBER
3621 ,p_pm_task_reference IN VARCHAR2 ) RETURN NUMBER
3622
3623 IS
3624
3625 CURSOR c_task_csr IS
3626 SELECT task_id
3627 FROM
3628 pa_tasks
3629 WHERE project_id = p_pa_project_id
3630 AND pm_task_reference = p_pm_task_reference;
3631
3632 l_task_rec c_task_csr%ROWTYPE;
3633
3634 BEGIN
3635
3636 OPEN c_task_csr;
3637 FETCH c_task_csr INTO l_task_rec.task_id;
3638 IF c_task_csr%NOTFOUND THEN
3639 CLOSE c_task_csr;
3640 RETURN NULL;
3641 ELSE
3642 CLOSE c_task_csr;
3643 RETURN l_task_rec.task_id;
3644 END IF;
3645
3646 END Fetch_task_id;
3647
3648 --====================================================================================
3649 --Name: convert_pm_projref_to_id
3650 --Type: Procedure
3651 --Description: This procedure can be used to converse
3652 -- an incoming project reference to
3653 -- a project ID.
3654 --
3655 --Called subprograms: none
3656 --
3657 --
3658 --
3659 --History:
3660 -- 19-AUG-1996 R. Krishna. Created
3661 -- 02-DEC-1996 L de Werker Removed value_not_used message
3662 -- Added validity check for project_id
3663 --
3664 PROCEDURE Convert_pm_projref_to_id
3665 (p_pm_project_reference IN VARCHAR2 := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
3666 ,p_pa_project_id IN NUMBER := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
3667 ,p_out_project_id OUT NOCOPY NUMBER -- 4537865 Added nocopy
3668 ,p_return_status OUT NOCOPY VARCHAR2 ) -- 4537865 Added nocopy
3669
3670 IS
3671
3672 CURSOR l_project_id_csr
3673 IS
3674 SELECT 'X'
3675 FROM pa_projects
3676 where project_id = p_pa_project_id;
3677
3678 l_api_name CONSTANT VARCHAR2(30) := 'Convert_pm_projref_to_id';
3679 l_project_id NUMBER ;
3680 l_dummy VARCHAR2(1);
3681
3682 BEGIN
3683
3684 p_return_status := FND_API.G_RET_STS_SUCCESS;
3685
3686 IF p_pa_project_id <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
3687 AND p_pa_project_id IS NOT NULL
3688 THEN
3689
3690 --check validity of this ID
3691 OPEN l_project_id_csr;
3692 FETCH l_project_id_csr INTO l_dummy;
3693
3694 IF l_project_id_csr%NOTFOUND
3695 THEN
3696 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
3697 THEN
3698 pa_interface_utils_pub.map_new_amg_msg
3699 ( p_old_message_code => 'PA_INVALID_PROJECT_ID'
3700 ,p_msg_attribute => 'CHANGE'
3701 ,p_resize_flag => 'N'
3702 ,p_msg_context => 'GENERAL'
3703 ,p_attribute1 => ''
3704 ,p_attribute2 => ''
3705 ,p_attribute3 => ''
3706 ,p_attribute4 => ''
3707 ,p_attribute5 => '');
3708 END IF;
3709
3710 CLOSE l_project_id_csr;
3711 RAISE FND_API.G_EXC_ERROR;
3712 END IF;
3713
3714 CLOSE l_project_id_csr;
3715 p_out_project_id := p_pa_project_id;
3716
3717 ELSIF p_pm_project_reference <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
3718 AND p_pm_project_reference IS NOT NULL
3719 THEN
3720 l_project_id := Fetch_project_id
3721 (p_pm_project_reference => p_pm_project_reference);
3722
3723 IF l_project_id IS NULL
3724 THEN
3725 IF FND_MSG_PUB.check_msg_level (FND_MSG_PUB.G_MSG_LVL_ERROR)
3726 THEN
3727 FND_MESSAGE.SET_NAME('PA','PA_API_CONV_ERROR_AMG'); -- bug 2257612
3728 FND_MESSAGE.SET_TOKEN('ATTR_NAME','Pm Project Reference');
3729 FND_MESSAGE.SET_TOKEN('ATTR_VALUE',p_pm_project_reference);
3730 FND_MSG_PUB.add;
3731 END IF;
3732
3733 RAISE FND_API.G_EXC_ERROR;
3734 ELSE
3735 p_out_project_id := l_project_id;
3736
3737 END IF;
3738 ELSE
3739
3740 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
3741 THEN
3742 pa_interface_utils_pub.map_new_amg_msg
3743 ( p_old_message_code => 'PA_PROJECT_REF_AND_ID_MISSING'
3744 ,p_msg_attribute => 'CHANGE'
3745 ,p_resize_flag => 'Y'
3746 ,p_msg_context => 'GENERAL'
3747 ,p_attribute1 => ''
3748 ,p_attribute2 => ''
3749 ,p_attribute3 => ''
3750 ,p_attribute4 => ''
3751 ,p_attribute5 => '');
3752 END IF;
3753
3754 RAISE FND_API.G_EXC_ERROR;
3755
3756 END IF; -- If p_pa_project_id <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
3757
3758 EXCEPTION
3759
3760 WHEN FND_API.G_EXC_ERROR
3761 THEN
3762 /* dbms_output.put_line('handling an G_EXC_ERROR exception'); */
3763
3764 p_return_status := FND_API.G_RET_STS_ERROR;
3765
3766 -- 4537865
3767 p_out_project_id := NULL ;
3768
3769 WHEN FND_API.G_EXC_UNEXPECTED_ERROR
3770 THEN
3771 /* dbms_output.put_line('handling an G_EXC_UNEXPECTED_ERROR exception'); */
3772
3773 p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
3774
3775 -- 4537865
3776 p_out_project_id := NULL ;
3777
3778 WHEN OTHERS THEN
3779 /* dbms_output.put_line('handling an OTHERS exception'); */
3780
3781 p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
3782
3783 -- 4537865
3784 p_out_project_id := NULL ;
3785
3786 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
3787 THEN
3788 FND_MSG_PUB.add_exc_msg
3789 ( p_pkg_name => G_PKG_NAME
3790 , p_procedure_name => l_api_name );
3791
3792 END IF;
3793
3794 END Convert_pm_projref_to_id;
3795
3796 --====================================================================================
3797 --Name: convert_pm_taskref_to_id
3798 --Type: Procedure
3799 --Description: This procedure can be used to converse
3800 -- an incoming task reference to
3801 -- a task ID.
3802 --
3803 --Called subprograms: none
3804 --
3805 --
3806 --
3807 --History:
3808 -- 19-AUG-1996 R. Krishna. Created
3809 -- 02-DEC-1996 L. de Werker Removed value_not_used message
3810 -- Added validation for project_id
3811 -- Added validation for task_id
3812 --
3813 Procedure Convert_pm_taskref_to_id (
3814 p_pa_project_id IN NUMBER,
3815 p_pa_task_id IN NUMBER := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM,
3816 p_pm_task_reference IN VARCHAR2 := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR,
3817 p_out_task_id OUT NOCOPY NUMBER, -- 4537865
3818 p_return_status OUT NOCOPY VARCHAR2 ) -- 4537865
3819
3820 IS
3821
3822 CURSOR l_project_id_csr
3823 IS
3824 SELECT 'X'
3825 FROM pa_projects
3826 where project_id = p_pa_project_id;
3827
3828 CURSOR l_task_id_csr
3829 IS
3830 SELECT 'X'
3831 FROM pa_tasks
3832 WHERE task_id = p_pa_task_id
3833 AND project_id = p_pa_project_id;
3834
3835
3836 l_api_name CONSTANT VARCHAR2(30) := 'Convert_pm_taskref_to_id';
3837 l_task_id NUMBER ;
3838 l_dummy VARCHAR2(1);
3839 --needed to get the field values associated to a AMG message
3840
3841 CURSOR l_amg_project_csr
3842 (p_pa_project_id pa_projects.project_id%type)
3843 IS
3844 SELECT segment1
3845 FROM pa_projects p
3846 WHERE p.project_id = p_pa_project_id;
3847
3848 l_amg_segment1 VARCHAR2(25);
3849
3850 BEGIN
3851
3852 p_return_status := FND_API.G_RET_STS_SUCCESS;
3853
3854 IF p_pa_project_id <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
3855 AND p_pa_project_id IS NOT NULL
3856 THEN
3857
3858 OPEN l_project_id_csr;
3859 FETCH l_project_id_csr INTO l_dummy;
3860
3861 IF l_project_id_csr%NOTFOUND
3862 THEN
3863 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
3864 THEN
3865 pa_interface_utils_pub.map_new_amg_msg
3866 ( p_old_message_code => 'PA_INVALID_PROJECT_ID'
3867 ,p_msg_attribute => 'CHANGE'
3868 ,p_resize_flag => 'N'
3869 ,p_msg_context => 'GENERAL'
3870 ,p_attribute1 => ''
3871 ,p_attribute2 => ''
3872 ,p_attribute3 => ''
3873 ,p_attribute4 => ''
3874 ,p_attribute5 => '');
3875 END IF;
3876
3877 CLOSE l_project_id_csr;
3878 RAISE FND_API.G_EXC_ERROR;
3879 END IF;
3880
3881 CLOSE l_project_id_csr;
3882 ELSE
3883
3884 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
3885 THEN
3886 pa_interface_utils_pub.map_new_amg_msg
3887 ( p_old_message_code => 'PA_PROJECT_ID_MISSING'
3888 ,p_msg_attribute => 'CHANGE'
3889 ,p_resize_flag => 'N'
3890 ,p_msg_context => 'GENERAL'
3891 ,p_attribute1 => ''
3892 ,p_attribute2 => ''
3893 ,p_attribute3 => ''
3894 ,p_attribute4 => ''
3895 ,p_attribute5 => '');
3896 END IF;
3897
3898 RAISE FND_API.G_EXC_ERROR;
3899
3900 END IF;
3901
3902 IF p_pa_task_id <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
3903 AND p_pa_task_id IS NOT NULL
3904 THEN
3905
3906 -- Get segment1 for AMG messages
3907
3908 OPEN l_amg_project_csr( p_pa_project_id );
3909 FETCH l_amg_project_csr INTO l_amg_segment1;
3910 CLOSE l_amg_project_csr;
3911
3912 OPEN l_task_id_csr;
3913 FETCH l_task_id_csr INTO l_dummy;
3914
3915 IF l_task_id_csr%NOTFOUND
3916 THEN
3917 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
3918 THEN
3919 pa_interface_utils_pub.map_new_amg_msg
3920 ( p_old_message_code => 'PA_TASK_ID_INVALID'
3921 ,p_msg_attribute => 'CHANGE'
3922 ,p_resize_flag => 'N'
3923 ,p_msg_context => 'PROJ'
3924 ,p_attribute1 => l_amg_segment1
3925 ,p_attribute2 => ''
3926 ,p_attribute3 => ''
3927 ,p_attribute4 => ''
3928 ,p_attribute5 => '');
3929 END IF;
3930
3931 CLOSE l_task_id_csr;
3932 RAISE FND_API.G_EXC_ERROR;
3933 END IF;
3934
3935 CLOSE l_task_id_csr;
3936
3937 p_out_task_id := p_pa_task_id;
3938
3939 ELSIF p_pm_task_reference <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
3940 AND p_pm_task_reference IS NOT NULL
3941 THEN
3942 l_task_id := Fetch_task_id
3943 (p_pa_project_id => p_pa_project_id,
3944 p_pm_task_reference => p_pm_task_reference);
3945 IF l_task_id IS NULL
3946 THEN
3947 IF FND_MSG_PUB.check_msg_level (FND_MSG_PUB.G_MSG_LVL_ERROR)
3948 THEN
3949 FND_MESSAGE.SET_NAME('PA','PA_API_CONV_ERROR_AMG'); -- Bug 2257612
3950 FND_MESSAGE.SET_TOKEN('ATTR_NAME','Pm Task Reference');
3951 FND_MESSAGE.SET_TOKEN('ATTR_VALUE',p_pm_task_reference);
3952 FND_MSG_PUB.add;
3953
3954 RAISE FND_API.G_EXC_ERROR;
3955
3956 END IF;
3957 ELSE
3958 p_out_task_id := l_task_id;
3959
3960 END IF;
3961 ELSE
3962 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
3963 THEN
3964 pa_interface_utils_pub.map_new_amg_msg
3965 ( p_old_message_code => 'PA_TASK_REF_AND_ID_MISSING'
3966 ,p_msg_attribute => 'CHANGE'
3967 ,p_resize_flag => 'N'
3968 ,p_msg_context => 'PROJ'
3969 ,p_attribute1 => l_amg_segment1
3970 ,p_attribute2 => ''
3971 ,p_attribute3 => ''
3972 ,p_attribute4 => ''
3973 ,p_attribute5 => '');
3974 END IF;
3975
3976 RAISE FND_API.G_EXC_ERROR;
3977
3978 END IF; -- If p_pa_task_id <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
3979
3980 EXCEPTION
3981
3982 WHEN FND_API.G_EXC_ERROR
3983 THEN
3984 /* dbms_output.put_line('handling an G_EXC_ERROR exception'); */
3985
3986 p_return_status := FND_API.G_RET_STS_ERROR;
3987
3988 -- 4537865 RESET OUT PARAMS
3989 p_out_task_id := NULL ;
3990
3991 WHEN FND_API.G_EXC_UNEXPECTED_ERROR
3992 THEN
3993 /* dbms_output.put_line('handling an G_EXC_UNEXPECTED_ERROR exception'); */
3994
3995 p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
3996
3997 -- 4537865 RESET OUT PARAMS
3998 p_out_task_id := NULL ;
3999
4000 WHEN OTHERS THEN
4001 /* dbms_output.put_line('handling an OTHERS exception'); */
4002
4003 p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4004
4005 -- 4537865 RESET OUT PARAMS
4006 p_out_task_id := NULL ;
4007
4008 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
4009 THEN
4010 FND_MSG_PUB.add_exc_msg
4011 ( p_pkg_name => G_PKG_NAME
4012 , p_procedure_name => l_api_name );
4013
4014 END IF;
4015
4016 END Convert_pm_taskref_to_id;
4017
4018 --====================================================================================
4019 --Name: convert_pm_taskref_to_id
4020 --Type: Procedure
4021 --Description: This procedure can be used to converse
4022 -- an incoming task reference to
4023 -- a task ID.
4024 --
4025 --Called subprograms: none
4026 --
4027 --
4028 --
4029 --History:
4030 -- 19-AUG-1996 R. Krishna. Created
4031 -- 02-DEC-1996 L. de Werker Removed value_not_used message
4032 -- Added validation for project_id
4033 -- Added validation for task_id
4034 --
4035 Procedure Convert_pm_taskref_to_id_all (
4036 p_pa_project_id IN NUMBER,
4037 p_structure_type IN VARCHAR2 := 'FINANCIAL',
4038 p_pa_task_id IN NUMBER := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM,
4039 p_pm_task_reference IN VARCHAR2 := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR,
4040 p_out_task_id OUT NOCOPY NUMBER, -- 4537865 Added nocopy hint
4041 p_return_status OUT NOCOPY VARCHAR2 ) -- 4537865 Added nocopy hint
4042
4043 IS
4044
4045 CURSOR l_project_id_csr
4046 IS
4047 SELECT 'X'
4048 FROM pa_projects
4049 where project_id = p_pa_project_id;
4050
4051 CURSOR l_task_id_csr
4052 IS
4053 SELECT 'X'
4054 FROM pa_tasks
4055 WHERE task_id = p_pa_task_id
4056 AND project_id = p_pa_project_id;
4057
4058 CURSOR l_proj_element_id_csr
4059 IS
4060 SELECT 'X'
4061 FROM pa_proj_elements
4062 WHERE proj_element_id = p_pa_task_id
4063 AND project_id = p_pa_project_id;
4064
4065 CURSOR cur_pa_proj_elems
4066 IS
4067 SELECT proj_element_id
4068 FROM pa_proj_elements
4069 WHERE PM_SOURCE_REFERENCE = p_pm_task_reference
4070 AND project_id = p_pa_project_id
4071 AND parent_structure_id = ( SELECT ppe.proj_element_id --Added this subQry for bug#3653517
4072 FROM pa_proj_elements ppe,
4073 pa_proj_structure_types ppst,
4074 pa_structure_types pst
4075 WHERE ppe.proj_element_id = ppst.proj_element_id
4076 AND ppe.project_id = p_pa_project_id
4077 AND ppst.structure_type_id = pst.structure_type_id
4078 AND pst.structure_type = p_structure_type)
4079 AND OBJECT_TYPE = 'PA_TASKS';
4080
4081 l_api_name CONSTANT VARCHAR2(30) := 'Convert_pm_taskref_to_id_all';
4082 l_task_id NUMBER ;
4083 l_dummy VARCHAR2(1);
4084 --needed to get the field values associated to a AMG message
4085
4086 CURSOR l_amg_project_csr
4087 (p_pa_project_id pa_projects.project_id%type)
4088 IS
4089 SELECT segment1
4090 FROM pa_projects p
4091 WHERE p.project_id = p_pa_project_id;
4092
4093 l_amg_segment1 VARCHAR2(25);
4094 --Added by rtarway for BUG 3919800
4095 l_project_sharing_type VARCHAR2(250);
4096
4097 BEGIN
4098
4099 p_return_status := FND_API.G_RET_STS_SUCCESS;
4100
4101 IF p_pa_project_id <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
4102 AND p_pa_project_id IS NOT NULL
4103 THEN
4104
4105 OPEN l_project_id_csr;
4106 FETCH l_project_id_csr INTO l_dummy;
4107
4108 IF l_project_id_csr%NOTFOUND
4109 THEN
4110 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
4111 THEN
4112 pa_interface_utils_pub.map_new_amg_msg
4113 ( p_old_message_code => 'PA_INVALID_PROJECT_ID'
4114 ,p_msg_attribute => 'CHANGE'
4115 ,p_resize_flag => 'N'
4116 ,p_msg_context => 'GENERAL'
4117 ,p_attribute1 => ''
4118 ,p_attribute2 => ''
4119 ,p_attribute3 => ''
4120 ,p_attribute4 => ''
4121 ,p_attribute5 => '');
4122 END IF;
4123
4124 CLOSE l_project_id_csr;
4125 RAISE FND_API.G_EXC_ERROR;
4126 END IF;
4127
4128 CLOSE l_project_id_csr;
4129 ELSE
4130
4131 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
4132 THEN
4133 pa_interface_utils_pub.map_new_amg_msg
4134 ( p_old_message_code => 'PA_PROJECT_ID_MISSING'
4135 ,p_msg_attribute => 'CHANGE'
4136 ,p_resize_flag => 'N'
4137 ,p_msg_context => 'GENERAL'
4138 ,p_attribute1 => ''
4139 ,p_attribute2 => ''
4140 ,p_attribute3 => ''
4141 ,p_attribute4 => ''
4142 ,p_attribute5 => '');
4143 END IF;
4144
4145 RAISE FND_API.G_EXC_ERROR;
4146
4147 END IF;
4148
4149 IF (p_structure_type = 'FINANCIAL') THEN
4150
4151 --Added by rtarway, for BUG 3919800
4152 --Get the structure sharing type, if its partial shared structure, check for the task in
4153 --pa_proj_elements too.
4154
4155 l_project_sharing_type := PA_PROJ_TASK_STRUC_PUB.GET_SHARE_TYPE(p_pa_project_id);
4156
4157 IF p_pa_task_id <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
4158 AND p_pa_task_id IS NOT NULL
4159 THEN
4160
4161 -- Get segment1 for AMG messages
4162
4163 OPEN l_amg_project_csr( p_pa_project_id );
4164 FETCH l_amg_project_csr INTO l_amg_segment1;
4165 CLOSE l_amg_project_csr;
4166
4167 OPEN l_task_id_csr;
4168 FETCH l_task_id_csr INTO l_dummy;
4169
4170 IF l_task_id_csr%NOTFOUND
4171 THEN
4172 --Added by rtarway, for BUG 3919800
4173 -- bug 8325536 - skkoppul : added SHARE_FULL structure_type condition. Update_task will
4174 -- always be called with structure_type as FINANCIAL in case of fully shared structure
4175 -- hence task_id needs to be validaetd against pa_proj_elements if it does not exist in
4176 -- pa_tasks table which is the case when task is never published.
4177 IF (l_project_sharing_type = 'SHARE_PARTIAL' OR l_project_sharing_type = 'SHARE_FULL')
4178 THEN
4179 OPEN l_proj_element_id_csr;
4180 FETCH l_proj_element_id_csr INTO l_dummy;
4181
4182 IF l_proj_element_id_csr%NOTFOUND
4183 THEN
4184
4185 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
4186 THEN
4187 pa_interface_utils_pub.map_new_amg_msg
4188 ( p_old_message_code => 'PA_TASK_ID_INVALID'
4189 ,p_msg_attribute => 'CHANGE'
4190 ,p_resize_flag => 'N'
4191 ,p_msg_context => 'PROJ'
4192 ,p_attribute1 => l_amg_segment1
4193 ,p_attribute2 => ''
4194 ,p_attribute3 => ''
4195 ,p_attribute4 => ''
4196 ,p_attribute5 => '');
4197 END IF;
4198 CLOSE l_proj_element_id_csr;
4199 RAISE FND_API.G_EXC_ERROR;
4200 END IF;
4201 CLOSE l_proj_element_id_csr;
4202 p_out_task_id := p_pa_task_id;
4203 ELSE
4204 --End Added by rtarway, for BUG 3919800
4205 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
4206 THEN
4207 pa_interface_utils_pub.map_new_amg_msg
4208 ( p_old_message_code => 'PA_TASK_ID_INVALID'
4209 ,p_msg_attribute => 'CHANGE'
4210 ,p_resize_flag => 'N'
4211 ,p_msg_context => 'PROJ'
4212 ,p_attribute1 => l_amg_segment1
4213 ,p_attribute2 => ''
4214 ,p_attribute3 => ''
4215 ,p_attribute4 => ''
4216 ,p_attribute5 => '');
4217 END IF;
4218
4219 CLOSE l_task_id_csr;
4220 RAISE FND_API.G_EXC_ERROR;
4221 --Added by rtarway, for BUG 3919800
4222 END IF;
4223 --End Added by rtarway, for BUG 3919800
4224 END IF;
4225
4226 CLOSE l_task_id_csr;
4227
4228 p_out_task_id := p_pa_task_id;
4229
4230 ELSIF p_pm_task_reference <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
4231 AND p_pm_task_reference IS NOT NULL
4232 THEN
4233 l_task_id := Fetch_task_id
4234 (p_pa_project_id => p_pa_project_id,
4235 p_pm_task_reference => p_pm_task_reference);
4236 IF l_task_id IS NULL
4237 THEN
4238
4239 --Added by rtarway, for BUG 3919800
4240 IF (l_project_sharing_type = 'SHARE_PARTIAL')
4241 THEN
4242 OPEN cur_pa_proj_elems;
4243 FETCH cur_pa_proj_elems INTO p_out_task_id;
4244 IF cur_pa_proj_elems%NOTFOUND
4245 THEN
4246 IF FND_MSG_PUB.check_msg_level (FND_MSG_PUB.G_MSG_LVL_ERROR)
4247 THEN
4248 FND_MESSAGE.SET_NAME('PA','PA_API_CONV_ERROR_AMG'); -- Bug 2257612
4249 FND_MESSAGE.SET_TOKEN('ATTR_NAME','Pm Task Reference');
4250 FND_MESSAGE.SET_TOKEN('ATTR_VALUE',p_pm_task_reference);
4251 FND_MSG_PUB.add;
4252 CLOSE cur_pa_proj_elems;
4253 RAISE FND_API.G_EXC_ERROR;
4254 END IF;
4255 END IF;
4256 CLOSE cur_pa_proj_elems;
4257 ELSE
4258 --End Add by rtarway,for BUG 3919800
4259
4260 IF FND_MSG_PUB.check_msg_level (FND_MSG_PUB.G_MSG_LVL_ERROR)
4261 THEN
4262 FND_MESSAGE.SET_NAME('PA','PA_API_CONV_ERROR_AMG'); -- Bug 2257612
4263 FND_MESSAGE.SET_TOKEN('ATTR_NAME','Pm Task Reference');
4264 FND_MESSAGE.SET_TOKEN('ATTR_VALUE',p_pm_task_reference);
4265 FND_MSG_PUB.add;
4266
4267 RAISE FND_API.G_EXC_ERROR;
4268
4269 END IF;
4270 END IF;--Added by rtarway for BUG 3919800
4271 ELSE
4272 p_out_task_id := l_task_id;
4273 END IF;
4274 ELSE
4275 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
4276 THEN
4277 pa_interface_utils_pub.map_new_amg_msg
4278 ( p_old_message_code => 'PA_TASK_REF_AND_ID_MISSING'
4279 ,p_msg_attribute => 'CHANGE'
4280 ,p_resize_flag => 'N'
4281 ,p_msg_context => 'PROJ'
4282 ,p_attribute1 => l_amg_segment1
4283 ,p_attribute2 => ''
4284 ,p_attribute3 => ''
4285 ,p_attribute4 => ''
4286 ,p_attribute5 => '');
4287 END IF;
4288
4289 RAISE FND_API.G_EXC_ERROR;
4290
4291 END IF; -- If p_pa_task_id <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
4292 ELSIF (p_structure_type = 'WORKPLAN') THEN
4293 IF p_pa_task_id <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
4294 AND p_pa_task_id IS NOT NULL
4295 THEN
4296
4297 -- Get segment1 for AMG messages
4298 OPEN l_amg_project_csr( p_pa_project_id );
4299 FETCH l_amg_project_csr INTO l_amg_segment1;
4300 CLOSE l_amg_project_csr;
4301
4302 OPEN l_proj_element_id_csr;
4303 FETCH l_proj_element_id_csr INTO l_dummy;
4304
4305 IF l_proj_element_id_csr%NOTFOUND
4306 THEN
4307 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
4308 THEN
4309 pa_interface_utils_pub.map_new_amg_msg
4310 ( p_old_message_code => 'PA_TASK_ID_INVALID'
4311 ,p_msg_attribute => 'CHANGE'
4312 ,p_resize_flag => 'N'
4313 ,p_msg_context => 'PROJ'
4314 ,p_attribute1 => l_amg_segment1
4315 ,p_attribute2 => ''
4316 ,p_attribute3 => ''
4317 ,p_attribute4 => ''
4318 ,p_attribute5 => '');
4319 END IF;
4320
4321 CLOSE l_proj_element_id_csr;
4322 RAISE FND_API.G_EXC_ERROR;
4323 END IF;
4324
4325 CLOSE l_proj_element_id_csr;
4326
4327 p_out_task_id := p_pa_task_id;
4328
4329 ELSIF p_pm_task_reference <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
4330 AND p_pm_task_reference IS NOT NULL
4331 THEN
4332 OPEN cur_pa_proj_elems;
4333 FETCH cur_pa_proj_elems INTO p_out_task_id;
4334
4335 IF cur_pa_proj_elems%NOTFOUND
4336 THEN
4337 p_return_status := FND_API.G_RET_STS_ERROR;
4338 IF FND_MSG_PUB.check_msg_level (FND_MSG_PUB.G_MSG_LVL_ERROR)
4339 THEN
4340 FND_MESSAGE.SET_NAME('PA','PA_API_CONV_ERROR_AMG'); -- Bug 2257612
4341 FND_MESSAGE.SET_TOKEN('ATTR_NAME','Pm Task Reference');
4342 FND_MESSAGE.SET_TOKEN('ATTR_VALUE',p_pm_task_reference);
4343 FND_MSG_PUB.add;
4344 RAISE FND_API.G_EXC_ERROR;
4345 END IF;
4346 END IF;
4347 CLOSE cur_pa_proj_elems;
4348
4349 ELSE
4350 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
4351 THEN
4352 pa_interface_utils_pub.map_new_amg_msg
4353 ( p_old_message_code => 'PA_TASK_REF_AND_ID_MISSING'
4354 ,p_msg_attribute => 'CHANGE'
4355 ,p_resize_flag => 'N'
4356 ,p_msg_context => 'PROJ'
4357 ,p_attribute1 => l_amg_segment1
4358 ,p_attribute2 => ''
4359 ,p_attribute3 => ''
4360 ,p_attribute4 => ''
4361 ,p_attribute5 => '');
4362 END IF;
4363
4364 RAISE FND_API.G_EXC_ERROR;
4365
4366 END IF; -- If p_pa_task_id <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
4367 END IF;
4368
4369 EXCEPTION
4370
4371 WHEN FND_API.G_EXC_ERROR
4372 THEN
4373 /* dbms_output.put_line('handling an G_EXC_ERROR exception'); */
4374
4375 p_return_status := FND_API.G_RET_STS_ERROR;
4376
4377 -- 4537865 RESET OUT PARAMS
4378 p_out_task_id := NULL ;
4379
4380 WHEN FND_API.G_EXC_UNEXPECTED_ERROR
4381 THEN
4382 /* dbms_output.put_line('handling an G_EXC_UNEXPECTED_ERROR exception'); */
4383
4384 p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4385
4386 -- 4537865 RESET OUT PARAMS
4387 p_out_task_id := NULL ;
4388
4389 WHEN OTHERS THEN
4390 /* dbms_output.put_line('handling an OTHERS exception'); */
4391
4392 p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4393
4394 -- 4537865 RESET OUT PARAMS
4395 p_out_task_id := NULL ;
4396
4397 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
4398 THEN
4399 FND_MSG_PUB.add_exc_msg
4400 ( p_pkg_name => G_PKG_NAME
4401 , p_procedure_name => l_api_name );
4402
4403 END IF;
4404
4405 END Convert_pm_taskref_to_id_all;
4406
4407 --====================================================================================
4408 --Name: check_valid_message
4409 --Type: Function
4410 --Description: Checks whether procedure in core package returns valid message.
4411 --
4412 --Called subprograms: none
4413 --
4414 --
4415 --
4416 --History:
4417 -- autumn-96 R. Krishna. Created
4418 --
4419 FUNCTION check_valid_message (p_message IN VARCHAR2) RETURN BOOLEAN
4420 IS
4421
4422 BEGIN
4423 IF p_message NOT LIKE 'PA_%'
4424 THEN
4425 RETURN FALSE;
4426 END IF;
4427
4428 FND_MESSAGE.SET_NAME ('PA',p_message);
4429 RETURN TRUE;
4430
4431 EXCEPTION
4432 WHEN VALUE_ERROR
4433 THEN
4434 RETURN FALSE;
4435 END check_valid_message;
4436
4437 --====================================================================================
4438 --Name: check_valid_org
4439 --Type: Function
4440 --Description: Checks whether this is a valid organization
4441 --
4442 --Called subprograms: none
4443 --
4444 --
4445 --
4446 --History:
4447 -- automn-1996 R. Krishna. Created
4448 -- 05-DEC-1996 L. de Werker Changed cursor
4449 --
4450 FUNCTION check_valid_org (p_org_id IN NUMBER ) RETURN VARCHAR2
4451 IS
4452
4453 CURSOR l_get_org_csr (p_organization_id NUMBER )
4454 IS
4455 SELECT 1
4456 FROM pa_organizations_project_v
4457 WHERE organization_id = p_organization_id
4458 AND active_flag = 'Y'
4459 AND TRUNC(SYSDATE) BETWEEN
4460 TRUNC(date_from) AND NVL(date_to, TRUNC(SYSDATE));
4461
4462
4463 l_dummy NUMBER;
4464
4465 BEGIN
4466
4467 OPEN l_get_org_csr(p_org_id);
4468 FETCH l_get_org_csr INTO l_dummy;
4469 IF l_get_org_csr%NOTFOUND
4470 THEN
4471 CLOSE l_get_org_csr;
4472 RETURN 'N';
4473 ELSE
4474 CLOSE l_get_org_csr;
4475 RETURN 'Y';
4476 END IF;
4477
4478
4479 EXCEPTION
4480 WHEN OTHERS
4481 THEN
4482 RAISE;
4483
4484 END check_valid_org;
4485
4486
4487 --====================================================================================
4488 --Name: check_valid_project_status
4489 --Type: Function
4490 --Description: This function can be used to check for validity of
4491 -- a project status
4492 --
4493 --Called subprograms: none
4494 --
4495 --
4496 --
4497 --History:
4498 -- 02-DEC-1996 L. de Werker Created
4499 --
4500 FUNCTION check_valid_project_status
4501 ( p_project_status IN VARCHAR2 )
4502 RETURN VARCHAR2
4503 IS
4504
4505 CURSOR l_project_status_csr
4506 IS
4507 SELECT 'x'
4508 FROM pa_project_statuses
4509 WHERE project_status_code = p_project_status
4510 AND trunc(sysdate) BETWEEN start_date_active and
4511 nvl(end_date_active,trunc(sysdate));
4512
4513 l_dummy VARCHAR2(1);
4514
4515 BEGIN
4516
4517 OPEN l_project_status_csr;
4518 FETCH l_project_status_csr INTO l_dummy;
4519 IF l_project_status_csr%FOUND
4520 THEN
4521 CLOSE l_project_status_csr;
4522 RETURN 'Y';
4523 ELSE
4524 CLOSE l_project_status_csr;
4525 RETURN 'N';
4526 END IF;
4527
4528
4529 EXCEPTION
4530 WHEN OTHERS THEN RAISE;
4531
4532 END check_valid_project_status;
4533
4534
4535 --====================================================================================
4536 --Name: check_valid_dist_rule
4537 --
4538 --Type: Function
4539 --Description: This function can be used to check for validity of
4540 -- a distribution rule
4541 --
4542 --Called subprograms: none
4543 --
4544 --
4545 --
4546 --History:
4547 -- Fall-1996 Ramesh K. Created
4548 -- 29-Apr-04 sabansal Bug 3279981. Added p_en_top_task_inv_mth_flag IN parameter
4549 FUNCTION check_valid_dist_rule (p_project_type IN VARCHAR2,
4550 p_dist_rule IN VARCHAR2,
4551 p_en_top_task_inv_mth_flag IN VARCHAR2 := 'N' ) RETURN VARCHAR2
4552 IS
4553 CURSOR l_get_dist_rule_csr (l_project_type VARCHAR2,l_dist_rule VARCHAR2)
4554 IS
4555 SELECT 'x' FROM
4556 pa_project_type_distributions d
4557 WHERE d.project_type = l_project_type
4558 AND d.distribution_rule = l_dist_rule;
4559
4560 --bug 3279981 Invoice Method cannot be cost if invoice method at top task is checked
4561 CURSOR cur_get_valid_rules IS
4562 SELECT 'x'
4563 FROM PA_PROJECT_TYPE_DISTRIBUTIONS ppd
4564 WHERE ppd.project_type = p_project_type
4565 AND ppd.distribution_rule = p_dist_rule
4566 AND substr(ppd.Distribution_Rule, instr(ppd.Distribution_Rule,'/')+1) <> 'COST';
4567
4568 l_temp VARCHAR2(30);
4569 BEGIN
4570 --Foll condition added for 3279981
4571 IF 'Y' = p_en_top_task_inv_mth_flag THEN
4572 OPEN cur_get_valid_rules;
4573 FETCH cur_get_valid_rules INTO l_temp;
4574 IF cur_get_valid_rules%NOTFOUND THEN
4575 CLOSE cur_get_valid_rules;
4576 RETURN 'N';
4577 ELSE
4578 CLOSE cur_get_valid_rules;
4579 RETURN 'Y';
4580 END IF;
4581 ELSE
4582 OPEN l_get_dist_rule_csr (p_project_type,p_dist_rule);
4583 FETCH l_get_dist_rule_csr INTO l_temp;
4584 IF l_get_dist_rule_csr%NOTFOUND THEN
4585 CLOSE l_get_dist_rule_csr;
4586 RETURN 'N';
4587 ELSE
4588 CLOSE l_get_dist_rule_csr;
4589 RETURN 'Y';
4590 END IF;
4591 END IF;
4592 EXCEPTION
4593 WHEN OTHERS THEN
4594 RAISE;
4595 END check_valid_dist_rule;
4596
4597 --====================================================================================
4598 --Name: check_valid_employee
4599 --
4600 --Type: Function
4601 --Description: This function can be used to check for validity of
4602 -- an employee
4603 --
4604 --Called subprograms: none
4605 --
4606 --
4607 --
4608 --History:
4609 -- automn-1996 Ramesh K. Created
4610 --
4611 FUNCTION check_valid_employee (p_person_id IN NUMBER ) RETURN VARCHAR2
4612 IS
4613 CURSOR l_get_employees_csr (l_person_id NUMBER)
4614 IS
4615 SELECT 'x' FROM
4616 pa_employees
4617 WHERE person_id = l_person_id;
4618
4619 l_temp VARCHAR2(1);
4620 BEGIN
4621 OPEN l_get_employees_csr (p_person_id);
4622 FETCH l_get_employees_csr INTO l_temp;
4623
4624 IF l_get_employees_csr%NOTFOUND
4625 THEN
4626 CLOSE l_get_employees_csr;
4627 RETURN 'N';
4628 ELSE
4629 CLOSE l_get_employees_csr;
4630 RETURN 'Y';
4631 END IF;
4632
4633 EXCEPTION
4634 WHEN OTHERS THEN
4635 RAISE;
4636
4637 END check_valid_employee;
4638
4639 --====================================================================================
4640 --Name: check_class_code_valid
4641 --
4642 --Type: Function
4643 --Description: This function can be used to check for validity of
4644 -- a class code
4645 --
4646 --Called subprograms: none
4647 --
4648 --
4649 --
4650 --History:
4651 -- automn-1996 Ramesh K. Created
4652 --
4653 FUNCTION check_class_code_valid (p_class_category IN VARCHAR2,
4654 p_class_code IN VARCHAR2 )
4655 RETURN VARCHAR2
4656 IS
4657
4658 CURSOR l_get_class_codes_csr (l_class_category IN VARCHAR2,
4659 l_class_code IN VARCHAR2 )
4660 IS
4661 SELECT 'x'
4662 FROM pa_class_codes
4663 WHERE class_category = l_class_category
4664 AND class_code = l_class_code ;
4665
4666 l_temp VARCHAR2(1);
4667 BEGIN
4668 OPEN l_get_class_codes_csr (p_class_category,p_class_code);
4669 FETCH l_get_class_codes_csr INTO l_temp;
4670
4671 IF l_get_class_codes_csr%NOTFOUND
4672 THEN
4673 CLOSE l_get_class_codes_csr;
4674 RETURN 'N';
4675 ELSE
4676 CLOSE l_get_class_codes_csr;
4677 RETURN 'Y';
4678 END IF;
4679
4680 EXCEPTION
4681 WHEN OTHERS THEN
4682 RAISE;
4683 END check_class_code_valid;
4684
4685 --====================================================================================
4686 --Name: Delete_One_Task
4687 --
4688 --Type: Procedure
4689 --Description: This procedure can be used to delete 1 task, and move all it's
4690 -- children to belang to it's parent
4691 --
4692 --Called subprograms: none
4693 --
4694 --
4695 --
4696 --History:
4697 -- automn-1996 Ramesh K. Created
4698 -- 08-DEC-1996 L. de Werker Fixed some errors
4699 -- 11-DEC-1996 L. de Werker Changed, only top tasks without any children can be single deleted
4700 -- (not cascade deleted)
4701 -- 13-Dec-2005 Sunkalya Bug#4878754. Modified the where condition for Improving Performance under Sql Repository work.Change Tagged.
4702 --
4703 PROCEDURE Delete_One_Task
4704 (p_task_id IN NUMBER,
4705 p_return_status OUT NOCOPY VARCHAR2, -- 4537865
4706 p_msg_count OUT NOCOPY NUMBER, -- 4537865
4707 p_msg_data OUT NOCOPY VARCHAR2 ) IS -- 4537865
4708
4709 CURSOR l_get_task_det_csr IS
4710 SELECT project_id,
4711 task_id,
4712 parent_task_id,
4713 top_task_id,
4714 TASK_NAME,
4715 PM_TASK_REFERENCE
4716 FROM
4717 pa_tasks
4718 WHERE task_id = p_task_id;
4719
4720 CURSOR l_get_lower_task_det_csr (l_project_id IN NUMBER,
4721 l_task_id IN NUMBER )
4722 IS
4723 SELECT task_id
4724 FROM pa_tasks
4725 WHERE project_id = l_project_id
4726 AND parent_task_id = l_task_id;
4727
4728 l_task_rec l_get_task_det_csr%ROWTYPE;
4729 l_parent_task_rec l_get_lower_task_det_csr%ROWTYPE;
4730
4731 l_api_name CONSTANT VARCHAR2(30) := 'Delete_One_Task';
4732 l_amg_segment1 VARCHAR2(25);
4733 l_amg_task_number VARCHAR2(50);
4734
4735 -- 4537865 Start
4736 l_data VARCHAR2(2000);
4737 l_msg_data VARCHAR2(2000);
4738 l_msg_index_out NUMBER;
4739
4740 -- 4537865 End
4741
4742 --needed to get the field values associated to a AMG message
4743
4744 CURSOR l_amg_project_csr
4745 (p_pa_project_id pa_projects.project_id%type)
4746 IS
4747 SELECT segment1
4748 FROM pa_projects p
4749 WHERE p.project_id = p_pa_project_id;
4750
4751 CURSOR l_amg_task_csr
4752 (p_pa_task_id pa_tasks.task_id%type)
4753 IS
4754 SELECT task_number
4755 FROM pa_tasks p
4756 WHERE p.task_id = p_pa_task_id;
4757
4758 BEGIN
4759
4760 SAVEPOINT delete_one_task;
4761
4762 OPEN l_get_task_det_csr;
4763 FETCH l_get_task_det_csr INTO l_task_rec;
4764 CLOSE l_get_task_det_csr;
4765
4766 -- Get segment1 for AMG messages
4767
4768 OPEN l_amg_project_csr( l_task_rec.project_id );
4769 FETCH l_amg_project_csr INTO l_amg_segment1;
4770 CLOSE l_amg_project_csr;
4771 /*
4772 OPEN l_amg_task_csr( l_task_rec.task_id );
4773 FETCH l_amg_task_csr INTO l_amg_task_number;
4774 CLOSE l_amg_task_csr;
4775 */
4776 l_amg_task_number := pa_interface_utils_pub.get_task_number_amg
4777 (p_task_number=> l_task_rec.task_name
4778 ,p_task_reference => l_task_rec.pm_task_reference
4779 ,p_task_id => l_task_rec.task_id);
4780
4781 IF l_task_rec.task_id = l_task_rec.top_task_id
4782 THEN
4783
4784 -- A top task is getting deleted
4785 OPEN l_get_lower_task_det_csr(l_task_rec.project_id,
4786 l_task_rec.task_id );
4787 FETCH l_get_lower_task_det_csr INTO l_parent_task_rec;
4788
4789 IF l_get_lower_task_det_csr%FOUND
4790 THEN
4791 CLOSE l_get_lower_task_det_csr;
4792
4793 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
4794 THEN
4795 pa_interface_utils_pub.map_new_amg_msg
4796 ( p_old_message_code => 'PA_TOP_TASK_CHILD_NO_DELETE'
4797 ,p_msg_attribute => 'CHANGE'
4798 ,p_resize_flag => 'Y'
4799 ,p_msg_context => 'TASK'
4800 ,p_attribute1 => l_amg_segment1
4801 ,p_attribute2 => l_amg_task_number
4802 ,p_attribute3 => ''
4803 ,p_attribute4 => ''
4804 ,p_attribute5 => '');
4805 END IF;
4806 RAISE FND_API.G_EXC_ERROR;
4807 END IF;
4808
4809 CLOSE l_get_lower_task_det_csr;
4810
4811 ELSE -- if this is not a top task check whether this
4812 -- is a parent task
4813 OPEN l_get_lower_task_det_csr(l_task_rec.project_id,
4814 l_task_rec.task_id );
4815 FETCH l_get_lower_task_det_csr INTO l_parent_task_rec;
4816
4817 IF l_get_lower_task_det_csr%FOUND
4818 THEN -- This task is a parent
4819 -- hence update all first line children as follows
4820 -- parent task id = the parent task id of the task that is
4821 -- being deleted
4822
4823 UPDATE pa_tasks
4824 SET parent_task_id = l_task_rec.parent_task_id,
4825 wbs_level = Decode(wbs_level,1,1,wbs_level-1)
4826 WHERE project_id = l_task_rec.project_id
4827 AND parent_task_id = l_task_rec.task_id;
4828 CLOSE l_get_lower_task_det_csr;
4829 ELSE
4830 CLOSE l_get_lower_task_det_csr;
4831 END IF;
4832 END IF ;
4833
4834 DELETE FROM pa_transaction_controls WHERE task_id = p_task_id;
4835
4836 --Modified the where condition for Improving Performance under Sql Repository work.Bug#4878754.
4837 DELETE FROM pa_billing_assignments WHERE
4838 top_task_id = p_task_id
4839 AND project_id = l_task_rec.project_id;
4840
4841 DELETE FROM pa_labor_multipliers WHERE task_id = p_task_id;
4842
4843 DELETE FROM pa_job_bill_rate_overrides WHERE task_id = p_task_id;
4844
4845 DELETE FROM pa_job_bill_title_overrides WHERE task_id = p_task_id;
4846
4847 DELETE FROM pa_job_assignment_overrides WHERE task_id = p_task_id;
4848
4849 DELETE FROM pa_emp_bill_rate_overrides WHERE task_id = p_task_id;
4850
4851 DELETE FROM pa_nl_bill_rate_overrides WHERE task_id = p_task_id;
4852
4853 DELETE FROM pa_compiled_multipliers
4854 WHERE ind_compiled_set_id IN
4855 (SELECT ics.ind_compiled_set_id
4856 FROM pa_ind_compiled_sets ics,
4857 pa_ind_rate_sch_revisions rev,
4858 pa_ind_rate_schedules sch
4859 WHERE ics.ind_rate_sch_revision_id =
4860 rev.ind_rate_sch_revision_id
4861 AND rev.ind_rate_sch_id = sch.ind_rate_sch_id
4862 AND sch.task_id = p_task_id);
4863
4864 DELETE FROM pa_ind_compiled_sets
4865 WHERE ind_rate_sch_revision_id IN
4866 (SELECT rev.ind_rate_sch_revision_id
4867 FROM pa_ind_rate_sch_revisions rev,
4868 pa_ind_rate_schedules sch
4869 WHERE rev.ind_rate_sch_id = sch.ind_rate_sch_id
4870 AND sch.task_id = p_task_id );
4871
4872 DELETE FROM pa_ind_rate_sch_revisions
4873 WHERE ind_rate_sch_id IN
4874 (SELECT ind_rate_sch_id
4875 FROM pa_ind_rate_schedules
4876 WHERE task_id = p_task_id );
4877
4878 DELETE FROM pa_ind_rate_schedules WHERE task_id = p_task_id;
4879
4880 DELETE FROM pa_project_asset_assignments WHERE task_id = p_task_id;
4881
4882 DELETE FROM pa_percent_completes WHERE task_id = p_task_id;
4883
4884 DELETE FROM pa_tasks WHERE task_id = p_task_id;
4885
4886 p_return_status := FND_API.G_RET_STS_SUCCESS;
4887
4888 EXCEPTION
4889
4890 WHEN FND_API.G_EXC_ERROR
4891 THEN
4892 p_return_status := FND_API.G_RET_STS_ERROR;
4893 p_msg_count := Fnd_Msg_Pub.count_msg; -- 4537865
4894
4895 IF p_msg_count = 1 AND p_msg_data IS NULL
4896 THEN
4897 Pa_Interface_Utils_Pub.get_messages
4898 ( p_encoded => Fnd_Api.G_TRUE
4899 , p_msg_index => 1
4900 , p_msg_count => p_msg_count
4901 , p_msg_data => l_msg_data
4902 , p_data => l_data
4903 , p_msg_index_out => l_msg_index_out);
4904 p_msg_data := l_data;
4905 END IF;
4906
4907 ROLLBACK TO delete_one_task;
4908
4909 WHEN OTHERS
4910 THEN
4911 p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4912
4913 -- 4537865
4914 p_msg_count := 1;
4915 p_msg_data := SQLERRM;
4916
4917 ROLLBACK TO delete_one_task;
4918
4919 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
4920 THEN
4921 FND_MSG_PUB.add_exc_msg
4922 ( p_pkg_name => G_PKG_NAME
4923 , p_procedure_name => l_api_name
4924 , p_error_text => p_msg_data
4925 );
4926
4927 END IF;
4928
4929 END Delete_One_Task;
4930
4931
4932 --====================================================================================
4933 --Name: Validate_billing_info
4934 --
4935 --Type: Procedure
4936 --Description: This procedure can be used to validate billing information
4937 -- for contract type projects
4938 --
4939 --
4940 --Called subprograms: none
4941 --
4942 --
4943 --
4944 --History:
4945 -- automn-1996 Ramesh K. Created
4946 --
4947 PROCEDURE Validate_billing_info
4948 (p_project_id IN NUMBER, -- Added for Bug 5643876
4949 p_project_class_code IN VARCHAR2,
4950 p_in_task_rec IN pa_project_pub.task_in_rec_type,
4951 p_return_status OUT NOCOPY VARCHAR2 ) IS -- 4537865 Added nocopy
4952
4953 BEGIN
4954
4955 pa_project_check_pvt.Validate_billing_info_pvt
4956 (p_project_id => p_project_id -- Added for Bug 5643876
4957 ,p_project_class_code => p_project_class_code
4958 ,p_in_task_rec => p_in_task_rec
4959 ,p_return_status => p_return_status);
4960
4961 -- 4537865
4962 EXCEPTION
4963 WHEN OTHERS THEN
4964 p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4965
4966 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
4967 THEN
4968 FND_MSG_PUB.add_exc_msg
4969 ( p_pkg_name => G_PKG_NAME
4970 , p_procedure_name => 'Validate_billing_info'
4971 , p_error_text => SUBSTRB(SQLERRM,1,240));
4972
4973 END IF;
4974 -- Didnt include RAISE because pa_project_check_pvt.Validate_billing_info_pvt also doesnt RAISE
4975 END Validate_billing_info;
4976
4977 --====================================================================================
4978 --Name: check_start_end_date
4979 --Type: Procedure
4980 --Description: This procedure can be used to pass old and new start_dates
4981 -- and old and new end_dates, from the PUBLIC API's. This procedure
4982 -- will check whether the new situation is going to be valid, and returns
4983 -- flags indicating whether start_date or end_date needs updating.
4984 --
4985 --
4986 --Called subprograms: none
4987 --
4988 --
4989 --
4990 --History:
4991 -- 03-DEC-1996 L. de Werker Created
4992 --
4993 PROCEDURE check_start_end_date
4994 ( p_return_status OUT NOCOPY VARCHAR2 -- 4537865 Added nocopy
4995 ,p_old_start_date IN DATE
4996 ,p_new_start_date IN DATE
4997 ,p_old_end_date IN DATE
4998 ,p_new_end_date IN DATE
4999 ,p_update_start_date_flag OUT NOCOPY VARCHAR2 -- 4537865 Added nocopy
5000 ,p_update_end_date_flag OUT NOCOPY VARCHAR2 ) -- 4537865 Added nocopy
5001 IS
5002
5003 l_api_name CONSTANT VARCHAR2(30) := 'check_start_end_date';
5004
5005 l_start_date DATE;
5006 l_end_date DATE;
5007
5008 BEGIN
5009
5010 pa_project_check_pvt.check_start_end_date_pvt
5011 (p_return_status => p_return_status
5012 ,p_old_start_date => p_old_start_date
5013 ,p_new_start_date => p_new_start_date
5014 ,p_old_end_date => p_old_end_date
5015 ,p_new_end_date => p_new_end_date
5016 ,p_update_start_date_flag => p_update_start_date_flag
5017 ,p_update_end_date_flag => p_update_end_date_flag);
5018 -- 4537865
5019 EXCEPTION
5020 WHEN OTHERS THEN
5021
5022 p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5023 p_update_end_date_flag := NULL ;
5024 p_update_start_date_flag := NULL ;
5025
5026 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
5027 THEN
5028 FND_MSG_PUB.add_exc_msg
5029 ( p_pkg_name => G_PKG_NAME
5030 , p_procedure_name => l_api_name
5031 , p_error_text => SUBSTRB(SQLERRM,1,240)
5032 );
5033
5034 END IF;
5035 -- Didnt include RAISE because pa_project_check_pvt.check_start_end_date_pvt also doesnt RAISE
5036 END check_start_end_date;
5037
5038 --------------------------------------------------------------------------------
5039 --Name: check_for_one_manager
5040 --Type: Procedure
5041 --Description: See below.
5042 --
5043 --Called subprograms:
5044 --
5045 --
5046 --
5047 --History:
5048 -- 31-JUL-1996 R. Krishnamurthy Created
5049 -- 03-DEC-1996 L. de Werker Moved from pa_project_pub to pa_project_pvt
5050 --
5051 PROCEDURE check_for_one_manager
5052 (p_project_id IN NUMBER
5053 ,p_person_id IN NUMBER
5054 ,p_key_members IN pa_project_pub.project_role_tbl_type
5055 ,p_start_date IN DATE
5056 ,p_end_date IN DATE
5057 ,p_return_status OUT NOCOPY VARCHAR2 ) -- 4537865 Added nocopy hint
5058 IS
5059
5060 BEGIN
5061 /*
5062 If a project manager is sought to be created, then check whether
5063 there is already a project manager for the project. If so, check
5064 whether this is the same person. If not,then check the start and
5065 end dates for the existing manager. If dates overlap,then
5066 check the input table to see whether the existing project manager
5067 is being de-activated. If so,go ahead and create a new project manager and
5068 update the end date of the existing manager with the date provided
5069 Else update the end date of the existing manager to either
5070 (a) new manager's start date -1 or (b) sysdate -1
5071 (being done in check_for_one_manager);
5072 */
5073
5074 pa_project_check_pvt.check_for_one_manager_pvt
5075 (p_project_id => p_project_id
5076 ,p_person_id => p_person_id
5077 ,p_key_members => p_key_members
5078 ,p_start_date => p_start_date
5079 ,p_end_date => p_end_date
5080 ,p_return_status => p_return_status);
5081 -- 4537865
5082 EXCEPTION
5083 WHEN OTHERS THEN
5084
5085 p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5086
5087 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
5088 THEN
5089 FND_MSG_PUB.add_exc_msg
5090 ( p_pkg_name => G_PKG_NAME
5091 , p_procedure_name => 'check_for_one_manager'
5092 , p_error_text => SUBSTRB(SQLERRM,1,240)
5093 );
5094
5095 END IF;
5096 -- Didnt include RAISE because pa_project_check_pvt.check_for_one_manager_pvt also doesnt RAISE
5097 END check_for_one_manager;
5098
5099 Procedure handle_task_number_change
5100 (p_project_id IN NUMBER,
5101 p_task_id IN NUMBER,
5102 p_array_cell_number IN NUMBER,
5103 p_in_task_number IN VARCHAR2,
5104 p_in_task_tbl IN pa_project_pub.task_in_tbl_type,
5105 p_proceed_with_update_flag OUT NOCOPY VARCHAR2, -- 4537865
5106 p_return_status OUT NOCOPY VARCHAR2 ) -- 4537865
5107 IS
5108
5109 BEGIN
5110
5111 pa_project_check_pvt.handle_task_number_change_pvt
5112 (p_project_id => p_project_id
5113 ,p_task_id => p_task_id
5114 ,p_array_cell_number => p_array_cell_number
5115 ,p_in_task_number => p_in_task_number
5116 ,p_in_task_tbl => p_in_task_tbl
5117 ,p_proceed_with_update_flag => p_proceed_with_update_flag
5118 ,p_return_status => p_return_status);
5119 -- 4537865
5120 EXCEPTION
5121 WHEN OTHERS THEN
5122
5123 p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5124 p_proceed_with_update_flag := NULL ;
5125
5126 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
5127 THEN
5128 FND_MSG_PUB.add_exc_msg
5129 ( p_pkg_name => G_PKG_NAME
5130 , p_procedure_name => 'handle_task_number_change'
5131 , p_error_text => SUBSTRB(SQLERRM,1,240)
5132 );
5133
5134 END IF;
5135 -- Didnt include RAISE because pa_project_check_pvt.handle_task_number_change_pvt also doesnt RAISE
5136 END handle_task_number_change;
5137
5138 Procedure check_parent_child_task_dates
5139 (p_project_id IN NUMBER,
5140 p_return_status OUT NOCOPY VARCHAR2 ) -- 4537865
5141 IS
5142
5143 BEGIN
5144
5145 pa_project_check_pvt.check_parent_child_tk_dts_Pvt
5146 (p_project_id => p_project_id
5147 ,p_return_status => p_return_status);
5148 -- 4537865
5149 EXCEPTION
5150 WHEN OTHERS THEN
5151
5152 p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5153
5154 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
5155 THEN
5156 FND_MSG_PUB.add_exc_msg
5157 ( p_pkg_name => G_PKG_NAME
5158 , p_procedure_name => 'check_parent_child_task_dates'
5159 , p_error_text => SUBSTRB(SQLERRM,1,240)
5160 );
5161
5162 END IF;
5163 -- Didnt include RAISE because pa_project_check_pvt.check_parent_child_task_dates also doesnt RAISE
5164 END check_parent_child_task_dates;
5165
5166 Procedure Update_One_Task
5167 ( p_api_version_number IN NUMBER :=PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM,
5168 p_commit IN VARCHAR2 := FND_API.G_FALSE,
5169 p_init_msg_list IN VARCHAR2 := FND_API.G_FALSE,
5170 p_msg_count OUT NOCOPY NUMBER, -- 4537865
5171 p_msg_data OUT NOCOPY VARCHAR2, -- 4537865
5172 p_return_status OUT NOCOPY VARCHAR2, -- 4537865
5173 p_pm_product_code IN VARCHAR2 := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR,
5174 p_pm_project_reference IN VARCHAR2 := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR,
5175 p_pa_project_id IN NUMBER := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM,
5176 p_pm_task_reference IN VARCHAR2 := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR,
5177 p_task_number IN VARCHAR2 := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR,
5178 p_pa_task_id IN NUMBER := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM,
5179 p_task_name IN VARCHAR2 := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR,
5180 p_long_task_name IN VARCHAR2 := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR,
5181 p_task_description IN VARCHAR2 := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR,
5182 p_task_start_date IN DATE := PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE,
5183 p_task_completion_date IN DATE := PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE,
5184 p_pm_parent_task_reference IN VARCHAR2 := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR,
5185 p_pa_parent_task_id IN NUMBER := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM,
5186 p_address_id IN NUMBER := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM,
5187 p_carrying_out_organization_id IN NUMBER := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM,
5188 p_service_type_code IN VARCHAR2 := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR,
5189 p_task_manager_person_id IN NUMBER := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM,
5190 p_billable_flag IN VARCHAR2 := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR,
5191 p_chargeable_flag IN VARCHAR2 := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR,
5192 p_ready_to_bill_flag IN VARCHAR2 := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR,
5193 p_ready_to_distribute_flag IN VARCHAR2 := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR,
5194 p_limit_to_txn_controls_flag IN VARCHAR2 := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR,
5195 p_labor_bill_rate_org_id IN NUMBER := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM,
5196 p_labor_std_bill_rate_schdl IN VARCHAR2 := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR,
5197 p_labor_schedule_fixed_date IN DATE := PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE,
5198 p_labor_schedule_discount IN NUMBER := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM,
5199 p_nl_bill_rate_org_id IN NUMBER := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM,
5200 p_nl_std_bill_rate_schdl IN VARCHAR2 := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR,
5201 p_nl_schedule_fixed_date IN DATE := PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE,
5202 p_nl_schedule_discount IN NUMBER := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM,
5203 p_labor_cost_multiplier_name IN VARCHAR2 := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR,
5204 p_cost_ind_rate_sch_id IN NUMBER := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM,
5205 p_rev_ind_rate_sch_id IN NUMBER := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM,
5206 p_inv_ind_rate_sch_id IN NUMBER := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM,
5207 p_cost_ind_sch_fixed_date IN DATE := PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE,
5208 p_rev_ind_sch_fixed_date IN DATE := PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE,
5209 p_inv_ind_sch_fixed_date IN DATE := PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE,
5210 p_labor_sch_type IN VARCHAR2 := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR,
5211 p_nl_sch_type IN VARCHAR2 := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR,
5212 p_actual_start_date IN DATE := PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE,
5213 p_actual_finish_date IN DATE := PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE,
5214 p_early_start_date IN DATE := PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE,
5215 p_early_finish_date IN DATE := PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE,
5216 p_late_start_date IN DATE := PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE,
5217 p_late_finish_date IN DATE := PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE,
5218 p_scheduled_start_date IN DATE := PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE,
5219 p_scheduled_finish_date IN DATE := PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE,
5220 p_tasks_dff IN VARCHAR2 := 'N', -- bug 13680655
5221 p_attribute_category IN VARCHAR2 := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR,
5222 p_attribute1 IN VARCHAR2 := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR,
5223 p_attribute2 IN VARCHAR2 := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR,
5224 p_attribute3 IN VARCHAR2 := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR,
5225 p_attribute4 IN VARCHAR2 := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR,
5226 p_attribute5 IN VARCHAR2 := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR,
5227 p_attribute6 IN VARCHAR2 := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR,
5228 p_attribute7 IN VARCHAR2 := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR,
5229 p_attribute8 IN VARCHAR2 := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR,
5230 p_attribute9 IN VARCHAR2 := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR,
5231 p_attribute10 IN VARCHAR2 := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR,
5232 p_allow_cross_charge_flag IN VARCHAR2 :=
5233 PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR,
5234 p_project_rate_date IN DATE := PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE,
5235 p_project_rate_type IN VARCHAR2 := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR,
5236 p_cc_process_labor_flag IN VARCHAR2 := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR,
5237 p_labor_tp_schedule_id IN NUMBER := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM,
5238 p_labor_tp_fixed_date IN DATE := PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE,
5239 p_cc_process_nl_flag IN VARCHAR2 := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR,
5240 p_nl_tp_schedule_id IN NUMBER := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM,
5241 p_nl_tp_fixed_date IN DATE := PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE,
5242 p_receive_project_invoice_flag IN VARCHAR2 := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR,
5243 p_work_type_id IN NUMBER := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM,
5244 p_emp_bill_rate_schedule_id IN NUMBER := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM,
5245 p_job_bill_rate_schedule_id IN NUMBER := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM,
5246 --Sakthi MCB
5247 p_non_lab_std_bill_rt_sch_id IN NUMBER := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM,
5248 p_taskfunc_cost_rate_type IN VARCHAR2 := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR,
5249 p_taskfunc_cost_rate_date IN DATE := PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE,
5250 --Sakthi MCB
5251 p_labor_disc_reason_code IN VARCHAR2 := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR,
5252 p_non_labor_disc_reason_code IN VARCHAR2 := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR,
5253 --PA L changes -- bug 2872708 --update_task
5254 p_retirement_cost_flag VARCHAR2 := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR,
5255 p_cint_eligible_flag VARCHAR2 := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR,
5256 p_cint_stop_date DATE := PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE,
5257 --end PA L changes -- bug 2872708
5258
5259 --(Begin Venkat) FP_M changes ----------------------------------------------
5260 p_invoice_method IN VARCHAR2 := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR,
5261 p_customer_id IN NUMBER := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM,
5262 p_gen_etc_source_code IN VARCHAR2 := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR,
5263 --(End Venkat) FP_M changes ------------------------------------------------
5264
5265 p_out_pa_task_id OUT NOCOPY NUMBER, -- 4537865
5266 p_out_pm_task_reference OUT NOCOPY VARCHAR2 ) -- 4537865
5267
5268 IS
5269 CURSOR l_get_project_info_csr (l_project_id IN NUMBER)
5270 IS
5271 SELECT project_type,pm_project_reference
5272 FROM pa_projects
5273 WHERE project_id = l_project_id;
5274
5275 /* Added for bug#2666913 to get the project type*/
5276 CURSOR l_get_project_type_info_csr (l_project_id IN NUMBER)
5277 IS
5278 SELECT project_type_class_code
5279 FROM pa_project_types pt, pa_projects p
5280 WHERE p.project_id = l_project_id
5281 and p.project_type = pt.project_type;
5282
5283
5284 CURSOR l_service_type_csr( p_service_type_code VARCHAR2 )
5285 IS
5286 SELECT 'x'
5287 FROM pa_lookups
5288 WHERE lookup_type = 'SERVICE TYPE'
5289 AND lookup_code = p_service_type_code;
5290
5291 CURSOR l_task_rec_csr (l_project_id NUMBER ,l_task_id NUMBER)
5292 IS
5293 SELECT *
5294 FROM pa_tasks
5295 WHERE project_id = l_project_id
5296 AND task_id = l_task_id;
5297
5298 CURSOR l_check_child_exists_csr (l_project_id NUMBER,l_task_id NUMBER )
5299 IS
5300 SELECT 'x' FROM
5301 PA_TASKS
5302 WHERE project_id = l_project_id
5303 AND parent_task_id = l_task_id;
5304
5305 CURSOR l_outer_child_dates_csr (l_project_id NUMBER,l_task_id NUMBER)
5306 IS
5307 SELECT MIN(TRUNC(start_date))
5308 , MAX(TRUNC(completion_date)) -- Bug Fix 4705139
5309 FROM pa_tasks
5310 WHERE project_id = l_project_id
5311 AND parent_task_id = l_task_id;
5312
5313 CURSOR l_outer_parent_dates_csr (l_project_id NUMBER,l_task_id NUMBER)
5314 IS
5315 SELECT MIN(TRUNC(start_date))
5316 , MAX(TRUNC(completion_date)) -- Bug Fix 4705139
5317 FROM pa_tasks
5318 WHERE project_id = l_project_id
5319 AND task_id = l_task_id;
5320
5321 CURSOR l_project_date_csr (l_project_id NUMBER )
5322 IS
5323 SELECT trunc(start_date) start_date,trunc(completion_date) completion_date -- Bug Fix 4705139
5324 FROM pa_projects
5325 WHERE project_id = l_project_id;
5326
5327 CURSOR l_top_task_csr (p_task_id NUMBER)
5328 IS
5329 SELECT top_task_id
5330 FROM pa_tasks
5331 WHERE task_id = p_task_id;
5332
5333 --needed to convert pm_parent_task_reference to parent_task_id
5334 --convert_pm_taskref_to_id can not be used because parent_id can be NULL
5335
5336 CURSOR l_convert_pm_parent_to_id_csr( p_project_id NUMBER, p_pm_task_reference VARCHAR2 )
5337 IS
5338 SELECT task_id
5339 FROM pa_tasks
5340 WHERE pm_task_reference = p_pm_task_reference
5341 AND project_id = p_project_id;
5342
5343 CURSOR l_parent_wbs_csr ( p_project_id NUMBER, p_pa_task_id NUMBER )
5344 IS
5345 SELECT wbs_level
5346 FROM pa_tasks
5347 WHERE task_id = p_pa_task_id
5348 AND project_id = p_project_id;
5349
5350 CURSOR l_validate_parent_id_csr( p_project_id NUMBER, p_task_id NUMBER)
5351 IS
5352 SELECT 'x'
5353 FROM pa_tasks
5354 WHERE task_id = p_task_id
5355 AND project_id = p_project_id;
5356
5357 CURSOR l_lock_rows_csr( p_task_id NUMBER)
5358 IS
5359 SELECT 'x'
5360 FROM pa_tasks
5361 WHERE task_id = p_task_id
5362 FOR UPDATE NOWAIT;
5363
5364 -- Used when parent_id is changed, and the task (and it's children) is on a different wbs level
5365
5366 CURSOR l_wbs_level_csr( p_task_id NUMBER)
5367 IS
5368 SELECT task_id
5369 FROM pa_tasks
5370 START WITH task_id=p_task_id
5371 CONNECT BY PRIOR task_id=parent_task_id
5372 FOR UPDATE NOWAIT;
5373
5374 -- *O
5375 -- Used to check if task is being moved to a lower level within it's own hierarchy.
5376
5377 CURSOR l_chk_chlds_parent_id_csr( p_task_id NUMBER, p_new_parent_task_id NUMBER)
5378 IS
5379 SELECT 'x'
5380 FROM pa_tasks
5381 WHERE task_id=p_new_parent_task_id
5382 START WITH task_id=p_task_id
5383 CONNECT BY PRIOR task_id=parent_task_id
5384 FOR UPDATE NOWAIT;
5385
5386 --needed for update of address_id
5387
5388 CURSOR l_customer_csr( p_project_id NUMBER )
5389 IS
5390 SELECT customer_id
5391 FROM pa_project_customers
5392 WHERE project_id = p_project_id;
5393
5394 -- 4363092 TCA changes, replaced RA views with HZ tables
5395 /*
5396 CURSOR l_address_csr(p_customer_id NUMBER, p_address_id NUMBER )
5397 IS
5398 SELECT 'x'
5399 FROM ra_addresses
5400 WHERE customer_id = p_customer_id
5401 AND address_id = p_address_id;
5402 */
5403
5404 CURSOR l_address_csr(p_customer_id NUMBER, p_address_id NUMBER )
5405 IS
5406 SELECT 'x'
5407 FROM
5408 hz_cust_acct_sites_all acct_site
5409 WHERE
5410 acct_site.cust_account_id = p_customer_id
5411 AND acct_site.cust_acct_site_id = p_address_id;
5412
5413 -- 4363092 end
5414
5415 l_min_child_start_date DATE;
5416 l_max_child_completion_date DATE;
5417 l_min_parent_start_date DATE;
5418 l_max_parent_completion_date DATE;
5419
5420 l_amg_segment1 VARCHAR2(25);
5421 l_amg_task_number VARCHAR2(50);
5422
5423 --needed to get the field values associated to a AMG message
5424
5425 CURSOR l_amg_project_csr
5426 (p_pa_project_id pa_projects.project_id%type)
5427 IS
5428 SELECT segment1
5429 FROM pa_projects p
5430 WHERE p.project_id = p_pa_project_id;
5431
5432 CURSOR l_amg_task_csr
5433 (p_pa_task_id pa_tasks.task_id%type)
5434 IS
5435 SELECT task_number
5436 FROM pa_tasks p
5437 WHERE p.task_id = p_pa_task_id;
5438
5439 -- Fix for Bug # 1335417
5440 -- needed for update of Fixed Date( p_cost_ind_sch_fixed_date)
5441
5442 CURSOR l_ind_rate_schedule_type_csr( p_cost_ind_rate_sch_id NUMBER)
5443 IS
5444 SELECT ind_rate_schedule_type
5445 FROM pa_ind_rate_schedules
5446 WHERE ind_rate_sch_id = p_cost_ind_rate_sch_id;
5447
5448 -- Fix for Bug # 1335417
5449 l_temp_var_sch_type VARCHAR2(1);
5450
5451 -- Fix for Bug # 1272548
5452
5453 -- needed for update of Schedule Id( p_cost_ind_rate_sch_id)
5454
5455 CURSOR l_cost_ind_rate_sch_id_csr( p_cost_ind_rate_sch_id NUMBER)
5456 IS
5457 SELECT 'x'
5458 FROM pa_ind_rate_schedules
5459 WHERE ind_rate_sch_id = p_cost_ind_rate_sch_id;
5460
5461 -- Fix for Bug # 1272548
5462 l_temp_var VARCHAR2(1);
5463
5464 l_project_date_rec l_project_date_csr%ROWTYPE;
5465
5466 l_api_name CONSTANT VARCHAR2(30):= 'update_one_task';
5467
5468 l_return_status VARCHAR2(1);
5469 l_index NUMBER;
5470 l_err_code NUMBER := 0;
5471 l_err_stage VARCHAR2(2000);
5472 l_err_stack VARCHAR2(2000);
5473 l_project_id NUMBER ;
5474 l_cursor INTEGER;
5475 --l_statement VARCHAR2(2000); --bug 2955326
5476 l_statement VARCHAR2(30000); --bug 2955326
5477 l_rows INTEGER;
5478 l_task_rec l_task_rec_csr%ROWTYPE;
5479 l_temp VARCHAR2(1);
5480 l_children_exist VARCHAR2(1) := 'N';
5481 l_new_start_date DATE;
5482 l_temp_parent_task_id NUMBER := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM;
5483 l_new_parent_task_id NUMBER;
5484 l_top_task_id NUMBER;
5485 l_task_id NUMBER;
5486 l_update_yes_flag VARCHAR2(1) := 'N';
5487 l_pm_task_reference VARCHAR2(30);
5488 l_update_start_date_flag VARCHAR2(1);
5489 l_update_end_date_flag VARCHAR2(1);
5490 l_new_parent_wbs_level NUMBER;
5491 l_wbs_change_task_id NUMBER;
5492 l_delta_level NUMBER;
5493 l_customer_id NUMBER;
5494 l_address_valid VARCHAR2(1);
5495 l_msg_count NUMBER ;
5496 l_msg_data VARCHAR2(2000);
5497 l_function_allowed VARCHAR2(1);
5498 l_resp_id NUMBER := 0;
5499 l_user_id NUMBER := 0;
5500 l_module_name VARCHAR2(80);
5501 l_tasks_restructured_flag VARCHAR2(1) := 'N';
5502 l_project_type VARCHAR2(30);
5503 l_project_type_class_code VARCHAR2(30); /* Added for bug#2666913 */
5504 l_pm_project_reference VARCHAR2(30);
5505 l_org_func_security VARCHAR2(1); /*bug#1968394 */
5506 /*Added for bug 2802984 */
5507 l_out_labor_sch_type VARCHAR2(1);
5508 l_out_nl_labor_sch_type VARCHAR2(1);
5509 l_rev_rate_sch_type VARCHAR2(1);
5510 l_inv_rate_sch_type VARCHAR2(1);
5511 l_std_bill_rate_schedule VARCHAR2(30);
5512
5513 -- (Begin Venkat) FP_M changes ------------------------------------------
5514 l_revenue_accrual_method VARCHAR2(30);
5515 l_invoice_method VARCHAR2(30); -- 4177105 this var is unitialized , use p_invoice_method var
5516 l_gen_etc_source_code VARCHAR2(30);
5517 -- (End Venkat) FP_M changes --------------------------------------------
5518
5519 --bug 2955326
5520 l_b_pm_tk_ref_flag VARCHAR2(1) := 'N';
5521 l_b_tk_nm_flag VARCHAR2(1) := 'N';
5522 l_b_ln_tk_nm_flag VARCHAR2(1) := 'N';
5523 l_b_tk_desc_flag VARCHAR2(1) := 'N';
5524 l_b_rdy_to_bill_flag VARCHAR2(1) := 'N';
5525 l_b_rdy_to_dist_flag VARCHAR2(1) := 'N';
5526 l_b_lmt_to_txn_ctrl_fg VARCHAR2(1) := 'N';
5527 l_b_cryng_out_org_id_flag VARCHAR2(1) := 'N';
5528 l_b_chgble_fg VARCHAR2(1) := 'N';
5529 l_b_billable_fg VARCHAR2(1) := 'N';
5530 l_b_srv_tp_cd_fg VARCHAR2(1) := 'N';
5531 l_b_tk_num_fg VARCHAR2(1) := 'N';
5532 l_b_tk_st_dt_flag VARCHAR2(1) := 'N';
5533 l_b_comp_dt_fg VARCHAR2(1) := 'N';
5534 l_b_prt_tk_id_fg VARCHAR2(1) := 'N';
5535 l_b_addr_id_fg VARCHAR2(1) := 'N';
5536 l_b_attr_cat_fg VARCHAR2(1) := 'N';
5537 l_b_attr1_fg VARCHAR2(1) := 'N';
5538 l_b_attr2_fg VARCHAR2(1) := 'N';
5539 l_b_attr3_fg VARCHAR2(1) := 'N';
5540 l_b_attr4_fg VARCHAR2(1) := 'N';
5541 l_b_attr5_fg VARCHAR2(1) := 'N';
5542 l_b_attr6_fg VARCHAR2(1) := 'N';
5543 l_b_attr7_fg VARCHAR2(1) := 'N';
5544 l_b_attr8_fg VARCHAR2(1) := 'N';
5545 l_b_attr9_fg VARCHAR2(1) := 'N';
5546 l_b_attr10_fg VARCHAR2(1) := 'N';
5547 l_b_al_x_chg_fg VARCHAR2(1) := 'N';
5548 l_b_prj_rt_tp_fg VARCHAR2(1) := 'N';
5549 l_b_prj_rt_dt_fg VARCHAR2(1) := 'N';
5550 l_b_cc_proc_lbr_fg VARCHAR2(1) := 'N';
5551 l_b_lbr_tp_sch_id_fg VARCHAR2(1) := 'N';
5552 l_b_lbr_tp_fx_dt_fg VARCHAR2(1) := 'N';
5553 l_b_cc_proc_nl_fg VARCHAR2(1) := 'N';
5554 l_b_nl_tp_sch_id_fg VARCHAR2(1) := 'N';
5555 l_b_nl_tp_fx_dt_fg VARCHAR2(1) := 'N';
5556 l_b_rcv_prj_inv_fg VARCHAR2(1) := 'N';
5557 l_b_wk_tp_id_fg VARCHAR2(1) := 'N';
5558 l_b_emp_bill_rt_sch_id_fg VARCHAR2(1) := 'N';
5559 l_b_jb_bill_rt_sch_id_fg VARCHAR2(1) := 'N';
5560 l_b_nn_lb_std_bl_rt_sch_id_fg VARCHAR2(1) := 'N';
5561 l_b_tkfnc_cst_rt_dt_fg VARCHAR2(1) := 'N';
5562 l_b_tkfnc_cst_rt_tp_fg VARCHAR2(1) := 'N';
5563 l_b_lbr_disc_rsn_cd_fg VARCHAR2(1) := 'N';
5564 l_b_nn_lbr_disc_rsn_cd_fg VARCHAR2(1) := 'N';
5565 l_b_act_st_dt_fg VARCHAR2(1) := 'N';
5566 l_b_act_fn_dt_fg VARCHAR2(1) := 'N';
5567 l_b_erly_st_dt_fg VARCHAR2(1) := 'N';
5568 l_b_erly_fn_dt_fg VARCHAR2(1) := 'N';
5569 l_b_lt_st_dt_fg VARCHAR2(1) := 'N';
5570 l_b_lt_fn_dt_fg VARCHAR2(1) := 'N';
5571 l_b_sch_st_dt_fg VARCHAR2(1) := 'N';
5572 l_b_sch_fn_dt_fg VARCHAR2(1) := 'N';
5573 l_b_cst_ind_rt_sch_id_fg VARCHAR2(1) := 'N';
5574 l_b_cst_ind_sch_fx_dt_fg VARCHAR2(1) := 'N';
5575
5576 l_b_ret_cst_fg VARCHAR2(1) := 'N';
5577 l_b_cint_elg_fg VARCHAR2(1) := 'N';
5578 l_b_cint_stp_dt_fg VARCHAR2(1) := 'N';
5579 l_b_lbr_sch_tp_fg VARCHAR2(1) := 'N';
5580 l_b_n_lbr_sch_tp_fg VARCHAR2(1) := 'N';
5581 l_b_jb_bill_rt_sch_id_fg2 VARCHAR2(1) := 'N';
5582 l_b_emp_bill_rt_sch_id_fg2 VARCHAR2(1) := 'N';
5583 l_b_lbr_sch_fx_dt VARCHAR2(1) := 'N';
5584 l_b_lbr_sch_dsnt VARCHAR2(1) := 'N';
5585 l_b_rv_ind_rt_sch_id_fg VARCHAR2(1) := 'N';
5586 l_b_inv_ind_rt_sch_id_fg VARCHAR2(1) := 'N';
5587 l_b_rv_ind_sch_fx_dt_fg VARCHAR2(1) := 'N';
5588 l_b_iv_ind_sch_fx_dt_fg VARCHAR2(1) := 'N';
5589 l_b_nl_bl_rt_org_id_fg VARCHAR2(1) := 'N';
5590 l_b_nl_std_bl_rt_sch_fg VARCHAR2(1) := 'N';
5591 l_b_nl_sch_fx_dt_fg VARCHAR2(1) := 'N';
5592 l_b_nl_sch_dsnt_fg VARCHAR2(1) := 'N';
5593 l_b_nl_disc_rsn_cd_fg VARCHAR2(1) := 'N';
5594 l_b_tk_mgr_id_fg VARCHAR2(1) := 'N';
5595 --end bug 2955326
5596
5597 --(Begin Venkat) FP_M changes --------------------------------------------
5598 l_inv_md_fg VARCHAR2(1) := 'N';
5599 l_cust_id_fg VARCHAR2(1) := 'N';
5600 l_gen_etc_src_co_fg VARCHAR2(1) := 'N';
5601 --(End Venkat) FP_M changes ----------------------------------------------
5602
5603 l_warnings_only_flag VARCHAR2(1) := 'N'; --bug3134205
5604 --rtarway BUG 3908013
5605 l_return_msg varchar2(2000);
5606 l_validate_status varchar2(1);
5607 /* bug#5243018 : Reverting the fix in Bug 4120380
5608 task_number_change_Ok_flag varchar2(1); --Added for Bug 4120380 */
5609
5610 l_cc_process_labor_flag varchar2(1) := p_cc_process_labor_flag; /* Added for Bug 5395048 */
5611 l_cc_process_nl_flag varchar2(1) := p_cc_process_nl_flag; /* Added for Bug 5395048 */
5612
5613 --bug 6153503
5614 l_attribute_category VARCHAR2(30);
5615 l_attribute1 VARCHAR2(150);
5616 l_attribute2 VARCHAR2(150);
5617 l_attribute3 VARCHAR2(150);
5618 l_attribute4 VARCHAR2(150);
5619 l_attribute5 VARCHAR2(150);
5620 l_attribute6 VARCHAR2(150);
5621 l_attribute7 VARCHAR2(150);
5622 l_attribute8 VARCHAR2(150);
5623 l_attribute9 VARCHAR2(150);
5624 l_attribute10 VARCHAR2(150);
5625 l_project_type2 VARCHAR2(20);-- for bug 7403227
5626 l_project_sharing_type VARCHAR2(250); --for bug 13011347
5627 -- added below 2 variables for Huawei enhancement bug 13923366 by skkoppul
5628 l_project_start_date DATE;
5629 l_project_completion_date DATE;
5630 BEGIN
5631
5632 -- Standard begin of API savepoint
5633
5634 SAVEPOINT update_task_pub;
5635
5636 -- Standard call to check for call compatibility.
5637
5638 IF NOT FND_API.Compatible_API_Call ( g_api_version_number ,
5639 p_api_version_number ,
5640 l_api_name ,
5641 G_PKG_NAME )
5642 THEN
5643
5644 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5645
5646 END IF;
5647
5648 -- Initialize the message table if requested.
5649
5650 IF FND_API.TO_BOOLEAN( p_init_msg_list )
5651 THEN
5652
5653 FND_MSG_PUB.initialize;
5654
5655 END IF;
5656
5657 -- Set API return status to success
5658
5659 p_return_status := FND_API.G_RET_STS_SUCCESS;
5660
5661 --pm_product_code is mandatory
5662
5663 l_tasks_restructured_flag := 'N';
5664 l_resp_id := FND_GLOBAL.Resp_id;
5665 l_user_id := FND_GLOBAL.User_id;
5666 --l_module_name := p_pm_product_code||'.'||'PA_PM_UPDATE_TASK';
5667 l_module_name := 'PA_PM_UPDATE_TASK';
5668
5669 -- As part of enforcing project security, which would determine
5670 -- whether the user has the necessary privileges to update the task
5671 -- need to call the pa_security package
5672
5673 pa_security.initialize (X_user_id => l_user_id,
5674 X_calling_module => l_module_name);
5675
5676 -- Actions performed using the APIs would be subject to
5677 -- function security. If the responsibility does not allow
5678 -- such functions to be executed, the API should not proceed further
5679 -- since the user does not have access to such functions
5680
5681 -- Added the IF conditions below for Huawei enhancemnet bug 13923366 by skkoppul
5682 -- We are caching the security access
5683 IF PA_PROJECT_PUB.G_MASS_UPDATE_TASKS = 'Y' THEN
5684 IF PA_PROJECT_PUB.G_UPDATE_TASK_ALLOWED IS NULL THEN
5685
5686
5687 PA_PM_FUNCTION_SECURITY_PUB.check_function_security
5688 (p_api_version_number => p_api_version_number,
5689 p_responsibility_id => l_resp_id,
5690 p_function_name => 'PA_PM_UPDATE_TASK',
5691 p_msg_count => l_msg_count,
5692 p_msg_data => l_msg_data,
5693 p_return_status => l_return_status,
5694 p_function_allowed => l_function_allowed );
5695
5696 IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR
5697 THEN
5698
5699 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5700
5701 ELSIF l_return_status = FND_API.G_RET_STS_ERROR
5702 THEN
5703
5704 RAISE FND_API.G_EXC_ERROR;
5705 END IF;
5706 PA_PROJECT_PUB.G_UPDATE_TASK_ALLOWED := l_function_allowed;
5707 ELSE
5708 l_function_allowed := PA_PROJECT_PUB.G_UPDATE_TASK_ALLOWED;
5709 END IF;
5710 ELSE
5711 PA_PM_FUNCTION_SECURITY_PUB.check_function_security
5712 (p_api_version_number => p_api_version_number,
5713 p_responsibility_id => l_resp_id,
5714 p_function_name => 'PA_PM_UPDATE_TASK',
5715 p_msg_count => l_msg_count,
5716 p_msg_data => l_msg_data,
5717 p_return_status => l_return_status,
5718 p_function_allowed => l_function_allowed );
5719
5720 IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR
5721 THEN
5722
5723 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5724
5725 ELSIF l_return_status = FND_API.G_RET_STS_ERROR
5726 THEN
5727
5728 RAISE FND_API.G_EXC_ERROR;
5729 END IF;
5730 END IF; -- bug 13923366 changes end
5731
5732 IF l_function_allowed = 'N' THEN
5733 pa_interface_utils_pub.map_new_amg_msg
5734 ( p_old_message_code => 'PA_FUNCTION_SECURITY_ENFORCED'
5735 ,p_msg_attribute => 'CHANGE'
5736 ,p_resize_flag => 'Y'
5737 ,p_msg_context => 'GENERAL'
5738 ,p_attribute1 => ''
5739 ,p_attribute2 => ''
5740 ,p_attribute3 => ''
5741 ,p_attribute4 => ''
5742 ,p_attribute5 => '');
5743 p_return_status := FND_API.G_RET_STS_ERROR;
5744 RAISE FND_API.G_EXC_ERROR;
5745 END IF;
5746
5747 --bug 2841158
5748 -- IF p_pm_product_code IS NULL
5749 -- OR p_pm_product_code = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
5750 IF p_pm_product_code IS NOT NULL
5751 AND p_pm_product_code = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
5752 --bug 2841158
5753 AND p_pm_product_code <> 'WORKPLAN' --bug 2665656
5754 THEN
5755
5756 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
5757 THEN
5758 pa_interface_utils_pub.map_new_amg_msg
5759 ( p_old_message_code => 'PA_PRODUCT_CODE_IS_MISSING'
5760 ,p_msg_attribute => 'CHANGE'
5761 ,p_resize_flag => 'N'
5762 ,p_msg_context => 'GENERAL'
5763 ,p_attribute1 => ''
5764 ,p_attribute2 => ''
5765 ,p_attribute3 => ''
5766 ,p_attribute4 => ''
5767 ,p_attribute5 => '');
5768 END IF;
5769 RAISE FND_API.G_EXC_ERROR;
5770 END IF;
5771
5772 --bug 2841158
5773 IF p_pm_product_code <> 'WORKPLAN'
5774 AND p_pm_product_code IS NOT NULL
5775 AND p_pm_product_code <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
5776 THEN
5777 --bug 2841158
5778
5779 -- added IF conditions for Huawei enhancement bug 13923366 by skkoppul
5780 -- Caching pm_product_code
5781 IF PA_PROJECT_PUB.G_MASS_UPDATE_TASKS = 'Y' THEN
5782 IF PA_PROJECT_PUB.G_VALID_PRODUCT_CODE IS NULL THEN
5783 /*added for bug no :2413400*/
5784 OPEN p_product_code_csr (p_pm_product_code);
5785 FETCH p_product_code_csr INTO l_pm_product_code;
5786 IF p_product_code_csr%NOTFOUND THEN
5787 l_pm_product_code := 'Y';
5788 END IF;
5789 CLOSE p_product_code_csr;
5790
5791 PA_PROJECT_PUB.G_VALID_PRODUCT_CODE := l_pm_product_code;
5792 ELSE
5793 l_pm_product_code := PA_PROJECT_PUB.G_VALID_PRODUCT_CODE;
5794 END IF;
5795 ELSE
5796 OPEN p_product_code_csr (p_pm_product_code);
5797 FETCH p_product_code_csr INTO l_pm_product_code;
5798 CLOSE p_product_code_csr;
5799
5800 END IF; -- end bug 13923366 changes
5801
5802 IF l_pm_product_code <> 'X'
5803 AND p_pm_product_code <> 'WORKPLAN' --bug 2665656
5804 THEN
5805
5806 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
5807 THEN
5808 pa_interface_utils_pub.map_new_amg_msg
5809 ( p_old_message_code => 'PA_PRODUCT_CODE_IS_INVALID'
5810 ,p_msg_attribute => 'CHANGE'
5811 ,p_resize_flag => 'N'
5812 ,p_msg_context => 'GENERAL'
5813 ,p_attribute1 => ''
5814 ,p_attribute2 => ''
5815 ,p_attribute3 => ''
5816 ,p_attribute4 => ''
5817 ,p_attribute5 => '');
5818 END IF;
5819 p_return_status := FND_API.G_RET_STS_ERROR;
5820 RAISE FND_API.G_EXC_ERROR;
5821 END IF;
5822 END IF; --bug 2841158
5823
5824 -- convert pm_project_reference to id
5825
5826 Pa_project_pvt.Convert_pm_projref_to_id (
5827 p_pm_project_reference => p_pm_project_reference,
5828 p_pa_project_id => p_pa_project_id,
5829 p_out_project_id => l_project_id,
5830 p_return_status => l_return_status );
5831
5832 IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR
5833 THEN
5834
5835 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5836
5837 ELSIF l_return_status = FND_API.G_RET_STS_ERROR
5838 THEN
5839
5840 RAISE FND_API.G_EXC_ERROR;
5841 END IF;
5842
5843 -- Now verify whether project security allows the user to update
5844 -- the task
5845
5846 IF pa_security.allow_query (x_project_id => l_project_id ) = 'N' THEN
5847
5848
5849 -- The user does not have query privileges on this project
5850 -- Hence, cannot update the task.Raise error
5851
5852 pa_interface_utils_pub.map_new_amg_msg
5853 ( p_old_message_code => 'PA_PROJECT_SECURITY_ENFORCED'
5854 ,p_msg_attribute => 'CHANGE'
5855 ,p_resize_flag => 'Y'
5856 ,p_msg_context => 'GENERAL'
5857 ,p_attribute1 => ''
5858 ,p_attribute2 => ''
5859 ,p_attribute3 => ''
5860 ,p_attribute4 => ''
5861 ,p_attribute5 => '');
5862 p_return_status := FND_API.G_RET_STS_ERROR;
5863 RAISE FND_API.G_EXC_ERROR;
5864 ELSE
5865 -- Caching for Huawei enhancement bug 13923366 by skkoppul
5866 IF PA_PROJECT_PUB.G_MASS_UPDATE_TASKS = 'Y' THEN
5867 IF PA_PROJECT_PUB.G_UPDATE_PRJ_ALLOWED IS NULL THEN
5868 PA_PROJECT_PUB.G_UPDATE_PRJ_ALLOWED := pa_security.allow_update (x_project_id => l_project_id );
5869 IF PA_PROJECT_PUB.G_UPDATE_PRJ_ALLOWED = 'N' THEN
5870 pa_interface_utils_pub.map_new_amg_msg
5871 ( p_old_message_code => 'PA_PROJECT_SECURITY_ENFORCED'
5872 ,p_msg_attribute => 'CHANGE'
5873 ,p_resize_flag => 'Y'
5874 ,p_msg_context => 'GENERAL'
5875 ,p_attribute1 => ''
5876 ,p_attribute2 => ''
5877 ,p_attribute3 => ''
5878 ,p_attribute4 => ''
5879 ,p_attribute5 => '');
5880 p_return_status := FND_API.G_RET_STS_ERROR;
5881 RAISE FND_API.G_EXC_ERROR;
5882 END IF;
5883 END IF;
5884 ELSE
5885 IF pa_security.allow_update (x_project_id => l_project_id ) = 'N' THEN
5886
5887 -- The user does not have update privileges on this project
5888 -- Hence , raise error
5889
5890 pa_interface_utils_pub.map_new_amg_msg
5891 ( p_old_message_code => 'PA_PROJECT_SECURITY_ENFORCED'
5892 ,p_msg_attribute => 'CHANGE'
5893 ,p_resize_flag => 'Y'
5894 ,p_msg_context => 'GENERAL'
5895 ,p_attribute1 => ''
5896 ,p_attribute2 => ''
5897 ,p_attribute3 => ''
5898 ,p_attribute4 => ''
5899 ,p_attribute5 => '');
5900 p_return_status := FND_API.G_RET_STS_ERROR;
5901 RAISE FND_API.G_EXC_ERROR;
5902 END IF;
5903 END IF;
5904 END IF; -- End caching - bug 13923366
5905
5906 --5262740 Changed PA_PROJECT_PVT.Convert_pm_taskref_to_id to PA_PROJECT_PVT.Convert_pm_taskref_to_id_all
5907 Pa_project_pvt.Convert_pm_taskref_to_id_all (
5908 p_pa_project_id => l_project_id,
5909 p_pa_task_id => p_pa_task_id,
5910 p_pm_task_reference => p_pm_task_reference,
5911 p_out_task_id => l_task_id,
5912 p_return_status => l_return_status );
5913
5914 IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR
5915 THEN
5916
5917 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5918
5919 ELSIF l_return_status = FND_API.G_RET_STS_ERROR
5920 THEN
5921
5922 RAISE FND_API.G_EXC_ERROR;
5923 END IF;
5924
5925 -- Get segment1 for AMG messages
5926 -- Caching for Huawei enhancement bug 13923366 by skkoppul
5927 IF PA_PROJECT_PUB.G_MASS_UPDATE_TASKS = 'Y' THEN
5928 l_amg_segment1 := PA_PROJECT_PUB.G_SEGMENT1;
5929 ELSE
5930
5931 OPEN l_amg_project_csr( l_project_id );
5932 FETCH l_amg_project_csr INTO l_amg_segment1;
5933 CLOSE l_amg_project_csr;
5934
5935 END IF;
5936 /*
5937 OPEN l_amg_task_csr( l_task_id );
5938 FETCH l_amg_task_csr INTO l_amg_task_number;
5939 CLOSE l_amg_task_csr;
5940 */
5941 l_amg_task_number := pa_interface_utils_pub.get_task_number_amg
5942 (p_task_number => p_task_name
5943 ,p_task_reference =>p_pm_task_reference
5944 ,p_task_id => l_task_id);
5945
5946
5947
5948 -- Lock the task for update
5949 OPEN l_lock_rows_csr( l_task_id );
5950
5951
5952 -- get the current data of this task
5953 OPEN l_task_rec_csr (l_project_id,l_task_id );
5954 FETCH l_task_rec_csr INTO l_task_rec;
5955 CLOSE l_task_rec_csr;
5956
5957
5958 -- Check for existing children
5959 -- Caching for Huawei enhancement bug 13923366 by skkoppul
5960 IF (p_chargeable_flag <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR AND
5961 nvl(p_chargeable_flag,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR) <> nvl(l_task_rec.chargeable_flag,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR))
5962 OR
5963 (p_task_number <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR AND
5964 nvl(substrb(p_task_number,1,25),PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR) <> nvl(l_task_rec.task_number,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR)
5965 AND p_task_number IS NOT NULL)
5966 OR
5967 (NVL(p_task_start_date,PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE) <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE
5968 OR NVL(p_task_completion_date,PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE ) <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE
5969 OR (p_task_start_date is NULL and p_task_completion_date is NULL))
5970 OR
5971 (p_customer_id IS NOT NULL AND p_customer_id <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM AND
5972 NVL(l_task_rec.customer_id, PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM) <> p_customer_id) THEN
5973
5974 OPEN l_check_child_exists_csr(l_project_id,l_task_id);
5975 FETCH l_check_child_exists_csr INTO l_temp;
5976 IF l_check_child_exists_csr%FOUND
5977 THEN
5978 l_children_exist := 'Y';
5979 ELSE
5980 l_children_exist := 'N';
5981 END IF;
5982
5983 CLOSE l_check_child_exists_csr;
5984 END IF; -- end changes for bug 13923366
5985
5986 -- Building the dynamic SQL statement
5987
5988 l_statement := ' UPDATE PA_TASKS SET ';
5989
5990 -- TASK REFERENCE
5991
5992 IF p_pm_task_reference <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
5993 AND nvl(p_pm_task_reference,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR) <>
5994 nvl(l_task_rec.pm_task_reference, PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR )
5995 AND p_pm_task_reference IS NOT NULL --redundant, but added for clarity
5996 THEN
5997
5998 --bug 2955326
5999 /*
6000 l_statement := l_statement ||
6001 ' PM_TASK_REFERENCE = '||''''||
6002 RTRIM(p_pm_task_reference)||''''||',';
6003 */
6004 l_statement := l_statement ||
6005 ' PM_TASK_REFERENCE = :pm_tk_ref ,';
6006 l_b_pm_tk_ref_flag := 'Y';
6007 --end bug 2955326
6008 l_update_yes_flag := 'Y';
6009
6010 l_pm_task_reference := p_pm_task_reference;
6011 ELSE
6012 l_pm_task_reference := l_task_rec.pm_task_reference;
6013
6014 END IF;
6015
6016 -- TASK NAME
6017
6018 IF p_task_name <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
6019 AND nvl(p_task_name,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR) <> nvl(l_task_rec.task_name, PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR)
6020 AND p_task_name IS NOT NULL --redundant, but added for clarity
6021 THEN
6022
6023 --bug 2955326
6024 /*
6025 l_statement := l_statement ||
6026 ' TASK_NAME = '||''''||
6027 RTRIM(p_task_name)||''''||',';
6028 */
6029 l_statement := l_statement ||
6030 ' TASK_NAME = :tk_name ,';
6031 l_b_tk_nm_flag := 'Y';
6032 --end bug 2955326
6033 l_update_yes_flag := 'Y';
6034
6035 END IF;
6036
6037 -- LONG TASK NAME
6038
6039 IF p_long_task_name <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
6040 AND nvl(p_long_task_name,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR)
6041 <> nvl(l_task_rec.long_task_name, PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR)
6042 AND p_long_task_name IS NOT NULL --redundant, but added for clarity
6043 THEN
6044
6045 --bug 2955326
6046 /*
6047 l_statement := l_statement ||
6048 ' LONG_TASK_NAME = '||''''||
6049 RTRIM(p_long_task_name)||''''||',';
6050 */
6051 l_statement := l_statement ||
6052 ' LONG_TASK_NAME = :ln_tk_name ,';
6053 l_b_ln_tk_nm_flag := 'Y';
6054 --end bug 2955326
6055 l_update_yes_flag := 'Y';
6056
6057 END IF;
6058
6059 -- DESCRIPTION
6060 /* IF (p_task_description <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR OR
6061 p_task_description IS NOT NULL)*/ /*Changed the above code for
6062 p_task_description IS NOT NULL to p_task_description IS NULL,
6063 I reverted back the changes done for bug 1210276 for bug 3321980 */
6064 /* Fix for Bug # 1210276: condition changed to IS NOT NULL from
6065 IS NULL- so that the description column is not updated to NULL
6066 when no value is passed. */
6067 IF (p_task_description <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR OR
6068 p_task_description IS NULL) /* The new change for bug 3321980 */
6069 AND nvl(p_task_description,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR) <>
6070 nvl(l_task_rec.description,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR )
6071 THEN
6072 --bug 2955326
6073 /*
6074 l_statement := l_statement ||
6075 ' DESCRIPTION = '||''''||
6076 RTRIM(p_task_description)||''''||',';
6077 */
6078 l_statement := l_statement ||
6079 ' DESCRIPTION = :descrp ,';
6080 l_b_tk_desc_flag := 'Y';
6081 --end bug 2955326
6082 l_update_yes_flag := 'Y';
6083
6084 END IF;
6085
6086 -- READY_TO_BILL
6087
6088 IF p_ready_to_bill_flag <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
6089 AND nvl(p_ready_to_bill_flag,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR)
6090 <> nvl(l_task_rec.ready_to_bill_flag,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR)
6091 AND p_ready_to_bill_flag IS NOT NULL --redundant, but added for clarity
6092 THEN
6093 --bug 2955326
6094 /*
6095 l_statement := l_statement ||
6096 ' READY_TO_BILL_FLAG = '||''''||
6097 p_ready_to_bill_flag||''''||',';
6098 */
6099 l_statement := l_statement ||
6100 ' READY_TO_BILL_FLAG = :rdy_to_bill_fg ,';
6101 l_b_rdy_to_bill_flag := 'Y';
6102 --end bug 2955326
6103 l_update_yes_flag := 'Y';
6104
6105 END IF;
6106
6107 -- READY_TO_DISTRIBUTE
6108
6109 IF p_ready_to_distribute_flag <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
6110 AND nvl(p_ready_to_distribute_flag,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR)
6111 <> nvl(l_task_rec.ready_to_distribute_flag,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR)
6112 AND p_ready_to_distribute_flag IS NOT NULL --redundant, but added for clarity
6113 THEN
6114 --bug 2955326
6115 /*
6116 l_statement := l_statement ||
6117 ' READY_TO_DISTRIBUTE_FLAG = '||''''||
6118 p_ready_to_distribute_flag||''''||',';
6119 */
6120 l_statement := l_statement ||
6121 ' READY_TO_DISTRIBUTE_FLAG = :rdy_to_dist_fg ,';
6122 l_b_rdy_to_dist_flag := 'Y';
6123 --end bug 2955326
6124 l_update_yes_flag := 'Y';
6125
6126 END IF;
6127
6128 -- LIMIT_TO_TXN_CONTROLS
6129
6130 IF (p_limit_to_txn_controls_flag <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR OR p_limit_to_txn_controls_flag IS NULL )
6131 AND nvl(p_limit_to_txn_controls_flag,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR)
6132 <> nvl(l_task_rec.limit_to_txn_controls_flag,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR)
6133 THEN
6134 --bug 2955326
6135 /*
6136 l_statement := l_statement ||
6137 ' LIMIT_TO_TXN_CONTROLS_FLAG = '||''''||
6138 p_limit_to_txn_controls_flag||''''||',';
6139 */
6140 l_statement := l_statement ||
6141 ' LIMIT_TO_TXN_CONTROLS_FLAG = :lmt_to_txn_ctrl_fg ,';
6142 l_b_lmt_to_txn_ctrl_fg:='Y'; -- Added for bug 3464187
6143 l_update_yes_flag := 'Y';
6144
6145 END IF;
6146
6147 -- CARRYING_OUT_ORGANIZATION_ID
6148
6149 IF p_carrying_out_organization_id <>
6150 PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
6151 AND nvl(p_carrying_out_organization_id,
6152 PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM)
6153 <> nvl(l_task_rec.carrying_out_organization_id,
6154 PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM )
6155 AND p_carrying_out_organization_id IS NOT NULL THEN
6156 OPEN l_get_project_info_csr (l_task_rec.project_id);
6157 FETCH l_get_project_info_csr INTO
6158 l_project_type,l_pm_project_reference;
6159 CLOSE l_get_project_info_csr;
6160
6161 -- Code Added for the bug#1968394
6162 -- Test the function security for Org changes
6163 --
6164 IF (fnd_function.test('PA_PAXPREPR_UPDATE_ORG') = TRUE) THEN
6165 l_org_func_security := 'Y';
6166 ELSE
6167 l_org_func_security := 'N';
6168 END IF;
6169
6170 pa_project_utils2.validate_attribute_change(
6171 X_Context => 'ORGANIZATION_VALIDATION'
6172 ,X_insert_update_mode => NULL
6173 ,X_calling_module => 'UPDATE_TASK'
6174 ,X_project_id => l_task_rec.project_id
6175 ,X_task_id => l_task_id
6176 ,X_old_value =>
6177 To_char(l_task_rec.carrying_out_organization_id)
6178 ,X_new_value =>
6179 To_char(p_carrying_out_organization_id)
6180 ,X_project_type => l_project_type
6181 ,X_project_start_date => NULL
6182 ,X_project_end_date => NULL
6183 ,X_public_sector_flag => NULL
6184 ,X_task_manager_person_id => l_task_rec.task_manager_person_id
6185 ,X_Service_type => l_task_rec.service_type_code
6186 ,X_task_start_date => l_task_rec.start_date
6187 ,X_task_end_date => l_task_rec.completion_date
6188 ,X_entered_by_user_id => FND_GLOBAL.USER_ID
6189 ,X_attribute_category => l_task_rec.attribute_category
6190 ,X_attribute1 => l_task_rec.attribute1
6191 ,X_attribute2 => l_task_rec.attribute2
6192 ,X_attribute3 => l_task_rec.attribute3
6193 ,X_attribute4 => l_task_rec.attribute4
6194 ,X_attribute5 => l_task_rec.attribute5
6195 ,X_attribute6 => l_task_rec.attribute6
6196 ,X_attribute7 => l_task_rec.attribute7
6197 ,X_attribute8 => l_task_rec.attribute8
6198 ,X_attribute9 => l_task_rec.attribute9
6199 ,X_attribute10 => l_task_rec.attribute10
6200 ,X_pm_product_code => l_task_rec.pm_product_code
6201 ,X_pm_project_reference => l_pm_project_reference
6202 ,X_pm_task_reference => l_task_rec.pm_task_reference
6203 -- ,X_functional_security_flag => NULL /* Bug#1968394 */
6204 ,X_functional_security_flag => l_org_func_security /* Bug#1968394 */
6205 ,x_warnings_only_flag => l_warnings_only_flag --bug3134205
6206 ,X_err_code => l_err_code
6207 ,X_err_stage => l_err_stage
6208 ,X_err_stack => l_err_stack );
6209
6210 IF l_err_code > 0 THEN
6211 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
6212 THEN
6213 IF NOT pa_project_pvt.check_valid_message (l_err_stage)
6214 THEN
6215 pa_interface_utils_pub.map_new_amg_msg
6216 ( p_old_message_code => 'PA_TK_CANT_CHG_TASK_ORG'
6217 ,p_msg_attribute => 'CHANGE'
6218 ,p_resize_flag => 'N'
6219 ,p_msg_context => 'TASK'
6220 ,p_attribute1 => l_amg_segment1
6221 ,p_attribute2 => l_amg_task_number
6222 ,p_attribute3 => ''
6223 ,p_attribute4 => ''
6224 ,p_attribute5 => '');
6225 ELSE
6226 pa_interface_utils_pub.map_new_amg_msg
6227 ( p_old_message_code => l_err_stage
6228 ,p_msg_attribute => 'CHANGE'
6229 ,p_resize_flag => 'N'
6230 ,p_msg_context => 'TASK'
6231 ,p_attribute1 => l_amg_segment1
6232 ,p_attribute2 => l_amg_task_number
6233 ,p_attribute3 => ''
6234 ,p_attribute4 => ''
6235 ,p_attribute5 => '');
6236 END IF;
6237 END IF;
6238 RAISE FND_API.G_EXC_ERROR;
6239
6240 ELSIF l_err_code < 0
6241 THEN
6242 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
6243 END IF;
6244
6245 --bug 2955326
6246 /*
6247 l_statement := l_statement ||
6248 ' CARRYING_OUT_ORGANIZATION_ID = '||
6249 TO_CHAR(p_carrying_out_organization_id)||',';
6250 */
6251 l_statement := l_statement ||
6252 ' CARRYING_OUT_ORGANIZATION_ID = :cryng_out_org_id ,';
6253 l_b_cryng_out_org_id_flag := 'Y';
6254 --end bug 2955326
6255 l_update_yes_flag := 'Y';
6256
6257 END IF;
6258
6259 -- CHARGEABLE_FLAG
6260
6261 IF p_chargeable_flag <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR AND
6262 nvl(p_chargeable_flag,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR) <> nvl(l_task_rec.chargeable_flag,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR)
6263 THEN
6264
6265 -- Cannot update chargeable flag for parent tasks
6266
6267 IF l_children_exist = 'Y'
6268 THEN
6269 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
6270 THEN
6271 pa_interface_utils_pub.map_new_amg_msg
6272 ( p_old_message_code => 'PA_CANNOT_CHANGE_CHRG_FLAG'
6273 ,p_msg_attribute => 'CHANGE'
6274 ,p_resize_flag => 'N'
6275 ,p_msg_context => 'TASK'
6276 ,p_attribute1 => l_amg_segment1
6277 ,p_attribute2 => l_amg_task_number
6278 ,p_attribute3 => ''
6279 ,p_attribute4 => ''
6280 ,p_attribute5 => '');
6281 END IF;
6282 RAISE FND_API.G_EXC_ERROR;
6283 END IF;
6284 --bug 2955326
6285 /*
6286 l_statement := l_statement ||
6287 ' CHARGEABLE_FLAG = '||''''||p_chargeable_flag||''''||',';
6288 */
6289 l_statement := l_statement ||
6290 ' CHARGEABLE_FLAG = :chgble_fg ,';
6291 l_b_chgble_fg := 'Y';
6292 --end bug 2955326
6293 l_update_yes_flag := 'Y';
6294
6295 END IF;
6296
6297 -- BILLABLE FLAG
6298 /* Added for bug#2666913 */
6299 -- Caching for Huawei enhancement bug 13923366 by skkoppul
6300 -- Assumption: currently in Bulk update mode, we are allowing p_billable_flag attribute to be updated
6301 -- but in future if this is accomodated following code needs to be changed.
6302 IF NVL(PA_PROJECT_PUB.G_MASS_UPDATE_TASKS,'N') = 'N' THEN
6303
6304 OPEN l_get_project_type_info_csr (l_task_rec.project_id);
6305 FETCH l_get_project_type_info_csr INTO l_project_type_class_code;
6306 CLOSE l_get_project_type_info_csr;
6307
6308 If p_billable_flag = 'Y' and l_project_type_class_code = 'INDIRECT'
6309 THEN
6310 p_return_status := FND_API.G_RET_STS_ERROR;
6311
6312 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
6313 THEN
6314 pa_interface_utils_pub.map_new_amg_msg
6315 ( p_old_message_code => 'PA_PR_INDIRECT_NO_BILLING'
6316 ,p_msg_attribute => 'CHANGE'
6317 ,p_resize_flag => 'N'
6318 ,p_msg_context => 'TASK'
6319 ,p_attribute1 => l_amg_segment1
6320 ,p_attribute2 => l_amg_task_number
6321 ,p_attribute3 => ''
6322 ,p_attribute4 => ''
6323 ,p_attribute5 => '');
6324 END IF;
6325
6326 RAISE FND_API.G_EXC_ERROR;
6327
6328 END IF;
6329 END IF; -- end changes for bug 13923366
6330 /* end of code added for bug #2666913 */
6331
6332 IF p_billable_flag <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR AND
6333 nvl(p_billable_flag,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR) <>
6334 nvl(l_task_rec.billable_flag,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR)
6335 THEN
6336
6337 --bug 2955326
6338 /*
6339 l_statement :=l_statement ||
6340 ' BILLABLE_FLAG = '||''''||p_billable_flag||''''||',';
6341 */
6342 l_statement :=l_statement ||
6343 ' BILLABLE_FLAG = :bil_fg ,';
6344 l_b_billable_fg := 'Y';
6345 --end bug 2955326
6346 l_update_yes_flag := 'Y';
6347
6348 END IF;
6349
6350 -- SERVICE_TYPE_CODE
6351
6352 IF p_service_type_code <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
6353 AND nvl(p_service_type_code,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR)
6354 <> nvl(l_task_rec.service_type_code,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR)
6355 AND p_service_type_code IS NOT NULL --redundant, but added for clarity
6356 THEN
6357
6358 OPEN l_service_type_csr( p_service_type_code );
6359 FETCH l_service_type_csr INTO l_temp;
6360
6361 IF l_service_type_csr%NOTFOUND
6362 THEN
6363
6364 CLOSE l_service_type_csr;
6365 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
6366 THEN
6367 pa_interface_utils_pub.map_new_amg_msg
6368 ( p_old_message_code => 'PA_SERVICE_TYPE_INVALID'
6369 ,p_msg_attribute => 'CHANGE'
6370 ,p_resize_flag => 'N'
6371 ,p_msg_context => 'TASK'
6372 ,p_attribute1 => l_amg_segment1
6373 ,p_attribute2 => l_amg_task_number
6374 ,p_attribute3 => ''
6375 ,p_attribute4 => ''
6376 ,p_attribute5 => '');
6377 END IF;
6378 RAISE FND_API.G_EXC_ERROR;
6379
6380 END IF;
6381
6382 CLOSE l_service_type_csr;
6383
6384 --bug 2955326
6385 /*
6386 l_statement := l_statement ||
6387 ' SERVICE_TYPE_CODE = '||''''|| p_service_type_code||''''||',';
6388 */
6389 l_statement := l_statement ||
6390 ' SERVICE_TYPE_CODE = :srv_tp_cd ,';
6391 l_b_srv_tp_cd_fg := 'Y';
6392 --end bug 2955326
6393 l_update_yes_flag := 'Y';
6394
6395 END IF;
6396
6397 -- TASK NUMBER
6398 --dbms_output.put_line('value of p_task_number'||p_task_number);
6399 --dbms_output.put_line('value l_task_rec.task_number'||l_task_rec.task_number);
6400 IF p_task_number <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
6401 AND nvl(substrb(p_task_number,1,25),PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR) <> --Bug 6193314 . Added Substrb
6402 nvl(l_task_rec.task_number,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR)
6403 AND p_task_number IS NOT NULL
6404 THEN
6405
6406 IF pa_task_utils.check_unique_task_number
6407 (l_project_id,p_task_number,NULL) = 0
6408 THEN
6409 /* CODE CHANGE BEGIN BY ADITI for Bug 4120380 **/
6410 --dbms_output.put_line('before caling CHECK_TASK_NUMBER_CHANGE_OK');
6411 /* bug #5243018: Reverting the fix in bug 4120380.
6412 PA_PROJECT_PUB.CHECK_TASK_NUMBER_CHANGE_OK
6413 ( p_api_version_number => p_api_version_number
6414 , p_return_status => L_RETURN_STATUS
6415 , p_msg_count => l_msg_count
6416 , p_msg_data => l_msg_data
6417 , p_project_id => p_pa_project_id
6418 , p_task_id => p_pa_task_id
6419 , p_task_number_change_Ok_flag => task_number_change_Ok_flag
6420 );
6421 IF task_number_change_Ok_flag = 'N' then */
6422 /** CODE CHANGE END BY ADITI for Bug 4120380 **/
6423 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
6424 THEN
6425 pa_interface_utils_pub.map_new_amg_msg
6426 ( p_old_message_code => 'PA_TASK_NUMBER_NOT_UNIQUE'
6427 ,p_msg_attribute => 'CHANGE'
6428 ,p_resize_flag => 'N'
6429 ,p_msg_context => 'TASK'
6430 ,p_attribute1 => l_amg_segment1
6431 ,p_attribute2 => l_amg_task_number
6432 ,p_attribute3 => ''
6433 ,p_attribute4 => ''
6434 ,p_attribute5 => '');
6435 END IF;
6436 RAISE FND_API.G_EXC_ERROR;
6437 /* bug #5243018: Reverting the fix in bug 4120380.
6438 END IF; -- END OF IF task_number_change_Ok_flag = 'N' */
6439 END IF;
6440 IF l_children_exist = 'N'
6441 THEN
6442 pa_task_utils.change_lowest_task_num_ok
6443 ( x_task_id => l_task_id,
6444 x_err_code => l_err_code,
6445 x_err_stage => l_err_stage,
6446 x_err_stack => l_err_stack );
6447
6448 IF l_err_code > 0
6449 THEN
6450 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
6451 THEN
6452 IF NOT pa_project_pvt.check_valid_message (l_err_stage)
6453 THEN
6454 pa_interface_utils_pub.map_new_amg_msg
6455 ( p_old_message_code => 'PA_CANT_ADD_SUBTASK'
6456 ,p_msg_attribute => 'CHANGE'
6457 ,p_resize_flag => 'N'
6458 ,p_msg_context => 'TASK'
6459 ,p_attribute1 => l_amg_segment1
6460 ,p_attribute2 => l_amg_task_number
6461 ,p_attribute3 => ''
6462 ,p_attribute4 => ''
6463 ,p_attribute5 => '');
6464 ELSE
6465 pa_interface_utils_pub.map_new_amg_msg
6466 ( p_old_message_code => l_err_stage
6467 ,p_msg_attribute => 'SPLIT'
6468 ,p_resize_flag => 'N'
6469 ,p_msg_context => 'MODT'
6470 ,p_attribute1 => l_amg_segment1
6471 ,p_attribute2 => l_amg_task_number
6472 ,p_attribute3 => ''
6473 ,p_attribute4 => ''
6474 ,p_attribute5 => '');
6475 END IF;
6476 END IF;
6477 RAISE FND_API.G_EXC_ERROR;
6478
6479 ELSIF l_err_code < 0
6480 THEN
6481
6482 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
6483 END IF;
6484 END IF;
6485 --bug 2955326
6486 /*
6487 l_statement := l_statement ||
6488 ' TASK_NUMBER = '||''''|| p_task_number||''''||',';
6489 */
6490 l_statement := l_statement ||
6491 ' TASK_NUMBER = :tk_num ,';
6492 l_b_tk_num_fg := 'Y';
6493 --end bug 2955326
6494 l_update_yes_flag := 'Y';
6495 --dbms_output.put_line('Value of l_update_yes_flag in update_one_task'||l_update_yes_flag);
6496 --dbms_output.put_line('Value of l_b_tk_num_fg in update_one_task'||l_b_tk_num_fg);
6497
6498 END IF;
6499
6500
6501 -- If task start date or completion date is to be changed
6502 -- need to compare it with the project dates and hence
6503 -- first fetch the project dates
6504 /* Fix for the Bug 1210276- the following If condition was modified by adding
6505 NVL to the statment to prevent the updation of the start date and end date
6506 column with null values when no values are passed for these variables */
6507
6508 IF (NVL(p_task_start_date,PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE) <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE
6509 OR NVL(p_task_completion_date,PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE ) <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE
6510 OR (p_task_start_date is NULL and p_task_completion_date is NULL)) /*Bug 8854864*/
6511 THEN
6512 -- Caching for Huawei enhancement bug 13923366 by skkoppul
6513 IF PA_PROJECT_PUB.G_MASS_UPDATE_TASKS = 'Y' THEn
6514 l_project_start_date := PA_PROJECT_PUB.G_PROJ_START_DATE;
6515 l_project_completion_date := PA_PROJECT_PUB.G_PROJ_COMPLETION_DATE;
6516 ELSE
6517 OPEN l_project_date_csr (l_project_id);
6518 FETCH l_project_date_csr INTO l_project_start_date, l_project_completion_date; --l_project_date_rec;
6519 CLOSE l_project_date_csr;
6520 END IF; -- end changes for bug 13923366
6521
6522 -- END IF;
6523 /* Fix for the Bug 1210276- relocated this END IF to the logical end of the
6524 block so that the update would only happen when the above conditions
6525 are true */
6526 --Check validity of start and completion date (e.g. start_date can not be later than completion_date)
6527
6528 pa_project_pvt.check_start_end_date( p_old_start_date => l_task_rec.start_date
6529 ,p_new_start_date => p_task_start_date
6530 ,p_old_end_date => l_task_rec.completion_date
6531 ,p_new_end_date => p_task_completion_date
6532 ,p_update_start_date_flag => l_update_start_date_flag
6533 ,p_update_end_date_flag => l_update_end_date_flag
6534 ,p_return_status => l_return_status );
6535
6536 IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
6537 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
6538 ELSIF l_return_status = FND_API.G_RET_STS_ERROR THEN
6539 RAISE FND_API.G_EXC_ERROR;
6540 END IF;
6541
6542 IF pa_project_pub.G_ParChildTsk_chks_deferred = 'N' THEN
6543 IF l_children_exist = 'Y' THEN
6544 OPEN l_outer_child_dates_csr (l_project_id,l_task_id);
6545 FETCH l_outer_child_dates_csr INTO
6546 l_min_child_start_date, l_max_child_completion_date;
6547 CLOSE l_outer_child_dates_csr;
6548 END IF;
6549
6550 IF l_task_rec.parent_task_id IS NOT NULL THEN
6551 OPEN l_outer_parent_dates_csr
6552 (l_project_id,l_task_rec.parent_task_id );
6553 FETCH l_outer_parent_dates_csr INTO
6554 l_min_parent_start_date,l_max_parent_completion_date;
6555 CLOSE l_outer_parent_dates_csr;
6556 END IF;
6557 END IF;
6558 IF l_update_start_date_flag = 'Y'
6559 THEN
6560
6561 IF p_task_start_date < l_project_start_date OR
6562 p_task_start_date > l_project_completion_date
6563 THEN
6564 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
6565 THEN
6566 pa_interface_utils_pub.map_new_amg_msg
6567 ( p_old_message_code => 'PA_TK_OUTSIDE_PROJECT_RANGE'
6568 ,p_msg_attribute => 'CHANGE'
6569 ,p_resize_flag => 'Y'
6570 ,p_msg_context => 'TASK'
6571 ,p_attribute1 => l_amg_segment1
6572 ,p_attribute2 => l_amg_task_number
6573 ,p_attribute3 => ''
6574 ,p_attribute4 => ''
6575 ,p_attribute5 => '');
6576 END IF;
6577 RAISE FND_API.G_EXC_ERROR;
6578 END IF;
6579
6580 -- Do the comparison between parent and child task dates only if
6581 -- the global variable is set to 'N'
6582
6583 IF pa_project_pub.G_ParChildTsk_chks_deferred = 'N' THEN
6584 IF l_children_exist = 'Y' THEN
6585 IF l_min_child_start_date < p_task_start_date THEN
6586 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
6587 pa_interface_utils_pub.map_new_amg_msg
6588 ( p_old_message_code => 'PA_CHILD_START_EARLIER'
6589 ,p_msg_attribute => 'CHANGE'
6590 ,p_resize_flag => 'N'
6591 ,p_msg_context => 'TASK'
6592 ,p_attribute1 => l_amg_segment1
6593 ,p_attribute2 => l_amg_task_number
6594 ,p_attribute3 => ''
6595 ,p_attribute4 => ''
6596 ,p_attribute5 => '');
6597 END IF;
6598 RAISE FND_API.G_EXC_ERROR;
6599 END IF;
6600 END IF;
6601
6602 IF l_task_rec.parent_task_id IS NOT NULL THEN
6603 IF l_min_parent_start_date > p_task_start_date THEN
6604 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
6605 pa_interface_utils_pub.map_new_amg_msg
6606 ( p_old_message_code => 'PA_PARENT_START_LATER'
6607 ,p_msg_attribute => 'CHANGE'
6608 ,p_resize_flag => 'N'
6609 ,p_msg_context => 'TASK'
6610 ,p_attribute1 => l_amg_segment1
6611 ,p_attribute2 => l_amg_task_number
6612 ,p_attribute3 => ''
6613 ,p_attribute4 => ''
6614 ,p_attribute5 => '');
6615 END IF;
6616 RAISE FND_API.G_EXC_ERROR;
6617 END IF;
6618 END IF;
6619 END IF; -- End if pa_project_pub.G_ParChildTsk_chks_deferred
6620
6621 --BUG 4081329 rtarway, validate for EI date also
6622 --bug 13011347 start
6623 --bypass the date validation for the partially shared when source is workplan and msproject.
6624 l_project_sharing_type := PA_PROJ_TASK_STRUC_PUB.GET_SHARE_TYPE(l_project_id);
6625 IF ((l_project_sharing_type = 'SHARE_PARTIAL' AND p_pm_product_code <> 'MSPROJECT' AND p_pm_product_code <> 'WORKPLAN') OR (l_project_sharing_type <> 'SHARE_PARTIAL'))
6626 THEN
6627 PA_TASKS_MAINT_UTILS.Check_Start_Date_EI(
6628 p_project_id => l_project_id,
6629 p_task_id => l_task_id,
6630 p_start_date => p_task_start_date,
6631 x_return_status => l_return_status,
6632 x_msg_count => l_msg_count,
6633 x_msg_data => l_msg_data);
6634 IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
6635 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
6636 ELSIF l_return_status = FND_API.G_RET_STS_ERROR THEN
6637 RAISE FND_API.G_EXC_ERROR;
6638 END IF;
6639 END IF;
6640 --bug 13011347 end
6641 --bug 2955326
6642 /*
6643 l_statement := l_statement ||
6644 ' START_DATE = to_date('''||
6645 to_char(p_task_start_date,'YYYY/MM/DD')||
6646 ''', ''YYYY/MM/DD''),';
6647 */
6648 l_statement := l_statement ||
6649 ' START_DATE = :st_dt ,';
6650 l_b_tk_st_dt_flag := 'Y';
6651 --end bug 2955326
6652 l_update_yes_flag := 'Y';
6653
6654 END IF;
6655
6656 IF l_update_end_date_flag = 'Y'
6657 THEN
6658 IF p_task_completion_date < l_project_start_date OR
6659 p_task_completion_date > l_project_completion_date
6660 THEN
6661 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
6662 THEN
6663 pa_interface_utils_pub.map_new_amg_msg
6664 ( p_old_message_code => 'PA_TK_OUTSIDE_PROJECT_RANGE'
6665 ,p_msg_attribute => 'CHANGE'
6666 ,p_resize_flag => 'Y'
6667 ,p_msg_context => 'TASK'
6668 ,p_attribute1 => l_amg_segment1
6669 ,p_attribute2 => l_amg_task_number
6670 ,p_attribute3 => ''
6671 ,p_attribute4 => ''
6672 ,p_attribute5 => '');
6673 END IF;
6674 RAISE FND_API.G_EXC_ERROR;
6675 END IF;
6676
6677 -- Do the comparison between parent and child task dates only if
6678 -- the global variable is set to 'N'
6679
6680 IF pa_project_pub.G_ParChildTsk_chks_deferred = 'N' THEN
6681 /* IF l_children_exist = 'Y' THEN
6682 IF l_max_child_completion_date > p_task_completion_date THEN
6683 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
6684 THEN
6685 pa_interface_utils_pub.map_new_amg_msg
6686 ( p_old_message_code => 'PA_CHILD_COMPLETION_LATER'
6687 ,p_msg_attribute => 'CHANGE'
6688 ,p_resize_flag => 'N'
6689 ,p_msg_context => 'TASK'
6690 ,p_attribute1 => l_amg_segment1
6691 ,p_attribute2 => l_amg_task_number
6692 ,p_attribute3 => ''
6693 ,p_attribute4 => ''
6694 ,p_attribute5 => '');
6695 END IF;
6696 RAISE FND_API.G_EXC_ERROR;
6697 END IF;
6698 END IF; */ -- commented for bug#8301015
6699
6700 IF l_task_rec.parent_task_id IS NOT NULL
6701 THEN
6702 IF l_max_parent_completion_date < p_task_completion_date
6703 THEN
6704 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
6705 THEN
6706 pa_interface_utils_pub.map_new_amg_msg
6707 ( p_old_message_code => 'PA_PARENT_COMPLETION_EARLIER'
6708 ,p_msg_attribute => 'CHANGE'
6709 ,p_resize_flag => 'Y'
6710 ,p_msg_context => 'TASK'
6711 ,p_attribute1 => l_amg_segment1
6712 ,p_attribute2 => l_amg_task_number
6713 ,p_attribute3 => ''
6714 ,p_attribute4 => ''
6715 ,p_attribute5 => '');
6716 END IF;
6717 RAISE FND_API.G_EXC_ERROR;
6718 END IF;
6719 END IF;
6720 END IF; -- End if pa_project_pub.G_ParChildTsk_chks_deferred;
6721
6722 --BUG 4081329, rtarway
6723 -- Validate for END EI dates too
6724 --bug 13011347 start
6725 --bypass the date validation for the partially shared when source is workplan and msproject.
6726 l_project_sharing_type := PA_PROJ_TASK_STRUC_PUB.GET_SHARE_TYPE(l_project_id);
6727 IF ((l_project_sharing_type = 'SHARE_PARTIAL' AND p_pm_product_code <> 'MSPROJECT' AND p_pm_product_code <> 'WORKPLAN') OR (l_project_sharing_type <> 'SHARE_PARTIAL'))
6728 THEN
6729 PA_TASKS_MAINT_UTILS.Check_End_Date_EI(
6730 p_project_id => l_project_id,
6731 p_task_id => l_task_id,
6732 p_end_date => p_task_completion_date,
6733 x_return_status => l_return_status,
6734 x_msg_count => l_msg_count,
6735 x_msg_data => l_msg_data);
6736 IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
6737 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
6738 ELSIF l_return_status = FND_API.G_RET_STS_ERROR THEN
6739 RAISE FND_API.G_EXC_ERROR;
6740 END IF;
6741 END IF;
6742 --bug 13011347 end
6743 --bug 2955326
6744 /*
6745 l_statement := l_statement ||
6746 ' COMPLETION_DATE = to_date('''||
6747 to_char(p_task_completion_date,'YYYY/MM/DD')||
6748 ''', ''YYYY/MM/DD''),';
6749
6750 */
6751 l_statement := l_statement ||
6752 ' COMPLETION_DATE = :cmp_dt ,';
6753 l_b_comp_dt_fg := 'Y';
6754 --end bug 2955326
6755 l_update_yes_flag := 'Y';
6756
6757 END IF;
6758 END IF;
6759 /* Fix for the Bug 1210276- relocated this END IF here
6760 so that the update would only happen when the above conditions
6761 are true */
6762
6763 --PARENT TASK
6764
6765 --convert_taskref_to_id can not be used because NULL is allowed for the pa_parent_task_id!!!
6766
6767 --rtarway, for DHI ER, BUG 4413568 , following section will be changing the WBS , it involves, moving
6768 --a task. This should not be allowed when p_update_mode is PA_UPD_TASK_ATTR
6769 --Error will be raised , when parent_task_id is different than existing.
6770
6771
6772 l_new_parent_task_id := NULL;
6773 IF p_pa_parent_task_id <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
6774 AND p_pa_parent_task_id IS NOT NULL THEN
6775 IF p_pa_parent_task_id <> NVL( l_task_rec.parent_task_id, -9999 ) THEN
6776 OPEN l_validate_parent_id_csr( l_project_id, p_pa_parent_task_id );
6777 FETCH l_validate_parent_id_csr INTO l_temp;
6778 IF l_validate_parent_id_csr%NOTFOUND
6779 THEN
6780 CLOSE l_validate_parent_id_csr;
6781 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
6782 THEN
6783 pa_interface_utils_pub.map_new_amg_msg
6784 ( p_old_message_code => 'PA_PARENT_TASK_ID_INVALID'
6785 ,p_msg_attribute => 'CHANGE'
6786 ,p_resize_flag => 'N'
6787 ,p_msg_context => 'TASK'
6788 ,p_attribute1 => l_amg_segment1
6789 ,p_attribute2 => l_amg_task_number
6790 ,p_attribute3 => ''
6791 ,p_attribute4 => ''
6792 ,p_attribute5 => '');
6793 END IF;
6794 RAISE FND_API.G_EXC_ERROR;
6795 ELSE
6796 CLOSE l_validate_parent_id_csr;
6797 l_new_parent_task_id := p_pa_parent_task_id;
6798 END IF;
6799 END IF;
6800 ELSE
6801 IF p_pm_parent_task_reference <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR AND
6802 p_pm_parent_task_reference IS NOT NULL THEN
6803 OPEN l_convert_pm_parent_to_id_csr
6804 (l_project_id, p_pm_parent_task_reference );
6805 FETCH l_convert_pm_parent_to_id_csr INTO l_new_parent_task_id;
6806 IF l_convert_pm_parent_to_id_csr%NOTFOUND THEN
6807 CLOSE l_convert_pm_parent_to_id_csr;
6808 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
6809 THEN
6810 pa_interface_utils_pub.map_new_amg_msg
6811 ( p_old_message_code => 'PA_PARENT_TASK_MISSING'
6812 ,p_msg_attribute => 'CHANGE'
6813 ,p_resize_flag => 'N'
6814 ,p_msg_context => 'TASK'
6815 ,p_attribute1 => l_amg_segment1
6816 ,p_attribute2 => l_amg_task_number
6817 ,p_attribute3 => ''
6818 ,p_attribute4 => ''
6819 ,p_attribute5 => '');
6820 END IF;
6821 RAISE FND_API.G_EXC_ERROR;
6822 END IF;
6823 CLOSE l_convert_pm_parent_to_id_csr;
6824 END IF;
6825 END IF;
6826
6827
6828 /* dbms_output.put_line('Task id : '||l_task_id); */
6829 /* dbms_output.put_line('pm_parent_task_ref : '||p_pm_parent_task_reference); */
6830 /* dbms_output.put_line('p_pa_parent_task_id : '||p_pa_parent_task_id); */
6831 /* dbms_output.put_line('Old Task Name : '||l_task_rec.task_name); */
6832 /* dbms_output.put_line('New parent id : '||l_new_parent_task_id); */
6833 /* dbms_output.put_line('Old parent id : '|| */
6834 -- Nvl(l_task_rec.parent_task_id,PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM));
6835
6836 -- Caching for Huawei enhancement bug 13923366 by skkoppul
6837 -- Assumption: currently in Bulk update mode, we are allowing p_pm_parent_task_reference value to be passed
6838 -- but in future if this is accomodated following code needs to be changed.
6839 IF NVL(PA_PROJECT_PUB.G_MASS_UPDATE_TASKS,'N') = 'N' THEN
6840
6841 IF p_pm_parent_task_reference IS NULL AND
6842 l_task_rec.parent_task_id IS NOT NULL THEN
6843
6844 -- this means that a sub task is being changed to become a top task
6845 -- which is not allowed
6846
6847 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
6848 THEN
6849 pa_interface_utils_pub.map_new_amg_msg
6850 ( p_old_message_code => 'PA_TOP_TASK_NOT_ALLOWED'
6851 ,p_msg_attribute => 'CHANGE'
6852 ,p_resize_flag => 'N'
6853 ,p_msg_context => 'TASK'
6854 ,p_attribute1 => l_amg_segment1
6855 ,p_attribute2 => l_amg_task_number
6856 ,p_attribute3 => ''
6857 ,p_attribute4 => ''
6858 ,p_attribute5 => '');
6859 END IF;
6860 RAISE FND_API.G_EXC_ERROR;
6861 END IF;
6862
6863
6864 IF l_new_parent_task_id IS NOT NULL
6865 AND l_new_parent_task_id <> NVL(l_task_rec.parent_task_id,
6866 PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM)
6867 THEN
6868 --rtarway, for DHI ER, BUG 4413568
6869 IF ( PA_PROJECT_PUB.G_TASK_STR_UPDATE_MODE = 'PA_UPD_TASK_ATTR' ) THEN
6870 PA_UTILS.ADD_MESSAGE(p_app_short_name => 'PA',
6871 p_msg_name => 'PA_WBS_CANT_CHANGE');
6872 RAISE FND_API.G_EXC_ERROR;
6873 END IF;
6874
6875 -- get the wbs_level for the new parent task
6876 OPEN l_parent_wbs_csr ( l_project_id, l_new_parent_task_id );
6877 FETCH l_parent_wbs_csr INTO l_new_parent_wbs_level;
6878 CLOSE l_parent_wbs_csr;
6879
6880 /*
6881 --bug 2947492
6882 PA_FIN_PLAN_UTILS.CHECK_REPARENT_TASK_OK(
6883 p_task_id => l_task_id
6884 ,p_old_parent_task_id => l_task_rec.parent_task_id
6885 ,p_new_parent_task_id => l_new_parent_task_id
6886 ,x_return_status => l_return_status
6887 ,x_msg_count => l_msg_count
6888 ,x_msg_data => l_msg_data
6889 );
6890
6891 IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR
6892 THEN
6893 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
6894
6895 ELSIF l_return_status = FND_API.G_RET_STS_ERROR
6896 THEN
6897 RAISE FND_API.G_EXC_ERROR;
6898 END IF;
6899 --End bug 2947492
6900 */ --commented out as per mail from venkatesh dated 22 jan 2004 -- maansari
6901 --bug 3010538
6902 --The following code should be executed when a task's parent is modified
6903 --in a working version( with already existing a published ver ) and
6904 --then its published.
6905 --In other words the code is executed while publishing to sync up with
6906 --pa_tasks. In regular flow for updating parent of a task we call this api
6907 --from the wrapper process_task_structure_bulk api.
6908 --
6909 IF p_pm_product_code = 'WORKPLAN'
6910 THEN
6911 pa_fp_refresh_elements_pub.set_process_flag_proj(
6912 p_project_id => l_project_id
6913 ,p_request_id => null
6914 ,p_process_code => null
6915 ,p_refresh_required_flag => 'Y'
6916 ,x_return_status => l_return_status
6917 ,x_msg_count => l_msg_count
6918 ,x_msg_data => l_msg_data );
6919
6920 if l_return_status <> FND_API.G_RET_STS_SUCCESS then
6921 RAISE FND_API.G_EXC_ERROR;
6922 end if;
6923 END IF;
6924 --bug 3010538
6925
6926
6927 -- If the parent task id is to be changed, then need to check
6928 -- whether it is ok the change the parent
6929
6930 -- *O
6931 -- Check if task is being moved to lower level within it's own hierarchy
6932 --//For the task being moved check if the new_parent_task_id already exists in the children.
6933
6934 OPEN l_chk_chlds_parent_id_csr (l_task_id, l_new_parent_task_id);
6935 FETCH l_chk_chlds_parent_id_csr INTO l_temp;
6936
6937 IF l_chk_chlds_parent_id_csr%FOUND
6938 THEN
6939 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
6940 THEN
6941 pa_interface_utils_pub.map_new_amg_msg
6942 ( p_old_message_code => 'PA_TSK_MV_BELOW_SELF'
6943 ,p_msg_attribute => 'CHANGE'
6944 ,p_resize_flag => 'N'
6945 ,p_msg_context => 'TASK'
6946 ,p_attribute1 => l_amg_segment1
6947 ,p_attribute2 => l_amg_task_number
6948 ,p_attribute3 => ''
6949 ,p_attribute4 => ''
6950 ,p_attribute5 => '');
6951 END IF;
6952 RAISE FND_API.G_EXC_ERROR;
6953 END IF;
6954 CLOSE l_chk_chlds_parent_id_csr;
6955
6956
6957 -- Check If new parent has Expenditure Item.
6958 PA_TASK_UTILS.Check_Create_Subtask_Ok
6959 ( x_task_id => l_new_parent_task_id
6960 --bug 3010538 , x_validation_mode => 'R' --bug 2947492
6961 , x_err_code => l_err_code
6962 , x_err_stage => l_err_stage
6963 , x_err_stack => l_err_stack );
6964
6965 IF l_err_code > 0
6966 THEN
6967 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
6968 IF NOT pa_project_pvt.check_valid_message(l_err_stage)
6969 THEN
6970 pa_interface_utils_pub.map_new_amg_msg
6971 ( p_old_message_code => 'PA_CHECK_ADD_SUBTASK_FAILED'
6972 ,p_msg_attribute => 'CHANGE'
6973 ,p_resize_flag => 'Y'
6974 ,p_msg_context => 'ADDT'
6975 ,p_attribute1 => l_amg_segment1
6976 ,p_attribute2 => l_amg_task_number
6977 ,p_attribute3 => ''
6978 ,p_attribute4 => ''
6979 ,p_attribute5 => '');
6980 ELSE
6981 pa_interface_utils_pub.map_new_amg_msg
6982 ( p_old_message_code => l_err_stage
6983 ,p_msg_attribute => 'SPLIT'
6984 ,p_resize_flag => 'Y'
6985 ,p_msg_context => 'ADDST'
6986 ,p_attribute1 => l_amg_segment1
6987 ,p_attribute2 => l_amg_task_number
6988 ,p_attribute3 => ''
6989 ,p_attribute4 => ''
6990 ,p_attribute5 => '');
6991 END IF; -- IF Pa_project_pvt.check_valid_message
6992
6993 END IF; -- IF Check_msg_Level
6994
6995 RAISE FND_API.G_EXC_ERROR;
6996
6997 END IF;
6998 -- *O
6999
7000
7001 IF l_task_rec.parent_task_id IS NULL
7002 THEN
7003 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
7004 THEN
7005 pa_interface_utils_pub.map_new_amg_msg
7006 ( p_old_message_code => 'PA_CANT_MOVE_TOP_TASK'
7007 ,p_msg_attribute => 'CHANGE'
7008 ,p_resize_flag => 'N'
7009 ,p_msg_context => 'TASK'
7010 ,p_attribute1 => l_amg_segment1
7011 ,p_attribute2 => l_amg_task_number
7012 ,p_attribute3 => ''
7013 ,p_attribute4 => ''
7014 ,p_attribute5 => '');
7015 END IF;
7016 RAISE FND_API.G_EXC_ERROR;
7017
7018 ELSIF l_new_parent_task_id IS NULL
7019 THEN
7020 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
7021 THEN
7022 pa_interface_utils_pub.map_new_amg_msg
7023 ( p_old_message_code => 'PA_TOP_TASK_NOT_ALLOWED'
7024 ,p_msg_attribute => 'CHANGE'
7025 ,p_resize_flag => 'N'
7026 ,p_msg_context => 'TASK'
7027 ,p_attribute1 => l_amg_segment1
7028 ,p_attribute2 => p_pm_task_reference
7029 ,p_attribute3 => ''
7030 ,p_attribute4 => ''
7031 ,p_attribute5 => '');
7032 END IF;
7033 RAISE FND_API.G_EXC_ERROR;
7034 ELSE
7035
7036 OPEN l_top_task_csr (l_new_parent_task_id);
7037 FETCH l_top_task_csr INTO l_top_task_id;
7038 CLOSE l_top_task_csr;
7039
7040 /* dbms_output.put_line('Current top task:'||l_task_rec.top_task_id); */
7041 /* dbms_output.put_line('New top task :'||l_top_task_id); */
7042
7043 IF l_top_task_id <> l_task_rec.top_task_id
7044 THEN
7045 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
7046 THEN
7047 pa_interface_utils_pub.map_new_amg_msg
7048 ( p_old_message_code => 'PA_CANT_CHANGE_PARENT'
7049 ,p_msg_attribute => 'CHANGE'
7050 ,p_resize_flag => 'N'
7051 ,p_msg_context => 'TASK'
7052 ,p_attribute1 => l_amg_segment1
7053 ,p_attribute2 => l_amg_task_number
7054 ,p_attribute3 => ''
7055 ,p_attribute4 => ''
7056 ,p_attribute5 => '');
7057 END IF;
7058 RAISE FND_API.G_EXC_ERROR;
7059 END IF;
7060
7061 END IF;
7062
7063 --bug 2955326
7064 /*
7065 l_statement := l_statement ||
7066 ' PARENT_TASK_ID = '||TO_CHAR(l_new_parent_task_id)||',';
7067 */
7068 l_statement := l_statement ||
7069 ' PARENT_TASK_ID = :prt_tk_id ,';
7070 l_b_prt_tk_id_fg := 'Y';
7071 --end bug 2955326
7072 l_tasks_restructured_flag := 'Y';
7073 l_update_yes_flag := 'Y';
7074
7075 --check whether the WBS level was changed
7076 /* dbms_output.put_line('current level : '||l_task_rec.wbs_level); */
7077 /* dbms_output.put_line('New parent level : '||l_new_parent_wbs_level); */
7078
7079 IF l_task_rec.wbs_level <> l_new_parent_wbs_level + 1
7080 THEN
7081
7082 l_delta_level := (l_new_parent_wbs_level + 1) - l_task_rec.wbs_level;
7083
7084 OPEN l_wbs_level_csr( l_task_id );
7085 FETCH l_wbs_level_csr INTO l_wbs_change_task_id;
7086
7087 WHILE l_wbs_level_csr%FOUND LOOP
7088
7089 UPDATE pa_tasks
7090 SET wbs_level = wbs_level + l_delta_level
7091 WHERE task_id = l_wbs_change_task_id;
7092
7093 FETCH l_wbs_level_csr INTO l_wbs_change_task_id;
7094 END LOOP;
7095
7096 END IF;
7097 END IF;
7098 END IF; -- end changes for bug 13923366
7099 --ADDRESS
7100 /* dbms_output.put_line('New Address: '||p_address_id); */
7101 /* dbms_output.put_line('Current Addres: '||l_task_rec.address_id); */
7102 IF ( p_address_id <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM OR p_address_id IS NULL )
7103 AND nvl(p_address_id,PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM) <> nvl(l_task_rec.address_id,PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM)
7104 THEN
7105
7106 IF p_address_id IS NOT NULL
7107 THEN
7108
7109 --check whether this is the address of one of the project customers
7110
7111 OPEN l_customer_csr( l_project_id );
7112 FETCH l_customer_csr INTO l_customer_id;
7113
7114 /* dbms_output.put_line('Customer: '||l_customer_id); */
7115
7116 l_address_valid:= 'N';
7117
7118 WHILE l_customer_csr%FOUND LOOP
7119
7120 OPEN l_address_csr(l_customer_id, p_address_id);
7121 FETCH l_address_csr INTO l_temp;
7122
7123 IF l_address_csr%FOUND
7124 THEN
7125 l_address_valid:= 'Y';
7126 EXIT; END IF;
7127
7128 CLOSE l_address_csr;
7129
7130 FETCH l_customer_csr INTO l_customer_id;
7131 END LOOP;
7132
7133 CLOSE l_customer_csr;
7134
7135 IF l_address_valid = 'N'
7136 THEN
7137 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
7138 THEN
7139 pa_interface_utils_pub.map_new_amg_msg
7140 ( p_old_message_code => 'PA_TASK_ADDRESS_INVALID'
7141 ,p_msg_attribute => 'CHANGE'
7142 ,p_resize_flag => 'N'
7143 ,p_msg_context => 'TASK'
7144 ,p_attribute1 => l_amg_segment1
7145 ,p_attribute2 => l_amg_task_number
7146 ,p_attribute3 => ''
7147 ,p_attribute4 => ''
7148 ,p_attribute5 => '');
7149 END IF;
7150 RAISE FND_API.G_EXC_ERROR;
7151
7152 END IF;
7153 END IF;
7154
7155 --bug 2955326
7156 /*
7157 l_statement := l_statement ||
7158 ' ADDRESS_ID = '||''''||TO_CHAR(p_address_id)||''''||',';
7159 */
7160 l_statement := l_statement ||
7161 ' ADDRESS_ID = :addr_id ,';
7162 l_b_addr_id_fg := 'Y';
7163 --end bug 2955326
7164 l_update_yes_flag := 'Y';
7165
7166 END IF;
7167
7168 IF (p_tasks_dff = 'Y' OR
7169 (PA_PROJECT_PUB.G_MASS_UPDATE_TASKS = 'Y' AND PA_PROJECT_PUB.G_FP_DFF_TBL.COUNT > 0)) THEN -- BEGIN changes for bug 13680655
7170 --bug 6153503
7171 IF (p_attribute_category <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR OR
7172 p_attribute_category IS NULL) THEN
7173
7174 l_attribute_category := p_attribute_category;
7175 ELSE
7176 l_attribute_category := l_task_rec.attribute_category;
7177 END IF;
7178
7179
7180 IF (p_attribute1 <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR OR
7181 p_attribute1 IS NULL) THEN
7182
7183 l_attribute1 := p_attribute1;
7184 ELSE
7185 l_attribute1 := l_task_rec.attribute1;
7186 END IF;
7187
7188 IF (p_attribute2 <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR OR
7189 p_attribute2 IS NULL) THEN
7190
7191 l_attribute2 := p_attribute2;
7192 ELSE
7193 l_attribute2 := l_task_rec.attribute2;
7194 END IF;
7195
7196 IF (p_attribute3 <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR OR
7197 p_attribute3 IS NULL) THEN
7198
7199 l_attribute3 := p_attribute3;
7200 ELSE
7201 l_attribute3 := l_task_rec.attribute3;
7202 END IF;
7203
7204 IF (p_attribute4 <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR OR
7205 p_attribute4 IS NULL) THEN
7206
7207 l_attribute4 := p_attribute4;
7208 ELSE
7209 l_attribute4 := l_task_rec.attribute4;
7210 END IF;
7211
7212 IF (p_attribute5 <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR OR
7213 p_attribute5 IS NULL) THEN
7214
7215 l_attribute5 := p_attribute5;
7216 ELSE
7217 l_attribute5 := l_task_rec.attribute5;
7218 END IF;
7219
7220 IF (p_attribute6 <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR OR
7221 p_attribute6 IS NULL) THEN
7222
7223 l_attribute6:= p_attribute6;
7224 ELSE
7225 l_attribute6 := l_task_rec.attribute6;
7226 END IF;
7227
7228 IF (p_attribute7 <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR OR
7229 p_attribute7 IS NULL) THEN
7230
7231 l_attribute7:= p_attribute7;
7232 ELSE
7233 l_attribute7 := l_task_rec.attribute7;
7234 END IF;
7235
7236 IF (p_attribute8 <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR OR
7237 p_attribute8 IS NULL) THEN
7238
7239 l_attribute8:= p_attribute8;
7240 ELSE
7241 l_attribute8 := l_task_rec.attribute8;
7242 END IF;
7243
7244 IF (p_attribute9 <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR OR
7245 p_attribute9 IS NULL) THEN
7246
7247 l_attribute9:= p_attribute9;
7248 ELSE
7249 l_attribute9 := l_task_rec.attribute9;
7250 END IF;
7251
7252 IF (p_attribute10 <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR OR
7253 p_attribute10 IS NULL) THEN
7254
7255 l_attribute10 := p_attribute10;
7256 ELSE
7257 l_attribute10 := l_task_rec.attribute10;
7258 END IF;
7259 /* Bug 7403227 start */
7260 -- Caching for Huawei enhancement bug 13923366 by skkoppul
7261 IF NVL(PA_PROJECT_PUB.G_MASS_UPDATE_TASKS,'1234') = 'Y' THEN
7262 l_project_type2 := PA_PROJECT_PUB.G_PROJECT_TYPE;
7263 ELSE
7264
7265 BEGIN
7266 IF p_pa_project_id IS NOT NULL THEN
7267 SELECT PROJECT_TYPE
7268 INTO l_project_type2
7269 FROM PA_PROJECTS
7270 WHERE PROJECT_ID = p_pa_project_id;
7271 ELSE
7272 SELECT PROJECT_TYPE
7273 INTO l_project_type2
7274 FROM PA_PROJECTS
7275 WHERE PROJECT_ID IN (SELECT PROJECT_ID
7276 FROM PA_TASKS
7277 WHERE TASK_ID = p_pa_task_id);
7278 END IF;
7279 EXCEPTION
7280 WHEN OTHERS THEN
7281 RAISE FND_API.G_EXC_ERROR; /* Raise error unknown if the query fails! */
7282 END;
7283 END IF; -- end changes for bug 13923366
7284 /* Bug 7403227 end */
7285
7286 /*
7287 l_statement := l_statement ||
7288 ' ATTRIBUTE_CATEGORY = '||''''||
7289 RTRIM(p_attribute_category)||''''||',';
7290 */
7291 --BUG 3908013, rtarway, Validate for financial dff
7292 --bug 6153503
7293 IF l_project_type2 <> 'AWARD_PROJECT' THEN /* Bug 7403227*/
7294 pa_task_utils.validate_flex_fields(
7295 p_desc_flex_name => 'PA_TASKS_DESC_FLEX'
7296 ,p_attribute_category => l_attribute_category
7297 ,p_attribute1 => l_attribute1
7298 ,p_attribute2 => l_attribute2
7299 ,p_attribute3 => l_attribute3
7300 ,p_attribute4 => l_attribute4
7301 ,p_attribute5 => l_attribute5
7302 ,p_attribute6 => l_attribute6
7303 ,p_attribute7 => l_attribute7
7304 ,p_attribute8 => l_attribute8
7305 ,p_attribute9 => l_attribute9
7306 ,p_attribute10 => l_attribute10
7307 ,p_RETURN_msg => l_return_msg
7308 ,p_validate_status => l_validate_status
7309 );
7310 IF l_validate_status = 'N'
7311 THEN
7312 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
7313 THEN
7314 pa_interface_utils_pub.map_new_amg_msg
7315 ( p_old_message_code => 'PA_INVALID_FF_VALUES'
7316 ,p_msg_attribute => 'CHANGE'
7317 ,p_resize_flag => 'N'
7318 ,p_msg_context => 'FLEX'
7319 ,p_attribute1 => l_return_msg
7320 ,p_attribute2 => ''
7321 ,p_attribute3 => ''
7322 ,p_attribute4 => ''
7323 ,p_attribute5 => '');
7324 END IF;
7325 RAISE FND_API.G_EXC_ERROR;
7326 END IF;
7327 END IF; /* Bug 7403227 */
7328 -- Update the dff fields - 04/11/97
7329 --bug 6153503 start
7330 IF (p_attribute_category <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR OR
7331 p_attribute_category IS NULL)
7332 AND nvl(p_attribute_category,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR) <>
7333 nvl(l_task_rec.attribute_category,
7334 PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR )
7335 THEN
7336 --bug 2955326
7337
7338 l_statement := l_statement ||
7339 ' ATTRIBUTE_CATEGORY = :attr_cat ,';
7340 l_b_attr_cat_fg := 'Y';
7341 --end bug 2955326
7342 l_update_yes_flag := 'Y';
7343
7344 END IF;
7345
7346
7347 IF (p_attribute1 <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR OR
7348 p_attribute1 IS NULL)
7349 AND nvl(p_attribute1,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR) <>
7350 nvl(l_task_rec.attribute1,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR )
7351 THEN
7352 --bug 2955326
7353 /*
7354 l_statement := l_statement ||
7355 ' ATTRIBUTE1 = '||''''||
7356 RTRIM(p_attribute1)||''''||',';
7357 */
7358 l_statement := l_statement ||
7359 ' ATTRIBUTE1 = :attr1 ,';
7360 l_b_attr1_fg := 'Y';
7361 --end bug 2955326
7362 l_update_yes_flag := 'Y';
7363
7364 END IF;
7365
7366 IF (p_attribute2 <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR OR
7367 p_attribute2 IS NULL)
7368 AND nvl(p_attribute2,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR) <>
7369 nvl(l_task_rec.attribute2,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR )
7370 THEN
7371 --bug 2955326
7372 /*
7373 l_statement := l_statement ||
7374 ' ATTRIBUTE2 = '||''''||
7375 RTRIM(p_attribute2)||''''||',';
7376 */
7377 l_statement := l_statement ||
7378 ' ATTRIBUTE2 = :attr2 ,';
7379 l_b_attr2_fg := 'Y';
7380 --end bug 2955326
7381 l_update_yes_flag := 'Y';
7382
7383 END IF;
7384
7385 IF (p_attribute3 <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR OR
7386 p_attribute3 IS NULL)
7387 AND nvl(p_attribute3,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR) <>
7388 nvl(l_task_rec.attribute3,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR )
7389 THEN
7390 --bug 2955326
7391 /*
7392 l_statement := l_statement ||
7393 ' ATTRIBUTE3 = '||''''||
7394 RTRIM(p_attribute3)||''''||',';
7395 */
7396 l_statement := l_statement ||
7397 ' ATTRIBUTE3 = :attr3 ,';
7398 l_b_attr3_fg := 'Y';
7399 --end bug 2955326
7400 l_update_yes_flag := 'Y';
7401
7402 END IF;
7403
7404 IF (p_attribute4 <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR OR
7405 p_attribute4 IS NULL)
7406 AND nvl(p_attribute4,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR) <>
7407 nvl(l_task_rec.attribute4,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR )
7408 THEN
7409 --bug 2955326
7410 /*
7411 l_statement := l_statement ||
7412 ' ATTRIBUTE4 = '||''''||
7413 RTRIM(p_attribute4)||''''||',';
7414 */
7415 l_statement := l_statement ||
7416 ' ATTRIBUTE4 = :attr4 ,';
7417 l_b_attr4_fg := 'Y';
7418 --end bug 2955326
7419 l_update_yes_flag := 'Y';
7420
7421 END IF;
7422
7423 IF (p_attribute5 <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR OR
7424 p_attribute5 IS NULL)
7425 AND nvl(p_attribute5,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR) <>
7426 nvl(l_task_rec.attribute5,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR )
7427 THEN
7428 --bug 2955326
7429 /*
7430 l_statement := l_statement ||
7431 ' ATTRIBUTE5 = '||''''||
7432 RTRIM(p_attribute5)||''''||',';
7433 */
7434 l_statement := l_statement ||
7435 ' ATTRIBUTE5 = :attr5 ,';
7436 l_b_attr5_fg := 'Y';
7437 --end bug 2955326
7438 l_update_yes_flag := 'Y';
7439
7440 END IF;
7441
7442 IF (p_attribute6 <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR OR
7443 p_attribute6 IS NULL)
7444 AND nvl(p_attribute6,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR) <>
7445 nvl(l_task_rec.attribute6,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR )
7446 THEN
7447 --bug 2955326
7448 /*
7449 l_statement := l_statement ||
7450 ' ATTRIBUTE6 = '||''''||
7451 RTRIM(p_attribute6)||''''||',';
7452 */
7453 l_statement := l_statement ||
7454 ' ATTRIBUTE6 = :attr6 ,';
7455 l_b_attr6_fg := 'Y';
7456 --end bug 2955326
7457 l_update_yes_flag := 'Y';
7458
7459 END IF;
7460
7461 IF (p_attribute7 <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR OR
7462 p_attribute7 IS NULL)
7463 AND nvl(p_attribute7,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR) <>
7464 nvl(l_task_rec.attribute7,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR )
7465 THEN
7466 --bug 2955326
7467 /*
7468 l_statement := l_statement ||
7469 ' ATTRIBUTE7 = '||''''||
7470 RTRIM(p_attribute7)||''''||',';
7471 */
7472 l_statement := l_statement ||
7473 ' ATTRIBUTE7 = :attr7 ,';
7474 l_b_attr7_fg := 'Y';
7475 --end bug 2955326
7476 l_update_yes_flag := 'Y';
7477
7478 END IF;
7479
7480 IF (p_attribute8 <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR OR
7481 p_attribute8 IS NULL)
7482 AND nvl(p_attribute8,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR) <>
7483 nvl(l_task_rec.attribute8,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR )
7484 THEN
7485 --bug 2955326
7486 /*
7487 l_statement := l_statement ||
7488 ' ATTRIBUTE8 = '||''''||
7489 RTRIM(p_attribute8)||''''||',';
7490 */
7491 l_statement := l_statement ||
7492 ' ATTRIBUTE8 = :attr8 ,';
7493 l_b_attr8_fg := 'Y';
7494 --end bug 2955326
7495 l_update_yes_flag := 'Y';
7496
7497 END IF;
7498
7499 IF (p_attribute9 <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR OR
7500 p_attribute9 IS NULL)
7501 AND nvl(p_attribute9,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR) <>
7502 nvl(l_task_rec.attribute9,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR )
7503 THEN
7504 --bug 2955326
7505 /*
7506 l_statement := l_statement ||
7507 ' ATTRIBUTE9 = '||''''||
7508 RTRIM(p_attribute9)||''''||',';
7509 */
7510 l_statement := l_statement ||
7511 ' ATTRIBUTE9 = :attr9 ,';
7512 l_b_attr9_fg := 'Y';
7513 --end bug 2955326
7514 l_update_yes_flag := 'Y';
7515
7516 END IF;
7517
7518 IF (p_attribute10 <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR OR
7519 p_attribute10 IS NULL)
7520 AND nvl(p_attribute10,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR) <>
7521 nvl(l_task_rec.attribute10,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR )
7522 THEN
7523 --bug 2955326
7524 /*
7525 l_statement := l_statement ||
7526 ' ATTRIBUTE10 = '||''''||
7527 RTRIM(p_attribute10)||''''||',';
7528 */
7529 l_statement := l_statement ||
7530 ' ATTRIBUTE10 = :attr10 ,';
7531 l_b_attr10_fg := 'Y';
7532 --end bug 2955326
7533 l_update_yes_flag := 'Y';
7534
7535 END IF;
7536 --bug 6153503 end
7537 -- IC and Multi National Currency changes Starts ...
7538 END IF; -- END of changes for bug 13680655
7539
7540 IF (p_allow_cross_charge_flag <>
7541 PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR AND
7542 p_allow_cross_charge_flag IS NOT NULL)
7543 AND nvl(p_allow_cross_charge_flag,
7544 PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR) <>
7545 nvl(l_task_rec.allow_cross_charge_flag,
7546 PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR )
7547 THEN
7548 --bug 2955326
7549 /*
7550 l_statement := l_statement ||
7551 ' ALLOW_CROSS_CHARGE_FLAG = '||''''||
7552 RTRIM(p_allow_cross_charge_flag)||''''||',';
7553 */
7554 l_statement := l_statement ||
7555 ' ALLOW_CROSS_CHARGE_FLAG = :all_x_chg_fg ,';
7556 l_b_al_x_chg_fg := 'Y';
7557 --end bug 2955326
7558 l_update_yes_flag := 'Y';
7559
7560 END IF;
7561
7562 IF (p_project_rate_type <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR AND
7563 p_project_rate_type IS NOT NULL)
7564 AND nvl(p_project_rate_type,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR) <>
7565 nvl(l_task_rec.project_rate_type,
7566 PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR )
7567 THEN
7568 --bug 2955326
7569 /*
7570 l_statement := l_statement ||
7571 ' PROJECT_RATE_TYPE = '||''''||
7572 RTRIM(p_project_rate_type)||''''||',';
7573 */
7574 l_statement := l_statement ||
7575 ' PROJECT_RATE_TYPE = :prj_rt_tp ,';
7576 l_b_prj_rt_tp_fg := 'Y';
7577 --end bug 2955326
7578 l_update_yes_flag := 'Y';
7579
7580 END IF;
7581
7582 IF (p_project_rate_date <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE AND
7583 p_project_rate_date IS NOT NULL)
7584 AND nvl(p_project_rate_date,PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE) <>
7585 nvl(l_task_rec.project_rate_date,
7586 PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE )
7587 THEN
7588 --bug 2955326
7589 /*
7590 l_statement := l_statement ||
7591 ' PROJECT_RATE_DATE = to_date('''||
7592 to_char(p_project_rate_date,'YYYY/MM/DD')||
7593 ''', ''YYYY/MM/DD''),';
7594 */
7595 l_statement := l_statement ||
7596 ' PROJECT_RATE_DATE = :prj_rt_dt ,';
7597 l_b_prj_rt_dt_fg := 'Y';
7598 --end bug 2955326
7599 l_update_yes_flag := 'Y';
7600
7601 END IF;
7602
7603 IF p_cc_process_labor_flag <>
7604 PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
7605 AND p_cc_process_labor_flag IS NOT NULL THEN
7606 IF NVL(p_cc_process_labor_flag,
7607 PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR)
7608 <> NVL(l_task_rec.cc_process_labor_flag,
7609 PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR)
7610 THEN
7611 --bug 2955326
7612 /*
7613 l_statement := l_statement ||
7614 ' CC_PROCESS_LABOR_FLAG = '||''''||
7615 RTRIM(p_cc_process_labor_flag)||''''||',';
7616 */
7617 l_statement := l_statement ||
7618 ' CC_PROCESS_LABOR_FLAG = :cc_proc_lbr_fg ,';
7619 l_b_cc_proc_lbr_fg := 'Y';
7620 --end bug 2955326
7621 l_update_yes_flag := 'Y';
7622 END IF;
7623 END IF;
7624 -- 5402979 for pqe bug 5395048 :: added p_project_in.labor_tp_schedule_id IS NULL condition
7625 IF ( (p_labor_tp_schedule_id <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
7626 AND p_labor_tp_schedule_id IS NOT NULL)
7627 OR (p_labor_tp_schedule_id IS NULL) )
7628 THEN
7629 -- 5402979 for pqe bug 5395048 :: added p_project_in.labor_tp_schedule_id IS NULL condition
7630 IF ( (p_labor_tp_schedule_id <> NVL(l_task_rec.labor_tp_schedule_id,PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM))
7631 OR (p_labor_tp_schedule_id IS NULL) )
7632 THEN
7633 --bug 2955326
7634 /*
7635 l_statement := l_statement || ' LABOR_TP_SCHEDULE_ID = ' ||
7636 TO_CHAR(p_labor_tp_schedule_id)||',';
7637 */
7638 l_statement := l_statement || ' LABOR_TP_SCHEDULE_ID = :lbr_tp_sch_id ,';
7639 l_b_lbr_tp_sch_id_fg := 'Y';
7640 --end bug 2955326
7641 l_update_yes_flag := 'Y';
7642 -- 5402979 Added the code below for Bug 5395048. If labor schedule id is being NULLed out, then
7643 -- we need to set the project cross charge process labor flag to 'N'
7644 IF p_labor_tp_schedule_id IS NULL THEN
7645 l_cc_process_labor_flag := 'N';
7646
7647 IF l_b_cc_proc_lbr_fg = 'N' THEN
7648 l_statement := l_statement ||
7649 ' CC_PROCESS_LABOR_FLAG = :cc_proc_lbr_fg ,';
7650 End if;
7651
7652 l_b_cc_proc_lbr_fg := 'Y';
7653 l_update_yes_flag := 'Y';
7654 END IF;
7655 -- Code changes end for Bug 5395048
7656 END IF;
7657 END IF;
7658
7659 --IF p_labor_tp_fixed_date <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE THEN -- Bug#11069289
7660 IF ((NVL(p_labor_tp_fixed_date,PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE)<> NVL(l_task_rec.labor_tp_fixed_date,PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE))
7661 OR p_labor_tp_fixed_date IS NULL) THEN -- Bug 11069289
7662 --bug 2955326
7663 /*
7664 l_statement := l_statement ||
7665 ' LABOR_TP_FIXED_DATE = to_date('''||
7666 to_char(p_labor_tp_fixed_date,'YYYY/MM/DD')||
7667 ''', ''YYYY/MM/DD''),';
7668 */
7669 l_statement := l_statement ||
7670 ' LABOR_TP_FIXED_DATE = :lbr_tp_fx_dt ,';
7671 l_b_lbr_tp_fx_dt_fg := 'Y';
7672 --end bug 2955326
7673 l_update_yes_flag := 'Y';
7674 END IF;
7675 --END IF;
7676
7677 IF p_cc_process_nl_flag <>
7678 PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
7679 AND p_cc_process_nl_flag IS NOT NULL THEN
7680 IF NVL(p_cc_process_nl_flag,
7681 PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR)
7682 <> NVL(l_task_rec.cc_process_nl_flag,
7683 PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR)
7684 THEN
7685 --bug 2955326
7686 /*
7687 l_statement := l_statement ||
7688 ' CC_PROCESS_NL_FLAG = '||''''||
7689 RTRIM(p_cc_process_nl_flag)||''''||',';
7690 */
7691 l_statement := l_statement ||
7692 ' CC_PROCESS_NL_FLAG = :cc_proc_nl_fg ,';
7693 l_b_cc_proc_nl_fg := 'Y';
7694 --end bug 2955326
7695 l_update_yes_flag := 'Y';
7696 END IF;
7697 END IF;
7698 -- 5402979 for pqe bug 5395048 :: added p_project_in.labor_tp_schedule_id IS NULL condition
7699 IF ( ( p_nl_tp_schedule_id <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM AND p_nl_tp_schedule_id IS NOT NULL )
7700 OR (p_nl_tp_schedule_id IS NULL) )
7701 THEN
7702 -- 5402979 for pqe bug 5395048 :: added p_project_in.labor_tp_schedule_id IS NULL condition
7703 IF ( (p_nl_tp_schedule_id <> NVL(l_task_rec.nl_tp_schedule_id,PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM))
7704 OR (p_nl_tp_schedule_id IS NULL))
7705 THEN
7706 --bug 2955326
7707 /*
7708 l_statement := l_statement || ' NL_TP_SCHEDULE_ID = ' ||
7709 TO_CHAR(p_nl_tp_schedule_id)||',';
7710 */
7711 l_statement := l_statement || ' NL_TP_SCHEDULE_ID = :nl_tp_sch_id ,';
7712 l_b_nl_tp_sch_id_fg := 'Y';
7713 --end bug 2955326
7714 l_update_yes_flag := 'Y';
7715 -- 5402979 Added the code below for Bug 5395048. If labor schedule id is being NULLed out, then
7716 -- we need to set the project cross charge process labor flag to 'N'
7717 IF p_nl_tp_schedule_id IS NULL THEN
7718 l_cc_process_nl_flag := 'N';
7719
7720 IF l_b_cc_proc_nl_fg = 'N' THEN
7721 l_statement := l_statement ||
7722 ' CC_PROCESS_NL_FLAG = :CC_PROC_NL_FG ,';
7723 End if;
7724
7725 l_b_cc_proc_nl_fg := 'Y';
7726 l_update_yes_flag := 'Y';
7727 END IF;
7728 -- Code changes end for Bug 5395048
7729 END IF;
7730 END IF;
7731
7732 --IF p_nl_tp_fixed_date <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE THEN --Bug#11069289
7733 IF ((NVL(p_nl_tp_fixed_date,PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE) <> NVL(l_task_rec.nl_tp_fixed_date,PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE))
7734 OR p_nl_tp_fixed_date IS NULL) THEN --Bug 11069289
7735 --bug 2955326
7736 /*
7737 l_statement := l_statement ||
7738 ' NL_TP_FIXED_DATE = to_date('''||
7739 to_char(p_nl_tp_fixed_date,'YYYY/MM/DD')||
7740 ''', ''YYYY/MM/DD''),';
7741 */
7742 l_statement := l_statement ||
7743 ' NL_TP_FIXED_DATE = :nl_tp_fx_dt ,';
7744 l_b_nl_tp_fx_dt_fg := 'Y';
7745 --end bug 2955326
7746 l_update_yes_flag := 'Y';
7747 END IF;
7748 --END IF;
7749
7750 IF p_receive_project_invoice_flag <>
7751 PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
7752 AND p_receive_project_invoice_flag IS NOT NULL THEN
7753 IF NVL(p_receive_project_invoice_flag,
7754 PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR)
7755 <> NVL(l_task_rec.receive_project_invoice_flag,
7756 PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR)
7757 THEN
7758 --bug 2955326
7759 /*
7760 l_statement := l_statement ||
7761 ' RECEIVE_PROJECT_INVOICE_FLAG = '||''''||
7762 RTRIM(p_receive_project_invoice_flag)||''''||',';
7763 */
7764 l_statement := l_statement ||
7765 ' RECEIVE_PROJECT_INVOICE_FLAG = :rcv_prj_inv_fg ,';
7766 l_b_rcv_prj_inv_fg := 'Y';
7767 --end bug 2955326
7768 l_update_yes_flag := 'Y';
7769 END IF;
7770 END IF;
7771
7772 --Added for bug 5745545
7773 IF nvl(p_work_type_id,-999) <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM THEN
7774 IF (nvl(fnd_profile.value('PA_EN_NEW_WORK_TYPE_PROCESS'),'N') = 'Y') OR (nvl(pa_install.is_prm_licensed(),'N') = 'Y' ) THEN
7775 IF p_work_type_id IS NULL AND (NOT (PA_GMS_API.vert_install)) THEN
7776 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
7777 pa_interface_utils_pub.map_new_amg_msg
7778 ( p_old_message_code => 'PA_TASK_WORK_TYPE_MAND'
7779 ,p_msg_attribute => 'CHANGE'
7780 ,p_resize_flag => 'N'
7781 ,p_msg_context => 'TASK'
7782 ,p_attribute1 => l_amg_segment1
7783 ,p_attribute2 => l_amg_task_number
7784 ,p_attribute3 => ''
7785 ,p_attribute4 => ''
7786 ,p_attribute5 => '');
7787 END IF;
7788 RAISE FND_API.G_EXC_ERROR;
7789 ELSE
7790 IF nvl(p_work_type_id,PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM) <> nvl(l_task_rec.work_type_id,PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM) THEN
7791 --bug 2955326
7792 /*
7793 l_statement := l_statement || ' WORK_TYPE_ID = ' ||
7794 TO_CHAR(p_work_type_id)||',';
7795 */
7796 ---Bug 14777618 starts here-----
7797 DECLARE
7798 lv_count number;
7799 BEGIN
7800 select count(1) into lv_count from PA_WORK_TYPES_B where WORK_TYPE_ID = p_work_type_id;
7801 if lv_count < 1 then
7802 FND_MESSAGE.SET_NAME('PA','PA_INVALID_WORK_TYPE_TASK');
7803 FND_MESSAGE.SET_TOKEN('TASK_NAME',l_amg_task_number);
7804 FND_MSG_PUB.add;
7805 RAISE FND_API.G_EXC_ERROR;
7806 END IF;
7807 END;
7808 ---Bug 14777618 ends here-----
7809 l_statement := l_statement || ' WORK_TYPE_ID = :wk_tp_id ,';
7810 l_b_wk_tp_id_fg := 'Y';
7811 --end bug 2955326
7812 l_update_yes_flag := 'Y';
7813 END IF;
7814 END IF;
7815 ELSE -- Null work_type_id is allowed
7816 IF nvl(p_work_type_id,PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM) <> nvl(l_task_rec.work_type_id,PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM) THEN
7817 l_statement := l_statement || ' WORK_TYPE_ID = :wk_tp_id ,';
7818 l_b_wk_tp_id_fg := 'Y';
7819 l_update_yes_flag := 'Y';
7820 END IF;
7821 END IF;
7822 END IF;
7823 --End for bug 5745545
7824
7825 -- IC and Multi National Currency changes Ends ...
7826 /* Commented for bug 2802984 starts*/
7827 /*IF p_emp_bill_rate_schedule_id <>
7828 PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
7829 AND p_emp_bill_rate_schedule_id IS NOT NULL THEN
7830 IF p_emp_bill_rate_schedule_id <> l_task_rec.emp_bill_rate_schedule_id
7831 THEN
7832 l_statement := l_statement || ' EMP_BILL_RATE_SCHEDULE_ID = ' ||
7833 TO_CHAR(p_emp_bill_rate_schedule_id)||',';
7834 l_update_yes_flag := 'Y';
7835 END IF;
7836 END IF;
7837
7838 IF p_job_bill_rate_schedule_id <>
7839 PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
7840 AND p_job_bill_rate_schedule_id IS NOT NULL THEN
7841 IF p_job_bill_rate_schedule_id <> l_task_rec.job_bill_rate_schedule_id
7842 THEN
7843 l_statement := l_statement || ' JOB_BILL_RATE_SCHEDULE_ID = ' ||
7844 TO_CHAR(p_job_bill_rate_schedule_id)||',';
7845 l_update_yes_flag := 'Y';
7846 END IF;
7847 END IF;
7848
7849 IF p_non_lab_std_bill_rt_sch_id <>
7850 PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
7851 AND p_non_lab_std_bill_rt_sch_id IS NOT NULL THEN
7852 IF p_non_lab_std_bill_rt_sch_id <> l_task_rec.non_lab_std_bill_rt_sch_id
7853 THEN
7854 l_statement := l_statement || ' NON_LAB_STD_BILL_RT_SCH_ID = ' ||
7855 TO_CHAR(p_non_lab_std_bill_rt_sch_id)||',';
7856 l_update_yes_flag := 'Y';
7857 END IF;
7858 END IF;*/
7859 /* Commented for bug 2802984 ends*/
7860
7861 IF p_taskfunc_cost_rate_date <>
7862 PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE
7863 AND p_taskfunc_cost_rate_date IS NOT NULL THEN
7864 IF NVL(p_taskfunc_cost_rate_date,
7865 PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE)
7866 <> NVL(l_task_rec.taskfunc_cost_rate_date,
7867 PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE)
7868 THEN
7869 --bug 2955326
7870 /*
7871 l_statement := l_statement ||
7872 ' TASKFUNC_COST_RATE_DATE = to_date('''||
7873 to_char(p_taskfunc_cost_rate_date,'YYYY/MM/DD')||
7874 ''', ''YYYY/MM/DD''),';
7875 */
7876 l_statement := l_statement ||
7877 ' TASKFUNC_COST_RATE_DATE = :tkfnc_cst_rt_dt ,';
7878 l_b_tkfnc_cst_rt_dt_fg := 'Y';
7879 --end bug 2955326
7880 l_update_yes_flag := 'Y';
7881 END IF;
7882 END IF;
7883
7884 IF p_taskfunc_cost_rate_type <>
7885 PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
7886 AND p_taskfunc_cost_rate_type IS NOT NULL THEN
7887 IF NVL(p_taskfunc_cost_rate_type,
7888 PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR)
7889 <> NVL(l_task_rec.taskfunc_cost_rate_type,
7890 PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR)
7891 THEN
7892 --bug 2955326
7893 /*
7894 l_statement := l_statement ||
7895 ' TASKFUNC_COST_RATE_TYPE = '||''''||
7896 RTRIM(p_taskfunc_cost_rate_type)||''''||',';
7897 */
7898 l_statement := l_statement ||
7899 ' TASKFUNC_COST_RATE_TYPE = :tkfnc_cst_rt_tp ,';
7900 l_b_tkfnc_cst_rt_tp_fg := 'Y';
7901 --end bug 2955326
7902 l_update_yes_flag := 'Y';
7903 END IF;
7904 END IF;
7905
7906 --Sakthi MCB
7907
7908 --PA L Changes 2872708
7909
7910 IF p_retirement_cost_flag <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
7911 AND p_retirement_cost_flag IS NOT NULL THEN
7912 IF NVL(p_retirement_cost_flag, PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR)
7913 <> NVL(l_task_rec.retirement_cost_flag, PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR)
7914 THEN
7915 --bug 2955326
7916 /*
7917 l_statement := l_statement ||
7918 ' RETIREMENT_COST_FLAG = '||''''||
7919 RTRIM(p_retirement_cost_flag)||''''||',';
7920 */
7921 l_statement := l_statement ||
7922 ' RETIREMENT_COST_FLAG = :ret_cst_fg ,';
7923 l_b_ret_cst_fg := 'Y';
7924 --end bug 2955326
7925 l_update_yes_flag := 'Y';
7926 END IF;
7927 END IF;
7928
7929 IF p_cint_eligible_flag <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
7930 AND p_cint_eligible_flag IS NOT NULL THEN
7931 IF NVL(p_cint_eligible_flag, PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR)
7932 <> NVL(l_task_rec.cint_eligible_flag, PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR)
7933 THEN
7934 --bug 2955326
7935 /*
7936 l_statement := l_statement ||
7937 ' CINT_ELIGIBLE_FLAG = '||''''||
7938 RTRIM(p_cint_eligible_flag)||''''||',';
7939 */
7940 l_statement := l_statement ||
7941 ' CINT_ELIGIBLE_FLAG = :cint_elg_fg ,';
7942 l_b_cint_elg_fg := 'Y';
7943 --end bug 2955326
7944 l_update_yes_flag := 'Y';
7945 END IF;
7946 END IF;
7947
7948 IF p_cint_stop_date <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE
7949 AND p_cint_stop_date IS NOT NULL THEN
7950 IF NVL(p_cint_stop_date, PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE)
7951 <> NVL(l_task_rec.cint_stop_date, PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE)
7952 THEN
7953 --bug 2955326
7954 /*
7955 l_statement := l_statement ||
7956 ' CINT_STOP_DATE = '||''''||
7957 RTRIM(p_cint_stop_date)||''''||',';
7958 */
7959 l_statement := l_statement ||
7960 ' CINT_STOP_DATE = :cint_stp_dt ,';
7961 l_b_cint_stp_dt_fg := 'Y';
7962 --end bug 2955326
7963 l_update_yes_flag := 'Y';
7964 END IF;
7965 END IF;
7966 --End PA L Changes 2872708
7967
7968
7969 /* Commented for bug 2802984 starts*/
7970
7971 /* IF p_labor_disc_reason_code <>
7972 PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
7973 AND p_labor_disc_reason_code IS NOT NULL THEN
7974 IF NVL(p_labor_disc_reason_code,
7975 PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR)
7976 <> NVL(l_task_rec.labor_disc_reason_code,
7977 PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR)
7978 THEN
7979
7980 l_statement := l_statement ||
7981 ' LABOR_DISC_REASON_CODE = '||''''||
7982 RTRIM(p_labor_disc_reason_code)||''''||',';
7983 l_update_yes_flag := 'Y';
7984 END IF;
7985 END IF;
7986
7987 IF p_non_labor_disc_reason_code <>
7988 PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
7989 AND p_non_labor_disc_reason_code IS NOT NULL THEN
7990 IF NVL(p_non_labor_disc_reason_code,
7991 PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR)
7992 <> NVL(l_task_rec.non_labor_disc_reason_code,
7993 PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR)
7994 THEN
7995 --bug 2955326
7996 l_statement := l_statement ||
7997 ' NON_LABOR_DISC_REASON_CODE = '||''''||
7998 RTRIM(p_non_labor_disc_reason_code)||''''||',';
7999 l_update_yes_flag := 'Y';
8000 END IF;
8001 END IF;*/
8002
8003 /* Commented for bug 2802984 ends*/
8004
8005 /*Code for bug 2802984 starts*/
8006 -- Added IF condition for Huawei enhancement bug 13923366 by skkoppul
8007 -- Schedule type validation is not need as we are not passing the values
8008 -- Assumption: currently in Bulk update mode, we are allowing atttributes like p_labor_sch_type,
8009 -- p_nl_sch_type and p_pm_task_reference to be passed in to be updated
8010 -- but in future if these are accomodated following code needs to be changed.
8011 IF NVL(PA_PROJECT_PUB.G_MASS_UPDATE_TASKS,'N') = 'N' THEN
8012
8013 Check_Schedule_type
8014 (p_pa_task_id => l_task_id,
8015 p_pa_project_id => l_project_id,
8016 p_in_labor_sch_type => p_labor_sch_type,
8017 p_in_nl_sch_type => p_nl_sch_type,
8018 p_task_name => p_task_name,
8019 p_pm_task_reference => p_pm_task_reference,
8020 p_out_labor_sch_type => l_out_labor_sch_type,
8021 p_out_nl_labor_sch_type => l_out_nl_labor_sch_type,
8022 p_return_status => l_return_status
8023 );
8024
8025 IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR
8026 THEN
8027 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
8028
8029 ELSIF l_return_status = FND_API.G_RET_STS_ERROR
8030 THEN
8031 RAISE FND_API.G_EXC_ERROR;
8032 END IF;
8033
8034 validate_schedule_values
8035 (p_pa_project_id => l_project_id,
8036 p_pa_task_id => l_task_id,
8037 p_task_name => p_task_name,
8038 p_pm_task_reference => p_pm_task_reference,
8039 p_lab_db_sch_type => l_task_rec.labor_sch_type,
8040 p_nl_db_sch_type => l_task_rec.non_labor_sch_type,
8041 p_labor_sch_type => l_out_labor_sch_type,
8042 p_nl_sch_type => l_out_nl_labor_sch_type,
8043 p_emp_bill_rate_schedule_id => p_emp_bill_rate_schedule_id,
8044 p_job_bill_rate_schedule_id => p_job_bill_rate_schedule_id,
8045 p_labor_schedule_fixed_date => p_labor_schedule_fixed_date,
8046 p_labor_schedule_discount => p_labor_schedule_discount,
8047 p_labor_disc_reason_code => p_labor_disc_reason_code,
8048 p_nl_bill_rate_org_id => p_nl_bill_rate_org_id,
8049 p_non_lab_std_bill_rt_sch_id => p_non_lab_std_bill_rt_sch_id,
8050 p_nl_schedule_fixed_date => p_nl_schedule_fixed_date,
8051 p_nl_schedule_discount => p_nl_schedule_discount,
8052 p_non_labor_disc_reason_code => p_non_labor_disc_reason_code,
8053 p_rev_ind_rate_sch_id => p_rev_ind_rate_sch_id,
8054 p_inv_ind_rate_sch_id => p_inv_ind_rate_sch_id,
8055 p_rev_ind_sch_fixed_date => p_rev_ind_sch_fixed_date,
8056 p_inv_ind_sch_fixed_date => p_inv_ind_sch_fixed_date,
8057 p_return_status => l_return_status
8058 );
8059
8060 IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR
8061 THEN
8062
8063 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
8064
8065 ELSIF l_return_status = FND_API.G_RET_STS_ERROR
8066 THEN
8067
8068 RAISE FND_API.G_EXC_ERROR;
8069 END IF;
8070 END IF; -- end changes for bug 13923366
8071
8072 IF p_labor_sch_type <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
8073 AND p_labor_sch_type IS NOT NULL
8074 THEN
8075 IF p_labor_sch_type <> NVL(l_task_rec.LABOR_SCH_TYPE,PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR)
8076 THEN
8077 --bug 2955326
8078 /*
8079 l_statement := l_statement ||' LABOR_SCH_TYPE = '||''''||
8080 RTRIM(p_labor_sch_type)||''''||',';
8081 */
8082 l_statement := l_statement ||' LABOR_SCH_TYPE = :lbr_sch_tp ,';
8083 l_b_lbr_sch_tp_fg := 'Y';
8084 --end bug 2955326
8085 l_update_yes_flag := 'Y';
8086 END IF;
8087 END IF;
8088
8089 IF p_nl_sch_type <>
8090 PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
8091 AND p_nl_sch_type IS NOT NULL
8092 THEN
8093 IF p_nl_sch_type
8094 <> NVL(l_task_rec.NON_LABOR_SCH_TYPE,
8095 PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR)
8096 THEN
8097 l_statement := l_statement ||
8098 --bug 2955326
8099 /*
8100 ' NON_LABOR_SCH_TYPE = '||''''||
8101 RTRIM(p_nl_sch_type)||''''||',';
8102 */
8103 ' NON_LABOR_SCH_TYPE = :n_lbr_sch_tp,';
8104 l_b_n_lbr_sch_tp_fg := 'Y';
8105 --end bug 2955326
8106 l_update_yes_flag := 'Y';
8107 END IF;
8108 END IF;
8109
8110 IF l_out_labor_sch_type = 'B' THEN
8111
8112
8113 /* Should be able to update null since this is not mandatory*/
8114 IF ((p_emp_bill_rate_schedule_id <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
8115 AND p_emp_bill_rate_schedule_id IS NOT NULL ) OR (p_emp_bill_rate_schedule_id IS NULL))
8116 THEN
8117 IF ((p_emp_bill_rate_schedule_id <> NVL(l_task_rec.EMP_BILL_RATE_SCHEDULE_ID,PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM))
8118 OR (p_emp_bill_rate_schedule_id IS NULL))
8119 THEN
8120 --bug 2955326
8121 /*
8122 l_statement := l_statement ||
8123 ' EMP_BILL_RATE_SCHEDULE_ID = '||''''||
8124 TO_CHAR(p_emp_bill_rate_schedule_id)||''''||',';
8125 */
8126 l_statement := l_statement || ' EMP_BILL_RATE_SCHEDULE_ID = :emp_bill_rt_sch_id2 ,';
8127 l_b_emp_bill_rt_sch_id_fg2 := 'Y';
8128 --end bug 2955326
8129 l_update_yes_flag := 'Y';
8130 END IF;
8131 END IF;
8132
8133 /*
8134 1)Should be able to update null when prm is not licensed.
8135 2) When prm is licensed then it is mandatory.
8136 */
8137
8138 IF ((p_job_bill_rate_schedule_id <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
8139 AND p_job_bill_rate_schedule_id IS NOT NULL )
8140 OR (p_job_bill_rate_schedule_id is NULL and pa_install.is_prm_licensed = 'N'))
8141 THEN
8142 IF ((p_job_bill_rate_schedule_id <> NVL(l_task_rec.JOB_BILL_RATE_SCHEDULE_ID,
8143 PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM)) OR (p_job_bill_rate_schedule_id is NULL))
8144 THEN
8145 --bug 2955326
8146 /*
8147 l_statement := l_statement ||
8148 ' JOB_BILL_RATE_SCHEDULE_ID = '||''''||
8149 TO_CHAR(p_job_bill_rate_schedule_id)||''''||',';
8150 */
8151 l_statement := l_statement || ' JOB_BILL_RATE_SCHEDULE_ID = :jb_bill_rt_sch_id2 ,';
8152 l_b_jb_bill_rt_sch_id_fg2 := 'Y';
8153 --end bug 2955326
8154 l_update_yes_flag := 'Y';
8155 END IF;
8156 END IF;
8157
8158 /* Should be able to update null*/
8159
8160 IF ((p_labor_schedule_fixed_date <>
8161 PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE
8162 AND p_labor_schedule_fixed_date IS NOT NULL) OR p_labor_schedule_fixed_date IS NULL) THEN
8163 IF p_labor_schedule_fixed_date
8164 <> NVL(l_task_rec.LABOR_SCHEDULE_FIXED_DATE,
8165 PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE) OR (p_labor_schedule_fixed_date IS NULL)
8166 THEN
8167 --bug 2955326
8168 /*
8169 l_statement := l_statement ||
8170 ' LABOR_SCHEDULE_FIXED_DATE = to_date('''||
8171 to_char(p_labor_schedule_fixed_date,'YYYY/MM/DD')||
8172 ''', ''YYYY/MM/DD''),';
8173 */
8174 l_statement := l_statement ||
8175 ' LABOR_SCHEDULE_FIXED_DATE = :lbr_sch_fx_dt,';
8176 l_b_lbr_sch_fx_dt := 'Y';
8177 --end bug 2955326
8178 l_update_yes_flag := 'Y';
8179 END IF;
8180 END IF;
8181
8182 /* Should be able to update null*/
8183 IF ((p_labor_schedule_discount <>
8184 PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
8185 AND p_labor_schedule_discount IS NOT NULL ) OR (p_labor_schedule_discount IS NULL ))
8186 THEN
8187 IF ((p_labor_schedule_discount <> NVL(l_task_rec.LABOR_SCHEDULE_DISCOUNT,PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM))
8188 OR (p_labor_schedule_discount IS NULL))
8189 THEN
8190 --bug 2955326
8191 /*
8192 l_statement := l_statement ||
8193 ' LABOR_SCHEDULE_DISCOUNT = '||''''||
8194 TO_CHAR(p_labor_schedule_discount)||''''||',';
8195 */
8196 l_statement := l_statement ||
8197 ' LABOR_SCHEDULE_DISCOUNT = :lbr_sch_dsnt,';
8198 l_b_lbr_sch_dsnt := 'Y';
8199 --end bug 2955326
8200 END IF;
8201 END IF;
8202
8203 IF p_labor_schedule_discount IS NULL THEN
8204 l_statement := l_statement ||
8205 ' LABOR_DISC_REASON_CODE = '''''||',';
8206 l_update_yes_flag := 'Y';
8207 ELSE
8208 IF p_labor_disc_reason_code <>
8209 PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
8210 AND p_labor_disc_reason_code IS NOT NULL
8211 OR p_labor_disc_reason_code IS NULL THEN
8212 IF (p_labor_disc_reason_code
8213 <> NVL(l_task_rec.labor_disc_reason_code,
8214 PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR) OR (p_labor_disc_reason_code IS NULL))
8215 THEN
8216 --bug 2955326
8217 /*
8218 l_statement := l_statement ||
8219 ' LABOR_DISC_REASON_CODE = '||''''||
8220 RTRIM(p_labor_disc_reason_code)||''''||',';
8221 */
8222 l_statement := l_statement ||
8223 ' LABOR_DISC_REASON_CODE = :lbr_disc_rsn_cd,';
8224 l_b_lbr_disc_rsn_cd_fg := 'Y';
8225 --end bug 2955326
8226 l_update_yes_flag := 'Y';
8227 END IF;
8228 END IF;
8229 END IF;
8230
8231 ELSE /*Else when labor_sch_type <> B*/
8232 l_statement := l_statement ||
8233 ' LABOR_SCHEDULE_FIXED_DATE = '''''||',';
8234
8235 l_statement := l_statement ||
8236 ' LABOR_SCHEDULE_DISCOUNT = '''''||',';
8237
8238 l_statement := l_statement ||
8239 ' LABOR_DISC_REASON_CODE = '''''||',';
8240
8241 l_statement := l_statement ||
8242 ' EMP_BILL_RATE_SCHEDULE_ID = '''''||',';
8243
8244 l_statement := l_statement ||
8245 ' JOB_BILL_RATE_SCHEDULE_ID = '''''||',';
8246
8247
8248 l_update_yes_flag := 'Y';
8249 END IF;
8250
8251 IF l_out_labor_sch_type = 'I' OR l_out_nl_labor_sch_type ='I' THEN
8252
8253 IF p_rev_ind_rate_sch_id <>
8254 PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
8255 AND p_rev_ind_rate_sch_id IS NOT NULL THEN
8256 IF NVL(p_rev_ind_rate_sch_id,
8257 PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM)
8258 <> NVL(l_task_rec.REV_IND_RATE_SCH_ID,
8259 PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM)
8260 THEN
8261
8262 --bug 2955326
8263 /*
8264 l_statement := l_statement ||
8265 ' REV_IND_RATE_SCH_ID = '||''''||
8266 TO_CHAR(p_rev_ind_rate_sch_id)||''''||',';
8267 */
8268 l_statement := l_statement ||
8269 ' REV_IND_RATE_SCH_ID = :rv_ind_rt_sch_id,';
8270 l_b_rv_ind_rt_sch_id_fg := 'Y';
8271 --end bug 2955326
8272 l_update_yes_flag := 'Y';
8273 END IF;
8274 END IF;
8275
8276
8277 IF p_inv_ind_rate_sch_id <>
8278 PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
8279 AND p_inv_ind_rate_sch_id IS NOT NULL THEN
8280 IF NVL(p_inv_ind_rate_sch_id,
8281 PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM)
8282 <> NVL(l_task_rec.INV_IND_RATE_SCH_ID,
8283 PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM)
8284 THEN
8285 --bug 2955326
8286 /*
8287 l_statement := l_statement ||
8288 ' INV_IND_RATE_SCH_ID = '||''''||
8289 TO_CHAR(p_inv_ind_rate_sch_id)||''''||',';
8290 */
8291 l_statement := l_statement ||
8292 ' INV_IND_RATE_SCH_ID = :inv_ind_rt_sch_id,';
8293 l_b_inv_ind_rt_sch_id_fg := 'Y';
8294 --end bug 2955326
8295 l_update_yes_flag := 'Y';
8296 END IF;
8297 END IF;
8298
8299
8300
8301 IF p_rev_ind_rate_sch_id <>
8302 PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
8303 AND p_rev_ind_rate_sch_id IS NOT NULL THEN
8304 if p_rev_ind_rate_sch_id <> g_rev_ind_rate_sch_id then -- added for bug 3795253
8305 BEGIN
8306
8307 SELECT ind_rate_schedule_type INTO l_rev_rate_sch_type
8308 FROM pa_ind_rate_schedules
8309 WHERE ind_rate_sch_id = p_rev_ind_rate_sch_id
8310 AND trunc(sysdate) between trunc(start_date_active) and nvl(end_date_active,trunc(sysdate));
8311 g_rev_rate_sch_type := l_rev_rate_sch_type; -- added for bug 3795253
8312 g_rev_ind_rate_sch_id := p_rev_ind_rate_sch_id; -- added for bug 3795253
8313 EXCEPTION
8314 WHEN NO_DATA_FOUND THEN
8315 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
8316 THEN
8317 pa_interface_utils_pub.map_new_amg_msg
8318 ( p_old_message_code => 'PA_INVALID_REV_SCH_ID'
8319 ,p_msg_attribute => 'CHANGE'
8320 ,p_resize_flag => 'Y'
8321 ,p_msg_context => 'TASK'
8322 ,p_attribute1 => l_amg_segment1
8323 ,p_attribute2 => l_amg_task_number
8324 ,p_attribute3 => ''
8325 ,p_attribute4 => ''
8326 ,p_attribute5 => '');
8327 END IF;
8328 RAISE FND_API.G_EXC_ERROR;
8329 END;
8330
8331 -- start of bug 3795253
8332 else
8333 l_rev_rate_sch_type := g_rev_rate_sch_type;
8334 end if;
8335 -- end of bug 3795253
8336
8337 ELSE
8338
8339 IF l_task_rec.REV_IND_RATE_SCH_ID IS NOT NULL
8340 and l_task_rec.REV_IND_RATE_SCH_ID <> g_rev_ind_rate_sch_id -- Added for bug 3795253
8341 THEN
8342
8343 SELECT ind_rate_schedule_type INTO l_rev_rate_sch_type
8344 FROM pa_ind_rate_schedules
8345 WHERE ind_rate_sch_id = l_task_rec.REV_IND_RATE_SCH_ID;
8346
8347 g_rev_rate_sch_type := l_rev_rate_sch_type; -- added for bug 3795253
8348 g_rev_ind_rate_sch_id := l_task_rec.REV_IND_RATE_SCH_ID; -- added for bug 3795253
8349
8350 -- Bug 3657709
8351 /* AND trunc(sysdate) between trunc(start_date_active) and nvl(end_date_active,trunc(sysdate)); */
8352
8353 -- start of bug 3795253
8354 else
8355 l_rev_rate_sch_type := g_rev_rate_sch_type;
8356 end if;
8357 -- end of bug 3795253
8358
8359 END IF;
8360
8361
8362 IF p_inv_ind_rate_sch_id <>
8363 PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
8364 AND p_inv_ind_rate_sch_id IS NOT NULL THEN
8365 if p_inv_ind_rate_sch_id <> g_inv_ind_rate_sch_id then -- added for bug 3795253
8366
8367 BEGIN
8368
8369 SELECT ind_rate_schedule_type INTO l_inv_rate_sch_type
8370 FROM pa_ind_rate_schedules
8371 WHERE ind_rate_sch_id = p_inv_ind_rate_sch_id
8372 AND trunc(sysdate) between trunc(start_date_active) and nvl(end_date_active,trunc(sysdate));
8373
8374 g_inv_rate_sch_type := l_inv_rate_sch_type; -- added for bug 3795253
8375 g_inv_ind_rate_sch_id := p_inv_ind_rate_sch_id; -- added for bug 3795253
8376
8377 EXCEPTION
8378 WHEN NO_DATA_FOUND THEN
8379 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
8380 THEN
8381 pa_interface_utils_pub.map_new_amg_msg
8382 ( p_old_message_code => 'PA_INVALID_INV_SCH_ID'
8383 ,p_msg_attribute => 'CHANGE'
8384 ,p_resize_flag => 'Y'
8385 ,p_msg_context => 'TASK'
8386 ,p_attribute1 => l_amg_segment1
8387 ,p_attribute2 => l_amg_task_number
8388 ,p_attribute3 => ''
8389 ,p_attribute4 => ''
8390 ,p_attribute5 => '');
8391 END IF;
8392 RAISE FND_API.G_EXC_ERROR;
8393 END;
8394 -- start of bug 3795253
8395 else
8396 l_inv_rate_sch_type := g_inv_rate_sch_type;
8397 end if;
8398 -- end of bug 3795253
8399
8400 ELSE
8401 IF l_task_rec.INV_IND_RATE_SCH_ID IS NOT NULL
8402 and l_task_rec.INV_IND_RATE_SCH_ID <> g_inv_ind_rate_sch_id -- Added for bug 3795253
8403 THEN
8404
8405
8406 SELECT ind_rate_schedule_type INTO l_inv_rate_sch_type
8407 FROM pa_ind_rate_schedules
8408 WHERE ind_rate_sch_id = l_task_rec.INV_IND_RATE_SCH_ID;
8409 g_inv_rate_sch_type := l_inv_rate_sch_type; -- added for bug 3795253
8410 g_inv_ind_rate_sch_id := l_task_rec.INV_IND_RATE_SCH_ID; -- added for bug 3795253
8411 -- Bug 3657709
8412 /* AND trunc(sysdate) between trunc(start_date_active) and nvl(end_date_active,trunc(sysdate)); */
8413 -- start of bug 3795253
8414 else
8415 l_inv_rate_sch_type := g_inv_rate_sch_type;
8416 end if;
8417 -- end of bug 3795253
8418 END IF;
8419
8420 /*
8421 If the burden rate schedule type is of Provisional type then the revenue schedule date has to be nullified.
8422 */
8423
8424 IF l_rev_rate_sch_type = 'P' AND l_task_rec.REV_IND_SCH_FIXED_DATE IS NOT NULL THEN
8425 l_statement := l_statement ||
8426 ' REV_IND_SCH_FIXED_DATE = '''''||',';
8427 l_update_yes_flag := 'Y';
8428 ELSE
8429
8430 IF ((p_rev_ind_sch_fixed_date <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE
8431 AND p_rev_ind_sch_fixed_date IS NOT NULL) OR (p_rev_ind_sch_fixed_date IS NULL))
8432 THEN
8433 IF (p_rev_ind_sch_fixed_date <> NVL(l_task_rec.rev_ind_sch_fixed_date,
8434 PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE) OR (p_rev_ind_sch_fixed_date IS NULL))
8435 THEN
8436 l_statement := l_statement ||
8437 --bug 2955326
8438 /*
8439 ' rev_ind_sch_fixed_date = to_date('''||
8440 to_char(p_rev_ind_sch_fixed_date,'YYYY/MM/DD')||
8441 ''', ''YYYY/MM/DD''),';
8442 */
8443 ' rev_ind_sch_fixed_date = :rv_ind_sch_fx_dt,';
8444 l_b_rv_ind_sch_fx_dt_fg := 'Y';
8445 --end bug 2955326
8446 l_update_yes_flag := 'Y';
8447 END IF;
8448 END IF;
8449 END IF;
8450
8451 IF l_inv_rate_sch_type = 'P' and l_task_rec.INV_IND_SCH_FIXED_DATE IS NOT NULL
8452 THEN
8453 l_statement := l_statement ||
8454 ' INV_IND_SCH_FIXED_DATE = '''''||',';
8455 l_update_yes_flag := 'Y';
8456 ELSE
8457 IF ((p_inv_ind_sch_fixed_date <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE
8458 AND p_inv_ind_sch_fixed_date IS NOT NULL) OR (p_inv_ind_sch_fixed_date IS NULL))
8459 THEN
8460 IF (p_inv_ind_sch_fixed_date <> NVL(l_task_rec.inv_ind_sch_fixed_date,
8461 PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE) OR (p_inv_ind_sch_fixed_date IS NULL))
8462 THEN
8463 --bug 2955326
8464 /*
8465 l_statement := l_statement ||
8466 ' inv_ind_sch_fixed_date = to_date('''||
8467 to_char(p_inv_ind_sch_fixed_date,'YYYY/MM/DD')||
8468 ''', ''YYYY/MM/DD''),';
8469 */
8470 l_statement := l_statement ||
8471 ' inv_ind_sch_fixed_date = :iv_ind_sch_fx_dt,';
8472 l_b_iv_ind_sch_fx_dt_fg := 'Y';
8473 --end bug 2955326
8474 l_update_yes_flag := 'Y';
8475 END IF;
8476 END IF;
8477 END IF;
8478
8479 ELSE /*Else when laboR schedule type and non labor schedule type are both <> 'I'*/
8480
8481 l_statement := l_statement ||
8482 ' REV_IND_RATE_SCH_ID = '''''||',';
8483
8484
8485 l_statement := l_statement ||
8486 ' INV_IND_RATE_SCH_ID = '''''||',';
8487
8488
8489 l_statement := l_statement ||
8490 ' REV_IND_SCH_FIXED_DATE = '''''||',';
8491
8492 l_statement := l_statement ||
8493 ' INV_IND_SCH_FIXED_DATE = '''''||',';
8494 l_update_yes_flag := 'Y';
8495 END IF;
8496
8497 IF l_out_nl_labor_sch_type ='B' THEN
8498
8499 IF p_nl_bill_rate_org_id <>
8500 PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
8501 AND p_nl_bill_rate_org_id IS NOT NULL THEN
8502 IF p_nl_bill_rate_org_id <> NVL(l_task_rec.NON_LABOR_BILL_RATE_ORG_ID,PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM)
8503 THEN
8504 --bug 2955326
8505 /*
8506 l_statement := l_statement || ' NON_LABOR_BILL_RATE_ORG_ID = ' ||
8507 TO_CHAR(p_nl_bill_rate_org_id)||',';
8508 */
8509 l_statement := l_statement || ' NON_LABOR_BILL_RATE_ORG_ID = :nl_bl_rt_org_id ,';
8510 l_b_nl_bl_rt_org_id_fg := 'Y';
8511 --end bug 2955326
8512 l_update_yes_flag := 'Y';
8513 END IF;
8514 END IF;
8515
8516 IF p_non_lab_std_bill_rt_sch_id <>
8517 PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
8518 AND p_non_lab_std_bill_rt_sch_id IS NOT NULL THEN
8519 IF NVL(p_non_lab_std_bill_rt_sch_id,
8520 PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM)
8521 <> NVL(l_task_rec.non_lab_std_bill_rt_sch_id,
8522 PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM)
8523 THEN
8524
8525 /*No data found is already handled in Validate_Schedule_Values*/
8526
8527 BEGIN
8528 SELECT std_bill_rate_schedule INTO l_std_bill_rate_schedule
8529 FROM pa_std_bill_rate_schedules_all
8530 WHERE bill_rate_sch_id=p_non_lab_std_bill_rt_sch_id;
8531
8532 --bug 2955326
8533 /*
8534 l_statement := l_statement || ' NON_LAB_STD_BILL_RT_SCH_ID = ' ||''''||
8535 TO_CHAR(p_non_lab_std_bill_rt_sch_id)||''''||',';
8536 l_statement := l_statement || ' NON_LABOR_STD_BILL_RATE_SCHDL = ' ||''''||
8537 RTRIM(l_std_bill_rate_schedule)||''''||',';
8538 */
8539 --end bug 2955326
8540 l_statement := l_statement || ' NON_LAB_STD_BILL_RT_SCH_ID = :nl_std_bl_rt_sch_id,';
8541 l_statement := l_statement || ' NON_LABOR_STD_BILL_RATE_SCHDL = :nl_std_bl_rt_sch,';
8542 l_b_nl_std_bl_rt_sch_fg := 'Y';
8543 l_update_yes_flag := 'Y';
8544 EXCEPTION
8545 WHEN NO_DATA_FOUND THEN
8546 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
8547 THEN
8548 pa_interface_utils_pub.map_new_amg_msg
8549 ( p_old_message_code => 'PA_PRJ_NL_SCHEDULE_ID'
8550 ,p_msg_attribute => 'CHANGE'
8551 ,p_resize_flag => 'Y'
8552 ,p_msg_context => 'TASK'
8553 ,p_attribute1 => l_amg_segment1
8554 ,p_attribute2 => l_amg_task_number
8555 ,p_attribute3 => ''
8556 ,p_attribute4 => ''
8557 ,p_attribute5 => '');
8558 END IF;
8559 RAISE FND_API.G_EXC_ERROR;
8560 END;
8561 END IF;
8562 END IF;
8563
8564 /* Should be able to update null*/
8565 IF ((p_nl_schedule_fixed_date <>
8566 PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE
8567 AND p_nl_schedule_fixed_date IS NOT NULL) OR (p_nl_schedule_fixed_date IS NULL)) THEN
8568 IF (p_nl_schedule_fixed_date
8569 <> NVL(l_task_rec.NON_LABOR_SCHEDULE_FIXED_DATE,
8570 PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE) OR (p_nl_schedule_fixed_date IS NULL))
8571 THEN
8572 --bug 2955326
8573 /*
8574 l_statement := l_statement ||
8575 ' NON_LABOR_SCHEDULE_FIXED_DATE = to_date('''||
8576 to_char(p_nl_schedule_fixed_date,'YYYY/MM/DD')||
8577 ''', ''YYYY/MM/DD''),';
8578 */
8579 l_statement := l_statement ||
8580 ' NON_LABOR_SCHEDULE_FIXED_DATE = :nl_sch_fx_dt,';
8581 l_b_nl_sch_fx_dt_fg := 'Y';
8582 --end bug 2955326
8583 l_update_yes_flag := 'Y';
8584 END IF;
8585 END IF;
8586
8587 /* Should be able to update null*/
8588 IF ((p_nl_schedule_discount <>
8589 PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
8590 AND p_nl_schedule_discount IS NOT NULL) OR (p_nl_schedule_discount IS NULL)) THEN
8591 -- Bug 9073661
8592 IF (p_nl_schedule_discount <> NVL(l_task_rec.non_labor_schedule_discount,PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM)
8593 OR p_nl_schedule_discount IS NULL)
8594 THEN
8595 --bug 2955326
8596 /*
8597 l_statement := l_statement ||
8598 ' NON_LABOR_SCHEDULE_DISCOUNT = '||''''||
8599 TO_CHAR(p_nl_schedule_discount)||''''||',';
8600 */
8601 l_statement := l_statement ||
8602 ' NON_LABOR_SCHEDULE_DISCOUNT = :nl_sch_dsnt,';
8603 l_b_nl_sch_dsnt_fg := 'Y';
8604 l_update_yes_flag := 'Y';
8605 --end bug 2955326
8606 END IF;
8607 END IF;
8608
8609 IF p_nl_schedule_discount IS NULL
8610 THEN
8611 l_statement := l_statement || ' NON_LABOR_DISC_REASON_CODE = ''''' ||',';
8612 l_update_yes_flag := 'Y';
8613 ELSE
8614 IF p_non_labor_disc_reason_code <>
8615 PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
8616 AND p_non_labor_disc_reason_code IS NOT NULL THEN
8617 IF NVL(p_non_labor_disc_reason_code,
8618 PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR)
8619 <> NVL(l_task_rec.non_labor_disc_reason_code,
8620 PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR)
8621 THEN
8622 --bug 2955326
8623 /*
8624 l_statement := l_statement ||
8625 ' NON_LABOR_DISC_REASON_CODE = '||''''||
8626 RTRIM(p_non_labor_disc_reason_code)||''''||',';
8627 */
8628 l_statement := l_statement ||
8629 ' NON_LABOR_DISC_REASON_CODE = :nl_disc_rsn_cd ,';
8630 l_b_nl_disc_rsn_cd_fg := 'Y';
8631 --end bug 2955326
8632 l_update_yes_flag := 'Y';
8633 END IF;
8634 END IF;
8635 END IF;
8636
8637 ELSE /*Else when the non labor schedule type <> 'B'*/
8638
8639 l_statement := l_statement || ' NON_LAB_STD_BILL_RT_SCH_ID = '''''||',';
8640
8641 l_statement := l_statement || ' NON_LABOR_SCHEDULE_FIXED_DATE = ''''' ||',';
8642
8643 l_statement := l_statement || ' NON_LABOR_SCHEDULE_DISCOUNT = '''''||',';
8644
8645 l_statement := l_statement || ' NON_LABOR_DISC_REASON_CODE = ''''' ||',';
8646
8647 l_statement := l_statement || ' NON_LABOR_STD_BILL_RATE_SCHDL = ''''' ||',';
8648
8649 l_statement := l_statement || ' NON_LABOR_BILL_RATE_ORG_ID = ''''' ||',';
8650 l_update_yes_flag := 'Y';
8651 END IF;
8652
8653 /*Code for bug 2802984 ends*/
8654
8655 -- Update other date fields which are maintained only in the external system
8656
8657 -- update Actual start date and actual finish date
8658
8659 IF (p_actual_start_date IS NOT NULL AND
8660 p_actual_start_date <>
8661 PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE ) AND
8662 NVL(l_task_rec.actual_start_date,
8663 PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE) <>
8664 p_actual_start_date THEN
8665 --bug 2955326
8666 /*
8667 l_statement := l_statement ||
8668 ' ACTUAL_START_DATE = to_date('''||
8669 to_char(p_actual_start_date,'YYYY/MM/DD')||
8670 ''', ''YYYY/MM/DD''),';
8671 */
8672 l_statement := l_statement ||
8673 ' ACTUAL_START_DATE = :act_st_dt ,';
8674 l_b_act_st_dt_fg := 'Y';
8675 --end bug 2955326
8676 l_update_yes_flag := 'Y';
8677 END IF;
8678
8679
8680 IF (p_actual_finish_date IS NOT NULL AND
8681 p_actual_finish_date <>
8682 PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE ) AND
8683 NVL(l_task_rec.actual_finish_date,
8684 PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE) <>
8685 p_actual_finish_date THEN
8686 --bug 2955326
8687 /*
8688 l_statement := l_statement ||
8689 ' ACTUAL_FINISH_DATE = to_date('''||
8690 to_char(p_actual_finish_date,'YYYY/MM/DD')||
8691 ''', ''YYYY/MM/DD''),';
8692 */
8693 l_statement := l_statement ||
8694 ' ACTUAL_FINISH_DATE = :act_fn_dt ,';
8695 l_b_act_fn_dt_fg := 'Y';
8696 l_update_yes_flag := 'Y';
8697 END IF;
8698
8699 -- update early start date and early finish date
8700 IF (p_early_start_date IS NOT NULL AND
8701 p_early_start_date <>
8702 PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE ) AND
8703 NVL(l_task_rec.early_start_date,
8704 PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE) <>
8705 p_early_start_date THEN
8706 --bug 2955326
8707 /*
8708 l_statement := l_statement ||
8709 ' EARLY_START_DATE = to_date('''||
8710 to_char(p_early_start_date,'YYYY/MM/DD')||
8711 ''', ''YYYY/MM/DD''),';
8712 */
8713 l_statement := l_statement ||
8714 ' EARLY_START_DATE = :erly_st_dt ,';
8715 l_b_erly_st_dt_fg := 'Y';
8716 --end bug 2955326
8717 l_update_yes_flag := 'Y';
8718 END IF;
8719
8720 IF (p_early_finish_date IS NOT NULL AND
8721 p_early_finish_date <>
8722 PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE ) AND
8723 NVL(l_task_rec.early_finish_date,
8724 PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE) <>
8725 p_early_finish_date THEN
8726 --bug 2955326
8727 /*
8728 l_statement := l_statement ||
8729 ' EARLY_FINISH_DATE = to_date('''||
8730 to_char(p_early_finish_date,'YYYY/MM/DD')||
8731 ''', ''YYYY/MM/DD''),';
8732 */
8733 l_statement := l_statement ||
8734 ' EARLY_FINISH_DATE = :erly_fn_dt ,';
8735 l_b_erly_fn_dt_fg := 'Y';
8736 --end bug 2955326
8737 l_update_yes_flag := 'Y';
8738 END IF;
8739
8740 -- update Late start date and Late finish date
8741
8742 IF (p_late_start_date IS NOT NULL AND
8743 p_late_start_date <>
8744 PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE ) AND
8745 NVL(l_task_rec.late_start_date,
8746 PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE) <>
8747 p_late_start_date THEN
8748 --bug 2955326
8749 /*
8750 l_statement := l_statement ||
8751 ' LATE_START_DATE = to_date('''||
8752 to_char(p_late_start_date,'YYYY/MM/DD')||
8753 ''', ''YYYY/MM/DD''),';
8754 */
8755 l_statement := l_statement ||
8756 ' LATE_START_DATE = :lt_st_dt ,';
8757 l_b_lt_st_dt_fg := 'Y';
8758 --end bug 2955326
8759
8760 l_update_yes_flag := 'Y';
8761 END IF;
8762
8763
8764 IF (p_late_finish_date IS NOT NULL AND
8765 p_late_finish_date <>
8766 PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE ) AND
8767 NVL(l_task_rec.late_finish_date,
8768 PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE) <>
8769 p_late_finish_date THEN
8770 --bug 2955326
8771 /*
8772 l_statement := l_statement ||
8773 ' LATE_FINISH_DATE = to_date('''||
8774 to_char(p_late_finish_date,'YYYY/MM/DD')||
8775 ''', ''YYYY/MM/DD''),';
8776 */
8777 l_statement := l_statement ||
8778 ' LATE_FINISH_DATE = :lt_fn_dt ,';
8779 l_b_lt_fn_dt_fg := 'Y';
8780 --end bug 2955326
8781 l_update_yes_flag := 'Y';
8782 END IF;
8783
8784
8785 -- update scheduled start date and scheduled finish date
8786
8787 IF (p_scheduled_start_date IS NOT NULL AND
8788 p_scheduled_start_date <>
8789 PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE ) AND
8790 NVL(l_task_rec.scheduled_start_date,
8791 PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE) <>
8792 p_scheduled_start_date THEN
8793 --bug 2955326
8794 /*
8795 l_statement := l_statement ||
8796 ' SCHEDULED_START_DATE = to_date('''||
8797 to_char(p_scheduled_start_date,'YYYY/MM/DD')||
8798 ''', ''YYYY/MM/DD''),';
8799 */
8800 l_statement := l_statement ||
8801 ' SCHEDULED_START_DATE = :sch_st_dt ,';
8802 l_b_sch_st_dt_fg := 'Y';
8803 --end bug 2955326
8804 l_update_yes_flag := 'Y';
8805 END IF;
8806
8807
8808 IF (p_scheduled_finish_date IS NOT NULL AND
8809 p_scheduled_finish_date <>
8810 PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE ) AND
8811 NVL(l_task_rec.scheduled_finish_date,
8812 PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE) <>
8813 p_scheduled_finish_date THEN
8814 --bug 2955326
8815 /*
8816 l_statement := l_statement ||
8817 ' SCHEDULED_FINISH_DATE = to_date('''||
8818 to_char(p_scheduled_finish_date,'YYYY/MM/DD')||
8819 ''', ''YYYY/MM/DD''),';
8820 */
8821 l_statement := l_statement ||
8822 ' SCHEDULED_FINISH_DATE = :sch_fn_dt ,';
8823 l_b_sch_fn_dt_fg := 'Y';
8824 --end bug 2955326
8825 l_update_yes_flag := 'Y';
8826 END IF;
8827
8828 IF p_task_manager_person_id <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
8829 AND nvl(p_task_manager_person_id,PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM)
8830 <> nvl(l_task_rec.task_manager_person_id,PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM)
8831 AND p_task_manager_person_id IS NOT NULL --redundant, but added for clarity
8832 THEN
8833 /* code commented and added for the Bug#1688735, starts here */
8834 /* l_statement := l_statement ||
8835 ' TASK_MANAGER_PERSON_ID = '||TO_CHAR(l_new_parent_task_id)||','; */
8836 --bug 2955326
8837 /*
8838 l_statement := l_statement ||
8839 ' TASK_MANAGER_PERSON_ID = '||TO_CHAR(p_task_manager_person_id)||',';
8840 */
8841 l_statement := l_statement ||
8842 ' TASK_MANAGER_PERSON_ID = :tk_mgr_id ,';
8843 l_b_tk_mgr_id_fg := 'Y';
8844 --end bug 2955326;
8845 /* code commented and added for the Bug#1688735, ends here */
8846 l_update_yes_flag := 'Y';
8847
8848 END IF;
8849
8850
8851 -- Fix for Bug #1272548
8852 -- BURDEN SCHEDULE AND FIXED DATE
8853
8854 IF (p_cost_ind_rate_sch_id <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM)
8855 AND (nvl(p_cost_ind_rate_sch_id,PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM)
8856 <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM)
8857 AND p_cost_ind_rate_sch_id IS NOT NULL --redundant, but added for clarity
8858 THEN
8859 OPEN l_cost_ind_rate_sch_id_csr( p_cost_ind_rate_sch_id);
8860 FETCH l_cost_ind_rate_sch_id_csr INTO l_temp_var;
8861 IF l_cost_ind_rate_sch_id_csr%NOTFOUND
8862 THEN
8863 CLOSE l_cost_ind_rate_sch_id_csr;
8864 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
8865 THEN
8866 pa_interface_utils_pub.map_new_amg_msg
8867 ( p_old_message_code => 'PA_PRJ_INV_BURDEN_SCH_ID'
8868 ,p_msg_attribute => 'CHANGE'
8869 ,p_resize_flag => 'N'
8870 ,p_msg_context => 'TASK'
8871 ,p_attribute1 => l_amg_segment1
8872 ,p_attribute2 => l_amg_task_number
8873 ,p_attribute3 => ''
8874 ,p_attribute4 => ''
8875 ,p_attribute5 => '');
8876 END IF;
8877 RAISE FND_API.G_EXC_ERROR;
8878 END IF;
8879 CLOSE l_cost_ind_rate_sch_id_csr;
8880
8881 -- Add the Schedule ID to the update statement.
8882
8883 --bug 2955326
8884 /*
8885 l_statement := l_statement ||
8886 ' COST_IND_RATE_SCH_ID = '||''''||TO_CHAR(p_cost_ind_rate_sch_id)||''''||',';
8887 */
8888 l_statement := l_statement ||
8889 ' COST_IND_RATE_SCH_ID = :cst_ind_rt_sch_id ,';
8890 l_b_cst_ind_rt_sch_id_fg := 'Y';
8891 --end bug 2955326
8892 l_update_yes_flag := 'Y';
8893
8894 END IF;
8895
8896 -- Start fix for Bug #1335417
8897
8898 IF (p_cost_ind_sch_fixed_date <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE)
8899 AND (nvl(p_cost_ind_sch_fixed_date,PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE)
8900 <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE)
8901 AND p_cost_ind_sch_fixed_date IS NOT NULL --redundant, but added for clarity
8902 THEN
8903 OPEN l_ind_rate_schedule_type_csr( p_cost_ind_rate_sch_id);
8904 FETCH l_ind_rate_schedule_type_csr INTO l_temp_var_sch_type;
8905 IF l_temp_var_sch_type = 'P'
8906 THEN
8907 CLOSE l_ind_rate_schedule_type_csr;
8908 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
8909 THEN
8910 pa_interface_utils_pub.map_new_amg_msg
8911 ( p_old_message_code => 'PA_CANT_FIX_DATE_PROV_SCH'
8912 ,p_msg_attribute => 'CHANGE'
8913 ,p_resize_flag => 'N'
8914 ,p_msg_context => 'TASK'
8915 ,p_attribute1 => l_amg_segment1
8916 ,p_attribute2 => l_amg_task_number
8917 ,p_attribute3 => ''
8918 ,p_attribute4 => ''
8919 ,p_attribute5 => '');
8920 END IF;
8921 RAISE FND_API.G_EXC_ERROR;
8922 END IF;
8923 CLOSE l_ind_rate_schedule_type_csr;
8924
8925 -- End fix for bug # 1335417
8926
8927 -- Add the Fixed Date to the update statement.
8928 --bug 2955326
8929 /*
8930 l_statement := l_statement ||
8931 ' COST_IND_SCH_FIXED_DATE = '||''''||TO_CHAR(p_cost_ind_sch_fixed_date)||''''||',';
8932
8933 */
8934 l_statement := l_statement ||
8935 ' COST_IND_SCH_FIXED_DATE = :cst_ind_sch_fx_dt ,';
8936 l_b_cst_ind_sch_fx_dt_fg := 'Y';
8937 --end bug 2955326
8938 l_update_yes_flag := 'Y';
8939
8940 END IF;
8941
8942 -- End Fix for Bug # 1272548
8943
8944
8945 IF l_update_yes_flag = 'Y'
8946 THEN
8947 -- 4156036 Moved the below code to set invoice_method, customer_id and get_etc_source_code columns
8948 -- before setting the where clause
8949 -- wrong update sql statment was getting generated
8950
8951 IF (p_invoice_method IS NOT NULL AND p_invoice_method <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR) AND
8952 NVL(l_task_rec.invoice_method, PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR) <> p_invoice_method
8953 THEN
8954 l_statement := l_statement || ' INVOICE_METHOD = :inv_md ,';
8955 l_inv_md_fg := 'Y';
8956 l_update_yes_flag := 'Y';
8957 END IF;
8958 /* Commented for Bug 4689326.
8959 IF (p_customer_id IS NOT NULL AND p_customer_id <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM) AND
8960 NVL(l_task_rec.customer_id, PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM) <> p_customer_id
8961 THEN
8962 l_statement := l_statement || ' CUSTOMER_ID = :cust_id ,';
8963 l_cust_id_fg := 'Y';
8964 l_update_yes_flag := 'Y';
8965 END IF;*/
8966 -- Start of Bug Number 4689326
8967 -- Cheking is done whether its a Parent task or child task .If it is Parent task changing all the child tasks customers also.
8968 IF (p_customer_id IS NOT NULL AND p_customer_id <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM) AND
8969 NVL(l_task_rec.customer_id, PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM) <> p_customer_id
8970 THEN
8971 IF l_task_rec.parent_task_id IS NULL THEN
8972 IF l_children_exist ='Y' THEN
8973 UPDATE PA_TASKS SET customer_id = p_customer_id
8974 WHERE top_task_id=l_task_rec.task_id AND not(task_id =l_task_rec.task_id);
8975 END IF;
8976 l_statement := l_statement || ' CUSTOMER_ID = :cust_id ,';
8977 l_cust_id_fg := 'Y';
8978 l_update_yes_flag := 'Y';
8979 END IF;
8980 END IF;
8981
8982 IF (P_gen_etc_source_code IS NOT NULL AND p_gen_etc_source_code <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR) AND
8983 NVL(l_task_rec.gen_etc_source_code, PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR) <> p_gen_etc_source_code
8984 THEN
8985 l_statement := l_statement || ' GEN_ETC_SOURCE_CODE = :gen_etc_src_co ,';
8986 l_gen_etc_src_co_fg := 'Y';
8987 l_update_yes_flag := 'Y';
8988 END IF;
8989
8990 -- 4156036 end
8991
8992 /* code commented and added for the bug#1723839, starts here */
8993
8994 /* l_statement := l_statement ||
8995 ' LAST_UPDATE_DATE = '||''''||
8996 SYSDATE||''''||',';
8997 */
8998 l_statement := l_statement ||
8999 ' LAST_UPDATE_DATE = SYSDATE'||',';
9000
9001 /* code commented and added for the bug#1723839, ends here */
9002
9003
9004 l_statement := l_statement ||
9005 ' LAST_UPDATED_BY = :g_usr_id,'; --bug 2955326
9006 -- ' LAST_UPDATED_BY = '||G_USER_ID||','; --bug 2955326
9007
9008 l_statement := l_statement ||
9009 ' LAST_UPDATE_LOGIN = :g_login_id ';
9010 -- ' LAST_UPDATE_LOGIN = '||G_LOGIN_ID; --bug 2955326
9011
9012
9013 l_statement := l_statement ||
9014 ' WHERE PROJECT_ID = :prj_id ' ||
9015 ' AND TASK_ID = :tk_id ';
9016 -- ' WHERE PROJECT_ID = '||TO_CHAR(l_project_id) || --bug 2955326
9017 -- ' AND TASK_ID = '||TO_CHAR(l_task_id); --bug 2955326
9018
9019 -- 4156036 commented below code and added it above ( before setting the where clause of the update statement
9020 /*
9021 --Added by rtarway for BUG 4106154, copied from venkat's FP_M chnages. These should be before sql statement is parsed.
9022 IF (p_invoice_method IS NOT NULL AND p_invoice_method <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR) AND
9023 NVL(l_task_rec.invoice_method, PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR) <> p_invoice_method
9024 THEN
9025 l_statement := l_statement || ' INVOICE_METHOD = :inv_md ,';
9026 l_inv_md_fg := 'Y';
9027 l_update_yes_flag := 'Y';
9028 END IF;
9029
9030 IF (p_customer_id IS NOT NULL AND p_customer_id <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM) AND
9031 NVL(l_task_rec.customer_id, PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM) <> p_customer_id
9032 THEN
9033 l_statement := l_statement || ' CUSTOMER_ID = :cust_id ,';
9034 l_cust_id_fg := 'Y';
9035 l_update_yes_flag := 'Y';
9036 END IF;
9037
9038 IF (P_gen_etc_source_code IS NOT NULL AND p_gen_etc_source_code <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR) AND
9039 NVL(l_task_rec.gen_etc_source_code, PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR) <> p_gen_etc_source_code
9040 THEN
9041 l_statement := l_statement || ' GEN_ETC_SOURCE_CODE = :gen_etc_src_co ,';
9042 l_gen_etc_src_co_fg := 'Y';
9043 l_update_yes_flag := 'Y';
9044 END IF;
9045 --end add by rtarway for BUG 4106154
9046 */
9047 -- 4156036 end
9048
9049 /* dbms_output.put_line('Opening the cursor'); */
9050 /* dbms_output.put_line(to_char(length(l_statement))); */
9051 /* dbms_output.put_line('Statement: '||substr(l_statement,1,100)); */
9052 /* dbms_output.put_line('Statement: '||substr(l_statement,101,100)); */
9053 /* dbms_output.put_line('Statement: '||substr(l_statement,201,100)); */
9054
9055 l_cursor := dbms_sql.open_cursor;
9056 dbms_sql.parse(l_cursor, l_statement, dbms_sql.native);
9057
9058 /* -- Commented by rtarway for BUG 4106154, this should be before opening the curosr, otherwise ora error 'variables not bound' is thrown
9059 -- if we try to bind any of following params
9060 ----(Begin Venkat) FP_M changes ------------------------------------------------------------
9061
9062 IF (p_invoice_method IS NOT NULL AND p_invoice_method <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR) AND
9063 NVL(l_task_rec.invoice_method, PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR) <> p_invoice_method
9064 THEN
9065 l_statement := l_statement || ' INVOICE_METHOD = :inv_md ,';
9066 l_inv_md_fg := 'Y';
9067 l_update_yes_flag := 'Y';
9068 END IF;
9069
9070 IF (p_customer_id IS NOT NULL AND p_customer_id <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM) AND
9071 NVL(l_task_rec.customer_id, PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM) <> p_customer_id
9072 THEN
9073 l_statement := l_statement || ' CUSTOMER_ID = :cust_id ,';
9074 l_cust_id_fg := 'Y';
9075 l_update_yes_flag := 'Y';
9076 END IF;
9077
9078 IF (P_gen_etc_source_code IS NOT NULL AND p_gen_etc_source_code <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR) AND
9079 NVL(l_task_rec.gen_etc_source_code, PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR) <> p_gen_etc_source_code
9080 THEN
9081 l_statement := l_statement || ' GEN_ETC_SOURCE_CODE = :gen_etc_src_co ,';
9082 l_gen_etc_src_co_fg := 'Y';
9083 l_update_yes_flag := 'Y';
9084 END IF;
9085
9086 ----(End Venkat) FP_M changes ------------------------------------------------------------
9087 */
9088 --bug 2955326
9089 IF l_b_pm_tk_ref_flag = 'Y' THEN
9090 DBMS_SQL.BIND_VARIABLE(l_cursor, ':pm_tk_ref', RTRIM(p_pm_task_reference));
9091 END IF;
9092
9093 IF l_b_tk_nm_flag = 'Y' THEN
9094 DBMS_SQL.BIND_VARIABLE(l_cursor, ':tk_name', substrb(RTRIM(p_task_name),1,20)); -- bug 6193314
9095 END IF;
9096
9097 IF l_b_ln_tk_nm_flag = 'Y' THEN
9098 DBMS_SQL.BIND_VARIABLE(l_cursor, ':ln_tk_name', RTRIM(p_long_task_name));
9099 END IF;
9100
9101 IF l_b_tk_desc_flag = 'Y' THEN
9102 DBMS_SQL.BIND_VARIABLE(l_cursor, ':descrp', substrb(RTRIM(p_task_description),1,250)); --Bug 8821275
9103 END IF;
9104
9105 IF l_b_rdy_to_bill_flag = 'Y' THEN
9106 DBMS_SQL.BIND_VARIABLE(l_cursor, ':rdy_to_bill_fg', p_ready_to_bill_flag);
9107 END IF;
9108
9109 IF l_b_rdy_to_dist_flag = 'Y' THEN
9110 DBMS_SQL.BIND_VARIABLE(l_cursor, ':rdy_to_dist_fg', p_ready_to_distribute_flag);
9111 END IF;
9112
9113 IF l_b_lmt_to_txn_ctrl_fg = 'Y' THEN
9114 DBMS_SQL.BIND_VARIABLE(l_cursor, ':lmt_to_txn_ctrl_fg', p_limit_to_txn_controls_flag);
9115 END IF;
9116
9117 IF l_b_cryng_out_org_id_flag = 'Y' THEN
9118 DBMS_SQL.BIND_VARIABLE(l_cursor, ':cryng_out_org_id', p_carrying_out_organization_id);
9119 END IF;
9120
9121 IF l_b_chgble_fg = 'Y' THEN
9122 DBMS_SQL.BIND_VARIABLE(l_cursor, ':chgble_fg', p_chargeable_flag);
9123 END IF;
9124
9125 IF l_b_billable_fg = 'Y' THEN
9126 DBMS_SQL.BIND_VARIABLE(l_cursor, ':bil_fg', p_billable_flag);
9127 END IF;
9128
9129 IF l_b_srv_tp_cd_fg = 'Y' THEN
9130 DBMS_SQL.BIND_VARIABLE(l_cursor, ':srv_tp_cd', p_service_type_code);
9131 END IF;
9132
9133 IF l_b_tk_num_fg = 'Y' THEN
9134 --dbms_output.put_line('adding the bind variable'||'-'||p_task_number);
9135 /* bug #5243018: Reverting the fix in bug 4120380.
9136 DBMS_SQL.BIND_VARIABLE(l_cursor, ':tk_num','-'||p_task_number); */
9137 DBMS_SQL.BIND_VARIABLE(l_cursor, ':tk_num', substrb(p_task_number,1,25)); --bug 5733285
9138 /** CODE CHANGE BY ADITI for Bug 4120380.This is to prefix task_number with '-' so that
9139 PA_TASKS_U2 constraint can be overcome.After updating all the tasks in the script,
9140 code again updates the task_number, trimming the '-' added.**/
9141 END IF;
9142
9143 IF l_b_tk_st_dt_flag = 'Y' THEN
9144 DBMS_SQL.BIND_VARIABLE(l_cursor, ':st_dt', p_task_start_date);
9145 END IF;
9146
9147 IF l_b_comp_dt_fg = 'Y' THEN
9148 DBMS_SQL.BIND_VARIABLE(l_cursor, ':cmp_dt', p_task_completion_date);
9149 END IF;
9150
9151 IF l_b_prt_tk_id_fg = 'Y' THEN
9152 DBMS_SQL.BIND_VARIABLE(l_cursor, ':prt_tk_id', l_new_parent_task_id);
9153 END IF;
9154
9155 IF l_b_addr_id_fg = 'Y' THEN
9156 DBMS_SQL.BIND_VARIABLE(l_cursor, ':addr_id', p_address_id);
9157 END IF;
9158
9159 IF l_b_attr_cat_fg = 'Y' THEN
9160 DBMS_SQL.BIND_VARIABLE(l_cursor, ':attr_cat', RTRIM(l_attribute_category));
9161 END IF;
9162 --bug 6153503 start
9163 IF l_b_attr1_fg = 'Y' THEN
9164 DBMS_SQL.BIND_VARIABLE(l_cursor, ':attr1', RTRIM(l_attribute1));
9165 END IF;
9166
9167 IF l_b_attr2_fg = 'Y' THEN
9168 DBMS_SQL.BIND_VARIABLE(l_cursor, ':attr2', RTRIM(l_attribute2));
9169 END IF;
9170
9171 IF l_b_attr3_fg = 'Y' THEN
9172 DBMS_SQL.BIND_VARIABLE(l_cursor, ':attr3', RTRIM(l_attribute3));
9173 END IF;
9174
9175 IF l_b_attr4_fg = 'Y' THEN
9176 DBMS_SQL.BIND_VARIABLE(l_cursor, ':attr4', RTRIM(l_attribute4));
9177 END IF;
9178
9179 IF l_b_attr5_fg = 'Y' THEN
9180 DBMS_SQL.BIND_VARIABLE(l_cursor, ':attr5', RTRIM(l_attribute5));
9181 END IF;
9182
9183 IF l_b_attr6_fg = 'Y' THEN
9184 DBMS_SQL.BIND_VARIABLE(l_cursor, ':attr6', RTRIM(l_attribute6));
9185 END IF;
9186
9187 IF l_b_attr7_fg = 'Y' THEN
9188 DBMS_SQL.BIND_VARIABLE(l_cursor, ':attr7', RTRIM(l_attribute7));
9189 END IF;
9190
9191 IF l_b_attr8_fg = 'Y' THEN
9192 DBMS_SQL.BIND_VARIABLE(l_cursor, ':attr8', RTRIM(l_attribute8));
9193 END IF;
9194
9195 IF l_b_attr9_fg = 'Y' THEN
9196 DBMS_SQL.BIND_VARIABLE(l_cursor, ':attr9', RTRIM(l_attribute9));
9197 END IF;
9198
9199 IF l_b_attr10_fg = 'Y' THEN
9200 DBMS_SQL.BIND_VARIABLE(l_cursor, ':attr10', RTRIM(l_attribute10));
9201 END IF;
9202 --bug 6153503 end
9203
9204 IF l_b_al_x_chg_fg = 'Y' THEN
9205 DBMS_SQL.BIND_VARIABLE(l_cursor, ':all_x_chg_fg', RTRIM(p_allow_cross_charge_flag));
9206 END IF;
9207
9208 IF l_b_prj_rt_tp_fg = 'Y' THEN
9209 DBMS_SQL.BIND_VARIABLE(l_cursor, ':prj_rt_tp', RTRIM(p_project_rate_type));
9210 END IF;
9211
9212 IF l_b_prj_rt_dt_fg = 'Y' THEN
9213 DBMS_SQL.BIND_VARIABLE(l_cursor, ':prj_rt_dt', p_project_rate_date);
9214 END IF;
9215
9216 IF l_b_cc_proc_lbr_fg = 'Y' THEN
9217 DBMS_SQL.BIND_VARIABLE(l_cursor, ':cc_proc_lbr_fg', RTRIM(l_cc_process_labor_flag)); -- Changed to local variable for Bug 5395048
9218 END IF;
9219
9220 IF l_b_lbr_tp_sch_id_fg = 'Y' THEN
9221 DBMS_SQL.BIND_VARIABLE(l_cursor, ':lbr_tp_sch_id', p_labor_tp_schedule_id);
9222 END IF;
9223
9224 IF l_b_lbr_tp_fx_dt_fg = 'Y' THEN
9225 DBMS_SQL.BIND_VARIABLE(l_cursor, ':lbr_tp_fx_dt', p_labor_tp_fixed_date);
9226 END IF;
9227
9228 IF l_b_cc_proc_nl_fg = 'Y' THEN
9229 DBMS_SQL.BIND_VARIABLE(l_cursor, ':cc_proc_nl_fg', RTRIM(l_cc_process_nl_flag)); -- Changed to local variable for Bug 5395048
9230 END IF;
9231
9232 IF l_b_nl_tp_sch_id_fg = 'Y' THEN
9233 DBMS_SQL.BIND_VARIABLE(l_cursor, ':nl_tp_sch_id', p_nl_tp_schedule_id);
9234 END IF;
9235
9236 IF l_b_nl_tp_fx_dt_fg = 'Y' THEN
9237 DBMS_SQL.BIND_VARIABLE(l_cursor, ':nl_tp_fx_dt', p_nl_tp_fixed_date);
9238 END IF;
9239
9240 IF l_b_rcv_prj_inv_fg = 'Y' THEN
9241 DBMS_SQL.BIND_VARIABLE(l_cursor, ':rcv_prj_inv_fg', RTRIM(p_receive_project_invoice_flag));
9242 END IF;
9243
9244 IF l_b_wk_tp_id_fg = 'Y' THEN
9245 DBMS_SQL.BIND_VARIABLE(l_cursor, ':wk_tp_id', p_work_type_id);
9246 END IF;
9247
9248 IF l_b_emp_bill_rt_sch_id_fg = 'Y' THEN
9249 DBMS_SQL.BIND_VARIABLE(l_cursor, ':emp_bill_rt_sch_id', p_emp_bill_rate_schedule_id);
9250 END IF;
9251
9252 IF l_b_jb_bill_rt_sch_id_fg = 'Y' THEN
9253 DBMS_SQL.BIND_VARIABLE(l_cursor, ':jb_bill_rt_sch_id', p_job_bill_rate_schedule_id);
9254 END IF;
9255
9256 IF l_b_nn_lb_std_bl_rt_sch_id_fg = 'Y' THEN
9257 DBMS_SQL.BIND_VARIABLE(l_cursor, ':nn_lb_std_bl_rt_sch_id', p_non_lab_std_bill_rt_sch_id);
9258 END IF;
9259
9260 IF l_b_tkfnc_cst_rt_dt_fg = 'Y' THEN
9261 DBMS_SQL.BIND_VARIABLE(l_cursor, ':tkfnc_cst_rt_dt', p_taskfunc_cost_rate_date);
9262 END IF;
9263
9264 IF l_b_tkfnc_cst_rt_tp_fg = 'Y' THEN
9265 DBMS_SQL.BIND_VARIABLE(l_cursor, ':tkfnc_cst_rt_tp', RTRIM(p_taskfunc_cost_rate_type));
9266 END IF;
9267
9268 IF l_b_lbr_disc_rsn_cd_fg = 'Y' THEN
9269 DBMS_SQL.BIND_VARIABLE(l_cursor, ':lbr_disc_rsn_cd', RTRIM(p_labor_disc_reason_code));
9270 END IF;
9271
9272 IF l_b_nn_lbr_disc_rsn_cd_fg = 'Y' THEN
9273 DBMS_SQL.BIND_VARIABLE(l_cursor, ':nn_lbr_disc_rsn_cd', RTRIM(p_non_labor_disc_reason_code));
9274 END IF;
9275
9276 IF l_b_act_st_dt_fg = 'Y' THEN
9277 DBMS_SQL.BIND_VARIABLE(l_cursor, ':act_st_dt', p_actual_start_date);
9278 END IF;
9279
9280 IF l_b_act_fn_dt_fg = 'Y' THEN
9281 DBMS_SQL.BIND_VARIABLE(l_cursor, ':act_fn_dt', p_actual_finish_date);
9282 END IF;
9283
9284 IF l_b_erly_st_dt_fg = 'Y' THEN
9285 DBMS_SQL.BIND_VARIABLE(l_cursor, ':erly_st_dt', p_early_start_date);
9286 END IF;
9287
9288 IF l_b_erly_fn_dt_fg = 'Y' THEN
9289 DBMS_SQL.BIND_VARIABLE(l_cursor, ':erly_fn_dt', p_early_finish_date);
9290 END IF;
9291
9292 IF l_b_lt_st_dt_fg = 'Y' THEN
9293 DBMS_SQL.BIND_VARIABLE(l_cursor, ':lt_st_dt', p_late_start_date);
9294 END IF;
9295
9296 IF l_b_lt_fn_dt_fg = 'Y' THEN
9297 DBMS_SQL.BIND_VARIABLE(l_cursor, ':lt_fn_dt', p_late_finish_date);
9298 END IF;
9299
9300 IF l_b_sch_st_dt_fg = 'Y' THEN
9301 DBMS_SQL.BIND_VARIABLE(l_cursor, ':sch_st_dt', p_scheduled_start_date);
9302 END IF;
9303
9304 IF l_b_sch_fn_dt_fg = 'Y' THEN
9305 DBMS_SQL.BIND_VARIABLE(l_cursor, ':sch_fn_dt', p_scheduled_finish_date);
9306 END IF;
9307
9308 IF l_b_cst_ind_rt_sch_id_fg = 'Y' THEN
9309 DBMS_SQL.BIND_VARIABLE(l_cursor, ':cst_ind_rt_sch_id', p_cost_ind_rate_sch_id);
9310 END IF;
9311
9312 IF l_b_cst_ind_sch_fx_dt_fg = 'Y' THEN
9313 DBMS_SQL.BIND_VARIABLE(l_cursor, ':cst_ind_sch_fx_dt', p_cost_ind_sch_fixed_date);
9314 END IF;
9315
9316 IF l_b_ret_cst_fg = 'Y' THEN
9317 DBMS_SQL.BIND_VARIABLE(l_cursor, ':ret_cst_fg', RTRIM(p_retirement_cost_flag));
9318 END IF;
9319
9320 IF l_b_cint_elg_fg = 'Y' THEN
9321 DBMS_SQL.BIND_VARIABLE(l_cursor, ':cint_elg_fg', RTRIM(p_cint_eligible_flag));
9322 END IF;
9323
9324 IF l_b_cint_stp_dt_fg = 'Y' THEN
9325 DBMS_SQL.BIND_VARIABLE(l_cursor, ':cint_stp_dt', RTRIM(p_cint_stop_date));
9326 END IF;
9327
9328 IF l_b_lbr_sch_tp_fg = 'Y' THEN
9329 DBMS_SQL.BIND_VARIABLE(l_cursor, ':lbr_sch_tp', RTRIM(p_labor_sch_type));
9330 END IF;
9331
9332 IF l_b_n_lbr_sch_tp_fg = 'Y' THEN
9333 DBMS_SQL.BIND_VARIABLE(l_cursor, ':n_lbr_sch_tp', RTRIM(p_nl_sch_type));
9334 END IF;
9335
9336 IF l_b_emp_bill_rt_sch_id_fg2 = 'Y' THEN --IF l_b_jb_bill_rt_sch_id_fg2 = 'Y' THEN - Changed the IF Condition for the Bug:4692368
9337 DBMS_SQL.BIND_VARIABLE(l_cursor, ':emp_bill_rt_sch_id2', p_emp_bill_rate_schedule_id);
9338 END IF;
9339
9340 IF l_b_jb_bill_rt_sch_id_fg2 = 'Y' THEN
9341 DBMS_SQL.BIND_VARIABLE(l_cursor, ':jb_bill_rt_sch_id2', p_job_bill_rate_schedule_id);
9342 END IF;
9343
9344 IF l_b_lbr_sch_fx_dt = 'Y' THEN
9345 DBMS_SQL.BIND_VARIABLE(l_cursor, ':lbr_sch_fx_dt', p_labor_schedule_fixed_date);
9346 END IF;
9347
9348 IF l_b_lbr_sch_dsnt = 'Y' THEN
9349 DBMS_SQL.BIND_VARIABLE(l_cursor, ':lbr_sch_dsnt', p_labor_schedule_discount);
9350 END IF;
9351
9352 IF l_b_rv_ind_rt_sch_id_fg = 'Y' THEN
9353 DBMS_SQL.BIND_VARIABLE(l_cursor, ':rv_ind_rt_sch_id', p_rev_ind_rate_sch_id);
9354 END IF;
9355
9356 IF l_b_inv_ind_rt_sch_id_fg = 'Y' THEN
9357 DBMS_SQL.BIND_VARIABLE(l_cursor, ':inv_ind_rt_sch_id', p_inv_ind_rate_sch_id);
9358 END IF;
9359
9360 IF l_b_rv_ind_sch_fx_dt_fg = 'Y' THEN
9361 DBMS_SQL.BIND_VARIABLE(l_cursor, ':rv_ind_sch_fx_dt', p_rev_ind_sch_fixed_date);
9362 END IF;
9363
9364 IF l_b_iv_ind_sch_fx_dt_fg = 'Y' THEN
9365 DBMS_SQL.BIND_VARIABLE(l_cursor, ':iv_ind_sch_fx_dt', p_inv_ind_sch_fixed_date);
9366 END IF;
9367
9368 IF l_b_nl_bl_rt_org_id_fg = 'Y' THEN
9369 DBMS_SQL.BIND_VARIABLE(l_cursor, ':nl_bl_rt_org_id', p_nl_bill_rate_org_id);
9370 END IF;
9371
9372 IF l_b_nl_std_bl_rt_sch_fg = 'Y' THEN
9373 DBMS_SQL.BIND_VARIABLE(l_cursor, ':nl_std_bl_rt_sch_id', p_non_lab_std_bill_rt_sch_id);
9374 DBMS_SQL.BIND_VARIABLE(l_cursor, ':nl_std_bl_rt_sch', RTRIM(l_std_bill_rate_schedule));
9375 END IF;
9376
9377 IF l_b_nl_sch_fx_dt_fg = 'Y' THEN
9378 DBMS_SQL.BIND_VARIABLE(l_cursor, ':nl_sch_fx_dt', p_nl_schedule_fixed_date);
9379 END IF;
9380
9381 IF l_b_nl_sch_dsnt_fg = 'Y' THEN
9382 DBMS_SQL.BIND_VARIABLE(l_cursor, ':nl_sch_dsnt', p_nl_schedule_discount);
9383 END IF;
9384
9385 IF l_b_nl_disc_rsn_cd_fg = 'Y' THEN
9386 DBMS_SQL.BIND_VARIABLE(l_cursor, ':nl_disc_rsn_cd', RTRIM(p_non_labor_disc_reason_code));
9387 END IF;
9388
9389 IF l_b_tk_mgr_id_fg = 'Y' THEN
9390 DBMS_SQL.BIND_VARIABLE(l_cursor, ':tk_mgr_id', p_task_manager_person_id); --Changed from l_new_parent_task_id to p_task_manager_person_id for Bug 3913251
9391 END IF;
9392
9393 ----(Begin Venkat) FP_M changes ------------------------------------------------------------
9394
9395 IF l_inv_md_fg = 'Y'
9396 THEN
9397 -- 4177105 changed usage from l_invoice_method to p_invoice_method
9398 -- because l_invoice_method is unitialized
9399 DBMS_SQL.BIND_VARIABLE(l_cursor, ':inv_md', p_invoice_method);
9400 END IF;
9401
9402 IF l_cust_id_fg = 'Y'
9403 THEN
9404 -- Bug 4193259: Changed l_customer_id to p_customer_id
9405 DBMS_SQL.BIND_VARIABLE(l_cursor, ':cust_id', p_customer_id);
9406 END IF;
9407
9408 IF l_gen_etc_src_co_fg = 'Y'
9409 THEN
9410 DBMS_SQL.BIND_VARIABLE(l_cursor, ':gen_etc_src_co', p_gen_etc_source_code); /* Changed from l_gen_etc_source_code to p_gen_etc_source_code for bug 6025667 */
9411 END IF;
9412
9413 ----(End Venkat) FP_M changes ------------------------------------------------------------
9414
9415 DBMS_SQL.BIND_VARIABLE(l_cursor, ':g_usr_id', G_USER_ID);
9416 DBMS_SQL.BIND_VARIABLE(l_cursor, ':g_login_id', G_LOGIN_ID);
9417 DBMS_SQL.BIND_VARIABLE(l_cursor, ':prj_id', l_project_id);
9418 DBMS_SQL.BIND_VARIABLE(l_cursor, ':tk_id', l_task_id);
9419
9420 --end bug 2955326
9421
9422 l_rows := dbms_sql.execute(l_cursor);
9423 IF dbms_sql.is_open (l_cursor)
9424 THEN
9425 dbms_sql.close_cursor (l_cursor);
9426 END IF;
9427
9428 END IF;
9429
9430 /* 4490532
9431 --bug 4279634
9432 --if a lowest level task has sub-projects then make the chargeable flag to 'N'
9433 --This should be indepenedent of the above update.
9434 IF PA_RELATIONSHIP_UTILS.check_task_has_sub_proj(l_project_id,l_task_id,null) = 'Y'
9435 THEN
9436 UPDATE pa_tasks
9437 SET chargeable_flag = 'N'
9438 WHERE task_id = l_task_id;
9439 END IF;
9440 --end bug 4279634
9441 */
9442
9443
9444 p_out_pa_task_id := l_task_id;
9445 p_out_pm_task_reference := l_pm_task_reference;
9446
9447 CLOSE l_lock_rows_csr; --FYI: doesn't remove locks
9448
9449 IF l_tasks_restructured_flag = 'Y' THEN
9450 -- If a task has been moved to under another parent
9451 -- in the WBS structure, then need to indicate that
9452 -- Accumulation figures need to be refreshed for the project
9453 -- Hence modify the project level record in PA_PROJECT_ACCUM_HEADERS
9454 -- No need to check whether the project has been accumulated,since
9455 -- Update will not fail if the record is not found
9456
9457 UPDATE pa_project_accum_headers
9458 SET tasks_restructured_flag = 'Y' ,
9459 last_update_login = l_user_id,
9460 last_update_date = SYSDATE,
9461 last_updated_by = l_user_id
9462 WHERE project_id = l_project_id
9463 AND task_id = 0
9464 AND resource_list_member_id = 0;
9465 END IF;
9466
9467
9468 IF FND_API.to_boolean( p_commit )
9469 THEN
9470 COMMIT;
9471 END IF;
9472
9473
9474 EXCEPTION
9475
9476 WHEN FND_API.G_EXC_ERROR THEN
9477
9478 p_return_status := FND_API.G_RET_STS_ERROR ;
9479
9480 -- 4537865 RESET OUT PARAMS
9481 p_out_pa_task_id := NULL ;
9482 p_out_pm_task_reference := NULL ;
9483
9484 ROLLBACK TO Update_Task_pub;
9485
9486 FND_MSG_PUB.Count_And_Get
9487 ( p_count => p_msg_count ,
9488 p_data => p_msg_data );
9489
9490 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
9491
9492 p_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
9493 -- 4537865 RESET OUT PARAMS
9494 p_out_pa_task_id := NULL ;
9495 p_out_pm_task_reference := NULL ;
9496
9497 ROLLBACK TO Update_Task_pub;
9498
9499
9500 FND_MSG_PUB.Count_And_Get
9501 ( p_count => p_msg_count ,
9502 p_data => p_msg_data );
9503
9504 WHEN ROW_ALREADY_LOCKED THEN
9505
9506 ROLLBACK TO update_task_pub;
9507
9508 p_return_status := FND_API.G_RET_STS_ERROR;
9509 -- 4537865 RESET OUT PARAMS
9510 p_out_pa_task_id := NULL ;
9511 p_out_pm_task_reference := NULL ;
9512
9513
9514 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
9515 THEN
9516 FND_MESSAGE.SET_NAME('PA','PA_ROW_ALREADY_LOCKED_T_AMG');
9517 FND_MESSAGE.SET_TOKEN('PROJECT', l_amg_segment1);
9518 FND_MESSAGE.SET_TOKEN('TASK', l_amg_task_number);
9519 FND_MESSAGE.SET_TOKEN('ENTITY', G_TASK_CODE);
9520 FND_MSG_PUB.ADD;
9521 END IF;
9522
9523 FND_MSG_PUB.Count_And_Get
9524 ( p_count => p_msg_count ,
9525 p_data => p_msg_data );
9526
9527 WHEN OTHERS THEN
9528
9529 ROLLBACK TO Update_Task_pub;
9530 p_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
9531
9532 -- 4537865 RESET OUT PARAMS
9533 p_out_pa_task_id := NULL ;
9534 p_out_pm_task_reference := NULL ;
9535
9536
9537 IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
9538
9539 FND_MSG_PUB.add_exc_msg
9540 ( p_pkg_name => G_PKG_NAME
9541 , p_procedure_name => l_api_name );
9542
9543 END IF;
9544
9545 FND_MSG_PUB.Count_And_Get
9546 ( p_count => p_msg_count ,
9547 p_data => p_msg_data );
9548
9549 END update_one_task;
9550
9551 PROCEDURE delete_task1
9552 ( p_api_version_number IN NUMBER
9553 ,p_commit IN VARCHAR2 := FND_API.G_FALSE
9554 ,p_init_msg_list IN VARCHAR2 := FND_API.G_FALSE
9555 ,p_msg_count OUT NOCOPY NUMBER -- 4537865 Added nocopy hint
9556 ,p_msg_data OUT NOCOPY VARCHAR2 -- 4537865 Added nocopy hint
9557 ,p_return_status OUT NOCOPY VARCHAR2 -- 4537865 Added nocopy hint
9558 ,p_pm_product_code IN VARCHAR2 := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
9559 ,p_pm_project_reference IN VARCHAR2 := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
9560 ,p_pa_project_id IN NUMBER := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
9561 ,p_pm_task_reference IN VARCHAR2 := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
9562 ,p_pa_task_id IN NUMBER := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
9563 ,p_cascaded_delete_flag IN VARCHAR2 := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
9564 ,p_project_id OUT NOCOPY NUMBER -- 4537865 Added nocopy hint
9565 ,p_task_id OUT NOCOPY NUMBER -- 4537865 Added nocopy hint
9566 ,p_task_version_id IN NUMBER := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
9567 ,p_structure_type IN VARCHAR2 := 'FINANCIAL'
9568 )
9569 IS
9570
9571 CURSOR lock_tasks_csr ( p_task_id IN NUMBER )
9572 IS
9573 SELECT 'x'
9574 FROM pa_tasks
9575 START WITH task_id=p_task_id
9576 CONNECT BY PRIOR task_id=parent_task_id
9577 FOR UPDATE NOWAIT;
9578
9579
9580 l_api_name CONSTANT VARCHAR2(30) := 'delete_task';
9581 l_project_id NUMBER;
9582 l_task_id NUMBER;
9583 l_return_status VARCHAR2(1);
9584 l_message VARCHAR2(2000);
9585 l_delete_task_ok_flag VARCHAR2(1);
9586 l_cascaded_delete_flag VARCHAR2(1);
9587 l_err_code NUMBER(15);
9588 l_err_stage VARCHAR2(120);
9589 l_err_stack VARCHAR2(630);
9590 l_dummy VARCHAR2(1);
9591 l_msg_count NUMBER ;
9592 l_msg_data VARCHAR2(2000);
9593 l_function_allowed VARCHAR2(1);
9594 l_resp_id NUMBER := 0;
9595
9596 l_amg_segment1 VARCHAR2(25);
9597 l_amg_task_number VARCHAR2(50);
9598
9599 --needed to get the field values associated to a AMG message
9600
9601 CURSOR l_amg_project_csr
9602 (p_pa_project_id pa_projects.project_id%type)
9603 IS
9604 SELECT segment1
9605 FROM pa_projects p
9606 WHERE p.project_id = p_pa_project_id;
9607
9608 CURSOR l_amg_task_csr
9609 (p_pa_task_id pa_tasks.task_id%type)
9610 IS
9611 SELECT task_number
9612 FROM pa_tasks p
9613 WHERE p.task_id = p_pa_task_id;
9614
9615 -- 3801426 added local variable
9616 l_task_source_reference VARCHAR2(240);
9617
9618 -- 5263429 added local variable
9619 l_task_id_out pa_tasks.task_id%TYPE;
9620
9621 BEGIN
9622
9623
9624 -- Standard begin of API savepoint
9625
9626 SAVEPOINT delete_task_pub;
9627
9628 -- Standard call to check for call compatibility.
9629
9630 IF NOT FND_API.Compatible_API_Call ( g_api_version_number ,
9631 p_api_version_number ,
9632 l_api_name ,
9633 G_PKG_NAME )
9634 THEN
9635
9636 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
9637
9638 END IF;
9639
9640 -- pm_product_code is mandatory
9641
9642 --bug 2841158
9643 -- IF p_pm_product_code IS NULL
9644 -- OR p_pm_product_code = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
9645 IF p_pm_product_code IS NOT NULL
9646 AND p_pm_product_code = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
9647 --bug 2841158
9648 THEN
9649
9650 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
9651 THEN
9652 pa_interface_utils_pub.map_new_amg_msg
9653 ( p_old_message_code => 'PA_PRODUCT_CODE_IS_MISSING'
9654 ,p_msg_attribute => 'CHANGE'
9655 ,p_resize_flag => 'N'
9656 ,p_msg_context => 'GENERAL'
9657 ,p_attribute1 => ''
9658 ,p_attribute2 => ''
9659 ,p_attribute3 => ''
9660 ,p_attribute4 => ''
9661 ,p_attribute5 => '');
9662 END IF;
9663 RAISE FND_API.G_EXC_ERROR;
9664 END IF;
9665
9666 --bug 2841158
9667 IF p_pm_product_code <> 'WORKPLAN'
9668 AND p_pm_product_code IS NOT NULL
9669 AND p_pm_product_code <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
9670 THEN
9671 --bug 2841158
9672 /*added for bug no :2413400*/
9673 OPEN p_product_code_csr (p_pm_product_code);
9674 FETCH p_product_code_csr INTO l_pm_product_code;
9675 CLOSE p_product_code_csr;
9676 IF l_pm_product_code <> 'X'
9677 THEN
9678
9679 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
9680 THEN
9681 pa_interface_utils_pub.map_new_amg_msg
9682 ( p_old_message_code => 'PA_PRODUCT_CODE_IS_INVALID'
9683 ,p_msg_attribute => 'CHANGE'
9684 ,p_resize_flag => 'N'
9685 ,p_msg_context => 'GENERAL'
9686 ,p_attribute1 => ''
9687 ,p_attribute2 => ''
9688 ,p_attribute3 => ''
9689 ,p_attribute4 => ''
9690 ,p_attribute5 => '');
9691 END IF;
9692 p_return_status := FND_API.G_RET_STS_ERROR;
9693 RAISE FND_API.G_EXC_ERROR;
9694 END IF;
9695 END IF; --bug 2841158
9696
9697
9698 l_resp_id := FND_GLOBAL.Resp_id;
9699
9700 -- Actions performed using the APIs would be subject to
9701 -- function security. If the responsibility does not allow
9702 -- such functions to be executed, the API should not proceed further
9703 -- since the user does not have access to such functions
9704
9705
9706 PA_PM_FUNCTION_SECURITY_PUB.check_function_security
9707 (p_api_version_number => p_api_version_number,
9708 p_responsibility_id => l_resp_id,
9709 p_function_name => 'PA_PM_DELETE_TASK',
9710 p_msg_count => l_msg_count,
9711 p_msg_data => l_msg_data,
9712 p_return_status => l_return_status,
9713 p_function_allowed => l_function_allowed );
9714
9715 IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR
9716 THEN
9717 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
9718
9719 ELSIF l_return_status = FND_API.G_RET_STS_ERROR
9720 THEN
9721 RAISE FND_API.G_EXC_ERROR;
9722 END IF;
9723 IF l_function_allowed = 'N' THEN
9724 pa_interface_utils_pub.map_new_amg_msg
9725 ( p_old_message_code => 'PA_FUNCTION_SECURITY_ENFORCED'
9726 ,p_msg_attribute => 'CHANGE'
9727 ,p_resize_flag => 'Y'
9728 ,p_msg_context => 'GENERAL'
9729 ,p_attribute1 => ''
9730 ,p_attribute2 => ''
9731 ,p_attribute3 => ''
9732 ,p_attribute4 => ''
9733 ,p_attribute5 => '');
9734 p_return_status := FND_API.G_RET_STS_ERROR;
9735 RAISE FND_API.G_EXC_ERROR;
9736 END IF;
9737
9738 -- Initialize the message table if requested.
9739
9740 IF FND_API.TO_BOOLEAN( p_init_msg_list )
9741 THEN
9742
9743 FND_MSG_PUB.initialize;
9744
9745 END IF;
9746
9747
9748 -- Set API return status to success
9749
9750 p_return_status := FND_API.G_RET_STS_SUCCESS;
9751
9752
9753 -- Assumption: the convert API's will do validity checks for project_id and task_id
9754
9755
9756 pa_project_pvt.convert_pm_projref_to_id
9757 (p_pm_project_reference => p_pm_project_reference
9758 ,p_pa_project_id => p_pa_project_id
9759 ,p_out_project_id => l_project_id
9760 ,p_return_status => l_return_status );
9761
9762 IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR
9763 THEN
9764 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
9765
9766 ELSIF l_return_status = FND_API.G_RET_STS_ERROR
9767 THEN
9768 RAISE FND_API.G_EXC_ERROR;
9769 END IF;
9770
9771 IF p_structure_type = 'FINANCIAL'
9772 THEN
9773 -- 5262740 Changed PA_PROJECT_PVT.Convert_pm_taskref_to_id to PA_PROJECT_PVT.Convert_pm_taskref_to_id_all
9774 pa_project_pvt.convert_pm_taskref_to_id_all
9775 (p_pa_project_id => l_project_id
9776 ,p_pa_task_id => p_pa_task_id
9777 ,p_pm_task_reference => p_pm_task_reference
9778 ,p_out_task_id => l_task_id
9779 ,p_return_status => l_return_status );
9780
9781 IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR
9782 THEN
9783 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
9784
9785 ELSIF l_return_status = FND_API.G_RET_STS_ERROR
9786 THEN
9787 RAISE FND_API.G_EXC_ERROR;
9788 END IF;
9789
9790 -- Get segment1 for AMG messages
9791
9792 OPEN l_amg_project_csr( l_project_id );
9793 FETCH l_amg_project_csr INTO l_amg_segment1;
9794 CLOSE l_amg_project_csr;
9795 /*
9796 OPEN l_amg_task_csr( l_task_id );
9797 FETCH l_amg_task_csr INTO l_amg_task_number;
9798 CLOSE l_amg_task_csr;
9799 */
9800 l_amg_task_number := pa_interface_utils_pub.get_task_number_amg
9801 (p_task_number=> ''
9802 ,p_task_reference => p_pm_task_reference
9803 ,p_task_id => l_task_id);
9804
9805 pa_task_utils.check_delete_task_ok(x_task_id => l_task_id,
9806 --bug 3010538 x_validation_mode => 'R', --bug 2947492
9807 x_err_code => l_err_code,
9808 x_err_stage => l_err_stage,
9809 x_err_stack => l_err_stack);
9810 IF l_err_code > 0
9811 then
9812
9813 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
9814 THEN
9815
9816 IF NOT pa_project_pvt.check_valid_message(l_err_stage)
9817 THEN
9818 pa_interface_utils_pub.map_new_amg_msg
9819 ( p_old_message_code => 'PA_DELETE_TASK_FAILED'
9820 ,p_msg_attribute => 'CHANGE'
9821 ,p_resize_flag => 'N'
9822 ,p_msg_context => 'TASK'
9823 ,p_attribute1 => l_amg_segment1
9824 ,p_attribute2 => l_amg_task_number
9825 ,p_attribute3 => ''
9826 ,p_attribute4 => ''
9827 ,p_attribute5 => '');
9828 ELSE
9829 pa_interface_utils_pub.map_new_amg_msg
9830 ( p_old_message_code => l_err_stage
9831 ,p_msg_attribute => 'SPLIT'
9832 ,p_resize_flag => 'Y'
9833 ,p_msg_context => 'DELT'
9834 ,p_attribute1 => l_amg_segment1
9835 ,p_attribute2 => l_amg_task_number
9836 ,p_attribute3 => ''
9837 ,p_attribute4 => ''
9838 ,p_attribute5 => '');
9839 END IF;
9840
9841 END IF;
9842
9843 RAISE FND_API.G_EXC_ERROR;
9844
9845 ELSIF l_err_code < 0
9846 then
9847
9848 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
9849 THEN
9850 pa_interface_utils_pub.map_new_amg_msg
9851 ( p_old_message_code => 'PA_DELETE_TASK_FAILED'
9852 ,p_msg_attribute => 'CHANGE'
9853 ,p_resize_flag => 'N'
9854 ,p_msg_context => 'TASK'
9855 ,p_attribute1 => l_amg_segment1
9856 ,p_attribute2 => l_amg_task_number
9857 ,p_attribute3 => ''
9858 ,p_attribute4 => ''
9859 ,p_attribute5 => '');
9860 END IF;
9861
9862 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
9863
9864 end IF;
9865
9866 --Call plannable task api here bug 2947492
9867
9868 PA_PROJ_TASK_STRUC_PUB.delete_fin_plan_from_task(
9869 p_task_id => l_task_id
9870 ,p_project_id => l_project_id
9871 ,P_calling_module => 'AMG'
9872 ,x_msg_count => l_msg_count
9873 ,x_msg_data => l_msg_data
9874 ,x_return_status => l_return_status);
9875
9876 IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
9877 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
9878 ELSIF l_return_status = FND_API.G_RET_STS_ERROR THEN
9879 RAISE FND_API.G_EXC_ERROR;
9880 END IF;
9881 --End bug 2947492
9882
9883 --lock the task row and all it's children before it is going to be deleted / updated
9884 OPEN lock_tasks_csr( l_task_id );
9885
9886
9887 --when p_cascaded_delete_flag is not passed or NULL, default to 'N'
9888 --if not correct value is passed, error out.
9889
9890 IF p_cascaded_delete_flag = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
9891 OR p_cascaded_delete_flag IS NULL
9892 THEN
9893 l_cascaded_delete_flag := 'N';
9894
9895 ELSIF p_cascaded_delete_flag NOT IN ('Y','y','N','n')
9896 THEN
9897
9898 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
9899 THEN
9900 pa_interface_utils_pub.map_new_amg_msg
9901 ( p_old_message_code => 'PA_CASCADE_FLAG_INVALID'
9902 ,p_msg_attribute => 'CHANGE'
9903 ,p_resize_flag => 'N'
9904 ,p_msg_context => 'PROJ'
9905 ,p_attribute1 => l_amg_segment1
9906 ,p_attribute2 => ''
9907 ,p_attribute3 => ''
9908 ,p_attribute4 => ''
9909 ,p_attribute5 => '');
9910 END IF;
9911
9912 RAISE FND_API.G_EXC_ERROR;
9913
9914 ELSE
9915 l_cascaded_delete_flag := p_cascaded_delete_flag;
9916
9917 END IF;
9918
9919 IF l_cascaded_delete_flag IN ('Y','y')
9920 THEN
9921
9922 pa_project_core.delete_task( x_task_id => l_task_id
9923 --bug 3010538 ,x_validation_mode => 'R' --bug 2947492
9924 ,x_err_code => l_err_code
9925 ,x_err_stage => l_err_stage
9926 ,x_err_stack => l_err_stack );
9927
9928 IF l_err_code > 0
9929 THEN
9930
9931 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
9932 THEN
9933
9934 IF NOT pa_project_pvt.check_valid_message(l_err_stage)
9935 THEN
9936 pa_interface_utils_pub.map_new_amg_msg
9937 ( p_old_message_code => 'PA_DELETE_TASK_FAILED'
9938 ,p_msg_attribute => 'CHANGE'
9939 ,p_resize_flag => 'N'
9940 ,p_msg_context => 'TASK'
9941 ,p_attribute1 => l_amg_segment1
9942 ,p_attribute2 => l_amg_task_number
9943 ,p_attribute3 => ''
9944 ,p_attribute4 => ''
9945 ,p_attribute5 => '');
9946 ELSE
9947 pa_interface_utils_pub.map_new_amg_msg
9948 ( p_old_message_code => l_err_stage
9949 ,p_msg_attribute => 'SPLIT'
9950 ,p_resize_flag => 'Y'
9951 ,p_msg_context => 'DELT'
9952 ,p_attribute1 => l_amg_segment1
9953 ,p_attribute2 => l_amg_task_number
9954 ,p_attribute3 => ''
9955 ,p_attribute4 => ''
9956 ,p_attribute5 => '');
9957 END IF;
9958
9959 END IF;
9960
9961 RAISE FND_API.G_EXC_ERROR;
9962
9963 ELSIF l_err_code < 0
9964 THEN
9965
9966 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
9967 THEN
9968 pa_interface_utils_pub.map_new_amg_msg
9969 ( p_old_message_code => 'PA_DELETE_TASK_FAILED'
9970 ,p_msg_attribute => 'CHANGE'
9971 ,p_resize_flag => 'N'
9972 ,p_msg_context => 'TASK'
9973 ,p_attribute1 => l_amg_segment1
9974 ,p_attribute2 => l_amg_task_number
9975 ,p_attribute3 => ''
9976 ,p_attribute4 => ''
9977 ,p_attribute5 => '');
9978 END IF;
9979
9980 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
9981
9982 END IF;
9983
9984 ELSE
9985
9986 pa_project_pvt.Delete_One_Task
9987 (p_task_id => l_task_id,
9988 p_return_status => l_return_status,
9989 p_msg_count => p_msg_count,
9990 p_msg_data => p_msg_data );
9991
9992 IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR
9993 THEN
9994 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
9995
9996 ELSIF l_return_status = FND_API.G_RET_STS_ERROR
9997 THEN
9998 RAISE FND_API.G_EXC_ERROR;
9999 END IF;
10000
10001
10002 END IF;
10003
10004 CLOSE lock_tasks_csr;
10005
10006 --bug 2765115
10007
10008 --only deletes from pa_proj_elements. There is a check in pa_task_pvt1.delete_task_version api not to delete from pa_tasks if called from AMG.
10009 PA_PROJ_TASK_STRUC_PUB.delete_task_structure
10010 (
10011 p_calling_module => 'AMG'
10012 ,p_task_id => l_task_id
10013 ,p_task_version_id => p_task_version_id
10014 ,p_project_id => l_project_id
10015 ,x_msg_count => l_msg_count
10016 ,x_msg_data => l_msg_data
10017 ,x_return_status => l_return_status);
10018
10019 IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
10020 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
10021 ELSIF l_return_status = FND_API.G_RET_STS_ERROR THEN
10022 RAISE FND_API.G_EXC_ERROR;
10023 END IF;
10024
10025 --bug 2765115
10026
10027 p_project_id := l_project_id;
10028 p_task_id := l_task_id;
10029
10030 -- rbruno bug 9484327 - start
10031 ELSIF p_structure_type = 'WORKPLAN' OR p_structure_type = 'SHARED' THEN
10032 -- rbruno bug 9484327 - end
10033
10034 -- added for bug# 3801426
10035 -- validating task reference to id
10036
10037 IF p_pa_task_id = PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM THEN
10038 l_task_id := NULL;
10039 ELSE
10040 l_task_id := p_pa_task_id;
10041 END IF;
10042
10043
10044 IF p_pm_task_reference = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR THEN
10045 l_task_source_reference := NULL;
10046 ELSE
10047 l_task_source_reference := p_pm_task_reference;
10048 END IF;
10049
10050 IF ( l_task_id IS NOT NULL OR l_task_source_reference IS NOT NULL ) THEN
10051
10052 /* Bug Fix 5263429
10053
10054 Issue:
10055
10056 The task deletion from MSP was erroring out.
10057
10058 Analysis:
10059
10060 The task deletion calls the PA_PROJECT_PUB.DELETE_TASK API. This was returning an error with status 'E' and error
10061 message PA_TASK_REF_AND_ID_MISSING. There is a call to Convert_pm_taskref_to_id_all API in the PA_PROJECT_PVT.DELETE_TASK1
10062 in the WORKPLAN portion of the code.
10063 Please note that the same local variable l_task_id is used for both IN and OUT parameters. Due to the NOCOPY hint the variable
10064 l_task_id was becoming null when the control enters into the Convert_pm_taskref_to_id_all API. As the required parameter was
10065 NULL the API was raising the above error resulting into an error and stopping the task deletion.
10066
10067 Solution:
10068
10069 In order to avoid this issue a new local variable is created and used to capture the OUT parameters value in the call and
10070 then assign the value back to the old l_task_id variable.
10071 */
10072
10073 PA_PROJECT_PVT.Convert_pm_taskref_to_id_all (
10074 p_pa_project_id => l_project_id
10075 , p_structure_type => 'WORKPLAN'
10076 , p_pa_task_id => l_task_id
10077 , p_pm_task_reference => l_task_source_reference
10078 , p_out_task_id => l_task_id_out
10079 , p_return_status => l_return_status );
10080
10081 l_task_id:= l_task_id_out;
10082 -- End of Bug Fix 5263429
10083
10084 IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
10085 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
10086 ELSIF l_return_status = FND_API.G_RET_STS_ERROR THEN
10087 RAISE FND_API.G_EXC_ERROR;
10088 END IF;
10089 END IF;
10090
10091 -- end for bug# 3801426
10092
10093 --Project Structures Integration
10094
10095 PA_PROJ_TASK_STRUC_PUB.delete_task_structure
10096 (
10097 p_calling_module => 'AMG'
10098 ,p_task_id => l_task_id -- changed bug# 3801426 earlierr p_task_id was used
10099 ,p_task_version_id => p_task_version_id
10100 ,p_project_id => l_project_id --bug 2765115
10101 ,p_structure_type => p_structure_type -- added for bug# 3801426 , earlier structure_type was not passed
10102 ,x_msg_count => l_msg_count
10103 ,x_msg_data => l_msg_data
10104 ,x_return_status => l_return_status);
10105
10106 IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
10107 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
10108 ELSIF l_return_status = FND_API.G_RET_STS_ERROR THEN
10109 RAISE FND_API.G_EXC_ERROR;
10110 END IF;
10111
10112 p_project_id := l_project_id;
10113 p_task_id := p_task_id;
10114
10115 --Project Structures Integration
10116 END IF; --<< p_structrue_type >>
10117
10118 IF FND_API.to_boolean( p_commit )
10119 THEN
10120 COMMIT;
10121 END IF;
10122
10123
10124 EXCEPTION
10125
10126 WHEN FND_API.G_EXC_ERROR
10127 THEN
10128 ROLLBACK TO delete_task_pub;
10129
10130 p_return_status := FND_API.G_RET_STS_ERROR;
10131
10132 -- 4537865 RESET OUT PARAMS
10133 p_project_id := NULL ;
10134 p_task_id := NULL ;
10135
10136 FND_MSG_PUB.Count_And_Get
10137 ( p_count => p_msg_count ,
10138 p_data => p_msg_data );
10139
10140 WHEN FND_API.G_EXC_UNEXPECTED_ERROR
10141 THEN
10142 ROLLBACK TO delete_task_pub;
10143
10144 p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
10145
10146 -- 4537865 RESET OUT PARAMS
10147 p_project_id := NULL ;
10148 p_task_id := NULL ;
10149
10150 FND_MSG_PUB.Count_And_Get
10151 ( p_count => p_msg_count ,
10152 p_data => p_msg_data );
10153
10154 WHEN ROW_ALREADY_LOCKED
10155 THEN
10156 ROLLBACK TO delete_task_pub;
10157
10158 p_return_status := FND_API.G_RET_STS_ERROR;
10159
10160 -- 4537865 RESET OUT PARAMS
10161 p_project_id := NULL ;
10162 p_task_id := NULL ;
10163
10164 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
10165 THEN
10166 FND_MESSAGE.SET_NAME('PA','PA_ROW_ALREADY_LOCKED_T_AMG');
10167 FND_MESSAGE.SET_TOKEN('PROJECT', l_amg_segment1);
10168 FND_MESSAGE.SET_TOKEN('TASK', l_amg_task_number);
10169 FND_MESSAGE.SET_TOKEN('ENTITY', G_TASK_CODE);
10170 FND_MSG_PUB.ADD;
10171 END IF;
10172
10173 FND_MSG_PUB.Count_And_Get
10174 ( p_count => p_msg_count ,
10175 p_data => p_msg_data );
10176
10177 WHEN OTHERS THEN
10178 ROLLBACK TO delete_task_pub;
10179
10180 p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
10181
10182 -- 4537865 RESET OUT PARAMS
10183 p_project_id := NULL ;
10184 p_task_id := NULL ;
10185
10186 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
10187 THEN
10188 FND_MSG_PUB.add_exc_msg
10189 ( p_pkg_name => G_PKG_NAME
10190 , p_procedure_name => l_api_name );
10191
10192 END IF;
10193
10194 FND_MSG_PUB.Count_And_Get
10195 ( p_count => p_msg_count ,
10196 p_data => p_msg_data );
10197
10198 END delete_task1;
10199
10200 --------------------------------------------------------------------------------
10201 -- Name: approve_project1
10202 -- Type: PL/SQL Procedure
10203 -- Decscription: This procedure will set the project status to approved.
10204 --
10205 -- Called Subprograms:
10206 --
10207 -- History: 27-FEB-97 L. de Werker Created
10208 --
10209 --
10210 PROCEDURE approve_project1
10211 ( p_api_version_number IN NUMBER
10212 ,p_commit IN VARCHAR2 := FND_API.G_FALSE
10213 ,p_init_msg_list IN VARCHAR2 := FND_API.G_FALSE
10214 ,p_msg_count OUT NOCOPY NUMBER -- 4537865 Added nocopy hint
10215 ,p_msg_data OUT NOCOPY VARCHAR2 -- 4537865 Added nocopy hint
10216 ,p_return_status OUT NOCOPY VARCHAR2 -- 4537865 Added nocopy hint
10217 ,p_pm_product_code IN VARCHAR2 := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
10218 ,p_pm_project_reference IN VARCHAR2 := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
10219 ,p_pa_project_id IN NUMBER := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
10220 )
10221 IS
10222
10223 BEGIN
10224
10225 NULL;
10226
10227 END approve_project1;
10228
10229
10230 --------------------------------------------------------------------------------
10231 --Name: delete_project1
10232 --Type: Procedure
10233 --Description: This procedure can be used to delete a project
10234 --
10235 --
10236 --Called subprograms:
10237 --
10238 --
10239 --
10240 --History:
10241 -- 19-AUG-1996 R. Krishnamurthy Created
10242 --
10243
10244 PROCEDURE delete_project1
10245 ( p_api_version_number IN NUMBER
10246 ,p_commit IN VARCHAR2 := FND_API.G_FALSE
10247 ,p_init_msg_list IN VARCHAR2 := FND_API.G_FALSE
10248 ,p_msg_count OUT NOCOPY NUMBER -- 4537865 Added nocopy hint
10249 ,p_msg_data OUT NOCOPY VARCHAR2 -- 4537865 Added nocopy hint
10250 ,p_return_status OUT NOCOPY VARCHAR2 -- 4537865 Added nocopy hint
10251 ,p_pm_product_code IN VARCHAR2 := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
10252 ,p_pm_project_reference IN VARCHAR2 := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
10253 ,p_pa_project_id IN NUMBER := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
10254 )
10255 IS
10256
10257 CURSOR l_lock_rows_csr( p_project_id NUMBER)
10258 IS
10259 SELECT 'x'
10260 FROM pa_projects
10261 WHERE project_id = p_project_id
10262 FOR UPDATE NOWAIT;
10263
10264 --needed to get the field values associated to a AMG message
10265
10266 CURSOR l_amg_project_csr
10267 (p_pa_project_id pa_projects.project_id%type)
10268 IS
10269 SELECT segment1
10270 FROM pa_projects p
10271 WHERE p.project_id = p_pa_project_id;
10272
10273 l_amg_segment1 VARCHAR2(25);
10274
10275 l_api_name CONSTANT VARCHAR2(30) := 'delete_project';
10276 l_project_id NUMBER;
10277 l_return_status VARCHAR2(1);
10278 l_message VARCHAR2(2000);
10279 l_err_code NUMBER(15);
10280 l_err_stage VARCHAR2(120);
10281 l_err_stack VARCHAR2(630);
10282 l_dummy VARCHAR2(1);
10283 l_msg_count NUMBER ;
10284 l_msg_data VARCHAR2(2000);
10285 l_function_allowed VARCHAR2(1);
10286 l_resp_id NUMBER := 0;
10287 l_user_id NUMBER := 0;
10288 l_module_name VARCHAR2(80);
10289
10290 BEGIN
10291
10292 -- Standard begin of API savepoint
10293
10294 SAVEPOINT delete_project_pub;
10295
10296 -- Standard call to check for call compatibility.
10297
10298 IF NOT FND_API.Compatible_API_Call ( g_api_version_number ,
10299 p_api_version_number ,
10300 l_api_name ,
10301 G_PKG_NAME )
10302 THEN
10303
10304 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
10305
10306
10307 END IF;
10308
10309 -- Initialize the message table if requested.
10310
10311 IF FND_API.TO_BOOLEAN( p_init_msg_list )
10312 THEN
10313
10314 FND_MSG_PUB.initialize;
10315
10316 END IF;
10317
10318 -- pm_product_code is mandatory
10319
10320 --bug 2841158
10321 -- IF p_pm_product_code IS NULL
10322 -- OR p_pm_product_code = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
10323 IF p_pm_product_code IS NOT NULL
10324 AND p_pm_product_code = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
10325 --bug 2841158
10326 THEN
10327
10328 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
10329 THEN
10330 pa_interface_utils_pub.map_new_amg_msg
10331 ( p_old_message_code => 'PA_PRODUCT_CODE_IS_MISSING'
10332 ,p_msg_attribute => 'CHANGE'
10333 ,p_resize_flag => 'N'
10334 ,p_msg_context => 'GENERAL'
10335 ,p_attribute1 => ''
10336 ,p_attribute2 => ''
10337 ,p_attribute3 => ''
10338 ,p_attribute4 => ''
10339 ,p_attribute5 => '');
10340 END IF;
10341 RAISE FND_API.G_EXC_ERROR;
10342 END IF;
10343
10344 --bug 2841158
10345 IF p_pm_product_code <> 'WORKPLAN'
10346 AND p_pm_product_code IS NOT NULL
10347 AND p_pm_product_code <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
10348 THEN
10349 --bug 2841158
10350 /*added for bug no :2413400*/
10351 OPEN p_product_code_csr (p_pm_product_code);
10352 FETCH p_product_code_csr INTO l_pm_product_code;
10353 CLOSE p_product_code_csr;
10354 IF l_pm_product_code <> 'X'
10355 THEN
10356
10357 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
10358 THEN
10359 pa_interface_utils_pub.map_new_amg_msg
10360 ( p_old_message_code => 'PA_PRODUCT_CODE_IS_INVALID'
10361 ,p_msg_attribute => 'CHANGE'
10362 ,p_resize_flag => 'N'
10363 ,p_msg_context => 'GENERAL'
10364 ,p_attribute1 => ''
10365 ,p_attribute2 => ''
10366 ,p_attribute3 => ''
10367 ,p_attribute4 => ''
10368 ,p_attribute5 => '');
10369 END IF;
10370 p_return_status := FND_API.G_RET_STS_ERROR;
10371 RAISE FND_API.G_EXC_ERROR;
10372 END IF;
10373 END IF; --bug 2841158
10374
10375 -- Set API return status to success
10376
10377 p_return_status := FND_API.G_RET_STS_SUCCESS;
10378 l_resp_id := FND_GLOBAL.Resp_id;
10379 l_user_id := FND_GLOBAL.User_id;
10380 --l_module_name := p_pm_product_code||'.'||'PA_PM_DELETE_PROJECT';
10381 l_module_name := 'PA_PM_DELETE_PROJECT';
10382
10383
10384 -- As part of enforcing project security, which would determine
10385 -- whether the user has the necessary privileges to delete the project
10386 -- need to call the pa_security package
10387
10388 pa_security.initialize (X_user_id => l_user_id,
10389 X_calling_module => l_module_name);
10390
10391 -- Actions performed using the APIs would be subject to
10392 -- function security. If the responsibility does not allow
10393 -- such functions to be executed, the API should not proceed further
10394 -- since the user does not have access to such functions
10395
10396
10397 PA_PM_FUNCTION_SECURITY_PUB.check_function_security
10398 (p_api_version_number => p_api_version_number,
10399 p_responsibility_id => l_resp_id,
10400 p_function_name => 'PA_PM_DELETE_PROJECT',
10401 p_msg_count => l_msg_count,
10402 p_msg_data => l_msg_data,
10403 p_return_status => l_return_status,
10404 p_function_allowed => l_function_allowed );
10405
10406 IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR
10407 THEN
10408 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
10409
10410 ELSIF l_return_status = FND_API.G_RET_STS_ERROR
10411 THEN
10412 RAISE FND_API.G_EXC_ERROR;
10413 END IF;
10414 IF l_function_allowed = 'N' THEN
10415 pa_interface_utils_pub.map_new_amg_msg
10416 ( p_old_message_code => 'PA_FUNCTION_SECURITY_ENFORCED'
10417 ,p_msg_attribute => 'CHANGE'
10418 ,p_resize_flag => 'Y'
10419 ,p_msg_context => 'GENERAL'
10420 ,p_attribute1 => ''
10421 ,p_attribute2 => ''
10422 ,p_attribute3 => ''
10423 ,p_attribute4 => ''
10424 ,p_attribute5 => '');
10425 p_return_status := FND_API.G_RET_STS_ERROR;
10426 RAISE FND_API.G_EXC_ERROR;
10427 END IF;
10428
10429
10430 --Assumption: convert API will do validity check for project_id
10431
10432
10433 pa_project_pvt.convert_pm_projref_to_id
10434 (p_pm_project_reference => p_pm_project_reference
10435 ,p_pa_project_id => p_pa_project_id
10436 ,p_out_project_id => l_project_id
10437 ,p_return_status => l_return_status );
10438
10439 IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR
10440 THEN
10441 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
10442
10443 ELSIF l_return_status = FND_API.G_RET_STS_ERROR
10444 THEN
10445 RAISE FND_API.G_EXC_ERROR;
10446 END IF;
10447
10448 -- Now verify whether project security allows the user to delete
10449 -- the project
10450
10451 IF pa_security.allow_query (x_project_id => l_project_id ) = 'N' THEN
10452
10453 -- The user does not have query privileges on this project
10454 -- Hence, cannot delete the project.Raise error
10455
10456 pa_interface_utils_pub.map_new_amg_msg
10457 ( p_old_message_code => 'PA_PROJECT_SECURITY_ENFORCED'
10458 ,p_msg_attribute => 'CHANGE'
10459 ,p_resize_flag => 'Y'
10460 ,p_msg_context => 'GENERAL'
10461 ,p_attribute1 => ''
10462 ,p_attribute2 => ''
10463 ,p_attribute3 => ''
10464 ,p_attribute4 => ''
10465 ,p_attribute5 => '');
10466 p_return_status := FND_API.G_RET_STS_ERROR;
10467 RAISE FND_API.G_EXC_ERROR;
10468 ELSE
10469 -- If the user has query privileges, then check whether
10470 -- update privileges are also available
10471 IF pa_security.allow_update (x_project_id => l_project_id ) = 'N' THEN
10472
10473 -- The user does not have update privileges on this project
10474 -- Hence , raise error
10475
10476 pa_interface_utils_pub.map_new_amg_msg
10477 ( p_old_message_code => 'PA_PROJECT_SECURITY_ENFORCED'
10478 ,p_msg_attribute => 'CHANGE'
10479 ,p_resize_flag => 'Y'
10480 ,p_msg_context => 'GENERAL'
10481 ,p_attribute1 => ''
10482 ,p_attribute2 => ''
10483 ,p_attribute3 => ''
10484 ,p_attribute4 => ''
10485 ,p_attribute5 => '');
10486 p_return_status := FND_API.G_RET_STS_ERROR;
10487 RAISE FND_API.G_EXC_ERROR;
10488 END IF;
10489 END IF;
10490
10491 -- Get segment1 for AMG messages
10492
10493 OPEN l_amg_project_csr( l_project_id );
10494 FETCH l_amg_project_csr INTO l_amg_segment1;
10495 CLOSE l_amg_project_csr;
10496
10497 --lock the project
10498 OPEN l_lock_rows_csr( l_project_id );
10499 CLOSE l_lock_rows_csr;
10500
10501
10502 pa_project_utils.check_delete_project_ok
10503 (x_project_id => l_project_id,
10504 --bug 3010538 x_validation_mode => 'R', --bug 2947492
10505 x_err_code => l_err_code,
10506 x_err_stage => l_err_stage,
10507 x_err_stack => l_err_stack);
10508
10509 IF l_err_code <> 0 THEN
10510
10511 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
10512
10513 IF NOT pa_project_pvt.check_valid_message(l_err_stage)
10514 THEN
10515 pa_interface_utils_pub.map_new_amg_msg
10516 ( p_old_message_code => 'PA_DELETE_PROJECT_FAILED'
10517 ,p_msg_attribute => 'CHANGE'
10518 ,p_resize_flag => 'N'
10519 ,p_msg_context => 'PROJ'
10520 ,p_attribute1 => l_amg_segment1
10521 ,p_attribute2 => ''
10522 ,p_attribute3 => ''
10523 ,p_attribute4 => ''
10524 ,p_attribute5 => '');
10525 ELSE
10526 pa_interface_utils_pub.map_new_amg_msg
10527 ( p_old_message_code => l_err_stage
10528 ,p_msg_attribute => 'SPLIT'
10529 ,p_resize_flag => 'Y'
10530 ,p_msg_context => 'DELP'
10531 ,p_attribute1 => l_amg_segment1
10532 ,p_attribute2 => ''
10533 ,p_attribute3 => ''
10534 ,p_attribute4 => ''
10535 ,p_attribute5 => '');
10536 END IF;
10537
10538 END IF;
10539
10540 IF l_err_code > 0 THEN
10541
10542 RAISE FND_API.G_EXC_ERROR;
10543
10544 ELSIF l_err_code < 0 THEN
10545
10546 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
10547
10548 END IF;
10549
10550 END IF;
10551
10552 pa_project_core.delete_project (x_project_id => l_project_id,
10553 --bug 3010538 x_validation_mode => 'R', --bug 2947492
10554 x_err_code => l_err_code,
10555 x_err_stage => l_err_stage,
10556 x_err_stack => l_err_stack,
10557 x_commit => p_commit);
10558 IF l_err_code > 0 THEN
10559 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
10560 IF NOT pa_project_pvt.check_valid_message(l_err_stage) THEN
10561
10562 pa_interface_utils_pub.map_new_amg_msg
10563 ( p_old_message_code => 'PA_DELETE_PROJECT_FAILED'
10564 ,p_msg_attribute => 'CHANGE'
10565 ,p_resize_flag => 'N'
10566 ,p_msg_context => 'PROJ'
10567 ,p_attribute1 => l_amg_segment1
10568 ,p_attribute2 => ''
10569 ,p_attribute3 => ''
10570 ,p_attribute4 => ''
10571 ,p_attribute5 => '');
10572 ELSE
10573 pa_interface_utils_pub.map_new_amg_msg
10574 ( p_old_message_code => l_err_stage
10575 ,p_msg_attribute => 'SPLIT'
10576 ,p_resize_flag => 'Y'
10577 ,p_msg_context => 'DELP'
10578 ,p_attribute1 => l_amg_segment1
10579 ,p_attribute2 => ''
10580 ,p_attribute3 => ''
10581 ,p_attribute4 => ''
10582 ,p_attribute5 => '');
10583
10584 END IF;
10585 END IF;
10586 RAISE FND_API.G_EXC_ERROR;
10587 ELSIF l_err_code < 0 THEN
10588 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
10589 THEN
10590
10591 pa_interface_utils_pub.map_new_amg_msg
10592 ( p_old_message_code => 'PA_DELETE_PROJECT_FAILED'
10593 ,p_msg_attribute => 'CHANGE'
10594 ,p_resize_flag => 'N'
10595 ,p_msg_context => 'PROJ'
10596 ,p_attribute1 => l_amg_segment1
10597 ,p_attribute2 => ''
10598 ,p_attribute3 => ''
10599 ,p_attribute4 => ''
10600 ,p_attribute5 => '');
10601 END IF;
10602 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
10603 END IF;
10604
10605 IF FND_API.to_boolean( p_commit )
10606 THEN
10607 COMMIT;
10608 END IF;
10609
10610 EXCEPTION
10611
10612 WHEN FND_API.G_EXC_ERROR
10613 THEN
10614 ROLLBACK TO delete_project_pub;
10615
10616 p_return_status := FND_API.G_RET_STS_ERROR;
10617
10618 FND_MSG_PUB.Count_And_Get
10619 ( p_count => p_msg_count ,
10620 p_data => p_msg_data );
10621
10622 WHEN FND_API.G_EXC_UNEXPECTED_ERROR
10623 THEN
10624 ROLLBACK TO delete_project_pub;
10625
10626 p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
10627
10628 FND_MSG_PUB.Count_And_Get
10629 ( p_count => p_msg_count ,
10630 p_data => p_msg_data );
10631
10632 WHEN ROW_ALREADY_LOCKED THEN
10633
10634 ROLLBACK TO delete_project_pub;
10635
10636 p_return_status := FND_API.G_RET_STS_ERROR;
10637
10638 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
10639 THEN
10640 FND_MESSAGE.SET_NAME('PA','PA_ROW_ALREADY_LOCKED_P_AMG');
10641 FND_MESSAGE.SET_TOKEN('PROJECT', l_amg_segment1);
10642 FND_MESSAGE.SET_TOKEN('ENTITY', G_PROJECT_CODE);
10643 FND_MSG_PUB.ADD;
10644 END IF;
10645 FND_MSG_PUB.Count_And_Get
10646 ( p_count => p_msg_count ,
10647 p_data => p_msg_data );
10648
10649 WHEN OTHERS THEN
10650
10651 ROLLBACK TO delete_project_pub;
10652
10653 p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
10654
10655 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
10656 THEN
10657 FND_MSG_PUB.add_exc_msg
10658 ( p_pkg_name => G_PKG_NAME
10659 , p_procedure_name => l_api_name
10660 , p_error_text => SUBSTRB(SQLERRM, 1, 240) ); -- 4537865 Changed substr to substrb
10661
10662 FND_MSG_PUB.add;
10663 END IF;
10664
10665 FND_MSG_PUB.Count_And_Get
10666 ( p_count => p_msg_count ,
10667 p_data => p_msg_data );
10668
10669 END delete_project1;
10670
10671 --------------------------------------------------------------------------------
10672
10673
10674 -- anlee org role changes
10675 --====================================================================================
10676 --Name: add_org_roles
10677 --Type: Procedure
10678 --Description: This procedure can be used to add org roles
10679 -- to a new or already existing project using
10680 -- the overridable view.
10681 --
10682 --Called subprograms: none
10683 --
10684 --
10685 --
10686 --History:
10687 -- 20-MAR-2002 anlee Created
10688
10689 PROCEDURE add_org_roles
10690 ( p_return_status OUT NOCOPY VARCHAR2 , -- 4537865 Added nocopy hint
10691 p_pa_source_template_id IN NUMBER ,
10692 p_project_id IN NUMBER ,
10693 p_org_roles IN pa_project_pub.project_role_tbl_type )
10694 IS
10695 --Bug#10124493 - project_role_type validation should be from pa_project_role_types_vl view
10696 CURSOR l_project_role_types_csr (p_role_type IN VARCHAR2)
10697 IS
10698 SELECT 'x' FROM
10699 pa_project_role_types_vl role,
10700 fnd_lookup_values lookup
10701 WHERE role.project_role_type = p_role_type
10702 and lookup.lookup_type='PA_ORGANIZATION_ROLE_CLASSES'
10703 and role.role_party_class=lookup.lookup_code
10704 and lookup.language=role.language;
10705 --Bug#10124493 - Modification end
10706
10707 l_api_name CONSTANT VARCHAR2(30) := 'add_org_roles';
10708 i BINARY_INTEGER :=0;
10709 j BINARY_INTEGER :=0;
10710
10711 l_dummy VARCHAR2(1);
10712 l_amg_segment1 VARCHAR2(25);
10713 l_completion_date DATE;
10714 v_start_date_active DATE;
10715 v_end_date_active DATE;
10716 v_project_role_id NUMBER;
10717 v_project_role_type VARCHAR2(20);
10718 v_person_id NUMBER;
10719 v_null_number NUMBER;
10720 v_null_char VARCHAR2(1);
10721 x_return_status VARCHAR2(255);
10722 x_msg_count NUMBER;
10723 x_msg_data VARCHAR2(255);
10724 x_project_party_id NUMBER;
10725 x_resource_id NUMBER;
10726 l_wf_item_type VARCHAR2(30);
10727 l_wf_type VARCHAR2(30);
10728 l_wf_party_process VARCHAR2(30);
10729 l_assignment_id NUMBER;
10730 --needed to get the field values associated to a AMG message
10731
10732 CURSOR l_amg_project_csr
10733 (p_pa_project_id pa_projects.project_id%type)
10734 IS
10735 SELECT segment1,COMPLETION_DATE
10736 FROM pa_projects p
10737 WHERE p.project_id = p_pa_project_id;
10738
10739 BEGIN
10740
10741 -- Standard begin of API savepoint
10742
10743 SAVEPOINT add_org_roles_pvt;
10744
10745
10746 -- Set API return status to success
10747
10748 p_return_status := FND_API.G_RET_STS_SUCCESS;
10749
10750 -- Get segment1 for AMG messages
10751
10752 OPEN l_amg_project_csr( p_project_id );
10753 FETCH l_amg_project_csr INTO l_amg_segment1,l_completion_date;
10754 CLOSE l_amg_project_csr;
10755
10756 i := p_org_roles.first;
10757
10758 WHILE i IS NOT NULL LOOP
10759
10760 -- Check whether this is a valid organization
10761
10762 IF (p_org_roles(i).person_id <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM) AND
10763 (p_org_roles(i).person_id IS NOT NULL) THEN
10764 IF check_valid_organization (p_org_roles(i).person_id) = 'N'
10765 THEN
10766 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
10767 THEN
10768 pa_interface_utils_pub.map_new_amg_msg
10769 ( p_old_message_code => 'PA_INVALID_ORGANIZATION'
10770 ,p_msg_attribute => 'CHANGE'
10771 ,p_resize_flag => 'N'
10772 ,p_msg_context => 'PROJ'
10773 ,p_attribute1 => l_amg_segment1
10774 ,p_attribute2 => ''
10775 ,p_attribute3 => ''
10776 ,p_attribute4 => ''
10777 ,p_attribute5 => '');
10778 END IF;
10779 RAISE FND_API.G_EXC_ERROR;
10780 END IF;
10781
10782 -- validate the role type
10783 OPEN l_project_role_types_csr (p_org_roles(i).project_role_type);
10784 FETCH l_project_role_types_csr INTO l_dummy;
10785 IF l_project_role_types_csr%NOTFOUND THEN
10786 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
10787 THEN
10788 pa_interface_utils_pub.map_new_amg_msg
10789 ( p_old_message_code => 'PA_INVALID_ROLE_TYPE'
10790 ,p_msg_attribute => 'CHANGE'
10791 ,p_resize_flag => 'N'
10792 ,p_msg_context => 'PROJ'
10793 ,p_attribute1 => l_amg_segment1
10794 ,p_attribute2 => ''
10795 ,p_attribute3 => ''
10796 ,p_attribute4 => ''
10797 ,p_attribute5 => '');
10798 END IF;
10799 CLOSE l_project_role_types_csr;
10800 RAISE FND_API.G_EXC_ERROR;
10801 ELSE
10802 CLOSE l_project_role_types_csr;
10803 END IF;
10804
10805
10806 IF p_org_roles(i).start_date <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE
10807 AND p_org_roles(i).end_date <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE
10808 THEN
10809 IF p_org_roles(i).end_date < p_org_roles(i).start_date
10810 THEN
10811
10812 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
10813 THEN
10814 pa_interface_utils_pub.map_new_amg_msg
10815 ( p_old_message_code => 'PA_SU_INVALID_DATES'
10816 ,p_msg_attribute => 'CHANGE'
10817 ,p_resize_flag => 'N'
10818 ,p_msg_context => 'PROJ'
10819 ,p_attribute1 => l_amg_segment1
10820 ,p_attribute2 => ''
10821 ,p_attribute3 => ''
10822 ,p_attribute4 => ''
10823 ,p_attribute5 => '');
10824 END IF;
10825
10826 RAISE FND_API.G_EXC_ERROR;
10827 END IF;
10828 END IF;
10829
10830
10831
10832 /* Select
10833 DECODE(p_org_roles(i).start_date,
10834 PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE, TRUNC(SYSDATE),
10835 NULL,TRUNC(SYSDATE),
10836 p_org_roles(i).start_date)
10837 Into v_start_date_active
10838 From dual;
10839 */ --Commented and added the following line -- By Ansari
10840 v_start_date_active := null;
10841
10842 --Bug#10124493 - project_role_type should be taken from pa_project_role_types_vl view
10843 Select role.project_role_id
10844 Into v_project_role_id
10845 From pa_project_role_types_vl role,
10846 fnd_lookup_values lookup
10847 WHERE role.project_role_type = p_org_roles(i).project_role_type
10848 and lookup.lookup_type='PA_ORGANIZATION_ROLE_CLASSES'
10849 and role.role_party_class=lookup.lookup_code
10850 and lookup.language=role.language;
10851 --Bug#10124493 - Modification end
10852
10853 v_end_date_active := p_org_roles(i).end_date;
10854 v_project_role_type := p_org_roles(i).project_role_type;
10855 v_person_id := p_org_roles(i).person_id;
10856 v_null_number := to_number(NULL);
10857
10858 /* PA_PROJECT_PARTIES_PUB.CREATE_PROJECT_PARTY(
10859 p_api_version => 1.0 -- p_api_version
10860 , p_init_msg_list => FND_API.G_TRUE -- p_init_msg_list
10861 , p_commit => FND_API.G_FALSE -- p_commit
10862 , p_validate_only => FND_API.G_FALSE -- p_validate_only
10863 , p_validation_level => FND_API.G_VALID_LEVEL_FULL -- p_validation_level
10864 , p_debug_mode => 'N' -- p_debug_mode
10865 , p_object_id => p_project_id -- p_object_id
10866 , p_OBJECT_TYPE => 'PA_PROJECTS' -- p_OBJECT_TYPE
10867 , p_project_role_id => v_project_role_id -- p_project_role_id
10868 , p_project_role_type => NULL -- p_project_role_type
10869 , p_RESOURCE_TYPE_ID => 112 -- p_RESOURCE_TYPE_ID
10870 , p_resource_source_id => v_person_id -- p_resource_source_id
10871 , p_resource_name => v_null_char -- p_resource_name
10872 , p_start_date_active => v_start_date_active -- p_start_date_active
10873 , p_scheduled_flag => 'N' -- p_scheduled_flag
10874 -- , p_record_version_number => 1 -- p_record_version_number
10875 , p_calling_module => 'FORM' -- p_calling_module
10876 , p_project_id => p_project_id -- p_project_id
10877 , p_project_end_date => l_completion_date -- p_project_end_date
10878 , p_end_date_active => v_end_date_active -- p_end_date_active
10879 , x_project_party_id => x_project_party_id -- x_project_party_id
10880 , x_resource_id => x_resource_id -- x_resource_id
10881 , x_wf_item_type =>l_wf_item_type
10882 , x_wf_type => l_wf_type
10883 , x_wf_process => l_wf_party_process
10884 , x_assignment_id => l_assignment_id
10885 , x_return_status => x_return_status -- x_return_status
10886 , x_msg_count => x_msg_count -- x_msg_count
10887 , x_msg_data => x_msg_data -- x_msg_data
10888 );
10889 */
10890 PA_PROJECTS_MAINT_PUB.CREATE_ORG_ROLE(
10891 p_api_version => 1.0 -- p_api_version
10892 , p_init_msg_list => FND_API.G_TRUE -- p_init_msg_list
10893 , p_commit => FND_API.G_FALSE -- p_commit
10894 , p_validate_only => FND_API.G_FALSE -- p_validate_only
10895 , p_validation_level => FND_API.G_VALID_LEVEL_FULL -- p_validation_level
10896 , p_debug_mode => 'N' -- p_debug_mode
10897 , p_object_id => p_project_id -- p_object_id
10898 , p_OBJECT_TYPE => 'PA_PROJECTS' -- p_OBJECT_TYPE
10899 , p_project_role_id => v_project_role_id -- p_project_role_id
10900 , p_project_role_type => NULL -- p_project_role_type
10901 , p_RESOURCE_TYPE_ID => 112 -- p_RESOURCE_TYPE_ID
10902 , p_resource_source_id => v_person_id -- p_resource_source_id
10903 , p_resource_name => v_null_char -- p_resource_name
10904 , p_start_date_active => v_start_date_active -- p_start_date_active
10905 , p_scheduled_flag => 'N' -- p_scheduled_flag
10906 , p_calling_module => 'FORM' -- p_calling_module
10907 , p_project_id => p_project_id -- p_project_id
10908 , p_project_end_date => l_completion_date -- p_project_end_date
10909 , p_end_date_active => v_end_date_active -- p_end_date_active
10910 , x_return_status => x_return_status -- x_return_status
10911 , x_msg_count => x_msg_count -- x_msg_count
10912 , x_msg_data => x_msg_data -- x_msg_data
10913 );
10914
10915 IF (x_return_status <> FND_API.G_RET_STS_SUCCESS) Then
10916 p_return_status := x_return_status;
10917 -- p_msg_count := x_msg_count;
10918 -- p_msg_data := SUBSTR(p_msg_data||x_msg_data,1,2000);
10919 if (x_return_status = FND_API.G_RET_STS_ERROR) then
10920 raise FND_API.G_EXC_UNEXPECTED_ERROR;
10921 else -- (x_return_status = FND_API.G_RET_STS_UNEXP_ERROR) then
10922 raise FND_API.G_EXC_ERROR;
10923 end if;
10924 END IF;
10925
10926 END IF; -- IF(p_org_roles(i).person_id <>
10927 -- PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM)
10928 i := p_org_roles.next(i);
10929
10930 END LOOP; --org roles
10931
10932
10933 EXCEPTION
10934
10935 WHEN FND_API.G_EXC_ERROR
10936 THEN
10937 /* dbms_output.put_line('handling an G_EXC_ERROR exception'); */
10938 ROLLBACK TO add_org_roles_pvt;
10939
10940 p_return_status := FND_API.G_RET_STS_ERROR;
10941
10942 WHEN FND_API.G_EXC_UNEXPECTED_ERROR
10943 THEN
10944 /* dbms_output.put_line('handling an G_EXC_UNEXPECTED_ERROR exception'); */
10945 ROLLBACK TO add_org_roles_pvt;
10946
10947 p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
10948
10949 WHEN OTHERS THEN
10950 /* dbms_output.put_line('handling an OTHERS exception'); */
10951 ROLLBACK TO add_org_roles_pvt;
10952
10953 p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
10954
10955 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
10956 THEN
10957 FND_MSG_PUB.add_exc_msg
10958 ( p_pkg_name => G_PKG_NAME
10959 , p_procedure_name => l_api_name );
10960
10961 END IF;
10962
10963 END add_org_roles;
10964
10965
10966 -- anlee org role changes
10967 --====================================================================================
10968 --Name: check_valid_organization
10969 --
10970 --Type: Function
10971 --Description: This function can be used to check for validity of
10972 -- an organization
10973 --
10974 --Called subprograms: none
10975 --
10976 --
10977 --
10978 --History:
10979 -- 20-MAR-2002 anlee Created
10980 --
10981 FUNCTION check_valid_organization (p_party_id IN NUMBER ) RETURN VARCHAR2
10982 IS
10983 CURSOR l_get_organizations_csr (l_party_id NUMBER)
10984 IS
10985 SELECT 'x' FROM
10986 hz_parties
10987 WHERE party_id = l_party_id
10988 AND party_type = 'ORGANIZATION';
10989
10990 l_temp VARCHAR2(1);
10991 BEGIN
10992 OPEN l_get_organizations_csr (p_party_id);
10993 FETCH l_get_organizations_csr INTO l_temp;
10994
10995 IF l_get_organizations_csr%NOTFOUND
10996 THEN
10997 CLOSE l_get_organizations_csr;
10998 RETURN 'N';
10999 ELSE
11000 CLOSE l_get_organizations_csr;
11001 RETURN 'Y';
11002 END IF;
11003
11004 EXCEPTION
11005 WHEN OTHERS THEN
11006 RAISE;
11007
11008 END check_valid_organization;
11009
11010 --Project Connect 4.0
11011
11012 PROCEDURE get_structure_version(
11013 p_project_id IN NUMBER
11014 ,p_structure_versions_out OUT NOCOPY PA_PROJECT_PUB.struc_out_tbl_type )
11015 IS
11016 CURSOR cur_proj_elems
11017 IS
11018 SELECT ppe.proj_element_id
11019 FROM pa_proj_elements ppe, pa_proj_structure_types ppst
11020 WHERE ppe.proj_element_id = ppst.proj_element_id
11021 AND ppe.project_id = p_project_id
11022 AND ppe.object_type = 'PA_STRUCTURES'
11023 AND ppst.structure_type_id = 1 ;
11024
11025 CURSOR c1( c_proj_element_id NUMBER ) is
11026 SELECT d.element_version_id
11027 FROM pa_proj_structure_types b
11028 ,pa_proj_elem_ver_structure d
11029 WHERE d.project_id = p_project_id
11030 AND 1 = b.structure_type_id
11031 AND b.proj_element_id = c_proj_element_id
11032 AND d.proj_element_id = c_proj_element_id
11033 AND d.status_code = 'STRUCTURE_PUBLISHED'
11034 ;
11035
11036 l_fin_str_ver_id NUMBER;
11037 l_wp_str_ver_id NUMBER;
11038 l_wp_str_id NUMBER;
11039 l_index NUMBER := 1;
11040
11041 BEGIN
11042
11043 l_fin_str_ver_id := PA_PROJECT_STRUCTURE_UTILS.GET_LATEST_FIN_STRUC_VER_ID( p_project_id );
11044
11045 IF l_fin_str_ver_id IS NOT NULL
11046 THEN
11047 p_structure_versions_out(l_index).structure_version_id := l_fin_str_ver_id;
11048 p_structure_versions_out(l_index).structure_type := 'FINANCIAL';
11049 END IF;
11050
11051 OPEN cur_proj_elems;
11052 FETCH cur_proj_elems INTO l_wp_str_id;
11053 CLOSE cur_proj_elems;
11054
11055 l_wp_str_ver_id := PA_PROJECT_STRUCTURE_UTILS.GET_LAST_UPDATED_WORKING_VER( l_wp_str_id );
11056
11057 IF l_wp_str_ver_id IS NULL
11058 THEN
11059 OPEN c1(l_wp_str_id );
11060 FETCH c1 into l_wp_str_ver_id;
11061 CLOSE c1;
11062 END IF;
11063
11064 IF p_structure_versions_out.exists(1)
11065 THEN
11066 l_index := l_index + 1;
11067 END IF;
11068
11069 IF l_wp_str_ver_id IS NOT NULL
11070 THEN
11071 p_structure_versions_out(l_index).structure_version_id := l_wp_str_ver_id;
11072 p_structure_versions_out(l_index).structure_type := 'WORKPLAN';
11073 --For shared and versioning enabled structures
11074 IF l_fin_str_ver_id IS NULL
11075 THEN
11076 p_structure_versions_out(l_index+1).structure_version_id := l_wp_str_ver_id;
11077 p_structure_versions_out(l_index+1).structure_type := 'FINANCIAL';
11078 END IF;
11079 END IF;
11080
11081 END get_structure_version;
11082
11083 --Project Connect 4.0
11084 /*Added the procedure for the bug 2802984
11085 This Procedure returns the labor sch type and non labor sch type from the database in the corresponding
11086 out parameters for the related project id and task id if the parameter p_in_labor_sch_type or
11087 p_in_nl_sch_type is PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR else the same values are passed back in the out paramters.
11088 */
11089
11090 PROCEDURE Check_Schedule_type
11091 (p_pa_task_id IN NUMBER := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM,
11092 p_pa_project_id IN NUMBER := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM,
11093 p_in_labor_sch_type IN VARCHAR2 := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR,
11094 p_in_nl_sch_type IN VARCHAR2 := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR,
11095 p_task_name IN VARCHAR2 := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR,
11096 p_pm_task_reference IN VARCHAR2 := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR,
11097 p_out_labor_sch_type OUT NOCOPY VARCHAR, -- 4537865 Added the nocopy hint
11098 p_out_nl_labor_sch_type OUT NOCOPY VARCHAR, -- 4537865 Added the nocopy hint
11099 p_return_status OUT NOCOPY VARCHAR2 -- 4537865 Added the nocopy hint
11100 )
11101
11102 IS
11103
11104 CURSOR l_prj_labor_sch_type_csr(p_pa_project_id VARCHAR2)
11105 IS
11106 SELECT labor_sch_type
11107 FROM pa_projects
11108 where project_id = p_pa_project_id;
11109
11110 CURSOR l_tsk_lb_sch_type_task_csr(p_pa_project_id VARCHAR2,p_pa_task_id VARCHAR2)
11111 IS
11112 SELECT labor_sch_type
11113 FROM pa_tasks
11114 where project_id = p_pa_project_id
11115 and task_id= p_pa_task_id;
11116
11117 CURSOR l_prj_nl_sch_type_csr(p_pa_project_id VARCHAR2)
11118 IS
11119 SELECT non_labor_sch_type
11120 FROM pa_projects
11121 where project_id = p_pa_project_id;
11122
11123 CURSOR l_tsk_nl_sch_type_task_csr(p_pa_project_id VARCHAR2,p_pa_task_id VARCHAR2)
11124 IS
11125 SELECT non_labor_sch_type
11126 FROM pa_tasks
11127 where project_id = p_pa_project_id
11128 and task_id = p_pa_task_id;
11129
11130 CURSOR l_amg_project_csr(p_pa_project_id pa_projects.project_id%type)
11131 IS
11132 SELECT segment1
11133 FROM pa_projects p
11134 WHERE p.project_id = p_pa_project_id;
11135
11136
11137
11138 l_api_name CONSTANT VARCHAR2(30) := 'Check Schedule';
11139 l_out_labor_sch_type VARCHAR(1);
11140 l_out_nl_labor_sch_type VARCHAR(1);
11141 l_prj_lab_sch_type VARCHAR2(1);
11142 l_tsk_lab_sch_type VARCHAR2(1);
11143 l_prj_nl_sch_type VARCHAR2(1);
11144 l_tsk_nl_sch_type VARCHAR2(1);
11145 l_amg_segment1 VARCHAR(50);
11146 l_amg_task_number VARCHAR2(50);
11147
11148 BEGIN
11149
11150 p_return_status := FND_API.G_RET_STS_SUCCESS;
11151
11152 OPEN l_amg_project_csr( p_pa_project_id );
11153 FETCH l_amg_project_csr INTO l_amg_segment1;
11154 CLOSE l_amg_project_csr;
11155
11156
11157 l_amg_task_number := pa_interface_utils_pub.get_task_number_amg
11158 (p_task_number => p_task_name
11159 ,p_task_reference =>p_pm_task_reference
11160 ,p_task_id => p_pa_task_id);
11161
11162 IF p_in_labor_sch_type = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR THEN
11163 IF p_pa_task_id IS NULL THEN
11164
11165 OPEN l_prj_labor_sch_type_csr(p_pa_project_id);
11166 FETCH l_prj_labor_sch_type_csr into l_prj_lab_sch_type;
11167 CLOSE l_prj_labor_sch_type_csr;
11168
11169 p_out_labor_sch_type := l_prj_lab_sch_type;
11170
11171 ELSE
11172
11173 OPEN l_tsk_lb_sch_type_task_csr(p_pa_project_id,p_pa_task_id);
11174 FETCH l_tsk_lb_sch_type_task_csr into l_tsk_lab_sch_type;
11175 CLOSE l_tsk_lb_sch_type_task_csr;
11176
11177 p_out_labor_sch_type := l_tsk_lab_sch_type;
11178
11179 END IF;
11180
11181 ELSIF p_in_labor_sch_type IS NULL THEN
11182 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
11183 THEN
11184 pa_interface_utils_pub.map_new_amg_msg
11185 ( p_old_message_code => 'PA_LAB_SCH_NOT_NULL'
11186 ,p_msg_attribute => 'CHANGE'
11187 ,p_resize_flag => 'Y'
11188 ,p_msg_context => 'TASK'
11189 ,p_attribute1 => l_amg_segment1
11190 ,p_attribute2 => l_amg_task_number
11191 ,p_attribute3 => ''
11192 ,p_attribute4 => ''
11193 ,p_attribute5 => '');
11194 END IF;
11195 RAISE FND_API.G_EXC_ERROR;
11196
11197 ELSE
11198
11199 p_out_labor_sch_type := p_in_labor_sch_type;
11200
11201 END IF;
11202 IF p_in_nl_sch_type = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR THEN
11203 IF p_pa_task_id IS NULL THEN
11204
11205 OPEN l_prj_nl_sch_type_csr(p_pa_project_id);
11206 FETCH l_prj_nl_sch_type_csr into l_prj_nl_sch_type;
11207 CLOSE l_prj_nl_sch_type_csr;
11208
11209 p_out_nl_labor_sch_type := l_prj_nl_sch_type;
11210
11211 ELSE
11212
11213 OPEN l_tsk_nl_sch_type_task_csr(p_pa_project_id,p_pa_task_id);
11214 FETCH l_tsk_nl_sch_type_task_csr into l_tsk_nl_sch_type;
11215 CLOSE l_tsk_nl_sch_type_task_csr;
11216
11217 p_out_nl_labor_sch_type := l_tsk_nl_sch_type;
11218
11219 END IF;
11220
11221 ELSIF p_in_nl_sch_type IS NULL THEN
11222
11223 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
11224 THEN
11225 pa_interface_utils_pub.map_new_amg_msg
11226 ( p_old_message_code => 'PA_NL_SCH_NOT_NULL'
11227 ,p_msg_attribute => 'CHANGE'
11228 ,p_resize_flag => 'Y'
11229 ,p_msg_context => 'TASK'
11230 ,p_attribute1 => l_amg_segment1
11231 ,p_attribute2 => l_amg_task_number
11232 ,p_attribute3 => ''
11233 ,p_attribute4 => ''
11234 ,p_attribute5 => '');
11235 END IF;
11236 RAISE FND_API.G_EXC_ERROR;
11237 ELSE
11238
11239 p_out_nl_labor_sch_type := p_in_nl_sch_type;
11240 END IF;
11241
11242 EXCEPTION
11243
11244 WHEN FND_API.G_EXC_ERROR
11245 THEN
11246 /* dbms_output.put_line('handling an G_EXC_ERROR exception'); */
11247
11248 p_return_status := FND_API.G_RET_STS_ERROR;
11249
11250 -- 4537865 RESET OUT PARAMS
11251 p_out_nl_labor_sch_type := NULL ;
11252 p_out_labor_sch_type := NULL ;
11253
11254 WHEN FND_API.G_EXC_UNEXPECTED_ERROR
11255 THEN
11256 /* dbms_output.put_line('handling an G_EXC_UNEXPECTED_ERROR exception'); */
11257
11258 p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
11259 -- 4537865 RESET OUT PARAMS
11260 p_out_nl_labor_sch_type := NULL ;
11261 p_out_labor_sch_type := NULL ;
11262
11263 WHEN OTHERS THEN
11264 /* dbms_output.put_line('handling an OTHERS exception'); */
11265
11266 p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
11267
11268 -- 4537865 RESET OUT PARAMS
11269 p_out_nl_labor_sch_type := NULL ;
11270 p_out_labor_sch_type := NULL ;
11271
11272 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
11273 THEN
11274 FND_MSG_PUB.add_exc_msg
11275 ( p_pkg_name => G_PKG_NAME
11276 , p_procedure_name => l_api_name );
11277
11278 END IF;
11279 end Check_Schedule_type;
11280
11281 /*Added the procedure for the bug 2802984
11282 This procedure validates all the parameters related to labor schedule and non labor schedule.
11283 Refer bug for more details.
11284 */
11285
11286 PROCEDURE validate_schedule_values
11287 (p_pa_project_id IN NUMBER := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM,
11288 p_pa_task_id IN NUMBER := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM,
11289 p_task_name IN VARCHAR2 := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR,
11290 p_pm_task_reference IN VARCHAR2 := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR,
11291 p_lab_db_sch_type IN VARCHAR2 := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR,
11292 p_nl_db_sch_type IN VARCHAR2 := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR,
11293 p_labor_sch_type IN VARCHAR2 := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR,
11294 p_nl_sch_type IN VARCHAR2 := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR,
11295 p_emp_bill_rate_schedule_id IN NUMBER := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM,
11296 p_job_bill_rate_schedule_id IN NUMBER := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM,
11297 p_labor_schedule_fixed_date IN DATE := PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE,
11298 p_labor_schedule_discount IN NUMBER := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM,
11299 p_labor_disc_reason_code IN VARCHAR2 := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR,
11300 p_nl_bill_rate_org_id IN NUMBER := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM,
11301 p_non_lab_std_bill_rt_sch_id IN NUMBER := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM,
11302 p_nl_schedule_fixed_date IN DATE := PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE,
11303 p_nl_schedule_discount IN NUMBER := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM,
11304 p_non_labor_disc_reason_code IN VARCHAR2 := PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR,
11305 p_rev_ind_rate_sch_id IN NUMBER := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM,
11306 p_inv_ind_rate_sch_id IN NUMBER := PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM,
11307 p_rev_ind_sch_fixed_date IN DATE := PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE,
11308 p_inv_ind_sch_fixed_date IN DATE := PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE,
11309 p_return_status OUT NOCOPY VARCHAR2 -- 4537865 Added the nocopy hint
11310 )
11311
11312 IS
11313
11314 CURSOR l_rev_rate_schedule_type_csr( p_rev_ind_rate_sch_id NUMBER)
11315 IS
11316 SELECT ind_rate_schedule_type
11317 FROM pa_ind_rate_schedules
11318 WHERE ind_rate_sch_id = p_rev_ind_rate_sch_id
11319 AND trunc(sysdate) between trunc(start_date_active) and nvl(end_date_active,trunc(sysdate));
11320
11321 CURSOR l_inv_rate_schedule_type_csr( p_inv_ind_rate_sch_id NUMBER)
11322 IS
11323 SELECT ind_rate_schedule_type
11324 FROM pa_ind_rate_schedules
11325 WHERE ind_rate_sch_id = p_inv_ind_rate_sch_id
11326 AND trunc(sysdate) between trunc(start_date_active) and nvl(end_date_active,trunc(sysdate));
11327
11328 --R12: Bug 4363092 - removed nvl for org_id in below cursor
11329 CURSOR l_emp_rate_sch_id_csr( p_emp_bill_rate_schedule_id NUMBER)
11330 IS
11331 SELECT 'x'
11332 FROM pa_std_bill_rate_schedules_all brs, pa_projects pa
11333 WHERE brs.bill_rate_sch_id = p_emp_bill_rate_schedule_id
11334 AND pa.project_id=p_pa_project_id
11335 and brs.schedule_type = 'EMPLOYEE'
11336 AND ( pa.multi_currency_BILLING_flag='Y'
11337 OR (pa.multi_currency_billing_flag='N'
11338 AND brs.rate_sch_currency_code=pa.project_currency_code))
11339 AND ((pa_multi_currency_billing.is_sharing_bill_rates_allowed(pa.org_id) = 'Y')
11340 or (pa_multi_currency_billing.is_sharing_bill_rates_allowed(pa.org_id)='N'
11341 and brs.org_id=pa.org_id))
11342 and (brs.share_across_ou_flag = 'Y'
11343 OR (brs.share_across_ou_flag = 'N'
11344 and brs.org_id = pa.org_id
11345 ));
11346
11347 --R12: Bug 4363092 - removed nvl for org_id in below cursor
11348 CURSOR l_job_rate_sch_id_csr( p_job_bill_rate_schedule_id NUMBER)
11349 IS
11350 SELECT 'x'
11351 FROM pa_std_bill_rate_schedules_all brs, pa_project_types_all pt, pa_projects pa
11352 WHERE bill_rate_sch_id = p_job_bill_rate_schedule_id
11353 AND brs.job_group_id=pt.bill_job_group_id
11354 and brs.schedule_type = 'JOB'
11355 AND pa.project_type=pt.project_type
11356 AND pa.org_id = pt.org_id -- added for Bug 5675391
11357 AND ( pa.multi_currency_BILLING_flag='Y'
11358 OR (pa.multi_currency_billing_flag='N'
11359 AND brs.rate_sch_currency_code=pa.project_currency_code))
11360 AND ((pa_multi_currency_billing.is_sharing_bill_rates_allowed(pa.org_id) = 'Y')
11361 or (pa_multi_currency_billing.is_sharing_bill_rates_allowed(pa.org_id)='N'
11362 and brs.org_id=pa.org_id))
11363 and (brs.share_across_ou_flag = 'Y'
11364 OR (brs.share_across_ou_flag = 'N'
11365 and brs.org_id = pa.org_id
11366 ))
11367 AND pa.project_id=p_pa_project_id;
11368
11369 --R12: Bug 4363092 - removed nvl for org_id in below cursor
11370 CURSOR l_nl_org_sch_id_csr( p_nl_bill_rate_org_id NUMBER,p_non_lab_std_bill_rt_sch_id NUMBER)
11371 IS
11372 SELECT 'x'
11373 FROM pa_std_bill_rate_schedules_all brs, pa_projects pa
11374 WHERE brs.organization_id = p_nl_bill_rate_org_id
11375 AND bill_rate_sch_id = p_non_lab_std_bill_rt_sch_id
11376 and brs.schedule_type = 'NON-LABOR'
11377 and (brs.schedule_type <> 'JOB'
11378 or (brs.schedule_type = 'JOB'
11379 and brs.job_group_id = pa.bill_job_group_id))
11380 AND ( pa.multi_currency_BILLING_flag='Y'
11381 OR (pa.multi_currency_billing_flag='N'
11382 AND brs.rate_sch_currency_code=pa.project_currency_code))
11383 AND ((pa_multi_currency_billing.is_sharing_bill_rates_allowed(pa.org_id) = 'Y')
11384 or (pa_multi_currency_billing.is_sharing_bill_rates_allowed(pa.org_id)='N'
11385 and brs.org_id=pa.org_id))
11386 and (brs.share_across_ou_flag = 'Y'
11387 OR (brs.share_across_ou_flag = 'N'
11388 and brs.org_id = pa.org_id
11389 ))
11390 AND pa.project_id=p_pa_project_id;
11391
11392
11393 CURSOR l_amg_project_csr(p_pa_project_id pa_projects.project_id%type)
11394 IS
11395 SELECT segment1
11396 FROM pa_projects p
11397 WHERE p.project_id = p_pa_project_id;
11398
11399 CURSOR get_lab_disc_reason_code_csr(p_labor_disc_reason_code VARCHAR2)
11400 IS
11401 SELECT 'x'
11402 FROM pa_lookups
11403 WHERE lookup_type ='RATE AND DISCOUNT REASON'
11404 AND lookup_code=p_labor_disc_reason_code
11405 AND trunc(nvl(end_date_active,sysdate)) >= trunc(sysdate);
11406
11407 CURSOR get_nl_disc_reason_code_csr(p_non_labor_disc_reason_code VARCHAR2)
11408 IS
11409 SELECT 'x'
11410 FROM pa_lookups
11411 WHERE lookup_type ='RATE AND DISCOUNT REASON'
11412 AND lookup_code=p_non_labor_disc_reason_code
11413 AND trunc(nvl(end_date_active,sysdate)) >= trunc(sysdate);
11414
11415 --BUG_9873652
11416 CURSOR get_rate_discount_reason_flag
11417 IS
11418 SELECT rate_discount_reason_flag
11419 FROM pa_implementations;
11420
11421 l_api_name CONSTANT VARCHAR2(30) := 'Validate Schedule Values';
11422 l_rev_rate_schedule_type VARCHAR2(1);
11423 l_inv_rate_schedule_type VARCHAR2(1);
11424 l_temp_dummy VARCHAR2(1) := null;
11425 l_non_lab_std_bill_schdl VARCHAR2(40);
11426 l_amg_segment1 VARCHAR2(50);
11427 l_amg_task_number VARCHAR2(50);
11428 l_rate_discount_reason_flag pa_implementations.rate_discount_reason_flag%TYPE := 'N'; -- BUG_9873652
11429
11430 BEGIN
11431
11432 p_return_status := FND_API.G_RET_STS_SUCCESS;
11433
11434 OPEN l_amg_project_csr( p_pa_project_id );
11435 FETCH l_amg_project_csr INTO l_amg_segment1;
11436 CLOSE l_amg_project_csr;
11437
11438
11439 l_amg_task_number := pa_interface_utils_pub.get_task_number_amg
11440 (p_task_number => p_task_name
11441 ,p_task_reference =>p_pm_task_reference
11442 ,p_task_id => p_pa_task_id);
11443
11444
11445 IF p_nl_sch_type = 'B' then /* Basically B is passed through the script or value in DataBase is 'B' */
11446
11447 /*Give an error when non_lab_std_bill_rt_sch_id is null and give an error
11448 if non_labor_std_bill_rt_sch_id is PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
11449 when the Schedule is being changed from 'I' (burden) to 'B' (bill) */
11450
11451 IF p_non_lab_std_bill_rt_sch_id IS NULL THEN /* Explicitly passed as NULL, hence Error */
11452 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
11453 THEN
11454 pa_interface_utils_pub.map_new_amg_msg
11455 ( p_old_message_code => 'PA_NL_SCH_ID_NOT_NULL'
11456 ,p_msg_attribute => 'CHANGE'
11457 ,p_resize_flag => 'Y'
11458 ,p_msg_context => 'TASK'
11459 ,p_attribute1 => l_amg_segment1
11460 ,p_attribute2 => l_amg_task_number
11461 ,p_attribute3 => ''
11462 ,p_attribute4 => ''
11463 ,p_attribute5 => '');
11464 END IF;
11465 RAISE FND_API.G_EXC_ERROR;
11466 ELSIF p_non_lab_std_bill_rt_sch_id = PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM THEN
11467 IF p_nl_db_sch_type = 'I' THEN /* Schedule is being changed from 'I' (burden) to 'B' (bill) */
11468 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
11469 THEN
11470 pa_interface_utils_pub.map_new_amg_msg
11471 ( p_old_message_code => 'PA_NL_SCH_ID_NOT_NULL'
11472 ,p_msg_attribute => 'CHANGE'
11473 ,p_resize_flag => 'Y'
11474 ,p_msg_context => 'TASK'
11475 ,p_attribute1 => l_amg_segment1
11476 ,p_attribute2 => l_amg_task_number
11477 ,p_attribute3 => ''
11478 ,p_attribute4 => ''
11479 ,p_attribute5 => '');
11480 END IF;
11481 RAISE FND_API.G_EXC_ERROR;
11482 END IF;
11483 END IF;
11484
11485 /*Give an error when non_lab_bill_rt_org_id is null and give an error
11486 if non_labor_bill_rt_org_id is PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
11487 when the Schedule is being changed from 'I' to 'B'*/
11488
11489 IF p_nl_bill_rate_org_id IS NULL
11490 THEN
11491 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
11492 THEN
11493 pa_interface_utils_pub.map_new_amg_msg
11494 ( p_old_message_code => 'PA_BILL_RT_ORG_ID_NOT_NULL'
11495 ,p_msg_attribute => 'CHANGE'
11496 ,p_resize_flag => 'Y'
11497 ,p_msg_context => 'TASK'
11498 ,p_attribute1 => l_amg_segment1
11499 ,p_attribute2 => l_amg_task_number
11500 ,p_attribute3 => ''
11501 ,p_attribute4 => ''
11502 ,p_attribute5 => '');
11503 END IF;
11504 RAISE FND_API.G_EXC_ERROR;
11505 ELSIF p_nl_bill_rate_org_id = PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM THEN
11506 IF p_nl_db_sch_type = 'I' THEN
11507 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
11508 THEN
11509 pa_interface_utils_pub.map_new_amg_msg
11510 ( p_old_message_code => 'PA_BILL_RT_ORG_ID_NOT_NULL'
11511 ,p_msg_attribute => 'CHANGE'
11512 ,p_resize_flag => 'Y'
11513 ,p_msg_context => 'TASK'
11514 ,p_attribute1 => l_amg_segment1
11515 ,p_attribute2 => l_amg_task_number
11516 ,p_attribute3 => ''
11517 ,p_attribute4 => ''
11518 ,p_attribute5 => '');
11519 END IF;
11520 RAISE FND_API.G_EXC_ERROR;
11521 END IF;
11522 END IF;
11523
11524 /*Give an error if the combination of non_labor_bill_rt_sch_id and nl_bill_rate_org_id is invalid*/
11525
11526 IF (p_non_lab_std_bill_rt_sch_id IS NOT NULL
11527 AND p_non_lab_std_bill_rt_sch_id <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM )
11528 AND (p_nl_bill_rate_org_id IS NOT NULL AND p_nl_bill_rate_org_id <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM)
11529 THEN
11530 OPEN l_nl_org_sch_id_csr( p_nl_bill_rate_org_id,p_non_lab_std_bill_rt_sch_id);
11531 FETCH l_nl_org_sch_id_csr INTO l_temp_dummy;
11532 IF l_nl_org_sch_id_csr%NOTFOUND
11533 THEN
11534 CLOSE l_nl_org_sch_id_csr;
11535 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
11536 THEN
11537 pa_interface_utils_pub.map_new_amg_msg
11538 ( p_old_message_code => 'PA_INVALID_NL_ORG_SCH_ID'
11539 ,p_msg_attribute => 'CHANGE'
11540 ,p_resize_flag => 'Y'
11541 ,p_msg_context => 'TASK'
11542 ,p_attribute1 => l_amg_segment1
11543 ,p_attribute2 => l_amg_task_number
11544 ,p_attribute3 => ''
11545 ,p_attribute4 => ''
11546 ,p_attribute5 => '');
11547 END IF;
11548 RAISE FND_API.G_EXC_ERROR;
11549 END IF;
11550 CLOSE l_nl_org_sch_id_csr;
11551 END IF;
11552
11553 /*
11554 1) Give an error when the nl_schedule_discount is null or PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM and a value is being
11555 passed to non_labor_disc_reason_code as cannot pass disc reason code with schedule discount
11556 2) Give an error when nl_schedule_discount is not null and <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
11557 and non_labor_disc_reason_code is null or =PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
11558 3) Give an error when nl_schedule_discount is not null and <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
11559 and the non_labor_disc_reason_code passed is invalid
11560 */
11561
11562 l_temp_dummy := NULL;
11563
11564 IF p_nl_schedule_discount IS NULL OR p_nl_schedule_discount = PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
11565 THEN
11566 IF p_non_labor_disc_reason_code IS NOT NULL
11567 AND p_non_labor_disc_reason_code <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
11568 THEN
11569 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
11570 THEN
11571 pa_interface_utils_pub.map_new_amg_msg
11572 ( p_old_message_code => 'PA_NL_DISC_REASON_CODE'
11573 ,p_msg_attribute => 'CHANGE'
11574 ,p_resize_flag => 'Y'
11575 ,p_msg_context => 'TASK'
11576 ,p_attribute1 => l_amg_segment1
11577 ,p_attribute2 => l_amg_task_number
11578 ,p_attribute3 => ''
11579 ,p_attribute4 => ''
11580 ,p_attribute5 => '');
11581 END IF;
11582 RAISE FND_API.G_EXC_ERROR;
11583 END IF;
11584 elsif (p_nl_schedule_discount IS NOT NULL
11585 AND p_nl_schedule_discount <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM)
11586 THEN
11587 IF (p_non_labor_disc_reason_code IS NULL
11588 OR p_non_labor_disc_reason_code = PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR)
11589 THEN
11590 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
11591 THEN
11592 pa_interface_utils_pub.map_new_amg_msg
11593 ( p_old_message_code => 'PA_NL_DISC_CODE_NOT_NULL'
11594 ,p_msg_attribute => 'CHANGE'
11595 ,p_resize_flag => 'Y'
11596 ,p_msg_context => 'TASK'
11597 ,p_attribute1 => l_amg_segment1
11598 ,p_attribute2 => l_amg_task_number
11599 ,p_attribute3 => ''
11600 ,p_attribute4 => ''
11601 ,p_attribute5 => '');
11602 END IF;
11603 RAISE FND_API.G_EXC_ERROR;
11604 ELSE
11605 OPEN get_nl_disc_reason_code_csr(p_non_labor_disc_reason_code);
11606 FETCH get_nl_disc_reason_code_csr INTO l_temp_dummy;
11607 IF get_nl_disc_reason_code_csr%NOTFOUND THEN
11608 CLOSE get_nl_disc_reason_code_csr;
11609 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
11610 THEN
11611 pa_interface_utils_pub.map_new_amg_msg
11612 ( p_old_message_code => 'PA_INVALID_NLDISC_RN_CODE'
11613 ,p_msg_attribute => 'CHANGE'
11614 ,p_resize_flag => 'Y'
11615 ,p_msg_context => 'TASK'
11616 ,p_attribute1 => l_amg_segment1
11617 ,p_attribute2 => l_amg_task_number
11618 ,p_attribute3 => ''
11619 ,p_attribute4 => ''
11620 ,p_attribute5 => '');
11621 END IF;
11622 RAISE FND_API.G_EXC_ERROR;
11623 END IF;
11624 CLOSE get_nl_disc_reason_code_csr;
11625 END IF;
11626 END IF;
11627
11628 ELSE /* Else for if non_labor_sch_type = 'B'*/
11629
11630 /*
11631 1) Give an error when p_rev_ind_rate_sch_id is null
11632 2) Give an error when p_rev_ind_rate_sch_id not passed(PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM)
11633 and the schedule_type is being changed from 'B' to 'I'
11634 */
11635
11636 IF p_rev_ind_rate_sch_id IS NULL THEN
11637 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
11638 THEN
11639 pa_interface_utils_pub.map_new_amg_msg
11640 ( p_old_message_code => 'PA_REV_SCH_ID_NOT_NULL'
11641 ,p_msg_attribute => 'CHANGE'
11642 ,p_resize_flag => 'Y'
11643 ,p_msg_context => 'TASK'
11644 ,p_attribute1 => l_amg_segment1
11645 ,p_attribute2 => l_amg_task_number
11646 ,p_attribute3 => ''
11647 ,p_attribute4 => ''
11648 ,p_attribute5 => '');
11649 END IF;
11650 RAISE FND_API.G_EXC_ERROR;
11651 ELSIF p_rev_ind_rate_sch_id = PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM THEN
11652 IF p_nl_db_sch_type = 'B' THEN
11653 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
11654 THEN
11655 pa_interface_utils_pub.map_new_amg_msg
11656 ( p_old_message_code => 'PA_REV_SCH_ID_NOT_NULL'
11657 ,p_msg_attribute => 'CHANGE'
11658 ,p_resize_flag => 'Y'
11659 ,p_msg_context => 'TASK'
11660 ,p_attribute1 => l_amg_segment1
11661 ,p_attribute2 => l_amg_task_number
11662 ,p_attribute3 => ''
11663 ,p_attribute4 => ''
11664 ,p_attribute5 => '');
11665 END IF;
11666 RAISE FND_API.G_EXC_ERROR;
11667 END IF;
11668 END IF;
11669
11670
11671 /*
11672 1) Give an error when a value is passed to p_rev_ind_rate_sch_id and it is invalid.
11673 2) Give an error when the Burden Schedule type is P (Provisional) for the attached revenue burden schedule
11674 and the p_rev_ind_sch_fixed_date date is being passed.
11675 */
11676
11677 IF (p_rev_ind_rate_sch_id IS NOT NULL
11678 AND p_rev_ind_rate_sch_id <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM)
11679 THEN
11680 OPEN l_rev_rate_schedule_type_csr(p_rev_ind_rate_sch_id);
11681 FETCH l_rev_rate_schedule_type_csr INTO l_rev_rate_schedule_type;
11682 IF l_rev_rate_schedule_type_csr%NOTFOUND THEN
11683 CLOSE l_rev_rate_schedule_type_csr;
11684 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
11685 THEN
11686 pa_interface_utils_pub.map_new_amg_msg
11687 ( p_old_message_code => 'PA_INVALID_REV_SCH_ID'
11688 ,p_msg_attribute => 'CHANGE'
11689 ,p_resize_flag => 'Y'
11690 ,p_msg_context => 'TASK'
11691 ,p_attribute1 => l_amg_segment1
11692 ,p_attribute2 => l_amg_task_number
11693 ,p_attribute3 => ''
11694 ,p_attribute4 => ''
11695 ,p_attribute5 => '');
11696 END IF;
11697 RAISE FND_API.G_EXC_ERROR;
11698 END IF;
11699 CLOSE l_rev_rate_schedule_type_csr;
11700 IF l_rev_rate_schedule_type = 'P'
11701 THEN
11702 IF p_rev_ind_sch_fixed_date IS NOT NULL
11703 AND p_rev_ind_sch_fixed_date <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE
11704 THEN
11705 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
11706 THEN
11707 pa_interface_utils_pub.map_new_amg_msg
11708 ( p_old_message_code => 'PA_CNT_FIX_REV_DTE_PROV'
11709 ,p_msg_attribute => 'CHANGE'
11710 ,p_resize_flag => 'Y'
11711 ,p_msg_context => 'TASK'
11712 ,p_attribute1 => l_amg_segment1
11713 ,p_attribute2 => l_amg_task_number
11714 ,p_attribute3 => ''
11715 ,p_attribute4 => ''
11716 ,p_attribute5 => '');
11717 END IF;
11718 RAISE FND_API.G_EXC_ERROR;
11719 END IF;
11720 END IF;
11721 END IF;
11722
11723
11724 l_temp_dummy :=null;
11725
11726 /*
11727 1) Give an error when p_inv_ind_rate_sch_id is null
11728 2) Give an error when p_inv_ind_rate_sch_id not passed(PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM)
11729 and the schedule_type is being changed from 'B' to 'I'
11730 */
11731
11732 IF p_inv_ind_rate_sch_id IS NULL THEN
11733 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
11734 THEN
11735 pa_interface_utils_pub.map_new_amg_msg
11736 ( p_old_message_code => 'PA_INV_SCH_ID_NOT_NULL'
11737 ,p_msg_attribute => 'CHANGE'
11738 ,p_resize_flag => 'Y'
11739 ,p_msg_context => 'TASK'
11740 ,p_attribute1 => l_amg_segment1
11741 ,p_attribute2 => l_amg_task_number
11742 ,p_attribute3 => ''
11743 ,p_attribute4 => ''
11744 ,p_attribute5 => '');
11745 END IF;
11746 RAISE FND_API.G_EXC_ERROR;
11747 ELSIF p_inv_ind_rate_sch_id = PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM THEN
11748 IF p_nl_db_sch_type = 'B' THEN
11749 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
11750 THEN
11751 pa_interface_utils_pub.map_new_amg_msg
11752 ( p_old_message_code => 'PA_INV_SCH_ID_NOT_NULL'
11753 ,p_msg_attribute => 'CHANGE'
11754 ,p_resize_flag => 'Y'
11755 ,p_msg_context => 'TASK'
11756 ,p_attribute1 => l_amg_segment1
11757 ,p_attribute2 => l_amg_task_number
11758 ,p_attribute3 => ''
11759 ,p_attribute4 => ''
11760 ,p_attribute5 => '');
11761 END IF;
11762 RAISE FND_API.G_EXC_ERROR;
11763 END IF;
11764 END IF;
11765
11766
11767 /*
11768 1) Give an error when a value is passed to p_inv_ind_rate_sch_id and it is invalid.
11769 2) Give an error when the Burden Schedule type is (Provisional) for the attached invoice burden schedule
11770 and the p_inv_ind_sch_fixed_date date is being passed.
11771 */
11772
11773 IF p_inv_ind_rate_sch_id IS NOT NULL
11774 AND p_inv_ind_rate_sch_id <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
11775 THEN
11776
11777 OPEN l_inv_rate_schedule_type_csr(p_inv_ind_rate_sch_id);
11778 FETCH l_inv_rate_schedule_type_csr INTO l_inv_rate_schedule_type;
11779 IF l_inv_rate_schedule_type_csr%NOTFOUND THEN
11780 CLOSE l_inv_rate_schedule_type_csr;
11781 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
11782 THEN
11783 pa_interface_utils_pub.map_new_amg_msg
11784 ( p_old_message_code => 'PA_INVALID_INV_SCH_ID'
11785 ,p_msg_attribute => 'CHANGE'
11786 ,p_resize_flag => 'Y'
11787 ,p_msg_context => 'TASK'
11788 ,p_attribute1 => l_amg_segment1
11789 ,p_attribute2 => l_amg_task_number
11790 ,p_attribute3 => ''
11791 ,p_attribute4 => ''
11792 ,p_attribute5 => '');
11793 END IF;
11794 RAISE FND_API.G_EXC_ERROR;
11795 END IF;
11796 CLOSE l_inv_rate_schedule_type_csr;
11797 IF l_inv_rate_schedule_type = 'P'
11798 THEN
11799 IF p_inv_ind_sch_fixed_date IS NOT NULL
11800 AND p_inv_ind_sch_fixed_date <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE
11801 THEN
11802 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
11803 THEN
11804 pa_interface_utils_pub.map_new_amg_msg
11805 ( p_old_message_code => 'PA_CNT_FIX_INV_DTE_PROV'
11806 ,p_msg_attribute => 'CHANGE'
11807 ,p_resize_flag => 'Y'
11808 ,p_msg_context => 'TASK'
11809 ,p_attribute1 => l_amg_segment1
11810 ,p_attribute2 => l_amg_task_number
11811 ,p_attribute3 => ''
11812 ,p_attribute4 => ''
11813 ,p_attribute5 => '');
11814 END IF;
11815 RAISE FND_API.G_EXC_ERROR;
11816 END IF;
11817 END IF;
11818 END IF;
11819
11820 END IF; /*END IF OF NON LAB SCH TYPE = 'B'*/
11821
11822 /*START OF VALIDATIONS FOR LABOR_SCH_TYPE = B*/
11823
11824 IF p_labor_sch_type = 'B' THEN
11825
11826 /*
11827 Give an error only when if employee_bill_rate_sch_id passed is invalid
11828 */
11829
11830 IF p_emp_bill_rate_schedule_id IS NOT NULL
11831 AND p_emp_bill_rate_schedule_id <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
11832 THEN
11833 OPEN l_emp_rate_sch_id_csr( p_emp_bill_rate_schedule_id);
11834 FETCH l_emp_rate_sch_id_csr INTO l_temp_dummy;
11835 IF l_emp_rate_sch_id_csr%NOTFOUND
11836 THEN
11837 CLOSE l_emp_rate_sch_id_csr;
11838
11839 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
11840 THEN
11841 pa_interface_utils_pub.map_new_amg_msg
11842 ( p_old_message_code => 'PA_INVALID_EMP_SCH_ID'
11843 ,p_msg_attribute => 'CHANGE'
11844 ,p_resize_flag => 'Y'
11845 ,p_msg_context => 'TASK'
11846 ,p_attribute1 => l_amg_segment1
11847 ,p_attribute2 => l_amg_task_number
11848 ,p_attribute3 => ''
11849 ,p_attribute4 => ''
11850 ,p_attribute5 => '');
11851 END IF;
11852 RAISE FND_API.G_EXC_ERROR;
11853 END IF;
11854 CLOSE l_emp_rate_sch_id_csr;
11855 END IF;
11856
11857 /*
11858 1) If prm is not licensed then job_bill_rate_schedule_id is not mandatory
11859 2) when prm is licensed then
11860 - Give an error when job_bill_rate_schedule_id is null.
11861 - Give an error when job_bill_rate_schedule_id is not passed and
11862 the the labor schedule type is changed from 'I' to 'B'
11863 */
11864
11865 IF pa_install.is_prm_licensed='Y' THEN
11866 IF p_job_bill_rate_schedule_id IS NULL
11867 THEN
11868 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
11869 THEN
11870 pa_interface_utils_pub.map_new_amg_msg
11871 ( p_old_message_code => 'PA_JOB_SCH_ID_NOT_NULL'
11872 ,p_msg_attribute => 'CHANGE'
11873 ,p_resize_flag => 'Y'
11874 ,p_msg_context => 'TASK'
11875 ,p_attribute1 => l_amg_segment1
11876 ,p_attribute2 => l_amg_task_number
11877 ,p_attribute3 => ''
11878 ,p_attribute4 => ''
11879 ,p_attribute5 => '');
11880 END IF;
11881 RAISE FND_API.G_EXC_ERROR;
11882 ELSIF p_job_bill_rate_schedule_id = PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
11883 THEN
11884 IF p_lab_db_sch_type = 'I' THEN
11885 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
11886 THEN
11887 pa_interface_utils_pub.map_new_amg_msg
11888 ( p_old_message_code => 'PA_JOB_SCH_ID_NOT_NULL'
11889 ,p_msg_attribute => 'CHANGE'
11890 ,p_resize_flag => 'Y'
11891 ,p_msg_context => 'TASK'
11892 ,p_attribute1 => l_amg_segment1
11893 ,p_attribute2 => l_amg_task_number
11894 ,p_attribute3 => ''
11895 ,p_attribute4 => ''
11896 ,p_attribute5 => '');
11897 END IF;
11898 RAISE FND_API.G_EXC_ERROR;
11899 END IF;
11900 END IF;
11901 END IF;
11902
11903 /*
11904 Give an error when the job_bill_rate_schedule_id is invalid
11905 */
11906
11907 IF p_job_bill_rate_schedule_id IS NOT NULL
11908 AND p_job_bill_rate_schedule_id <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
11909 THEN
11910 l_temp_dummy:=null;
11911 OPEN l_job_rate_sch_id_csr( p_job_bill_rate_schedule_id);
11912 FETCH l_job_rate_sch_id_csr INTO l_temp_dummy;
11913 IF l_job_rate_sch_id_csr%NOTFOUND
11914 THEN
11915 CLOSE l_job_rate_sch_id_csr;
11916 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
11917 THEN
11918 pa_interface_utils_pub.map_new_amg_msg
11919 ( p_old_message_code => 'PA_INVALID_JOB_SCH_ID'
11920 ,p_msg_attribute => 'CHANGE'
11921 ,p_resize_flag => 'Y'
11922 ,p_msg_context => 'TASK'
11923 ,p_attribute1 => l_amg_segment1
11924 ,p_attribute2 => l_amg_task_number
11925 ,p_attribute3 => ''
11926 ,p_attribute4 => ''
11927 ,p_attribute5 => '');
11928 END IF;
11929 RAISE FND_API.G_EXC_ERROR;
11930 END IF;
11931 CLOSE l_job_rate_sch_id_csr;
11932 END IF;
11933
11934
11935 l_temp_dummy := null;
11936
11937 --BUG_9873652
11938 -- Determine whether Discount Reason is required with entry of override information
11939 --and also if reason is required when entering discount % in billing schedules.
11940 OPEN get_rate_discount_reason_flag;
11941 FETCH get_rate_discount_reason_flag INTO l_rate_discount_reason_flag;
11942 CLOSE get_rate_discount_reason_flag;
11943
11944 /*
11945 1) Give an error when the labor_schedule_discount is null or PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM and
11946 a value is being passed to non_labor_disc_reason_code.
11947 2) Give an error when labor_schedule_discount is not null and <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
11948 and labor_disc_reason_code is null or =PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
11949 3) Give an error when labor_schedule_discount is not null and <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
11950 and the labor_disc_reason_code passed is invalid
11951 */
11952
11953 IF (p_labor_schedule_discount IS NULL OR
11954 p_labor_schedule_discount = PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM)
11955 THEN
11956 IF p_labor_disc_reason_code IS NOT NULL
11957 AND p_labor_disc_reason_code<> PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
11958 THEN
11959 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
11960 THEN
11961 pa_interface_utils_pub.map_new_amg_msg
11962 ( p_old_message_code => 'PA_LAB_DISC_REASON_CODE'
11963 ,p_msg_attribute => 'CHANGE'
11964 ,p_resize_flag => 'Y'
11965 ,p_msg_context => 'TASK'
11966 ,p_attribute1 => l_amg_segment1
11967 ,p_attribute2 => l_amg_task_number
11968 ,p_attribute3 => ''
11969 ,p_attribute4 => ''
11970 ,p_attribute5 => '');
11971 END IF;
11972 RAISE FND_API.G_EXC_ERROR;
11973 END IF;
11974 elsif (p_labor_schedule_discount IS NOT NULL
11975 AND p_labor_schedule_discount <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
11976 AND l_rate_discount_reason_flag = 'Y') --BUG_9873652
11977 THEN
11978 IF p_labor_disc_reason_code IS NULL
11979 OR p_labor_disc_reason_code= PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR
11980 THEN
11981 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
11982 THEN
11983 pa_interface_utils_pub.map_new_amg_msg
11984 ( p_old_message_code => 'PA_LAB_DISC_CODE_NOT_NULL'
11985 ,p_msg_attribute => 'CHANGE'
11986 ,p_resize_flag => 'Y'
11987 ,p_msg_context => 'TASK'
11988 ,p_attribute1 => l_amg_segment1
11989 ,p_attribute2 => l_amg_task_number
11990 ,p_attribute3 => ''
11991 ,p_attribute4 => ''
11992 ,p_attribute5 => '');
11993 END IF;
11994 RAISE FND_API.G_EXC_ERROR;
11995 ELSE
11996 OPEN get_lab_disc_reason_code_csr(p_labor_disc_reason_code);
11997 FETCH get_lab_disc_reason_code_csr INTO l_temp_dummy;
11998 IF get_lab_disc_reason_code_csr%NOTFOUND THEN
11999 CLOSE get_lab_disc_reason_code_csr;
12000 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
12001 THEN
12002 pa_interface_utils_pub.map_new_amg_msg
12003 ( p_old_message_code => 'PA_INVALID_LDISC_RN_CODE'
12004 ,p_msg_attribute => 'CHANGE'
12005 ,p_resize_flag => 'Y'
12006 ,p_msg_context => 'TASK'
12007 ,p_attribute1 => l_amg_segment1
12008 ,p_attribute2 => l_amg_task_number
12009 ,p_attribute3 => ''
12010 ,p_attribute4 => ''
12011 ,p_attribute5 => '');
12012 END IF;
12013 RAISE FND_API.G_EXC_ERROR;
12014 END IF;
12015 CLOSE get_lab_disc_reason_code_csr;
12016 END IF;
12017 END IF;
12018
12019
12020
12021 ELSE /*ELSE OF LABOR SCH TYPE = 'B'*/
12022
12023
12024 /*
12025 1) Give an error when p_rev_ind_rate_sch_id is null
12026 2) Give an error when p_rev_ind_rate_sch_id not passed(PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM)
12027 and the schedule_type is being changed from 'B' to 'I'
12028 */
12029
12030 IF p_rev_ind_rate_sch_id IS NULL THEN
12031 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
12032 THEN
12033 pa_interface_utils_pub.map_new_amg_msg
12034 ( p_old_message_code => 'PA_REV_SCH_ID_NOT_NULL'
12035 ,p_msg_attribute => 'CHANGE'
12036 ,p_resize_flag => 'Y'
12037 ,p_msg_context => 'TASK'
12038 ,p_attribute1 => l_amg_segment1
12039 ,p_attribute2 => l_amg_task_number
12040 ,p_attribute3 => ''
12041 ,p_attribute4 => ''
12042 ,p_attribute5 => '');
12043 END IF;
12044 RAISE FND_API.G_EXC_ERROR;
12045 ELSIF p_rev_ind_rate_sch_id = PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM THEN
12046 IF p_lab_db_sch_type = 'B' THEN
12047 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
12048 THEN
12049 pa_interface_utils_pub.map_new_amg_msg
12050 ( p_old_message_code => 'PA_REV_SCH_ID_NOT_NULL'
12051 ,p_msg_attribute => 'CHANGE'
12052 ,p_resize_flag => 'Y'
12053 ,p_msg_context => 'TASK'
12054 ,p_attribute1 => l_amg_segment1
12055 ,p_attribute2 => l_amg_task_number
12056 ,p_attribute3 => ''
12057 ,p_attribute4 => ''
12058 ,p_attribute5 => '');
12059 END IF;
12060 RAISE FND_API.G_EXC_ERROR;
12061 END IF;
12062 END IF;
12063
12064
12065 /*
12066 1) Give an error when a value is passed to p_rev_ind_rate_sch_id and it is invalid.
12067 2) Give an error when the Burden Schedule type is P (Provisional) for the attached revenue burden schedule
12068 and the p_rev_ind_sch_fixed_date date is being passed.
12069 */
12070
12071 IF p_rev_ind_rate_sch_id IS NOT NULL
12072 AND p_rev_ind_rate_sch_id <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM
12073 THEN
12074
12075 OPEN l_rev_rate_schedule_type_csr(p_rev_ind_rate_sch_id);
12076 FETCH l_rev_rate_schedule_type_csr INTO l_rev_rate_schedule_type;
12077 IF l_rev_rate_schedule_type_csr%NOTFOUND THEN
12078 CLOSE l_rev_rate_schedule_type_csr;
12079 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
12080 THEN
12081 pa_interface_utils_pub.map_new_amg_msg
12082 ( p_old_message_code => 'PA_INVALID_REV_SCH_ID'
12083 ,p_msg_attribute => 'CHANGE'
12084 ,p_resize_flag => 'Y'
12085 ,p_msg_context => 'TASK'
12086 ,p_attribute1 => l_amg_segment1
12087 ,p_attribute2 => l_amg_task_number
12088 ,p_attribute3 => ''
12089 ,p_attribute4 => ''
12090 ,p_attribute5 => '');
12091 END IF;
12092 END IF;
12093 CLOSE l_rev_rate_schedule_type_csr;
12094 IF l_rev_rate_schedule_type = 'P'
12095 THEN
12096 IF p_rev_ind_sch_fixed_date IS NOT NULL
12097 AND p_rev_ind_sch_fixed_date <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE
12098 THEN
12099 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
12100 THEN
12101 pa_interface_utils_pub.map_new_amg_msg
12102 ( p_old_message_code => 'PA_CNT_FIX_REV_DTE_PROV'
12103 ,p_msg_attribute => 'CHANGE'
12104 ,p_resize_flag => 'Y'
12105 ,p_msg_context => 'TASK'
12106 ,p_attribute1 => l_amg_segment1
12107 ,p_attribute2 => l_amg_task_number
12108 ,p_attribute3 => ''
12109 ,p_attribute4 => ''
12110 ,p_attribute5 => '');
12111 END IF;
12112 RAISE FND_API.G_EXC_ERROR;
12113 END IF;
12114 END IF;
12115 END IF;
12116
12117
12118 l_temp_dummy :=null;
12119
12120 /*
12121 1) Give an error when p_inv_ind_rate_sch_id is null
12122 2) Give an error when p_inv_ind_rate_sch_id not passed(PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM)
12123 and the schedule_type is being changed from 'B'(bill) to 'I'(burden)
12124 */
12125
12126 IF p_inv_ind_rate_sch_id IS NULL THEN
12127 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
12128 THEN
12129 pa_interface_utils_pub.map_new_amg_msg
12130 ( p_old_message_code => 'PA_INV_SCH_ID_NOT_NULL'
12131 ,p_msg_attribute => 'CHANGE'
12132 ,p_resize_flag => 'Y'
12133 ,p_msg_context => 'TASK'
12134 ,p_attribute1 => l_amg_segment1
12135 ,p_attribute2 => l_amg_task_number
12136 ,p_attribute3 => ''
12137 ,p_attribute4 => ''
12138 ,p_attribute5 => '');
12139 END IF;
12140 RAISE FND_API.G_EXC_ERROR;
12141 ELSIF p_inv_ind_rate_sch_id = PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM THEN
12142 IF p_lab_db_sch_type = 'B' THEN
12143 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
12144 THEN
12145 pa_interface_utils_pub.map_new_amg_msg
12146 ( p_old_message_code => 'PA_INV_SCH_ID_NOT_NULL'
12147 ,p_msg_attribute => 'CHANGE'
12148 ,p_resize_flag => 'Y'
12149 ,p_msg_context => 'TASK'
12150 ,p_attribute1 => l_amg_segment1
12151 ,p_attribute2 => l_amg_task_number
12152 ,p_attribute3 => ''
12153 ,p_attribute4 => ''
12154 ,p_attribute5 => '');
12155 END IF;
12156 RAISE FND_API.G_EXC_ERROR;
12157 END IF;
12158 END IF;
12159
12160
12161 /*
12162 1) Give an error when a value is passed to p_inv_ind_rate_sch_id and it is invalid.
12163 2) Give an error when the Burden Schedule type is P(Provisional) for the attached invoice burden schedule
12164 and the p_inv_ind_sch_fixed_date date is being passed.
12165 */
12166
12167 IF (p_inv_ind_rate_sch_id IS NOT NULL
12168 AND p_inv_ind_rate_sch_id <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM)
12169 THEN
12170
12171 OPEN l_inv_rate_schedule_type_csr(p_inv_ind_rate_sch_id);
12172 FETCH l_inv_rate_schedule_type_csr INTO l_inv_rate_schedule_type;
12173 IF l_inv_rate_schedule_type_csr%NOTFOUND THEN
12174 CLOSE l_inv_rate_schedule_type_csr;
12175 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
12176 THEN
12177 pa_interface_utils_pub.map_new_amg_msg
12178 ( p_old_message_code => 'PA_INVALID_INV_SCH_ID'
12179 ,p_msg_attribute => 'CHANGE'
12180 ,p_resize_flag => 'Y'
12181 ,p_msg_context => 'TASK'
12182 ,p_attribute1 => l_amg_segment1
12183 ,p_attribute2 => l_amg_task_number
12184 ,p_attribute3 => ''
12185 ,p_attribute4 => ''
12186 ,p_attribute5 => '');
12187 END IF;
12188 END IF;
12189 CLOSE l_inv_rate_schedule_type_csr;
12190 IF l_inv_rate_schedule_type = 'P'
12191 THEN
12192 IF p_inv_ind_sch_fixed_date IS NOT NULL
12193 AND p_inv_ind_sch_fixed_date <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_DATE
12194 THEN
12195 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_ERROR)
12196 THEN
12197 pa_interface_utils_pub.map_new_amg_msg
12198 ( p_old_message_code => 'PA_CNT_FIX_INV_DTE_PROV'
12199 ,p_msg_attribute => 'CHANGE'
12200 ,p_resize_flag => 'Y'
12201 ,p_msg_context => 'TASK'
12202 ,p_attribute1 => l_amg_segment1
12203 ,p_attribute2 => l_amg_task_number
12204 ,p_attribute3 => ''
12205 ,p_attribute4 => ''
12206 ,p_attribute5 => '');
12207 END IF;
12208 RAISE FND_API.G_EXC_ERROR;
12209 END IF;
12210 END IF;
12211 END IF;
12212
12213
12214
12215 END IF; /*END IF OF LAB SCH TYPE = 'B'*/
12216
12217
12218
12219
12220
12221 EXCEPTION
12222
12223 WHEN FND_API.G_EXC_ERROR
12224 THEN
12225 /* dbms_output.put_line('handling an G_EXC_ERROR exception'); */
12226
12227 p_return_status := FND_API.G_RET_STS_ERROR;
12228
12229
12230 WHEN FND_API.G_EXC_UNEXPECTED_ERROR
12231 THEN
12232 /* dbms_output.put_line('handling an G_EXC_UNEXPECTED_ERROR exception'); */
12233
12234 p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
12235
12236
12237 WHEN OTHERS THEN
12238 /* dbms_output.put_line('handling an OTHERS exception'); */
12239
12240 p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
12241
12242
12243 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
12244 THEN
12245 FND_MSG_PUB.add_exc_msg
12246 ( p_pkg_name => G_PKG_NAME
12247 , p_procedure_name => l_api_name );
12248
12249 END IF;
12250
12251 end validate_schedule_values;
12252
12253 --====================================================================================
12254 --Name: VALIDATE_DATA
12255 --
12256 --Type: Procedure
12257 --Description: This procedure is to do different kinds of data validation
12258 -- while creating, updating a project or task.
12259 --
12260 --Validations 1) Validating if all the customers added to tasks
12261 -- in a project are project customers or not if enable top task
12262 -- customer flag is set at project level.
12263 -- 2) Validating that only one project customer is marked as
12264 -- default top task customer if enable top task
12265 -- customer flag is set at project level.
12266 --History:
12267 -- 08-Jan-2007 apangana Created validation 1, 2
12268 -- 10-Oct-2008 rthumma Bug 7255015 : Modified cursor any_invalid_customer
12269 -- in procedure VALIDATE_DATA
12270 --====================================================================================
12271 PROCEDURE VALIDATE_DATA
12272 (p_project_id IN NUMBER ,
12273 p_calling_context IN VARCHAR2,
12274 x_return_status OUT NOCOPY VARCHAR2,
12275 x_msg_count OUT NOCOPY NUMBER ,
12276 x_msg_data OUT NOCOPY VARCHAR2 ) IS
12277
12278 -- Bug 7255015
12279 cursor any_invalid_customer is
12280 SELECT 'Y' FROM pa_tasks
12281 WHERE project_id = p_project_id
12282 AND parent_task_id IS NULL
12283 AND nvl(customer_id, -1) NOT IN (select customer_id
12284 from pa_project_customers
12285 where project_id=p_project_id);
12286
12287 l_any_invalid_customer varchar2(1) :='N';
12288
12289 valid_def_ttsk_cust VARCHAR2(1) :='N';
12290
12291 cursor project_data is
12292 select enable_top_task_customer_flag
12293 from pa_projects_all
12294 where project_id=p_project_id;
12295
12296 l_enable_tt_cust_flag varchar2(1) :='N';
12297 l_cust_count number;
12298
12299 l_msg_count NUMBER := 0;
12300 l_data VARCHAR2(2000);
12301 l_msg_data VARCHAR2(2000);
12302 l_msg_index_out NUMBER;
12303 l_debug_mode VARCHAR2(1);
12304 BEGIN
12305
12306 x_return_status := FND_API.G_RET_STS_SUCCESS;
12307 x_msg_count :=0;
12308 l_debug_mode := NVL(FND_PROFILE.value('PA_DEBUG_MODE'),'N');
12309
12310 IF l_debug_mode = 'Y' THEN
12311 pa_debug.set_curr_function( p_function => 'VALIDATE_DATA',
12312 p_debug_mode => l_debug_mode );
12313 pa_debug.g_err_stage:= 'Entered VALIDATE_DATA';
12314 pa_debug.write('PA_PROJECT_PVT.VALIDATE_DATA',pa_debug.g_err_stage,3);
12315 END IF;
12316 --validation 1
12317
12318 open project_data;
12319 fetch project_data into l_enable_tt_cust_flag;
12320 close project_data;
12321
12322 if (p_calling_context in ('CREATE_PROJECT','UPDATE_PROJECT')
12323 and l_enable_tt_cust_flag = 'Y') then
12324 open any_invalid_customer;
12325 fetch any_invalid_customer into l_any_invalid_customer;
12326 close any_invalid_customer;
12327
12328 if l_any_invalid_customer = 'Y' then
12329 select count(*) into l_cust_count
12330 from pa_project_customers
12331 where project_id=p_project_id;
12332
12333 if l_cust_count > 0 then
12334 x_return_status := FND_API.G_RET_STS_ERROR;
12335 PA_UTILS.ADD_MESSAGE(p_app_short_name => 'PA'
12336 ,p_msg_name => 'PA_INVALID_TASK_CUSTOMER');
12337 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
12338 end if;
12339 end if;
12340 end if;
12341
12342 IF l_debug_mode = 'Y' THEN
12343 pa_debug.g_err_stage:= 'Validation for invalid task customers was done';
12344 pa_debug.write('PA_PROJECT_PVT.VALIDATE_DATA',pa_debug.g_err_stage,3);
12345 END IF;
12346
12347 --validation 2
12348 if (p_calling_context = 'UPDATE_PROJECT' and l_enable_tt_cust_flag = 'Y') then
12349 begin
12350 select 'Y' into valid_def_ttsk_cust
12351 from pa_project_customers
12352 where project_id=p_project_id
12353 and default_top_task_cust_flag='Y';
12354 exception
12355 when NO_DATA_FOUND then
12356
12357 select count(*) into l_cust_count
12358 from pa_project_customers
12359 where project_id=p_project_id;
12360
12361 if l_cust_count > 0 then
12362 x_return_status := FND_API.G_RET_STS_ERROR;
12363 PA_UTILS.ADD_MESSAGE(p_app_short_name => 'PA'
12364 ,p_msg_name => 'PA_INC_NUM_DEF_TT_CUST');
12365 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
12366 end if;
12367 when TOO_MANY_ROWS then
12368 x_return_status := FND_API.G_RET_STS_ERROR;
12369 PA_UTILS.ADD_MESSAGE(p_app_short_name => 'PA'
12370 ,p_msg_name => 'PA_INC_NUM_DEF_TT_CUST');
12371 RAISE PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc;
12372 end;
12373 end if;
12374
12375 IF l_debug_mode = 'Y' THEN
12376 pa_debug.g_err_stage:= 'Validation for single default top task customer was done';
12377 pa_debug.write('PA_PROJECT_PVT.VALIDATE_DATA',pa_debug.g_err_stage,3);
12378 END IF;
12379
12380 IF l_debug_mode = 'Y' THEN
12381 pa_debug.reset_curr_function;
12382 END IF;
12383
12384 EXCEPTION
12385 WHEN PA_FP_CONSTANTS_PKG.Invalid_Arg_Exc THEN
12386 IF x_return_status IS NULL OR
12387 x_return_status = FND_API.G_RET_STS_SUCCESS THEN
12388 x_return_status := FND_API.G_RET_STS_ERROR;
12389 END IF;
12390
12391 l_msg_count := FND_MSG_PUB.count_msg;
12392
12393 IF l_msg_count = 1 AND x_msg_data IS NULL THEN
12394 PA_INTERFACE_UTILS_PUB.get_messages
12395 (p_encoded => FND_API.G_TRUE,
12396 p_msg_index => 1,
12397 p_msg_count => l_msg_count,
12398 p_msg_data => l_msg_data,
12399 p_data => l_data,
12400 p_msg_index_out => l_msg_index_out);
12401
12402 x_msg_data := l_data;
12403 x_msg_count := l_msg_count;
12404 ELSE
12405 x_msg_count := l_msg_count;
12406 END IF;
12407
12408 IF l_debug_mode = 'Y' THEN
12409 pa_debug.reset_curr_function;
12410 END IF;
12411 RETURN;
12412 WHEN OTHERS THEN
12413 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
12414 x_msg_count := 1;
12415 x_msg_data := SQLERRM;
12416 FND_MSG_PUB.add_exc_msg( p_pkg_name => 'PA_PROJECT_PVT'
12417 ,p_procedure_name => 'VALIDATE_DATA'
12418 ,p_error_text => sqlerrm);
12419
12420 IF l_debug_mode = 'Y' THEN
12421 pa_debug.G_Err_Stack := SQLERRM;
12422 pa_debug.write('PA_PROJECT_PVT.VALIDATE_DATA' ,pa_debug.G_Err_Stack,4);
12423 pa_debug.reset_curr_function;
12424 END IF;
12425 RAISE;
12426
12427 END VALIDATE_DATA;
12428
12429 /* Added for Concurrency issues to get the project level locks while calling the AMG APIs 14201006 */
12430 Procedure CONC_LOCK_PROJECT(
12431 p_project_id Number ,
12432 p_lock_mode varchar2,
12433 x_msg_data OUT NOCOPY VARCHAR2 ,
12434 x_return_status OUT NOCOPY VARCHAR2)
12435 IS
12436 v_lockhandle varchar2(200);
12437 v_result number;
12438
12439 BEGIN
12440
12441 --dbms_lock.allocate_unique('CONC_PROJECT-'||to_char(p_project_id), v_lockhandle);
12442
12443 x_return_status:='S';
12444 IF p_lock_mode in ('ADD','UPDATE','PROGRESS') THEN
12445 v_result := dbms_lock.request(id => p_project_id,lockmode => dbms_lock.s_mode, timeout => 1 );
12446 ELSIF p_lock_mode in ('DELETE','MOVE','INDENT','OUTDENT','ROLLUP','ADD_F') THEN
12447 --v_result := dbms_lock.request(lockhandle=> v_lockhandle,lockmode => dbms_lock.x_mode, timeout => 1 );
12448 v_result := dbms_lock.request(id => p_project_id,lockmode => dbms_lock.x_mode, timeout => 1 );
12449 ELSE
12450 x_msg_data:='PA_INVALID_LOCK_MODE';
12451 x_return_status:='E';
12452 return;
12453 END IF;
12454
12455 IF v_result <> 0 THEN
12456 x_return_status:='E';
12457 IF p_lock_mode in ('ADD','UPDATE','PROGRESS') THEN
12458 x_msg_data:='PA_CANT_PERFM_ADD_UPD_PRGSS';
12459 ELSE
12460 x_msg_data:='PA_CANT_CHANGE_STRUCTURE';
12461 END IF;
12462 END IF;
12463 EXCEPTION
12464 WHEN OTHERS THEN
12465 x_return_status:='E';
12466 END CONC_LOCK_PROJECT;
12467
12468
12469 PROCEDURE CONC_RELEASE_LOCK_PROJECT (p_project_id Number)
12470 IS
12471 v_lockhandle varchar2(200);
12472 v_result number;
12473 begin
12474
12475 --dbms_lock.allocate_unique('CONC_PROJECT-'||to_char(p_project_id), v_lockhandle);
12476 --v_result := dbms_lock.release(v_lockhandle);
12477 v_result := dbms_lock.release(id=> p_project_id);
12478
12479 END CONC_RELEASE_LOCK_PROJECT;
12480
12481
12482
12483 Procedure LOG_ROLLUP_EVENT(
12484 p_project_id Number ,p_struc_Ver_Id Number,
12485 p_lock_mode varchar2 )
12486 IS
12487 Cursor C1 IS
12488 SELECT Count(1) FROM PA_PJI_PROJ_EVENTS_LOG
12489 where event_object=p_project_id
12490 AND EVENT_TYPE='DEFER_ROLLUP';
12491 L_ATTRIBUTE3 VARCHAR2(2000);
12492 l_rec_count NUMBER;
12493
12494 BEGIN
12495
12496 Open C1;
12497 Fetch C1 into l_rec_count;
12498 CLOSE C1;
12499
12500 If l_rec_count = 0 THEN
12501 INSERT INTO PA_PJI_PROJ_EVENTS_LOG (EVENT_ID,EVENT_TYPE,EVENT_OBJECT,ATTRIBUTE3,OPERATION_TYPE,
12502 STATUS,LAST_UPDATE_DATE,LAST_UPDATED_BY,CREATION_DATE,CREATED_BY,ATTRIBUTE4)
12503 VALUES (pa_pji_proj_events_log_s.nextval,'DEFER_ROLLUP',p_project_id,p_lock_mode,'I','X',SYSDATE,-1,SYSDATE,-1,p_struc_Ver_Id);
12504 ELSE
12505
12506 SELECT ATTRIBUTE3 INTO L_ATTRIBUTE3 FROM PA_PJI_PROJ_EVENTS_LOG
12507 where event_object=p_project_id AND EVENT_TYPE='DEFER_ROLLUP' and rownum = 1;
12508
12509 IF INSTR(L_ATTRIBUTE3,p_lock_mode) = 0 THEN
12510 UPDATE PA_PJI_PROJ_EVENTS_LOG
12511 SET ATTRIBUTE3=ATTRIBUTE3||','||p_lock_mode
12512 WHERE event_object=p_project_id AND EVENT_TYPE='DEFER_ROLLUP';
12513 END IF;
12514 END IF;
12515
12516 END LOG_ROLLUP_EVENT;
12517
12518
12519 Procedure LOG_TASK_LEVEL_EVENT(
12520 p_project_id Number,
12521 p_task_id Number,
12522 p_structure_version_id Number,
12523 p_event_mode varchar2 )
12524 IS
12525 l_parent_task_id Number;
12526 l_top_parent_task_id Number;
12527
12528 --This returns the parent task id when poj element id is passed
12529 Cursor Get_Parent_Task_Id(l_task_id NUMBER) IS
12530 SELECT parent_task_id
12531 FROM pa_tasks
12532 WHERE project_id=p_project_id and task_id=l_task_id;
12533
12534 /*Cursor Get_Top_Task_Id IS
12535 Select top_task_id from PA_TASKS pt , PA_PROJ_ELEMENT_VERSIONS ppev
12536 where pt.project_id=p_project_id and ppev.proj_element_id=pt.task_id
12537 and ppev.element_version_id=p_task_id and ppev.parent_structure_version_id=p_structure_version_id;*/
12538
12539 --This returns the parent task id when element version id is passed
12540 Cursor get_parent_task(l_task_id NUMBER) IS
12541 Select parent_task_id from PA_TASKS pt , PA_PROJ_ELEMENT_VERSIONS ppev
12542 where pt.project_id=p_project_id and ppev.proj_element_id=pt.task_id
12543 and ppev.element_version_id=l_task_id and ppev.parent_structure_version_id=p_structure_version_id;
12544
12545 BEGIN
12546
12547 If p_event_mode ='ADD_FIRST' THEN
12548 UPDATE PA_PROJ_ELEMENT_VERSIONS SET DEFER_CODE='C'
12549 WHERE project_id=p_project_id and element_version_id=p_task_id;
12550 ELSIF p_event_mode in ('ADD_INC','UPDATE') THEN
12551 UPDATE PA_PROJ_ELEMENT_VERSIONS SET DEFER_CODE='C'
12552 WHERE project_id=p_project_id and NVL(DEFER_CODE,'X') not in ('S','P')
12553 AND proj_element_id=p_task_id AND parent_structure_version_id=p_structure_version_id;
12554 ELSIF p_event_mode='DELETE' THEN
12555 OPEN Get_Parent_Task_Id(p_task_id);
12556 FETCH Get_Parent_Task_Id INTO l_parent_task_id;
12557 CLOSE Get_Parent_Task_Id;
12558
12559 UPDATE PA_PROJ_ELEMENT_VERSIONS SET DEFER_CODE='D'
12560 WHERE project_id=p_project_id and NVL(DEFER_CODE,'X')<>'S'
12561 AND proj_element_id=l_parent_task_id AND parent_structure_version_id=p_structure_version_id;
12562
12563 ELSIF p_event_mode = 'INDENT' THEN --Mark only task as S
12564 /*OPEN Get_Top_Task_Id;
12565 FETCH Get_Top_Task_Id INTO l_top_task_id;
12566 CLOSE Get_Top_Task_Id;
12567
12568 UPDATE PA_PROJ_ELEMENT_VERSIONS SET DEFER_CODE='S'
12569 WHERE project_id=p_project_id AND proj_element_id=l_top_task_id
12570 AND parent_structure_version_id=p_structure_version_id;*/
12571 UPDATE PA_PROJ_ELEMENT_VERSIONS SET DEFER_CODE='S'
12572 WHERE project_id=p_project_id and element_version_id=p_task_id
12573 AND parent_structure_version_id=p_structure_version_id;
12574
12575 ELSIF p_event_mode = 'OUTDENT' THEN -- Mark its parent task and parent of parent task id as S
12576 OPEN get_parent_task(p_task_id);
12577 FETCH get_parent_task INTO l_parent_task_id;
12578 CLOSE get_parent_task;
12579
12580 OPEN Get_Parent_Task_Id(l_parent_task_id);
12581 FETCH Get_Parent_Task_Id INTO l_top_parent_task_id;
12582 CLOSE Get_Parent_Task_Id;
12583
12584 UPDATE PA_PROJ_ELEMENT_VERSIONS SET DEFER_CODE='S'
12585 WHERE project_id=p_project_id
12586 AND proj_element_id in (l_parent_task_id,l_top_parent_task_id)
12587 AND parent_structure_version_id=p_structure_version_id;
12588
12589 ELSIF p_event_mode = 'MOVE' THEN -- Mark its parent task and the task id as S
12590 OPEN get_parent_task(p_task_id);
12591 FETCH get_parent_task INTO l_parent_task_id;
12592 CLOSE get_parent_task;
12593
12594 UPDATE PA_PROJ_ELEMENT_VERSIONS SET DEFER_CODE='S'
12595 WHERE project_id=p_project_id
12596 AND proj_element_id =l_parent_task_id
12597 AND parent_structure_version_id=p_structure_version_id;
12598
12599 UPDATE PA_PROJ_ELEMENT_VERSIONS SET DEFER_CODE='S'
12600 WHERE project_id=p_project_id
12601 AND element_version_id =p_task_id
12602 AND parent_structure_version_id=p_structure_version_id;
12603
12604 ELSIF p_event_mode='PROGRESS' THEN
12605 UPDATE PA_PROJ_ELEMENT_VERSIONS SET DEFER_CODE='P'
12606 WHERE project_id=p_project_id and NVL(DEFER_CODE,'X') not in ('S','P')
12607 AND proj_element_id=p_task_id AND parent_structure_version_id=p_structure_version_id;
12608 ELSE
12609 RAISE FND_API.G_EXC_ERROR;
12610 END IF;
12611 END LOG_TASK_LEVEL_EVENT;
12612
12613 end PA_PROJECT_PVT;