1 PACKAGE BODY AHL_VWP_PROJ_PROD_PVT AS
2 /* $Header: AHLVPRDB.pls 120.50 2008/06/05 07:09:32 sathapli ship $ */
3
4 -- Global CONSTANTS
5 G_PKG_NAME CONSTANT VARCHAR2(30) := 'AHL_VWP_PROJ_PROD_PVT';
6 --G_DEBUG VARCHAR2(1):= FND_PROFILE.VALUE('AHL_API_FILE_DEBUG_ON');
7 G_DEBUG VARCHAR2(1) := AHL_DEBUG_PUB.is_log_enabled;
8
9 G_PM_PRODUCT_CODE CONSTANT VARCHAR2(30) := 'AHL';
10
11 ------------------------------------
12 -- Common constants and variables --
13 ------------------------------------
14 l_log_current_level NUMBER := fnd_log.g_current_runtime_level;
15 l_log_statement NUMBER := fnd_log.level_statement;
16 l_log_procedure NUMBER := fnd_log.level_procedure;
17 l_log_error NUMBER := fnd_log.level_error;
18 l_log_unexpected NUMBER := fnd_log.level_unexpected;
19 -----------------------------------------------------------------
20
21 -- Record Type for track on tasks for which jobs has been created
22 TYPE Job_Rec_Type IS RECORD
23 (TASK_ID NUMBER,
24 WORKORDER_ID NUMBER,
25 RETURN_STATUS VARCHAR2(30));
26
27 -- Table Type for Unit config check on SerialId
28 TYPE Job_Tbl_Type IS TABLE OF Job_Rec_Type
29 INDEX BY BINARY_INTEGER;
30
31 -- Table Type for Dept for Tasks
32 TYPE Dept_Tbl_Type IS TABLE OF NUMBER
33 INDEX BY BINARY_INTEGER;
34
35 -------------------------------------------------------------------
36 -- Procedure name : Push_to_Production
37 -- Type : Private
38 -- Function : To push a visit to production
39 -- Parameters :
40 --
41 -- Standard IN Parameters :
42 -- p_api_version IN NUMBER Required
43 -- p_init_msg_list IN VARCHAR2 Default FND_API.G_FALSE
44 -- p_commit IN VARCHAR2 Default FND_API.G_FALSE
45 -- p_validation_level IN NUMBER Default FND_API.G_VALID_LEVEL_FULL
46 -- p_default IN VARCHAR2 Default FND_API.G_TRUE
47 -- p_module_type IN VARCHAR2 Default NULL.
48 --
49 -- Standard OUT Parameters :
50 -- x_return_status OUT VARCHAR2 Required
51 -- x_msg_count OUT NUMBER Required
52 -- x_msg_data OUT VARCHAR2 Required
53 --
54 -- Push_to_Production Parameters:
55 -- p_visit_id IN NUMBER Required
56 -- p_release_flag IN VARCHAR2 Required
57 -- The visit id which is to be pushed to production.
58 --
59 -- Version :
60 -- Initial Version 1.0
61 -------------------------------------------------------------------
62 PROCEDURE Push_to_Production
63 (p_api_version IN NUMBER,
64 p_init_msg_list IN VARCHAR2 := Fnd_Api.g_false,
65 p_commit IN VARCHAR2 := Fnd_Api.g_false,
66 p_validation_level IN NUMBER := Fnd_Api.g_valid_level_full,
67 p_module_type IN VARCHAR2 := Null,
68 p_visit_id IN NUMBER,
69 p_release_flag IN VARCHAR2 := 'N',
70 p_orig_visit_id IN NUMBER := NULL, -- By yazhou 08/06/04 for TC changes
71 x_return_status OUT NOCOPY VARCHAR2,
72 x_msg_count OUT NOCOPY NUMBER,
73 x_msg_data OUT NOCOPY VARCHAR2
74 );
75
76 -------------------------------------------------------------------
77 -- Procedure name : Push_MR_to_Production
78 -- Type : Private
79 -- Function : To push a MR to production
80 -- Parameters :
81 --
82 -- Standard IN Parameters :
83 -- p_api_version IN NUMBER Required
84 -- p_init_msg_list IN VARCHAR2 Default FND_API.G_FALSE
85 -- p_commit IN VARCHAR2 Default FND_API.G_FALSE
86 -- p_validation_level IN NUMBER Default FND_API.G_VALID_LEVEL_FULL
87 -- p_module_type IN VARCHAR2 Default NULL.
88 --
89 -- Standard OUT Parameters :
90 -- x_return_status OUT VARCHAR2 Required
91 -- x_msg_count OUT NUMBER Required
92 -- x_msg_data OUT VARCHAR2 Required
93 --
94 -- Push_to_Production Parameters:
95 -- p_visit_id IN NUMBER Required
96 -- p_unit_effectivity_id IN NUMBER Required
97 -- p_release_flag IN VARCHAR2 optional
98 --
99 -- Version :
100 -- Initial Version 1.0 Created by Yazhou
101 -------------------------------------------------------------------
102 PROCEDURE Push_MR_to_Production
103 (p_api_version IN NUMBER,
104 p_init_msg_list IN VARCHAR2 := Fnd_Api.g_false,
105 p_commit IN VARCHAR2 := Fnd_Api.g_false,
106 p_validation_level IN NUMBER := Fnd_Api.g_valid_level_full,
107 p_module_type IN VARCHAR2 := Null,
108 p_visit_id IN NUMBER,
109 p_unit_effectivity_id IN NUMBER,
110 p_release_flag IN VARCHAR2 := 'N',
111 x_return_status OUT NOCOPY VARCHAR2,
112 x_msg_count OUT NOCOPY NUMBER,
113 x_msg_data OUT NOCOPY VARCHAR2
114 );
115
116 -------------------------------------------------------------------
117 -- Procedure name : Add_MR_to_Project
118 -- Type : Private
119 -- Function : To add Project Task for all the tasks for a given MR
120 -- when SR tasks are created in prodution
121 -- Parameters :
122 --
123 -- Standard IN Parameters :
124 -- p_api_version IN NUMBER Required
125 -- p_init_msg_list IN VARCHAR2 Default FND_API.G_FALSE
126 -- p_commit IN VARCHAR2 Default FND_API.G_FALSE
127 -- p_validation_level IN NUMBER Default FND_API.G_VALID_LEVEL_FULL
128 -- p_default IN VARCHAR2 Default FND_API.G_TRUE
129 -- p_module_type IN VARCHAR2 Default NULL.
130 --
131 -- Standard OUT Parameters :
132 -- x_return_status OUT VARCHAR2 Required
133 -- x_msg_count OUT NUMBER Required
134 -- x_msg_data OUT VARCHAR2 Required
135 --
136 -- Add_Task_to_Project Parameters:
137 -- p_visit_id IN NUMBER Required
138 -- p_unit_effectivity_id IN NUMBER Required
139 --
140 -- Version :
141 -- Initial Version 1.0 29-Jul-2005 Yazhou
142 -------------------------------------------------------------------
143 PROCEDURE Add_MR_to_Project(
144 p_api_version IN NUMBER,
145 p_init_msg_list IN VARCHAR2 := Fnd_Api.g_false,
146 p_commit IN VARCHAR2 := Fnd_Api.g_false,
147 p_validation_level IN NUMBER := Fnd_Api.g_valid_level_full,
148 p_module_type IN VARCHAR2 := Null,
149 p_visit_id IN NUMBER,
150 p_unit_effectivity_id IN NUMBER,
151 x_return_status OUT NOCOPY VARCHAR2,
152 x_msg_count OUT NOCOPY NUMBER,
153 x_msg_data OUT NOCOPY VARCHAR2
154 );
155
156 -------------------------------------------------------------------
157 -- Procedure name : Create_Project
158 -- Type : Private
159 -- Function : To create Project when visit is pushed to projects
160 -- Parameters :
161 --
162 --------------------------------------------------------------------
163 PROCEDURE Create_Project(
164 p_visit_id IN NUMBER,
165 x_return_status OUT NOCOPY VARCHAR2
166 );
167
168 ------------------------------------------------------------------
169 -- Procedure name : Validate_tasks_bef_production
170 -- Type : Private
171 -- Function : Validate the tasks before pushing the tasks to prodn.
172 -- Parameters :
173 --
174 -- Standard OUT Parameters :
175 -- x_return_status OUT VARCHAR2 Required
176 -- x_msg_count OUT NUMBER Required
177 -- x_msg_data OUT VARCHAR2 Required
178 --
179 -- Validate_tasks_bef_production Parameters:
180 -- p_visit_id IN NUMBER Required
181 -- p_tasks_tbl IN Task_Tbl_Type Required
182 -- x_tasks_tbl OUT Task_Tbl_Type Required
183 --
184 -- Version :
185 -- 30 November, 2007 RNAHATA Initial Version - 1.0
186 -------------------------------------------------------------------
187
188 PROCEDURE Validate_tasks_bef_production(
189 p_visit_id IN NUMBER,
190 p_tasks_tbl IN Task_Tbl_Type,
191 x_tasks_tbl OUT NOCOPY Task_Tbl_Type,
192 x_return_status OUT NOCOPY VARCHAR2,
193 x_msg_count OUT NOCOPY NUMBER,
194 x_msg_data OUT NOCOPY VARCHAR2
195 );
196
197 -------------------------------------------------------------------
198 -- Procedure name : Push_tasks_to_production
199 -- Type : Private
200 -- Function : Push the selected tasks to production.
201 -- Parameters :
202 --
203 -- Standard IN Parameters :
204 -- p_api_version IN NUMBER Required
205 -- p_init_msg_list IN VARCHAR2 Default FND_API.G_FALSE
206 -- p_commit IN VARCHAR2 Default FND_API.G_FALSE
207 -- p_validation_level IN NUMBER Default FND_API.G_VALID_LEVEL_FULL
208 -- p_module_type IN VARCHAR2 Default Null
209 --
210 -- Standard OUT Parameters :
211 -- x_return_status OUT VARCHAR2 Required
212 -- x_msg_count OUT NUMBER Required
213 -- x_msg_data OUT VARCHAR2 Required
214 --
215 -- Push_tasks_to_production Parameters:
216 -- p_visit_id IN NUMBER Required
217 -- p_tasks_tbl IN Task_Tbl_Type Required
218 -- p_release_flag IN VARCHAR2 Default = 'N'
219 --
220 -- Version :
221 -- 30 November, 2007 RNAHATA Initial Version - 1.0
222 -------------------------------------------------------------------
223
224 PROCEDURE Push_tasks_to_production(
225 p_api_version IN NUMBER,
226 p_init_msg_list IN VARCHAR2 := Fnd_Api.g_false,
227 p_validation_level IN NUMBER := Fnd_Api.g_valid_level_full,
228 p_module_type IN VARCHAR2 := Null,
229 p_visit_id IN NUMBER,
230 p_tasks_tbl IN Task_Tbl_Type,
231 p_release_flag IN VARCHAR2 := 'N',
232 x_return_status OUT NOCOPY VARCHAR2,
233 x_msg_count OUT NOCOPY NUMBER,
234 x_msg_data OUT NOCOPY VARCHAR2
235 );
236
237 -- AnRaj added for ACL changes in VWP
238 -- Bug number 4297066
239 -------------------------------------------------------------------
240 -- Procedure name : check_unit_quarantined
241 -- Type : Private
242 -- Function : To check whether the Unit is quarantined
243 -- Parameters : p_visit_id
244 -- Parameters : item_instance_id
245 ----------------------------------------------------------------------
246 PROCEDURE check_unit_quarantined(
247 p_visit_id IN NUMBER,
248 item_instance_id IN NUMBER
249 );
250
251 -------------------------------------------------------------------
252 -- Procedure name : Aggregate_Task_Material_Reqrs
253 -- Type : Private
254 -- Function : Find the total requirment of a specific
255 -- item at the task level
256 -- Parameters :
257 --
258 -- Standard OUT Parameters :
259 -- x_return_status OUT VARCHAR2 Required
260 -- x_msg_count OUT NUMBER Required
261 -- x_msg_data OUT VARCHAR2 Required
262 --
263 -- Aggregate_Task_Material_Reqrs Parameters:
264 -- p_task_id IN NUMBER Required
265 --
266 -- Version :
267 -- 30 November, 2007 RNAHATA Initial Version - 1.0
268 -------------------------------------------------------------------
269 PROCEDURE Aggregate_Task_Material_Reqrs
270 (p_api_version IN NUMBER,
271 p_init_msg_list IN VARCHAR2,
272 p_commit IN VARCHAR2,
273 p_validation_level IN NUMBER,
274 p_module_type IN VARCHAR2,
275 p_task_id IN NUMBER,
276 p_rel_tsk_flag IN VARCHAR2 := 'Y',
277 x_return_status OUT NOCOPY VARCHAR2,
278 x_msg_count OUT NOCOPY NUMBER,
279 x_msg_data OUT NOCOPY VARCHAR2
280 );
281
282 PROCEDURE Aggregate_Material_Reqrs
283 (p_api_version IN NUMBER,
284 p_init_msg_list IN VARCHAR2,
285 p_commit IN VARCHAR2,
286 p_validation_level IN NUMBER,
287 p_module_type IN VARCHAR2,
288 p_visit_id IN NUMBER,
289 x_return_status OUT NOCOPY VARCHAR2,
290 x_msg_count OUT NOCOPY NUMBER,
291 x_msg_data OUT NOCOPY VARCHAR2
292 );
293
294 -- Added by rnahata for Bug 5758813
295 -------------------------------------------------------------------
296 -- Procedure name : Update_Project_Task_Times
297 -- Type : Private
298 -- Function : Update the project task start/end dates
299 -- with the workorder schedule start/end dates
300 -- Parameters :
301 -- Standard IN Parameters :
302 -- p_commit IN VARCHAR2 Fnd_Api.G_FALSE
303 --
304 -- Update_Project_Task_Times Parameters :
305 -- p_prd_workorder_tbl IN AHL_PRD_WORKORDER_PVT.PRD_WORKORDER_TBL Required
306 --
307 -- Standard OUT Parameters :
308 -- x_return_status OUT VARCHAR2 Required
309 -- x_msg_count OUT NUMBER Required
310 -- x_msg_data OUT VARCHAR2 Required
311 --
312 -- Version :
313 -- 17 April, 2008 Bug#5758813 RNAHATA Initial Version - 1.0
314 -------------------------------------------------------------------
315 PROCEDURE Update_Project_Task_Times
316 ( p_prd_workorder_tbl IN AHL_PRD_WORKORDER_PVT.PRD_WORKORDER_TBL,
317 p_commit IN VARCHAR2 := Fnd_Api.G_FALSE,
318 x_return_status OUT NOCOPY VARCHAR2,
319 x_msg_count OUT NOCOPY NUMBER,
320 x_msg_data OUT NOCOPY VARCHAR2
321 ) ;
322 -- End changes by rnahata for Bug 5758813
323 --****************************************************************--
324 --------------------------------------------------------------------
325 -- VWP INTEGRATION WITH PROJECTS --
326 --------------------------------------------------------------------
327 --****************************************************************--
328
329 --------------------------------------------------------------------
330 -- PROCEDURE
331 -- Integrate_to_Projects
332 --
333 -- PURPOSE
334 -- To Integrate with Projects i.e creating projects for
335 -- visits and project tasks for all associated visit task
336 --------------------------------------------------------------------
337 PROCEDURE Integrate_to_Projects (
338 p_api_version IN NUMBER,
339 p_init_msg_list IN VARCHAR2 := Fnd_Api.g_false,
340 p_commit IN VARCHAR2 := Fnd_Api.g_false,
341 p_validation_level IN NUMBER := Fnd_Api.g_valid_level_full,
342 p_module_type IN VARCHAR2 := Null,
343 p_visit_id IN NUMBER,
344 x_return_status OUT NOCOPY VARCHAR2,
345 x_msg_count OUT NOCOPY NUMBER,
346 x_msg_data OUT NOCOPY VARCHAR2)
347
348 IS
349 L_API_VERSION CONSTANT NUMBER := 1.0;
350 L_API_NAME CONSTANT VARCHAR2(30) := 'Integrate_to_Projects';
351 L_DEBUG_KEY CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
352
353 -- To find visit related information
354 CURSOR c_visit (x_id IN NUMBER) IS
355 SELECT * FROM AHL_VISITS_VL
356 WHERE VISIT_ID = x_id;
357 c_visit_rec c_visit%ROWTYPE;
358
359 BEGIN
360 --------------------- initialize -----------------------
361 SAVEPOINT Integrate_to_Projects;
362
363 IF (l_log_procedure >= l_log_current_level) THEN
364 fnd_log.string(l_log_procedure,
365 L_DEBUG_KEY ||'.begin',
366 'At the start of PL SQL procedure. Visit Id = ' || p_visit_id);
367 END IF;
368
369 -- Initialize message list if p_init_msg_list is set to TRUE.
370 IF Fnd_Api.to_boolean(p_init_msg_list) THEN
371 Fnd_Msg_Pub.initialize;
372 END IF;
373
374 -- Initialize API return status to success
375 x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
376
377 -- Standard call to check for call compatibility.
378 IF NOT Fnd_Api.COMPATIBLE_API_CALL(l_api_version,
379 p_api_version,
380 l_api_name,G_PKG_NAME)
381 THEN
382 RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
383 END IF;
384
385 IF (l_log_statement >= l_log_current_level) THEN
386 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Visit Id= '|| p_visit_id);
387 END IF;
388
389 OPEN c_visit (p_visit_id);
390 FETCH c_visit INTO c_visit_rec;
391 CLOSE c_visit;
392
393 IF (l_log_statement >= l_log_current_level) THEN
394 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Visits Project Id = '|| c_visit_rec.PROJECT_ID);
395 END IF;
396
397 IF c_visit_rec.PROJECT_ID IS NULL THEN
398 IF (l_log_statement >= l_log_current_level) THEN
399 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Before calling Create_Project');
400 END IF;
401
402 -- Call Create_Project local procedure to create project tasks
403 Create_Project (
404 p_visit_id => p_visit_id,
405 x_return_status => x_return_status);
406
407 IF (l_log_statement >= l_log_current_level) THEN
408 fnd_log.string(l_log_statement,L_DEBUG_KEY,'After calling Create_Project - '||x_return_status);
409 END IF;
410 ELSE
411 IF (l_log_statement >= l_log_current_level) THEN
412 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Before calling Update_Project');
413 END IF;
414
415 -- Call Update_Project local procedure to update project tasks
416 Update_Project (
417 p_api_version => p_api_version,
418 p_init_msg_list => p_init_msg_list,
419 p_commit => p_commit,
420 p_validation_level => p_validation_level,
421 p_module_type => p_module_type,
422 p_visit_id => p_visit_id,
423 x_return_status => x_return_status,
424 x_msg_count => x_msg_count,
425 x_msg_data => x_msg_data);
426
427 IF (l_log_statement >= l_log_current_level) THEN
428 fnd_log.string(l_log_statement,L_DEBUG_KEY,'After calling Update_Project - '||x_return_status);
429 END IF;
430 END IF;
431
432 ---------------------------End of Body-------------------------------------
433 --
434 -- END of API body.
435 --
436 -- Standard check of p_commit.
437 IF Fnd_Api.To_Boolean ( p_commit ) THEN
438 COMMIT WORK;
439 END IF;
440
441 Fnd_Msg_Pub.count_and_get(
442 p_encoded => Fnd_Api.g_false,
443 p_count => x_msg_count,
444 p_data => x_msg_data
445 );
446
447 IF (l_log_procedure >= l_log_current_level) THEN
448 fnd_log.string(l_log_procedure,L_DEBUG_KEY ||'.end','End of PL/SQL procedure');
449 END IF;
450
451 EXCEPTION
452 WHEN Fnd_Api.g_exc_error THEN
453 ROLLBACK TO Integrate_to_Projects;
454 x_return_status := Fnd_Api.g_ret_sts_error;
455 Fnd_Msg_Pub.count_and_get (
456 p_encoded => Fnd_Api.g_false,
457 p_count => x_msg_count,
458 p_data => x_msg_data
459 );
460 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
461 ROLLBACK TO Integrate_to_Projects;
462 x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
463 Fnd_Msg_Pub.count_and_get (
464 p_encoded => Fnd_Api.g_false,
465 p_count => x_msg_count,
466 p_data => x_msg_data
467 );
468 WHEN OTHERS THEN
469 ROLLBACK TO Integrate_to_Projects;
470 x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
471 IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_unexp_error) THEN
472 Fnd_Msg_Pub.add_exc_msg (G_PKG_NAME, L_API_NAME);
473 END IF;
474 Fnd_Msg_Pub.count_and_get (
475 p_encoded => Fnd_Api.g_false,
476 p_count => x_msg_count,
477 p_data => x_msg_data
478 );
479 END Integrate_to_Projects;
480
481 --------------------------------------------------------------------
482 -- PROCEDURE
483 -- Add_Task_to_Project
484 --
485 -- PURPOSE
486 --
487 --
488 --------------------------------------------------------------------
489 PROCEDURE Add_Task_to_Project(
490 p_api_version IN NUMBER,
491 p_init_msg_list IN VARCHAR2 := Fnd_Api.g_false,
492 p_commit IN VARCHAR2 := Fnd_Api.g_false,
493 p_validation_level IN NUMBER := Fnd_Api.g_valid_level_full,
494 p_module_type IN VARCHAR2 := Null,
495 p_visit_task_id IN NUMBER,
496
497 x_return_status OUT NOCOPY VARCHAR2,
498 x_msg_count OUT NOCOPY NUMBER,
499 x_msg_data OUT NOCOPY VARCHAR2
500 )
501 IS
502 L_API_VERSION CONSTANT NUMBER := 1.0;
503 L_API_NAME CONSTANT VARCHAR2(30) := 'Add_Task_to_Project';
504 L_DEBUG_KEY CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
505
506 G_EXC_ERROR EXCEPTION;
507 l_msg_count NUMBER;
508 l_task_id NUMBER;
509 l_pa_project_id_out NUMBER;
510 l_msg_index_out NUMBER;
511 l_return_status VARCHAR2(1);
512 l_chk_project VARCHAR2(1);
513 l_proj_ref_flag VARCHAR2(1);
514 l_project_tsk_flag VARCHAR2(1);
515 l_default VARCHAR2(30);
516 l_msg_data VARCHAR2(2000);
517 l_pa_project_number_out VARCHAR2(25);
518 l_commit VARCHAR2(1) := 'F';
519 l_init_msg_list VARCHAR2(1) := 'F';
520
521 -- To find visit related information
522 CURSOR c_visit (x_id IN NUMBER) IS
523 SELECT * FROM AHL_VISITS_VL
524 WHERE VISIT_ID = x_id;
525 c_visit_rec c_visit%ROWTYPE;
526
527 -- To find tasks information for visit
528 CURSOR c_task (x_id IN NUMBER) IS
529 SELECT T1.PROJECT_ID, T1.VISIT_NUMBER, T2.*
530 FROM AHL_VISITS_VL T1, AHL_VISIT_TASKS_VL T2
531 WHERE VISIT_TASK_ID = x_id
532 AND T1.VISIT_ID = T2.VISIT_ID;
533
534 c_task_rec c_task%ROWTYPE;
535
536 BEGIN
537 --------------------- initialize -----------------------
538 SAVEPOINT Add_Task_to_Project;
539
540 -- Debug info.
541 IF (l_log_procedure >= l_log_current_level) THEN
542 fnd_log.string(l_log_procedure,L_DEBUG_KEY ||'.begin','At the start of PLSQL procedure');
543 END IF;
544
545 -- Initialize message list if p_init_msg_list is set to TRUE.
546 IF Fnd_Api.to_boolean(p_init_msg_list) THEN
547 Fnd_Msg_Pub.initialize;
548 END IF;
549
550 -- Initialize API return status to success
551 x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
552
553 -- Standard call to check for call compatibility.
554 IF NOT Fnd_Api.COMPATIBLE_API_CALL(l_api_version,
555 p_api_version,
556 L_API_NAME,G_PKG_NAME) THEN
557 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
558 END IF;
559
560 IF (l_log_statement >= l_log_current_level) THEN
561 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Visit Task Id = '|| p_visit_task_id);
562 END IF;
563
564 ----------------------------------------- Cursor ----------------------------------
565 OPEN c_task (p_visit_task_id);
566 FETCH c_task INTO c_task_rec;
567 CLOSE c_task;
568
569 OPEN c_Visit(c_task_rec.visit_id);
570 FETCH c_visit INTO c_visit_rec;
571 CLOSE c_Visit;
572 ----------------------------------------- Start of Body ----------------------------------
573 -- To check Project responsibilites
574 -- post 11.5.10 change -- Post 11.5.10
575 -- change start
576
577 -- RROY
578 IF (l_log_statement >= l_log_current_level) THEN
579 fnd_log.string(l_log_statement,
580 L_DEBUG_KEY,
581 'Before calling AHL_VWP_RULES_PVT.Check_Proj_Responsibility.');
582 END IF;
583
584 AHL_VWP_RULES_PVT.Check_Proj_Responsibility
585 (x_check_project => l_chk_project,
586 x_return_status => l_return_status);
587
588 IF (l_log_statement >= l_log_current_level) THEN
589 fnd_log.string(l_log_statement,
590 L_DEBUG_KEY,
591 'After calling AHL_VWP_RULES_PVT.Check_Proj_Responsibility. Return Status = ' ||
592 l_return_status);
593 END IF;
594
595 IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
596 IF (l_log_statement >= l_log_current_level) THEN
597 fnd_log.string(l_log_statement,
598 L_DEBUG_KEY,
599 'Errors from AHL_VWP_RULES_PVT.Check_Proj_Responsibility.');
600 END IF;
601 IF l_return_status = FND_API.G_RET_STS_ERROR THEN
602 RAISE FND_API.G_EXC_ERROR;
603 ELSE
604 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
605 END IF;
606 END IF;
607
608 IF l_chk_project = 'Y' THEN
609 IF c_task_rec.PROJECT_TASK_ID IS NULL THEN
610 -- change end
611 IF (l_log_statement >= l_log_current_level) THEN
612 fnd_log.string(l_log_statement,
613 L_DEBUG_KEY,
614 'Before calling PA_PROJECT_PUB.CHECK_UNIQUE_TASK_NUMBER.');
615 fnd_log.string(l_log_statement,
616 L_DEBUG_KEY,
617 'p_project_id = ' || c_visit_rec.project_id);
618 fnd_log.string(l_log_statement,
619 L_DEBUG_KEY,
620 'p_pm_project_reference = ' || c_visit_rec.visit_number);
621 fnd_log.string(l_log_statement,
622 L_DEBUG_KEY,
623 'p_task_number = ' || c_task_rec.visit_task_number);
624 END IF;
625
626 PA_PROJECT_PUB.Check_Unique_Task_Number
627 ( p_api_version_number => 1,
628 p_init_msg_list => l_init_msg_list,
629 p_return_status => l_return_status,
630 p_msg_count => l_msg_count,
631 p_msg_data => l_msg_data,
632 p_project_id => c_visit_rec.project_id,
633 p_pm_project_reference => c_visit_rec.visit_number,
634 p_task_number => c_task_rec.visit_task_number,
635 p_unique_task_number_flag => l_project_tsk_flag
636 );
637
638 IF (l_log_statement >= l_log_current_level) THEN
639 fnd_log.string(l_log_statement,
640 L_DEBUG_KEY,
641 'After calling PA_PROJECT_PUB.check_unique_task_number. p_unique_task_number_flag = ' ||
642 l_project_tsk_flag || ' Return Status = ' || l_return_status);
643 IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
644 fnd_log.string(l_log_statement,
645 L_DEBUG_KEY,
646 'Errors from PA_PROJECT_PUB.check_unique_task_number. Message count: ' ||
647 l_msg_count || ', message data: ' || l_msg_data);
648 END IF;
649 fnd_log.string(l_log_statement,
650 L_DEBUG_KEY,
651 'Before calling PA_PROJECT_PUB.check_unique_task_reference.');
652 END IF;
653
654 PA_PROJECT_PUB.Check_Unique_Task_Reference
655 (p_api_version_number => 1,
656 p_init_msg_list => l_init_msg_list,
657 p_return_status => l_return_status,
658 p_msg_count => l_msg_count,
659 p_msg_data => l_msg_data,
660 p_project_id => c_visit_rec.project_id,
661 p_pm_project_reference => c_visit_rec.visit_number,
662 p_pm_task_reference => c_task_rec.visit_task_number,
663 p_unique_task_ref_flag => l_proj_ref_flag
664 );
665
666 IF (l_log_statement >= l_log_current_level) THEN
667 fnd_log.string(l_log_statement,L_DEBUG_KEY,'After calling -- Check_Unique_Task_Reference l_proj_ref_flag = ' || l_proj_ref_flag);
668 END IF;
669
670 IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
671 IF (l_log_statement >= l_log_current_level) THEN
672 fnd_log.string(l_log_statement,
673 L_DEBUG_KEY,
674 'Errors from PA_PROJECT_PUB.check_unique_task_number. Message count: ' ||
675 l_msg_count || ', message data: ' || l_msg_data);
676 END IF;
677 IF (l_return_status = FND_API.G_RET_STS_ERROR) THEN
678 RAISE FND_API.G_EXC_ERROR;
679 ELSE
680 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
681 END IF;
682 END IF;
683
684 IF l_project_tsk_flag = 'Y' AND l_proj_ref_flag = 'Y' THEN
685 IF (l_log_statement >= l_log_current_level) THEN
686 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Before calling PA_PROJECT_PUB.ADD_TASK..');
687 fnd_log.string(l_log_statement,L_DEBUG_KEY,'c_task_rec.PROJECT_ID=: ' || c_task_rec.PROJECT_ID);
688 fnd_log.string(l_log_statement,L_DEBUG_KEY,'c_task_rec.VISIT_NUMBER=: ' || c_task_rec.VISIT_NUMBER);
689 fnd_log.string(l_log_statement,L_DEBUG_KEY,'c_task_rec.VISIT_TASK_NUMBER=: ' || c_task_rec.VISIT_TASK_NUMBER);
690 fnd_log.string(l_log_statement,L_DEBUG_KEY,'c_task_rec.VISIT_TASK_NAME=: ' || c_task_rec.VISIT_TASK_NAME);
691 fnd_log.string(l_log_statement,L_DEBUG_KEY,'c_task_rec.DESCRIPTION=: ' || c_task_rec.DESCRIPTION);
692 END IF;
693
694 PA_PROJECT_PUB.ADD_TASK
695 (p_api_version_number => 1
696 ,p_commit => l_commit
697 ,p_init_msg_list => l_init_msg_list
698 ,p_msg_count => l_msg_count
699 ,p_msg_data => l_msg_data
700 ,p_return_status => l_return_status
701 ,p_pm_product_code => G_PM_PRODUCT_CODE
702 ,p_pm_project_reference => c_task_rec.VISIT_NUMBER
703 ,p_pa_project_id => c_task_rec.PROJECT_ID
704 ,p_pm_task_reference => c_task_rec.VISIT_TASK_NUMBER
705 ,p_pa_task_number => c_task_rec.VISIT_TASK_NUMBER
706 ,p_task_name => SUBSTR( c_task_rec.VISIT_TASK_NAME , 1,15)
707 -- AnRaj: Changed for Bug#5069540
708 /** Begin changes by rnahata for Bug 5758813 **/
709 -- ,p_task_description => SUBSTR(c_task_rec.DESCRIPTION,1,250)
710 ,p_task_description => c_task_rec.visit_task_name
711 --Fix for the Bug 7009212. rnahata truncated the dates
712 ,p_task_start_date => trunc(c_task_rec.start_date_time)
713 ,p_task_completion_date => trunc(c_task_rec.end_date_time)
714 /** End changes by rnahata for Bug 5758813 **/
715 ,p_pa_project_id_out => l_pa_project_id_out
716 ,p_pa_project_number_out => l_pa_project_number_out
717 ,p_task_id => l_task_id
718 );
719
720 IF (l_log_statement >= l_log_current_level) THEN
721 fnd_log.string(l_log_statement,L_DEBUG_KEY,'After calling PA_PROJECT_PUB.ADD_TASK - l_return_status = '||l_return_status);
722 END IF;
723
724 IF (l_return_status <> 'S') THEN
725 IF (fnd_msg_pub.count_msg > 0 ) THEN
726 FOR i IN 1..fnd_msg_pub.count_msg
727 LOOP
728 fnd_msg_pub.get( p_msg_index => i,
729 p_encoded => 'F',
730 p_data => l_msg_data,
731 p_msg_index_out => l_msg_index_out);
732
733 IF (l_log_statement >= l_log_current_level) THEN
734 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Error - '||l_msg_data);
735 END IF;
736 END LOOP;
737 ELSE
738 IF (l_log_statement >= l_log_current_level) THEN
739 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Another Error - '||l_msg_data);
740 END IF;
741 END IF;
742 RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
743 END IF;
744
745 IF l_return_status = 'S' THEN
746 UPDATE AHL_VISIT_TASKS_B
747 SET PROJECT_TASK_ID = l_task_id,
748 OBJECT_VERSION_NUMBER = c_task_rec.object_version_number + 1
749 WHERE VISIT_TASK_ID = p_visit_task_id;
750 END IF;
751
752 ELSIF l_project_tsk_flag = 'N' AND l_proj_ref_flag = 'Y' THEN
753 x_return_status := Fnd_Api.g_ret_sts_error;
754 IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_error) THEN
755 Fnd_Message.set_name ('AHL', 'AHL_VWP_PROJ_TSK_REF_NOT_UNIQ');
756 Fnd_Msg_Pub.ADD;
757 END IF;
758 ELSIF l_project_tsk_flag = 'Y' AND l_proj_ref_flag = 'N' THEN
759 x_return_status := Fnd_Api.g_ret_sts_error;
760 IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_error) THEN
761 Fnd_Message.set_name ('AHL', 'AHL_VWP_PROJ_TSK_NUM_NOT_UNIQ');
762 Fnd_Msg_Pub.ADD;
763 END IF;
764 ELSE
765 x_return_status := Fnd_Api.g_ret_sts_error;
766 IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_error) THEN
767 Fnd_Message.set_name ('AHL', 'AHL_VWP_PROJ_TASK_NOT_UNIQUE');
768 Fnd_Msg_Pub.ADD;
769 END IF;
770 END IF;
771 END IF;
772
773 END IF; -- l_chk_project
774 ---------------------------End of Body-------------------------------------
775 --
776 -- END of API body.
777 --
778 -- Standard check of p_commit.
779
780 IF Fnd_Api.To_Boolean (p_commit) THEN
781 COMMIT WORK;
782 END IF;
783
784 Fnd_Msg_Pub.count_and_get(
785 p_encoded => Fnd_Api.g_false,
786 p_count => x_msg_count,
787 p_data => x_msg_data
788 );
789
790 IF (l_log_procedure >= l_log_current_level) THEN
791 fnd_log.string(l_log_procedure,L_DEBUG_KEY ||'.end','End of the procedure');
792 END IF;
793
794 EXCEPTION
795 WHEN Fnd_Api.g_exc_error THEN
796 ROLLBACK TO Add_Task_to_Project;
797 x_return_status := Fnd_Api.g_ret_sts_error;
798 Fnd_Msg_Pub.count_and_get (
799 p_encoded => Fnd_Api.g_false,
800 p_count => x_msg_count,
801 p_data => x_msg_data
802 );
803 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
804 ROLLBACK TO Add_Task_to_Project;
805 x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
806 Fnd_Msg_Pub.count_and_get (
807 p_encoded => Fnd_Api.g_false,
808 p_count => x_msg_count,
809 p_data => x_msg_data
810 );
811 WHEN OTHERS THEN
812 ROLLBACK TO Add_Task_to_Project;
813 x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
814 IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_unexp_error) THEN
815 Fnd_Msg_Pub.add_exc_msg (G_PKG_NAME, L_API_NAME);
816 END IF;
817 Fnd_Msg_Pub.count_and_get (
818 p_encoded => Fnd_Api.g_false,
819 p_count => x_msg_count,
820 p_data => x_msg_data
821 );
822 END Add_Task_to_Project;
823
824 --------------------------------------------------------------------
825 -- PROCEDURE
826 -- Delete_Task_to_Project
827 --
828 -- PURPOSE
829 -- To delete Project and its tasks if visit in VWP is deleted
830 --------------------------------------------------------------------
831 PROCEDURE Delete_Task_to_Project(
832 p_visit_task_id IN NUMBER,
833 x_return_status OUT NOCOPY VARCHAR2)
834 AS
835 -- Define local Variables
836 L_API_NAME CONSTANT VARCHAR2(30) := 'Delete_Task_to_Project';
837 L_DEBUG_KEY CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
838
839 l_count NUMBER;
840 l_msg_count NUMBER;
841 l_project_id NUMBER;
842 l_task_id NUMBER;
843 i NUMBER;
844
845 l_return_status VARCHAR2(1);
846 l_chk_project VARCHAR2(1);
847 l_del_task_flag VARCHAR2(1);
848 l_commit VARCHAR2(1) := 'F';
849 l_init_msg_list VARCHAR2(1) := 'F';
850 l_default VARCHAR2(30);
851 l_msg_data VARCHAR2(2000);
852 G_EXC_ERROR EXCEPTION;
853
854 -- Define local Cursors
855 -- To find all tasks related information
856 CURSOR c_Task (x_id IN NUMBER) IS
857 SELECT * FROM Ahl_Visit_Tasks_VL
858 WHERE Visit_Task_ID = x_id;
859 c_task_rec c_Task%ROWTYPE;
860
861 -- To find visit related information
862 CURSOR c_visit (x_id IN NUMBER) IS
863 SELECT * FROM AHL_VISITS_VL
864 WHERE VISIT_ID = x_id;
865 c_visit_rec c_visit%ROWTYPE;
866
867 BEGIN
868
869 x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
870
871 IF (l_log_procedure >= l_log_current_level) THEN
872 fnd_log.string(l_log_procedure,L_DEBUG_KEY ||'.begin','At the start of the procedure');
873 END IF;
874
875 OPEN c_task (p_visit_task_id);
876 FETCH c_task INTO c_task_rec;
877 CLOSE c_task;
878
879 OPEN c_visit (c_task_rec.visit_id);
880 FETCH c_visit INTO c_visit_rec;
881 CLOSE c_visit;
882
883 -- To check Project responsibilites
884 -- Post 11.5.10
885 -- RROY
886 IF (l_log_statement >= l_log_current_level) THEN
887 fnd_log.string(l_log_statement,
888 L_DEBUG_KEY,
889 'Before calling AHL_VWP_RULES_PVT.Check_Proj_Responsibility');
890 END IF;
891 AHL_VWP_RULES_PVT.Check_Proj_Responsibility
892 ( x_check_project => l_chk_project,
893 x_return_status => l_return_status);
894
895 IF (l_log_statement >= l_log_current_level) THEN
896 fnd_log.string(l_log_statement,
897 L_DEBUG_KEY,
898 'After calling AHL_VWP_RULES_PVT.Check_Proj_Responsibility. Return Status = ' || l_return_status);
899 END IF;
900
901 IF (l_return_status <> Fnd_Api.G_RET_STS_SUCCESS) THEN
902 IF (l_log_statement >= l_log_current_level) THEN
903 fnd_log.string(l_log_statement,
904 L_DEBUG_KEY,
905 'Errors from AHL_VWP_RULES_PVT.Check_Proj_Responsibility');
906 END IF;
907 x_return_status := l_return_status;
908 IF l_return_status = FND_API.G_RET_STS_ERROR THEN
909 RAISE FND_API.G_EXC_ERROR;
910 ELSE
911 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
912 END IF;
913 END IF;
914
915 IF l_chk_project = 'Y' THEN
916 IF (l_log_statement >= l_log_current_level) THEN
917 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Before calling PA_PROJECT_PUB.CHECK_DELETE_TASK_OK');
918 fnd_log.string(l_log_statement,L_DEBUG_KEY,'c_visit_rec.PROJECT_ID - '|| c_visit_rec.PROJECT_ID);
919 fnd_log.string(l_log_statement,L_DEBUG_KEY,'c_visit_rec.visit_number - '|| c_visit_rec.visit_number);
920 fnd_log.string(l_log_statement,L_DEBUG_KEY,'c_task_rec.PROJECT_TASK_ID - '|| c_task_rec.PROJECT_TASK_ID);
921 fnd_log.string(l_log_statement,L_DEBUG_KEY,'c_task_rec.VISIT_TASK_NUMBER - '|| c_task_rec.VISIT_TASK_NUMBER);
922 fnd_log.string(l_log_statement,L_DEBUG_KEY,'l_del_task_flag - '|| l_del_task_flag);
923 END IF;
924
925 PA_PROJECT_PUB.CHECK_DELETE_TASK_OK
926 ( p_api_version_number => 1
927 , p_init_msg_list => l_init_msg_list
928 , p_return_status => l_return_status
929 , p_msg_count => l_msg_count
930 , p_msg_data => l_msg_data
931 , p_project_id => c_visit_rec.PROJECT_ID
932 , p_pm_project_reference => c_visit_rec.visit_number
933 , p_task_id => c_task_rec.PROJECT_TASK_ID
934 , p_pm_task_reference => c_task_rec.VISIT_TASK_NUMBER
935 , p_delete_task_ok_flag => l_del_task_flag
936 );
937
938 IF (l_log_statement >= l_log_current_level) THEN
939 fnd_log.string(l_log_statement,
940 L_DEBUG_KEY,
941 'After calling PA_PROJECT_PUB.check_delete_task_ok. Return Status = ' ||
942 l_return_status || ', delete task flag = ' || l_del_task_flag);
943 END IF;
944
945 IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
946 IF (l_log_statement >= l_log_current_level) THEN
947 fnd_log.string(l_log_statement,
948 L_DEBUG_KEY,
949 'Errors from PA_PROJECT_PUB.check_delete_task_ok. Message count: ' ||
950 l_msg_count || ', message data: ' || l_msg_data);
951 END IF;
952 x_return_status := l_return_status;
953 RAISE FND_API.G_EXC_ERROR;
954 ELSE
955 IF l_del_task_flag = 'Y' THEN
956 IF (l_log_statement >= l_log_current_level) THEN
957 fnd_log.string(l_log_statement,
958 L_DEBUG_KEY,
959 'Before calling PA_PROJECT_PUB.delete_task.');
960 END IF;
961
962 PA_PROJECT_PUB.DELETE_TASK
963 ( p_api_version_number => 1
964 ,p_commit => l_commit
965 ,p_init_msg_list => l_init_msg_list
966 ,p_msg_count => l_msg_count
967 ,p_msg_data => l_msg_data
968 ,p_return_status => l_return_status
969 ,p_pm_product_code => G_PM_PRODUCT_CODE
970 ,p_pm_project_reference => c_visit_rec.visit_number
971 ,p_pa_project_id => c_visit_rec.PROJECT_ID
972 ,p_pm_task_reference => c_task_rec.VISIT_TASK_NUMBER
973 ,p_pa_task_id => c_task_rec.PROJECT_TASK_ID
974 ,p_cascaded_delete_flag => 'N'
975 ,p_project_id => l_project_id
976 ,p_task_id => l_task_id
977 );
978
979 IF (l_log_statement >= l_log_current_level) THEN
980 fnd_log.string(l_log_statement,
981 L_DEBUG_KEY,
982 'After calling PA_PROJECT_PUB.delete_task. Return Status = ' ||
983 l_return_status);
984 END IF;
985
986 IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
987 IF (l_log_statement >= l_log_current_level) THEN
988 fnd_log.string(l_log_statement,
989 L_DEBUG_KEY,
990 'Errors from PA_PROJECT_PUB.delete_task. Message count: ' ||
991 l_msg_count || ', message data: ' || l_msg_data);
992 END IF;
993 x_return_status := Fnd_Api.g_ret_sts_error;
994 RAISE FND_API.G_EXC_ERROR;
995 END IF;
996 END IF;
997 END IF;
998 END IF;
999
1000 IF (l_log_procedure >= l_log_current_level) THEN
1001 fnd_log.string(l_log_procedure,
1002 L_DEBUG_KEY ||'.end',
1003 'At the end of PL SQL procedure. Return Status = ' || x_return_status);
1004 END IF;
1005
1006 END Delete_Task_to_Project;
1007
1008 --------------------------------------------------------------------
1009 -- PROCEDURE
1010 -- Create_Project
1011 --
1012 -- PURPOSE
1013 -- To create Project and project tasks for the visit and its tasks
1014 --------------------------------------------------------------------
1015 PROCEDURE Create_Project(
1016 p_visit_id IN NUMBER,
1017 x_return_status OUT NOCOPY VARCHAR2)
1018 AS
1019 --
1020 -- Define local Variables
1021 L_API_NAME CONSTANT VARCHAR2(30) := 'Create_Project';
1022 L_DEBUG_KEY CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
1023 l_count NUMBER;
1024 l_msg_count NUMBER;
1025 l_obj_version NUMBER;
1026 l_created_project_id NUMBER;
1027 l_msg_index_out NUMBER;
1028 i NUMBER;
1029 Z NUMBER;
1030 CREATED_FROM_PROJECT_ID NUMBER;
1031 l_return_status VARCHAR2(1);
1032 l_chk_project VARCHAR2(1);
1033 l_workflow_started VARCHAR2(1);
1034 l_valid_flag VARCHAR2(1):= 'N';
1035 l_commit VARCHAR2(1) := 'F';
1036 l_init_msg_list VARCHAR2(1) := 'F';
1037 l_project_flag VARCHAR2(1):= 'N';
1038 l_default VARCHAR2(30);
1039 l_msg_data VARCHAR2(2000);
1040 G_EXC_ERROR EXCEPTION;
1041
1042 -- Define local table and record datatypes
1043 l_project_rec PA_PROJECT_PUB.PROJECT_IN_REC_TYPE;
1044 l_project_out PA_PROJECT_PUB.PROJECT_OUT_REC_TYPE;
1045 l_task_in PA_PROJECT_PUB.TASK_IN_TBL_TYPE;
1046 l_task_out PA_PROJECT_PUB.TASK_OUT_TBL_TYPE;
1047 l_key_members PA_PROJECT_PUB.PROJECT_ROLE_TBL_TYPE;
1048 l_class_categories PA_PROJECT_PUB.CLASS_CATEGORY_TBL_TYPE;
1049 -- Post 11.5.10
1050 -- RROY
1051 l_param_data PJM_PROJECT_PARAM_PUB.ParamRecType;
1052 -- yazhou 26Sept2005 starts
1053 -- ER#4618348
1054 -- l_project_name_prefix VARCHAR2(10);
1055 l_project_num_prefix VARCHAR2(10);
1056 l_visit_name_len NUMBER;
1057 -- yazhou 26Sept2005 ends
1058 --Bug#5587893
1059 /*sowsubra - Added a new profile that enables user to specify project status
1060 when a visit is pushed to prodn.*/
1061 l_project_status_code VARCHAR2(30);
1062 l_new_txns_flag VARCHAR2(1):= 'N'; -- Added by rnahata for Bug 6334682
1063
1064 -- Define local Cursors
1065 -- To find visit related information
1066 CURSOR c_visit (x_id IN NUMBER) IS
1067 SELECT * FROM AHL_VISITS_VL
1068 WHERE VISIT_ID = x_id;
1069 c_visit_rec c_visit%ROWTYPE;
1070
1071 -- To find count for tasks for visit
1072 CURSOR c_task_ct (x_id IN NUMBER) IS
1073 SELECT count(*) FROM AHL_VISIT_TASKS_VL
1074 WHERE VISIT_ID = x_id
1075 AND NVL(status_code, 'Y') <> NVL ('DELETED', 'X') ;
1076
1077 -- To find tasks information for visit
1078 CURSOR c_task (x_id IN NUMBER) IS
1079 SELECT * FROM AHL_VISIT_TASKS_VL
1080 WHERE VISIT_ID = x_id
1081 AND NVL(status_code, 'Y') <> NVL ('DELETED', 'X') ;
1082 c_task_rec c_task%ROWTYPE;
1083
1084 -- To find tasks information for visit
1085 CURSOR c_task_OVN (x_id IN NUMBER, x_task_num IN NUMBER) IS
1086 SELECT OBJECT_VERSION_NUMBER FROM AHL_VISIT_TASKS_VL
1087 WHERE VISIT_ID = x_id AND VISIT_TASK_NUMBER = x_task_num;
1088
1089 -- To get the cost group for the Org
1090 CURSOR c_cost_group(p_org_id IN NUMBER) IS
1091 SELECT default_cost_group_id
1092 FROM mtl_parameters
1093 WHERE organization_id = p_org_id;
1094
1095 -- Added by rnahata for Bug 6334682
1096 CURSOR c_new_txns_flag(c_project_status_code IN VARCHAR) IS
1097 SELECT ENABLED_FLAG FROM PA_PROJECT_STATUS_CONTROLS
1098 WHERE PROJECT_STATUS_CODE LIKE c_project_status_code
1099 AND ACTION_CODE LIKE 'NEW_TXNS';
1100
1101 /*Added by rnahata for Bug 5758813 - fetches the task details for all the tasks in the visit
1102 The first part of the union fetches task details for all the Planned and Unplanned tasks.
1103 The second part fetches task details of all the MR/NR/SR Summary tasks.
1104 The third part fetches task details of all the manually created Summary and Unassociated tasks.
1105 */
1106 CURSOR get_prj_route_dtls_cur (p_visit_id IN NUMBER) IS
1107 SELECT SUBSTR(NVL(ar.route_no,avt.visit_task_name),1,20) task_name,
1108 SUBSTR(NVL(ar.title,avt.visit_task_name),1,250) description,
1109 avt.visit_task_name, avt.visit_task_number, avt.start_date_time task_start_date,
1110 avt.end_date_time task_end_date
1111 FROM ahl_routes_vl ar,ahl_visit_tasks_vl avt, ahl_mr_routes mrr
1112 WHERE avt.visit_id = p_visit_id
1113 AND NVL(avt.status_code,'Y') = 'PLANNING'
1114 AND avt.task_type_code NOT IN ('SUMMARY','UNASSOCIATED')
1115 AND avt.mr_route_id = mrr.mr_route_id (+)
1116 AND mrr.route_id = ar.route_id (+)
1117 UNION ALL
1118 SELECT SUBSTR(NVL(amh.title,avt.visit_task_name),1,20) task_name, NVL(amh.title,avt.visit_task_name) description,
1119 avt.visit_task_name, avt.visit_task_number, avt.start_date_time task_start_date,
1120 avt.end_date_time task_end_date
1121 FROM ahl_mr_headers_v amh,ahl_visit_tasks_vl avt
1122 WHERE avt.visit_id = p_visit_id
1123 AND NVL(avt.status_code,'Y') = 'PLANNING'
1124 AND avt.task_type_code = 'SUMMARY'
1125 AND avt.summary_task_flag = 'N'
1126 AND avt.mr_id = amh.mr_header_id (+)
1127 UNION ALL
1128 SELECT SUBSTR(avt.visit_task_name,1,20) task_name, avt.visit_task_name description,
1129 avt.visit_task_name, avt.visit_task_number, avt.start_date_time task_start_date,
1130 avt.end_date_time task_end_date
1131 FROM ahl_visit_tasks_vl avt
1132 WHERE avt.visit_id = p_visit_id
1133 AND NVL(avt.status_code,'Y') = 'PLANNING'
1134 AND ((avt.task_type_code = 'SUMMARY' AND avt.summary_task_flag = 'Y')
1135 OR (avt.task_type_code ='UNASSOCIATED'))
1136 ORDER BY 4;
1137 -- End changes by rnahata for Bug 5758813
1138
1139 get_prj_route_dtls_rec get_prj_route_dtls_cur%ROWTYPE;
1140
1141 BEGIN
1142 -- Initialize API return status to success
1143 x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
1144
1145 IF (l_log_procedure >= l_log_current_level) THEN
1146 fnd_log.string(l_log_procedure,
1147 L_DEBUG_KEY ||'.begin',
1148 'At the start of PL SQL procedure. Visit Id = ' || p_visit_id);
1149 END IF;
1150
1151 --Bug#5587893
1152 /*sowsubra - starts */
1153 l_project_status_code := nvl(FND_PROFILE.VALUE('AHL_INITIAL_PROJECT_STATUS'),'SUBMITTED');
1154
1155 /*
1156 IF (l_project_status_code IS NULL) THEN
1157 IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_error) THEN
1158 Fnd_Message.set_name ('AHL', 'AHL_PROJECT_STATUS_NOT_SET');
1159 Fnd_Msg_Pub.ADD;
1160 END IF;
1161 RAISE FND_API.G_EXC_ERROR;
1162 END IF;
1163 */
1164 /*sowsubra - ends */
1165
1166 -- Begin changes by rnahata for Bug 6334682
1167 IF (l_log_statement >= l_log_current_level) THEN
1168 fnd_log.string(l_log_statement,
1169 L_DEBUG_KEY,
1170 'Initial project status code is: ' || l_project_status_code);
1171 END IF;
1172 OPEN c_new_txns_flag(l_project_status_code);
1173 FETCH c_new_txns_flag INTO l_new_txns_flag;
1174 CLOSE c_new_txns_flag;
1175 IF (l_log_statement >= l_log_current_level) THEN
1176 fnd_log.string(l_log_statement,
1177 L_DEBUG_KEY,
1178 'Create New Transaction Flag = ' || l_new_txns_flag);
1179 END IF;
1180 IF (l_new_txns_flag = 'N') THEN
1181 IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_error) THEN
1182 Fnd_Message.SET_NAME('AHL','AHL_PRJ_NEW_TXN_DISABLED');
1183 Fnd_Message.SET_TOKEN('PRJ_STATUS', l_project_status_code);
1184 Fnd_Msg_Pub.ADD;
1185 END IF;
1186 RAISE Fnd_Api.G_EXC_ERROR;
1187 END IF;
1188 -- End changes by rnahata for Bug 6334682
1189
1190 OPEN c_Visit(p_visit_id);
1191 FETCH c_visit INTO c_visit_rec;
1192 CLOSE c_Visit;
1193
1194 IF (c_visit_rec.START_DATE_TIME IS NOT NULL
1195 AND c_visit_rec.START_DATE_TIME <> Fnd_Api.G_MISS_DATE
1196 AND c_visit_rec.DEPARTMENT_ID IS NOT NULL
1197 AND c_visit_rec.DEPARTMENT_ID <> FND_API.G_MISS_NUM) THEN
1198
1199 -- Post 11.5.10
1200 -- RROY
1201 IF c_visit_rec.project_template_id IS NOT NULL THEN
1202 CREATED_FROM_PROJECT_ID := c_visit_rec.project_template_id;
1203 ELSE
1204 CREATED_FROM_PROJECT_ID := nvl(FND_PROFILE.VALUE('AHL_DEFAULT_PA_TEMPLATE_ID'),0);
1205 END IF;
1206
1207 IF (l_log_statement >= l_log_current_level) THEN
1208 fnd_log.string(l_log_statement,L_DEBUG_KEY,'CREATED_FROM_PROJECT_ID = '||CREATED_FROM_PROJECT_ID);
1209 END IF;
1210
1211 -- yazhou 26Sept2005 starts
1212 -- ER#4618348
1213
1214 --l_project_name_prefix := SUBSTR(FND_PROFILE.VALUE('AHL_PROJECT_PREFIX'),1,10);
1215 l_project_num_prefix := SUBSTR(FND_PROFILE.VALUE('AHL_PROJECT_NUM_PREFIX'),1,10);
1216
1217 IF (l_log_statement >= l_log_current_level) THEN
1218 fnd_log.string(l_log_statement,L_DEBUG_KEY,'l_project_num_prefix = '||l_project_num_prefix);
1219 END IF;
1220
1221 --l_visit_name_len := 30 - nvl(length(SubStr(l_project_name_prefix,1,255)),0);
1222
1223 -- TO CREATE PROJECT IN PROJECTS
1224 l_Project_rec.PM_PROJECT_REFERENCE := l_project_num_prefix || to_char(c_visit_rec.visit_number);
1225 -- l_Project_rec.PROJECT_NAME := l_project_name_prefix|| SUBSTR(c_visit_rec.visit_name,1,l_visit_name_len);
1226 l_Project_rec.PROJECT_NAME := l_project_num_prefix || to_char(c_visit_rec.visit_number);
1227 -- yazhou 26Sept2005 ends
1228 l_Project_rec.CREATED_FROM_PROJECT_ID := CREATED_FROM_PROJECT_ID;
1229 -- yazhou 08Nov2005 starts
1230 -- Changed by jaramana on April 28, 2005 to fix Bug 4273892
1231 -- l_Project_rec.PROJECT_STATUS_CODE := 'ACTIVE';
1232 -- Changed by sowsubra to fix Bug#5587893
1233 -- l_Project_rec.PROJECT_STATUS_CODE := 'SUBMITTED';
1234 l_Project_rec.PROJECT_STATUS_CODE := l_project_status_code ;
1235 -- yazhou 08Nov2005 ends
1236
1237 -- AnRaj: Changed for Bug#5069540
1238 l_Project_rec.DESCRIPTION := SUBSTR(c_visit_rec.description,1,250);
1239 --Fix for the Bug 7009212. rnahata truncated the time components
1240 l_Project_rec.START_DATE := trunc(c_visit_rec.start_date_time);
1241 l_Project_rec.COMPLETION_DATE := trunc(c_visit_rec.close_date_time);
1242 l_Project_rec.SCHEDULED_START_DATE := trunc(c_visit_rec.start_date_time);
1243 --rnahata End
1244
1245 OPEN c_task_ct(p_visit_id);
1246 FETCH c_task_ct INTO l_count;
1247 CLOSE c_task_ct;
1248
1249 IF (l_log_statement >= l_log_current_level) THEN
1250 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Tasks Count = '||l_count);
1251 END IF;
1252
1253 IF l_count > 0 THEN
1254 IF (l_log_statement >= l_log_current_level) THEN
1255 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Inside Tasks as Count more than zero');
1256 END IF;
1257 -- Begin changes by rnahata for Bug 5758813
1258 OPEN get_prj_route_dtls_cur(p_visit_id);
1259 i:=1;
1260 LOOP
1261 FETCH get_prj_route_dtls_cur INTO get_prj_route_dtls_rec;
1262 EXIT WHEN get_prj_route_dtls_cur%NOTFOUND;
1263 l_task_in(i).PM_TASK_REFERENCE := get_prj_route_dtls_rec.visit_task_number;
1264 l_task_in(i).TASK_NAME := get_prj_route_dtls_rec.task_name;
1265 l_task_in(i).PA_TASK_NUMBER := get_prj_route_dtls_rec.visit_task_number;
1266 l_task_in(i).TASK_DESCRIPTION := get_prj_route_dtls_rec.description;
1267 --Fix for the Bug 7009212. rnahata truncated the time components
1268 l_task_in(i).TASK_START_DATE := trunc(get_prj_route_dtls_rec.task_start_date);
1269 l_task_in(i).TASK_COMPLETION_DATE := trunc(get_prj_route_dtls_rec.task_end_date);
1270 --rnahata End
1271 i := i + 1;
1272 END LOOP;
1273 CLOSE get_prj_route_dtls_cur;
1274 -- End changes by rnahata for Bug 5758813
1275 END IF; -- End of l_count
1276
1277 IF l_task_in.COUNT > 0 THEN
1278 i := l_task_in.FIRST;
1279 LOOP
1280 IF (l_log_statement >= l_log_current_level) THEN
1281 fnd_log.string(l_log_statement,L_DEBUG_KEY,'TASK REFERENCE - '|| l_task_in(i).PM_TASK_REFERENCE);
1282 fnd_log.string(l_log_statement,L_DEBUG_KEY,'TASK NAME - '|| l_task_in(i).TASK_NAME);
1283 fnd_log.string(l_log_statement,L_DEBUG_KEY,'TASK NUMBER - '|| l_task_in(i).PA_TASK_NUMBER);
1284 END IF;
1285 EXIT WHEN i = l_task_in.LAST ;
1286 i := l_task_in.NEXT(i);
1287 END LOOP;
1288 END IF; -- End of l_task_in
1289
1290 -- To check Project responsibilites
1291 -- Post 11.5.10
1292 -- RROY
1293
1294 IF (l_log_statement >= l_log_current_level) THEN
1295 fnd_log.string(l_log_statement,
1296 L_DEBUG_KEY,
1297 'Before calling AHL_VWP_RULES_PVT.Check_Proj_Responsibility');
1298 END IF;
1299
1300 AHL_VWP_RULES_PVT.Check_Proj_Responsibility
1301 (x_check_project => l_chk_project,
1302 x_return_status => l_return_status);
1303
1304 IF (l_log_statement >= l_log_current_level) THEN
1305 fnd_log.string(l_log_statement,
1306 L_DEBUG_KEY,
1307 'After calling AHL_VWP_RULES_PVT.Check_Proj_Responsibility. Return Status = ' || l_return_status);
1308 END IF;
1309
1310 IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
1311 IF (l_log_statement >= l_log_current_level) THEN
1312 fnd_log.string(l_log_statement,
1313 L_DEBUG_KEY,
1314 'Errors from AHL_VWP_RULES_PVT.Check_Proj_Responsibility');
1315 END IF;
1316 x_return_status := l_return_status;
1317 IF l_return_status = FND_API.G_RET_STS_ERROR THEN
1318 RAISE FND_API.G_EXC_ERROR;
1319 ELSE
1320 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1321 END IF;
1322 END IF;
1323
1324 IF l_chk_project = 'Y' THEN
1325 IF (l_log_statement >= l_log_current_level) THEN
1326 fnd_log.string(l_log_statement,
1327 L_DEBUG_KEY,
1328 'Before calling PA_PROJECT_PUB.check_unique_project_reference to check for ' || l_project_num_prefix || c_visit_rec.visit_number);
1329 END IF;
1330
1331 PA_PROJECT_PUB.Check_Unique_Project_Reference(
1332 p_api_version_number => 1,
1333 p_init_msg_list => l_init_msg_list,
1334 p_return_status => l_return_status,
1335 p_msg_count => l_msg_count,
1336 p_msg_data => l_msg_data,
1337 -- Modified by rnahata on February 19, 2008 for Bug 6685071
1338 -- by prepending the l_project_num_prefix
1339 p_pm_project_reference => l_project_num_prefix || c_visit_rec.visit_number,
1340 p_unique_project_ref_flag => l_project_flag);
1341
1342 IF (l_log_statement >= l_log_current_level) THEN
1343 fnd_log.string(l_log_statement,
1344 L_DEBUG_KEY,
1345 'Returned from PA_PROJECT_PUB.check_unique_project_reference: p_unique_project_ref_flag = ' || l_project_flag || ', Return Status = ' || l_return_status );
1346 END IF;
1347
1348 IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
1349 IF (l_log_statement >= l_log_current_level) THEN
1350 fnd_log.string(l_log_statement,
1351 L_DEBUG_KEY,
1352 'Errors from PA_PROJECT_PUB.check_unique_project_reference. Message count: ' ||
1353 l_msg_count || ', message data: ' || l_msg_data);
1354 END IF;
1355 IF l_return_status = FND_API.G_RET_STS_ERROR THEN
1356 RAISE FND_API.G_EXC_ERROR;
1357 ELSE
1358 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1359 END IF;
1360 END IF;
1361
1362 IF l_project_flag = 'Y' THEN
1363 IF (l_log_statement >= l_log_current_level) THEN
1364 fnd_log.string(l_log_statement,
1365 L_DEBUG_KEY,
1366 'Before calling PA_PROJECT_PUB.create_project');
1367 END IF;
1368
1369 PA_PROJECT_PUB.CREATE_PROJECT
1370 (p_api_version_number => 1,
1371 p_commit => l_commit,
1372 p_init_msg_list => l_init_msg_list,
1373 p_msg_count => l_msg_count,
1374 p_msg_data => l_msg_data,
1375 p_return_status => x_return_status,
1376 p_workflow_started => l_workflow_started,
1377 p_pm_product_code => G_PM_PRODUCT_CODE,
1378 p_project_in => l_project_rec,
1379 p_project_out => l_project_out,
1380 p_key_members => l_key_members,
1381 p_class_categories => l_class_categories,
1382 p_tasks_in => l_task_in,
1383 p_tasks_out => l_task_out
1384 );
1385
1386 IF (l_log_statement >= l_log_current_level) THEN
1387 fnd_log.string(l_log_statement,
1388 L_DEBUG_KEY,
1389 'After calling PA_PROJECT_PUB.create_project. Project_Id = ' ||
1390 l_project_out.pa_project_id || ' Return Status = ' || x_return_status);
1391 END IF;
1392
1393 IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
1394 IF (l_log_statement >= l_log_current_level) THEN
1395 fnd_log.string(l_log_statement,
1396 L_DEBUG_KEY,
1397 'Errors from PA_PROJECT_PUB.create_project. Message count: ' ||
1398 l_msg_count || ', message data: ' || l_msg_data);
1399 END IF;
1400 IF l_return_status = FND_API.G_RET_STS_ERROR THEN
1401 RAISE FND_API.G_EXC_ERROR;
1402 ELSE
1403 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1404 END IF;
1405 END IF;
1406
1407 IF x_return_status = 'S' THEN
1408 UPDATE AHL_VISITS_B
1409 SET PROJECT_ID = l_project_out.pa_project_id,
1410 OBJECT_VERSION_NUMBER = c_visit_rec.object_version_number + 1
1411 WHERE VISIT_ID = p_visit_id;
1412 -- RROY
1413 -- Post 11.5.10
1414 -- Call Create_Project_Parameter API
1415 -- RROY
1416 -- Confirm the parameters
1417 -- Other parameters are not mandatory
1418
1419 OPEN c_cost_group(c_visit_rec.organization_id);
1420 FETCH c_cost_group INTO l_param_data.cost_group_id;
1421 CLOSE c_cost_group;
1422
1423 l_param_data.project_id := l_project_out.pa_project_id;
1424 l_param_data.organization_id := c_visit_rec.organization_id;
1425 --l_param_data.cost_group_id := NVL(l_param_data.cost_group_id,1);
1426 l_param_data.wip_acct_class_code := NULL;
1427 l_param_data.eam_acct_class_code := NULL;
1428 l_param_data.ipv_expenditure_type := NULL;
1429 l_param_data.erv_expenditure_type := NULL;
1430 l_param_data.freight_expenditure_type := NULL;
1431 l_param_data.tax_expenditure_type := NULL;
1432 l_param_data.misc_expenditure_type := NULL;
1433 l_param_data.ppv_expenditure_type := NULL;
1434 l_param_data.dir_item_expenditure_type := 'Machine Usage';
1435 -- yazhou 06Oct2005 starts
1436 -- Bug fix #4658861
1437 --l_param_data.start_date_active := c_visit_rec.start_date_time;
1438 --l_param_data.end_date_active := c_visit_rec.close_date_time;
1439 l_param_data.start_date_active := NULL;
1440 l_param_data.end_date_active := NULL;
1441 -- yazhou 06Oct2005 ends
1442 -- Changes made by jaramana on May 5, 2006 to accommodate PJM Bug 5197977/5194650
1443 IF (l_log_statement >= l_log_current_level) THEN
1444 FND_LOG.STRING(l_log_statement, L_DEBUG_KEY, 'About to set MFG_ORGANIZATION_ID Profile with ' || c_visit_rec.organization_id);
1445 END IF;
1446 FND_PROFILE.PUT('MFG_ORGANIZATION_ID', TO_CHAR(c_visit_rec.organization_id));
1447
1448 PJM_PROJECT_PARAM_PUB.Create_Project_Parameter(
1449 p_api_version => 1.0,
1450 p_init_msg_list => l_init_msg_list,
1451 p_commit => l_commit,
1452 x_return_status => l_return_status,
1453 x_msg_count => l_msg_count,
1454 x_msg_data => l_msg_data,
1455 p_param_data => l_param_data);
1456
1457 IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
1458 IF (l_log_statement >= l_log_current_level) THEN
1459 fnd_log.string(l_log_statement,
1460 L_DEBUG_KEY,
1461 'Errors from PJM_PROJECT_PARAM_PUB.Create_Project_Parameter. Message count: ' ||
1462 l_msg_count || ', message data: ' || l_msg_data);
1463 END IF;
1464
1465 IF l_return_status = FND_API.G_RET_STS_ERROR THEN
1466 RAISE FND_API.G_EXC_ERROR;
1467 ELSE
1468 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1469 END IF;
1470 END IF;
1471 -- RROY
1472 IF l_task_out.COUNT > 0 THEN
1473 z := l_task_out.FIRST;
1474 LOOP
1475 IF (l_log_statement >= l_log_current_level) THEN
1476 fnd_log.string(l_log_statement,
1477 L_DEBUG_KEY,
1478 'Updating all tasks project_task_id = ' ||
1479 l_task_out(z).pa_task_id);
1480 END IF;
1481
1482 OPEN c_Task_OVN(p_visit_id,l_task_in(z).PA_TASK_NUMBER);
1483 FETCH c_Task_OVN INTO l_obj_version;
1484 CLOSE c_Task_OVN;
1485
1486 UPDATE AHL_VISIT_TASKS_B
1487 SET PROJECT_TASK_ID = l_task_out(z).pa_task_id,
1488 OBJECT_VERSION_NUMBER = l_obj_version + 1
1489 WHERE VISIT_ID = p_visit_id AND VISIT_TASK_NUMBER = l_task_in(z).PA_TASK_NUMBER;
1490
1491 EXIT WHEN z = l_task_out.LAST ;
1492 z := l_task_out.NEXT(z);
1493 END LOOP;
1494 END IF; -- End of l_task_out.COUNT
1495 END IF; -- End of x_return_status = 'S'
1496 ELSE -- Else of l_project_flag = 'Y'
1497 x_return_status := Fnd_Api.g_ret_sts_error;
1498 IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_error) THEN
1499 Fnd_Message.set_name ('AHL', 'AHL_VWP_PROJECT_NOT_UNIQUE');
1500 Fnd_Msg_Pub.ADD;
1501 END IF;
1502 END IF; -- End of l_project_flag = 'Y'
1503 END IF; --- End of l_chk_project = 'Y'
1504 ELSIF c_visit_rec.START_DATE_TIME IS NULL or c_visit_rec.START_DATE_TIME = Fnd_Api.G_MISS_DATE THEN
1505 x_return_status := Fnd_Api.g_ret_sts_error;
1506 IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_error) THEN
1507 Fnd_Message.set_name ('AHL', 'AHL_VWP_VISIT_ST_DT_MISSING');
1508 Fnd_Msg_Pub.ADD;
1509 END IF;
1510 END IF; -- End of Start Time and Department null Check
1511
1512 IF (l_log_procedure >= l_log_current_level) THEN
1513 fnd_log.string(l_log_procedure,
1514 L_DEBUG_KEY ||'.end',
1515 'At the end of PL SQL procedure. Return Status = ' || x_return_status);
1516 END IF;
1517 END Create_Project;
1518
1519 --------------------------------------------------------------------
1520 -- PROCEDURE
1521 -- Update_Project
1522 --
1523 -- PURPOSE
1524 -- To update Project status to CLOSED when visit is set as Closed/Canceled
1525 --------------------------------------------------------------------
1526 PROCEDURE Update_Project(
1527 p_api_version IN NUMBER,
1528 p_init_msg_list IN VARCHAR2 := Fnd_Api.g_false,
1529 p_commit IN VARCHAR2 := Fnd_Api.g_false,
1530 p_validation_level IN NUMBER := Fnd_Api.g_valid_level_full,
1531 p_module_type IN VARCHAR2 := Null,
1532 p_visit_id IN NUMBER,
1533
1534 x_return_status OUT NOCOPY VARCHAR2,
1535 x_msg_count OUT NOCOPY NUMBER,
1536 x_msg_data OUT NOCOPY VARCHAR2)
1537 AS
1538 -- Define local Variables
1539 L_API_NAME CONSTANT VARCHAR2(30) := 'Update_Project';
1540 L_API_VERSION CONSTANT NUMBER := 1.0;
1541 L_DEBUG_KEY CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
1542 l_count NUMBER;
1543 l_msg_count NUMBER;
1544 l_created_project_id NUMBER;
1545 i NUMBER;
1546 l_msg_index_out NUMBER;
1547 CREATED_FROM_PROJECT_ID NUMBER;
1548 l_return_status VARCHAR2(1);
1549 l_chk_project VARCHAR2(1);
1550 l_workflow_started VARCHAR2(1);
1551 l_valid_flag VARCHAR2(1):= 'N';
1552 l_commit VARCHAR2(1) := 'F';
1553 l_init_msg_list VARCHAR2(1) := 'F';
1554 l_default VARCHAR2(30);
1555 l_msg_data VARCHAR2(2000);
1556 G_EXC_ERROR EXCEPTION;
1557
1558 -- Define local table and record datatypes
1559 l_project_rec PA_PROJECT_PUB.PROJECT_IN_REC_TYPE;
1560 l_project_out PA_PROJECT_PUB.PROJECT_OUT_REC_TYPE;
1561 l_param_data PJM_PROJECT_PARAM_PUB.ParamRecType;
1562 l_task_in PA_PROJECT_PUB.TASK_IN_TBL_TYPE;
1563 l_task_out PA_PROJECT_PUB.TASK_OUT_TBL_TYPE;
1564 l_key_members PA_PROJECT_PUB.PROJECT_ROLE_TBL_TYPE;
1565 l_class_categories PA_PROJECT_PUB.CLASS_CATEGORY_TBL_TYPE;
1566
1567 -- yazhou 26Sept2005 starts
1568 -- ER#4618348
1569 -- l_project_name_prefix VARCHAR2(10);
1570 l_project_num_prefix VARCHAR2(10);
1571 l_visit_name_len NUMBER;
1572 -- yazhou 26Sept2005 ends
1573
1574 -- Define local Cursors
1575 -- To find visit related information
1576 CURSOR c_visit (x_id IN NUMBER) IS
1577 SELECT * FROM AHL_VISITS_VL
1578 WHERE VISIT_ID = x_id;
1579 c_visit_rec c_visit%ROWTYPE;
1580
1581 -- To find count for tasks for visit
1582 CURSOR c_task_ct (x_id IN NUMBER) IS
1583 SELECT count(*) FROM AHL_VISIT_TASKS_VL
1584 WHERE VISIT_ID = x_id
1585 AND NVL(status_code, 'Y') <> NVL ('DELETED', 'X') ;
1586
1587 -- To find tasks information for visit
1588 CURSOR c_task (x_id IN NUMBER) IS
1589 SELECT * FROM AHL_VISIT_TASKS_VL
1590 WHERE VISIT_ID = x_id
1591 AND NVL(status_code, 'Y') <> NVL ('DELETED', 'X') ;
1592 c_task_rec c_task%ROWTYPE;
1593
1594 -- To find tasks information for visit
1595 CURSOR c_task_proj (x_id IN NUMBER) IS
1596 SELECT TASK_ID, TASK_NUMBER
1597 FROM PA_TASKS
1598 WHERE PROJECT_ID = x_id;
1599 c_task_proj_rec c_task_proj%ROWTYPE;
1600
1601 CURSOR c_pjm_param(x_proj_id IN NUMBER,x_org_id IN NUMBER) IS
1602 SELECT 'x'
1603 FROM pjm_project_parameters_v
1604 WHERE project_id = x_proj_id
1605 AND organization_id = x_org_id;
1606
1607 l_dummy VARCHAR2(1);
1608
1609 -- To get the cost group for the Org
1610 CURSOR c_cost_group(p_org_id IN NUMBER) IS
1611 SELECT default_cost_group_id
1612 FROM mtl_parameters
1613 WHERE organization_id = p_org_id;
1614
1615 --Bug#5587893
1616 /*sowsubra - starts*/
1617 -- To get the project status for visit updation
1618 CURSOR c_proj_status_code(x_id IN NUMBER) IS
1619 SELECT ppa.project_status_code
1620 FROM ahl_visits_b avb, pa_projects_all ppa
1621 WHERE avb.visit_id = x_id
1622 AND avb.project_id = ppa.project_id;
1623
1624 l_prj_status_code_fdb pa_projects_all.project_status_code%TYPE;
1625 /*sowsubra - ends*/
1626
1627 /*
1628 Modified by rnahata for Bug 5758813
1629 Fetches the task details for all the tasks in the visit
1630 The first part of the union fetches task details for all the Planned and Unplanned tasks.
1631 The second part fetches task details of all the MR/NR/SR Summary tasks.
1632 The third part fetches task details of all the manually created Summary and Unassociated tasks.
1633 */
1634 CURSOR get_prj_route_dtls_cur (p_visit_id IN NUMBER) IS
1635 SELECT SUBSTR(NVL(ar.route_no,avt.visit_task_name),1,20) task_name,
1636 SUBSTR(NVL(ar.title,avt.visit_task_name),1,250) description,
1637 avt.visit_task_name, avt.visit_task_number, avt.start_date_time task_start_date,
1638 avt.end_date_time task_end_date, avt.project_Task_id project_task_id
1639 FROM ahl_routes_vl ar,ahl_visit_tasks_vl avt, ahl_mr_routes mrr
1640 WHERE avt.visit_id = p_visit_id
1641 AND NVL(avt.status_code,'Y') = 'PLANNING'
1642 AND avt.task_type_code NOT IN ('SUMMARY','UNASSOCIATED')
1643 AND avt.mr_route_id = mrr.mr_route_id (+)
1644 AND mrr.route_id = ar.route_id (+)
1645 UNION ALL
1646 SELECT SUBSTR(NVL(amh.title,avt.visit_task_name),1,20) task_name, NVL(amh.title,avt.visit_task_name) description,
1647 avt.visit_task_name, avt.visit_task_number, avt.start_date_time task_start_date,
1648 avt.end_date_time task_end_date, avt.project_Task_id project_task_id
1649 FROM ahl_mr_headers_v amh,ahl_visit_tasks_vl avt
1650 WHERE avt.visit_id = p_visit_id
1651 AND NVL(avt.status_code,'Y') = 'PLANNING'
1652 AND avt.task_type_code = 'SUMMARY'
1653 AND avt.summary_task_flag = 'N'
1654 AND avt.mr_id = amh.mr_header_id (+)
1655 UNION ALL
1656 SELECT SUBSTR(avt.visit_task_name,1,20) task_name, avt.visit_task_name description,
1657 avt.visit_task_name, avt.visit_task_number, avt.start_date_time task_start_date,
1658 avt.end_date_time task_end_date, avt.project_Task_id project_task_id
1659 FROM ahl_visit_tasks_vl avt
1660 WHERE avt.visit_id = p_visit_id
1661 AND NVL(avt.status_code,'Y') = 'PLANNING'
1662 AND ((avt.task_type_code = 'SUMMARY' AND avt.summary_task_flag = 'Y')
1663 OR (avt.task_type_code ='UNASSOCIATED'))
1664 ORDER BY 4;
1665 -- End changes by rnahata for Bug 5758813
1666
1667 get_prj_route_dtls_rec get_prj_route_dtls_cur%ROWTYPE;
1668
1669 BEGIN
1670 SAVEPOINT Update_project;
1671
1672 IF (l_log_procedure >= l_log_current_level) THEN
1673 fnd_log.string(l_log_procedure,
1674 L_DEBUG_KEY ||'.begin',
1675 'At the start of PL SQL procedure. Visit Id = ' || p_visit_id);
1676 END IF;
1677
1678 -- Initialize message list if p_init_msg_list is set to TRUE.
1679 IF Fnd_Api.to_boolean(p_init_msg_list) THEN
1680 Fnd_Msg_Pub.initialize;
1681 END IF;
1682
1683 -- Initialize API return status to success
1684 x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
1685
1686 -- Standard call to check for call compatibility.
1687 IF NOT Fnd_Api.COMPATIBLE_API_CALL(l_api_version,
1688 p_api_version,
1689 l_api_name,G_PKG_NAME)
1690 THEN
1691 RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
1692 END IF;
1693
1694 -- To check Project responsibilites
1695 -- Post 11.5.10
1696 -- RROY
1697 IF (l_log_statement >= l_log_current_level) THEN
1698 fnd_log.string(l_log_statement,
1699 L_DEBUG_KEY,
1700 'Before calling AHL_VWP_RULES_PVT.Check_Proj_Responsibility');
1701 END IF;
1702 AHL_VWP_RULES_PVT.Check_Proj_Responsibility
1703 ( x_check_project => l_chk_project,
1704 x_return_status => l_return_status);
1705
1706 IF (l_log_statement >= l_log_current_level) THEN
1707 fnd_log.string(l_log_statement,
1708 L_DEBUG_KEY,
1709 'After calling AHL_VWP_RULES_PVT.Check_Proj_Responsibility. Return Status = ' || l_return_status);
1710 END IF;
1711
1712 IF (l_return_status <> Fnd_Api.G_RET_STS_SUCCESS) THEN
1713 IF (l_log_statement >= l_log_current_level) THEN
1714 fnd_log.string(l_log_statement,
1715 L_DEBUG_KEY,
1716 'Errors from AHL_VWP_RULES_PVT.Check_Proj_Responsibility');
1717 END IF;
1718 x_return_status := l_return_status;
1719 IF l_return_status = FND_API.G_RET_STS_ERROR THEN
1720 RAISE FND_API.G_EXC_ERROR;
1721 ELSE
1722 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1723 END IF;
1724 END IF;
1725
1726 IF l_chk_project = 'Y' THEN
1727 OPEN c_Visit(p_visit_id);
1728 FETCH c_visit INTO c_visit_rec;
1729 CLOSE c_Visit;
1730
1731 --Bug#5587893
1732 OPEN c_proj_status_code(p_visit_id);
1733 FETCH c_proj_status_code INTO l_prj_status_code_fdb;
1734 CLOSE c_proj_status_code;
1735
1736 IF p_module_type = 'DEL' AND (c_visit_rec.start_date_time is null OR c_visit_rec.start_date_time =Fnd_Api.G_MISS_DATE) then
1737 c_visit_rec.start_date_time := SYSDATE;
1738 END IF;
1739
1740 IF (c_visit_rec.START_DATE_TIME IS NOT NULL
1741 AND c_visit_rec.START_DATE_TIME <> Fnd_Api.G_MISS_DATE
1742 AND c_visit_rec.DEPARTMENT_ID IS NOT NULL
1743 AND c_visit_rec.DEPARTMENT_ID <> FND_API.G_MISS_NUM) THEN
1744
1745 IF c_visit_rec.project_template_id IS NOT NULL THEN
1746 CREATED_FROM_PROJECT_ID := c_visit_rec.project_template_id;
1747 ELSE
1748 CREATED_FROM_PROJECT_ID := nvl(FND_PROFILE.VALUE('AHL_DEFAULT_PA_TEMPLATE_ID'),0);
1749 END IF;
1750
1751 -- yazhou 26Sept2005 starts
1752 -- ER#4618348
1753
1754 --l_project_name_prefix := SUBSTR(FND_PROFILE.VALUE('AHL_PROJECT_PREFIX'),1,10);
1755 l_project_num_prefix := SUBSTR(FND_PROFILE.VALUE('AHL_PROJECT_NUM_PREFIX'),1,10);
1756
1757 IF (l_log_statement >= l_log_current_level) THEN
1758 fnd_log.string(l_log_statement,L_DEBUG_KEY,'l_project_num_prefix = ' || l_project_num_prefix);
1759 END IF;
1760
1761 --l_visit_name_len := 30 - nvl(length(SubStr(l_project_name_prefix,1,255)),0);
1762
1763 -- TO UPDATE PROJECT IN PROJECTS
1764 l_Project_rec.PM_PROJECT_REFERENCE := l_project_num_prefix || to_char(c_visit_rec.visit_number);
1765 --l_Project_rec.PROJECT_NAME := l_project_name_prefix|| SUBSTR(c_visit_rec.visit_name,1,l_visit_name_len);
1766 l_Project_rec.PROJECT_NAME := l_project_num_prefix || to_char(c_visit_rec.visit_number);
1767 -- yazhou 26Sept2005 ends
1768 l_Project_rec.CREATED_FROM_PROJECT_ID := CREATED_FROM_PROJECT_ID;
1769 -- AnRaj: Changed for Bug#5069540
1770 l_Project_rec.DESCRIPTION := SUBSTR(c_visit_rec.description,1,250);
1771 --Fix for the Bug 7009212; rnahata truncated the dates
1772 l_Project_rec.START_DATE := trunc(c_visit_rec.start_date_time);
1773 l_Project_rec.COMPLETION_DATE := trunc(c_visit_rec.close_date_time);
1774 l_Project_rec.SCHEDULED_START_DATE := trunc(c_visit_rec.start_date_time);
1775 --rnahata End
1776 l_Project_rec.PA_PROJECT_ID := c_visit_rec.PROJECT_ID;
1777 /*-- Post 11.5.10
1778 -- RROY
1779 IF c_visit_rec.status_code = 'CLOSED' OR c_visit_rec.status_code = 'CANCELLED' THEN
1780 l_Project_rec.PROJECT_STATUS_CODE := 'CLOSED';
1781 ELSIF p_module_type = 'UPT' OR p_module_type = 'DEL' THEN
1782 l_Project_rec.PROJECT_STATUS_CODE := 'REJECTED';
1783 END IF;
1784 -- RROY*/
1785 -- Merge process for 11.5 10 bug fix on CMRDV10P env.
1786 -- Start
1787 IF c_visit_rec.status_code = 'CLOSED' OR c_visit_rec.status_code = 'CANCELLED' THEN
1788 l_Project_rec.PROJECT_STATUS_CODE := 'CLOSED';
1789 ELSIF p_module_type = 'UPT' OR p_module_type = 'DEL' THEN
1790 l_Project_rec.PROJECT_STATUS_CODE := 'REJECTED';
1791 ELSE
1792 -- yazhou 08Nov2005 starts
1793 -- Changed by jaramana on April 28, 2005 to fix Bug 4273892
1794 --l_Project_rec.PROJECT_STATUS_CODE := 'ACTIVE';
1795 --l_Project_rec.PROJECT_STATUS_CODE := 'SUBMITTED';
1796 --Bug#5587893
1797 l_Project_rec.PROJECT_STATUS_CODE := l_prj_status_code_fdb;
1798 -- yazhou 08Nov2005 ends
1799 END IF;
1800 -- End
1801
1802 IF (l_log_statement >= l_log_current_level) THEN
1803 fnd_log.string(l_log_statement,L_DEBUG_KEY,'After assigning all values to project record type');
1804 END IF;
1805
1806 OPEN c_task_ct(p_visit_id);
1807 FETCH c_task_ct INTO l_count;
1808 CLOSE c_task_ct;
1809
1810 IF (l_log_statement >= l_log_current_level) THEN
1811 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Number of tasks = ' || l_count);
1812 END IF;
1813
1814 IF l_count > 0 THEN
1815 -- Begin changes by rnahata for Bug 5758813
1816 OPEN get_prj_route_dtls_cur(p_visit_id);
1817 i := 1;
1818 LOOP
1819 FETCH get_prj_route_dtls_cur INTO get_prj_route_dtls_rec;
1820 EXIT WHEN get_prj_route_dtls_cur%NOTFOUND;
1821 l_task_in(i).PM_TASK_REFERENCE := get_prj_route_dtls_rec.visit_task_number;
1822 l_task_in(i).TASK_NAME := get_prj_route_dtls_rec.task_name;
1823 l_task_in(i).PA_TASK_NUMBER := get_prj_route_dtls_rec.visit_task_number;
1824 l_task_in(i).TASK_DESCRIPTION := get_prj_route_dtls_rec.description;
1825 --Fix for the Bug 7009212; rnahata truncated the dates
1826 l_task_in(i).TASK_START_DATE := trunc(get_prj_route_dtls_rec.task_start_date);
1827 l_task_in(i).TASK_COMPLETION_DATE := trunc(get_prj_route_dtls_rec.task_end_date);
1828 --rnahata End
1829 l_task_in(i).PA_TASK_ID := get_prj_route_dtls_rec.project_task_id;
1830 IF (l_log_statement >= l_log_current_level) THEN
1831 fnd_log.string(l_log_statement,
1832 L_DEBUG_KEY,
1833 'Visit Task ' || i || ': Name = ' || l_task_in(i).TASK_NAME);
1834 END IF;
1835 i := i + 1;
1836 END LOOP;
1837 CLOSE get_prj_route_dtls_cur;
1838 -- End changes by rnahata for Bug 5758813
1839 END IF;
1840
1841 -- Need to update proejct for
1842 IF c_visit_rec.PROJECT_ID IS NOT NULL THEN
1843 IF (l_log_statement >= l_log_current_level) THEN
1844 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Visit Project ID = ' || c_visit_rec.PROJECT_ID);
1845 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Before calling PA_PROJECT_PUB.UPDATE_PROJECT');
1846 END IF;
1847
1848 PA_PROJECT_PUB.UPDATE_PROJECT
1849 (p_api_version_number => 1,
1850 p_commit => l_commit,
1851 p_init_msg_list => l_init_msg_list,
1852 p_msg_count => l_msg_count,
1853 p_msg_data => l_msg_data,
1854 p_return_status => l_return_status,
1855 p_workflow_started => l_workflow_started,
1856 p_pm_product_code => G_PM_PRODUCT_CODE,
1857 p_project_in => l_project_rec,
1858 p_project_out => l_project_out,
1859 p_key_members => l_key_members,
1860 p_class_categories => l_class_categories,
1861 p_tasks_in => l_task_in,
1862 p_tasks_out => l_task_out
1863 );
1864
1865 IF (l_log_statement >= l_log_current_level) THEN
1866 fnd_log.string(l_log_statement,L_DEBUG_KEY,'After calling PA_PROJECT_PUB.UPDATE_PROJECT - l_return_status = '||l_return_status);
1867 END IF;
1868
1869 IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
1870 IF (l_log_statement >= l_log_current_level) THEN
1871 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Errors from PA_PROJECT_PUB.UPDATE_PROJECT - l_msg_count = '||l_msg_count);
1872 END IF;
1873 RAISE Fnd_Api.g_exc_error;
1874 END IF;
1875
1876 -- If the Visit Organisation is chnaged after costing
1877 -- need to set pjm paramters for the new org if it doesnot exist.
1878 OPEN c_pjm_param(c_visit_rec.project_id, c_visit_rec.organization_id);
1879 FETCH c_pjm_param INTO l_dummy;
1880 IF c_pjm_param%NOTFOUND THEN -- need to create for new org
1881
1882 OPEN c_cost_group(c_visit_rec.organization_id);
1883 FETCH c_cost_group INTO l_param_data.cost_group_id;
1884 CLOSE c_cost_group;
1885
1886 l_param_data.project_id := c_visit_rec.project_id;
1887 l_param_data.organization_id := c_visit_rec.organization_id;
1888 -- l_param_data.cost_group_id := NVL(l_param_data.cost_group_id,1);
1889 l_param_data.wip_acct_class_code := NULL;
1890 l_param_data.eam_acct_class_code := NULL;
1891 l_param_data.ipv_expenditure_type := NULL;
1892 l_param_data.erv_expenditure_type := NULL;
1893 l_param_data.freight_expenditure_type := NULL;
1894 l_param_data.tax_expenditure_type := NULL;
1895 l_param_data.misc_expenditure_type := NULL;
1896 l_param_data.ppv_expenditure_type := NULL;
1897 l_param_data.dir_item_expenditure_type := 'Machine Usage';
1898 -- yazhou 06Oct2005 starts
1899 -- Bug fix #4658861
1900 -- l_param_data.start_date_active := c_visit_rec.start_date_time;
1901 -- l_param_data.end_date_active := c_visit_rec.close_date_time;
1902 l_param_data.start_date_active := NULL;
1903 l_param_data.end_date_active := NULL;
1904 -- yazhou 06Oct2005 ends
1905
1906 PJM_PROJECT_PARAM_PUB.CREATE_PROJECT_PARAMETER(
1907 p_api_version => 1.0,
1908 p_init_msg_list => p_init_msg_list,
1909 p_commit => l_commit,
1910 x_return_status => l_return_status,
1911 x_msg_count => l_msg_count,
1912 x_msg_data => l_msg_data,
1913 p_param_data => l_param_data);
1914
1915 IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
1916 CLOSE c_pjm_param;
1917 RAISE FND_API.G_EXC_ERROR;
1918 END IF;
1919 -- RROY
1920 END IF;
1921 CLOSE c_pjm_param;
1922
1923 -- Merge process fro 11.5 10 bug fix on cmrdv10p env.
1924 -- Bug# 3594083 fix by shbhanda on 04/23
1925 -- To update all tasks without project task with project task id
1926 OPEN c_task_proj(c_visit_rec.PROJECT_ID);
1927 LOOP
1928 FETCH c_task_proj INTO c_task_proj_rec;
1929 EXIT WHEN c_task_proj%NOTFOUND;
1930
1931 UPDATE AHL_VISIT_TASKS_B SET
1932 PROJECT_TASK_ID = c_task_proj_rec.task_id,
1933 OBJECT_VERSION_NUMBER = OBJECT_VERSION_NUMBER + 1
1934 /*B6436358 - sowsubra - Visit task number is of type number and task number in projects
1935 is of type char. Hence the invalid number error. And so added a to_char function to convert
1936 the visit task number to character*/
1937 WHERE VISIT_ID = p_visit_id AND TO_CHAR(VISIT_TASK_NUMBER) = c_task_proj_rec.task_number
1938 AND PROJECT_TASK_ID is NULL;
1939 END LOOP;
1940 CLOSE c_task_proj;
1941 END IF;
1942 ELSIF c_visit_rec.START_DATE_TIME IS NULL or c_visit_rec.START_DATE_TIME = Fnd_Api.G_MISS_DATE THEN
1943 x_return_status := Fnd_Api.g_ret_sts_error;
1944 IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_error) THEN
1945 Fnd_Message.set_name ('AHL', 'AHL_VWP_VISIT_ST_DT_MISSING');
1946 Fnd_Msg_Pub.ADD;
1947 END IF;
1948 END IF; -- check for visit's start date time
1949 END IF; -- l_chk_project
1950
1951 ---------------------------End of API Body---------------------------------------
1952 --Standard check to count messages
1953 l_msg_count := Fnd_Msg_Pub.count_msg;
1954
1955 IF l_msg_count > 0 THEN
1956 X_msg_count := l_msg_count;
1957 X_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
1958 RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
1959 END IF;
1960
1961 IF (l_log_procedure >= l_log_current_level) THEN
1962 fnd_log.string(l_log_procedure,L_DEBUG_KEY ||'.end','End of the procedure');
1963 END IF;
1964
1965 EXCEPTION
1966 WHEN FND_API.G_EXC_ERROR THEN
1967 x_return_status := FND_API.G_RET_STS_ERROR;
1968 ROLLBACK TO Update_Project;
1969 FND_MSG_PUB.count_and_get(p_count => x_msg_count,
1970 p_data => x_msg_data,
1971 p_encoded => fnd_api.g_false);
1972
1973 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
1974 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1975 ROLLBACK TO Update_Project;
1976 FND_MSG_PUB.count_and_get(p_count => x_msg_count,
1977 p_data => x_msg_data,
1978 p_encoded => fnd_api.g_false);
1979
1980 WHEN OTHERS THEN
1981 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1982 ROLLBACK TO Update_Project;
1983 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
1984 fnd_msg_pub.add_exc_msg(p_pkg_name => G_PKG_NAME,
1985 p_procedure_name => 'Update_Project',
1986 p_error_text => SUBSTR(SQLERRM,1,500));
1987 END IF;
1988 FND_MSG_PUB.count_and_get(p_count => x_msg_count,
1989 p_data => x_msg_data,
1990 p_encoded => fnd_api.g_false);
1991
1992 END Update_Project;
1993
1994 --------------------------------------------------------------------
1995 -- PROCEDURE
1996 -- Delete_Project
1997 --
1998 -- PURPOSE
1999 -- To delete Project and its tasks if visit in VWP is deleted
2000 --------------------------------------------------------------------
2001 PROCEDURE Delete_Project(
2002 p_api_version IN NUMBER,
2003 p_init_msg_list IN VARCHAR2 := Fnd_Api.g_false,
2004 p_commit IN VARCHAR2 := Fnd_Api.g_false,
2005 p_validation_level IN NUMBER := Fnd_Api.g_valid_level_full,
2006 p_module_type IN VARCHAR2 := Null,
2007 p_visit_id IN NUMBER,
2008 x_return_status OUT NOCOPY VARCHAR2,
2009 x_msg_count OUT NOCOPY NUMBER,
2010 x_msg_data OUT NOCOPY VARCHAR2 )
2011 AS
2012 -- Define local Variables
2013 L_API_NAME CONSTANT VARCHAR2(30) := 'Delete_Project';
2014 L_DEBUG_KEY CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
2015 L_API_VERSION CONSTANT NUMBER := 1.0;
2016 l_count NUMBER;
2017 l_msg_count NUMBER;
2018 l_created_project_id NUMBER;
2019 i NUMBER;
2020 l_return_status VARCHAR2(1);
2021 l_chk_project VARCHAR2(1);
2022 l_del_proj_flag VARCHAR2(1);
2023 l_valid_flag VARCHAR2(1):= 'N';
2024 l_commit VARCHAR2(1) := 'F';
2025 l_init_msg_list VARCHAR2(1) := 'F';
2026 l_default VARCHAR2(30);
2027 l_msg_data VARCHAR2(2000);
2028 G_EXC_ERROR EXCEPTION;
2029
2030 -- Define local Cursors
2031 -- To find visit related information
2032 CURSOR c_visit (x_id IN NUMBER) IS
2033 SELECT * FROM AHL_VISITS_VL
2034 WHERE VISIT_ID = x_id;
2035 c_visit_rec c_visit%ROWTYPE;
2036
2037 -- To find whether the visit project occurs in PJM_PROJECT_PARAMETERS table
2038 CURSOR c_Project(x_proj_id IN NUMBER) IS
2039 SELECT count(*) FROM PJM_PROJECT_PARAMETERS
2040 WHERE Project_ID = x_proj_id;
2041 BEGIN
2042
2043 SAVEPOINT Delete_project;
2044
2045 IF (l_log_procedure >= l_log_current_level) THEN
2046 fnd_log.string(l_log_procedure,L_DEBUG_KEY ||'.begin','At the start of the procedure');
2047 END IF;
2048
2049 -- Initialize message list if p_init_msg_list is set to TRUE.
2050 IF Fnd_Api.to_boolean(p_init_msg_list)THEN
2051 Fnd_Msg_Pub.initialize;
2052 END IF;
2053
2054 -- Initialize API return status to success
2055 x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
2056
2057 -- Standard call to check for call compatibility.
2058 IF NOT Fnd_Api.COMPATIBLE_API_CALL(l_api_version,
2059 p_api_version,
2060 L_API_NAME,G_PKG_NAME) THEN
2061 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2062 END IF;
2063
2064 IF (l_log_statement >= l_log_current_level) THEN
2065 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Visit Id=' || p_visit_id);
2066 END IF;
2067
2068 OPEN c_visit (p_visit_id);
2069 FETCH c_visit INTO c_visit_rec;
2070 CLOSE c_visit;
2071
2072 -- To check Project responsibilites
2073 -- Post 11.5.10
2074 -- RROY
2075 AHL_VWP_RULES_PVT.Check_Proj_Responsibility
2076 (x_check_project => l_chk_project,
2077 x_return_status => l_return_status);
2078
2079 IF l_return_status <> Fnd_Api.G_RET_STS_SUCCESS THEN
2080 x_return_status := l_return_status;
2081 RAISE G_EXC_ERROR;
2082 END IF;
2083
2084 IF l_chk_project = 'Y' THEN
2085 OPEN c_Project(c_visit_rec.PROJECT_ID);
2086 FETCH c_Project INTO l_count;
2087 CLOSE c_Project;
2088
2089 IF l_count > 0 THEN -- merge process for 11.5 10 bug# 3470801 fix on CMRDV10P
2090 Fnd_Message.SET_NAME('AHL','AHL_VWP_PROJ_PJM_PARA');
2091 Fnd_Message.SET_TOKEN('VISIT_NUMBER', c_visit_rec.Visit_Number);
2092 Fnd_Msg_Pub.ADD;
2093 RAISE Fnd_Api.G_EXC_ERROR;
2094 ELSE
2095 IF (l_log_statement >= l_log_current_level) THEN
2096 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Before calling : PA_PROJECT_PUB.CHECK_DELETE_PROJECT_OK');
2097 END IF;
2098
2099 PA_PROJECT_PUB.CHECK_DELETE_PROJECT_OK
2100 ( p_api_version_number => 1
2101 , p_init_msg_list => l_init_msg_list
2102 , p_return_status => l_return_status
2103 , p_msg_count => l_msg_count
2104 , p_msg_data => l_msg_data
2105 , p_project_id => c_visit_rec.PROJECT_ID
2106 , p_pm_project_reference => c_visit_rec.visit_number
2107 , p_delete_project_ok_flag => l_del_proj_flag
2108 );
2109
2110 IF (l_log_statement >= l_log_current_level) THEN
2111 fnd_log.string(l_log_statement,L_DEBUG_KEY,'After calling PA_PROJECT_PUB.CHECK_DELETE_PROJECT_OK - l_return_status = '||l_return_status);
2112 END IF;
2113
2114 IF l_return_status <> 'S' THEN
2115 RAISE G_EXC_ERROR;
2116 END IF;
2117
2118 IF (l_log_statement >= l_log_current_level) THEN
2119 fnd_log.string(l_log_statement,L_DEBUG_KEY,'l_del_proj_flag = '||l_del_proj_flag);
2120 END IF;
2121
2122 IF l_del_proj_flag = 'Y' THEN
2123 IF (l_log_statement >= l_log_current_level) THEN
2124 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Before calling PA_PROJECT_PUB.DELETE_PROJECT');
2125 END IF;
2126
2127 PA_PROJECT_PUB.DELETE_PROJECT
2128 ( p_api_version_number => 1
2129 ,p_commit => l_commit
2130 ,p_init_msg_list => l_init_msg_list
2131 ,p_msg_count => l_msg_count
2132 ,p_msg_data => l_msg_data
2133 ,p_return_status => l_return_status
2134 ,p_pm_product_code => G_PM_PRODUCT_CODE
2135 ,p_pm_project_reference => c_visit_rec.visit_number
2136 ,p_pa_project_id => c_visit_rec.PROJECT_ID
2137 );
2138
2139 IF (l_log_statement >= l_log_current_level) THEN
2140 fnd_log.string(l_log_statement,L_DEBUG_KEY,'After calling PA_PROJECT_PUB.DELETE_PROJECT - l_return_status = '||l_return_status);
2141 END IF;
2142
2143 IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
2144 IF (l_log_statement >= l_log_current_level) THEN
2145 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Errors from PA_PROJECT_PUB.DELETE_PROJECT API : '|| x_msg_count );
2146 END IF;
2147 RAISE Fnd_Api.g_exc_error;
2148 END IF;
2149 END IF;
2150 END IF;
2151 END IF;
2152
2153 ---------------------------End of API Body---------------------------------------
2154 --Standard check to count messages
2155 l_msg_count := Fnd_Msg_Pub.count_msg;
2156
2157 IF l_msg_count > 0 THEN
2158 X_msg_count := l_msg_count;
2159 X_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
2160 RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
2161 END IF;
2162
2163 IF (l_log_procedure >= l_log_current_level) THEN
2164 fnd_log.string(l_log_procedure,L_DEBUG_KEY ||'.end','End of the procedure');
2165 END IF;
2166
2167 EXCEPTION
2168 WHEN FND_API.G_EXC_ERROR THEN
2169 x_return_status := FND_API.G_RET_STS_ERROR;
2170 ROLLBACK TO Delete_Project;
2171 FND_MSG_PUB.count_and_get(p_count => x_msg_count,
2172 p_data => x_msg_data,
2173 p_encoded => fnd_api.g_false);
2174
2175 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
2176 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2177 ROLLBACK TO Delete_Project;
2178 FND_MSG_PUB.count_and_get(p_count => x_msg_count,
2179 p_data => x_msg_data,
2180 p_encoded => fnd_api.g_false);
2181
2182 WHEN OTHERS THEN
2183 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2184 ROLLBACK TO Delete_Project;
2185 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
2186 fnd_msg_pub.add_exc_msg(p_pkg_name => G_PKG_NAME,
2187 p_procedure_name => 'Delete_Project',
2188 p_error_text => SUBSTR(SQLERRM,1,500));
2189 END IF;
2190 FND_MSG_PUB.count_and_get(p_count => x_msg_count,
2191 p_data => x_msg_data,
2192 p_encoded => fnd_api.g_false);
2193 END Delete_Project;
2194
2195 --****************************************************************--
2196 --------------------------------------------------------------------
2197 -- VWP INTEGRATION WITH PRODUCTION --
2198 --------------------------------------------------------------------
2199 --****************************************************************--
2200
2201 ------------------------------------------------------------------
2202 -- Procedure name : Validate_MR_Route_Date
2203 -- Type : Private
2204 -- Function : Validate if the tasks associated to MR Route Id
2205 -- have an expired MR Id / Route Id.
2206 -- Parameters :
2207 --
2208 -- Validate_MR_Route_Date Parameters:
2209 -- p_mr_route_id IN NUMBER Required
2210 -- p_visit_task_number IN NUMBER Required
2211 -- p_start_date_time IN DATE Required
2212 -- p_end_date_time IN DATE Required
2213 --
2214 -- Version :
2215 -- 28 Sep, 2007 RNAHATA Initial Version - 1.0
2216 -- Added for Bug 6448678
2217 -------------------------------------------------------------------
2218
2219 PROCEDURE Validate_MR_Route_Date(
2220 p_mr_route_id IN NUMBER,
2221 p_visit_task_number IN NUMBER,
2222 p_start_date_time IN DATE,
2223 p_end_date_time IN DATE
2224 )
2225 AS
2226 -- Define local Variables
2227 L_API_NAME CONSTANT VARCHAR2(30) := 'Validate_MR_Route_Date';
2228 L_DEBUG_KEY CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
2229
2230 -- To find MR related Information
2231 CURSOR c_mr_header (c_id IN NUMBER) IS
2232 SELECT mrh1.effective_from,mrh1.effective_to
2233 FROM AHL_MR_HEADERS_APP_V mrh1, AHL_MR_ROUTES mrr
2234 WHERE mrh1.mr_status_code = 'COMPLETE' AND
2235 trunc(mrh1.effective_from) <= trunc(sysdate) AND
2236 trunc(nvl(mrh1.effective_to,sysdate)) >= trunc(sysdate) AND
2237 mrr.mr_route_id = c_id AND
2238 mrh1.mr_header_id = mrr.mr_header_id AND
2239 mrh1.version_number = (select max(version_number)
2240 from AHL_MR_HEADERS_APP_V mrh2
2241 where mrh2.title = mrh1.title
2242 and mrh2.mr_status_code = 'COMPLETE'
2243 and trunc(effective_from) <= trunc(sysdate) AND
2244 trunc(nvl(effective_to,sysdate)) >= trunc(sysdate));
2245
2246 c_mr_header_rec c_mr_header%ROWTYPE;
2247
2248 -- To find Route related Information
2249 CURSOR c_route (c_id IN NUMBER) IS
2250 SELECT ra.*
2251 FROM AHL_ROUTES_APP_V ra, AHL_MR_ROUTES mrr
2252 WHERE ra.route_id = mrr.route_id AND
2253 mrr.mr_route_id = c_id AND
2254 ra.revision_status_code = 'COMPLETE';
2255
2256 c_route_rec c_route%ROWTYPE;
2257
2258 BEGIN
2259
2260 -- Log API Entry Point
2261 IF (l_log_procedure >= l_log_current_level) THEN
2262 fnd_log.string(l_log_procedure,
2263 L_DEBUG_KEY ||'.begin',
2264 'At the start of PL SQL procedure.');
2265 fnd_log.string(l_log_procedure,
2266 L_DEBUG_KEY,
2267 'MR Route Id = ' || p_mr_route_id || 'Visit Task Number = ' || p_visit_task_number ||
2268 'Start Date = ' || p_start_date_time || 'End Date = ' || p_end_date_time);
2269 END IF;
2270
2271 IF p_mr_route_id IS NOT NULL THEN
2272 OPEN c_route (p_mr_route_id);
2273 FETCH c_route INTO c_route_rec;
2274
2275 IF c_route%FOUND THEN
2276 CLOSE c_route;
2277
2278 IF (l_log_statement >= l_log_current_level) THEN
2279 fnd_log.string(l_log_statement,
2280 L_DEBUG_KEY,
2281 'Checking Route Start and End Dates');
2282 END IF;
2283
2284 IF TRUNC(c_route_rec.start_date_active) > p_start_date_time THEN
2285
2286 Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_TSK_STDT_ROUT_STDT');
2287 Fnd_Message.Set_Token('TASK_NUMBER', p_visit_task_number);
2288 Fnd_Msg_Pub.ADD;
2289
2290 END IF;
2291
2292 IF TRUNC(c_route_rec.end_date_active) IS NOT NULL THEN
2293 IF TRUNC(c_route_rec.end_date_active) < p_end_date_time THEN
2294
2295 Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_TSK_ENDT_ROUT_ENDT');
2296 Fnd_Message.Set_Token('TASK_NUMBER', p_visit_task_number);
2297 Fnd_Msg_Pub.ADD;
2298
2299 END IF;
2300 END IF;
2301
2302 ELSE -- Else of c_route%FOUND check
2303
2304 CLOSE c_route;
2305
2306 Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_TSK_NO_ROUTE');
2307 Fnd_Message.Set_Token('TASK_NUMBER', p_visit_task_number);
2308 Fnd_Msg_Pub.ADD;
2309
2310 END IF; -- End of c_route%FOUND check
2311
2312 -- If the tasks associated to MR Route Id have an expired MR Id
2313 -- then it cannot be pushed into Production Planning.
2314 OPEN c_mr_header (p_mr_route_id);
2315 FETCH c_mr_header INTO c_mr_header_rec;
2316
2317 IF c_mr_header%FOUND THEN
2318 CLOSE c_mr_header;
2319
2320 IF (l_log_statement >= l_log_current_level) THEN
2321 fnd_log.string(l_log_statement,
2322 L_DEBUG_KEY,
2323 'Checking MR Start and End Dates');
2324 END IF;
2325
2326 IF TRUNC(c_mr_header_rec.effective_from) > p_start_date_time THEN
2327 Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_NO_TS_SD_LT_MR');
2328 Fnd_Message.Set_Token('TASK_NUMBER', p_visit_task_number);
2329 Fnd_Msg_Pub.ADD;
2330
2331 END IF;
2332 IF TRUNC(c_mr_header_rec.effective_to) IS NOT NULL THEN
2333 IF TRUNC(c_mr_header_rec.effective_to) < p_end_date_time THEN
2334
2335 Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_NO_TS_ED_GT_MR');
2336 Fnd_Message.Set_Token('TASK_NUMBER', p_visit_task_number);
2337 Fnd_Msg_Pub.ADD;
2338
2339 END IF;
2340 END IF;
2341
2342 ELSE -- Else for c_mr_header%FOUND check
2343 CLOSE c_mr_header;
2344
2345 Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_NO_MR_ID');
2346 Fnd_Message.Set_Token('TASK_NUMBER', p_visit_task_number);
2347 Fnd_Msg_Pub.ADD;
2348
2349 END IF; -- End of c_mr_header%FOUND check
2350 END IF; -- End of p_mr_route_id IS NOT NULL check
2351
2352 ---------------------------End of API Body---------------------------------------
2353 IF (l_log_procedure >= l_log_current_level) THEN
2354 fnd_log.string(l_log_procedure,
2355 L_DEBUG_KEY ||'.end',
2356 'At the end of PL SQL procedure.');
2357 END IF;
2358
2359 END Validate_MR_Route_Date;
2360
2361 --------------------------------------------------------------------
2362 -- PROCEDURE
2363 -- Validate_Before_Production
2364 --
2365 -- PURPOSE
2366 -- To validate Visit and all its Tasks before the push to production
2367 --------------------------------------------------------------------
2368 PROCEDURE Validate_Before_Production
2369 (
2370 p_api_version IN NUMBER,
2371 p_init_msg_list IN VARCHAR2 := Fnd_Api.g_false,
2372 p_commit IN VARCHAR2 := Fnd_Api.g_false,
2373 p_validation_level IN NUMBER := Fnd_Api.g_valid_level_full,
2374 p_module_type IN VARCHAR2 := 'JSP',
2375 p_visit_id IN NUMBER,
2376
2377 x_error_tbl OUT NOCOPY Error_Tbl_Type,
2378 x_return_status OUT NOCOPY VARCHAR2,
2379 x_msg_count OUT NOCOPY NUMBER,
2380 x_msg_data OUT NOCOPY VARCHAR2
2381 )
2382 IS
2383 L_API_VERSION CONSTANT NUMBER := 1.0;
2384 L_API_NAME CONSTANT VARCHAR2(30) := 'Validate_Before_Production';
2385 --part-chgER - sowsubra
2386 L_DEBUG_KEY CONSTANT VARCHAR2(90) := 'ahl.plsql.'||G_PKG_NAME||'.'||L_API_NAME;
2387 l_dept_Tbl Dept_Tbl_Type;
2388 l_error_tbl Error_Tbl_Type;
2389 l_visit_end_time DATE;
2390 -- l_flag VARCHAR2(1):= 'N';
2391 l_return_status VARCHAR2(1);
2392 l_chk_flag VARCHAR2(1);
2393 l_check_flag VARCHAR2(1);
2394 l_proj_task_flag VARCHAR2(1);
2395 -- Post 11.5.10
2396 -- RROY
2397 l_hierarchy_flag VARCHAR2(1);
2398 l_job_released_flag VARCHAR2(1);
2399 l_task_invalid_flag VARCHAR2(1);
2400 -- RROY
2401 l_default VARCHAR2(30);
2402 l_temp VARCHAR2(2000);
2403 l_msg_data VARCHAR2(2000);
2404 l_plan_end_hour NUMBER;
2405 -- Post 11.5.10
2406 -- RROY
2407 l_start_from_hour NUMBER;
2408 l_visit_task_id NUMBER;
2409 -- RROY
2410 l_end_hour NUMBER;
2411 l_visit_task_id NUMBER;
2412 l_count NUMBER;
2413 l_msg_count NUMBER :=0;
2414 l_data VARCHAR2(2000);
2415 l_count1 NUMBER;
2416 l_count2 NUMBER;
2417 i NUMBER:=0;
2418 j NUMBER:=0;
2419 x NUMBER:=0;
2420 l_dept_flag VARCHAR2(1):= 'N';
2421 l_dept NUMBER;
2422 l_dummy_i NUMBER;
2423
2424 -- To find visit related information
2425 -- Added where condition for checking DELETED status in 11.5.10
2426 CURSOR c_visit (x_id IN NUMBER) IS
2427 SELECT * FROM AHL_VISITS_VL
2428 WHERE VISIT_ID = x_id
2429 AND NVL(STATUS_CODE,'X') <> 'DELETED';
2430 c_visit_rec c_visit%ROWTYPE;
2431
2432 -- To find visit dept has any dept shifts
2433 CURSOR c_dept (x_id IN NUMBER) IS
2434 SELECT COUNT(*) FROM AHL_DEPARTMENT_SHIFTS
2435 WHERE DEPARTMENT_ID = x_id;
2436
2437 /* Begin Changes by Shkalyan */
2438 -- To find count for tasks for visit
2439 -- Added where condition for checking DELETED status in 11.5.10
2440 CURSOR c_task_count (x_id IN NUMBER) IS
2441 SELECT count(*) FROM AHL_VISIT_TASKS_VL
2442 WHERE VISIT_ID = x_id
2443 AND NVL(STATUS_CODE,'X') <> 'DELETED'
2444 AND (TASK_TYPE_CODE <> 'SUMMARY' OR
2445 (TASK_TYPE_CODE = 'SUMMARY' AND
2446 MR_ID IS NOT NULL));
2447 /* End Changes by Shkalyan */
2448
2449 /* Begin Changes by Shkalyan */
2450 -- To find task related information
2451 -- Added where condition for checking DELETED status in 11.5.10
2452 CURSOR c_task (x_visit_id IN NUMBER) IS
2453 SELECT * FROM AHL_VISIT_TASKS_VL
2454 WHERE VISIT_ID = x_visit_id
2455 AND NVL(STATUS_CODE,'X') not in ('DELETED','RELEASED')
2456 AND (TASK_TYPE_CODE <> 'SUMMARY' OR
2457 (TASK_TYPE_CODE = 'SUMMARY' AND
2458 MR_ID IS NOT NULL));
2459 /* End Changes by Shkalyan */
2460 c_task_rec c_task%ROWTYPE;
2461
2462 -- VWP11.5.10 Enhancements
2463 -- To find whether any visit which is in a primaryplan has any simulation plans
2464 CURSOR c_simulation (x_id IN NUMBER) IS
2465 SELECT COUNT(*) FROM AHL_SIMULATION_PLANS_VL
2466 WHERE SIMULATION_PLAN_ID = x_id
2467 AND PRIMARY_PLAN_FLAG = 'Y';
2468
2469 -- AnRaj: Following two cursors have been changed due to performnace issues
2470 -- Bug Number 4919291
2471 -- To find MR header related information
2472 /* CURSOR c_mr_header (x_id IN NUMBER) IS
2473 SELECT T1.* FROM AHL_MR_HEADERS_APP_V T1, AHL_MR_ROUTES_V T2
2474 WHERE T1.MR_HEADER_ID = T2.MR_HEADER_ID
2475 AND T2.MR_ROUTE_ID = x_id;
2476 */
2477
2478 -- yazhou 02-Jun-2006 starts
2479 -- bug fix#5209826
2480 /*
2481 CURSOR c_mr_header (x_id IN NUMBER) IS
2482 SELECT T1.EFFECTIVE_FROM,T1.EFFECTIVE_TO
2483 FROM AHL_MR_HEADERS_APP_V T1, AHL_MR_ROUTES_V T2
2484 WHERE T1.MR_HEADER_ID = T2.MR_HEADER_ID
2485 AND T2.MR_ROUTE_ID = x_id;
2486 */
2487 CURSOR c_mr_header (x_id IN NUMBER) IS
2488 SELECT T1.EFFECTIVE_FROM,T1.EFFECTIVE_TO
2489 FROM ahl_mr_headers_app_v T1, AHL_MR_ROUTES_V T2
2490 WHERE T1.mr_status_code = 'COMPLETE' AND
2491 trunc(T1.effective_from) <= trunc(sysdate) AND
2492 trunc(nvl(T1.effective_to,sysdate)) >= trunc(sysdate) AND
2493 T2.MR_ROUTE_ID = x_id AND
2494 T1.MR_HEADER_ID = T2.MR_HEADER_ID AND
2495 T1.version_number = (select max(version_number)
2496 from ahl_mr_headers_app_v mr1
2497 where mr1.title = T1.title
2498 and mr1.mr_status_code = 'COMPLETE'
2499 and trunc(effective_from) <= trunc(sysdate) AND
2500 trunc(nvl(effective_to,sysdate)) >= trunc(sysdate));
2501
2502 -- yazhou 02-Jun-2006 ends
2503
2504 c_mr_header_rec c_mr_header%ROWTYPE;
2505
2506 -- To find route related information
2507 /* CURSOR c_route (x_id IN NUMBER) IS
2508 SELECT T1.* FROM AHL_ROUTES_APP_V T1, AHL_MR_ROUTES_V T2
2509 WHERE T1.ROUTE_ID = T2.ROUTE_ID
2510 AND T2.MR_ROUTE_ID = x_id
2511 AND T1.REVISION_STATUS_CODE = 'COMPLETE';
2512 */
2513 CURSOR c_route (x_id IN NUMBER) IS
2514 SELECT T1.START_DATE_ACTIVE,T1.END_DATE_ACTIVE
2515 FROM AHL_ROUTES_APP_V T1, AHL_MR_ROUTES_V T2
2516 WHERE T1.ROUTE_ID = T2.ROUTE_ID
2517 AND T2.MR_ROUTE_ID = x_id
2518 AND T1.REVISION_STATUS_CODE = 'COMPLETE';
2519 c_route_rec c_route%ROWTYPE;
2520 -- End of Fix for 4919291
2521
2522 -- To find only those routes which are there in tasks table but not in route table for a visit
2523 -- Added where condition for checking DELETED status in 11.5.10
2524 CURSOR c_route_chk (x_id IN NUMBER) IS
2525 SELECT VT.MR_ROUTE_ID
2526 FROM AHL_VISIT_TASKS_B VT
2527 WHERE VT.VISIT_ID = x_id
2528 AND NVL(STATUS_CODE,'X') not in ('DELETED','RELEASED')
2529 AND VT.MR_Route_ID IS NOT NULL
2530 AND NOT EXISTS (
2531 SELECT 1
2532 FROM AHL_MR_ROUTES T1, AHL_ROUTES_APP_V T2, AHL_MR_HEADERS_APP_V B
2533 WHERE T1.MR_ROUTE_ID = VT.MR_ROUTE_ID
2534 AND T1.MR_HEADER_ID = B.MR_HEADER_ID
2535 AND T1.ROUTE_ID = T2.ROUTE_ID
2536 AND T2.REVISION_STATUS_CODE = 'COMPLETE');
2537 c_route_chk_rec c_route_chk%ROWTYPE;
2538
2539 -- To find visit task id for the non-summary tasks which have no MR Routes
2540 -- Added where condition for checking DELETED status in 11.5.10
2541 CURSOR c_route_tsk (x_id IN NUMBER) IS
2542 SELECT VISIT_TASK_ID, VISIT_TASK_NUMBER FROM AHL_VISIT_TASKS_B
2543 WHERE VISIT_ID = x_id
2544 AND NVL(STATUS_CODE,'X') not in ('DELETED','RELEASED')
2545 AND MR_Route_ID IS NULL
2546 AND TASK_TYPE_CODE <> 'SUMMARY';
2547
2548 /* commented out for bug fix 4081044
2549 yazhou 03-Jan-2005
2550 -- To find count for Item and MR Header ID
2551 CURSOR c_check (x_item_id IN NUMBER, x_mr_route_id IN NUMBER) IS
2552 SELECT count(*) FROM Ahl_MR_Items_V T1, AHL_MR_ROUTES_APP_V T2
2553 WHERE T1.Inventory_Item_ID = x_item_id
2554 AND T1.MR_HEADER_ID = T2.MR_HEADER_ID
2555 AND MR_ROUTE_ID = x_mr_route_id;
2556 */
2557
2558 -- To find all departments from a visit's tasks table
2559 -- Added where condition for checking DELETED status in 11.5.10
2560 CURSOR c_dept_task (x_id IN NUMBER) IS
2561 SELECT DEPARTMENT_ID FROM AHL_VISIT_TASKS_B
2562 WHERE VISIT_ID = x_id
2563 AND NVL(STATUS_CODE,'X') not in ('DELETED','RELEASED')
2564 AND DEPARTMENT_ID IS NOT NULL;
2565 c_dept_task_rec c_dept_task%ROWTYPE;
2566
2567 -- To find all departments from a visit's tasks table
2568 -- Added where condition for checking DELETED status in 11.5.10
2569 CURSOR c_dept_tsk (x_id IN NUMBER) IS
2570 SELECT DEPARTMENT_ID, VISIT_TASK_NUMBER FROM AHL_VISIT_TASKS_B
2571 WHERE VISIT_ID = x_id
2572 AND NVL(STATUS_CODE,'X') not in ('DELETED','RELEASED')
2573 AND DEPARTMENT_ID IS NOT NULL;
2574 c_dept_tsk_rec c_dept_tsk%ROWTYPE;
2575
2576 /*sowsubra - part-chgER - 18 July, 2007 - start*/
2577 CURSOR c_get_inst_item (c_instance_id IN NUMBER) IS
2578 SELECT INVENTORY_ITEM_ID, INSTANCE_NUMBER FROM CSI_ITEM_INSTANCES
2579 WHERE instance_id = c_instance_id;
2580
2581 c_inst_item_rec c_get_inst_item%ROWTYPE;
2582 /*sowsubra - part-chgER - end*/
2583
2584 -- To find out if the item instances associated to a visit or task is still active
2585 -- CURSOR c_serial (p_serial_id IN NUMBER, p_item_id IN NUMBER, p_org_id IN NUMBER) IS
2586 -- part-chgER - changed the name of the cusror.
2587 CURSOR c_instance (c_instance_id IN NUMBER, c_item_id IN NUMBER, c_org_id IN NUMBER) IS
2588 SELECT count(*)FROM CSI_ITEM_INSTANCES
2589 WHERE Instance_Id = c_instance_id
2590 AND Inventory_Item_Id = c_item_id
2591 AND Inv_Master_Organization_Id = c_org_id
2592 AND ACTIVE_START_DATE <= sysdate
2593 AND (ACTIVE_END_DATE >= sysdate OR ACTIVE_END_DATE IS NULL);
2594
2595 -- RROY
2596
2597 -- bug fix 4077103 -yazhou
2598 -- To check the current status of the Unit
2599 CURSOR c_uc_status (p_instance_id IN NUMBER) IS
2600 SELECT name, AHL_UTIL_UC_PKG.GET_UC_STATUS_CODE(UNIT_CONFIG_HEADER_ID) uc_status
2601 FROM ahl_unit_config_headers uc,
2602 csi_item_instances csis
2603 WHERE uc.csi_item_instance_id=csis.instance_id
2604 AND (uc.active_end_date IS NULL OR uc.active_end_date > SYSDATE)
2605 AND csis.instance_id = p_instance_id;
2606
2607 c_uc_status_rec c_uc_status%ROWTYPE;
2608
2609 BEGIN
2610 --------------------- initialize -----------------------
2611 SAVEPOINT Validate_Before_Production;
2612
2613 IF (l_log_procedure >= l_log_current_level) THEN
2614 fnd_log.string(l_log_procedure,
2615 L_DEBUG_KEY ||'.begin',
2616 'At the start of PL SQL procedure. Visit Id = ' || p_visit_id);
2617 END IF;
2618
2619 -- Initialize message list if p_init_msg_list is set to TRUE.
2620 IF Fnd_Api.to_boolean(p_init_msg_list) THEN
2621 Fnd_Msg_Pub.initialize;
2622 END IF;
2623
2624 -- Initialize API return status to success
2625 x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
2626
2627 -- Standard call to check for call compatibility.
2628 IF NOT Fnd_Api.COMPATIBLE_API_CALL(l_api_version,
2629 p_api_version,
2630 l_api_name,G_PKG_NAME) THEN
2631 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2632 END IF;
2633
2634 OPEN c_visit (p_visit_id);
2635 FETCH c_visit INTO c_visit_rec;
2636 CLOSE c_visit;
2637
2638 -- To check if the unit is quarantined
2639 -- AnRaj added for R 12.0 ACL changes in VWP, Start
2640 check_unit_quarantined(p_visit_id,c_visit_rec.Item_Instance_Id);
2641 -- AnRaj added for R 12.0 ACL changes in VWP, End
2642 IF c_visit_rec.TEMPLATE_FLAG = 'N' THEN
2643 -- To check visit's start date is not null
2644 IF c_visit_rec.START_DATE_TIME IS NULL THEN
2645 IF (l_log_statement >= l_log_current_level) THEN
2646 fnd_log.string(l_log_statement,
2647 L_DEBUG_KEY,
2648 'Visit Start Date is null.');
2649 END IF;
2650 -- By shbhanda 05/21/04 for TC changes
2651 Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_NO_ST_DATE');
2652 Fnd_Message.Set_Token('VISIT_NUMBER', c_visit_rec.VISIT_NUMBER);
2653 Fnd_Msg_Pub.ADD;
2654 END IF;
2655
2656 -- To check visit's status is not null and it should be only planning or partially released
2657 IF c_visit_rec.STATUS_CODE IS NOT NULL THEN
2658 IF c_visit_rec.STATUS_CODE <> 'PLANNING' and c_visit_rec.STATUS_CODE <> 'PARTIALLY RELEASED' THEN
2659 IF (l_log_statement >= l_log_current_level) THEN
2660 fnd_log.string(l_log_statement,
2661 L_DEBUG_KEY,
2662 'Visit Status Code is not Planning/Partially Released.');
2663 END IF;
2664 Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_NOT_PLANNING'); -- **** IMPortant uPDATE FOR PARTIALLY RELEASED
2665 Fnd_Message.Set_Token('VISIT_NUMBER', c_visit_rec.VISIT_NUMBER);
2666 Fnd_Msg_Pub.ADD;
2667 /* l_temp := 'ERROR: Visit Number ' || c_visit_rec.VISIT_NUMBER || ' : Status Code is not Planning or Partially Released' ;
2668 l_error_tbl(j).Msg_Index := j;
2669 l_error_tbl(j).Msg_Data := l_temp;
2670 j := j + 1;*/
2671
2672 -- POst 11.5.10 Changes by Senthil.
2673 ELSIF TRUNC(c_visit_rec.start_date_time) < TRUNC(SYSDATE) AND c_visit_rec.STATUS_CODE <> 'PARTIALLY RELEASED'
2674 THEN
2675 IF (l_log_statement >= l_log_current_level) THEN
2676 fnd_log.string(l_log_statement,
2677 L_DEBUG_KEY,
2678 'Visit Status Code is Planning and Visit Start Date is less than sysdate. ');
2679 END IF;
2680 Fnd_Message.SET_NAME('AHL','AHL_VWP_START_DATE_LT_SYS');
2681 Fnd_Message.Set_Token('VISIT_NUMBER', c_visit_rec.VISIT_NUMBER);
2682 Fnd_Msg_Pub.ADD;
2683 /* l_error_tbl(j).Msg_Index := j;
2684 l_error_tbl(j).Msg_Data := REPLACE(FND_MESSAGE.GET_STRING(APPIN => 'AHL',
2685 NAMEIN => 'AHL_VWP_START_DATE_LT_SYS')
2686 ,'VISIT_NUMBER',c_visit_rec.VISIT_NUMBER);
2687 j := j + 1; */
2688 END IF;
2689 -- visit's status is null
2690 ELSE
2691 IF (l_log_statement >= l_log_current_level) THEN
2692 fnd_log.string(l_log_statement,
2693 L_DEBUG_KEY,
2694 'Visit Status Code is null.');
2695 END IF;
2696 Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_NO_STATUS');
2697 Fnd_Message.Set_Token('VISIT_NUMBER', c_visit_rec.VISIT_NUMBER);
2698 Fnd_Msg_Pub.ADD;
2699
2700 /*l_temp := 'ERROR: Visit Number ' || c_visit_rec.VISIT_NUMBER || ' : Status Code Missing' ;
2701 l_error_tbl(j).Msg_Index := j;
2702 l_error_tbl(j).Msg_Data := l_temp;
2703 j := j + 1; */
2704 END IF;
2705
2706 -- To check visit's organization is not null
2707 IF c_visit_rec.ORGANIZATION_ID IS NULL THEN
2708 IF (l_log_statement >= l_log_current_level) THEN
2709 fnd_log.string(l_log_statement,
2710 L_DEBUG_KEY,
2711 'Visit Organization is null.');
2712 END IF;
2713
2714 Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_NO_ORG');
2715 Fnd_Message.Set_Token('VISIT_NUMBER', c_visit_rec.VISIT_NUMBER);
2716 Fnd_Msg_Pub.ADD;
2717
2718 /* l_temp := 'ERROR: Visit Number ' || c_visit_rec.VISIT_NUMBER || ' : Organization Missing' ;
2719 l_error_tbl(j).Msg_Index := j;
2720 l_error_tbl(j).Msg_Data := l_temp;
2721 j := j + 1; */
2722 END IF;
2723
2724 -- To check visit's department is not null
2725 IF c_visit_rec.DEPARTMENT_ID IS NULL THEN
2726 IF (l_log_statement >= l_log_current_level) THEN
2727 fnd_log.string(l_log_statement,
2728 L_DEBUG_KEY,
2729 'Visit Department is null.');
2730 END IF;
2731
2732 Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_NO_DEPT');
2733 Fnd_Message.Set_Token('VISIT_NUMBER', c_visit_rec.VISIT_NUMBER);
2734 Fnd_Msg_Pub.ADD;
2735
2736 /* l_temp := 'ERROR: Visit Number ' || c_visit_rec.VISIT_NUMBER || ' : Department Missing';
2737 l_error_tbl(j).Msg_Index := j;
2738 l_error_tbl(j).Msg_Data := l_temp;
2739 j := j + 1; */
2740 END IF;
2741
2742 -- Start by shbhanda on 29-Jan-04
2743 -- To check visit's close date time i.e planned end date is not null
2744 IF c_visit_rec.CLOSE_DATE_TIME IS NULL THEN
2745 IF (l_log_statement >= l_log_current_level) THEN
2746 fnd_log.string(l_log_statement,
2747 L_DEBUG_KEY,
2748 'Visit Plan End Date is null.');
2749 END IF;
2750
2751 Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_NO_PLN_END_DT');
2752 Fnd_Message.Set_Token('VISIT_NUMBER', c_visit_rec.VISIT_NUMBER);
2753 Fnd_Msg_Pub.ADD;
2754
2755 /* l_temp := 'ERROR: Visit Number ' || c_visit_rec.VISIT_NUMBER || ' : Planned end date missing' ;
2756 l_error_tbl(j).Msg_Index := j;
2757 l_error_tbl(j).Msg_Data := l_temp;
2758 j := j + 1; */
2759 END IF;
2760 -- End by shbhanda on 29-Jan-04
2761
2762 -- To check visit's simulation plan lies in primary plan
2763 IF c_visit_rec.SIMULATION_PLAN_ID IS NOT NULL THEN
2764 OPEN c_simulation (c_visit_rec.SIMULATION_PLAN_ID);
2765 FETCH c_simulation INTO l_count;
2766 CLOSE c_simulation;
2767 IF l_count = 0 THEN
2768 IF (l_log_statement >= l_log_current_level) THEN
2769 fnd_log.string(l_log_statement,
2770 L_DEBUG_KEY,
2771 'Visit has 0 Simulations.');
2772 END IF;
2773
2774 Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_NO_PRIM_PLAN');
2775 Fnd_Message.Set_Token('VISIT_NUMBER', c_visit_rec.VISIT_NUMBER);
2776 Fnd_Msg_Pub.ADD;
2777 END IF;
2778 END IF;
2779
2780 --sowsubra FP:Bug#5758829
2781 /*When the visit type code is not null, then validate the type code to see if
2782 the visit type is enabled and not end-dated.*/
2783 IF c_visit_rec.visit_type_code IS NOT NULL THEN
2784 IF (l_log_statement >= l_log_current_level) THEN
2785 fnd_log.string(l_log_statement,
2786 L_DEBUG_KEY,
2787 'Before calling AHL_VWP_RULES_PVT.CHECK_LOOKUP_NAME_OR_ID.');
2788 END IF;
2789
2790 AHL_VWP_RULES_PVT.CHECK_LOOKUP_NAME_OR_ID (
2791 p_lookup_type => 'AHL_PLANNING_VISIT_TYPE',
2792 p_lookup_code => trim(c_visit_rec.visit_type_code),
2793 p_meaning => NULL,
2794 p_check_id_flag => 'Y',
2795 x_lookup_code => c_visit_rec.visit_type_code,
2796 x_return_status => l_return_status);
2797
2798 IF (l_log_statement >= l_log_current_level) THEN
2799 fnd_log.string(l_log_statement,
2800 L_DEBUG_KEY,
2801 'After calling AHL_VWP_RULES_PVT.CHECK_LOOKUP_NAME_OR_ID.');
2802 END IF;
2803
2804 IF NVL(l_return_status, 'X') <> 'S' THEN
2805 Fnd_Message.SET_NAME('AHL','AHL_VWP_TYPE_CODE_NOT_EXISTS');
2806 Fnd_Msg_Pub.ADD;
2807 RAISE Fnd_Api.G_EXC_ERROR;
2808 END IF;
2809 END IF;
2810
2811 /*sowsubra - part-chgER - 18 July, 2007- start*/
2812 -- only when unit is associated with the visit then check if the item-instance
2813 IF (c_visit_rec.item_instance_id IS NOT NULL) THEN
2814 OPEN c_get_inst_item(c_visit_rec.item_instance_id);
2815 FETCH c_get_inst_item INTO c_inst_item_rec;
2816 CLOSE c_get_inst_item;
2817
2818 IF (l_log_statement >= l_log_current_level) THEN
2819 fnd_log.string(l_log_statement,
2820 L_DEBUG_KEY,
2821 'Item Id from csi instances = ' || c_inst_item_rec.inventory_item_id);
2822 fnd_log.string(l_log_statement,
2823 L_DEBUG_KEY,
2824 'Instance number from csi instances = ' || c_inst_item_rec.instance_number);
2825 fnd_log.string(l_log_statement,
2826 L_DEBUG_KEY,
2827 'Visit Item Id = ' || c_visit_rec.Inventory_Item_Id);
2828 END IF;
2829
2830 IF c_inst_item_rec.inventory_item_id = c_visit_rec.Inventory_Item_Id THEN
2831 /*sowsubra - part-chgER - end*/
2832 -- To check visit must be associated to an Active Item Instance.
2833 -- To find out if the item instances associated to the visit is still active
2834 IF c_visit_rec.Item_Instance_Id IS NOT NULL THEN
2835 OPEN c_instance (c_visit_rec.Item_Instance_Id, c_visit_rec.Inventory_Item_Id, c_visit_rec.Item_Organization_Id);
2836 FETCH c_instance INTO l_count;
2837 CLOSE c_instance;
2838 IF l_count = 0 THEN
2839
2840 Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_INST_NO_ACTIVE');
2841 Fnd_Message.Set_Token('VISIT_NUMBER', c_visit_rec.VISIT_NUMBER);
2842 Fnd_Msg_Pub.ADD;
2843 END IF;
2844 END IF;
2845 /*sowsubra - part-chgER - 18 July, 2007 - start*/
2846 ELSE
2847 IF (l_log_statement >= l_log_current_level) THEN
2848 fnd_log.string(l_log_statement,
2849 L_DEBUG_KEY,
2850 'Instance is no longer associated with this item, please check..');
2851 END IF;
2852 FND_MESSAGE.Set_Name('AHL','AHL_VWP_VST_INST_ITM_CHNGD');
2853 Fnd_Message.Set_Token('INST_NUM', c_inst_item_rec.instance_number);
2854 Fnd_Msg_Pub.ADD;
2855 END IF;
2856 /*sowsubra - part-chgER - end*/
2857 END IF; --c_visit_rec.item_instance_id IS NOT NULL
2858
2859 -- bug fix 4077103 -yazhou
2860 -- To check visit must be associated to an Active Unit.
2861 -- Also the unit must be in Complete or Incomplete status
2862 IF c_visit_rec.Item_Instance_Id IS NOT NULL THEN
2863 OPEN c_uc_status (c_visit_rec.Item_Instance_Id);
2864 FETCH c_uc_status INTO c_uc_status_rec;
2865 CLOSE c_uc_status;
2866
2867 IF c_uc_status_rec.uc_status not in ('COMPLETE','INCOMPLETE') THEN
2868
2869 IF (l_log_statement >= l_log_current_level) THEN
2870 fnd_log.string(l_log_statement,
2871 L_DEBUG_KEY,
2872 c_uc_status_rec.name || ' UC status is invalid: '|| c_uc_status_rec.uc_status);
2873 END IF;
2874
2875 Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_INVALID_UC');
2876 Fnd_Message.Set_Token('VISIT_NUMBER', c_visit_rec.VISIT_NUMBER);
2877 Fnd_Message.Set_Token('UNIT_NAME', c_uc_status_rec.name);
2878 Fnd_Msg_Pub.ADD;
2879 END IF;
2880 END IF;
2881
2882 -- To check tasks must be associated to Active Item Instances.
2883 -- To find out if the item instances associated to the tasks are still active
2884
2885 OPEN c_task (p_visit_id);
2886 LOOP
2887 FETCH c_task INTO c_task_rec;
2888 EXIT WHEN c_task%NOTFOUND;
2889
2890 /*commented out by sowsubra as a visit can be created without a unit, then the tasks
2891 present in the visit should be still validated.*/
2892 --IF c_visit_rec.Item_Instance_Id IS NOT NULL THEN
2893
2894 /*sowsubra - part-chgER - 18 July, 2007 - start*/
2895 IF (c_task_rec.instance_id IS NOT NULL) THEN
2896 OPEN c_get_inst_item(c_task_rec.instance_id);
2897 FETCH c_get_inst_item INTO c_inst_item_rec;
2898 CLOSE c_get_inst_item;
2899
2900 IF (l_log_statement >= l_log_current_level) THEN
2901 fnd_log.string(l_log_statement,
2902 L_DEBUG_KEY,
2903 'Item Id from csi instances - ' || c_inst_item_rec.inventory_item_id);
2904 fnd_log.string(l_log_statement,
2905 L_DEBUG_KEY,
2906 'Visit Item Id - ' || c_task_rec.Inventory_Item_Id);
2907 END IF;
2908
2909 IF c_inst_item_rec.inventory_item_id = c_task_rec.Inventory_Item_Id THEN
2910 IF c_task_rec.INSTANCE_ID IS NOT NULL THEN
2911 OPEN c_instance (c_task_rec.INSTANCE_ID, c_task_rec.Inventory_Item_Id, c_task_rec.Item_Organization_Id);
2912 FETCH c_instance INTO l_count;
2913 CLOSE c_instance;
2914
2915 IF l_count = 0 THEN
2916 Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_TSK_INST_NO_ACTIVE');
2917 Fnd_Message.Set_Token('TASK_NUMBER', c_task_rec.VISIT_TASK_NUMBER);
2918 Fnd_Msg_Pub.ADD;
2919 END IF;
2920 END IF;
2921 ELSE
2922 IF (l_log_statement >= l_log_current_level) THEN
2923 fnd_log.string(l_log_statement,
2924 L_DEBUG_KEY,
2925 'Instance is no longer associated with this item, please check..');
2926 END IF;
2927 FND_MESSAGE.Set_Name('AHL','AHL_VWP_TSK_INST_ITM_CHNGD');
2928 Fnd_Message.Set_Token('INST_NUM', c_inst_item_rec.instance_number);
2929 Fnd_Message.Set_Token('TASK_NUMBER', c_task_rec.VISIT_TASK_NUMBER);
2930 FND_MSG_PUB.ADD;
2931 END IF;
2932 END IF; -- c_task_rec.instance_id is not null
2933 /*sowsubra - part-chgER - end*/
2934 END LOOP;
2935 CLOSE c_task;
2936 --END IF; -- End for Check Instance Id presence
2937
2938 -- NR-MR Changes - sowsubra - Begin comment
2939 /* The check for instance_in_config_tree for the visit instance is redundant since
2940 in instance_in_config_tree, the visit instance is compared against itself.*/
2941 /***
2942
2943 -- To check visit must be associated to an Item Instance.
2944 -- To check all task's serial number are still active
2945 IF c_visit_rec.Item_Instance_Id IS NOT NULL THEN
2946
2947 --BEGIN: jeli added for bug 3777720
2948 IF (AHL_VWP_RULES_PVT.instance_in_config_tree(p_visit_id, c_visit_rec.item_instance_id)= FND_API.G_RET_STS_ERROR) THEN
2949 --END: jeli added for bug 3777720
2950 Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_INST_NO_FOUND');
2951 Fnd_Message.Set_Token('VISIT_NUMBER',c_visit_rec.VISIT_NUMBER);
2952 Fnd_Msg_Pub.ADD;
2953 END IF;
2954 END IF;
2955
2956 IF c_visit_rec.Item_Instance_Id IS NOT NULL THEN
2957
2958 OPEN c_task (p_visit_id);
2959 LOOP
2960 FETCH c_task INTO c_task_rec;
2961 EXIT WHEN c_task%NOTFOUND;
2962 IF c_task_rec.INSTANCE_ID IS NOT NULL THEN
2963 -- IF l_check_flag = 'N' THEN
2964 --BEGIN: jeli added for bug 3777720
2965 IF (AHL_VWP_RULES_PVT.instance_in_config_tree(p_visit_id, c_task_rec.instance_id) = FND_API.G_RET_STS_ERROR) THEN
2966 --END: jeli added for bug 3777720
2967 Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_INST_NO_FOUND');
2968 Fnd_Message.Set_Token('VISIT_NUMBER', c_visit_rec.VISIT_NUMBER);
2969 Fnd_Msg_Pub.ADD;
2970 END IF;
2971 END IF;
2972 END LOOP;
2973 CLOSE c_task;
2974
2975 -- Removed for POst 11.5.10 Changes by Senthil.
2976 -- ELSE
2977 -- IF (l_log_statement >= l_log_current_level) THEN
2978 -- fnd_log.string(l_log_statement,
2979 -- L_DEBUG_KEY,
2980 -- 'Check Visit Serial Number');
2981 -- END IF;
2982 -- l_temp := 'ERROR: Visit Number ' || c_visit_rec.VISIT_NUMBER || ' : Serial Number Missing' ;
2983 -- l_error_tbl(j).Msg_Index := j;
2984 -- l_error_tbl(j).Msg_Data := l_temp;
2985 -- j := j + 1;
2986
2987 END IF; -- End for Check Instance Id presence
2988 ***/
2989 -- NR-MR Changes - sowsubra - end comment
2990
2991 -- To check visit must be associated to a Project ID
2992 -- Check for the proejct id presence in PJM_PROJECT_PARAMETER table
2993 -- Post 11.5.10
2994 -- RROY
2995 /*
2996 IF c_visit_rec.Project_Id IS NOT NULL THEN
2997 OPEN c_Project(c_visit_rec.Project_Id);
2998 FETCH c_Project INTO l_count;
2999 CLOSE c_Project;
3000 IF l_count = 0 THEN
3001 l_temp := 'ERROR: Visit Number ' || c_visit_rec.VISIT_NUMBER || ' : This project should be included in PJM_PROJECT_PARAMETERS from PA' ;
3002 l_error_tbl(j).Msg_Index := j;
3003 l_error_tbl(j).Msg_Data := l_temp;
3004 j := j + 1;
3005 END IF;
3006 ELSE
3007 l_temp := 'ERROR: Visit Number ' || c_visit_rec.VISIT_NUMBER || ' : No Project is associated to this Visit' ;
3008 l_error_tbl(j).Msg_Index := j;
3009 l_error_tbl(j).Msg_Data := l_temp;
3010 j := j + 1;
3011 END IF;
3012 */
3013 -- Post 11.5.10
3014 -- RROY
3015
3016 -- To check all routes for visit's tasks must exists
3017 IF (l_log_statement >= l_log_current_level) THEN
3018 fnd_log.string(l_log_statement,
3019 L_DEBUG_KEY,
3020 'Initially, FLAG = ' || l_chk_flag);
3021 END IF;
3022
3023 OPEN c_route_chk (p_visit_id);
3024 l_chk_flag := 'N';
3025 LOOP
3026 FETCH c_route_chk INTO c_route_chk_rec;
3027 EXIT WHEN c_route_chk%NOTFOUND;
3028 IF c_route_chk%FOUND THEN
3029 l_chk_flag := 'Y';
3030 END IF;
3031 END LOOP;
3032 CLOSE c_route_chk;
3033
3034 IF (l_log_statement >= l_log_current_level) THEN
3035 fnd_log.string(l_log_statement,
3036 L_DEBUG_KEY,
3037 'After Route Check, FLAG = ' || l_chk_flag);
3038 END IF;
3039
3040 -- To check visit's department should have dept shifts defined
3041 OPEN c_dept (c_visit_rec.department_id);
3042 FETCH c_dept INTO l_count;
3043 CLOSE c_dept;
3044
3045 -- To find if the all visit tasks dept has department shifts defined
3046 OPEN c_dept_task (p_visit_id);
3047 i:=0;
3048 LOOP
3049 FETCH c_dept_task INTO c_dept_task_rec;
3050 EXIT WHEN c_dept_task%NOTFOUND;
3051 IF c_dept_task%FOUND THEN
3052 IF (l_log_statement >= l_log_current_level) THEN
3053 fnd_log.string(l_log_statement,
3054 L_DEBUG_KEY,
3055 'task dept' || c_dept_task_rec.department_id);
3056 END IF;
3057 OPEN c_dept (c_dept_task_rec.department_id);
3058 FETCH c_dept INTO l_dept;
3059 l_dept_Tbl(i) := l_dept;
3060 IF (l_log_statement >= l_log_current_level) THEN
3061 fnd_log.string(l_log_statement,
3062 L_DEBUG_KEY,
3063 'task dept count ' || l_dept);
3064 END IF;
3065 i := i + 1;
3066 CLOSE c_dept;
3067 END IF;
3068 END LOOP;
3069 CLOSE c_dept_task;
3070
3071 IF (l_log_statement >= l_log_current_level) THEN
3072 fnd_log.string(l_log_statement,
3073 L_DEBUG_KEY,
3074 'task dept table count ' || l_dept_Tbl.COUNT);
3075 END IF;
3076
3077 IF l_dept_Tbl.COUNT > 0 THEN
3078 l_dept_flag := 'N';
3079 x := l_dept_Tbl.FIRST;
3080 LOOP
3081 IF (l_log_statement >= l_log_current_level) THEN
3082 fnd_log.string(l_log_statement,
3083 L_DEBUG_KEY,
3084 'task dept table values ' || l_dept_Tbl(x));
3085 END IF;
3086 IF l_dept_Tbl(x) = 0 THEN
3087 l_dept_flag := 'Y';
3088 EXIT WHEN l_dept_flag = 'Y';
3089 END IF;
3090 EXIT WHEN x = l_dept_Tbl.LAST ;
3091 x := l_dept_Tbl.NEXT(x);
3092 END LOOP;
3093 END IF;
3094
3095 IF (c_visit_rec.START_DATE_TIME IS NOT NULL
3096 AND c_visit_rec.START_DATE_TIME <> Fnd_Api.g_miss_date)
3097 AND (c_visit_rec.DEPARTMENT_ID IS NOT NULL
3098 AND c_visit_rec.DEPARTMENT_ID <> Fnd_Api.g_miss_num)
3099 AND l_count > 0 AND l_chk_flag = 'N' AND l_dept_flag = 'N' THEN
3100
3101 --The visit end date
3102 l_visit_end_time := AHL_VWP_TIMES_PVT.get_visit_end_time(p_visit_id);
3103
3104 -- Start by shbhanda on Feb03,2004 for 11.5.10 release--
3105 -- If visit actual end date exceeds planned end date,
3106 -- then an error message will be displayed and the visit cannot be released.
3107
3108 IF c_visit_rec.close_date_time IS NOT NULL THEN
3109
3110 IF TRUNC(l_visit_end_time) > TRUNC(c_visit_rec.close_date_time) THEN
3111 IF (l_log_statement >= l_log_current_level) THEN
3112 fnd_log.string(l_log_statement,
3113 L_DEBUG_KEY,
3114 'Check visit end time and plan end time');
3115 END IF;
3116 Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_ACTDT_GT_PLNDT');
3117 Fnd_Message.Set_Token('VISIT_NUMBER', c_visit_rec.VISIT_NUMBER);
3118 Fnd_Msg_Pub.ADD;
3119 /* l_temp := 'ERROR: Visit Number ' || c_visit_rec.VISIT_NUMBER || ' : Actual end date exceeds planned end date.' ;
3120 l_error_tbl(j).Msg_Index := j;
3121 l_error_tbl(j).Msg_Data := l_temp;
3122 j := j + 1; */
3123
3124 ELSIF TRUNC(l_visit_end_time) = TRUNC(c_visit_rec.close_date_time) THEN
3125
3126 l_plan_end_hour := TO_NUMBER(TO_CHAR(c_visit_rec.CLOSE_DATE_TIME , 'HH24'));
3127 l_end_hour := TO_NUMBER(TO_CHAR(l_visit_end_time , 'HH24'));
3128
3129 IF l_end_hour > l_plan_end_hour THEN
3130 IF (l_log_statement >= l_log_current_level) THEN
3131 fnd_log.string(l_log_statement,
3132 L_DEBUG_KEY,
3133 'Check visit end hour and plan end hour');
3134 END IF;
3135 -- By shbhanda 08/04/04 for TC changes
3136 Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_ACTHR_GT_PLNHR');
3137 Fnd_Message.Set_Token('VISIT_NUMBER', c_visit_rec.VISIT_NUMBER);
3138 Fnd_Msg_Pub.ADD;
3139 /* l_temp := 'ERROR: Visit Number ' || c_visit_rec.VISIT_NUMBER || ' : Actual end date hour exceeds planned end date hour.' ;
3140 l_error_tbl(j).Msg_Index := j;
3141 l_error_tbl(j).Msg_Data := l_temp;
3142 j := j + 1; */
3143 END IF;
3144 END IF;
3145 -- Post 11.5.10 Changes by Senthil.
3146 ELSE
3147 Fnd_Message.SET_NAME('AHL','AHL_VWP_PLN_END_DATE_NULL');
3148 Fnd_Message.Set_Token('VISIT_NUMBER',
3149 c_visit_rec.VISIT_NUMBER);
3150 Fnd_Msg_Pub.ADD;
3151
3152 END IF;
3153 -- End by shbhanda on Feb03,2004 for 11.5.10 release--
3154
3155 -- To find any visit task if Tasks associated to a route/MR, must be associated to the item as set up in FMP
3156 OPEN c_task(p_visit_id);
3157 LOOP
3158 FETCH c_task INTO c_task_rec;
3159 EXIT WHEN c_task%NOTFOUND;
3160
3161 IF c_task_rec.task_type_code IS NOT NULL THEN
3162 IF UPPER(c_task_rec.task_type_code) = 'PLANNED' THEN
3163 --- Changes made by VSUNDARA for Production - SR Integration
3164 IF c_task_rec.mr_route_id is null THEN
3165
3166 /* commented out for bug fix 4081044
3167 yazhou 03-Jan-2005
3168 OPEN c_check (c_task_rec.inventory_item_id, c_task_rec.mr_route_id);
3169 FETCH c_check INTO l_count;
3170 CLOSE c_check;
3171 IF l_count = 0 THEN
3172 Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_NO_ITEM_MR_RT'); --***** change this
3173 Fnd_Message.Set_Token('VISIT_NUMBER', c_visit_rec.VISIT_NUMBER);
3174 Fnd_Msg_Pub.ADD;
3175 END IF;
3176 ELSE */
3177 IF c_task_rec.SERVICE_REQUEST_ID is null OR c_task_rec.UNIT_EFFECTIVITY_ID is null THEN
3178 Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_NO_SR_UE'); --***** change this
3179 Fnd_Message.Set_Token('VISIT_NUMBER', c_visit_rec.VISIT_NUMBER);
3180 Fnd_Msg_Pub.ADD;
3181 END IF; --Added by jeli on 07/26/04 when merging code otherwise it couldn't pass compilation
3182 END IF; --- End Changes made by VSUNDARA for Production - SR Integration
3183 END IF;
3184 END IF;
3185
3186 IF UPPER(c_task_rec.task_type_code) = 'UNASSOCIATED' AND c_task_rec.DURATION IS NULL THEN
3187
3188 IF (l_log_statement >= l_log_current_level) THEN
3189 fnd_log.string(l_log_statement,
3190 L_DEBUG_KEY,
3191 'Unassociated Task. Task Duration is null');
3192 END IF;
3193 Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_TSK_NO_DURATION');
3194 Fnd_Message.Set_Token('TASK_NUMBER', c_task_rec.VISIT_TASK_NUMBER);
3195 Fnd_Msg_Pub.ADD;
3196 END IF; -- End for c_task_rec.task_type_code check
3197
3198 -- To find all visit tasks must be associated to an item and item instance.
3199 IF c_task_rec.instance_id IS NULL THEN
3200 IF (l_log_statement >= l_log_current_level) THEN
3201 fnd_log.string(l_log_statement,
3202 L_DEBUG_KEY,
3203 'Check Task Serial');
3204 END IF;
3205 Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_TSK_NO_SERIAL');
3206 Fnd_Message.Set_Token('TASK_NUMBER', c_task_rec.VISIT_TASK_NUMBER);
3207 Fnd_Msg_Pub.ADD;
3208 END IF;
3209
3210 IF c_task_rec.inventory_item_id IS NULL THEN
3211 IF (l_log_statement >= l_log_current_level) THEN
3212 fnd_log.string(l_log_statement,
3213 L_DEBUG_KEY,
3214 'Task Inventory Item is null.');
3215 END IF;
3216 Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_TSK_NO_ITEM');
3217 Fnd_Message.Set_Token('TASK_NUMBER', c_task_rec.VISIT_TASK_NUMBER);
3218 Fnd_Msg_Pub.ADD;
3219 END IF;
3220
3221 -- Begin changes by rnahata for Bug 6448678
3222 IF (l_log_statement >= l_log_current_level) THEN
3223 fnd_log.string(l_log_statement,
3224 L_DEBUG_KEY,
3225 'Before calling Validate_MR_Route_Date. l_msg_count = ' || l_msg_count);
3226 END IF;
3227
3228 Validate_MR_Route_Date(
3229 p_mr_route_id => c_task_rec.mr_route_id,
3230 p_visit_task_number => c_task_rec.visit_task_number,
3231 p_start_date_time => sysdate,
3232 p_end_date_time => sysdate);
3233
3234 IF (l_log_statement >= l_log_current_level) THEN
3235 fnd_log.string(l_log_statement,
3236 L_DEBUG_KEY,
3237 'After calling Validate_MR_Route_Date for Task Id: ' ||
3238 c_task_rec.visit_task_id || ' and l_msg_count = ' || l_msg_count);
3239 END IF;
3240 -- End changes by rnahata for Bug 6448678
3241
3242 END LOOP; -- End of loop to check c_task cursor
3243 CLOSE c_task;
3244
3245 ELSE
3246
3247 IF l_count = 0 THEN
3248 Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_NO_DEPT_SHIFT');
3249 Fnd_Message.Set_Token('VISIT_NUMBER', c_visit_rec.VISIT_NUMBER);
3250 Fnd_Msg_Pub.ADD;
3251 END IF;
3252
3253 IF l_chk_flag = 'Y' THEN
3254 Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_RT_EXISTS');
3255 Fnd_Message.Set_Token('VISIT_NUMBER', c_visit_rec.VISIT_NUMBER);
3256 Fnd_Msg_Pub.ADD;
3257 END IF;
3258
3259 IF l_dept_flag = 'Y' THEN
3260 OPEN c_dept_tsk (p_visit_id);
3261 LOOP
3262 FETCH c_dept_tsk INTO c_dept_tsk_rec;
3263 EXIT WHEN c_dept_tsk%NOTFOUND;
3264 IF c_dept_tsk%FOUND THEN
3265 IF (l_log_statement >= l_log_current_level) THEN
3266 fnd_log.string(l_log_statement,
3267 L_DEBUG_KEY,
3268 'Task Dept' || c_dept_tsk_rec.department_id);
3269 END IF;
3270 OPEN c_dept (c_dept_tsk_rec.department_id);
3271 FETCH c_dept INTO l_dept;
3272 IF l_dept = 0 THEN
3273 IF (l_log_statement >= l_log_current_level) THEN
3274 fnd_log.string(l_log_statement,
3275 L_DEBUG_KEY,
3276 'Task Dept Count ' || l_dept);
3277 END IF;
3278 Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_NO_DEPT_SHIFT');
3279 Fnd_Message.Set_Token('TASK_NUMBER', c_dept_tsk_rec.VISIT_TASK_NUMBER);
3280 Fnd_Msg_Pub.ADD;
3281 END IF;
3282 CLOSE c_dept;
3283 END IF;
3284 END LOOP;
3285 CLOSE c_dept_tsk;
3286 END IF;
3287 END IF;
3288
3289 IF c_task_rec.visit_task_id IS NULL AND c_visit_rec.STATUS_CODE = 'PLANNING' THEN
3290
3291 IF (l_log_statement >= l_log_current_level) THEN
3292 fnd_log.string(l_log_statement,
3293 L_DEBUG_KEY,
3294 'No Task Found for the Visit');
3295 END IF;
3296
3297 Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_TASK_NULL');
3298 Fnd_Message.Set_Token('VISIT_NUMBER', c_visit_rec.VISIT_NUMBER);
3299 Fnd_Msg_Pub.ADD;
3300
3301 END IF;
3302 END IF;
3303
3304 l_msg_count := Fnd_Msg_Pub.count_msg;
3305
3306 IF (l_log_statement >= l_log_current_level) THEN
3307 fnd_log.string(l_log_statement,
3308 L_DEBUG_KEY,
3309 'After calling *count_msg* l_count = ' || l_msg_count);
3310 fnd_log.string(l_log_statement,
3311 L_DEBUG_KEY,
3312 'Start calling Fnd_Msg_Pub.GET');
3313 END IF;
3314
3315 j := 1;
3316
3317 FOR i IN 1..l_msg_count LOOP
3318
3319 IF (l_log_statement >= l_log_current_level) THEN
3320 fnd_log.string(l_log_statement,
3321 L_DEBUG_KEY,
3322 '------------------------------------------------');
3323 END IF;
3324
3325 FND_MSG_PUB.get (
3326 p_encoded => FND_API.G_FALSE,
3327 p_data => l_data,
3328 p_msg_index_out => l_msg_count);
3329 IF (l_log_statement >= l_log_current_level) THEN
3330 fnd_log.string(l_log_statement,
3331 L_DEBUG_KEY,
3332 'Error Message : '||l_data);
3333 END IF;
3334 l_error_tbl(j).Msg_Index := j;
3335 l_error_tbl(j).Msg_Data := l_data;
3336 j := j + 1;
3337
3338 END LOOP;
3339 IF (l_log_statement >= l_log_current_level) THEN
3340 fnd_log.string(l_log_statement,
3341 L_DEBUG_KEY,
3342 'End calling Fnd_Msg_Pub.GET');
3343 END IF;
3344
3345 x_error_tbl := l_error_tbl;
3346
3347 -------------------- finish --------------------------
3348 -- END of API body.
3349 -- Standard check of p_commit.
3350
3351 IF Fnd_Api.To_Boolean (p_commit) THEN
3352 COMMIT WORK;
3353 END IF;
3354
3355 Fnd_Msg_Pub.count_and_get(
3356 p_encoded => Fnd_Api.g_false,
3357 p_count => x_msg_count,
3358 p_data => x_msg_data
3359 );
3360
3361 IF (l_log_procedure >= l_log_current_level) THEN
3362 fnd_log.string(l_log_procedure,
3363 L_DEBUG_KEY ||'.end',
3364 'At the end of PL SQL procedure. Return Status = ' || x_return_status);
3365 END IF;
3366
3367 EXCEPTION
3368 WHEN Fnd_Api.g_exc_error THEN
3369 ROLLBACK TO Validate_Before_Production;
3370 x_return_status := Fnd_Api.g_ret_sts_error;
3371 Fnd_Msg_Pub.count_and_get (
3372 p_encoded => Fnd_Api.g_false,
3373 p_count => x_msg_count,
3374 p_data => x_msg_data
3375 );
3376 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
3377 ROLLBACK TO Validate_Before_Production;
3378 x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
3379 Fnd_Msg_Pub.count_and_get (
3380 p_encoded => Fnd_Api.g_false,
3381 p_count => x_msg_count,
3382 p_data => x_msg_data
3383 );
3384 WHEN OTHERS THEN
3385 ROLLBACK TO Validate_Before_Production;
3386 x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
3387 IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_unexp_error)
3388 THEN
3389 Fnd_Msg_Pub.add_exc_msg (G_PKG_NAME, l_api_name);
3390 END IF;
3391 Fnd_Msg_Pub.count_and_get (
3392 p_encoded => Fnd_Api.g_false,
3393 p_count => x_msg_count,
3394 p_data => x_msg_data
3395 );
3396 END Validate_Before_Production;
3397
3398 --------------------------------------------------------------------
3399 -- PROCEDURE
3400 -- Get_Task_Relationships
3401 --
3402 -- PURPOSE
3403 -- To get all the Relationships for the Visit Task.
3404 --------------------------------------------------------------------
3405
3406 PROCEDURE Get_Task_Relationships
3407 ( p_visit_id IN NUMBER,
3408 p_visit_number IN NUMBER,
3409 p_visit_task_id IN NUMBER,
3410 p_x_relationship_tbl IN OUT NOCOPY AHL_PRD_WORKORDER_PVT.prd_workorder_rel_tbl
3411 ) IS
3412
3413 CURSOR get_mwo_wip_entity_id(x_visit_id IN NUMBER) IS
3414 SELECT wip_entity_id
3415 FROM AHL_WORKORDERS
3416 WHERE visit_id = x_visit_id
3417 AND VISIT_TASK_ID IS NULL
3418 AND MASTER_WORKORDER_FLAG = 'Y';
3419
3420 CURSOR get_task_dtls(c_visit_task_id IN NUMBER) IS
3421 SELECT visit_task_number, task_type_code, SERVICE_REQUEST_ID, MR_ID, originating_task_id
3422 FROM AHL_VISIT_TASKS_B
3423 WHERE visit_task_id = c_visit_task_id;
3424
3425 -- Get all the Parent Task Records For the Visit Task
3426 CURSOR get_parent_task_dtls(c_visit_task_id NUMBER) IS
3427 SELECT PARENT.visit_task_number, PARENT.visit_task_id
3428 FROM AHL_VISIT_TASKS_B PARENT, AHL_VISIT_TASKS_B CHILD
3429 WHERE PARENT.visit_task_id = CHILD.originating_task_id
3430 AND CHILD.visit_task_id = c_visit_task_id;
3431
3432 CURSOR does_wo_exist_csr(c_visit_task_id NUMBER) IS
3433 SELECT 1 FROM AHL_WORKORDERS
3434 WHERE VISIT_TASK_ID = c_visit_task_id;
3435
3436 CURSOR get_wip_entity_id(c_visit_task_id NUMBER) IS
3437 SELECT wip_entity_id FROM AHL_WORKORDERS
3438 WHERE VISIT_TASK_ID = c_visit_task_id;
3439
3440 L_API_NAME CONSTANT VARCHAR2(30) := 'Get_Task_Relationships';
3441 L_DEBUG_KEY CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
3442 rel_count NUMBER;
3443 l_task_wip_id NUMBER := 0;
3444 l_visit_task_no NUMBER;
3445 l_visit_task_type VARCHAR2(30);
3446 l_orig_task_id NUMBER := 0;
3447 l_parent_task_number NUMBER;
3448 l_parent_visit_task_id NUMBER;
3449 l_mwo_wip_entity_id NUMBER;
3450 l_parent_task_wip_id NUMBER := 0;
3451 l_sr_id NUMBER := 0;
3452 l_mr_id NUMBER := 0;
3453
3454 BEGIN
3455
3456 IF (l_log_procedure >= l_log_current_level) THEN
3457 fnd_log.string(l_log_procedure,
3458 L_DEBUG_KEY ||'.begin',
3459 'At the start of PL SQL procedure.');
3460 fnd_log.string(l_log_procedure,
3461 L_DEBUG_KEY,
3462 'Visit Id = ' || p_visit_id ||
3463 ', Visit Number = ' || p_visit_number ||
3464 ', Visit Task Id = ' || p_visit_task_id);
3465 END IF;
3466
3467 rel_count := p_x_relationship_tbl.COUNT;
3468
3469 -- Create relationship only if WO doesn't exist for p_task_id
3470 OPEN does_wo_exist_csr(p_visit_task_id);
3471 FETCH does_wo_exist_csr INTO l_task_wip_id;
3472 IF does_wo_exist_csr%FOUND THEN
3473 CLOSE does_wo_exist_csr;
3474 RETURN;
3475 END IF;
3476 CLOSE does_wo_exist_csr;
3477
3478 OPEN get_task_dtls(p_visit_task_id);
3479 FETCH get_task_dtls into l_visit_task_no, l_visit_task_type, l_sr_id, l_mr_id, l_orig_task_id;
3480 CLOSE get_task_dtls;
3481
3482 OPEN get_parent_task_dtls(p_visit_task_id);
3483 FETCH get_parent_task_dtls INTO l_parent_task_number, l_parent_visit_task_id;
3484 CLOSE get_parent_task_dtls;
3485
3486 OPEN get_mwo_wip_entity_id(p_visit_id);
3487 FETCH get_mwo_wip_entity_id INTO l_mwo_wip_entity_id;
3488 CLOSE get_mwo_wip_entity_id;
3489
3490 OPEN get_wip_entity_id(l_parent_visit_task_id);
3491 FETCH get_wip_entity_id INTO l_parent_task_wip_id;
3492 CLOSE get_wip_entity_id;
3493
3494 IF (l_log_statement >= l_log_current_level) THEN
3495 fnd_log.string(l_log_statement,
3496 L_DEBUG_KEY,
3497 'Total Relationships : ' || rel_count);
3498 fnd_log.string(l_log_statement,
3499 L_DEBUG_KEY,
3500 'Getting Parent Tasks for task : ' || l_visit_task_no);
3501 END IF;
3502
3503 rel_count := rel_count + 1;
3504 p_x_relationship_tbl(rel_count).batch_id := p_visit_number;
3505 p_x_relationship_tbl(rel_count).dml_operation := 'C';
3506 p_x_relationship_tbl(rel_count).relationship_type := 1;
3507 p_x_relationship_tbl(rel_count).child_header_id := l_visit_task_no;
3508
3509 IF (l_orig_task_id IS NOT NULL) THEN
3510 p_x_relationship_tbl(rel_count).parent_wip_entity_id := l_parent_task_wip_id;
3511 p_x_relationship_tbl(rel_count).parent_header_id := l_parent_task_number;
3512 ELSE
3513 -- If the Originating Task is null, make the the Visit's MWO as the parent of this task's WO
3514 p_x_relationship_tbl(rel_count).parent_wip_entity_id := l_mwo_wip_entity_id;
3515 p_x_relationship_tbl(rel_count).parent_header_id := 0;
3516 END IF;
3517
3518 IF (l_log_statement >= l_log_current_level) THEN
3519 fnd_log.string(l_log_statement,
3520 L_DEBUG_KEY,
3521 'Total Relationships : ' || rel_count);
3522 fnd_log.string(l_log_statement,
3523 L_DEBUG_KEY,
3524 'All tasks obtained for task : ' || l_visit_task_no);
3525 END IF;
3526
3527 IF (l_log_procedure >= l_log_current_level) THEN
3528 fnd_log.string(l_log_procedure,
3529 L_DEBUG_KEY ||'.end',
3530 'At the end of PL SQL procedure. p_x_relationship_tbl.COUNT = ' ||
3531 p_x_relationship_tbl.COUNT);
3532 END IF;
3533
3534 END Get_Task_Relationships;
3535
3536 --------------------------------------------------------------------
3537 -- PROCEDURE
3538 -- Get_Visit_Relationships
3539 --
3540 -- PURPOSE
3541 -- To get all the Relationships for the Visit. These include :
3542 -- 1.A record for Each MR to MR / Visit Relationship.
3543 -- 2.A record for Each Visit Task to MR Relationship.
3544 -- 3.A record for Each Visit Task to Visit Relationship for Unassociated Tasks.
3545 --------------------------------------------------------------------
3546
3547 PROCEDURE Get_Visit_Relationships
3548 (
3549 p_visit_id IN NUMBER,
3550 p_visit_number IN NUMBER,
3551 p_x_relationship_tbl IN OUT NOCOPY AHL_PRD_WORKORDER_PVT.prd_workorder_rel_tbl
3552 )
3553 AS
3554 L_API_VERSION CONSTANT NUMBER := 1.0;
3555 L_API_NAME CONSTANT VARCHAR2(30) := 'Get_Visit_Relationships';
3556 L_DEBUG_KEY CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
3557 l_wip_entity_id NUMBER;
3558 l_parent_wip_entity_id NUMBER;
3559 rel_count NUMBER := 0;
3560 mr_count NUMBER := 0;
3561
3562 /*-- Get all the Task Records corresponding to a MR.
3563 CURSOR get_mrs_for_visit(c_visit_id NUMBER)
3564 IS
3565 SELECT visit_task_id,
3566 visit_task_number,
3567 NVL(originating_task_id, -1)
3568 FROM AHL_VISIT_TASKS_B
3569 WHERE visit_id = c_visit_id
3570 AND task_type_code='SUMMARY'
3571 AND mr_id IS NOT NULL
3572 ORDER BY 3;*/
3573
3574 /* Changes made by VSUNDARA for SR INTEGRATION*/
3575 -- Get all the Task Records corresponding to a MR.
3576 CURSOR get_mrs_for_visit(c_visit_id NUMBER)
3577 IS
3578 SELECT visit_task_id,
3579 visit_task_number,
3580 NVL(originating_task_id, -1)
3581 FROM AHL_VISIT_TASKS_B
3582 WHERE visit_id = c_visit_id
3583 AND task_type_code='SUMMARY'
3584 AND (mr_id IS NOT NULL OR unit_effectivity_id IS NOT NULL)
3585 AND NVL(STATUS_CODE, 'X') <> 'DELETED'
3586 AND NVL(STATUS_CODE, 'X') = 'PLANNING' --Srini Bug #4075702
3587 ORDER BY 3;
3588 /* End */
3589
3590 TYPE mr_task_rec_type IS RECORD
3591 (
3592 visit_task_id NUMBER,
3593 visit_task_number NUMBER,
3594 originating_task_id NUMBER
3595 );
3596
3597 TYPE mr_task_tbl_type IS TABLE OF mr_task_rec_type INDEX BY BINARY_INTEGER;
3598
3599 l_mrs_for_visit mr_task_tbl_type;
3600
3601 -- Get all the Tasks associated to a MR.
3602 CURSOR get_tasks_for_mr(c_visit_id NUMBER, c_mr_task_id NUMBER)
3603 IS
3604 SELECT visit_task_number, visit_task_id
3605 FROM AHL_VISIT_TASKS_B
3606 WHERE visit_id = c_visit_id
3607 AND originating_task_id = c_mr_task_id
3608 AND task_type_code <> 'SUMMARY'
3609 AND NVL(STATUS_CODE, 'X') = 'PLANNING' --Srini Bug #4075702
3610 AND NVL(STATUS_CODE, 'X') <> 'DELETED';
3611
3612 -- Get all the Unassociated Tasks.
3613 CURSOR get_un_associated_tasks(c_visit_id NUMBER)
3614 IS
3615 SELECT visit_task_number, visit_task_id
3616 FROM AHL_VISIT_TASKS_B
3617 WHERE visit_id = c_visit_id
3618 AND NVL(STATUS_CODE, 'X') = 'PLANNING' --Srini Bug #4075702
3619 AND task_type_code='UNASSOCIATED';
3620
3621 -- yazhou 27-Jun-2006 starts
3622 -- fix along with bug#5377347, should get the active job for the task only
3623
3624 CURSOR get_wo(c_visit_task_id NUMBER)
3625 IS
3626 SELECT wip_entity_id
3627 FROM AHL_WORKORDERS
3628 WHERE VISIT_TASK_ID = c_visit_task_id
3629 AND STATUS_CODE NOT IN ('22','7');
3630
3631 CURSOR get_parent_wo(c_visit_task_id NUMBER)
3632 IS
3633 SELECT wip_entity_id
3634 FROM AHL_WORKORDERS
3635 WHERE VISIT_TASK_ID = c_visit_task_id
3636 AND STATUS_CODE NOT IN ('22','7');
3637 -- yazhou 27-Jun-2006 ends
3638
3639 CURSOR get_mwo(c_visit_id NUMBER)
3640 IS
3641 SELECT wip_entity_id
3642 FROM AHL_WORKORDERS
3643 WHERE visit_id = c_visit_id
3644 AND VISIT_TASK_ID IS NULL
3645 AND MASTER_WORKORDER_FLAG = 'Y'
3646 AND STATUS_CODE NOT IN ('7', '22');
3647
3648 BEGIN
3649
3650 IF (l_log_procedure >= l_log_current_level) THEN
3651 fnd_log.string(l_log_procedure,L_DEBUG_KEY||'.begin','At the start of PLSQL procedure');
3652 END IF;
3653
3654 rel_count := p_x_relationship_tbl.COUNT;
3655 -- Get all the Task Records corresponding to a MR for the Visit.
3656 OPEN get_mrs_for_visit(p_visit_id);
3657 LOOP
3658 EXIT WHEN get_mrs_for_visit%NOTFOUND;
3659 mr_count := mr_count + 1;
3660 FETCH get_mrs_for_visit
3661 INTO l_mrs_for_visit(mr_count).visit_task_id,
3662 l_mrs_for_visit(mr_count).visit_task_number,
3663 l_mrs_for_visit(mr_count).originating_task_id;
3664 END LOOP;
3665 CLOSE get_mrs_for_visit;
3666
3667 IF (l_log_statement >= l_log_current_level) THEN
3668 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Total MRs for Visit : '||l_mrs_for_visit.COUNT);
3669 END IF;
3670
3671 IF (l_mrs_for_visit.COUNT > 0) THEN
3672 FOR i IN l_mrs_for_visit.FIRST..l_mrs_for_visit.LAST LOOP
3673 -- if the visit task already has a workorder then do not
3674 -- create a relationship for it
3675 OPEN get_wo(l_mrs_for_visit(i).visit_task_id);
3676 FETCH get_wo INTO l_wip_entity_id;
3677 IF get_wo%NOTFOUND THEN
3678 rel_count := rel_count + 1;
3679 p_x_relationship_tbl(rel_count).batch_id := p_visit_number;
3680 p_x_relationship_tbl(rel_count).child_header_id := l_mrs_for_visit(i).visit_task_number;
3681 p_x_relationship_tbl(rel_count).relationship_type := 1;
3682 p_x_relationship_tbl(rel_count).dml_operation := 'C';
3683 -- Loop to Find out Parent MRs
3684 IF (l_mrs_for_visit(i).originating_task_id <> -1) THEN
3685 FOR j IN l_mrs_for_visit.FIRST..l_mrs_for_visit.LAST LOOP
3686 IF (l_mrs_for_visit(i).originating_task_id = l_mrs_for_visit(j).visit_task_id) THEN
3687 p_x_relationship_tbl(rel_count).parent_header_id := l_mrs_for_visit(j).visit_task_number;
3688 OPEN get_parent_wo(l_mrs_for_visit(j).visit_task_id);
3689 FETCH get_parent_wo INTO l_parent_wip_entity_id;
3690 IF get_parent_wo%FOUND THEN
3691 p_x_relationship_tbl(rel_count).parent_wip_entity_id := l_parent_wip_entity_id;
3692 END IF;
3693 CLOSE get_parent_wo;
3694 EXIT;
3695 END IF;
3696 END LOOP;
3697 END IF;
3698 -- If no Parent MR is found set the parent as the Visit
3699 IF (p_x_relationship_tbl(rel_count).parent_header_id IS NULL) THEN
3700 p_x_relationship_tbl(rel_count).parent_header_id := 0;
3701 OPEN get_mwo(p_visit_id);
3702 FETCH get_mwo INTO l_parent_wip_entity_id;
3703 IF get_mwo%FOUND THEN
3704 p_x_relationship_tbl(rel_count).parent_wip_entity_id := l_parent_wip_entity_id;
3705 END IF;
3706 CLOSE get_mwo;
3707 END IF;
3708 END IF;
3709 CLOSE get_wo;
3710 END LOOP;
3711 END IF;
3712
3713 IF (l_log_statement >= l_log_current_level) THEN
3714 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Getting Tasks for MRs');
3715 END IF;
3716 -- Get all the Tasks for a MR.
3717 IF (l_mrs_for_visit.COUNT > 0) THEN
3718 FOR i IN l_mrs_for_visit.FIRST..l_mrs_for_visit.LAST LOOP
3719 FOR mr_tasks_cursor IN get_tasks_for_mr(p_visit_id, l_mrs_for_visit(i).visit_task_id) LOOP
3720 OPEN get_wo(mr_tasks_cursor.visit_task_id);
3721 FETCH get_wo INTO l_wip_entity_id;
3722 IF get_wo%NOTFOUND THEN
3723 rel_count := rel_count + 1;
3724 p_x_relationship_tbl(rel_count).batch_id := p_visit_number;
3725 p_x_relationship_tbl(rel_count).parent_header_id := l_mrs_for_visit(i).visit_task_number;
3726 p_x_relationship_tbl(rel_count).child_header_id := mr_tasks_cursor.visit_task_number;
3727 p_x_relationship_tbl(rel_count).relationship_type := 1;
3728 p_x_relationship_tbl(rel_count).dml_operation := 'C';
3729 -- if this visit task is already in shop floor then get the wip_entity_id
3730 OPEN get_parent_wo(l_mrs_for_visit(i).visit_task_id);
3731 FETCH get_parent_wo INTO l_parent_wip_entity_id;
3732 IF get_parent_wo%FOUND THEN
3733 p_x_relationship_tbl(rel_count).parent_wip_entity_id := l_parent_wip_entity_id;
3734 END IF;
3735 CLOSE get_parent_wo;
3736 END IF;
3737 CLOSE get_wo;
3738 END LOOP;
3739 END LOOP;
3740 END IF;
3741
3742 IF (l_log_statement >= l_log_current_level) THEN
3743 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Getting Unassociated Tasks for Visit');
3744 END IF;
3745
3746 -- Get all Un-associated Tasks for a Visit.
3747 OPEN get_mwo(p_visit_id);
3748 FETCH get_mwo INTO l_parent_wip_entity_id;
3749 IF get_mwo%NOTFOUND THEN
3750 l_parent_wip_entity_id := 0;
3751 END IF;
3752 CLOSE get_mwo;
3753
3754 FOR tsk_cursor IN get_un_associated_tasks(p_visit_id) LOOP
3755 OPEN get_wo(tsk_cursor.visit_task_id);
3756 FETCH get_wo INTO l_wip_entity_id;
3757 IF get_wo%NOTFOUND THEN
3758 rel_count := rel_count + 1;
3759 p_x_relationship_tbl(rel_count).batch_id := p_visit_number;
3760 p_x_relationship_tbl(rel_count).parent_header_id := 0; -- Visit
3761 p_x_relationship_tbl(rel_count).child_header_id := tsk_cursor.visit_task_number;
3762 p_x_relationship_tbl(rel_count).relationship_type := 1;
3763 p_x_relationship_tbl(rel_count).dml_operation := 'C';
3764 p_x_relationship_tbl(rel_count).parent_wip_entity_id := l_parent_wip_entity_id;
3765 END IF;
3766 CLOSE get_wo;
3767 END LOOP;
3768
3769 IF (l_log_procedure >= l_log_current_level) THEN
3770 fnd_log.string(l_log_procedure,L_DEBUG_KEY,'Total Relationships : ' || p_x_relationship_tbl.COUNT );
3771 fnd_log.string(l_log_procedure,L_DEBUG_KEY||'.end','At the end of PLSQL procedure');
3772 END IF;
3773
3774 END Get_Visit_Relationships;
3775
3776 --------------------------------------------------------------------
3777 -- PROCEDURE
3778 -- Get_Task_Dependencies
3779 --
3780 -- PURPOSE
3781 -- To get all the Technical Dependencies for the Visit Task.
3782 --------------------------------------------------------------------
3783
3784 PROCEDURE Get_Task_Dependencies
3785 (
3786 p_visit_number IN NUMBER,
3787 p_visit_task_id IN NUMBER,
3788 p_visit_task_number IN NUMBER,
3789 p_x_relationship_tbl IN OUT NOCOPY AHL_PRD_WORKORDER_PVT.prd_workorder_rel_tbl
3790 )
3791 AS
3792 L_API_VERSION CONSTANT NUMBER := 1.0;
3793 L_API_NAME CONSTANT VARCHAR2(30) := 'Get_Task_Dependencies';
3794 L_DEBUG_KEY CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
3795
3796 -- Get all the Task Dependencies.
3797 CURSOR get_tech_dependencies(c_visit_task_id NUMBER)
3798 IS
3799 SELECT PARENT.visit_task_number parent_task_number,
3800 CHILD.visit_task_number child_task_number
3801 FROM AHL_VISIT_TASKS_B PARENT,
3802 AHL_VISIT_TASKS_B CHILD,
3803 AHL_TASK_LINKS LINK
3804 WHERE PARENT.visit_task_id = LINK.parent_task_id
3805 AND CHILD.visit_task_id = LINK.visit_task_id
3806 AND NVL(PARENT.STATUS_CODE,'X') = 'PLANNING'
3807 AND NVL(CHILD.STATUS_CODE,'X') = 'PLANNING'
3808 AND (PARENT.visit_task_id = c_visit_task_id
3809 OR CHILD.visit_task_id = c_visit_task_id);
3810
3811 l_visit_task_number NUMBER;
3812 rel_count NUMBER;
3813 dup_found BOOLEAN;
3814
3815 BEGIN
3816
3817 IF (l_log_procedure >= l_log_current_level) THEN
3818 fnd_log.string(l_log_procedure,
3819 L_DEBUG_KEY ||'.begin',
3820 'At the start of PL SQL procedure.');
3821 fnd_log.string(l_log_procedure,
3822 L_DEBUG_KEY,
3823 'Visit Number = ' || p_visit_number ||
3824 ', Visit Task Id = ' || p_visit_task_id ||
3825 ', Visit Task Number = ' || p_visit_task_number);
3826 END IF;
3827
3828 rel_count := p_x_relationship_tbl.COUNT;
3829
3830 IF (l_log_statement >= l_log_current_level) THEN
3831 fnd_log.string(l_log_statement,
3832 L_DEBUG_KEY,
3833 'Total dependencies = ' || rel_count);
3834 END IF;
3835
3836 -- Get the Technical Dependencies between Visit Tasks for a Visit.
3837 FOR tsk_cursor IN get_tech_dependencies(p_visit_task_id) LOOP
3838
3839 dup_found := FALSE;
3840 --Do not insert the row if it already exists in relationship table.
3841 FOR i IN p_x_relationship_tbl.FIRST..p_x_relationship_tbl.LAST LOOP
3842 IF (p_x_relationship_tbl(i).relationship_type = 2 AND
3843 p_x_relationship_tbl(i).parent_header_id = tsk_cursor.parent_task_number AND
3844 p_x_relationship_tbl(i).child_header_id = tsk_cursor.child_task_number) THEN
3845 dup_found := TRUE;
3846 EXIT;
3847 END IF;
3848 END LOOP;
3849
3850 IF (dup_found = FALSE) THEN
3851 rel_count := rel_count + 1;
3852 p_x_relationship_tbl(rel_count).batch_id := p_visit_number;
3853 p_x_relationship_tbl(rel_count).parent_header_id := tsk_cursor.parent_task_number;
3854 p_x_relationship_tbl(rel_count).child_header_id := tsk_cursor.child_task_number;
3855 p_x_relationship_tbl(rel_count).relationship_type := 2;
3856 p_x_relationship_tbl(rel_count).dml_operation := 'C';
3857 END IF;
3858
3859 END LOOP;
3860
3861 IF (l_log_procedure >= l_log_current_level ) THEN
3862 fnd_log.string(l_log_procedure,
3863 L_DEBUG_KEY,
3864 'Total dependencies for Visit Task ' || p_visit_task_number ||
3865 'is: '|| rel_count);
3866 fnd_log.string(l_log_procedure,
3867 L_DEBUG_KEY ||'.end',
3868 'At the end of PL SQL procedure.');
3869 END IF;
3870
3871 END Get_Task_Dependencies;
3872
3873 --------------------------------------------------------------------
3874 -- PROCEDURE
3875 -- Get_Visit_Dependencies
3876 --
3877 -- PURPOSE
3878 -- To get all the Technical Dependencies for the Visit.
3879 --------------------------------------------------------------------
3880
3881 PROCEDURE Get_Visit_Dependencies
3882 (
3883 p_visit_id IN NUMBER,
3884 p_visit_number IN NUMBER,
3885 p_x_relationship_tbl IN OUT NOCOPY AHL_PRD_WORKORDER_PVT.prd_workorder_rel_tbl
3886 )
3887 AS
3888 L_API_VERSION CONSTANT NUMBER := 1.0;
3889 L_API_NAME CONSTANT VARCHAR2(30) := 'Get_Visit_Dependencies';
3890 L_DEBUG_KEY CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
3891 rel_count NUMBER;
3892
3893 -- Get all the Task Dependencies.
3894 CURSOR get_tech_dependencies(c_visit_id NUMBER)
3895 IS
3896 SELECT PARENT.visit_task_number parent_task_number,
3897 CHILD.visit_task_number child_task_number
3898 FROM AHL_VISIT_TASKS_B PARENT,
3899 AHL_VISIT_TASKS_B CHILD,
3900 AHL_TASK_LINKS LINK
3901 WHERE PARENT.visit_task_id = LINK.parent_task_id
3902 AND CHILD.visit_task_id = LINK.visit_task_id
3903 AND NVL(PARENT.STATUS_CODE,'X') = 'PLANNING' --Srini Bug #4075702
3904 AND PARENT.visit_id = c_visit_id
3905 AND CHILD.visit_id = c_visit_id;
3906
3907 BEGIN
3908
3909 IF (l_log_procedure >= l_log_current_level) THEN
3910 fnd_log.string(l_log_procedure,
3911 L_DEBUG_KEY ||'.begin',
3912 'At the start of PL SQL procedure.');
3913 END IF;
3914
3915 rel_count := p_x_relationship_tbl.COUNT;
3916
3917 -- Get the Technical Dependencies between Visit Tasks for a Visit.
3918 FOR tsk_cursor IN get_tech_dependencies(p_visit_id) LOOP
3919 rel_count := rel_count + 1;
3920 p_x_relationship_tbl(rel_count).batch_id := p_visit_number;
3921 p_x_relationship_tbl(rel_count).parent_header_id := tsk_cursor.parent_task_number;
3922 p_x_relationship_tbl(rel_count).child_header_id := tsk_cursor.child_task_number;
3923 p_x_relationship_tbl(rel_count).relationship_type := 2;
3924 p_x_relationship_tbl(rel_count).dml_operation := 'C';
3925 END LOOP;
3926
3927 IF (l_log_procedure >= l_log_current_level ) THEN
3928 fnd_log.string(l_log_procedure,
3929 L_DEBUG_KEY,
3930 'Total Relationships : ' || p_x_relationship_tbl.COUNT);
3931 fnd_log.string(l_log_procedure,
3932 L_DEBUG_KEY ||'.end',
3933 'At the end of PL SQL procedure.');
3934 END IF;
3935
3936 END Get_Visit_Dependencies;
3937
3938 /* End Changes by Shkalyan */
3939
3940 --------------------------------------------------------------------
3941 -- PROCEDURE
3942 -- Push_to_Production
3943 --
3944 -- PURPOSE
3945 -- To push visit along with all its tasks to Production for create jobs
3946 --------------------------------------------------------------------
3947 PROCEDURE Push_to_Production
3948 ( p_api_version IN NUMBER,
3949 p_init_msg_list IN VARCHAR2 := Fnd_Api.g_false,
3950 p_commit IN VARCHAR2 := Fnd_Api.g_false,
3951 p_validation_level IN NUMBER := Fnd_Api.g_valid_level_full,
3952 p_module_type IN VARCHAR2 := Null,
3953 p_visit_id IN NUMBER,
3954 p_release_flag IN VARCHAR2 := 'N', -- By shbhanda 05/21/04 for TC changes
3955 p_orig_visit_id IN NUMBER := NULL, -- By yazhou 08/06/04 for TC changes
3956 x_return_status OUT NOCOPY VARCHAR2,
3957 x_msg_count OUT NOCOPY NUMBER,
3958 x_msg_data OUT NOCOPY VARCHAR2
3959 )
3960 IS
3961 L_API_VERSION CONSTANT NUMBER := 1.0;
3962 L_API_NAME CONSTANT VARCHAR2(30) := 'Push_to_Production';
3963 L_DEBUG_KEY CONSTANT VARCHAR2(100):= 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
3964 l_prd_workorder_tbl AHL_PRD_WORKORDER_PVT.PRD_WORKORDER_TBL;
3965 /* Begin Changes by Shkalyan */
3966 l_prd_workorder_rel_tbl AHL_PRD_WORKORDER_PVT.PRD_WORKORDER_REL_TBL;
3967 l_firm_planned_flag VARCHAR2(1) := FND_PROFILE.value('AHL_PRD_FIRM_PLANNED_FLAG');
3968 l_visit_wo_id NUMBER;
3969 l_visit_wo_ovn NUMBER;
3970 l_visit_wo_status VARCHAR2(30);
3971 l_visit_wo_start_time DATE;
3972 l_visit_wo_end_time DATE;
3973 l_orig_visit_status VARCHAR2(30);
3974 l_orig_task_status VARCHAR2(30);
3975 l_workorder_id NUMBER;
3976 l_workorder_ovn NUMBER;
3977 l_workorder_status VARCHAR2(30);
3978 /* End Changes by Shkalyan */
3979 l_return_status VARCHAR2(1);
3980 l_msg_count NUMBER;
3981 l_msg_data VARCHAR2(2000);
3982 idx NUMBER;
3983 l_count NUMBER;
3984 l_route_id NUMBER;
3985 l_commit VARCHAR2(1) := 'F';
3986 l_visit_end_time DATE;
3987 l_temp_msg_count NUMBER:=0; --rnahata
3988 l_init_msg_list VARCHAR2(1) := 'F';
3989
3990 -- To find visit related information
3991 CURSOR c_visit (x_id IN NUMBER) IS
3992 SELECT * FROM AHL_VISITS_VL
3993 WHERE VISIT_ID = x_id;
3994
3995 c_visit_rec c_visit%ROWTYPE;
3996 c_orig_visit_rec c_visit%ROWTYPE;
3997
3998 /* Begin Changes by VSUNDARA For SR Integration*/
3999 -- To find task related information
4000 CURSOR c_task (x_id IN NUMBER) IS
4001 SELECT * FROM AHL_VISIT_TASKS_VL
4002 WHERE VISIT_ID = x_id
4003 AND NVL(STATUS_CODE, 'X') = 'PLANNING'
4004 AND (TASK_TYPE_CODE <> 'SUMMARY' OR
4005 (TASK_TYPE_CODE = 'SUMMARY' AND
4006 (MR_ID IS NOT NULL OR UNIT_EFFECTIVITY_ID IS NOT NULL)));
4007 /* End */
4008
4009 c_task_rec c_task%ROWTYPE;
4010 c_orig_task_rec c_task%ROWTYPE;
4011
4012 /* Begin Changes by Shkalyan */
4013 -- To find count for tasks for visit
4014 CURSOR c_task_ct (x_id IN NUMBER) IS
4015 SELECT count(*) FROM AHL_VISIT_TASKS_VL
4016 WHERE VISIT_ID = x_id
4017 AND NVL(STATUS_CODE, 'X') = 'PLANNING'
4018 AND (TASK_TYPE_CODE <> 'SUMMARY' OR
4019 (TASK_TYPE_CODE = 'SUMMARY' AND
4020 MR_ID IS NOT NULL OR UNIT_EFFECTIVITY_ID IS NOT NULL));
4021 /* End Changes by Shkalyan */
4022
4023 -- To find Route Id from MR Routes view
4024 CURSOR c_route (x_id IN NUMBER) IS
4025 SELECT Route_Id FROM AHL_MR_ROUTES_V
4026 WHERE MR_ROUTE_ID = x_id;
4027
4028 /* Begin Changes by Shkalyan */
4029 -- To find job for task
4030 CURSOR c_job (x_id IN NUMBER) IS
4031 SELECT workorder_id, object_version_number, status_code
4032 FROM AHL_WORKORDERS
4033 WHERE VISIT_TASK_ID = x_id
4034 AND STATUS_CODE not in ('22','7'); --(22-Deleted, 7-Cancelled)
4035
4036 --transit check visit change
4037 --yazhou start
4038 -- To find master workorder for Visit
4039 CURSOR c_visit_job (x_visit_id IN NUMBER) IS
4040 SELECT wo.workorder_id, wo.object_version_number, wo.status_code,
4041 WIP.SCHEDULED_START_DATE,
4042 WIP.SCHEDULED_COMPLETION_DATE
4043 FROM AHL_WORKORDERS WO,
4044 WIP_DISCRETE_JOBS WIP
4045 WHERE wo.VISIT_ID = x_visit_id
4046 AND wo.VISIT_TASK_ID IS NULL
4047 AND wo.MASTER_WORKORDER_FLAG = 'Y'
4048 AND WIP.WIP_ENTITY_ID = WO.WIP_ENTITY_ID
4049 AND wo.STATUS_CODE not in ('22','7'); --(22-Deleted, 7-Cancelled)
4050
4051 CURSOR c_visit_wo_status (x_visit_id IN NUMBER) IS
4052 SELECT wo.status_code
4053 FROM AHL_WORKORDERS WO
4054 WHERE wo.VISIT_ID = x_visit_id
4055 AND wo.VISIT_TASK_ID IS NULL
4056 AND wo.MASTER_WORKORDER_FLAG = 'Y'
4057 AND wo.STATUS_CODE not in ('22','7'); --(22-Deleted, 7-Cancelled)
4058
4059 -- Get workorder status for the coresponding job in originating visit
4060 CURSOR c_wo_status (x_orig_visit_id IN NUMBER, x_visit_task_id IN NUMBER) IS
4061 SELECT wo.status_code
4062 FROM AHL_WORKORDERS WO,
4063 AHL_VISIT_TASKS_B t
4064 WHERE wo.VISIT_ID = x_orig_visit_id
4065 AND wo.visit_task_id = t.visit_task_id
4066 AND t.visit_task_number = (Select visit_task_number
4067 from ahl_visit_tasks_b
4068 where visit_task_id = x_visit_task_id)
4069 AND wo.STATUS_CODE not in ('22','7'); --(22-Deleted, 7-Cancelled)
4070 -- yazhou end
4071
4072 /* End Changes by Shkalyan */
4073
4074 --Post11510. Added to get summary task start, end time
4075 CURSOR get_summary_task_times_csr(x_task_id IN NUMBER)IS
4076 SELECT min(start_date_time), max(end_date_time)
4077 FROM ahl_visit_tasks_vl VST
4078 START WITH visit_task_id = x_task_id
4079 -- anraj changed coz the nvl on the RHS is not required
4080 -- AND NVL(VST.status_code, 'Y') <> NVL ('DELETED', 'X')
4081 AND NVL(VST.status_code, 'Y') <> 'DELETED'
4082 CONNECT BY originating_task_id = PRIOR visit_task_id;
4083
4084 -- Added by Jerry on 08/13/2004 per Yan and Alex's request
4085 -- Yan added the condition to filter out summary tasks on 08/31/2005
4086 CURSOR get_independent_tasks(c_visit_id IN NUMBER) IS
4087 select t.visit_task_id
4088 from ahl_visit_tasks_b t,
4089 ahl_visits_b v
4090 where v.visit_id = c_visit_id
4091 and v.visit_id = t.visit_id
4092 and v.status_code = 'PARTIALLY RELEASED'
4093 and t.start_date_time < SYSDATE
4094 and t.status_code ='PLANNING'
4095 and t.task_type_code <>'SUMMARY'
4096 and (not exists (select 1 from ahl_task_links l0
4097 where l0.parent_task_id = t.visit_task_id
4098 or l0.visit_task_id = t.visit_task_id)
4099 or t.visit_task_id in (select l1.parent_task_id from ahl_task_links l1
4100 where not exists (select l2.visit_task_id from ahl_task_links l2
4101 where l2.visit_task_id = l1.parent_task_id)));
4102 --Modified by Srini Nov08, 2004 to create master workorder not having an asset
4103
4104 -- anraj: Modified the cursor definition to exclude the tasks in status DELETED
4105 CURSOR get_task_inst_dtls(c_visit_id IN NUMBER)
4106 IS
4107 SELECT inventory_item_id,instance_id
4108 FROM ahl_visit_tasks_vl
4109 WHERE visit_id = c_visit_id
4110 AND NVL(status_code, 'Y') <> 'DELETED'
4111 AND ROWNUM = 1;
4112 get_task_inst_rec get_task_inst_dtls%ROWTYPE;
4113
4114 /* Added by rnahata for Bug 6447196 */
4115 CURSOR c_get_vst_status_and_date (c_visit_id IN NUMBER) IS
4116 SELECT status_code, close_date_time
4117 FROM ahl_visits_b
4118 WHERE visit_id = c_visit_id;
4119 get_vst_status_and_date_rec c_get_vst_status_and_date%ROWTYPE;
4120
4121 /* Added by rnahata for Bug 5758813
4122 Fetches the route information for updating workorder
4123 description for tasks created from Routes */
4124 CURSOR get_wo_dtls_for_mrtasks_cur (p_task_id IN NUMBER) IS
4125 SELECT ar.route_no||'.'||substr(ar.title,1,(240 - (length(ar.route_no) + 1))) workorder_description
4126 FROM ahl_routes_vl ar,ahl_visit_tasks_b avt, ahl_mr_routes mrr
4127 WHERE avt.visit_task_id = p_task_id
4128 AND nvl(avt.status_code,'Y') = 'PLANNING'
4129 AND avt.mr_route_id = mrr.mr_route_id
4130 AND mrr.route_id = ar.route_id;
4131 get_wo_dtls_for_mrtasks_rec get_wo_dtls_for_mrtasks_cur%ROWTYPE;
4132
4133 BEGIN
4134 --------------------- initialize -----------------------
4135
4136 SAVEPOINT Push_to_Production;
4137 IF (l_log_procedure >= l_log_current_level) THEN
4138 fnd_log.string(l_log_procedure,
4139 L_DEBUG_KEY ||'.begin',
4140 'At the start of PL SQL procedure. Visit Id = ' || p_visit_id);
4141 END IF;
4142
4143 -- Initialize message list if p_init_msg_list is set to TRUE.
4144 IF Fnd_Api.to_boolean(p_init_msg_list)
4145 THEN
4146 Fnd_Msg_Pub.initialize;
4147 END IF;
4148
4149 -- Initialize API return status to success
4150 x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
4151
4152 -- Standard call to check for call compatibility.
4153 IF NOT Fnd_Api.COMPATIBLE_API_CALL(l_api_version,
4154 p_api_version,
4155 l_api_name,G_PKG_NAME)
4156 THEN
4157 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4158 END IF;
4159
4160 IF (l_log_statement >= l_log_current_level) THEN
4161 fnd_log.string(l_log_statement,
4162 L_DEBUG_KEY,
4163 'Before calling AHL_VWP_TIMES_PVT.Calculate_Task_Times');
4164 END IF;
4165
4166 -- Calculate Task Start/End time
4167 AHL_VWP_TIMES_PVT.CALCULATE_TASK_TIMES(
4168 p_api_version => 1.0,
4169 p_init_msg_list => Fnd_Api.G_FALSE,
4170 p_commit => Fnd_Api.G_FALSE,
4171 p_validation_level => Fnd_Api.G_VALID_LEVEL_FULL,
4172 x_return_status => l_return_status,
4173 x_msg_count => l_msg_count,
4174 x_msg_data => l_msg_data,
4175 p_visit_id => p_visit_id);
4176
4177 IF (l_log_statement >= l_log_current_level) THEN
4178 fnd_log.string(l_log_statement,
4179 L_DEBUG_KEY,
4180 'After calling AHL_VWP_TIMES_PVT.Calculate_Task_Times. Return Status = ' || l_return_status);
4181 END IF;
4182
4183 IF (l_return_status <> Fnd_Api.G_RET_STS_SUCCESS) THEN
4184 IF (l_log_statement >= l_log_current_level) THEN
4185 fnd_log.string(l_log_statement,
4186 L_DEBUG_KEY,
4187 'Errors from AHL_VWP_TIMES_PVT.Calculate_Task_Times. Message count: ' ||
4188 l_msg_count || ', message data: ' || l_msg_data);
4189 END IF;
4190 END IF;
4191
4192 /*rnahata - B6447196 - start*/
4193 /*c_visit_rec fetch has been moved after the project details are updated for the visit. Hence
4194 moved the cursor after integrate_to_projects*/
4195 OPEN c_get_vst_status_and_date (p_visit_id);
4196 FETCH c_get_vst_status_and_date INTO get_vst_status_and_date_rec;
4197 CLOSE c_get_vst_status_and_date;
4198 /*rnahata - B6447196 - end*/
4199
4200 --Jerry updated on 08/13/2004 after discussion with Yan and Alex for adjusting task start date
4201 IF get_vst_status_and_date_rec.STATUS_CODE = 'PARTIALLY RELEASED' THEN
4202 IF (l_log_statement >= l_log_current_level) THEN
4203 fnd_log.string(l_log_statement,
4204 L_DEBUG_KEY,
4205 'Before calling AHL_VWP_TIMES_PVT.adjust_task_times');
4206 END IF;
4207 FOR l_get_independent_tasks IN get_independent_tasks(p_visit_id) LOOP
4208 AHL_VWP_TIMES_PVT.adjust_task_times(
4209 p_api_version => 1.0,
4210 p_init_msg_list => Fnd_Api.G_FALSE,
4211 p_commit => Fnd_Api.G_FALSE,
4212 p_validation_level => Fnd_Api.G_VALID_LEVEL_FULL,
4213 x_return_status => l_return_status,
4214 x_msg_count => l_msg_count,
4215 x_msg_data => l_msg_data,
4216 p_task_id => l_get_independent_tasks.visit_task_id,
4217 p_reset_sysdate_flag => FND_API.G_TRUE);
4218 END LOOP;
4219
4220 IF (l_log_statement >= l_log_current_level) THEN
4221 fnd_log.string(l_log_statement,
4222 L_DEBUG_KEY,
4223 'After calling AHL_VWP_TIMES_PVT.adjust_task_times. Return Status = ' || l_return_status);
4224 END IF;
4225
4226 IF (l_return_status <> Fnd_Api.G_RET_STS_SUCCESS) THEN
4227 IF (l_log_statement >= l_log_current_level) THEN
4228 fnd_log.string(l_log_statement,
4229 L_DEBUG_KEY,
4230 'Errors from AHL_VWP_TIMES_PVT.adjust_task_times. Message count: ' ||
4231 l_msg_count || ', message data: ' || l_msg_data);
4232 END IF;
4233 END IF;
4234
4235 l_visit_end_time := AHL_VWP_TIMES_PVT.get_visit_end_time(p_visit_id);
4236 IF l_visit_end_time > get_vst_status_and_date_rec.close_date_time THEN
4237 Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_TSK_STDT_ADJU');
4238 Fnd_Message.Set_Token('VISIT_END_DATE', l_visit_end_time);
4239 Fnd_Msg_Pub.ADD;
4240 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4241 END IF;
4242 END IF;
4243
4244 /*rnahata - B6447196 - start*/
4245 /*moved the call to integrate to projects after task times gets updated
4246 esp in case of visits that is partially implemented*/
4247 idx := idx + 1;
4248 --Call prrojects
4249 -- Post 11.5.10
4250 -- RROY
4251
4252 IF (l_log_statement >= l_log_current_level) THEN
4253 fnd_log.string(l_log_statement,
4254 L_DEBUG_KEY,
4255 'Before calling INTEGRATE_TO_PROJECTS');
4256 END IF;
4257
4258 AHL_VWP_PROJ_PROD_PVT.Integrate_to_Projects
4259 (p_api_version => l_api_version,
4260 p_init_msg_list => p_init_msg_list,
4261 p_commit => l_commit,
4262 p_validation_level => p_validation_level,
4263 p_module_type => p_module_type,
4264 p_visit_id => p_visit_id,
4265 x_return_status => l_return_status,
4266 x_msg_count => l_msg_count,
4267 x_msg_data => x_msg_data);
4268
4269 IF (l_log_statement >= l_log_current_level) THEN
4270 fnd_log.string(l_log_statement,
4271 L_DEBUG_KEY,
4272 'After calling INTEGRATE_TO_PROJECTS. l_return_status '||l_return_status);
4273 END IF;
4274
4275 IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
4276 -- Check Error Message stack.
4277 x_msg_count := FND_MSG_PUB.count_msg;
4278 RAISE FND_API.G_EXC_ERROR;
4279 END IF;
4280
4281 -- Post 11.5.10
4282 -- RROY
4283 OPEN c_visit (p_visit_id);
4284 FETCH c_visit INTO c_visit_rec;
4285 CLOSE c_visit;
4286 /*rnahata - B6447196 - end*/
4287
4288 -- Begin changes by rnahata for Bug 6448678
4289 l_temp_msg_count := Fnd_Msg_Pub.count_msg;
4290
4291 IF (l_log_statement >= l_log_current_level) THEN
4292 fnd_log.string(l_log_statement,
4293 L_DEBUG_KEY,
4294 'Before calling VALIDATE_MR_ROUTE_DATE. l_msg_count = ' || l_msg_count);
4295 END IF;
4296
4297 OPEN c_task (p_visit_id);
4298 LOOP
4299 FETCH c_task INTO c_task_rec;
4300 EXIT WHEN c_task%NOTFOUND;
4301 Validate_MR_Route_Date
4302 (
4303 p_mr_route_id => c_task_rec.mr_route_id,
4304 p_visit_task_number => c_task_rec.visit_task_number,
4305 p_start_date_time => c_task_rec.start_date_time,
4306 p_end_date_time => c_task_rec.end_date_time
4307 );
4308
4309 IF (l_log_statement >= l_log_current_level) THEN
4310 fnd_log.string(l_log_statement,
4311 L_DEBUG_KEY,
4312 'After calling VALIDATE_MR_ROUTE_DATE for task Id: ' ||
4313 c_task_rec.visit_task_id ||', l_msg_count = ' || l_msg_count);
4314 END IF;
4315
4316 END LOOP;
4317 CLOSE c_task;
4318
4319 l_msg_count := Fnd_Msg_Pub.count_msg;
4320 IF (l_msg_count <> l_temp_msg_count) THEN
4321 IF (l_log_statement >= l_log_current_level) THEN
4322 fnd_log.string(l_log_statement,
4323 L_DEBUG_KEY,
4324 'Errors from VALIDATE_MR_ROUTE_DATE. Message count: ' || l_msg_count);
4325 END IF;
4326 RAISE FND_API.G_EXC_ERROR;
4327 END IF;
4328 -- End changes by rnahata for Bug 6448678
4329
4330 -- transit check visit Change
4331 -- yazhou start
4332 IF p_orig_visit_id IS NOT NULL THEN
4333
4334 OPEN c_visit (p_orig_visit_id);
4335 FETCH c_visit INTO c_orig_visit_rec;
4336 CLOSE c_visit;
4337
4338 OPEN c_visit_wo_status (p_orig_visit_id);
4339 FETCH c_visit_wo_status INTO l_orig_visit_status;
4340 CLOSE c_visit_wo_status;
4341 END IF;
4342 -- yazhou end
4343
4344 -- Start for 11.5.10 release
4345 -- By shbhanda 05-Jun-03
4346 -- For creating/updating Master Workorder in production for the visit in VWP
4347
4348 /* Begin Changes by Shkalyan */
4349
4350 idx := 0;
4351
4352 OPEN c_visit_job (p_visit_id);
4353 FETCH c_visit_job INTO l_visit_wo_id, l_visit_wo_ovn, l_visit_wo_status, l_visit_wo_start_time,l_visit_wo_end_time;
4354 CLOSE c_visit_job;
4355 --
4356 OPEN get_task_inst_dtls(p_visit_id);
4357 FETCH get_task_inst_dtls INTO get_task_inst_rec;
4358 CLOSE get_task_inst_dtls;
4359 --
4360 -- master workorder for visit already exists
4361 IF l_visit_wo_id IS NOT NULL THEN
4362
4363 -- If visit dates changed then reschedule the jobs
4364 IF (l_visit_wo_start_time <> c_visit_rec.START_DATE_TIME
4365 OR l_visit_wo_end_time <> c_visit_rec.CLOSE_DATE_TIME) THEN
4366
4367 IF (l_log_statement >= l_log_current_level) THEN
4368 fnd_log.string(l_log_statement,
4369 L_DEBUG_KEY,
4370 'Before calling AHL_PRD_WORKORDER_PVT.reschedule_visit_jobs');
4371 END IF;
4372
4373 AHL_PRD_WORKORDER_PVT.reschedule_visit_jobs(
4374 P_API_VERSION => 1.0,
4375 x_return_status => l_return_status,
4376 x_msg_count => l_msg_count,
4377 x_msg_data => l_msg_data,
4378 P_VISIT_ID => p_visit_id,
4379 p_x_scheduled_start_date => c_visit_rec.START_DATE_TIME,
4380 p_x_scheduled_end_date => c_visit_rec.CLOSE_DATE_TIME);
4381
4382 IF (l_log_statement >= l_log_current_level) THEN
4383 fnd_log.string(l_log_statement,
4384 L_DEBUG_KEY,
4385 'After calling AHL_PRD_WORKORDER_PVT.reschedule_visit_jobs. Return Status = ' || l_return_status);
4386 END IF;
4387
4388 IF (l_return_status <> Fnd_Api.G_RET_STS_SUCCESS) THEN
4389 IF (l_log_statement >= l_log_current_level) THEN
4390 fnd_log.string(l_log_statement,
4391 L_DEBUG_KEY,
4392 'Errors from AHL_PRD_WORKORDER_PVT.reschedule_visit_jobs. Message count: ' ||
4393 l_msg_count || ', message data: ' || l_msg_data);
4394 END IF;
4395 IF l_return_status = FND_API.G_RET_STS_ERROR THEN
4396 RAISE FND_API.G_EXC_ERROR;
4397 ELSE
4398 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4399 END IF;
4400 END IF;
4401
4402 END IF; --reschedule visit jobs
4403
4404 -- If p_module_type is 'CST' then master workorder status should stay as DRAFT
4405 -- Update only workorder time
4406
4407 -- Re-Query the OVN for the workorder again since its been updated by
4408 -- AHL_PRD_WORKORDER_PVT.RESCHEDULE_VISIT_JOBS API.
4409 -- Balaji added this fix as a part of BAE OVN bug fix for workorders.
4410 OPEN c_visit_job (p_visit_id);
4411 FETCH c_visit_job INTO l_visit_wo_id, l_visit_wo_ovn, l_visit_wo_status, l_visit_wo_start_time,l_visit_wo_end_time;
4412 CLOSE c_visit_job;
4413
4414 IF p_module_type = 'CST' THEN
4415 idx := idx+1;
4416 l_prd_workorder_tbl(idx).DML_OPERATION := 'U';
4417 l_prd_workorder_tbl(idx).WORKORDER_ID := l_visit_wo_id;
4418 l_prd_workorder_tbl(idx).OBJECT_VERSION_NUMBER := l_visit_wo_ovn;
4419 l_prd_workorder_tbl(idx).SCHEDULED_START_DATE := c_visit_rec.start_date_time;
4420 l_prd_workorder_tbl(idx).SCHEDULED_END_DATE := c_visit_rec.close_date_time;
4421 END IF;
4422
4423 -- If visit master workorder status is already RELEASED, the no change should be made
4424
4425 IF p_module_type <> 'CST' AND l_visit_wo_status <> '3' THEN
4426
4427 IF p_release_flag = 'Y' THEN
4428 -- change status from UNRELEASED/DRAFT to RELEASED
4429 idx := idx+1;
4430 l_prd_workorder_tbl(idx).DML_OPERATION := 'U';
4431 l_prd_workorder_tbl(idx).WORKORDER_ID := l_visit_wo_id;
4432 l_prd_workorder_tbl(idx).OBJECT_VERSION_NUMBER := l_visit_wo_ovn;
4433 l_prd_workorder_tbl(idx).STATUS_CODE := '3'; -- Released
4434 l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG := 1; -- Firm
4435 -- l_prd_workorder_tbl(idx).VALIDATE_STRUCTURE := 'Y'; -- rroy - TC - validate entire structure
4436 l_prd_workorder_tbl(idx).SCHEDULED_START_DATE := c_visit_rec.start_date_time;
4437 l_prd_workorder_tbl(idx).SCHEDULED_END_DATE := c_visit_rec.close_date_time;
4438 ELSIF l_visit_wo_status = '17' THEN
4439 -- Master workorder was in Draft status
4440 -- Need to make it UNRELEASED now
4441 idx := idx+1;
4442 l_prd_workorder_tbl(idx).DML_OPERATION := 'U';
4443 l_prd_workorder_tbl(idx).WORKORDER_ID := l_visit_wo_id;
4444 l_prd_workorder_tbl(idx).OBJECT_VERSION_NUMBER := l_visit_wo_ovn;
4445 l_prd_workorder_tbl(idx).SCHEDULED_START_DATE := c_visit_rec.start_date_time;
4446 l_prd_workorder_tbl(idx).SCHEDULED_END_DATE := c_visit_rec.close_date_time;
4447 l_prd_workorder_tbl(idx).STATUS_CODE := '1'; -- Unreleased
4448 l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG := 1; -- Firm
4449 END IF;
4450 ELSIF p_module_type <> 'CST' THEN
4451 idx := idx+1;
4452 l_prd_workorder_tbl(idx).DML_OPERATION := 'U';
4453 l_prd_workorder_tbl(idx).WORKORDER_ID := l_visit_wo_id;
4454 l_prd_workorder_tbl(idx).OBJECT_VERSION_NUMBER := l_visit_wo_ovn;
4455 --l_prd_workorder_tbl(idx).STATUS_CODE := '3'; -- Released
4456 --l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG := 1; -- Firm
4457 --l_prd_workorder_tbl(idx).VALIDATE_STRUCTURE := 'Y'; -- rroy - TC - validate entire structure
4458 l_prd_workorder_tbl(idx).SCHEDULED_START_DATE := c_visit_rec.start_date_time;
4459 l_prd_workorder_tbl(idx).SCHEDULED_END_DATE := c_visit_rec.close_date_time;
4460 END IF;
4461 l_prd_workorder_tbl(idx).BATCH_ID := c_visit_rec.VISIT_NUMBER;
4462 l_prd_workorder_tbl(idx).HEADER_ID := 0; -- Visit
4463
4464 ELSE -- Visit Master Workorder doesn't exist
4465
4466 idx := idx+1;
4467
4468 l_prd_workorder_tbl(idx).DML_OPERATION := 'C';
4469
4470 IF (p_module_type = 'CST') THEN
4471 l_prd_workorder_tbl(idx).STATUS_CODE := '17'; -- draft
4472
4473 -- sracha 27Jul05. Create Draft WO as firm to avoid scheduling by EAM.
4474 --l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG := 2; -- Planned
4475 l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG := 1; -- Firm
4476
4477 ELSE
4478 IF p_orig_visit_id IS NOT NULL THEN
4479 -- Create master workorder in same status as that of the originating visit
4480 l_prd_workorder_tbl(idx).STATUS_CODE := l_orig_visit_status;
4481 ELSE
4482 IF p_release_flag = 'Y' THEN
4483 l_prd_workorder_tbl(idx).STATUS_CODE := '3'; -- Released
4484 ELSE
4485 l_prd_workorder_tbl(idx).STATUS_CODE := '1'; -- Unreleased
4486 END IF;
4487 END IF;
4488
4489 l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG := 1; -- Firm
4490
4491 END IF;
4492 -- Post 11.5.10 Changes by senthil
4493 l_prd_workorder_tbl(idx).SCHEDULED_START_DATE := c_visit_rec.start_date_time;
4494 -- Changed by Shbhanda on 30th Jan 04
4495 l_prd_workorder_tbl(idx).SCHEDULED_END_DATE := c_visit_rec.close_date_time;
4496
4497 l_prd_workorder_tbl(idx).MASTER_WORKORDER_FLAG := 'Y';
4498 l_prd_workorder_tbl(idx).BATCH_ID := c_visit_rec.VISIT_NUMBER;
4499 l_prd_workorder_tbl(idx).HEADER_ID := 0; -- Visit
4500 /* End Changes by Shkalyan */
4501 l_prd_workorder_tbl(idx).VISIT_ID := p_visit_id;
4502 l_prd_workorder_tbl(idx).ORGANIZATION_ID := c_visit_rec.organization_id;
4503 l_prd_workorder_tbl(idx).PROJECT_ID := c_visit_rec.project_id;
4504 l_prd_workorder_tbl(idx).DEPARTMENT_ID := c_visit_rec.department_id ;
4505 l_prd_workorder_tbl(idx).INVENTORY_ITEM_ID := NVL(c_visit_rec.inventory_item_id,get_task_inst_rec.inventory_item_id);
4506 l_prd_workorder_tbl(idx).ITEM_INSTANCE_ID := NVL(c_visit_rec.item_instance_id,get_task_inst_rec.instance_id);
4507 l_prd_workorder_tbl(idx).JOB_DESCRIPTION := c_visit_rec.visit_name ;
4508 END IF; --visit master workorder exist
4509
4510 -- Create Workorders for tasks that have no workorder in production
4511 -- Update workorder only if the previous status is DRAFT
4512
4513 OPEN c_task_ct(p_visit_id);
4514 FETCH c_task_ct INTO l_count;
4515 CLOSE c_task_ct;
4516
4517 IF (l_log_statement >= l_log_current_level) THEN
4518 fnd_log.string(l_log_statement,
4519 L_DEBUG_KEY,
4520 'Task Count' || l_count);
4521 END IF;
4522
4523 IF l_count > 0 THEN
4524 OPEN c_task(p_visit_id);
4525 FETCH c_task INTO c_task_rec;
4526 WHILE c_task%FOUND LOOP
4527
4528 /* Begin Changes by Shkalyan */
4529 IF p_orig_visit_id is not NULL THEN
4530 -- Check the workorder status for the coresponding task in originating visit
4531
4532 l_orig_task_status := null;
4533
4534 OPEN c_wo_status(p_orig_visit_id,c_task_rec.visit_task_id);
4535 FETCH c_wo_status INTO l_orig_task_status;
4536 CLOSE c_wo_status;
4537 END IF;
4538
4539 IF p_orig_visit_id is NULL OR l_orig_task_status is not null THEN
4540
4541 -- Merge process for 11.5.10 bug fix on CMRDV10P
4542 -- Fix for Bug 3549573
4543 l_workorder_id := NULL;
4544 l_workorder_ovn := NULL;
4545 l_workorder_status := NULL;
4546
4547 -- To get the Workorder for Visit Task
4548 OPEN c_job(c_task_rec.visit_task_id);
4549 FETCH c_job INTO l_workorder_id, l_workorder_ovn, l_workorder_status;
4550 CLOSE c_job;
4551
4552 -- if workorder exists for the task
4553 IF l_workorder_id IS NOT NULL THEN
4554 IF (l_log_statement >= l_log_current_level) THEN
4555 fnd_log.string(l_log_statement,
4556 L_DEBUG_KEY,
4557 'Workorder Id for Task = ' || l_workorder_id);
4558 END IF;
4559 -- If p_module_type is 'CST' then workorder status should stay as DRAFT
4560 -- Update only workorder time
4561
4562 IF p_module_type = 'CST' THEN
4563 idx := idx+1;
4564 l_prd_workorder_tbl(idx).DML_OPERATION := 'U';
4565 l_prd_workorder_tbl(idx).WORKORDER_ID := l_workorder_id;
4566 l_prd_workorder_tbl(idx).OBJECT_VERSION_NUMBER := l_workorder_ovn;
4567
4568 --POST11510 cxcheng. If summary task, use the min,max for sub tasks
4569 IF (c_task_rec.task_type_code = 'SUMMARY') THEN
4570 OPEN get_summary_task_times_csr(c_task_rec.visit_task_id);
4571 FETCH get_summary_task_times_csr INTO l_prd_workorder_tbl(idx).SCHEDULED_START_DATE,
4572 l_prd_workorder_tbl(idx).SCHEDULED_END_DATE;
4573 CLOSE get_summary_task_times_csr;
4574 ELSE
4575 l_prd_workorder_tbl(idx).SCHEDULED_START_DATE := c_task_rec.START_DATE_TIME;
4576 l_prd_workorder_tbl(idx).SCHEDULED_END_DATE := c_task_rec.END_DATE_TIME;
4577 END IF;
4578
4579 l_prd_workorder_tbl(idx).ITEM_INSTANCE_ID := c_task_rec.instance_id ; l_prd_workorder_tbl(idx).BATCH_ID := c_visit_rec.visit_number;
4580 l_prd_workorder_tbl(idx).HEADER_ID := c_task_rec.visit_task_number;
4581
4582 END IF;
4583 -- Only update task if previous status is DRAFT
4584 IF ( p_module_type <> 'CST' AND l_workorder_status = '17' ) THEN
4585 idx := idx+1;
4586 IF p_release_flag = 'Y' THEN
4587 l_prd_workorder_tbl(idx).STATUS_CODE := '3'; -- Released
4588 ELSE
4589 l_prd_workorder_tbl(idx).STATUS_CODE := '1'; -- Unreleased
4590 END IF;
4591 l_prd_workorder_tbl(idx).DML_OPERATION := 'U';
4592 l_prd_workorder_tbl(idx).WORKORDER_ID := l_workorder_id;
4593 l_prd_workorder_tbl(idx).OBJECT_VERSION_NUMBER := l_workorder_ovn;
4594 IF ( l_firm_planned_flag IS NOT NULL AND
4595 l_firm_planned_flag = '2' ) THEN
4596 l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG := 2; -- Planned
4597 ELSE
4598 l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG := 1; -- Firm
4599 END IF;
4600 --POST11510 cxcheng. If summary task, use the min,max for sub tasks
4601 IF (c_task_rec.task_type_code = 'SUMMARY') THEN
4602 OPEN get_summary_task_times_csr(c_task_rec.visit_task_id);
4603 FETCH get_summary_task_times_csr INTO l_prd_workorder_tbl(idx).SCHEDULED_START_DATE,
4604 l_prd_workorder_tbl(idx).SCHEDULED_END_DATE ;
4605 CLOSE get_summary_task_times_csr;
4606 ELSE
4607 l_prd_workorder_tbl(idx).SCHEDULED_START_DATE := c_task_rec.START_DATE_TIME;
4608 l_prd_workorder_tbl(idx).SCHEDULED_END_DATE := c_task_rec.END_DATE_TIME;
4609 END IF;
4610
4611 /* Begin changes by rnahata for Bug 5758813 - For summary tasks (both manual and MR summary tasks)
4612 and unassociated tasks the task name is passed as the workorder description.
4613 And for the Route tasks, the route number concatenated with the route title is
4614 passed as workorder description.*/
4615
4616 IF (c_task_rec.task_type_code IN ('SUMMARY','UNASSOCIATED')) THEN
4617 l_prd_workorder_tbl(idx).JOB_DESCRIPTION := c_task_rec.visit_task_name;
4618 ELSE
4619 OPEN get_wo_dtls_for_mrtasks_cur(c_task_rec.visit_task_id);
4620 FETCH get_wo_dtls_for_mrtasks_cur INTO get_wo_dtls_for_mrtasks_rec;
4621 CLOSE get_wo_dtls_for_mrtasks_cur;
4622 l_prd_workorder_tbl(idx).JOB_DESCRIPTION := get_wo_dtls_for_mrtasks_rec.workorder_description;
4623 END IF;
4624 l_prd_workorder_tbl(idx).ITEM_INSTANCE_ID := c_task_rec.instance_id ; l_prd_workorder_tbl(idx).BATCH_ID := c_visit_rec.visit_number;
4625 l_prd_workorder_tbl(idx).BATCH_ID := c_visit_rec.visit_number;
4626 l_prd_workorder_tbl(idx).HEADER_ID := c_task_rec.visit_task_number;
4627 END IF;
4628 /* End Changes by Shkalyan */
4629
4630 --l_prd_workorder_tbl(idx).VISIT_ID := p_visit_id;
4631 --l_prd_workorder_tbl(idx).ORGANIZATION_ID := c_visit_rec.organization_id;
4632 --l_prd_workorder_tbl(idx).PROJECT_ID := c_visit_rec.project_id;
4633 --l_prd_workorder_tbl(idx).INVENTORY_ITEM_ID := c_task_rec.inventory_item_id ;
4634 --l_prd_workorder_tbl(idx).ITEM_INSTANCE_ID := c_task_rec.instance_id ;
4635 --l_prd_workorder_tbl(idx).VISIT_TASK_ID := c_task_rec.visit_task_id ;
4636 --l_prd_workorder_tbl(idx).VISIT_TASK_NUMBER := c_task_rec.visit_task_number ;
4637 --l_prd_workorder_tbl(idx).PROJECT_TASK_ID := c_task_rec.project_task_id ;
4638 --l_prd_workorder_tbl(idx).JOB_DESCRIPTION := c_task_rec.visit_task_name ;
4639
4640 ELSE -- workorder doesn't exist
4641 idx := idx+1;
4642 l_prd_workorder_tbl(idx).DML_OPERATION := 'C';
4643 IF (p_module_type = 'CST') THEN
4644 l_prd_workorder_tbl(idx).STATUS_CODE := '17'; -- Draft
4645 -- sracha 27Jul05. Create Draft WO as firm to avoid scheduling by EAM.
4646 --l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG := 2; -- Planned
4647 l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG := 1; -- Firm
4648
4649 ELSE
4650 IF p_orig_visit_id IS NOT NULL THEN
4651 -- Create master workorder in same status as that of the originating visit
4652 l_prd_workorder_tbl(idx).STATUS_CODE := l_orig_task_status;
4653 ELSE
4654 IF p_release_flag = 'Y' THEN
4655 l_prd_workorder_tbl(idx).STATUS_CODE := '3'; -- Released
4656 ELSE
4657 l_prd_workorder_tbl(idx).STATUS_CODE := '1'; -- Unreleased
4658 END IF;
4659 END IF;
4660
4661 IF ( l_firm_planned_flag IS NOT NULL AND
4662 l_firm_planned_flag = '2' ) THEN
4663 l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG := 2; -- Planned
4664 ELSE
4665 l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG := 1; -- Firm
4666 END IF;
4667
4668 /*
4669 Get_Task_Dependencies
4670 (
4671 p_visit_number => c_visit_rec.visit_number,
4672 p_visit_task_id => c_task_rec.visit_task_id,
4673 p_visit_task_number => c_task_rec.visit_task_number,
4674 p_x_relationship_tbl => l_prd_workorder_rel_tbl
4675 );
4676 */
4677 END IF; -- 'CST'
4678 IF (c_task_rec.task_type_code = 'SUMMARY') THEN
4679 l_prd_workorder_tbl(idx).MASTER_WORKORDER_FLAG := 'Y';
4680 ELSE
4681 l_prd_workorder_tbl(idx).MASTER_WORKORDER_FLAG := 'N';
4682 END IF;
4683
4684 l_prd_workorder_tbl(idx).BATCH_ID := c_visit_rec.visit_number;
4685 l_prd_workorder_tbl(idx).HEADER_ID := c_task_rec.visit_task_number;
4686 /* End Changes by Shkalyan */
4687 l_prd_workorder_tbl(idx).VISIT_ID := p_visit_id;
4688 l_prd_workorder_tbl(idx).ORGANIZATION_ID := c_visit_rec.organization_id;
4689 l_prd_workorder_tbl(idx).PROJECT_ID := c_visit_rec.project_id;
4690 l_prd_workorder_tbl(idx).INVENTORY_ITEM_ID := c_task_rec.inventory_item_id ;
4691 l_prd_workorder_tbl(idx).ITEM_INSTANCE_ID := c_task_rec.instance_id ;
4692 l_prd_workorder_tbl(idx).VISIT_TASK_ID := c_task_rec.visit_task_id ;
4693 l_prd_workorder_tbl(idx).VISIT_TASK_NUMBER := c_task_rec.visit_task_number ;
4694 l_prd_workorder_tbl(idx).PROJECT_TASK_ID := c_task_rec.project_task_id ;
4695
4696 /*B5758813 - rnahata - For summary tasks (both manual and MR summary tasks)
4697 and unassociated tasks the task name is passed as the workorder description.
4698 And for the MR tasks, the route number concatenated with the route title is
4699 passed as workorder description.*/
4700 IF (c_task_rec.task_type_code IN ('SUMMARY','UNASSOCIATED')) THEN
4701 l_prd_workorder_tbl(idx).JOB_DESCRIPTION := c_task_rec.visit_task_name;
4702 ELSE
4703 OPEN get_wo_dtls_for_mrtasks_cur(c_task_rec.visit_task_id);
4704 FETCH get_wo_dtls_for_mrtasks_cur INTO get_wo_dtls_for_mrtasks_rec;
4705 CLOSE get_wo_dtls_for_mrtasks_cur;
4706 l_prd_workorder_tbl(idx).JOB_DESCRIPTION := get_wo_dtls_for_mrtasks_rec.workorder_description;
4707 END IF;
4708
4709 IF c_task_rec.mr_route_id IS NOT NULL AND c_task_rec.mr_route_id <> FND_API.g_miss_num THEN
4710 OPEN c_route (c_task_rec.mr_route_id);
4711 FETCH c_route INTO l_route_id;
4712 CLOSE c_route;
4713 l_prd_workorder_tbl(idx).ROUTE_ID := l_route_id ;
4714 ELSE
4715 l_prd_workorder_tbl(idx).ROUTE_ID := Null;
4716 END IF;
4717
4718 IF c_task_rec.department_id IS NOT NULL
4719 AND c_task_rec.department_id <> FND_API.g_miss_num THEN
4720 l_prd_workorder_tbl(idx).DEPARTMENT_ID := c_task_rec.department_id ;
4721 ELSE
4722 l_prd_workorder_tbl(idx).DEPARTMENT_ID := c_visit_rec.department_id ;
4723 END IF;
4724
4725 --POST11510 cxcheng. If summary task, use the min,max for sub tasks
4726 IF (c_task_rec.task_type_code = 'SUMMARY') THEN
4727 OPEN get_summary_task_times_csr(c_task_rec.visit_task_id);
4728 FETCH get_summary_task_times_csr INTO l_prd_workorder_tbl(idx).SCHEDULED_START_DATE,
4729 l_prd_workorder_tbl(idx).SCHEDULED_END_DATE ;
4730 CLOSE get_summary_task_times_csr;
4731 ELSE
4732 l_prd_workorder_tbl(idx).SCHEDULED_START_DATE := c_task_rec.START_DATE_TIME;
4733 l_prd_workorder_tbl(idx).SCHEDULED_END_DATE := c_task_rec.END_DATE_TIME;
4734 END IF;
4735
4736 END IF; -- workorder exist
4737
4738 END IF; -- p_orig_visit null or orig_task_status null
4739
4740 FETCH c_task INTO c_task_rec;
4741 END LOOP;
4742
4743 CLOSE c_task;
4744
4745 END IF; -- l_count
4746 -- yazhou end
4747
4748 IF l_prd_workorder_tbl.COUNT > 0 THEN
4749
4750 /* Begin Changes by Shkalyan */
4751 IF (l_log_statement >= l_log_current_level) THEN
4752 fnd_log.string(l_log_statement,
4753 L_DEBUG_KEY,
4754 'Before calling GET_VISIT_RELATIONSHIPS.');
4755 END IF;
4756 -- yazhou starts
4757 -- IF l_visit_wo_id IS NULL THEN
4758 Get_Visit_Relationships
4759 (
4760 p_visit_id => p_visit_id,
4761 p_visit_number => c_visit_rec.visit_number,
4762 p_x_relationship_tbl => l_prd_workorder_rel_tbl
4763 );
4764
4765 IF (l_log_statement >= l_log_current_level) THEN
4766 fnd_log.string(l_log_statement,
4767 L_DEBUG_KEY,
4768 'After calling GET_VISIT_RELATIONSHIPS.');
4769 END IF;
4770 -- END IF;
4771 -- yazhou ends
4772
4773 IF (l_log_statement >= l_log_current_level) THEN
4774 fnd_log.string(l_log_statement,
4775 L_DEBUG_KEY,
4776 'Before calling GET_VISIT_DEPENDENCIES.');
4777 END IF;
4778
4779 IF (p_module_type <> 'CST') THEN
4780 Get_Visit_Dependencies
4781 (
4782 p_visit_id => p_visit_id,
4783 p_visit_number => c_visit_rec.visit_number,
4784 p_x_relationship_tbl => l_prd_workorder_rel_tbl
4785 );
4786 END IF;
4787
4788 IF (l_log_statement >= l_log_current_level) THEN
4789 fnd_log.string(l_log_statement,
4790 L_DEBUG_KEY,
4791 'After calling GET_VISIT_DEPENDENCIES.');
4792 END IF;
4793
4794 IF (l_log_statement >= l_log_current_level) THEN
4795 fnd_log.string(l_log_statement,
4796 L_DEBUG_KEY,
4797 'Before calling AHL_PRD_WORKORDER_PVT.Process_Jobs.');
4798 END IF;
4799
4800 AHL_PRD_WORKORDER_PVT.Process_Jobs
4801 ( p_api_version => p_api_version,
4802 p_init_msg_list => p_init_msg_list,
4803 p_commit => FND_API.G_FALSE,
4804 p_validation_level => p_validation_level,
4805 p_default => FND_API.G_TRUE,
4806 p_module_type => p_module_type,
4807 x_return_status => l_return_status,
4808 x_msg_count => x_msg_count,
4809 x_msg_data => x_msg_data,
4810 p_x_prd_workorder_tbl => l_prd_workorder_tbl,
4811 p_prd_workorder_rel_tbl => l_prd_workorder_rel_tbl
4812 );
4813 /* End Changes by Shkalyan */
4814
4815 IF (l_log_statement >= l_log_current_level) THEN
4816 fnd_log.string(l_log_statement,
4817 L_DEBUG_KEY,
4818 'After calling AHL_PRD_WORKORDER_PVT.Process_Jobs. Return Status = ' || l_return_status);
4819 END IF;
4820
4821 IF (l_return_status <> Fnd_Api.G_RET_STS_SUCCESS) THEN
4822 IF (l_log_statement >= l_log_current_level) THEN
4823 fnd_log.string(l_log_statement,
4824 L_DEBUG_KEY,
4825 'Errors from AHL_PRD_WORKORDER_PVT.Process_Jobs. Message count: ' ||
4826 l_msg_count || ', message data: ' || l_msg_data);
4827 END IF;
4828 IF l_return_status = FND_API.G_RET_STS_ERROR THEN
4829 RAISE FND_API.G_EXC_ERROR;
4830 ELSE
4831 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4832 END IF;
4833 END IF;
4834
4835 -- Begin changes by rnahata for Bug 5758813
4836 /*The project start/end dates have to be updated with the workorder scheduled
4837 start/end dates.*/
4838
4839 IF (l_log_statement >= l_log_current_level) THEN
4840 For i IN l_prd_workorder_tbl.FIRST..l_prd_workorder_tbl.LAST
4841 LOOP
4842 fnd_log.string(l_log_statement,
4843 L_DEBUG_KEY,
4844 'WorkOrder Id ('||i||'): '||l_prd_workorder_tbl(i).workorder_id);
4845 END LOOP;
4846 END IF;
4847
4848 IF (l_log_statement >= l_log_current_level) THEN
4849 fnd_log.string(l_log_statement,
4850 L_DEBUG_KEY,
4851 'Before calling Update_Project_Task_Times.');
4852 END IF;
4853
4854 Update_Project_Task_Times(p_prd_workorder_tbl => l_prd_workorder_tbl,
4855 p_commit =>'F',
4856 x_return_status => l_return_status,
4857 x_msg_count => l_msg_count,
4858 x_msg_data => l_msg_data);
4859
4860 IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
4861 x_msg_count := FND_MSG_PUB.count_msg;
4862 IF (l_log_statement >= l_log_current_level) THEN
4863 fnd_log.string(l_log_statement,
4864 L_DEBUG_KEY,
4865 'Errors from Update_Project_Task_Times. Message count: ' || x_msg_count);
4866 END IF;
4867 IF l_return_status = FND_API.G_RET_STS_ERROR THEN
4868 RAISE FND_API.G_EXC_ERROR;
4869 ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
4870 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4871 END IF;
4872 ELSE
4873 IF (l_log_statement >= l_log_current_level) THEN
4874 fnd_log.string(l_log_statement,
4875 L_DEBUG_KEY,
4876 'Returned Success from Update_Project_Task_Times');
4877 END IF;
4878 END IF;
4879 -- End changes by rnahata for Bug 5758813
4880 END IF; -- To find if the visit has any tasks
4881
4882 IF (l_log_statement >= l_log_current_level) THEN
4883 fnd_log.string(l_log_statement,
4884 L_DEBUG_KEY,
4885 'Update Visit -- Released');
4886 END IF;
4887 --transit check visit change
4888 -- yazhou start
4889 IF (p_module_type <> 'CST') THEN
4890 IF p_orig_visit_id is null THEN
4891 --------------------------------- R12 changes For Serial Number Reservations Start----------------------------------
4892 ----------------------------------AnRaj added on 15th June 2005-----------------------------------------------------
4893 -- When a visit is pushed to production, all the material reservations that were
4894 -- created will have to be transferred with the WIP details
4895
4896 IF (l_log_statement >= l_log_current_level) THEN
4897 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Before calling AHL_RSV_RESERVATIONS_PVT.TRANSFER_RESERVATION');
4898 END IF;
4899
4900 AHL_RSV_RESERVATIONS_PVT.TRANSFER_RESERVATION
4901 (
4902 p_api_version => l_api_version,
4903 p_init_msg_list => l_init_msg_list,
4904 x_return_status => l_return_status,
4905 p_module_type => p_module_type,
4906 x_msg_count => l_msg_count,
4907 x_msg_data => l_msg_data,
4908 p_visit_id => p_visit_id
4909 );
4910
4911 IF (l_log_statement >= l_log_current_level) THEN
4912 fnd_log.string(l_log_statement,L_DEBUG_KEY,'After calling AHL_RSV_RESERVATIONS_PVT.TRANSFER_RESERVATION - l_return_status : '||l_return_status);
4913 END IF;
4914
4915 -- handle the exceptions, if any
4916 IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
4917 IF (l_log_statement >= l_log_current_level) THEN
4918 fnd_log.string(l_log_statement,
4919 L_DEBUG_KEY,
4920 ':Errors from AHL_RSV_RESERVATIONS_PVT.TRANSFER_RESERVATION API : ' || x_msg_count );
4921 END IF;
4922 RAISE Fnd_Api.g_exc_error;
4923 END IF;
4924 --------------------------------- R12 changes For Serial Number Reservations End----------------------------------
4925
4926 UPDATE AHL_VISITS_B
4927 SET STATUS_CODE = 'RELEASED',
4928 OBJECT_VERSION_NUMBER = OBJECT_VERSION_NUMBER + 1
4929 WHERE VISIT_ID = p_visit_id;
4930
4931 ELSE
4932 UPDATE AHL_VISITS_B
4933 SET STATUS_CODE = c_orig_visit_rec.STATUS_CODE,
4934 OBJECT_VERSION_NUMBER = OBJECT_VERSION_NUMBER + 1
4935 WHERE VISIT_ID = p_visit_id;
4936 END IF;
4937
4938 END IF;
4939
4940 IF ( p_module_type <> 'CST' ) THEN
4941 IF p_orig_visit_id is null THEN
4942
4943 UPDATE AHL_VISIT_TASKS_B
4944 SET STATUS_CODE = 'RELEASED',
4945 OBJECT_VERSION_NUMBER = OBJECT_VERSION_NUMBER + 1
4946 WHERE VISIT_ID = p_visit_id
4947 AND STATUS_CODE = 'PLANNING';
4948
4949 ELSE
4950 UPDATE AHL_VISIT_TASKS_B
4951 SET STATUS_CODE = 'RELEASED',
4952 OBJECT_VERSION_NUMBER = OBJECT_VERSION_NUMBER + 1
4953 WHERE VISIT_ID = p_visit_id
4954 AND STATUS_CODE = 'PLANNING'
4955 AND VISIT_TASK_NUMBER in (Select VISIT_TASK_NUMBER
4956 FROM ahl_visit_tasks_b
4957 where visit_id = p_orig_visit_id
4958 AND STATUS_CODE = 'RELEASED');
4959 END IF;
4960 END IF;
4961 -- yazhou end
4962
4963 -- Start By Shbhanda 16th Feb 2004 --
4964 -- Earlier this code was in Release_Visit procedure
4965 -- was moved here as whenever the visit is pushed to production
4966 -- 'any_task_chg_flag' in Visit should always be 'N'
4967 -----------------------------------------------
4968 -- To call AHL_VWP_RULES_PVT.Update_Visit_Task_Flag to update any_task_chg_flag as 'N'
4969 IF (l_log_statement >= l_log_current_level) THEN
4970 fnd_log.string(l_log_statement,
4971 L_DEBUG_KEY,
4972 'Before calling AHL_VWP_RULES_PVT.Update_Visit_Task_Flag.');
4973 END IF;
4974
4975 IF c_visit_rec.any_task_chg_flag = 'Y' THEN
4976 AHL_VWP_RULES_PVT.Update_Visit_Task_Flag
4977 (p_visit_id => p_visit_id,
4978 p_flag => 'N',
4979 x_return_status => x_return_status);
4980 END IF;
4981
4982 IF (l_log_statement >= l_log_current_level) THEN
4983 fnd_log.string(l_log_statement,
4984 L_DEBUG_KEY,
4985 'After calling AHL_VWP_RULES_PVT.Update_Visit_Task_Flag');
4986 END IF;
4987 -- End By Shbhanda 16th Feb 2004 -------------
4988
4989 ---------------------------End of Body-------------------------------------
4990 -- END of API body.
4991 -- Standard check of p_commit.
4992
4993 IF Fnd_Api.To_Boolean (p_commit) THEN
4994 COMMIT WORK;
4995 END IF;
4996
4997 Fnd_Msg_Pub.count_and_get(
4998 p_encoded => Fnd_Api.g_false,
4999 p_count => x_msg_count,
5000 p_data => x_msg_data
5001 );
5002
5003 IF (l_log_procedure >= l_log_current_level) THEN
5004 fnd_log.string(l_log_procedure,
5005 L_DEBUG_KEY ||'.end',
5006 'At the end of PL SQL procedure. Return Status = ' || x_return_status);
5007 END IF;
5008
5009 EXCEPTION
5010 WHEN Fnd_Api.g_exc_error THEN
5011 ROLLBACK TO Push_to_Production;
5012 x_return_status := Fnd_Api.g_ret_sts_error;
5013 Fnd_Msg_Pub.count_and_get (
5014 p_encoded => Fnd_Api.g_false,
5015 p_count => x_msg_count,
5016 p_data => x_msg_data
5017 );
5018 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
5019 ROLLBACK TO Push_to_Production;
5020 x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
5021 Fnd_Msg_Pub.count_and_get (
5022 p_encoded => Fnd_Api.g_false,
5023 p_count => x_msg_count,
5024 p_data => x_msg_data
5025 );
5026 WHEN OTHERS THEN
5027 ROLLBACK TO Push_to_Production;
5028 x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
5029 IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_unexp_error)
5030 THEN
5031 Fnd_Msg_Pub.add_exc_msg (G_PKG_NAME, l_api_name);
5032 END IF;
5033 Fnd_Msg_Pub.count_and_get (
5034 p_encoded => Fnd_Api.g_false,
5035 p_count => x_msg_count,
5036 p_data => x_msg_data
5037 );
5038 END Push_to_Production;
5039
5040 -------------------------------------------------------------------
5041 -- Procedure name : Release_Visit
5042 -- Type : Private
5043 --
5044 --
5045 -- Function :To Validate before pushing visit and its tasks to production
5046 --
5047 --
5048 -- Pre-reqs :
5049 -- Parameters :
5050 --
5051 -- Standard IN Parameters :
5052 -- p_api_version IN NUMBER Required
5053 -- p_init_msg_list IN VARCHAR2 Default FND_API.G_FALSE
5054 -- p_commit IN VARCHAR2 Default FND_API.G_FALSE
5055 -- p_validation_level IN NUMBER Default FND_API.G_VALID_LEVEL_FULL
5056 --
5057 -- Standard OUT Parameters :
5058 -- x_return_status OUT VARCHAR2 Required
5059 -- x_msg_count OUT NUMBER Required
5060 -- x_msg_data OUT VARCHAR2 Required
5061 --
5062 -- Release visit Parameters:
5063 -- p_visit_id IN NUMBER Required
5064 --
5065 -- Version :
5066 -- 09/09/2003 SSURAPAN Initial Creation
5067 -------------------------------------------------------------------
5068 PROCEDURE Release_Visit (
5069 p_api_version IN NUMBER,
5070 p_init_msg_list IN VARCHAR2 := Fnd_Api.G_FALSE,
5071 p_commit IN VARCHAR2 := Fnd_Api.G_FALSE,
5072 p_validation_level IN NUMBER := Fnd_Api.G_VALID_LEVEL_FULL,
5073 p_module_type IN VARCHAR2 := NULL,
5074 p_visit_id IN NUMBER,
5075 p_release_flag IN VARCHAR2 := 'N', -- By shbhanda 05/21/04 fro TC changes
5076 p_orig_visit_id IN NUMBER := NULL, -- By yazhou 08/06/04 for TC changes
5077 x_return_status OUT NOCOPY VARCHAR2,
5078 x_msg_count OUT NOCOPY NUMBER,
5079 x_msg_data OUT NOCOPY VARCHAR2)
5080 IS
5081 --Standard local variables
5082 L_API_NAME CONSTANT VARCHAR2(30) := 'Release_Visit';
5083 L_API_VERSION CONSTANT NUMBER := 1.0;
5084 L_DEBUG_KEY CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
5085 l_msg_data VARCHAR2(2000);
5086 l_return_status VARCHAR2(1);
5087 l_msg_count NUMBER;
5088 l_Error_Tbl_Type Error_Tbl_Type;
5089 l_error_msg VARCHAR2(5000);
5090 l_error_count NUMBER;
5091 l_commit VARCHAR2(1) := 'F';
5092 --Post 11.5.10
5093 -- RROY
5094 l_validate_error CONSTANT VARCHAR2(1) := 'V';
5095 --l_projects_error CONSTANT VARCHAR2(1) := 'R';
5096 l_push_error CONSTANT VARCHAR2(1) := 'P';
5097 -- RROY
5098
5099 -- To find visit related information
5100 CURSOR c_visit (x_id IN NUMBER) IS
5101 SELECT * FROM AHL_VISITS_VL
5102 WHERE VISIT_ID = x_id;
5103 c_visit_rec c_visit%ROWTYPE;
5104 BEGIN
5105
5106 IF (l_log_procedure >= l_log_current_level) THEN
5107 fnd_log.string(l_log_procedure,L_DEBUG_KEY||'.begin','At the start of the PLSQL procedure');
5108 END IF;
5109
5110 -- Standard start of API savepoint
5111 SAVEPOINT Release_Visit_Pvt;
5112
5113 -- Initialize message list if p_init_msg_list is set to TRUE
5114 IF FND_API.To_Boolean(p_init_msg_list) THEN
5115 FND_MSG_PUB.Initialize;
5116 END IF;
5117 -- Initialize API return status to success
5118 x_return_status := FND_API.G_RET_STS_SUCCESS;
5119
5120 -- Standard call to check for call compatibility.
5121 IF NOT FND_API.COMPATIBLE_API_CALL(l_api_version,
5122 p_api_version,
5123 l_api_name,G_PKG_NAME) THEN
5124 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5125 END IF;
5126 --
5127
5128 IF (l_log_statement >= l_log_current_level) THEN
5129 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Visit ID : '||p_visit_id);
5130 END IF;
5131
5132 -- Check for Required Parameters
5133 IF(p_visit_id IS NULL OR p_visit_id = FND_API.G_MISS_NUM) THEN
5134 FND_MESSAGE.Set_Name(G_PM_PRODUCT_CODE,'AHL_VWP_CST_INPUT_MISS');
5135 FND_MSG_PUB.ADD;
5136 IF (l_log_unexpected >= l_log_current_level)THEN
5137 fnd_log.string
5138 (
5139 l_log_unexpected,
5140 'ahl.plsql.AHL_VWP_CST_WO_PVT.Release_Visit',
5141 'Visit id is mandatory but found null in input '
5142 );
5143 END IF;
5144 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5145 END IF;
5146
5147 IF (l_log_statement >= l_log_current_level)THEN
5148 fnd_log.string (l_log_statement,L_DEBUG_KEY, 'Before Calling Validate Before Production');
5149 END IF;
5150
5151 --Valdate before push to production happens
5152 AHL_VWP_PROJ_PROD_PVT.Validate_Before_Production
5153 (p_api_version => l_api_version,
5154 p_init_msg_list => p_init_msg_list,
5155 p_commit => l_commit,
5156 p_validation_level => p_validation_level,
5157 p_module_type => p_module_type,
5158 p_visit_id => p_visit_id,
5159 x_error_tbl => l_error_tbl_type,
5160 x_return_status => l_return_status,
5161 x_msg_count => l_msg_count,
5162 x_msg_data => l_msg_data);
5163
5164 IF (l_log_statement >= l_log_current_level)THEN
5165 fnd_log.string (l_log_statement, L_DEBUG_KEY, 'After Calling Validate Before Production - l_return_status = '||l_return_status);
5166 END IF;
5167
5168 -- Post 11.5.10
5169 -- RROY
5170 IF l_error_tbl_type.COUNT > 0 THEN
5171 l_return_status := l_validate_error;
5172 x_return_status := l_validate_error;
5173 ELSIF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
5174 -- Check Error Message stack.
5175 x_msg_count := FND_MSG_PUB.count_msg;
5176
5177 IF (l_log_statement >= l_log_current_level)THEN
5178 fnd_log.string ( l_log_statement, L_DEBUG_KEY,'Errors from Validate Before Production - '||x_msg_count);
5179 END IF;
5180 RAISE Fnd_Api.g_exc_error;
5181 ELSE
5182 IF (l_log_statement >= l_log_current_level)THEN
5183 fnd_log.string(l_log_statement,L_DEBUG_KEY, 'Before Calling aggregate_material_requirements');
5184 END IF;
5185
5186 -- AnRaj: Added as part of Material Requirement Aggrgation Enhancement, Bug#5303378
5187 -- Call aggregate_material_requirements for a visit
5188 -- If a visit task has more than one requirement for the same item, then this method will aggregate
5189 -- all those requirements into a single requirement
5190 Aggregate_Material_Reqrs
5191 ( p_api_version => l_api_version,
5192 p_init_msg_list => p_init_msg_list,
5193 p_commit => l_commit,
5194 p_validation_level => p_validation_level,
5195 p_module_type => p_module_type,
5196 p_visit_id => p_visit_id,
5197 x_return_status => l_return_status,
5198 x_msg_count => l_msg_count,
5199 x_msg_data => l_msg_data
5200 );
5201 IF (l_log_statement >= l_log_current_level)THEN
5202 fnd_log.string(l_log_statement,L_DEBUG_KEY, 'After Calling aggregate_material_requirements - l_return_status = '||l_return_status);
5203 END IF;
5204
5205 IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
5206 x_msg_count := FND_MSG_PUB.count_msg;
5207 IF (l_log_statement >= l_log_current_level)THEN
5208 fnd_log.string( l_log_statement,L_DEBUG_KEY,'Errors from aggregate_material_requirements: ' || x_msg_count);
5209 END IF;
5210 RAISE Fnd_Api.g_exc_error;
5211 END IF;
5212
5213 IF (l_log_statement >= l_log_current_level)THEN
5214 fnd_log.string(l_log_statement,L_DEBUG_KEY, 'Before calling Push_to_Production');
5215 END IF;
5216
5217 --Call push to production with module type 'CST'
5218 AHL_VWP_PROJ_PROD_PVT.Push_to_Production
5219 (p_api_version => l_api_version,
5220 p_init_msg_list => p_init_msg_list,
5221 p_commit => l_commit,
5222 p_validation_level => p_validation_level,
5223 p_module_type => p_module_type, --'JSP', -- earlier 'CST'
5224 p_visit_id => p_visit_id,
5225 p_release_flag => p_release_flag,
5226 p_orig_visit_id => p_orig_visit_id,
5227 x_return_status => l_return_status,
5228 x_msg_count => l_msg_count,
5229 x_msg_data => l_msg_data);
5230
5231 IF (l_log_statement >= l_log_current_level)THEN
5232 fnd_log.string(l_log_statement,L_DEBUG_KEY, 'After calling Push_to_Production - l_return_status = '||l_return_status);
5233 END IF;
5234
5235 IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
5236 -- Check Error Message stack.
5237 x_msg_count := FND_MSG_PUB.count_msg;
5238 IF (l_log_statement >= l_log_current_level)THEN
5239 fnd_log.string( l_log_statement,L_DEBUG_KEY, 'Errors from Push to Production: ' || x_msg_count );
5240 END IF;
5241 RAISE Fnd_Api.g_exc_error;
5242 END IF;
5243
5244 IF (l_log_statement >= l_log_current_level)THEN
5245 fnd_log.string(l_log_statement,L_DEBUG_KEY, 'Before calling AHL_LTP_SIMUL_PLAN_PVT.delete_simul_visits');
5246 END IF;
5247
5248 -- Delete simulated visits associated to this visit
5249 AHL_LTP_SIMUL_PLAN_PVT.delete_simul_visits
5250 (p_api_version => l_api_version,
5251 p_init_msg_list => p_init_msg_list,
5252 p_commit => l_commit,
5253 p_validation_level => p_validation_level,
5254 p_visit_id => p_visit_id,
5255 x_return_status => l_return_status,
5256 x_msg_count => l_msg_count,
5257 x_msg_data => l_msg_data);
5258
5259 IF (l_log_statement >= l_log_current_level)THEN
5260 fnd_log.string(l_log_statement,L_DEBUG_KEY, 'After calling AHL_LTP_SIMUL_PLAN_PVT.delete_simul_visits - l_return_status : '||l_return_status);
5261 END IF;
5262
5263 IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
5264 -- Check Error Message stack.
5265 x_msg_count := FND_MSG_PUB.count_msg;
5266 IF (l_log_statement >= l_log_current_level)THEN
5267 fnd_log.string( l_log_statement,L_DEBUG_KEY,'Errors from delete_simul_visits: '||x_msg_count);
5268 END IF;
5269 RAISE Fnd_Api.g_exc_error;
5270 END IF;
5271 END IF;
5272 -- Post 11.5.10
5273 -- RROY
5274 -- Standard check of p_commit
5275 IF FND_API.TO_BOOLEAN(p_commit) THEN
5276 COMMIT WORK;
5277 END IF;
5278
5279 IF (l_log_procedure >= l_log_current_level)THEN
5280 fnd_log.string ( l_log_procedure,L_DEBUG_KEY ||'.end','At the end of PLSQL procedure');
5281 END IF;
5282
5283 EXCEPTION
5284 WHEN FND_API.G_EXC_ERROR THEN
5285 x_return_status := FND_API.G_RET_STS_ERROR;
5286 ROLLBACK TO Release_Visit_Pvt;
5287 FND_MSG_PUB.count_and_get(p_count => x_msg_count,
5288 p_data => x_msg_data,
5289 p_encoded => fnd_api.g_false);
5290
5291
5292 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
5293 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5294 ROLLBACK TO Release_Visit_Pvt;
5295 FND_MSG_PUB.count_and_get(p_count => x_msg_count,
5296 p_data => x_msg_data,
5297 p_encoded => fnd_api.g_false);
5298
5299
5300 WHEN OTHERS THEN
5301 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5302 ROLLBACK TO Release_Visit_Pvt;
5303 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
5304 fnd_msg_pub.add_exc_msg(p_pkg_name => G_PKG_NAME,
5305 p_procedure_name => 'Release_Visit',
5306 p_error_text => SUBSTR(SQLERRM,1,500));
5307 END IF;
5308 FND_MSG_PUB.count_and_get(p_count => x_msg_count,
5309 p_data => x_msg_data,
5310 p_encoded => fnd_api.g_false);
5311
5312 END Release_Visit;
5313
5314 -------------------------------------------------------------------
5315 -- Procedure name : Release_Tasks
5316 -- Type : Private
5317 -- Function : Validate the tasks and then push tasks to production
5318 -- Parameters :
5319 --
5320 -- Standard IN Parameters :
5321 -- p_api_version IN NUMBER Required
5322 -- p_init_msg_list IN VARCHAR2 Default FND_API.G_FALSE
5323 -- p_commit IN VARCHAR2 Default FND_API.G_FALSE
5324 -- p_validation_level IN NUMBER Default FND_API.G_VALID_LEVEL_FULL
5325 --
5326 -- Standard OUT Parameters :
5327 -- x_return_status OUT VARCHAR2 Required
5328 -- x_msg_count OUT NUMBER Required
5329 -- x_msg_data OUT VARCHAR2 Required
5330 --
5331 -- Parameters:
5332 -- p_visit_id IN NUMBER Required
5333 -- p_release_flag IN VARCHAR2 Default 'N'
5334 -- p_tasks_tbl IN Task_Tbl_Type Required
5335 --
5336 -- Version :
5337 -- 30 November, 2007 RNAHATA Initial Version - 1.0
5338 -------------------------------------------------------------------
5339 PROCEDURE Release_Tasks(
5340 p_api_version IN NUMBER,
5341 p_init_msg_list IN VARCHAR2 := Fnd_Api.G_FALSE,
5342 p_commit IN VARCHAR2 := Fnd_Api.G_FALSE,
5343 p_validation_level IN NUMBER := Fnd_Api.G_VALID_LEVEL_FULL,
5344 p_module_type IN VARCHAR2 := Null,
5345 p_visit_id IN NUMBER,
5346 p_tasks_tbl IN Task_Tbl_Type,
5347 p_release_flag IN VARCHAR2 := 'N',
5348 x_return_status OUT NOCOPY VARCHAR2,
5349 x_msg_count OUT NOCOPY NUMBER,
5350 x_msg_data OUT NOCOPY VARCHAR2)
5351 IS
5352 L_API_NAME CONSTANT VARCHAR2(30) := 'Release_Tasks';
5353 L_API_VERSION CONSTANT NUMBER := 1.0;
5354 L_DEBUG_KEY CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
5355 l_msg_data VARCHAR2(2000);
5356 l_return_status VARCHAR2(1);
5357 l_msg_count NUMBER;
5358 l_Error_Tbl_Type Error_Tbl_Type;
5359 l_tasks_tbl Task_Tbl_Type;
5360 l_validate_visit NUMBER:= 0;
5361 l_temp_msg_count NUMBER:=0; --rnahata
5362
5363 -- chk if the visit is valid
5364 CURSOR c_validate_visit (x_id IN NUMBER) IS
5365 SELECT 1 FROM AHL_VISITS_B
5366 WHERE VISIT_ID = x_id;
5367
5368 -- chk if the visit is in partially released or planning status
5369 CURSOR c_visit_info (x_id IN NUMBER) IS
5370 SELECT start_date_time,status_code FROM AHL_VISITS_B
5371 WHERE VISIT_ID = x_id
5372 AND NVL(STATUS_CODE,'X') IN ('PARTIALLY RELEASED', 'PLANNING');
5373
5374 c_visit_info_rec c_visit_info%ROWTYPE;
5375
5376 BEGIN
5377
5378 IF (l_log_procedure >= l_log_current_level) THEN
5379 fnd_log.string(l_log_procedure,
5380 L_DEBUG_KEY ||'.begin',
5381 'At the start of PL SQL procedure. Visit Id = ' || p_visit_id ||
5382 'p_tasks_tbl.COUNT = ' || p_tasks_tbl.COUNT);
5383 END IF;
5384
5385 -- Standard start of API savepoint
5386 SAVEPOINT Release_Tasks_Pvt;
5387
5388 -- Initialize message list if p_init_msg_list is set to TRUE
5389 IF FND_API.To_Boolean(p_init_msg_list) THEN
5390 FND_MSG_PUB.Initialize;
5391 END IF;
5392
5393 -- Initialize API return status to success
5394 x_return_status := FND_API.G_RET_STS_SUCCESS;
5395
5396 -- Standard call to check for call compatibility.
5397 IF NOT FND_API.COMPATIBLE_API_CALL(l_api_version,
5398 p_api_version,
5399 l_api_name,G_PKG_NAME)
5400 THEN
5401 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5402 END IF;
5403
5404 --Check for required parameters
5405 IF (p_visit_id IS NOT NULL) THEN
5406
5407 OPEN c_validate_visit(p_visit_id);
5408 FETCH c_validate_visit INTO l_validate_visit;
5409 CLOSE c_validate_visit;
5410
5411 --Validate visit
5412 IF (nvl(l_validate_visit,0) = 0) THEN
5413 IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_error) THEN
5414 FND_MESSAGE.Set_Name(G_PM_PRODUCT_CODE,'AHL_VWP_INVALID_VST');
5415 FND_MESSAGE.SET_TOKEN('VISIT_ID', p_visit_id);
5416 FND_MSG_PUB.ADD;
5417 END IF;
5418 RAISE FND_API.G_EXC_ERROR;
5419 END IF;
5420
5421 --Check if the visit is in planning or partially released status
5422 OPEN c_visit_info(p_visit_id);
5423 FETCH c_visit_info INTO c_visit_info_rec;
5424 IF c_visit_info%NOTFOUND THEN
5425 IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_error) THEN
5426 FND_MESSAGE.Set_Name(G_PM_PRODUCT_CODE,'AHL_VWP_VST_STATUS_INVALID');
5427 FND_MSG_PUB.ADD;
5428 END IF;
5429 CLOSE c_visit_info;
5430 RAISE FND_API.G_EXC_ERROR;
5431 END IF;
5432 CLOSE c_visit_info;
5433 --If visit_id is null
5434 ELSE
5435 IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_error) THEN
5436 FND_MESSAGE.Set_Name(G_PM_PRODUCT_CODE,'AHL_VWP_VISIT_NULL');
5437 FND_MSG_PUB.ADD;
5438 END IF;
5439 RAISE FND_API.G_EXC_ERROR;
5440 END IF;
5441
5442 --No tasks selected
5443 IF (p_tasks_tbl.COUNT = 0) THEN
5444 IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_error) THEN
5445 FND_MESSAGE.Set_Name(G_PM_PRODUCT_CODE,'AHL_VWP_NO_TASK_SEL');
5446 FND_MSG_PUB.ADD;
5447 END IF;
5448 RAISE FND_API.G_EXC_ERROR;
5449 END IF;
5450
5451 IF (l_log_statement >= l_log_current_level) THEN
5452 fnd_log.string(l_log_statement,
5453 L_DEBUG_KEY,
5454 'Before calling VALIDATE_BEFORE_PRODUCTION');
5455 END IF;
5456
5457 --Validate visit before pushing the tasks to production
5458 AHL_VWP_PROJ_PROD_PVT.Validate_Before_Production
5459 (p_api_version => l_api_version,
5460 p_init_msg_list => p_init_msg_list,
5461 p_commit => 'F',
5462 p_validation_level => p_validation_level,
5463 p_module_type => p_module_type,
5464 p_visit_id => p_visit_id,
5465 x_error_tbl => l_error_tbl_type,
5466 x_return_status => l_return_status,
5467 x_msg_count => l_msg_count,
5468 x_msg_data => l_msg_data);
5469
5470 IF (l_log_statement >= l_log_current_level) THEN
5471 fnd_log.string(l_log_statement,
5472 L_DEBUG_KEY,
5473 'After calling VALIDATE_BEFORE_PRODUCTION, Return Status = ' ||
5474 l_return_status);
5475 END IF;
5476
5477 IF (l_return_status <> FND_API.G_RET_STS_SUCCESS OR l_error_tbl_type.COUNT > 0) THEN
5478 -- Check Error Message stack.
5479 x_msg_count := FND_MSG_PUB.count_msg;
5480 IF (l_log_statement >= l_log_current_level) THEN
5481 fnd_log.string(l_log_statement,
5482 L_DEBUG_KEY,
5483 'Errors from VALIDATE_BEFORE_PRODUCTION. Message count: ' || x_msg_count);
5484 END IF;
5485 IF l_return_status = FND_API.G_RET_STS_ERROR THEN
5486 RAISE FND_API.G_EXC_ERROR;
5487 ELSE
5488 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5489 END IF;
5490 END IF;
5491
5492 IF (l_log_statement >= l_log_current_level) THEN
5493 fnd_log.string(l_log_statement,
5494 L_DEBUG_KEY,
5495 'Before calling VALIDATE_TASKS_BEF_PRODUCTION. p_module_type = ' || p_module_type);
5496 END IF;
5497
5498 --Validate tasks before push to production happens
5499 AHL_VWP_PROJ_PROD_PVT.Validate_tasks_bef_production(
5500 p_visit_id => p_visit_id,
5501 p_tasks_tbl => p_tasks_tbl,
5502 x_tasks_tbl => l_tasks_tbl,
5503 x_return_status => l_return_status,
5504 x_msg_count => l_msg_count,
5505 x_msg_data => l_msg_data);
5506
5507 IF (l_log_statement >= l_log_current_level) THEN
5508 fnd_log.string(l_log_statement,
5509 L_DEBUG_KEY,
5510 'After calling VALIDATE_TASKS_BEF_PRODUCTION. Records in l_tasks_tbl: ' ||
5511 l_tasks_tbl.COUNT|| ', Return Status = ' || l_return_status);
5512 END IF;
5513
5514 IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
5515 -- Check Error Message stack.
5516 x_msg_count := FND_MSG_PUB.count_msg;
5517
5518 IF (l_log_statement >= l_log_current_level) THEN
5519 fnd_log.string(l_log_statement,
5520 L_DEBUG_KEY,
5521 'Errors from VALIDATE_TASKS_BEF_PRODUCTION. Message count: ' || x_msg_count);
5522 END IF;
5523
5524 IF l_return_status = FND_API.G_RET_STS_ERROR THEN
5525 RAISE FND_API.G_EXC_ERROR;
5526 ELSE
5527 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5528 END IF;
5529 END IF; -- l_return_status <> FND_API.G_RET_STS_SUCCESS
5530
5531 IF (l_log_statement >= l_log_current_level) THEN
5532 fnd_log.string(l_log_statement,
5533 L_DEBUG_KEY,
5534 'Before calling AGGREGATE_TASK_MATERIAL_REQRS ');
5535 END IF;
5536
5537 --Total the material requirements for a specific item at task level
5538 FOR i IN l_tasks_tbl.FIRST..l_tasks_tbl.LAST
5539 LOOP
5540 AHL_VWP_PROJ_PROD_PVT.Aggregate_Task_Material_Reqrs
5541 ( p_api_version => p_api_version,
5542 p_init_msg_list => p_init_msg_list,
5543 p_commit => p_commit,
5544 p_validation_level => p_validation_level,
5545 p_module_type => p_module_type,
5546 p_task_id => l_tasks_tbl(i).visit_task_id,
5547 p_rel_tsk_flag => 'Y',
5548 x_return_status => l_return_status,
5549 x_msg_count => l_msg_count,
5550 x_msg_data => l_msg_data
5551 );
5552
5553 IF (l_log_statement >= l_log_current_level) THEN
5554 fnd_log.string(l_log_statement,
5555 L_DEBUG_KEY,
5556 'After calling AGGREGATE_TASK_MATERIAL_REQRS for Task Id: ' ||
5557 l_tasks_tbl(i).visit_task_id || '. Return Status = '|| l_return_status);
5558 END IF;
5559
5560 IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
5561 x_msg_count := FND_MSG_PUB.count_msg;
5562 IF (l_log_statement >= l_log_current_level) THEN
5563 fnd_log.string(l_log_statement,
5564 L_DEBUG_KEY,
5565 'Errors from AGGREGATE_TASK_MATERIAL_REQRS. Message count: ' || x_msg_count);
5566 END IF;
5567 IF l_return_status = FND_API.G_RET_STS_ERROR THEN
5568 RAISE FND_API.G_EXC_ERROR;
5569 ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
5570 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5571 END IF;
5572 END IF;
5573 END LOOP;
5574
5575 --for paritally implemented visits adjust the task times
5576 IF (c_visit_info_rec.start_date_time < SYSDATE and c_visit_info_rec.status_code = 'PARTIALLY RELEASED') THEN
5577
5578 IF (l_log_statement >= l_log_current_level) THEN
5579 fnd_log.string(l_log_statement,
5580 L_DEBUG_KEY,
5581 'Before calling ADJUST_TASK_TIMES ');
5582 END IF;
5583
5584 FOR i IN l_tasks_tbl.FIRST..l_tasks_tbl.LAST
5585 LOOP
5586 AHL_VWP_TIMES_PVT.adjust_task_times
5587 (p_api_version => l_api_version,
5588 p_init_msg_list => p_init_msg_list,
5589 p_commit => 'F',
5590 p_validation_level => p_validation_level,
5591 p_task_id => l_tasks_tbl(i).visit_task_id,
5592 p_reset_sysdate_flag => FND_API.G_TRUE,
5593 x_return_status => l_return_status,
5594 x_msg_count => l_msg_count,
5595 x_msg_data => l_msg_data
5596 );
5597
5598 IF (l_log_statement >= l_log_current_level) THEN
5599 fnd_log.string(l_log_statement,
5600 L_DEBUG_KEY,
5601 'After calling ADJUST_TASK_TIMES for task Id ' ||
5602 l_tasks_tbl(i).visit_task_id ||'. Return Status = '|| l_return_status);
5603 END IF;
5604
5605 IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
5606 x_msg_count := FND_MSG_PUB.count_msg;
5607 IF (l_log_statement >= l_log_current_level) THEN
5608 fnd_log.string(l_log_statement,
5609 L_DEBUG_KEY,
5610 'Errors from ADJUST_TASK_TIMES. Message count: ' || x_msg_count);
5611 END IF;
5612 IF l_return_status = FND_API.G_RET_STS_ERROR THEN
5613 RAISE FND_API.G_EXC_ERROR;
5614 ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
5615 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5616 END IF;
5617 END IF;
5618 END LOOP;
5619 END IF; --partially released
5620
5621 l_temp_msg_count := Fnd_Msg_Pub.count_msg;
5622
5623 --Validate the MR/Route dates for all the tasks
5624 FOR i IN l_tasks_tbl.FIRST..l_tasks_tbl.LAST
5625 LOOP
5626 IF (l_log_statement >= l_log_current_level) THEN
5627 fnd_log.string(l_log_statement,
5628 L_DEBUG_KEY,
5629 'Before calling VALIDATE_MR_ROUTE_DATE. l_msg_count = ' || l_msg_count);
5630 END IF;
5631
5632 Validate_MR_Route_Date
5633 (
5634 p_mr_route_id => l_tasks_tbl(i).MR_Route_Id,
5635 p_visit_task_number => l_tasks_tbl(i).VISIT_TASK_NUMBER,
5636 p_start_date_time => l_tasks_tbl(i).TASK_START_DATE,
5637 p_end_date_time => l_tasks_tbl(i).TASK_END_DATE
5638 );
5639
5640 IF (l_log_statement >= l_log_current_level) THEN
5641 fnd_log.string(l_log_statement,L_DEBUG_KEY,
5642 'After calling VALIDATE_MR_ROUTE_DATE for task Id: ' ||l_tasks_tbl(i).visit_task_id || ' and l_msg_count - ' || l_msg_count);
5643 END IF;
5644 END LOOP;
5645
5646 l_msg_count := Fnd_Msg_Pub.count_msg;
5647 IF (l_msg_count <> l_temp_msg_count) THEN
5648 IF (l_log_statement >= l_log_current_level) THEN
5649 fnd_log.string(l_log_statement,L_DEBUG_KEY,
5650 'Errors from VALIDATE_MR_ROUTE_DATE. Message count: ' || l_msg_count);
5651 END IF;
5652 RAISE FND_API.G_EXC_ERROR;
5653 END IF;
5654
5655 IF (l_log_statement >= l_log_current_level) THEN
5656 fnd_log.string(l_log_statement,
5657 L_DEBUG_KEY,
5658 'Before calling PUSH_TASKS_TO_PRODUCTION for visit id: ' ||p_visit_id);
5659 END IF;
5660
5661 --push the selected tasks to production
5662 AHL_VWP_PROJ_PROD_PVT.Push_tasks_to_production
5663 ( p_api_version => l_api_version,
5664 p_init_msg_list => p_init_msg_list,
5665 p_validation_level => p_validation_level,
5666 p_module_type => p_module_type,
5667 p_visit_id => p_visit_id,
5668 p_tasks_tbl => l_tasks_tbl,
5669 p_release_flag => p_release_flag,
5670 x_return_status => l_return_status,
5671 x_msg_count => l_msg_count,
5672 x_msg_data => l_msg_data
5673 );
5674
5675 IF (l_log_statement >= l_log_current_level) THEN
5676 fnd_log.string(l_log_statement,
5677 L_DEBUG_KEY,
5678 'After calling PUSH_TASKS_TO_PRODUCTION. Return Status = '|| l_return_status);
5679 END IF;
5680
5681 IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
5682 x_msg_count := FND_MSG_PUB.count_msg;
5683 IF (l_log_statement >= l_log_current_level) THEN
5684 fnd_log.string(l_log_statement,
5685 L_DEBUG_KEY,
5686 'Errors from PUSH_TASKS_TO_PRODUCTION. Message count: ' || x_msg_count);
5687 END IF;
5688 IF l_return_status = FND_API.G_RET_STS_ERROR THEN
5689 RAISE FND_API.G_EXC_ERROR;
5690 ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
5691 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5692 END IF;
5693 END IF;
5694
5695 IF (l_log_statement >= l_log_current_level) THEN
5696 fnd_log.string(l_log_statement,
5697 L_DEBUG_KEY,
5698 'Before calling DELETE_SIMUL_VISITS for visit id: ' ||p_visit_id);
5699 END IF;
5700
5701 -- Delete the simulated visits
5702 AHL_LTP_SIMUL_PLAN_PVT.delete_simul_visits
5703 (p_api_version => l_api_version,
5704 p_init_msg_list => p_init_msg_list,
5705 p_commit => 'F',
5706 p_validation_level => p_validation_level,
5707 p_visit_id => p_visit_id,
5708 x_return_status => l_return_status,
5709 x_msg_count => l_msg_count,
5710 x_msg_data => l_msg_data);
5711
5712 IF (l_log_statement >= l_log_current_level) THEN
5713 fnd_log.string(l_log_statement,
5714 L_DEBUG_KEY,
5715 'After calling DELETE_SIMUL_VISITS for visit id ' ||p_visit_id||'. Return Status = '|| l_return_status);
5716 END IF;
5717
5718 IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
5719 x_msg_count := FND_MSG_PUB.count_msg;
5720 IF (l_log_statement >= l_log_current_level) THEN
5721 fnd_log.string(l_log_statement,
5722 L_DEBUG_KEY,
5723 'Errors from DELETE_SIMUL_TASKS. Message count: ' || x_msg_count);
5724 END IF;
5725 IF l_return_status = FND_API.G_RET_STS_ERROR THEN
5726 RAISE FND_API.G_EXC_ERROR;
5727 ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
5728 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5729 END IF;
5730 END IF;
5731
5732 -- Standard check of p_commit
5733 IF FND_API.TO_BOOLEAN(p_commit) THEN
5734 COMMIT WORK;
5735 END IF;
5736
5737 Fnd_Msg_Pub.count_and_get(
5738 p_encoded => Fnd_Api.g_false,
5739 p_count => x_msg_count,
5740 p_data => x_msg_data
5741 );
5742
5743 IF (l_log_procedure >= l_log_current_level) THEN
5744 fnd_log.string(l_log_procedure,
5745 L_DEBUG_KEY||'.end',
5746 'At the end of PLSQL procedure. Return Status = ' || x_return_status);
5747 END IF;
5748
5749 EXCEPTION
5750 WHEN FND_API.G_EXC_ERROR THEN
5751 x_return_status := FND_API.G_RET_STS_ERROR;
5752 ROLLBACK TO Release_Tasks_Pvt;
5753 FND_MSG_PUB.count_and_get(p_count => x_msg_count,
5754 p_data => x_msg_data,
5755 p_encoded => fnd_api.g_false);
5756
5757 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
5758 x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
5759 ROLLBACK TO Release_Tasks_Pvt;
5760 Fnd_Msg_Pub.count_and_get (
5761 p_encoded => Fnd_Api.g_false,
5762 p_count => x_msg_count,
5763 p_data => x_msg_data);
5764
5765 WHEN OTHERS THEN
5766 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5767 ROLLBACK TO Release_Tasks_Pvt;
5768 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
5769 fnd_msg_pub.add_exc_msg(p_pkg_name => G_PKG_NAME,
5770 p_procedure_name => 'Release_Tasks',
5771 p_error_text => SUBSTR(SQLERRM,1,500));
5772 END IF;
5773 FND_MSG_PUB.count_and_get(p_count => x_msg_count,
5774 p_data => x_msg_data,
5775 p_encoded => fnd_api.g_false);
5776
5777 END Release_Tasks;
5778
5779 ------------------------------------------------------------------
5780 -- Procedure name : Validate_tasks_bef_production
5781 -- Type : Private
5782 -- Function : Validate the tasks before pushing the tasks to prodn.
5783 -- Parameters :
5784 --
5785 -- Standard OUT Parameters :
5786 -- x_return_status OUT VARCHAR2 Required
5787 -- x_msg_count OUT NUMBER Required
5788 -- x_msg_data OUT VARCHAR2 Required
5789 --
5790 -- Validate_tasks_bef_production Parameters:
5791 -- p_visit_id IN NUMBER Required
5792 -- p_tasks_tbl IN Task_Tbl_Type Required
5793 -- x_tasks_tbl OUT Task_Tbl_Type Required
5794 --
5795 -- Version :
5796 -- 30 November, 2007 RNAHATA Initial Version - 1.0
5797 -------------------------------------------------------------------
5798
5799 PROCEDURE Validate_tasks_bef_production(
5800 p_visit_id IN NUMBER,
5801 p_tasks_tbl IN Task_Tbl_Type,
5802 x_tasks_tbl OUT NOCOPY Task_Tbl_Type,
5803 x_return_status OUT NOCOPY VARCHAR2,
5804 x_msg_count OUT NOCOPY NUMBER,
5805 x_msg_data OUT NOCOPY VARCHAR2
5806 ) IS
5807
5808 --cursor to fetch the details of the tasks that have been pushe to production
5809 CURSOR c_task_dtls(x_vst_task_id IN NUMBER) IS
5810 SELECT mr_id,visit_id,visit_task_id,status_code,task_type_code,nvl(originating_task_id,0) as originating_task_id,
5811 summary_task_flag, inventory_item_id,item_organization_id,visit_task_number,end_date_time
5812 FROM ahl_visit_tasks_b
5813 WHERE visit_task_id = x_vst_task_id
5814 AND NVL(status_code,'X') in ('PLANNING')
5815 order by visit_task_id;
5816
5817 c_tsk_dtls_rec c_task_dtls%ROWTYPE;
5818
5819 --cursor to fetch the summary task id of the planned/unplanned task
5820 CURSOR c_summary_tsk_dtl (x_originating_tsk_id IN NUMBER) IS
5821 SELECT mr_id,visit_id,visit_task_id,status_code,task_type_code,nvl(originating_task_id,0) as originating_task_id,
5822 summary_task_flag, inventory_item_id,item_organization_id,visit_task_number,end_date_time
5823 FROM ahl_visit_tasks_b
5824 WHERE visit_task_id = x_originating_tsk_id
5825 AND NVL(status_code,'X') in ('PLANNING')
5826 AND task_type_code = 'SUMMARY';
5827
5828 c_summary_tsk_rec c_summary_tsk_dtl%ROWTYPE;
5829
5830 --cursor to fetch master work order for the visit
5831 CURSOR c_fet_master_wo (x_visit_id IN NUMBER) IS
5832 SELECT wo.workorder_id, wo.status_code, wip.scheduled_start_date,wip.scheduled_completion_date
5833 FROM ahl_visits_b v, ahl_workorders wo, wip_discrete_jobs wip
5834 WHERE v.visit_id = x_visit_id
5835 AND NVL(v.status_code,'X') = 'PARTIALLY RELEASED'
5836 AND v.visit_id = wo.visit_id
5837 AND wo.visit_task_id IS NULL
5838 AND wo.master_workorder_flag = 'Y'
5839 AND wip.wip_entity_id = wo.wip_entity_id
5840 AND wo.STATUS_CODE not in ('22','7');
5841
5842 c_mst_wo_visit_rec c_fet_master_wo%ROWTYPE;
5843
5844 -- Get all the Parent Task Dependencies.
5845 CURSOR get_parent_task_dependencies (x_vst_task_id IN NUMBER) IS
5846 SELECT P.visit_task_number , P.visit_task_id
5847 FROM ahl_visit_tasks_b P,
5848 ahl_task_links L
5849 WHERE P.visit_task_id = L.parent_task_id
5850 AND L.visit_task_id = x_vst_task_id;
5851
5852 -- Get all the Child Task Dependencies.
5853 CURSOR get_child_task_dependencies (x_vst_task_id IN NUMBER) IS
5854 SELECT C.visit_task_number ,C.visit_task_id
5855 FROM ahl_visit_tasks_b C,
5856 ahl_task_links L
5857 WHERE C.visit_task_id = L.visit_task_id
5858 AND L.parent_task_id = x_vst_task_id;
5859
5860 c_par_tech_dep_rec get_parent_task_dependencies%ROWTYPE;
5861 c_ch_tech_dep_rec get_child_task_dependencies%ROWTYPE;
5862
5863 /*cursor to fetch all the child MR's/tasks for the summary MR to ensure all the dtl tasks are pushed to production*/
5864 CURSOR c_dtl_task_sum (x_vst_task_id IN NUMBER) IS
5865 select mr_id,visit_id,visit_task_id,status_code,task_type_code,nvl(originating_task_id,0) as originating_task_id,
5866 summary_task_flag, inventory_item_id,item_organization_id,visit_task_number,end_date_time
5867 FROM ahl_visit_tasks_b
5868 WHERE NVL(status_code,'X') in ('PLANNING')
5869 START WITH visit_task_id = x_vst_task_id
5870 CONNECT BY originating_task_id = PRIOR visit_task_id
5871 order by visit_id,visit_task_id,mr_id;
5872
5873 c_dtl_task_sum_rec c_dtl_task_sum%ROWTYPE;
5874
5875 j NUMBER := 0;
5876 K NUMBER := 0;
5877 m NUMBER := 0;
5878 L_API_NAME CONSTANT VARCHAR2(30) := 'Validate_tasks_bef_production';
5879 L_DEBUG_KEY CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
5880 lp_originating_task_id ahl_visit_tasks_vl.originating_task_id%TYPE;
5881 curr_task BOOLEAN := FALSE;
5882 parent_task BOOLEAN := FALSE;
5883 parent_task_found_flag BOOLEAN := FALSE;
5884 child_task BOOLEAN := FALSE;
5885
5886 BEGIN
5887 IF (l_log_procedure >= l_log_current_level) THEN
5888 fnd_log.string(l_log_procedure,
5889 L_DEBUG_KEY ||'.begin',
5890 'At the start of PL SQL procedure. Visit Id = ' ||
5891 p_visit_id || ', p_tasks_tbl.COUNT = ' || p_tasks_tbl.COUNT);
5892 END IF;
5893
5894 -- Standard start of API savepoint
5895 SAVEPOINT Validate_tasks_bef_prodn_pvt;
5896
5897 -- Initialize API return status to success
5898 x_return_status := FND_API.G_RET_STS_SUCCESS;
5899
5900 --chk if the visit is released/partially released.
5901 OPEN c_fet_master_wo (p_visit_id);
5902 FETCH c_fet_master_wo INTO c_mst_wo_visit_rec;
5903 IF c_fet_master_wo%NOTFOUND THEN
5904 x_msg_count := FND_MSG_PUB.count_msg;
5905 IF (l_log_statement >= l_log_current_level) THEN
5906 fnd_log.string(l_log_statement,
5907 L_DEBUG_KEY,
5908 'Visit not released: ' || c_tsk_dtls_rec.visit_task_number);
5909 END IF;
5910 END IF;
5911 CLOSE c_fet_master_wo;
5912
5913 FOR i IN p_tasks_tbl.FIRST..p_tasks_tbl.LAST
5914 LOOP
5915 OPEN c_task_dtls(p_tasks_tbl(i).visit_task_id);
5916 FETCH c_task_dtls INTO c_tsk_dtls_rec;
5917 IF c_task_dtls%NOTFOUND THEN
5918 x_msg_count := FND_MSG_PUB.count_msg;
5919 IF (l_log_statement >= l_log_current_level) THEN
5920 fnd_log.string(l_log_statement,
5921 L_DEBUG_KEY,
5922 'Task is either not in planning status or Invalid - ' ||
5923 p_tasks_tbl(i).visit_task_id);
5924 END IF;
5925 CLOSE c_task_dtls;
5926 FND_MESSAGE.Set_Name(G_PM_PRODUCT_CODE,'AHL_VWP_INVALID_TSK_ID');
5927 Fnd_Message.SET_TOKEN('TASK_ID', p_tasks_tbl(i).visit_task_id);
5928 FND_MSG_PUB.ADD;
5929 RAISE FND_API.G_EXC_ERROR;
5930 END IF;
5931 CLOSE c_task_dtls;
5932
5933 /* if the visit is partially released, then the planned end time for the wo should not be
5934 exceed the scheduled end time */
5935 IF (c_mst_wo_visit_rec.scheduled_completion_date IS NOT NULL) AND
5936 (c_tsk_dtls_rec.end_date_time > c_mst_wo_visit_rec.scheduled_completion_date) THEN
5937 x_msg_count := FND_MSG_PUB.count_msg;
5938 IF (l_log_statement >= l_log_current_level) THEN
5939 fnd_log.string(l_log_statement,
5940 L_DEBUG_KEY,
5941 'Planned end time of the task is exceeding the scheduled completion time of the master WO: ' ||
5942 c_tsk_dtls_rec.visit_task_number);
5943 END IF;
5944 FND_MESSAGE.SET_NAME(G_PM_PRODUCT_CODE,'AHL_VWP_PET_EXCD_SCT');
5945 FND_MSG_PUB.ADD;
5946 RAISE FND_API.G_EXC_ERROR;
5947 END IF;
5948
5949 parent_task_found_flag := FALSE;
5950 /*when the summary task is selected then all child tasks/child mr's for the summary tasks/MR will be pushed to prodn.
5951 Fetches only summary tasks of MR's and not the manually added summary tasks.*/
5952
5953 IF (c_tsk_dtls_rec.task_type_code IN ('SUMMARY') AND c_tsk_dtls_rec.summary_task_flag = 'N') THEN
5954
5955 IF (x_tasks_tbl.COUNT > 0) THEN
5956 FOR m IN x_tasks_tbl.FIRST..x_tasks_tbl.LAST
5957 LOOP
5958 IF x_tasks_tbl(m).visit_task_id = c_tsk_dtls_rec.visit_task_id THEN
5959 parent_task_found_flag := TRUE;
5960 EXIT;
5961 END IF;
5962 END LOOP;
5963 END IF;
5964
5965 --inserts only if the summary task is not inserted already.
5966 IF NOT(parent_task_found_flag) THEN
5967 --this cursor fetches entire family tree of the selected MR with its children to be inserted.
5968 OPEN c_dtl_task_sum(c_tsk_dtls_rec.visit_task_id);
5969 LOOP
5970 FETCH c_dtl_task_sum INTO c_dtl_task_sum_rec;
5971 EXIT WHEN c_dtl_task_sum%NOTFOUND;
5972 --populating the output table with all the child parent MR's/tasks
5973 j := j + 1;
5974 x_tasks_tbl(j).visit_id := c_dtl_task_sum_rec.visit_id;
5975 x_tasks_tbl(j).visit_task_id := c_dtl_task_sum_rec.visit_task_id;
5976 x_tasks_tbl(j).inventory_item_id := c_dtl_task_sum_rec.inventory_item_id;
5977 x_tasks_tbl(j).item_organization_id := c_dtl_task_sum_rec.item_organization_id;
5978 x_tasks_tbl(j).mr_id := c_dtl_task_sum_rec.mr_id;
5979 x_tasks_tbl(j).task_type_code := c_dtl_task_sum_rec.task_type_code;
5980 x_tasks_tbl(j).task_status_code := c_dtl_task_sum_rec.status_code;
5981 x_tasks_tbl(j).originating_task_id := c_dtl_task_sum_rec.originating_task_id;
5982 x_tasks_tbl(j).visit_task_number := c_dtl_task_sum_rec.visit_task_number;
5983 END LOOP;
5984 CLOSE c_dtl_task_sum;
5985 END IF;
5986 END IF;
5987
5988 /*for each planned/unplanned/summary task ensure that the parent MR/task is selected.If not then throw
5989 an error message to the user asking him to select the parent MR*/
5990 IF (c_tsk_dtls_rec.task_type_code IN ('PLANNED','UNPLANNED', 'SUMMARY')) AND (c_tsk_dtls_rec.originating_task_id <> 0) THEN
5991
5992 --loop back to the parent MR to ensure that the child tasks/MR is also selected
5993 lp_originating_task_id := c_tsk_dtls_rec.originating_task_id;
5994
5995 LOOP
5996 parent_task_found_flag := FALSE;
5997
5998 --this cursor fetches the parent for each task
5999 OPEN c_summary_tsk_dtl(lp_originating_task_id);
6000 FETCH c_summary_tsk_dtl INTO c_summary_tsk_rec;
6001 CLOSE c_summary_tsk_dtl;
6002
6003 --locate the summary task from the selected task list
6004 FOR k IN p_tasks_tbl.FIRST..p_tasks_tbl.LAST
6005 LOOP
6006 --chk if the summary task for the task is also selected
6007 IF p_tasks_tbl(k).visit_task_id = c_summary_tsk_rec.visit_task_id THEN
6008 parent_task_found_flag := TRUE;
6009 EXIT;
6010 END IF;
6011 END LOOP;
6012
6013 IF NOT(parent_task_found_flag) THEN --if summary task is not selected then throw an error
6014 x_msg_count := FND_MSG_PUB.count_msg;
6015 IF (l_log_statement >= l_log_current_level) THEN
6016 fnd_log.string(l_log_statement,
6017 L_DEBUG_KEY,
6018 'Select the summary task for the task: ' ||
6019 c_tsk_dtls_rec.visit_task_number);
6020 END IF;
6021 FND_MESSAGE.Set_Name(G_PM_PRODUCT_CODE,'AHL_VWP_SEL_SUM_TSK');
6022 Fnd_Message.SET_TOKEN('TASK_NUMBER', c_tsk_dtls_rec.visit_task_number);
6023 FND_MSG_PUB.ADD;
6024 RAISE FND_API.G_EXC_ERROR;
6025 END IF;
6026
6027 lp_originating_task_id := c_summary_tsk_rec.originating_task_id;
6028
6029 EXIT WHEN NVL(lp_originating_task_id,0) = 0;
6030 END LOOP;
6031
6032 END IF; --planned/unplanned tasks
6033
6034 IF ((c_tsk_dtls_rec.task_type_code = 'UNASSOCIATED') OR
6035 (c_tsk_dtls_rec.task_type_code = 'SUMMARY' AND c_tsk_dtls_rec.summary_task_flag = 'Y')) THEN
6036 j := j + 1;
6037 x_tasks_tbl(j).visit_id := c_tsk_dtls_rec.visit_id;
6038 x_tasks_tbl(j).visit_task_id := c_tsk_dtls_rec.visit_task_id;
6039 x_tasks_tbl(j).inventory_item_id := c_tsk_dtls_rec.inventory_item_id;
6040 x_tasks_tbl(j).item_organization_id := c_tsk_dtls_rec.item_organization_id;
6041 x_tasks_tbl(j).mr_id := c_tsk_dtls_rec.mr_id;
6042 x_tasks_tbl(j).task_type_code := c_tsk_dtls_rec.task_type_code;
6043 x_tasks_tbl(j).task_status_code := c_tsk_dtls_rec.status_code;
6044 x_tasks_tbl(j).originating_task_id := c_tsk_dtls_rec.originating_task_id;
6045 END IF; --unassociated/summary
6046
6047 END LOOP; --for all selected tasks
6048
6049 -- chk for each task which has a technical dependency with other MR's or unassociated tasks
6050 FOR i IN x_tasks_tbl.FIRST..x_tasks_tbl.LAST
6051 LOOP
6052 parent_task := FALSE;
6053 child_task := FALSE;
6054
6055 OPEN get_parent_task_dependencies (x_tasks_tbl(i).visit_task_id);
6056 LOOP
6057 FETCH get_parent_task_dependencies INTO c_par_tech_dep_rec;
6058 IF get_parent_task_dependencies%NOTFOUND THEN
6059 x_msg_count := FND_MSG_PUB.count_msg;
6060 IF (l_log_statement >= l_log_current_level) THEN
6061 fnd_log.string(l_log_statement,
6062 L_DEBUG_KEY,
6063 'Parent Technical task dependency not found for the task - ' ||
6064 x_tasks_tbl(i).visit_task_number);
6065 END IF;
6066 EXIT;
6067 ELSE --when parent dependency is found chk if the associated MR/unassociated tasks are also selected.
6068 FOR j IN x_tasks_tbl.FIRST..x_tasks_tbl.LAST
6069 LOOP
6070 IF (x_tasks_tbl(j).visit_task_id = c_par_tech_dep_rec.visit_task_id) THEN
6071 parent_task := TRUE;
6072 EXIT;
6073 END IF;
6074 END LOOP;
6075
6076 IF NOT(parent_task) THEN --parent task not selected
6077 x_msg_count := FND_MSG_PUB.count_msg;
6078 IF (l_log_statement >= l_log_current_level) THEN
6079 fnd_log.string(l_log_statement,
6080 L_DEBUG_KEY,
6081 'Parent tasks on which the task ' ||
6082 x_tasks_tbl(i).visit_task_number ||
6083 ' is technically dependent has not been selected.'||
6084 'Please select the technically dependent tasks too');
6085 END IF;
6086 CLOSE get_parent_task_dependencies;
6087 FND_MESSAGE.Set_Name(G_PM_PRODUCT_CODE,'AHL_VWP_SEL_TECH_DEP');
6088 Fnd_Message.SET_TOKEN('TASK_NUMBER', x_tasks_tbl(i).visit_task_number);
6089 FND_MSG_PUB.ADD;
6090 RAISE FND_API.G_EXC_ERROR;
6091 END IF; --parent task not selected
6092 END IF;
6093 END LOOP; --loop through the parent dependent records
6094 CLOSE get_parent_task_dependencies;
6095
6096 OPEN get_child_task_dependencies (x_tasks_tbl(i).visit_task_id);
6097 LOOP --loop through the child dependent records
6098 FETCH get_child_task_dependencies INTO c_ch_tech_dep_rec;
6099 IF get_child_task_dependencies%NOTFOUND THEN
6100 x_msg_count := FND_MSG_PUB.count_msg;
6101 IF (l_log_statement >= l_log_current_level) THEN
6102 fnd_log.string(l_log_statement,
6103 L_DEBUG_KEY,
6104 'Child Technical task dependency not found for the task - ' || x_tasks_tbl(i).visit_task_number);
6105 END IF;
6106 EXIT;
6107 ELSE --when child dependency is found chk if the associated MR/unassociated tasks are also selected.
6108 FOR j IN x_tasks_tbl.FIRST..x_tasks_tbl.LAST
6109 LOOP
6110 IF (x_tasks_tbl(j).visit_task_id = c_ch_tech_dep_rec.visit_task_id) THEN
6111 child_task := TRUE;
6112 EXIT;
6113 END IF;
6114 END LOOP;
6115
6116 IF NOT(child_task) THEN
6117 x_msg_count := FND_MSG_PUB.count_msg;
6118 IF (l_log_statement >= l_log_current_level) THEN
6119 fnd_log.string(l_log_statement,
6120 L_DEBUG_KEY,
6121 'Child tasks on which the task ' || x_tasks_tbl(i).visit_task_number || ' is technically dependent has not been selected.'||
6122 'Please select the technically dependent tasks too');
6123 END IF;
6124 CLOSE get_child_task_dependencies;
6125 FND_MESSAGE.Set_Name(G_PM_PRODUCT_CODE,'AHL_VWP_SEL_TECH_DEP');
6126 Fnd_Message.SET_TOKEN('TASK_NUMBER', x_tasks_tbl(i).visit_task_number);
6127 FND_MSG_PUB.ADD;
6128 RAISE FND_API.G_EXC_ERROR;
6129 END IF; --curr task not selected
6130 END IF;
6131 END LOOP; --loop through the child dependent records
6132 CLOSE get_child_task_dependencies;
6133
6134 END LOOP;
6135
6136 IF (l_log_procedure >= l_log_current_level) THEN
6137 fnd_log.string(l_log_procedure,
6138 L_DEBUG_KEY ||'.end',
6139 'At the end of PL SQL procedure. x_tasks_tbl.COUNT = ' || x_tasks_tbl.COUNT);
6140 END IF;
6141
6142 EXCEPTION
6143 WHEN FND_API.G_EXC_ERROR THEN
6144 x_return_status := FND_API.G_RET_STS_ERROR;
6145 ROLLBACK TO Validate_tasks_bef_prodn_pvt;
6146 FND_MSG_PUB.count_and_get(p_count => x_msg_count,
6147 p_data => x_msg_data,
6148 p_encoded => fnd_api.g_false);
6149
6150 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
6151 x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
6152 ROLLBACK TO Validate_tasks_bef_prodn_pvt;
6153 Fnd_Msg_Pub.count_and_get (
6154 p_encoded => Fnd_Api.g_false,
6155 p_count => x_msg_count,
6156 p_data => x_msg_data);
6157
6158 WHEN OTHERS THEN
6159 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6160 ROLLBACK TO Validate_tasks_bef_prodn_pvt;
6161 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
6162 fnd_msg_pub.add_exc_msg(p_pkg_name => G_PKG_NAME,
6163 p_procedure_name => 'Validate_tasks_bef_production',
6164 p_error_text => SUBSTR(SQLERRM,1,500));
6165 END IF;
6166 FND_MSG_PUB.count_and_get(p_count => x_msg_count,
6167 p_data => x_msg_data,
6168 p_encoded => fnd_api.g_false);
6169
6170 END Validate_tasks_bef_production;
6171
6172 -------------------------------------------------------------------
6173 -- Procedure name : Push_tasks_to_production
6174 -- Type : Private
6175 -- Function : Push the selected tasks to production.
6176 -- Parameters :
6177 --
6178 -- Standard IN Parameters :
6179 -- p_api_version IN NUMBER Required
6180 -- p_init_msg_list IN VARCHAR2 Default FND_API.G_FALSE
6181 -- p_validation_level IN NUMBER Default FND_API.G_VALID_LEVEL_FULL
6182 -- p_module_type IN VARCHAR2 Default Null
6183 --
6184 -- Standard OUT Parameters :
6185 -- x_return_status OUT VARCHAR2 Required
6186 -- x_msg_count OUT NUMBER Required
6187 -- x_msg_data OUT VARCHAR2 Required
6188 --
6189 -- Push_tasks_to_production Parameters:
6190 -- p_module_type IN VARCHAR2 Default = NULL
6191 -- p_visit_id IN NUMBER Required
6192 -- p_tasks_tbl IN Task_Tbl_Type Required
6193 -- p_release_flag IN VARCHAR2 Default = 'N'
6194 --
6195 -- Version :
6196 -- 30 November, 2007 RNAHATA Initial Version - 1.0
6197 -------------------------------------------------------------------
6198
6199 PROCEDURE Push_tasks_to_production(
6200 p_api_version IN NUMBER,
6201 p_init_msg_list IN VARCHAR2 := Fnd_Api.g_false,
6202 p_validation_level IN NUMBER := Fnd_Api.g_valid_level_full,
6203 p_module_type IN VARCHAR2 := Null,
6204 p_visit_id IN NUMBER,
6205 p_tasks_tbl IN Task_Tbl_Type,
6206 p_release_flag IN VARCHAR2 ,
6207 x_return_status OUT NOCOPY VARCHAR2,
6208 x_msg_count OUT NOCOPY NUMBER,
6209 x_msg_data OUT NOCOPY VARCHAR2
6210 ) IS
6211
6212 --check if the visit master wo exists
6213 CURSOR c_fet_master_wo (x_visit_id IN NUMBER) IS
6214 SELECT 1 FROM ahl_workorders wo
6215 WHERE wo.visit_id = x_visit_id
6216 AND wo.visit_task_id IS NULL
6217 AND wo.master_workorder_flag = 'Y';
6218
6219 --fetch master work order for the visit
6220 CURSOR c_visit_master_wo (x_visit_id IN NUMBER) IS
6221 SELECT wo.workorder_id, wo.status_code, wip.scheduled_start_date,wip.scheduled_completion_date,wo.object_version_number
6222 FROM ahl_visits_b v, ahl_workorders wo, wip_discrete_jobs wip
6223 WHERE v.visit_id = x_visit_id
6224 AND v.visit_id = wo.visit_id
6225 AND wo.visit_task_id IS NULL
6226 AND wo.master_workorder_flag = 'Y'
6227 AND wip.wip_entity_id = wo.wip_entity_id
6228 AND wo.status_code not in ('22','7');
6229
6230 c_mst_wo_visit_rec c_visit_master_wo%ROWTYPE;
6231
6232 --fetch visit details
6233 CURSOR c_visit_dtl (x_visit_id IN NUMBER) IS
6234 SELECT * FROM ahl_visits_vl
6235 WHERE visit_id = x_visit_id;
6236
6237 c_visit_dtl_rec c_visit_dtl%ROWTYPE;
6238
6239 --fetch task details
6240 CURSOR c_visit_task_dtl (x_visit_task_id IN NUMBER) IS
6241 SELECT * FROM ahl_visit_tasks_vl
6242 WHERE visit_task_id = x_visit_task_id;
6243
6244 c_visit_tsk_dtl_rec c_visit_task_dtl%ROWTYPE;
6245
6246 --check if the task wo exists
6247 CURSOR c_fet_task_wo (x_visit_id IN NUMBER, x_visit_task_id IN NUMBER) IS
6248 SELECT 1 FROM ahl_workorders wo
6249 WHERE wo.visit_id = x_visit_id
6250 AND wo.visit_task_id = x_visit_task_id
6251 AND wo.visit_task_id IS NOT NULL;
6252
6253 --fetch work order for the task
6254 CURSOR c_task_wo (x_visit_id IN NUMBER,x_visit_task_id IN NUMBER) IS
6255 SELECT v.visit_task_id, wo.workorder_id, wo.status_code, wip.scheduled_start_date,wip.scheduled_completion_date,wo.object_version_number
6256 FROM ahl_visit_tasks_b v, ahl_workorders wo, wip_discrete_jobs wip
6257 WHERE v.visit_id = x_visit_id
6258 AND v.visit_id = wo.visit_id
6259 AND wo.visit_task_id IS NOT NULL
6260 AND wo.visit_task_id = x_visit_task_id
6261 AND wip.wip_entity_id = wo.wip_entity_id
6262 AND wo.status_code not in ('22','7');
6263
6264 c_task_wo_rec c_task_wo%ROWTYPE;
6265
6266 --fetch summary task flag for the task
6267 CURSOR c_fet_sum_task_flg (x_visit_id IN NUMBER, x_visit_task_id IN NUMBER) IS
6268 SELECT summary_task_flag FROM ahl_visit_tasks_b
6269 WHERE visit_task_id = x_visit_task_id;
6270
6271 --fetch all the tasks in the visit
6272 CURSOR c_all_task_dtl (x_visit_id IN NUMBER) IS
6273 SELECT count(visit_task_id) FROM ahl_visit_tasks_b
6274 WHERE visit_id = x_visit_id
6275 AND NVL(status_code,'X') IN ('PLANNING');
6276
6277 --get summary task start, end time
6278 CURSOR get_summary_task_times_csr(x_task_id IN NUMBER)IS
6279 SELECT min(start_date_time), max(end_date_time)
6280 FROM ahl_visit_tasks_b VST
6281 START WITH visit_task_id = x_task_id
6282 AND NVL(VST.status_code, 'Y') <> 'DELETED'
6283 CONNECT BY originating_task_id = PRIOR visit_task_id;
6284
6285 --find Route Id from MR Routes view
6286 CURSOR c_route (x_id IN NUMBER) IS
6287 SELECT Route_Id FROM AHL_MR_ROUTES_V
6288 WHERE MR_ROUTE_ID = x_id;
6289
6290 --check if the visit master wo exists
6291 CURSOR c_fet_mas_wo_dtls (x_visit_id IN NUMBER) IS
6292 SELECT actual_start_date,actual_end_date
6293 FROM ahl_workorders wo
6294 WHERE wo.visit_id = x_visit_id
6295 AND wo.visit_task_id IS NULL
6296 AND wo.master_workorder_flag = 'Y';
6297
6298 c_fet_mas_wo_dtl_rec c_fet_mas_wo_dtls%ROWTYPE;
6299
6300 --Inventory item id and instance id to be defaulted when
6301 --the item and instance are not specified at the header level
6302 CURSOR default_task_inst_dtls(c_task_id IN NUMBER) IS
6303 SELECT inventory_item_id,instance_id
6304 FROM ahl_visit_tasks_b
6305 WHERE visit_task_id = c_task_id;
6306
6307 def_task_inst_rec default_task_inst_dtls%ROWTYPE;
6308
6309 /*B5758813 - rnahata - fetches the route information for updating workorder
6310 description for tasks created from Routes */
6311 CURSOR get_wo_dtls_for_mrtasks_cur (p_task_id IN NUMBER) IS
6312 SELECT ar.route_no||'.'||substr(ar.title,1,(240 - (length(ar.route_no) + 1))) workorder_description
6313 FROM ahl_routes_vl ar,ahl_visit_tasks_b avt, ahl_mr_routes mrr
6314 WHERE avt.visit_task_id = p_task_id
6315 and nvl(avt.status_code,'Y') = 'PLANNING'
6316 and avt.mr_route_id = mrr.mr_route_id
6317 and mrr.route_id = ar.route_id;
6318
6319 get_wo_dtls_for_mrtasks_rec get_wo_dtls_for_mrtasks_cur%ROWTYPE;
6320
6321 --get SR MWO details.
6322 CURSOR c_get_sr_mwo_dtls(p_sr_task_id IN NUMBER) IS
6323 SELECT WDJ.WIP_ENTITY_ID,
6324 AWO.WORKORDER_ID,
6325 AWO.OBJECT_VERSION_NUMBER,
6326 WDJ.SCHEDULED_START_DATE,
6327 WDJ.SCHEDULED_COMPLETION_DATE
6328 FROM AHL_WORKORDERS AWO,
6329 WIP_DISCRETE_JOBS WDJ
6330 WHERE WDJ.WIP_ENTITY_ID = AWO.WIP_ENTITY_ID
6331 AND AWO.VISIT_TASK_ID = p_sr_task_id
6332 AND AWO.MASTER_WORKORDER_FLAG = 'Y'
6333 AND AWO.STATUS_CODE <> 17;
6334
6335 l_sr_mwo_rec c_get_sr_mwo_dtls%ROWTYPE;
6336
6337 --get SR task details
6338 CURSOR c_get_sr_task_dtls(p_sr_task_id IN NUMBER) IS
6339 SELECT * FROM AHL_VISIT_TASKS_B vst
6340 WHERE vst.TASK_TYPE_CODE = 'SUMMARY'
6341 AND vst.MR_ID IS NULL
6342 AND vst.SERVICE_REQUEST_ID =
6343 (SELECT vst1.SERVICE_REQUEST_ID
6344 FROM ahl_visit_tasks_b vst1
6345 WHERE vst1.visit_task_id = p_sr_task_id);
6346
6347 --check if visit has planned tasks
6348 CURSOR c_visit_has_planned_tasks(p_visit_id IN NUMBER) IS
6349 SELECT 1 FROM ahl_visit_tasks_b
6350 WHERE visit_id = p_visit_id
6351 AND status_code = 'PLANNING';
6352
6353 CURSOR c_visit_time_matches_MWO_time(p_visit_id IN NUMBER) IS
6354 SELECT 1
6355 FROM ahl_visits_b vst, ahl_workorders wo, wip_discrete_jobs wdj
6356 WHERE vst.visit_id = p_visit_id
6357 AND wo.visit_id = vst.visit_id
6358 AND wo.MASTER_WORKORDER_FLAG = 'Y'
6359 AND wo.visit_task_id IS NULL
6360 AND wdj.wip_entity_id = wo.wip_entity_id
6361 AND vst.start_date_time = wdj.scheduled_start_date
6362 AND vst.close_date_time = wdj.scheduled_completion_date;
6363
6364 l_temp_num1 NUMBER := NULL;
6365 l_temp_num2 NUMBER := NULL;
6366 l_sr_task_dtls_rec c_get_sr_task_dtls%ROWTYPE;
6367 l_wo_tbl_count NUMBER := 0;
6368 l_sch_start_date DATE;
6369 l_sch_end_date DATE;
6370 i NUMBER := 0;
6371 l_chk_mst_wo NUMBER := 0;
6372 l_chk_task_wo NUMBER := 0;
6373 L_API_NAME CONSTANT VARCHAR2(30) := 'Push_tasks_to_production';
6374 L_API_VERSION CONSTANT NUMBER := 1.0;
6375 L_DEBUG_KEY CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
6376 l_msg_data VARCHAR2(2000);
6377 l_return_status VARCHAR2(1);
6378 l_msg_count NUMBER;
6379 l_prd_workorder_tbl AHL_PRD_WORKORDER_PVT.PRD_WORKORDER_TBL;
6380 idx NUMBER := 0;
6381 l_prd_workorder_rel_tbl AHL_PRD_WORKORDER_PVT.prd_workorder_rel_tbl;
6382 l_manual_summ_task_flag VARCHAR2(1) ;
6383 l_task_cnt NUMBER := 0;
6384 l_firm_planned_flag VARCHAR2(1) := FND_PROFILE.value('AHL_PRD_FIRM_PLANNED_FLAG');
6385
6386 BEGIN
6387 IF (l_log_procedure >= l_log_current_level) THEN
6388 fnd_log.string(l_log_procedure,
6389 L_DEBUG_KEY ||'.begin',
6390 'At the start of PL SQL procedure. Visit Id = ' ||
6391 p_visit_id || ', p_tasks_tbl.COUNT = ' || p_tasks_tbl.COUNT);
6392 END IF;
6393
6394 -- Standard start of API savepoint
6395 SAVEPOINT Push_tasks_to_prodn_pvt;
6396
6397 -- Initialize message list if p_init_msg_list is set to TRUE
6398 IF FND_API.To_Boolean(p_init_msg_list) THEN
6399 FND_MSG_PUB.Initialize;
6400 END IF;
6401
6402 -- Initialize API return status to success
6403 x_return_status := FND_API.G_RET_STS_SUCCESS;
6404
6405 IF NOT FND_API.COMPATIBLE_API_CALL(l_api_version,
6406 p_api_version,
6407 l_api_name,G_PKG_NAME)
6408 THEN
6409 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
6410 END IF;
6411
6412 IF (l_log_statement >= l_log_current_level) THEN
6413 fnd_log.string(l_log_statement,
6414 L_DEBUG_KEY,
6415 'Before calling INTEGRATE_TO_PROJECTS for Visit Id ' || p_visit_id);
6416 END IF;
6417
6418 --create the project id for the visit.
6419 AHL_VWP_PROJ_PROD_PVT.Integrate_to_Projects
6420 (p_api_version => l_api_version,
6421 p_init_msg_list => p_init_msg_list,
6422 p_commit => 'F',
6423 p_validation_level => p_validation_level,
6424 p_module_type => p_module_type,
6425 p_visit_id => p_visit_id,
6426 x_return_status => l_return_status,
6427 x_msg_count => l_msg_count,
6428 x_msg_data => x_msg_data);
6429
6430 IF (l_log_statement >= l_log_current_level) THEN
6431 fnd_log.string(l_log_statement,
6432 L_DEBUG_KEY,
6433 'After calling Integrate_to_Projects. l_return_status = ' || l_return_status);
6434 END IF;
6435
6436 IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
6437 x_msg_count := FND_MSG_PUB.count_msg;
6438 IF (l_log_statement >= l_log_current_level) THEN
6439 fnd_log.string(l_log_statement,
6440 L_DEBUG_KEY,
6441 'Errors from Integrate_to_Projects. Message count: ' || x_msg_count);
6442 END IF;
6443 IF l_return_status = FND_API.G_RET_STS_ERROR THEN
6444 RAISE FND_API.G_EXC_ERROR;
6445 ELSE
6446 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
6447 END IF;
6448 END IF;
6449
6450 --chk if master wo for the visit already exists
6451 OPEN c_fet_master_wo(p_visit_id);
6452 FETCH c_fet_master_wo INTO l_chk_mst_wo;
6453 CLOSE c_fet_master_wo;
6454
6455 OPEN c_visit_master_wo(p_visit_id);
6456 FETCH c_visit_master_wo INTO c_mst_wo_visit_rec;
6457 CLOSE c_visit_master_wo;
6458
6459 --fetch the visit details
6460 OPEN c_visit_dtl(p_visit_id);
6461 FETCH c_visit_dtl INTO c_visit_dtl_rec;
6462 CLOSE c_visit_dtl;
6463
6464 --fetch the count of tasks in planning status.
6465 OPEN c_all_task_dtl (p_visit_id);
6466 FETCH c_all_task_dtl INTO l_task_cnt;
6467 CLOSE c_all_task_dtl;
6468
6469 idx := idx+1;
6470 l_prd_workorder_tbl(idx).SCHEDULED_START_DATE := c_visit_dtl_rec.start_date_time;
6471 l_prd_workorder_tbl(idx).SCHEDULED_END_DATE := c_visit_dtl_rec.close_date_time;
6472 l_prd_workorder_tbl(idx).BATCH_ID := c_visit_dtl_rec.VISIT_NUMBER;
6473 l_prd_workorder_tbl(idx).HEADER_ID := 0; -- Visit
6474 IF (nvl(l_chk_mst_wo,0) = 1) THEN --Visit master wo already exists
6475 l_prd_workorder_tbl(idx).DML_OPERATION := 'U';
6476 l_prd_workorder_tbl(idx).WORKORDER_ID := c_mst_wo_visit_rec.workorder_id;
6477 l_prd_workorder_tbl(idx).OBJECT_VERSION_NUMBER := c_mst_wo_visit_rec.object_version_number;
6478 IF (c_mst_wo_visit_rec.status_code <> 3) THEN
6479 IF (p_release_flag = 'Y') THEN
6480 -- change status from UNRELEASED/DRAFT to RELEASED
6481 l_prd_workorder_tbl(idx).STATUS_CODE := '3'; -- Released
6482 -- Visit Master Work Order should ALWAYS be FIRM (not dependent on profile)
6483 l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG := 1; -- Firm
6484 ELSIF c_mst_wo_visit_rec.status_code = '17' THEN
6485 -- Master workorder was in Draft status, make it UNRELEASED now
6486 l_prd_workorder_tbl(idx).STATUS_CODE := '1'; -- Unreleased
6487 -- Visit Master Work Order should ALWAYS be FIRM (not dependent on profile)
6488 l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG := 1; -- Firm
6489 END IF;
6490 END IF; --master work order status is not 3
6491 ELSE -- visit master workorder does not exist, create a master wo
6492 l_prd_workorder_tbl(idx).DML_OPERATION := 'C';
6493 -- Visit Master Work Order should ALWAYS be FIRM (not dependent on profile)
6494 l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG := 1; -- Firm
6495 l_prd_workorder_tbl(idx).MASTER_WORKORDER_FLAG := 'Y';
6496 l_prd_workorder_tbl(idx).VISIT_ID := p_visit_id;
6497 l_prd_workorder_tbl(idx).ORGANIZATION_ID := c_visit_dtl_rec.organization_id;
6498 l_prd_workorder_tbl(idx).PROJECT_ID := c_visit_dtl_rec.project_id;
6499 l_prd_workorder_tbl(idx).DEPARTMENT_ID := c_visit_dtl_rec.department_id ;
6500 IF p_release_flag = 'Y' THEN
6501 l_prd_workorder_tbl(idx).STATUS_CODE := '3'; -- Released
6502 ELSE
6503 l_prd_workorder_tbl(idx).STATUS_CODE := '1'; -- Unreleased
6504 END IF;
6505 IF (c_visit_dtl_rec.inventory_item_id IS NULL AND c_visit_dtl_rec.item_instance_id IS NULL) THEN
6506 /*When the unit is not specified at the visit level, fetch the first task's inventory_item_id
6507 and the instance_id from the list of user selected tasks.This inventory_item_id/instance_id
6508 will be used in the creation of master wo for the visit.*/
6509 OPEN default_task_inst_dtls(p_tasks_tbl(p_tasks_tbl.FIRST).visit_task_id);
6510 FETCH default_task_inst_dtls INTO def_task_inst_rec;
6511 CLOSE default_task_inst_dtls;
6512 l_prd_workorder_tbl(idx).INVENTORY_ITEM_ID := def_task_inst_rec.inventory_item_id;
6513 l_prd_workorder_tbl(idx).ITEM_INSTANCE_ID := def_task_inst_rec.instance_id;
6514 ELSE
6515 l_prd_workorder_tbl(idx).INVENTORY_ITEM_ID := c_visit_dtl_rec.inventory_item_id;
6516 l_prd_workorder_tbl(idx).ITEM_INSTANCE_ID := c_visit_dtl_rec.item_instance_id;
6517 END IF;
6518 l_prd_workorder_tbl(idx).JOB_DESCRIPTION := c_visit_dtl_rec.visit_name ;
6519 END IF; --visit master workorder exists or not
6520
6521 FOR i in p_tasks_tbl.FIRST..p_tasks_tbl.LAST LOOP --for all tasks
6522
6523 OPEN c_fet_sum_task_flg(p_visit_id, p_tasks_tbl(i).visit_task_id);
6524 FETCH c_fet_sum_task_flg INTO l_manual_summ_task_flag;
6525 CLOSE c_fet_sum_task_flg;
6526
6527 IF (l_manual_summ_task_flag = 'Y') THEN
6528 -- No work order will be created for manually created summary task
6529 -- Just update the task status to Released.
6530 UPDATE ahl_visit_tasks_b
6531 SET status_code = 'RELEASED'
6532 WHERE visit_task_id = p_tasks_tbl(i).visit_task_id;
6533
6534 ELSE
6535 --check if the wo exists for the task
6536 OPEN c_fet_task_wo(p_visit_id, p_tasks_tbl(i).visit_task_id);
6537 FETCH c_fet_task_wo INTO l_chk_task_wo;
6538 CLOSE c_fet_task_wo;
6539
6540 --fetch the task details
6541 OPEN c_visit_task_dtl(p_tasks_tbl(i).visit_task_id);
6542 FETCH c_visit_task_dtl INTO c_visit_tsk_dtl_rec;
6543 CLOSE c_visit_task_dtl;
6544
6545 --fetch the workorder details for the task
6546 OPEN c_task_wo(p_visit_id , p_tasks_tbl(i).visit_task_id);
6547 FETCH c_task_wo INTO c_task_wo_rec;
6548 CLOSE c_task_wo;
6549
6550 IF (nvl(l_chk_task_wo,0) = 1) THEN --task wo for the visit already exists
6551 IF (c_task_wo_rec.status_code = 17) THEN -- Status is Draft
6552 idx := idx+1;
6553 l_prd_workorder_tbl(idx).dml_operation := 'U';
6554 l_prd_workorder_tbl(idx).workorder_id := c_task_wo_rec.workorder_id;
6555 l_prd_workorder_tbl(idx).object_version_number := c_task_wo_rec.object_version_number;
6556 l_prd_workorder_tbl(idx).item_instance_id := c_visit_tsk_dtl_rec.instance_id ;
6557 l_prd_workorder_tbl(idx).BATCH_ID := c_visit_dtl_rec.visit_number;
6558 l_prd_workorder_tbl(idx).HEADER_ID := c_visit_tsk_dtl_rec.visit_task_number;
6559 IF (p_release_flag = 'Y') THEN
6560 l_prd_workorder_tbl(idx).status_code := '3'; -- Released
6561 ELSE
6562 l_prd_workorder_tbl(idx).status_code := '1'; -- UnReleased
6563 END IF;
6564 IF (l_firm_planned_flag IS NOT NULL AND l_firm_planned_flag = '2') THEN
6565 l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG := 2; -- Planned
6566 ELSE
6567 l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG := 1; -- Firm
6568 END IF;
6569 -- If summary task, use the min,max of sub tasks
6570 IF (c_visit_tsk_dtl_rec.task_type_code = 'SUMMARY') THEN
6571 OPEN get_summary_task_times_csr(c_visit_tsk_dtl_rec.visit_task_id);
6572 FETCH get_summary_task_times_csr
6573 INTO l_prd_workorder_tbl(idx).SCHEDULED_START_DATE,
6574 l_prd_workorder_tbl(idx).SCHEDULED_END_DATE;
6575 CLOSE get_summary_task_times_csr;
6576 ELSE
6577 l_prd_workorder_tbl(idx).scheduled_start_date := c_visit_tsk_dtl_rec.start_date_time;
6578 l_prd_workorder_tbl(idx).scheduled_end_date := c_visit_tsk_dtl_rec.end_date_time;
6579 END IF;
6580 /*B5758813 - rnahata - For summary tasks (both manual and MR summary tasks)
6581 and unassociated tasks the task name is passed as the workorder description.
6582 And for the Route tasks, the route number concatenated with the route title is
6583 passed as workorder description.*/
6584 IF (c_visit_tsk_dtl_rec.task_type_code IN ('SUMMARY','UNASSOCIATED')) THEN
6585 l_prd_workorder_tbl(idx).JOB_DESCRIPTION := c_visit_tsk_dtl_rec.visit_task_name;
6586 ELSE
6587 OPEN get_wo_dtls_for_mrtasks_cur(c_visit_tsk_dtl_rec.visit_task_id);
6588 FETCH get_wo_dtls_for_mrtasks_cur INTO get_wo_dtls_for_mrtasks_rec;
6589 CLOSE get_wo_dtls_for_mrtasks_cur;
6590 l_prd_workorder_tbl(idx).JOB_DESCRIPTION := get_wo_dtls_for_mrtasks_rec.workorder_description;
6591 END IF;
6592 END IF; -- WO Status is Draft
6593 ELSE --work order does not exist for this task
6594 -- Create a new work order
6595 idx := idx+1;
6596 l_prd_workorder_tbl(idx).DML_OPERATION := 'C';
6597 IF p_release_flag = 'Y' THEN
6598 l_prd_workorder_tbl(idx).STATUS_CODE := '3'; -- Released
6599 ELSE
6600 l_prd_workorder_tbl(idx).STATUS_CODE := '1'; -- Unreleased
6601 END IF;
6602 IF (l_firm_planned_flag IS NOT NULL AND l_firm_planned_flag = '2') THEN
6603 l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG := 2; -- Planned
6604 ELSE
6605 l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG := 1; -- Firm
6606 END IF;
6607 IF (c_visit_tsk_dtl_rec.task_type_code = 'SUMMARY') THEN
6608 l_prd_workorder_tbl(idx).MASTER_WORKORDER_FLAG := 'Y';
6609 ELSE
6610 l_prd_workorder_tbl(idx).MASTER_WORKORDER_FLAG := 'N';
6611 END IF;
6612
6613 l_prd_workorder_tbl(idx).BATCH_ID := c_visit_dtl_rec.visit_number;
6614 l_prd_workorder_tbl(idx).HEADER_ID := c_visit_tsk_dtl_rec.visit_task_number;
6615 l_prd_workorder_tbl(idx).VISIT_ID := p_visit_id;
6616 l_prd_workorder_tbl(idx).ORGANIZATION_ID := c_visit_dtl_rec.organization_id;
6617 l_prd_workorder_tbl(idx).PROJECT_ID := c_visit_dtl_rec.project_id;
6618 l_prd_workorder_tbl(idx).INVENTORY_ITEM_ID := c_visit_tsk_dtl_rec.inventory_item_id ;
6619 l_prd_workorder_tbl(idx).ITEM_INSTANCE_ID := c_visit_tsk_dtl_rec.instance_id ;
6620 l_prd_workorder_tbl(idx).VISIT_TASK_ID := c_visit_tsk_dtl_rec.visit_task_id ;
6621 l_prd_workorder_tbl(idx).VISIT_TASK_NUMBER := c_visit_tsk_dtl_rec.visit_task_number ;
6622 l_prd_workorder_tbl(idx).PROJECT_TASK_ID := c_visit_tsk_dtl_rec.project_task_id ;
6623
6624 /*B5758813 - rnahata - For summary tasks (both manual and MR summary tasks)
6625 and unassociated tasks, the task name is passed as the workorder description.
6626 And for the MR tasks, the route number concatenated with the route title is
6627 passed as workorder description.*/
6628 IF (c_visit_tsk_dtl_rec.task_type_code IN ('SUMMARY','UNASSOCIATED')) THEN
6629 l_prd_workorder_tbl(idx).JOB_DESCRIPTION := c_visit_tsk_dtl_rec.visit_task_name;
6630 ELSE
6631 OPEN get_wo_dtls_for_mrtasks_cur(c_visit_tsk_dtl_rec.visit_task_id);
6632 FETCH get_wo_dtls_for_mrtasks_cur INTO get_wo_dtls_for_mrtasks_rec;
6633 CLOSE get_wo_dtls_for_mrtasks_cur;
6634 l_prd_workorder_tbl(idx).JOB_DESCRIPTION := get_wo_dtls_for_mrtasks_rec.workorder_description;
6635 END IF;
6636
6637 IF c_visit_tsk_dtl_rec.mr_route_id IS NOT NULL AND c_visit_tsk_dtl_rec.mr_route_id <> FND_API.g_miss_num THEN
6638 OPEN c_route (c_visit_tsk_dtl_rec.mr_route_id);
6639 FETCH c_route INTO l_prd_workorder_tbl(idx).ROUTE_ID;
6640 CLOSE c_route;
6641 ELSE
6642 l_prd_workorder_tbl(idx).ROUTE_ID := Null;
6643 END IF;
6644
6645 IF c_visit_tsk_dtl_rec.department_id IS NOT NULL AND c_visit_tsk_dtl_rec.department_id <> FND_API.g_miss_num THEN
6646 l_prd_workorder_tbl(idx).DEPARTMENT_ID := c_visit_tsk_dtl_rec.department_id ;
6647 ELSE
6648 l_prd_workorder_tbl(idx).DEPARTMENT_ID := c_visit_dtl_rec.department_id ;
6649 END IF;
6650
6651 -- If summary task, use the min,max of sub tasks
6652 IF (c_visit_tsk_dtl_rec.task_type_code = 'SUMMARY') THEN
6653 OPEN get_summary_task_times_csr(c_visit_tsk_dtl_rec.visit_task_id);
6654 FETCH get_summary_task_times_csr INTO l_prd_workorder_tbl(idx).SCHEDULED_START_DATE,
6655 l_prd_workorder_tbl(idx).SCHEDULED_END_DATE;
6656 CLOSE get_summary_task_times_csr;
6657 ELSE
6658 l_prd_workorder_tbl(idx).SCHEDULED_START_DATE := c_visit_tsk_dtl_rec.START_DATE_TIME;
6659 l_prd_workorder_tbl(idx).SCHEDULED_END_DATE := c_visit_tsk_dtl_rec.END_DATE_TIME;
6660 END IF;
6661 END IF; --work order exists or not for this task
6662
6663 IF (l_log_statement >= l_log_current_level) THEN
6664 fnd_log.string(l_log_statement,
6665 L_DEBUG_KEY,
6666 'Before calling Get_Task_Relationships for task id: ' ||p_tasks_tbl(i).visit_task_id);
6667 END IF;
6668
6669 AHL_VWP_PROJ_PROD_PVT.Get_Task_Relationships
6670 ( p_visit_id => p_visit_id,
6671 p_visit_number => c_visit_dtl_rec.visit_number,
6672 p_visit_task_id => c_visit_tsk_dtl_rec.visit_task_id,
6673 p_x_relationship_tbl => l_prd_workorder_rel_tbl
6674 );
6675
6676 IF (l_log_statement >= l_log_current_level) THEN
6677 fnd_log.string(l_log_statement,
6678 L_DEBUG_KEY,
6679 'After calling Get_Task_Relationships');
6680 END IF;
6681 END IF; -- Task is Manually Created Summary Task or not
6682 END LOOP; -- For all tasks in p_tasks_tbl
6683
6684 --first get the task relationships for the tasks, then collect the dependencies.
6685 IF (l_log_statement >= l_log_current_level) THEN
6686 fnd_log.string(l_log_statement,
6687 L_DEBUG_KEY,
6688 'Before calling Get_Task_Dependencies for tasks');
6689 END IF;
6690
6691 FOR i IN p_tasks_tbl.FIRST..p_tasks_tbl.LAST LOOP
6692 AHL_VWP_PROJ_PROD_PVT.Get_Task_Dependencies
6693 (
6694 p_visit_number => c_visit_dtl_rec.visit_number,
6695 p_visit_task_id => p_tasks_tbl(i).visit_task_id,
6696 p_visit_task_number => p_tasks_tbl(i).visit_task_number,
6697 p_x_relationship_tbl => l_prd_workorder_rel_tbl
6698 );
6699
6700 IF (l_log_statement >= l_log_current_level) THEN
6701 fnd_log.string(l_log_statement,
6702 L_DEBUG_KEY,
6703 'After calling Get_Task_Dependencies for task id: ' ||p_tasks_tbl(i).visit_task_id);
6704 END IF;
6705 END LOOP; -- For all tasks in p_tasks_tbl
6706
6707 -- SR master workorder dates need to be adjusted when new MRs are added.
6708 -- Scheduled start date and Scheduled end date of SR MWO will be derived as follows
6709 -- 1. Scheduled start date will be least of scheduled start date of all existing workorders
6710 -- and new workorders that will be added.
6711 -- 2. Scheduled end date will be greatest of scheduled start date of all existing workorders
6712 -- and new workorders that will be added.
6713
6714 -- step 1. get sr summary tasks duration
6715 -- Note: Entire task table need be looped through. As in future
6716 -- requirement, we may need to accomodate cases were more than one
6717 -- Group task will be passed to this API.
6718 OPEN c_get_sr_task_dtls(p_tasks_tbl(p_tasks_tbl.FIRST).visit_task_id);
6719 FETCH c_get_sr_task_dtls INTO l_sr_task_dtls_rec;
6720 CLOSE c_get_sr_task_dtls;
6721
6722 OPEN get_summary_task_times_csr(l_sr_task_dtls_rec.visit_task_id);
6723 FETCH get_summary_task_times_csr INTO l_sch_start_date, l_sch_end_date;
6724 CLOSE get_summary_task_times_csr;
6725
6726 -- step 2. get sr mwo details including scheduled dates.
6727 OPEN c_get_sr_mwo_dtls(l_sr_task_dtls_rec.visit_task_id);
6728 FETCH c_get_sr_mwo_dtls INTO l_sr_mwo_rec;
6729 CLOSE c_get_sr_mwo_dtls;
6730
6731 -- step 3. update sr mwo details with new scheduled dates.
6732 IF (l_sr_mwo_rec.wip_entity_id IS NOT NULL) THEN
6733
6734 l_wo_tbl_count := l_prd_workorder_tbl.COUNT + 1;
6735
6736 --l_prd_workorder_tbl(l_wo_tbl_count).wip_entity_id := l_sr_mwo_rec.wip_entity_id;
6737 l_prd_workorder_tbl(l_wo_tbl_count).object_version_number := l_sr_mwo_rec.object_version_number;
6738 l_prd_workorder_tbl(l_wo_tbl_count).workorder_id := l_sr_mwo_rec.workorder_id;
6739 l_prd_workorder_tbl(l_wo_tbl_count).dml_operation := 'U';
6740
6741 l_prd_workorder_tbl(l_wo_tbl_count).scheduled_start_date := LEAST(l_sr_mwo_rec.scheduled_start_date,l_sch_start_date);
6742 l_prd_workorder_tbl(l_wo_tbl_count).scheduled_start_hr := TO_NUMBER(TO_CHAR(l_prd_workorder_tbl(l_wo_tbl_count).scheduled_start_date, 'HH24'));
6743 l_prd_workorder_tbl(l_wo_tbl_count).scheduled_start_mi := TO_NUMBER(TO_CHAR(l_prd_workorder_tbl(l_wo_tbl_count).scheduled_start_date, 'MI'));
6744
6745 l_prd_workorder_tbl(l_wo_tbl_count).scheduled_end_date := GREATEST(l_sr_mwo_rec.scheduled_completion_date,l_sch_end_date);
6746 l_prd_workorder_tbl(l_wo_tbl_count).scheduled_end_hr := TO_NUMBER(TO_CHAR(l_prd_workorder_tbl(l_wo_tbl_count).scheduled_end_date, 'HH24'));
6747 l_prd_workorder_tbl(l_wo_tbl_count).scheduled_end_mi := TO_NUMBER(TO_CHAR(l_prd_workorder_tbl(l_wo_tbl_count).scheduled_end_date, 'MI'));
6748
6749 l_prd_workorder_tbl(l_wo_tbl_count).batch_id := c_visit_dtl_rec.visit_number;
6750 l_prd_workorder_tbl(l_wo_tbl_count).header_id := l_sr_task_dtls_rec.visit_task_number;
6751
6752 IF (l_log_statement >= l_log_current_level) THEN
6753 fnd_log.string(l_log_statement,
6754 L_DEBUG_KEY,
6755 'SR MWO Dates before updating...');
6756 fnd_log.string(l_log_statement,
6757 L_DEBUG_KEY,
6758 '----------------------------------------------');
6759 fnd_log.string(l_log_statement,
6760 L_DEBUG_KEY,
6761 'scheduled_start_time->'||TO_CHAR(l_sr_mwo_rec.scheduled_start_date,'DD-MON-YYYY HH24:MI:SS'));
6762 fnd_log.string(l_log_statement,
6763 L_DEBUG_KEY,
6764 'scheduled_end_time->'||TO_CHAR(l_sr_mwo_rec.scheduled_completion_date,'DD-MON-YYYY HH24:MI:SS'));
6765 fnd_log.string(l_log_statement,
6766 L_DEBUG_KEY,
6767 'SR MWO Dates after updating...');
6768 fnd_log.string(l_log_statement,
6769 L_DEBUG_KEY,
6770 '----------------------------------------------');
6771 fnd_log.string(l_log_statement,
6772 L_DEBUG_KEY,
6773 'scheduled_start_time->'||TO_CHAR(l_prd_workorder_tbl(l_wo_tbl_count).scheduled_start_date,'DD-MON-YYYY HH24:MI:SS'));
6774 fnd_log.string(l_log_statement,
6775 L_DEBUG_KEY,
6776 'scheduled_end_time->'||TO_CHAR(l_prd_workorder_tbl(l_wo_tbl_count).scheduled_end_date,'DD-MON-YYYY HH24:MI:SS'));
6777 fnd_log.string(l_log_statement,
6778 L_DEBUG_KEY,
6779 'SR Task scheduled_start_time->'||TO_CHAR(l_sch_start_date,'DD-MON-YYYY HH24:MI:SS'));
6780 fnd_log.string(l_log_statement,
6781 L_DEBUG_KEY,
6782 'SR Task scheduled_end_time->'||TO_CHAR(l_sch_end_date,'DD-MON-YYYY HH24:MI:SS'));
6783 END IF; -- Statement Log Level
6784 END IF; -- wip_entity_id IS NOT NULL
6785
6786 IF (l_log_statement >= l_log_current_level) THEN
6787 fnd_log.string(l_log_statement,
6788 L_DEBUG_KEY,
6789 'Before calling PROCESS_JOBS for visit_id: ' || p_visit_id);
6790 END IF;
6791
6792 -- Call Production API to create work orders
6793 AHL_PRD_WORKORDER_PVT.Process_Jobs
6794 (p_api_version => l_api_version ,
6795 p_init_msg_list => p_init_msg_list,
6796 p_commit => 'F',
6797 p_validation_level => p_validation_level,
6798 p_default => FND_API.G_TRUE,
6799 p_module_type => p_module_type,
6800 x_return_status => l_return_status,
6801 x_msg_count => l_msg_count,
6802 x_msg_data => l_msg_data,
6803 p_x_prd_workorder_tbl => l_prd_workorder_tbl,
6804 p_prd_workorder_rel_tbl => l_prd_workorder_rel_tbl
6805 );
6806
6807 IF (l_log_statement >= l_log_current_level) THEN
6808 fnd_log.string(l_log_statement,
6809 L_DEBUG_KEY,
6810 'After calling PROCESS_JOBS for visit_id ' ||
6811 p_visit_id||', l_return_status: '|| l_return_status);
6812 END IF;
6813
6814 IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
6815 x_msg_count := FND_MSG_PUB.count_msg;
6816 IF (l_log_statement >= l_log_current_level) THEN
6817 fnd_log.string(l_log_statement,
6818 L_DEBUG_KEY,
6819 'Errors from PROCESS_JOBS. Message count: ' || x_msg_count);
6820 END IF;
6821 IF l_return_status = FND_API.G_RET_STS_ERROR THEN
6822 RAISE FND_API.G_EXC_ERROR;
6823 ELSE
6824 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
6825 END IF;
6826 END IF; -- Return Status is not Success
6827
6828 IF (l_log_statement >= l_log_current_level) THEN
6829 For i IN l_prd_workorder_tbl.FIRST..l_prd_workorder_tbl.LAST LOOP
6830 fnd_log.string(l_log_statement,
6831 L_DEBUG_KEY,
6832 'WorkOrder Id('||i||'): '||l_prd_workorder_tbl(i).workorder_id);
6833 END LOOP;
6834 END IF;
6835
6836 /*B5758813 - rnahata - starts*/
6837 /*The project start/end dates have to be updated with the workorder scheduled
6838 start/end dates.*/
6839 IF (l_log_statement >= l_log_current_level) THEN
6840 fnd_log.string(l_log_statement,
6841 L_DEBUG_KEY,
6842 'Before calling Update_Project_Task_Times.');
6843 END IF;
6844
6845 Update_Project_Task_Times(
6846 p_prd_workorder_tbl => l_prd_workorder_tbl,
6847 p_commit =>'F',
6848 x_return_status => l_return_status,
6849 x_msg_count => l_msg_count,
6850 x_msg_data => l_msg_data);
6851
6852 IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
6853 x_msg_count := FND_MSG_PUB.count_msg;
6854 IF (l_log_statement >= l_log_current_level) THEN
6855 fnd_log.string(l_log_statement,
6856 L_DEBUG_KEY,
6857 'Errors from Update_Project_Task_Times. Message count: ' || x_msg_count);
6858 END IF;
6859 IF l_return_status = FND_API.G_RET_STS_ERROR THEN
6860 RAISE FND_API.G_EXC_ERROR;
6861 ELSE
6862 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
6863 END IF;
6864 ELSE
6865 IF (l_log_statement >= l_log_current_level) THEN
6866 fnd_log.string(l_log_statement,
6867 L_DEBUG_KEY,
6868 'Returned Success from Update_Project_Task_Times');
6869 END IF;
6870 END IF; -- Return Status is Success or not
6871 /*B5758813 - rnahata - ends*/
6872
6873 FOR i IN p_tasks_tbl.FIRST..p_tasks_tbl.LAST LOOP
6874 UPDATE ahl_visit_tasks_b
6875 SET status_code = 'RELEASED'
6876 WHERE visit_task_id = p_tasks_tbl(i).visit_task_id;
6877 END LOOP;
6878
6879 /*Check if the user had selected all the tasks otherwise
6880 update the visit as Partially released.*/
6881 OPEN c_visit_has_planned_tasks(p_visit_id);
6882 FETCH c_visit_has_planned_tasks into l_temp_num1;
6883 CLOSE c_visit_has_planned_tasks;
6884
6885 OPEN c_visit_time_matches_MWO_time(p_visit_id);
6886 FETCH c_visit_time_matches_MWO_time INTO l_temp_num2;
6887 CLOSE c_visit_time_matches_MWO_time;
6888
6889 IF l_temp_num1 IS NOT NULL OR l_temp_num2 is NULL THEN
6890 IF (l_log_statement >= l_log_current_level) THEN
6891 IF l_temp_num1 IS NOT NULL THEN
6892 fnd_log.string(l_log_statement,
6893 L_DEBUG_KEY,
6894 'Visit has some tasks in planning status. Setting Visit status to PARTIALLY RELEASED.');
6895 END IF;
6896 IF l_temp_num2 IS NULL THEN
6897 fnd_log.string(l_log_statement,
6898 L_DEBUG_KEY,
6899 'Visit times and Master Work order times do not match. Setting Visit status to PARTIALLY RELEASED.');
6900 END IF;
6901 END IF;
6902
6903 UPDATE ahl_visits_b
6904 SET status_code = 'PARTIALLY RELEASED'
6905 WHERE visit_id = p_visit_id;
6906 ELSE
6907 IF (l_log_statement >= l_log_current_level) THEN
6908 fnd_log.string(l_log_statement,
6909 L_DEBUG_KEY,
6910 'Setting Visit status to RELEASED.');
6911 END IF;
6912
6913 UPDATE ahl_visits_b
6914 SET status_code = 'RELEASED',
6915 any_task_chg_flag ='N'
6916 WHERE visit_id = p_visit_id;
6917 END IF;
6918
6919 IF (l_log_procedure >= l_log_current_level) THEN
6920 fnd_log.string(l_log_procedure,
6921 L_DEBUG_KEY ||'.end',
6922 'At the end of PL SQL procedure. Return Status = ' || x_return_status);
6923 END IF;
6924
6925 EXCEPTION
6926 WHEN FND_API.G_EXC_ERROR THEN
6927 x_return_status := FND_API.G_RET_STS_ERROR;
6928 ROLLBACK TO Push_tasks_to_prodn_pvt;
6929 FND_MSG_PUB.count_and_get(p_count => x_msg_count,
6930 p_data => x_msg_data,
6931 p_encoded => fnd_api.g_false);
6932
6933 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
6934 x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
6935 ROLLBACK TO Push_tasks_to_prodn_pvt;
6936 Fnd_Msg_Pub.count_and_get (
6937 p_encoded => Fnd_Api.g_false,
6938 p_count => x_msg_count,
6939 p_data => x_msg_data);
6940
6941 WHEN OTHERS THEN
6942 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6943 ROLLBACK TO Push_tasks_to_prodn_pvt;
6944 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
6945 fnd_msg_pub.add_exc_msg(p_pkg_name => G_PKG_NAME,
6946 p_procedure_name => 'Push_tasks_to_production',
6947 p_error_text => SUBSTR(SQLERRM,1,500));
6948 END IF;
6949 FND_MSG_PUB.count_and_get(p_count => x_msg_count,
6950 p_data => x_msg_data,
6951 p_encoded => fnd_api.g_false);
6952
6953 END Push_tasks_to_production;
6954
6955 -------------------------------------------------------------------
6956 -- Procedure name : check_unit_quarantined
6957 -- Type : Private
6958 -- Function : To check whether the Unit is quarantined
6959 -- Parameters : item_instance_id
6960
6961 -- AnRaj added for R 12.0 ACL changes in VWP
6962 -- Bug number 4297066
6963 ----------------------------------------------------------------------
6964 PROCEDURE check_unit_quarantined(
6965 p_visit_id IN NUMBER,
6966 item_instance_id IN NUMBER
6967 )
6968 IS
6969 L_API_NAME CONSTANT VARCHAR2(30) := 'check_unit_quarantined';
6970 L_DEBUG_KEY CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
6971 l_unit_name VARCHAR2(80);
6972 l_quarantined VARCHAR2(1);
6973 l_task_number NUMBER(15);
6974 l_instance_id NUMBER;
6975
6976 CURSOR c_get_tasknumbers (x_visit_id IN NUMBER) IS
6977 SELECT visit_task_number,instance_id
6978 FROM ahl_visit_tasks_vl
6979 WHERE visit_id = p_visit_id
6980 AND NVL(STATUS_CODE,'X') NOT IN ('DELETED','RELEASED')
6981 AND TASK_TYPE_CODE <> 'SUMMARY';
6982 BEGIN
6983
6984 IF (l_log_procedure >= l_log_current_level) THEN
6985 fnd_log.string(l_log_procedure,L_DEBUG_KEY||'.begin', 'At the start of PL SQL procedure');
6986 fnd_log.string(l_log_procedure,L_DEBUG_KEY,'p_visit_id : '|| p_visit_id || 'item_instance_id : '|| item_instance_id);
6987 END IF;
6988
6989 IF item_instance_id IS NOT NULL THEN
6990 -- If the Visit header has an instance id, check for the corresponding Unit
6991 l_quarantined := ahl_util_uc_pkg.is_unit_quarantined(null,item_instance_id);
6992 IF l_quarantined = FND_API.G_TRUE THEN
6993 l_unit_name := ahl_util_uc_pkg.get_unit_name(item_instance_id);
6994 Fnd_Message.SET_NAME('AHL','AHL_VWP_VLD_HDR_UNIT_QRNT');
6995 -- The Unit for this Visit (UNIT_NAME-1) is quarantined.
6996 Fnd_Message.Set_Token('UNIT_NAME',l_unit_name);
6997 Fnd_Msg_Pub.ADD;
6998
6999 IF (l_log_statement >= l_log_current_level)THEN
7000 fnd_log.string (l_log_statement,L_DEBUG_KEY,'Unit : '||l_unit_name || ' is quarantined, Error message added');
7001 END IF;
7002 END IF; -- l_quarantined not true
7003 ELSE -- instance id is null
7004 -- If the visit does not have a unit at the header , then check for the units of all tasks
7005 OPEN c_get_tasknumbers (p_visit_id);
7006 LOOP
7007 FETCH c_get_tasknumbers INTO l_task_number,l_instance_id;
7008 EXIT WHEN c_get_tasknumbers%NOTFOUND;
7009 l_quarantined := ahl_util_uc_pkg.is_unit_quarantined(null,l_instance_id);
7010 IF l_quarantined = FND_API.G_TRUE THEN
7011 Fnd_Message.SET_NAME('AHL','AHL_VWP_VLD_TSK_UNIT_QRNT');
7012 -- The Unit for the Task (UNIT_NAME-1) is quarantined.
7013 Fnd_Message.Set_Token('TASK_NUMBER',l_task_number);
7014 Fnd_Msg_Pub.ADD;
7015 IF (l_log_statement >= l_log_current_level)THEN
7016 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Unit for this task: '||l_task_number||' is quarantined');
7017 END IF;
7018 END IF; -- l_quarantined not true
7019 END LOOP; -- c_get_tasknumbers
7020 END IF;
7021
7022 IF (l_log_procedure >= l_log_current_level) THEN
7023 fnd_log.string(l_log_procedure,L_DEBUG_KEY ||'.end','At the end of PL SQL procedure ');
7024 END IF;
7025 END check_unit_quarantined;
7026
7027 -------------------------------------------------------------------
7028 -- Procedure name : Release_MR
7029 -- Type : Private
7030 --
7031 --
7032 -- Function :To release all MRs associated to a given UE and return
7033 -- workorder ID for the root task. Requested by MEL/CDL.
7034 -- If p_module_type is 'PROD' and Validate_Before_Production
7035 -- fails, then no exception will be thrown and calling API is
7036 -- responsible to check return status ('V') and read from error stack.
7037 -- Pre-reqs :
7038 -- Parameters :
7039 --
7040 -- Standard IN Parameters :
7041 -- p_api_version IN NUMBER Required
7042 -- p_init_msg_list IN VARCHAR2 Default FND_API.G_FALSE
7043 -- p_commit IN VARCHAR2 Default FND_API.G_FALSE
7044 -- p_validation_level IN NUMBER Default FND_API.G_VALID_LEVEL_FULL
7045 --
7046 -- Standard OUT Parameters :
7047 -- x_return_status OUT VARCHAR2 Required ='V' if validation fails
7048 -- x_msg_count OUT NUMBER Required
7049 -- x_msg_data OUT VARCHAR2 Required
7050 -- x_workorder_id OUT NUMBER Required
7051 --
7052 -- Release visit Parameters:
7053 -- p_visit_id IN NUMBER Required
7054 -- p_unit_effectivity_id IN NUMBER Required
7055 -- p_release_flag IN VARCHAR2 optional
7056 --
7057 -- Version :
7058 -- 07/21/2005 YAZHOU Initial Creation
7059 -------------------------------------------------------------------
7060 PROCEDURE Release_MR (
7061 p_api_version IN NUMBER,
7062 p_init_msg_list IN VARCHAR2 := Fnd_Api.G_FALSE,
7063 p_commit IN VARCHAR2 := Fnd_Api.G_FALSE,
7064 p_validation_level IN NUMBER := Fnd_Api.G_VALID_LEVEL_FULL,
7065 p_module_type IN VARCHAR2 := NULL,
7066 p_visit_id IN NUMBER,
7067 p_unit_effectivity_id IN NUMBER,
7068 p_release_flag IN VARCHAR2 := 'N',
7069 x_workorder_id OUT NOCOPY NUMBER,
7070 x_return_status OUT NOCOPY VARCHAR2,
7071 x_msg_count OUT NOCOPY NUMBER,
7072 x_msg_data OUT NOCOPY VARCHAR2)
7073 IS
7074 --Standard local variables
7075 l_api_name CONSTANT VARCHAR2(30) := 'Release_MR';
7076 l_api_version CONSTANT NUMBER := 1.0;
7077 L_DEBUG_KEY CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
7078 l_msg_data VARCHAR2(2000);
7079 l_return_status VARCHAR2(1);
7080 l_msg_count NUMBER;
7081 l_Error_Tbl_Type Error_Tbl_Type;
7082 l_error_msg VARCHAR2(5000);
7083 l_error_count NUMBER;
7084 l_commit VARCHAR2(1) := 'F';
7085 l_validate_error CONSTANT VARCHAR2(1) := 'V';
7086 l_MR_end_time DATE;
7087 l_visit_end_time DATE;
7088
7089 -- To find visit related information
7090 CURSOR c_visit (x_id IN NUMBER) IS
7091 SELECT * FROM AHL_VISITS_VL
7092 WHERE VISIT_ID = x_id;
7093 c_visit_rec c_visit%ROWTYPE;
7094
7095 CURSOR get_wo(c_visit_id NUMBER, c_unit_effectivity_id NUMBER) IS
7096 SELECT workorder_id
7097 FROM AHL_WORKORDERS
7098 WHERE VISIT_TASK_ID = (select visit_task_id from ahl_visit_tasks_b
7099 where visit_id = c_visit_id
7100 and unit_effectivity_id = c_unit_effectivity_id
7101 AND NVL(status_code, 'Y') <> 'DELETED'
7102 and originating_task_id is null)
7103 AND STATUS_CODE NOT IN ('7', '22');
7104
7105 CURSOR c_get_wo_details(x_visit_id IN NUMBER)
7106 IS
7107 SELECT
7108 scheduled_start_date,
7109 SCHEDULED_COMPLETION_DATE
7110 FROM wip_discrete_jobs
7111 WHERE wip_entity_id =
7112 (
7113 SELECT
7114 wip_entity_id
7115 FROM ahl_workorders
7116 WHERE
7117 master_workorder_flag = 'Y' AND
7118 visit_task_id IS null AND
7119 status_code not in (22,7) and
7120 visit_id=x_visit_id
7121 );
7122 c_get_wo_details_rec c_get_wo_details%ROWTYPE;
7123
7124 -- get end time of the root task for a given UE
7125 CURSOR get_summary_task_times_csr(x_visit_id IN NUMBER, x_unit_effectivity_id IN NUMBER)IS
7126 SELECT max(end_date_time)
7127 FROM ahl_visit_tasks_b VST
7128 where visit_id = x_visit_id
7129 AND NVL(VST.status_code, 'Y') <> 'DELETED'
7130 START WITH unit_effectivity_id = x_unit_effectivity_id
7131 and originating_task_id is null
7132 CONNECT BY originating_task_id = PRIOR visit_task_id;
7133
7134 -- Get all the parent tasks for a given UE that start in a past date
7135 CURSOR get_independent_tasks(x_visit_id IN NUMBER, x_unit_effectivity_id IN NUMBER) IS
7136 select distinct t.visit_task_id
7137 from ahl_visit_tasks_b t,
7138 ahl_visits_b v
7139 where v.visit_id = x_visit_id
7140 and v.visit_id = t.visit_id
7141 and v.status_code = 'PARTIALLY RELEASED'
7142 and t.start_date_time < SYSDATE
7143 and t.status_code ='PLANNING'
7144 and t.task_type_code <>'SUMMARY'
7145 and (not exists (select 1 from ahl_task_links l0
7146 where l0.parent_task_id = t.visit_task_id
7147 or l0.visit_task_id = t.visit_task_id )
7148 or t.visit_task_id in (select l1.parent_task_id from ahl_task_links l1
7149 where not exists (select l2.visit_task_id from ahl_task_links l2
7150 where l2.visit_task_id = l1.parent_task_id)))
7151 /*NR-MR Changes - For SR's created from non-routines have the originating wo as their originating task, hence they are not null.*/
7152 START WITH t.unit_effectivity_id = x_unit_effectivity_id
7153 AND (( t.originating_task_id is null AND 'SR' <> p_module_type)
7154 OR ( t.originating_task_id is not null AND 'SR' = p_module_type
7155 and t.service_request_id is not null))
7156 CONNECT BY t.originating_task_id = PRIOR visit_task_id;
7157
7158 BEGIN
7159
7160 IF (l_log_procedure >= l_log_current_level) THEN
7161 fnd_log.string(l_log_procedure,L_DEBUG_KEY ||'.begin','At the start of PL SQL procedure. Visit Id = ' || p_visit_id);
7162 END IF;
7163
7164 -- Standard start of API savepoint
7165 SAVEPOINT Release_MR;
7166
7167 -- Initialize message list if p_init_msg_list is set to TRUE
7168 IF FND_API.To_Boolean( p_init_msg_list) THEN
7169 FND_MSG_PUB.Initialize;
7170 END IF;
7171
7172 -- Initialize API return status to success
7173 x_return_status := FND_API.G_RET_STS_SUCCESS;
7174
7175 -- Standard call to check for call compatibility.
7176 IF NOT FND_API.COMPATIBLE_API_CALL(l_api_version,
7177 p_api_version,
7178 l_api_name,G_PKG_NAME)THEN
7179 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
7180 END IF;
7181
7182 IF (l_log_statement >= l_log_current_level) THEN
7183 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Request for Release_MR Visit ID : ' || p_visit_id);
7184 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Request for Release_MR UE ID : ' || p_unit_effectivity_id);
7185 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Request for Release_MR Release Flag : ' || p_release_flag);
7186 END IF;
7187
7188 -- Check for Required Parameters
7189 IF(p_visit_id IS NULL OR p_visit_id = FND_API.G_MISS_NUM) THEN
7190 FND_MESSAGE.Set_Name(G_PM_PRODUCT_CODE,'AHL_VWP_CST_INPUT_MISS');
7191 FND_MSG_PUB.ADD;
7192 IF (l_log_unexpected >= l_log_current_level)THEN
7193 fnd_log.string(l_log_unexpected,L_DEBUG_KEY,'Visit id is mandatory but found null in input');
7194 END IF;
7195 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
7196 END IF;
7197
7198 IF(p_unit_effectivity_id IS NULL OR p_unit_effectivity_id = FND_API.G_MISS_NUM) THEN
7199 FND_MESSAGE.Set_Name(G_PM_PRODUCT_CODE,'AHL_VWP_UE_INPUT_MISS');
7200 FND_MSG_PUB.ADD;
7201 IF (l_log_unexpected >= l_log_current_level)THEN
7202 fnd_log.string(l_log_unexpected,L_DEBUG_KEY,'Unit Effectivity id is mandatory but found null in input ');
7203 END IF;
7204 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
7205 END IF;
7206
7207 IF (l_log_statement >= l_log_current_level)THEN
7208 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Before Calling Validate Before Production for visit Id: ' ||p_visit_id);
7209 END IF;
7210
7211 --Valdate before push to production happens
7212 Validate_Before_Production
7213 (p_api_version => l_api_version,
7214 p_init_msg_list => p_init_msg_list,
7215 p_commit => l_commit,
7216 p_validation_level => p_validation_level,
7217 p_module_type => p_module_type,
7218 p_visit_id => p_visit_id,
7219 x_error_tbl => l_error_tbl_type,
7220 x_return_status => l_return_status,
7221 x_msg_count => x_msg_count,
7222 x_msg_data => x_msg_data);
7223
7224 IF (l_log_statement >= l_log_current_level)THEN
7225 fnd_log.string(l_log_statement,L_DEBUG_KEY,'After Calling Validate Before Production - l_return_status : '|| l_return_status);
7226 END IF;
7227
7228 IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
7229 -- Check Error Message stack.
7230 x_msg_count := FND_MSG_PUB.count_msg;
7231 IF (l_log_statement >= l_log_current_level)THEN
7232 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Errors from Validate Before Production' || x_msg_count);
7233 END IF;
7234 RAISE Fnd_Api.g_exc_error;
7235 END IF;
7236
7237 IF l_error_tbl_type.COUNT > 0 THEN
7238 x_return_status := l_validate_error;
7239 ELSE
7240 OPEN c_visit (p_visit_id);
7241 FETCH c_visit INTO c_visit_rec;
7242 CLOSE c_visit;
7243 -- Adjust Task Start/End time if visit start date is a past date
7244 -- ER #4552764
7245
7246 IF c_visit_rec.STATUS_CODE = 'PARTIALLY RELEASED' AND c_visit_rec.start_date_time < SYSDATE THEN
7247 FOR l_get_independent_tasks IN get_independent_tasks(c_visit_rec.visit_id,p_unit_effectivity_id)
7248 LOOP
7249 AHL_VWP_TIMES_PVT.adjust_task_times(
7250 p_api_version => 1.0,
7251 p_init_msg_list => Fnd_Api.G_FALSE,
7252 p_commit => Fnd_Api.G_FALSE,
7253 p_validation_level => Fnd_Api.G_VALID_LEVEL_FULL,
7254 x_return_status => l_return_status,
7255 x_msg_count => l_msg_count,
7256 x_msg_data => l_msg_data,
7257 p_task_id => l_get_independent_tasks.visit_task_id,
7258 p_reset_sysdate_flag => FND_API.G_TRUE);
7259 END LOOP;
7260 l_visit_end_time := AHL_VWP_TIMES_PVT.get_visit_end_time(c_visit_rec.visit_id);
7261 IF l_visit_end_time > c_visit_rec.close_date_time THEN
7262 Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_TSK_STDT_ADJU');
7263 Fnd_Message.Set_Token('VISIT_END_DATE', l_visit_end_time);
7264 Fnd_Msg_Pub.ADD;
7265 x_return_status := l_validate_error;
7266 END IF;
7267 END IF;
7268 END IF;
7269
7270 IF x_return_status = FND_API.G_RET_STS_SUCCESS THEN
7271 /* Check visit end date instead
7272 --The MR end date
7273 OPEN get_summary_task_times_csr(p_visit_id, p_unit_effectivity_id);
7274 FETCH get_summary_task_times_csr into l_MR_end_time;
7275 CLOSE get_summary_task_times_csr;
7276 */
7277 l_visit_end_time := AHL_VWP_TIMES_PVT.get_visit_end_time(c_visit_rec.visit_id);
7278
7279 OPEN c_get_wo_details(c_visit_rec.visit_id);
7280 FETCH c_get_wo_details into c_get_wo_details_rec;
7281 -- Validate to check if derived visit end time now exceeds scheduled master work order completion time
7282 -- Note: since we are checking for derived visit end time here, if there are other task in planning
7283 -- status with end date exceeding visit master WO end date, then MR tasks cannot be created
7284 IF TRUNC(l_visit_end_time) > TRUNC(c_get_wo_details_rec.scheduled_completion_date) THEN
7285 x_return_status := l_validate_error;
7286 -- Error Message
7287 Fnd_Message.SET_NAME('AHL','AHL_VWP_DATE_EXCD_WO_DATE');
7288 Fnd_Message.Set_Token('VISIT_END_DATE', l_visit_end_time);
7289 FND_MSG_PUB.ADD;
7290 END IF;
7291 END IF;
7292
7293 IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
7294 -- Per MEL/CDL requirement, if tasks are sucessfully created but fail to be pushed
7295 -- to production, then they will stay in 'PLANNING' status.
7296 IF p_module_type <>'PROD' THEN
7297 -- Check Error Message stack.
7298 x_msg_count := FND_MSG_PUB.count_msg;
7299 IF (l_log_statement >= l_log_current_level)THEN
7300 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Errors from Validate Before Production'|| x_msg_count);
7301 END IF;
7302 RAISE Fnd_Api.g_exc_error;
7303 END IF;
7304 ELSE
7305 IF (l_log_statement >= l_log_current_level)THEN
7306 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Before Calling Push_MR_to_Production for UE Id: ' ||p_unit_effectivity_id);
7307 END IF;
7308
7309 Push_MR_to_Production
7310 (p_api_version => l_api_version,
7311 p_init_msg_list => p_init_msg_list,
7312 p_commit => l_commit,
7313 p_validation_level => p_validation_level,
7314 p_module_type => p_module_type,
7315 p_visit_id => p_visit_id,
7316 p_unit_effectivity_id => p_unit_effectivity_id,
7317 p_release_flag => p_release_flag,
7318 x_return_status => l_return_status,
7319 x_msg_count => l_msg_count,
7320 x_msg_data => l_msg_data);
7321
7322 IF (l_log_statement >= l_log_current_level)THEN
7323 fnd_log.string(l_log_statement,L_DEBUG_KEY,'After Calling Push_MR_to_Production - l_return_status : ' ||l_return_status);
7324 END IF;
7325
7326 IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
7327 -- Check Error Message stack.
7328 x_msg_count := FND_MSG_PUB.count_msg;
7329 IF (l_log_statement >= l_log_current_level)THEN
7330 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Errors from Push to Production: ' || x_msg_count);
7331 END IF;
7332 RAISE Fnd_Api.g_exc_error;
7333 END IF;
7334
7335 /*Return root root workorder ID for the given UE*/
7336 OPEN get_wo(p_visit_id, p_unit_effectivity_id);
7337 FETCH get_wo INTO x_workorder_id;
7338 CLOSE get_wo;
7339 END IF;
7340
7341 -- Standard check of p_commit
7342 IF FND_API.TO_BOOLEAN(p_commit) THEN
7343 COMMIT WORK;
7344 END IF;
7345
7346 Fnd_Msg_Pub.count_and_get(
7347 p_encoded => Fnd_Api.g_false,
7348 p_count => x_msg_count,
7349 p_data => x_msg_data);
7350
7351 IF (l_log_procedure >= l_log_current_level)THEN
7352 fnd_log.string(l_log_procedure,L_DEBUG_KEY||'.end','At the end of PLSQL procedure');
7353 END IF;
7354
7355 EXCEPTION
7356 WHEN FND_API.G_EXC_ERROR THEN
7357 x_return_status := FND_API.G_RET_STS_ERROR;
7358 ROLLBACK TO Release_MR;
7359 FND_MSG_PUB.count_and_get( p_count => x_msg_count,
7360 p_data => x_msg_data,
7361 p_encoded => fnd_api.g_false);
7362
7363
7364 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
7365 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
7366 ROLLBACK TO Release_MR;
7367 FND_MSG_PUB.count_and_get( p_count => x_msg_count,
7368 p_data => x_msg_data,
7369 p_encoded => fnd_api.g_false);
7370
7371
7372 WHEN OTHERS THEN
7373 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
7374 ROLLBACK TO Release_MR;
7375 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
7376 fnd_msg_pub.add_exc_msg(p_pkg_name => G_PKG_NAME,
7377 p_procedure_name => 'Release_MR',
7378 p_error_text => SUBSTR(SQLERRM,1,500));
7379 END IF;
7380 FND_MSG_PUB.count_and_get( p_count => x_msg_count,
7381 p_data => x_msg_data,
7382 p_encoded => fnd_api.g_false);
7383
7384 END Release_MR;
7385
7386 --------------------------------------------------------------------
7387 -- PROCEDURE
7388 -- Get_MR_Dependencies
7389 --
7390 -- PURPOSE
7391 -- To get all the Technical Dependencies for the MR.
7392 --------------------------------------------------------------------
7393
7394 PROCEDURE Get_MR_Dependencies
7395 (
7396 p_visit_id IN NUMBER,
7397 p_visit_number IN NUMBER,
7398 p_unit_effectivity_id IN NUMBER,
7399 p_module_type IN VARCHAR2 := Null, /*NR-MR Changes - sowsubra*/
7400 p_x_relationship_tbl IN OUT NOCOPY AHL_PRD_WORKORDER_PVT.prd_workorder_rel_tbl
7401 )
7402 AS
7403
7404 -- Get all the Task Dependencies for the given MR.
7405 CURSOR get_tech_dependencies( c_visit_id NUMBER, c_unit_effectivity_id NUMBER )
7406 IS
7407 SELECT distinct PARENT.visit_task_number parent_task_number,
7408 CHILD.visit_task_number child_task_number
7409 FROM AHL_VISIT_TASKS_B PARENT,
7410 AHL_VISIT_TASKS_B CHILD,
7411 AHL_TASK_LINKS LINK
7412 WHERE PARENT.visit_task_id = LINK.parent_task_id
7413 AND CHILD.visit_task_id = LINK.visit_task_id
7414 AND NVL(PARENT.STATUS_CODE,'X') = 'PLANNING' --Srini Bug #4075702
7415 AND PARENT.visit_id = c_visit_id
7416 AND CHILD.visit_id = c_visit_id
7417 AND PARENT.visit_task_id in (select visit_task_id from ahl_visit_tasks_b
7418 where visit_id = c_visit_id
7419 /*NR-MR Changes - For SR's created from non-routines have the originating wo as their originating task, hence they are not null.*/
7420 START WITH unit_effectivity_id = c_unit_effectivity_id
7421 AND (( originating_task_id is null AND 'SR' <> p_module_type)
7422 OR ( originating_task_id is not null AND 'SR' = p_module_type
7423 and service_request_id is not null))
7424 CONNECT BY originating_task_id = PRIOR visit_task_id)
7425 AND CHILD.visit_task_id in ( select visit_task_id from ahl_visit_tasks_b
7426 where visit_id = c_visit_id
7427 /*NR-MR Changes - For SR's created from non-routines have the originating wo as their originating task, hence they are not null.*/
7428 START WITH unit_effectivity_id = c_unit_effectivity_id
7429 AND (( originating_task_id is null AND 'SR' <> p_module_type)
7430 OR ( originating_task_id is not null AND 'SR' = p_module_type
7431 and service_request_id is not null))
7432 CONNECT BY originating_task_id = PRIOR visit_task_id);
7433
7434 l_api_name CONSTANT VARCHAR2(30):= 'Get_MR_Dependencies';
7435 L_DEBUG_KEY CONSTANT VARCHAR2(100):= 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
7436 rel_count NUMBER;
7437
7438 BEGIN
7439
7440 IF (l_log_procedure >= l_log_current_level) THEN
7441 fnd_log.string(l_log_procedure,L_DEBUG_KEY||'.begin','At the start of the procedure');
7442 END IF;
7443
7444 rel_count := p_x_relationship_tbl.COUNT;
7445
7446 IF (l_log_statement >= l_log_current_level) THEN
7447 fnd_log.string(l_log_statement,L_DEBUG_KEY,'rel_count - '||rel_count);
7448 END IF;
7449
7450 -- Get the Technical Dependencies between Visit Tasks for a Visit.
7451 FOR tsk_cursor IN get_tech_dependencies( p_visit_id , p_unit_effectivity_id) LOOP
7452 rel_count := rel_count + 1;
7453 p_x_relationship_tbl(rel_count).batch_id := p_visit_number;
7454 p_x_relationship_tbl(rel_count).parent_header_id := tsk_cursor.parent_task_number;
7455 p_x_relationship_tbl(rel_count).child_header_id := tsk_cursor.child_task_number;
7456 p_x_relationship_tbl(rel_count).relationship_type := 2;
7457 p_x_relationship_tbl(rel_count).dml_operation := 'C';
7458 END LOOP;
7459
7460 IF (l_log_procedure >= l_log_current_level) THEN
7461 fnd_log.string(l_log_procedure,L_DEBUG_KEY,'Total Relationships : ' || p_x_relationship_tbl.COUNT);
7462 fnd_log.string(l_log_procedure,L_DEBUG_KEY||'.end','At the end of procedure');
7463 END IF;
7464
7465 END Get_MR_Dependencies;
7466
7467 --------------------------------------------------------------------
7468 -- PROCEDURE
7469 -- Get_MR_Relationships
7470 --
7471 -- PURPOSE
7472 -- To get all the Relationships for the MR. These include :
7473 -- 1.A record for Each MR to MR / Visit Relationship.
7474 -- 2.A record for Each Visit Task to MR Relationship.
7475 --------------------------------------------------------------------
7476
7477 PROCEDURE Get_MR_Relationships
7478 (
7479 p_visit_id IN NUMBER,
7480 p_visit_number IN NUMBER,
7481 p_unit_effectivity_id IN NUMBER,
7482 p_module_type IN VARCHAR2 := Null, /*NR-MR Changes - sowsubra*/
7483 p_x_relationship_tbl IN OUT NOCOPY AHL_PRD_WORKORDER_PVT.prd_workorder_rel_tbl
7484 )
7485 AS
7486 -- Get all the MR tasks associated to the given UE.
7487 /*NR-MR Changes - sowsubra - modified the cursor to fetch the sr_id, mr_id and task type*/
7488 CURSOR get_mrs_for_UE( c_visit_id NUMBER , c_unit_effectivity_id NUMBER)
7489 IS
7490 SELECT distinct visit_task_id,
7491 visit_task_number,
7492 task_type_code,
7493 service_request_id,
7494 mr_id,
7495 NVL(originating_task_id, -1)
7496 FROM AHL_VISIT_TASKS_B
7497 WHERE visit_id = c_visit_id
7498 AND task_type_code='SUMMARY'
7499 AND NVL(STATUS_CODE, 'X') = 'PLANNING'
7500 /*NR-MR Changes - For SR's created from non-routines have the originating wo as their originating task, hence they are not null.*/
7501 START WITH unit_effectivity_id = c_unit_effectivity_id
7502 AND (( originating_task_id is null AND 'SR' <> p_module_type)
7503 OR ( originating_task_id is not null AND 'SR' = p_module_type
7504 and service_request_id is not null))
7505 CONNECT BY originating_task_id = PRIOR visit_task_id
7506 order by 2;
7507
7508 TYPE mr_task_rec_type IS RECORD
7509 (
7510 visit_task_id NUMBER,
7511 visit_task_number NUMBER,
7512 /*NR-MR Changes - sowsubra - begin*/
7513 task_type_code VARCHAR2(30),
7514 service_request_id NUMBER,
7515 mr_id NUMBER,
7516 /*NR-MR Changes - sowsubra - end*/
7517 originating_task_id NUMBER
7518 );
7519
7520 TYPE mr_task_tbl_type IS TABLE OF mr_task_rec_type INDEX BY BINARY_INTEGER;
7521
7522 l_mrs_for_UE mr_task_tbl_type;
7523
7524 -- Get all the Tasks associated to a MR.
7525 CURSOR get_tasks_for_mr( c_visit_id NUMBER, c_mr_task_id NUMBER )
7526 IS
7527 SELECT visit_task_number, visit_task_id
7528 FROM AHL_VISIT_TASKS_B
7529 WHERE visit_id = c_visit_id
7530 AND originating_task_id = c_mr_task_id
7531 AND task_type_code <> 'SUMMARY'
7532 AND NVL(STATUS_CODE, 'X') = 'PLANNING';
7533
7534 CURSOR get_wo(c_visit_task_id NUMBER)
7535 IS
7536 SELECT wip_entity_id
7537 FROM AHL_WORKORDERS
7538 WHERE VISIT_TASK_ID = c_visit_task_id
7539 AND STATUS_CODE NOT IN ('7', '22');
7540
7541 CURSOR get_parent_wo(c_visit_task_id NUMBER)
7542 IS
7543 SELECT wip_entity_id
7544 FROM AHL_WORKORDERS
7545 WHERE VISIT_TASK_ID = c_visit_task_id
7546 AND STATUS_CODE NOT IN ('7', '22');
7547
7548 CURSOR get_mwo(c_visit_id NUMBER)
7549 IS
7550 SELECT wip_entity_id
7551 FROM AHL_WORKORDERS
7552 WHERE visit_id = c_visit_id
7553 AND VISIT_TASK_ID IS NULL
7554 AND MASTER_WORKORDER_FLAG = 'Y'
7555 AND STATUS_CODE NOT IN ('7', '22');
7556
7557 l_api_name CONSTANT VARCHAR2(30):= 'Get_MR_Relationships';
7558 L_DEBUG_KEY CONSTANT VARCHAR2(100):= 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
7559
7560 l_wip_entity_id NUMBER;
7561 l_parent_wip_entity_id NUMBER;
7562 /*NR-MR Changes - sowsubra - begin*/
7563 l_parent_wo_id NUMBER := 0;
7564 /*NR-MR Changes - sowsubra - end*/
7565
7566 rel_count NUMBER := 0;
7567 mr_count NUMBER := 0;
7568
7569 BEGIN
7570
7571 IF (l_log_procedure >= l_log_current_level) THEN
7572 fnd_log.string(l_log_procedure,L_DEBUG_KEY||'.begin','At the start of the procedure');
7573 END IF;
7574
7575 rel_count := p_x_relationship_tbl.COUNT;
7576
7577 IF (l_log_statement >= l_log_current_level) THEN
7578 fnd_log.string(l_log_statement,L_DEBUG_KEY,'rel_count - '||rel_count);
7579 END IF;
7580
7581 -- Get all the Task Records corresponding to a MR for the given UE.
7582 OPEN get_mrs_for_UE( p_visit_id, p_unit_effectivity_id );
7583 LOOP
7584 EXIT WHEN get_mrs_for_UE%NOTFOUND;
7585 mr_count := mr_count + 1;
7586 FETCH get_mrs_for_UE
7587 INTO l_mrs_for_UE(mr_count).visit_task_id,
7588 l_mrs_for_UE(mr_count).visit_task_number,
7589 /*NR-MR Changes - sowsubra - begin*/
7590 l_mrs_for_UE(mr_count).task_type_code,
7591 l_mrs_for_UE(mr_count).service_request_id,
7592 l_mrs_for_UE(mr_count).mr_id,
7593 /*NR-MR Changes - sowsubra - end*/
7594 l_mrs_for_UE(mr_count).originating_task_id;
7595 END LOOP;
7596 CLOSE get_mrs_for_UE;
7597
7598 IF (l_log_statement >= l_log_current_level) THEN
7599 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Total MRs for Visit : ' || l_mrs_for_UE.COUNT);
7600 END IF;
7601
7602 OPEN get_mwo(p_visit_id);
7603 FETCH get_mwo INTO l_parent_wip_entity_id;
7604 CLOSE get_mwo;
7605
7606 IF ( l_mrs_for_UE.COUNT > 0 ) THEN
7607 FOR i IN l_mrs_for_UE.FIRST..l_mrs_for_UE.LAST LOOP
7608 -- if the visit task already has a workorder then do not
7609 -- create a relationship for it
7610 OPEN get_wo(l_mrs_for_UE(i).visit_task_id);
7611 FETCH get_wo INTO l_wip_entity_id;
7612 IF get_wo%NOTFOUND THEN
7613 rel_count := rel_count + 1;
7614 p_x_relationship_tbl(rel_count).batch_id := p_visit_number;
7615 p_x_relationship_tbl(rel_count).child_header_id := l_mrs_for_UE(i).visit_task_number;
7616 p_x_relationship_tbl(rel_count).relationship_type := 1;
7617 p_x_relationship_tbl(rel_count).dml_operation := 'C';
7618
7619 -- Loop to Find out Parent MRs
7620 IF ( l_mrs_for_UE(i).originating_task_id <> -1 ) THEN
7621 /*NR-MR Changes - sowsubra - begin*/
7622 /*MWO created for the SR Summary task should be child of visit MWO only.
7623 Hence the parent of the SR Summary task created from production will be visit.*/
7624 IF (l_mrs_for_UE(i).service_request_id IS NOT NULL) AND (l_mrs_for_UE(i).mr_id IS NULL) AND (NVL(p_module_type, 'NOT_SR') = 'SR') THEN
7625 /*OPEN get_mwo(p_visit_id);
7626 FETCH get_mwo INTO l_parent_wip_entity_id;
7627 CLOSE get_mwo;*/
7628 p_x_relationship_tbl(rel_count).parent_wip_entity_id := l_parent_wip_entity_id;
7629 p_x_relationship_tbl(rel_count).parent_header_id := 0;
7630 ELSE
7631 /*NR-MR Changes - sowsubra - end*/
7632 FOR j IN l_mrs_for_UE.FIRST..l_mrs_for_UE.LAST LOOP
7633 IF ( l_mrs_for_UE(i).originating_task_id = l_mrs_for_UE(j).visit_task_id ) THEN
7634 p_x_relationship_tbl(rel_count).parent_header_id := l_mrs_for_UE(j).visit_task_number;
7635 OPEN get_parent_wo(l_mrs_for_UE(j).visit_task_id);
7636 FETCH get_parent_wo INTO l_parent_wo_id;
7637 IF get_parent_wo%FOUND THEN
7638 p_x_relationship_tbl(rel_count).parent_wip_entity_id := l_parent_wo_id;
7639 END IF;
7640 CLOSE get_parent_wo;
7641 EXIT;
7642 END IF;
7643 END LOOP;
7644 END IF; /*NR-MR Changes - sowsubra*/
7645 END IF;
7646
7647 -- If no Parent MR is found set the parent as the Visit
7648 IF ( p_x_relationship_tbl(rel_count).parent_header_id IS NULL ) THEN
7649 p_x_relationship_tbl(rel_count).parent_header_id := 0;
7650 /*OPEN get_mwo(p_visit_id);
7651 FETCH get_mwo INTO l_parent_wip_entity_id;
7652 IF get_mwo%FOUND THEN*/
7653 p_x_relationship_tbl(rel_count).parent_wip_entity_id := l_parent_wip_entity_id;
7654 /*END IF;
7655 CLOSE get_mwo;*/
7656 END IF;
7657 END IF;
7658 CLOSE get_wo;
7659
7660 IF (l_log_statement >= l_log_current_level) THEN
7661 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Total MRs for Visit : ' || l_mrs_for_UE.COUNT);
7662 END IF;
7663 END LOOP;
7664 END IF;
7665
7666 IF (l_log_statement >= l_log_current_level) THEN
7667 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Getting Tasks for MRs');
7668 END IF;
7669 -- Get all the Tasks for a MR.
7670 IF ( l_mrs_for_UE.COUNT > 0 ) THEN
7671 FOR i IN l_mrs_for_UE.FIRST..l_mrs_for_UE.LAST
7672 LOOP
7673 FOR mr_tasks_cursor IN get_tasks_for_mr( p_visit_id, l_mrs_for_UE(i).visit_task_id )
7674 LOOP
7675 OPEN get_wo(mr_tasks_cursor.visit_task_id);
7676 FETCH get_wo INTO l_wip_entity_id;
7677 IF get_wo%NOTFOUND THEN
7678 rel_count := rel_count + 1;
7679 p_x_relationship_tbl(rel_count).batch_id := p_visit_number;
7680 p_x_relationship_tbl(rel_count).parent_header_id := l_mrs_for_UE(i).visit_task_number;
7681 p_x_relationship_tbl(rel_count).child_header_id := mr_tasks_cursor.visit_task_number;
7682 p_x_relationship_tbl(rel_count).relationship_type := 1;
7683 p_x_relationship_tbl(rel_count).dml_operation := 'C';
7684
7685 -- if this visit task is already in shop floor then get the wip_entity_id
7686 OPEN get_parent_wo(l_mrs_for_UE(i).visit_task_id);
7687 FETCH get_parent_wo INTO l_parent_wip_entity_id;
7688 IF get_parent_wo%FOUND THEN
7689 p_x_relationship_tbl(rel_count).parent_wip_entity_id := l_parent_wip_entity_id;
7690 END IF;
7691 CLOSE get_parent_wo;
7692 END IF;
7693 CLOSE get_wo;
7694 END LOOP;
7695 END LOOP;
7696 END IF;
7697
7698 IF (l_log_procedure >= l_log_current_level) THEN
7699 fnd_log.string(l_log_procedure,L_DEBUG_KEY,'Total Relationships : ' || p_x_relationship_tbl.COUNT );
7700 fnd_log.string(l_log_procedure,L_DEBUG_KEY||'.end','At the end of the procedure');
7701 END IF;
7702
7703 END Get_MR_Relationships;
7704
7705 --------------------------------------------------------------------
7706 -- PROCEDURE
7707 -- Push_MR_to_Production
7708 --
7709 -- PURPOSE
7710 -- To push MR along with all its tasks to Production
7711 --------------------------------------------------------------------
7712 PROCEDURE Push_MR_to_Production
7713 ( p_api_version IN NUMBER,
7714 p_init_msg_list IN VARCHAR2 := Fnd_Api.g_false,
7715 p_commit IN VARCHAR2 := Fnd_Api.g_false,
7716 p_validation_level IN NUMBER := Fnd_Api.g_valid_level_full,
7717 p_module_type IN VARCHAR2 := Null,
7718 p_visit_id IN NUMBER,
7719 p_unit_effectivity_id IN NUMBER,
7720 p_release_flag IN VARCHAR2 := 'N',
7721 x_return_status OUT NOCOPY VARCHAR2,
7722 x_msg_count OUT NOCOPY NUMBER,
7723 x_msg_data OUT NOCOPY VARCHAR2
7724 )
7725 IS
7726 L_API_VERSION CONSTANT NUMBER := 1.0;
7727 L_API_NAME CONSTANT VARCHAR2(30) := 'Push_MR_to_Production';
7728 L_DEBUG_KEY CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
7729 l_prd_workorder_tbl AHL_PRD_WORKORDER_PVT.PRD_WORKORDER_TBL;
7730 l_prd_workorder_rel_tbl AHL_PRD_WORKORDER_PVT.PRD_WORKORDER_REL_TBL;
7731 l_firm_planned_flag VARCHAR2(1) := FND_PROFILE.value( 'AHL_PRD_FIRM_PLANNED_FLAG' );
7732 l_return_status VARCHAR2(1);
7733 l_msg_count NUMBER;
7734 l_msg_data VARCHAR2(2000);
7735 l_init_msg_list VARCHAR2(1) := 'F';
7736 l_commit VARCHAR2(1) := 'F';
7737 idx NUMBER;
7738 l_count NUMBER;
7739 l_route_id NUMBER;
7740 l_visit_end_time DATE;
7741 l_dummy VARCHAR2(1);
7742
7743 -- To find visit related information
7744 CURSOR c_visit (x_visit_id IN NUMBER) IS
7745 SELECT * FROM AHL_VISITS_VL
7746 WHERE VISIT_ID = x_visit_id;
7747
7748 c_visit_rec c_visit%ROWTYPE;
7749
7750 -- To get all the tasks for the given UE
7751 CURSOR c_task (x_visit_id IN NUMBER, x_unit_effectivity_id IN NUMBER) IS
7752 SELECT * FROM AHL_VISIT_TASKS_VL
7753 WHERE VISIT_ID = x_visit_id
7754 AND NVL( STATUS_CODE, 'X' ) = 'PLANNING'
7755 /*NR-MR Changes*/
7756 START WITH unit_effectivity_id = x_unit_effectivity_id
7757 AND (( originating_task_id is null AND 'SR' <> p_module_type)
7758 OR ( originating_task_id is not null AND 'SR' = p_module_type
7759 and service_request_id is not null))
7760 CONNECT BY originating_task_id = PRIOR visit_task_id;
7761
7762 c_task_rec c_task%ROWTYPE;
7763
7764 -- To get the count of all the tasks for the given UE
7765 CURSOR c_task_ct (x_visit_id IN NUMBER, x_unit_effectivity_id IN NUMBER) IS
7766 SELECT count(*) FROM AHL_VISIT_TASKS_B
7767 WHERE VISIT_ID = x_visit_id
7768 AND NVL( STATUS_CODE, 'X' ) = 'PLANNING'
7769 /*NR-MR Changes*/
7770 START WITH unit_effectivity_id = x_unit_effectivity_id
7771 AND (( originating_task_id is null AND 'SR' <> p_module_type)
7772 OR ( originating_task_id is not null AND 'SR' = p_module_type
7773 and service_request_id is not null))
7774 CONNECT BY originating_task_id = PRIOR visit_task_id;
7775
7776 -- To find Route Id from MR Routes view
7777 CURSOR c_route (x_id IN NUMBER) IS
7778 SELECT Route_Id FROM AHL_MR_ROUTES_V
7779 WHERE MR_ROUTE_ID = x_id;
7780
7781 --To get summary task start, end time
7782 CURSOR get_summary_task_times_csr(x_task_id IN NUMBER)IS
7783 SELECT min(start_date_time), max(end_date_time)
7784 FROM ahl_visit_tasks_vl VST
7785 START WITH visit_task_id = x_task_id
7786 AND NVL(VST.status_code, 'Y') <> 'DELETED'
7787 CONNECT BY originating_task_id = PRIOR visit_task_id;
7788
7789 CURSOR c_visit_task_exists(x_visit_id IN NUMBER)
7790 IS
7791 SELECT 'x'
7792 FROM ahl_visit_tasks_b
7793 WHERE visit_id = x_visit_id
7794 AND STATUS_CODE = 'PLANNING';
7795
7796
7797 CURSOR c_get_wo_details(x_visit_id IN NUMBER)
7798 IS
7799 SELECT
7800 scheduled_start_date,
7801 SCHEDULED_COMPLETION_DATE
7802 FROM wip_discrete_jobs
7803 WHERE wip_entity_id =
7804 (
7805 SELECT
7806 wip_entity_id
7807 FROM ahl_workorders
7808 WHERE
7809 master_workorder_flag = 'Y' AND
7810 visit_task_id IS null AND
7811 status_code not in (22,7) and
7812 visit_id=x_visit_id
7813 );
7814
7815 c_get_wo_details_rec c_get_wo_details%ROWTYPE;
7816 l_curr_task_id NUMBER := 0;
7817
7818 -- SATHAPLI::Bug 5758813, 04-Jun-2008
7819 -- Cursor to get the required format for the workorder description, given a visit task.
7820 CURSOR get_wo_dtls_for_mrtasks_cur (c_visit_task_id IN NUMBER) IS
7821 SELECT ar.route_no||'.'||SUBSTR(ar.title, 1, (240 - (LENGTH(ar.route_no) + 1))) workorder_description
7822 FROM ahl_routes_vl ar, ahl_visit_tasks_b avt,
7823 ahl_mr_routes mrr
7824 WHERE avt.visit_task_id = c_visit_task_id
7825 AND NVL(avt.status_code, 'X') = 'PLANNING'
7826 AND avt.mr_route_id = mrr.mr_route_id
7827 AND mrr.route_id = ar.route_id;
7828
7829 l_get_wo_dtls_rec get_wo_dtls_for_mrtasks_cur%ROWTYPE;
7830
7831 BEGIN
7832 --------------------- initialize -----------------------
7833
7834 SAVEPOINT Push_MR_to_Production;
7835
7836 IF (l_log_procedure >= l_log_current_level) THEN
7837 fnd_log.string(l_log_procedure,L_DEBUG_KEY||'.begin','At the begin of the procedure');
7838 END IF;
7839
7840 -- Initialize message list if p_init_msg_list is set to TRUE.
7841 IF Fnd_Api.to_boolean(p_init_msg_list) THEN
7842 Fnd_Msg_Pub.initialize;
7843 END IF;
7844
7845 -- Initialize API return status to success
7846 x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
7847
7848 -- Standard call to check for call compatibility.
7849 IF NOT Fnd_Api.COMPATIBLE_API_CALL(l_api_version,
7850 p_api_version,
7851 l_api_name,G_PKG_NAME) THEN
7852 RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
7853 END IF;
7854
7855 IF (l_log_statement >= l_log_current_level) THEN
7856 fnd_log.string(l_log_statement,L_DEBUG_KEY,'p_unit_effectivity_id : '||p_unit_effectivity_id||'Visit Id : ' || p_visit_id);
7857 END IF;
7858
7859 --Create project tasks for the given MR
7860 IF (l_log_statement >= l_log_current_level) THEN
7861 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Before calling Add_MR_to_Projects');
7862 END IF;
7863
7864 Add_MR_to_Project
7865 (p_api_version => l_api_version,
7866 p_init_msg_list => p_init_msg_list,
7867 p_commit => l_commit,
7868 p_validation_level => p_validation_level,
7869 p_module_type => p_module_type,
7870 p_visit_id => p_visit_id,
7871 p_unit_effectivity_id => p_unit_effectivity_id,
7872 x_return_status => l_return_status,
7873 x_msg_count => l_msg_count,
7874 x_msg_data => x_msg_data);
7875
7876 IF (l_log_statement >= l_log_current_level) THEN
7877 fnd_log.string(l_log_statement,L_DEBUG_KEY,'After calling Add_MR_to_Projects - l_return_status : '||l_return_status);
7878 END IF;
7879
7880 IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
7881 -- Check Error Message stack.
7882 x_msg_count := FND_MSG_PUB.count_msg;
7883 RAISE Fnd_Api.g_exc_error;
7884 END IF;
7885
7886 OPEN c_visit (p_visit_id);
7887 FETCH c_visit INTO c_visit_rec;
7888 CLOSE c_visit;
7889
7890 -- Create Workorders for MR tasks
7891 OPEN c_task_ct(p_visit_id, p_unit_effectivity_id);
7892 FETCH c_task_ct INTO l_count;
7893 CLOSE c_task_ct;
7894
7895 IF (l_log_statement >= l_log_current_level) THEN
7896 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Task Count' || l_count);
7897 END IF;
7898
7899 IF l_count > 0 THEN
7900 idx := 0;
7901 OPEN c_task(p_visit_id, p_unit_effectivity_id);
7902 FETCH c_task INTO c_task_rec;
7903 WHILE c_task%FOUND LOOP
7904 IF (l_curr_task_id <> c_task_rec.visit_task_id) THEN
7905 idx := idx+1;
7906 l_prd_workorder_tbl(idx).DML_OPERATION := 'C';
7907 IF p_release_flag = 'Y' THEN
7908 l_prd_workorder_tbl(idx).STATUS_CODE := '3'; -- Released
7909 ELSE
7910 l_prd_workorder_tbl(idx).STATUS_CODE := '1'; -- Unreleased
7911 END IF;
7912
7913 IF ( l_firm_planned_flag IS NOT NULL AND l_firm_planned_flag = '2' ) THEN
7914 l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG := 2; -- Planned
7915 ELSE
7916 l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG := 1; -- Firm
7917 END IF;
7918
7919 IF ( c_task_rec.task_type_code = 'SUMMARY' ) THEN
7920 l_prd_workorder_tbl(idx).MASTER_WORKORDER_FLAG := 'Y';
7921 ELSE
7922 l_prd_workorder_tbl(idx).MASTER_WORKORDER_FLAG := 'N';
7923 END IF;
7924
7925 l_prd_workorder_tbl(idx).BATCH_ID := c_visit_rec.visit_number;
7926 l_prd_workorder_tbl(idx).HEADER_ID := c_task_rec.visit_task_number;
7927 l_prd_workorder_tbl(idx).VISIT_ID := p_visit_id;
7928 l_prd_workorder_tbl(idx).ORGANIZATION_ID := c_visit_rec.organization_id;
7929 l_prd_workorder_tbl(idx).PROJECT_ID := c_visit_rec.project_id;
7930 l_prd_workorder_tbl(idx).INVENTORY_ITEM_ID := c_task_rec.inventory_item_id ;
7931 l_prd_workorder_tbl(idx).ITEM_INSTANCE_ID := c_task_rec.instance_id ;
7932 l_prd_workorder_tbl(idx).VISIT_TASK_ID := c_task_rec.visit_task_id ;
7933 l_prd_workorder_tbl(idx).VISIT_TASK_NUMBER := c_task_rec.visit_task_number ;
7934 l_prd_workorder_tbl(idx).PROJECT_TASK_ID := c_task_rec.project_task_id ;
7935
7936 -- SATHAPLI::Bug 5758813, 04-Jun-2008, fix start
7937 -- For planned (route) tasks, set the workorder description with the required format.
7938 -- l_prd_workorder_tbl(idx).JOB_DESCRIPTION := c_task_rec.visit_task_name ;
7939 IF (c_task_rec.task_type_code IN ('SUMMARY','UNASSOCIATED')) THEN
7940 l_prd_workorder_tbl(idx).JOB_DESCRIPTION := c_task_rec.visit_task_name;
7941 ELSE
7942 -- Fetch the required format for the workorder description.
7943 OPEN get_wo_dtls_for_mrtasks_cur(c_task_rec.visit_task_id);
7944 FETCH get_wo_dtls_for_mrtasks_cur INTO l_get_wo_dtls_rec;
7945 CLOSE get_wo_dtls_for_mrtasks_cur;
7946 l_prd_workorder_tbl(idx).JOB_DESCRIPTION := l_get_wo_dtls_rec.workorder_description;
7947 END IF;
7948 -- SATHAPLI::Bug 5758813, 04-Jun-2008, fix end
7949
7950 IF c_task_rec.mr_route_id IS NOT NULL AND c_task_rec.mr_route_id <> FND_API.g_miss_num THEN
7951 OPEN c_route (c_task_rec.mr_route_id);
7952 FETCH c_route INTO l_route_id;
7953 CLOSE c_route;
7954 l_prd_workorder_tbl(idx).ROUTE_ID := l_route_id ;
7955 ELSE
7956 l_prd_workorder_tbl(idx).ROUTE_ID := Null;
7957 END IF;
7958
7959 IF c_task_rec.department_id IS NOT NULL
7960 AND c_task_rec.department_id <> FND_API.g_miss_num THEN
7961 l_prd_workorder_tbl(idx).DEPARTMENT_ID := c_task_rec.department_id ;
7962 ELSE
7963 l_prd_workorder_tbl(idx).DEPARTMENT_ID := c_visit_rec.department_id ;
7964 END IF;
7965
7966 --If summary task, use the min,max for sub tasks
7967 IF (c_task_rec.task_type_code = 'SUMMARY') THEN
7968 OPEN get_summary_task_times_csr(c_task_rec.visit_task_id);
7969 FETCH get_summary_task_times_csr INTO l_prd_workorder_tbl(idx).SCHEDULED_START_DATE,
7970 l_prd_workorder_tbl(idx).SCHEDULED_END_DATE ;
7971 CLOSE get_summary_task_times_csr;
7972 ELSE
7973 l_prd_workorder_tbl(idx).SCHEDULED_START_DATE := c_task_rec.START_DATE_TIME;
7974 l_prd_workorder_tbl(idx).SCHEDULED_END_DATE := c_task_rec.END_DATE_TIME;
7975 END IF;
7976 /*NR-MR Changes*/
7977 l_curr_task_id := c_task_rec.visit_task_id;
7978 END IF;
7979 FETCH c_task INTO c_task_rec;
7980 END LOOP;
7981 CLOSE c_task;
7982 END IF; -- l_count
7983
7984 IF l_prd_workorder_tbl.COUNT > 0 THEN
7985 IF (l_log_statement >= l_log_current_level) THEN
7986 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Before Getting MR Relationships ');
7987 END IF;
7988
7989 Get_MR_Relationships
7990 (
7991 p_visit_id => p_visit_id,
7992 p_visit_number => c_visit_rec.visit_number,
7993 p_unit_effectivity_id =>p_unit_effectivity_id,
7994 p_module_type => p_module_type, /*NR-MR Changes - sowsubra*/
7995 p_x_relationship_tbl => l_prd_workorder_rel_tbl
7996 );
7997
7998 IF (l_log_statement >= l_log_current_level) THEN
7999 fnd_log.string(l_log_statement,L_DEBUG_KEY,'After Getting MR Relationships ');
8000 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Before Getting MR Dependencies ');
8001 END IF;
8002
8003 Get_MR_Dependencies
8004 (
8005 p_visit_id => p_visit_id,
8006 p_visit_number => c_visit_rec.visit_number,
8007 p_unit_effectivity_id =>p_unit_effectivity_id,
8008 p_module_type => p_module_type, /*NR-MR Changes - sowsubra*/
8009 p_x_relationship_tbl => l_prd_workorder_rel_tbl
8010 );
8011
8012 IF (l_log_statement >= l_log_current_level) THEN
8013 fnd_log.string(l_log_statement,L_DEBUG_KEY,'After Getting MR Dependencies ');
8014 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Before calling AHL_PRD_WORKORDER_PVT.Process_Jobs ');
8015 END IF;
8016
8017 AHL_PRD_WORKORDER_PVT.Process_Jobs
8018 (
8019 p_api_version => p_api_version,
8020 p_init_msg_list => p_init_msg_list,
8021 p_commit => FND_API.G_FALSE,
8022 p_validation_level => p_validation_level,
8023 p_default => FND_API.G_TRUE,
8024 p_module_type => p_module_type,
8025 x_return_status => l_return_status,
8026 x_msg_count => x_msg_count,
8027 x_msg_data => x_msg_data,
8028 p_x_prd_workorder_tbl => l_prd_workorder_tbl,
8029 p_prd_workorder_rel_tbl=> l_prd_workorder_rel_tbl
8030 );
8031
8032 IF (l_log_statement >= l_log_current_level) THEN
8033 fnd_log.string(l_log_statement,L_DEBUG_KEY,'After calling AHL_PRD_WORKORDER_PVT.Process_Jobs - l_return_status : '||l_return_status);
8034 END IF;
8035
8036 IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
8037 IF (l_log_statement >= l_log_current_level) THEN
8038 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Errors from process_jobs API : ' || x_msg_count );
8039 END IF;
8040 RAISE Fnd_Api.g_exc_error;
8041 END IF;
8042
8043 -- SATHAPLI::Bug 5758813, 04-Jun-2008, fix start
8044 -- Update the project tasks' (corresponding to the visit tasks) start and end date with those of the workorders' created above.
8045 IF (l_log_statement >= l_log_current_level) THEN
8046 fnd_log.string(l_log_statement, l_debug_key, 'Before calling Update_Project_Task_Times.');
8047 END IF;
8048
8049 Update_Project_Task_Times(
8050 p_prd_workorder_tbl => l_prd_workorder_tbl,
8051 p_commit => 'F',
8052 x_return_status => l_return_status,
8053 x_msg_count => x_msg_count,
8054 x_msg_data => x_msg_data
8055 );
8056
8057 IF (l_log_statement >= l_log_current_level) THEN
8058 fnd_log.string(l_log_statement, l_debug_key, 'After calling Update_Project_Task_Times. x_return_status => '||x_return_status);
8059 END IF;
8060
8061 IF (l_return_status = FND_API.G_RET_STS_ERROR) THEN
8062 RAISE FND_API.G_EXC_ERROR;
8063 ELSIF (l_return_status = FND_API.G_RET_STS_UNEXP_ERROR) THEN
8064 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
8065 END IF;
8066 -- SATHAPLI::Bug 5758813, 04-Jun-2008, fix end
8067 END IF; -- To find if the visit has any tasks
8068
8069 -- Update the status of all the tasks for this given UE to RELEASED
8070 OPEN c_task(p_visit_id, p_unit_effectivity_id);
8071 FETCH c_task INTO c_task_rec;
8072 WHILE c_task%FOUND
8073 LOOP
8074 UPDATE AHL_VISIT_TASKS_B
8075 SET STATUS_CODE = 'RELEASED',
8076 OBJECT_VERSION_NUMBER = OBJECT_VERSION_NUMBER + 1
8077 WHERE VISIT_ID = p_visit_id
8078 AND VISIT_TASK_ID = c_task_rec.visit_task_id
8079 AND STATUS_CODE = 'PLANNING';
8080
8081 FETCH c_task INTO c_task_rec;
8082 END LOOP;
8083 CLOSE c_task;
8084
8085 -- Update visit status to RELEASED only if no other change of the visit
8086 -- needs to be pushed to production
8087 OPEN c_visit_task_exists(c_visit_rec.visit_id);
8088 FETCH c_visit_task_exists INTO l_dummy;
8089
8090 OPEN c_get_wo_details(c_visit_rec.visit_id);
8091 FETCH c_get_wo_details into c_get_wo_details_rec;
8092 IF (c_visit_task_exists%NOTFOUND and
8093 c_visit_rec.start_date_time = c_get_wo_details_rec.scheduled_start_date and
8094 c_visit_rec.close_date_time = c_get_wo_details_rec.scheduled_completion_date) THEN
8095 UPDATE ahl_visits_b
8096 SET status_code = 'RELEASED',
8097 object_version_number = object_version_number + 1
8098 WHERE visit_id = c_visit_rec.visit_id;
8099
8100 IF (l_log_statement >= l_log_current_level) THEN
8101 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Before AHL_VWP_RULES_PVT.Update_Visit_Task_Flag Call');
8102 END IF;
8103
8104 IF c_visit_rec.any_task_chg_flag = 'Y' THEN
8105 AHL_VWP_RULES_PVT.Update_Visit_Task_Flag
8106 (p_visit_id => c_visit_rec.visit_id,
8107 p_flag => 'N',
8108 x_return_status => x_return_status);
8109 END IF;
8110
8111 IF (l_log_statement >= l_log_current_level) THEN
8112 fnd_log.string(l_log_statement,L_DEBUG_KEY,'After AHL_VWP_RULES_PVT.Update_Visit_Task_Flag Call');
8113 END IF;
8114 END IF;
8115 ---------------------------End of Body-------------------------------------
8116 -- Standard check of p_commit.
8117 IF Fnd_Api.To_Boolean (p_commit) THEN
8118 COMMIT WORK;
8119 END IF;
8120
8121 Fnd_Msg_Pub.count_and_get(
8122 p_encoded => Fnd_Api.g_false,
8123 p_count => x_msg_count,
8124 p_data => x_msg_data
8125 );
8126
8127 IF (l_log_procedure >= l_log_current_level) THEN
8128 fnd_log.string(l_log_procedure,L_DEBUG_KEY||'.end','At the end of plsql procedure');
8129 END IF;
8130
8131 EXCEPTION
8132 WHEN Fnd_Api.g_exc_error THEN
8133 ROLLBACK TO Push_MR_to_Production;
8134 x_return_status := Fnd_Api.g_ret_sts_error;
8135 Fnd_Msg_Pub.count_and_get (
8136 p_encoded => Fnd_Api.g_false,
8137 p_count => x_msg_count,
8138 p_data => x_msg_data
8139 );
8140 WHEN Fnd_Api.g_exc_unexpected_error THEN
8141 ROLLBACK TO Push_MR_to_Production;
8142 x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
8143 Fnd_Msg_Pub.count_and_get (
8144 p_encoded => Fnd_Api.g_false,
8145 p_count => x_msg_count,
8146 p_data => x_msg_data
8147 );
8148 WHEN OTHERS THEN
8149 ROLLBACK TO Push_MR_to_Production;
8150 x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
8151 IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_unexp_error)
8152 THEN
8153 Fnd_Msg_Pub.add_exc_msg (G_PKG_NAME, l_api_name);
8154 END IF;
8155 Fnd_Msg_Pub.count_and_get (
8156 p_encoded => Fnd_Api.g_false,
8157 p_count => x_msg_count,
8158 p_data => x_msg_data
8159 );
8160 END Push_MR_to_Production;
8161
8162 --------------------------------------------------------------------
8163 -- PROCEDURE
8164 -- Add_MR_to_Project
8165 --
8166 -- PURPOSE
8167 -- To add Project Task for all the tasks for a given MR
8168 -- when SR tasks are created in prodution
8169 --------------------------------------------------------------------
8170 PROCEDURE Add_MR_to_Project(
8171 p_api_version IN NUMBER,
8172 p_init_msg_list IN VARCHAR2 := Fnd_Api.g_false,
8173 p_commit IN VARCHAR2 := Fnd_Api.g_false,
8174 p_validation_level IN NUMBER := Fnd_Api.g_valid_level_full,
8175 p_module_type IN VARCHAR2 := Null,
8176 p_visit_id IN NUMBER,
8177 p_unit_effectivity_id IN NUMBER,
8178 x_return_status OUT NOCOPY VARCHAR2,
8179 x_msg_count OUT NOCOPY NUMBER,
8180 x_msg_data OUT NOCOPY VARCHAR2
8181 )
8182 IS
8183 L_API_VERSION CONSTANT NUMBER := 1.0;
8184 L_API_NAME CONSTANT VARCHAR2(30) := 'Add_MR_to_Project';
8185 L_DEBUG_KEY CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
8186 G_EXC_ERROR EXCEPTION;
8187 l_msg_count NUMBER;
8188 l_task_id NUMBER;
8189 l_pa_project_id_out NUMBER;
8190 l_msg_index_out NUMBER;
8191 l_return_status VARCHAR2(1);
8192 l_chk_project VARCHAR2(1);
8193 l_proj_ref_flag VARCHAR2(1);
8194 l_project_tsk_flag VARCHAR2(1);
8195 l_msg_data VARCHAR2(2000);
8196 l_pa_project_number_out VARCHAR2(25);
8197 l_commit VARCHAR2(1) := 'F';
8198 l_init_msg_list VARCHAR2(1) := 'F';
8199
8200 -- To find visit related information
8201 CURSOR c_visit (x_id IN NUMBER) IS
8202 SELECT * FROM AHL_VISITS_VL
8203 WHERE VISIT_ID = x_id;
8204 c_visit_rec c_visit%ROWTYPE;
8205
8206 -- To get all the tasks for the given UE
8207 CURSOR c_task (x_visit_id IN NUMBER, x_unit_effectivity_id IN NUMBER) IS
8208 SELECT * FROM AHL_VISIT_TASKS_VL
8209 WHERE VISIT_ID = x_visit_id
8210 AND NVL( STATUS_CODE, 'X' ) = 'PLANNING'
8211 START WITH unit_effectivity_id = x_unit_effectivity_id
8212 AND (( originating_task_id is null AND 'SR' <> p_module_type)
8213 OR ( originating_task_id is not null AND 'SR' = p_module_type
8214 and service_request_id is not null))
8215 CONNECT BY originating_task_id = PRIOR visit_task_id;
8216
8217 c_task_rec c_task%ROWTYPE;
8218 l_curr_task_id NUMBER := 0;
8219
8220 -- SATHAPLI::Bug 5758813, 04-Jun-2008
8221 -- Cursor to get the required format used for the project task name and description, given a visit task.
8222 -- First part of the UNION is for the planned tasks (routes) attached to the NR.
8223 -- Second part is for the corresponding NR and MR summary tasks.
8224 CURSOR get_prj_task_dtls_cur (c_visit_task_id IN NUMBER) IS
8225 SELECT SUBSTR(NVL(ar.route_no, avt.visit_task_name), 1, 20) task_name,
8226 SUBSTR(NVL(ar.title, avt.visit_task_name), 1, 250) description
8227 FROM ahl_routes_vl ar, ahl_visit_tasks_vl avt,
8228 ahl_mr_routes mrr
8229 WHERE avt.visit_task_id = c_visit_task_id
8230 AND NVL(avt.status_code, 'X') = 'PLANNING'
8231 AND avt.task_type_code NOT IN ('SUMMARY', 'UNASSOCIATED')
8232 AND avt.mr_route_id = mrr.mr_route_id (+)
8233 AND mrr.route_id = ar.route_id (+)
8234 UNION ALL
8235 SELECT SUBSTR(NVL(amh.title, avt.visit_task_name), 1, 20) task_name,
8236 NVL(amh.title, avt.visit_task_name) description
8237 FROM ahl_mr_headers_v amh, ahl_visit_tasks_vl avt
8238 WHERE avt.visit_task_id = c_visit_task_id
8239 AND NVL(avt.status_code, 'X') = 'PLANNING'
8240 AND avt.task_type_code = 'SUMMARY'
8241 AND avt.summary_task_flag = 'N'
8242 AND avt.mr_id = amh.mr_header_id (+);
8243
8244 l_get_prj_task_dtls_cur_rec get_prj_task_dtls_cur%ROWTYPE;
8245
8246 BEGIN
8247 --------------------- initialize -----------------------
8248 SAVEPOINT Add_MR_to_Project;
8249
8250 IF (l_log_procedure >= l_log_current_level) THEN
8251 fnd_log.string(l_log_procedure,L_DEBUG_KEY||'.begin','At the start of plsql procedure');
8252 END IF;
8253
8254 -- Initialize message list if p_init_msg_list is set to TRUE.
8255 IF Fnd_Api.to_boolean(p_init_msg_list) THEN
8256 Fnd_Msg_Pub.initialize;
8257 END IF;
8258
8259 -- Initialize API return status to success
8260 x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
8261
8262 -- Standard call to check for call compatibility.
8263 IF NOT Fnd_Api.COMPATIBLE_API_CALL(l_api_version,
8264 p_api_version,
8265 l_api_name,G_PKG_NAME) THEN
8266 RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
8267 END IF;
8268
8269 IF (l_log_statement >= l_log_current_level) THEN
8270 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Unit Effectivity ID = ' || p_unit_effectivity_id);
8271 END IF;
8272
8273 ----------------------------------------- Start of Body ----------------------------------
8274 -- To check Project responsibilites
8275
8276 -- Begin changes by jaramana on Mar 4, 2008 for bug 6788115 (FP of 6759574)
8277 -- As per update from ravichandran.velusamy in Projects team in the bug 6759574,
8278 -- the call to PA_INTERFACE_UTILS_PUB.Set_Global_Info may be removed.
8279 -- AHL_VWP_RULES_PVT.Check_Proj_Responsibility calls PA_INTERFACE_UTILS_PUB.Set_Global_Info
8280 /***
8281 AHL_VWP_RULES_PVT.Check_Proj_Responsibility
8282 (x_check_project => l_chk_project,
8283 x_return_status => l_return_status);
8284
8285 IF l_return_status <> Fnd_Api.G_RET_STS_SUCCESS THEN
8286 x_return_status := l_return_status;
8287 RAISE G_EXC_ERROR;
8288 END IF;
8289
8290 ***/
8291 l_chk_project := 'Y';
8292 -- End changes by jaramana on Mar 4, 2008 for bug 6788115 (FP of 6759574)
8293
8294 IF (l_log_statement >= l_log_current_level) THEN
8295 fnd_log.string(l_log_statement,L_DEBUG_KEY,'l_chk_project = ' || l_chk_project);
8296 END IF;
8297
8298 IF l_chk_project = 'Y' THEN
8299 ----------------------------------------- Cursor ----------------------------------
8300 OPEN c_Visit(p_visit_id);
8301 FETCH c_visit INTO c_visit_rec;
8302 CLOSE c_Visit;
8303
8304 OPEN c_task(p_visit_id, p_unit_effectivity_id);
8305 FETCH c_task INTO c_task_rec;
8306 WHILE c_task%FOUND
8307 LOOP
8308 IF ((c_task_rec.PROJECT_TASK_ID IS NULL) AND (l_curr_task_id <> c_task_rec.visit_task_id))THEN
8309 IF (l_log_statement >= l_log_current_level) THEN
8310 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Before calling PA_PROJECT_PUB.Check_Unique_Task_Number');
8311 END IF;
8312
8313 PA_PROJECT_PUB.Check_Unique_Task_Number
8314 ( p_api_version_number => 1,
8315 p_init_msg_list => l_init_msg_list,
8316 p_return_status => l_return_status,
8317 p_msg_count => l_msg_count,
8318 p_msg_data => l_msg_data,
8319 p_project_id => c_visit_rec.project_id,
8320 p_pm_project_reference => c_visit_rec.visit_number,
8321 p_task_number => c_task_rec.visit_task_number,
8322 p_unique_task_number_flag => l_project_tsk_flag
8323 ) ;
8324
8325 IF (l_log_statement >= l_log_current_level) THEN
8326 fnd_log.string(l_log_statement,L_DEBUG_KEY,'After calling PA_PROJECT_PUB.Check_Unique_Task_Number - l_project_tsk_flag : '|| l_project_tsk_flag);
8327 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Before calling PA_PROJECT_PUB.Check_Unique_Task_Reference');
8328 END IF;
8329
8330 PA_PROJECT_PUB.Check_Unique_Task_Reference
8331 ( p_api_version_number => 1,
8332 p_init_msg_list => l_init_msg_list,
8333 p_return_status => l_return_status,
8334 p_msg_count => l_msg_count,
8335 p_msg_data => l_msg_data,
8336 p_project_id => c_visit_rec.project_id,
8337 p_pm_project_reference => c_visit_rec.visit_number,
8338 p_pm_task_reference => c_task_rec.visit_task_number,
8339 p_unique_task_ref_flag => l_proj_ref_flag
8340 );
8341
8342 IF (l_log_statement >= l_log_current_level) THEN
8343 fnd_log.string(l_log_statement,L_DEBUG_KEY,'After calling PA_PROJECT_PUB.Check_Unique_Task_Reference - l_proj_ref_flag = ' || l_proj_ref_flag);
8344 END IF;
8345
8346 IF l_project_tsk_flag = 'Y' AND l_proj_ref_flag = 'Y' THEN
8347 IF (l_log_statement >= l_log_current_level) THEN
8348 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Before calling PA_PROJECT_PUB.ADD_TASK');
8349 fnd_log.string(l_log_statement,L_DEBUG_KEY,'c_task_rec.PROJECT_ID=:' || c_visit_rec.PROJECT_ID);
8350 fnd_log.string(l_log_statement,L_DEBUG_KEY,'c_task_rec.VISIT_NUMBER=:' || c_visit_rec.VISIT_NUMBER);
8351 fnd_log.string(l_log_statement,L_DEBUG_KEY,'c_task_rec.VISIT_TASK_NUMBER=:' || c_task_rec.VISIT_TASK_NUMBER);
8352 fnd_log.string(l_log_statement,L_DEBUG_KEY,'c_task_rec.VISIT_TASK_NAME=:' || c_task_rec.VISIT_TASK_NAME);
8353 fnd_log.string(l_log_statement,L_DEBUG_KEY,'c_task_rec.DESCRIPTION=:' || c_task_rec.DESCRIPTION);
8354 END IF;
8355
8356 -- SATHAPLI::Bug 5758813, 04-Jun-2008 - Fetch the required format for the project task's name and description.
8357 OPEN get_prj_task_dtls_cur(c_task_rec.visit_task_id);
8358 FETCH get_prj_task_dtls_cur INTO l_get_prj_task_dtls_cur_rec;
8359 CLOSE get_prj_task_dtls_cur;
8360
8361 PA_PROJECT_PUB.ADD_TASK
8362 (p_api_version_number => 1
8363 ,p_commit => l_commit
8364 ,p_init_msg_list => l_init_msg_list
8365 ,p_msg_count => l_msg_count
8366 ,p_msg_data => l_msg_data
8367 ,p_return_status => l_return_status
8368 ,p_pm_product_code => G_PM_PRODUCT_CODE
8369 -- yazhou 26Sept2005 starts
8370 -- ER#4618348
8371 -- ,p_pm_project_reference => c_task_rec.VISIT_NUMBER
8372 -- yazhou 26Sept2005 ends
8373 ,p_pa_project_id => c_visit_rec.PROJECT_ID
8374 ,p_pm_task_reference => c_task_rec.VISIT_TASK_NUMBER
8375 ,p_pa_task_number => c_task_rec.VISIT_TASK_NUMBER
8376 -- SATHAPLI::Bug 5758813, 04-Jun-2008 - fix start
8377 -- Set the task name and description with the required format. Set the task start and end date too.
8378 -- ,p_task_name => SUBSTR( c_task_rec.VISIT_TASK_NAME , 1,15)
8379 -- ,p_task_description => c_task_rec.DESCRIPTION
8380 ,p_task_name => l_get_prj_task_dtls_cur_rec.task_name
8381 ,p_task_description => l_get_prj_task_dtls_cur_rec.description
8382 ,p_task_start_date => trunc(c_task_rec.start_date_time)
8383 ,p_task_completion_date => trunc(c_task_rec.end_date_time)
8384 -- SATHAPLI::Bug 5758813, 04-Jun-2008 - fix end
8385 ,p_pa_project_id_out => l_pa_project_id_out
8386 ,p_pa_project_number_out => l_pa_project_number_out
8387 ,p_task_id => l_task_id
8388 );
8389
8390 IF (l_log_statement >= l_log_current_level) THEN
8391 fnd_log.string(l_log_statement,L_DEBUG_KEY,'After calling PA_PROJECT_PUB.ADD_TASK - l_return_status : '||l_return_status);
8392 END IF;
8393
8394 IF (l_return_status <> 'S') THEN
8395 IF (fnd_msg_pub.count_msg > 0 ) THEN
8396 FOR i IN 1..fnd_msg_pub.count_msg
8397 LOOP
8398 fnd_msg_pub.get(p_msg_index => i,
8399 p_encoded => 'F',
8400 p_data => l_msg_data,
8401 p_msg_index_out => l_msg_index_out);
8402 IF (l_log_statement >= l_log_current_level) THEN
8403 fnd_log.string(l_log_statement,L_DEBUG_KEY,': Error' ||l_msg_data);
8404 END IF;
8405 END LOOP;
8406 ELSE
8407 IF (l_log_statement >= l_log_current_level) THEN
8408 fnd_log.string(l_log_statement,L_DEBUG_KEY,': Another Error ='||l_msg_data);
8409 END IF;
8410 END IF;
8411 RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
8412 END IF;
8413
8414 IF l_return_status = 'S' THEN
8415 /*NR-MR Changes - added this to ensure that duplicates are not passed*/
8416 l_curr_task_id := c_task_rec.visit_task_id;
8417 UPDATE AHL_VISIT_TASKS_B SET PROJECT_TASK_ID = l_task_id,
8418 OBJECT_VERSION_NUMBER = c_task_rec.object_version_number + 1
8419 WHERE VISIT_TASK_ID = c_task_rec.visit_task_id;
8420 END IF;
8421 ELSIF l_project_tsk_flag = 'N' AND l_proj_ref_flag = 'Y' THEN
8422 x_return_status := Fnd_Api.g_ret_sts_error;
8423 IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_error) THEN
8424 Fnd_Message.set_name ('AHL', 'AHL_VWP_PROJ_TSK_REF_NOT_UNIQ');
8425 Fnd_Msg_Pub.ADD;
8426 END IF;
8427 ELSIF l_project_tsk_flag = 'Y' AND l_proj_ref_flag = 'N' THEN
8428 x_return_status := Fnd_Api.g_ret_sts_error;
8429 IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_error) THEN
8430 Fnd_Message.set_name ('AHL', 'AHL_VWP_PROJ_TSK_NUM_NOT_UNIQ');
8431 Fnd_Msg_Pub.ADD;
8432 END IF;
8433 ELSE
8434 x_return_status := Fnd_Api.g_ret_sts_error;
8435 IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_error) THEN
8436 Fnd_Message.set_name ('AHL', 'AHL_VWP_PROJ_TASK_NOT_UNIQUE');
8437 Fnd_Msg_Pub.ADD;
8438 END IF;
8439 END IF;
8440 END IF; -- project_task_id is null
8441 FETCH c_task INTO c_task_rec;
8442 END LOOP;
8443 CLOSE c_task;
8444 END IF; -- l_chk_project
8445 ---------------------------End of Body-------------------------------------
8446 -- Standard check of p_commit.
8447
8448 IF Fnd_Api.To_Boolean ( p_commit ) THEN
8449 COMMIT WORK;
8450 END IF;
8451
8452 Fnd_Msg_Pub.count_and_get(
8453 p_encoded => Fnd_Api.g_false,
8454 p_count => x_msg_count,
8455 p_data => x_msg_data
8456 );
8457
8458 IF (l_log_procedure >= l_log_current_level) THEN
8459 fnd_log.string(l_log_procedure,L_DEBUG_KEY||'.end','At the end of plsql procedure');
8460 END IF;
8461
8462 EXCEPTION
8463 WHEN Fnd_Api.g_exc_error THEN
8464 ROLLBACK TO Add_MR_to_Project;
8465 x_return_status := Fnd_Api.g_ret_sts_error;
8466 Fnd_Msg_Pub.count_and_get (
8467 p_encoded => Fnd_Api.g_false,
8468 p_count => x_msg_count,
8469 p_data => x_msg_data
8470 );
8471 WHEN Fnd_Api.g_exc_unexpected_error THEN
8472 ROLLBACK TO Add_MR_to_Project;
8473 x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
8474 Fnd_Msg_Pub.count_and_get (
8475 p_encoded => Fnd_Api.g_false,
8476 p_count => x_msg_count,
8477 p_data => x_msg_data
8478 );
8479 WHEN OTHERS THEN
8480 ROLLBACK TO Add_MR_to_Project;
8481 x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
8482 IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_unexp_error)
8483 THEN
8484 Fnd_Msg_Pub.add_exc_msg (G_PKG_NAME, l_api_name);
8485 END IF;
8486 Fnd_Msg_Pub.count_and_get (
8487 p_encoded => Fnd_Api.g_false,
8488 p_count => x_msg_count,
8489 p_data => x_msg_data
8490 );
8491 END Add_MR_to_Project;
8492
8493 -- AnRaj: Added as part of Material Requirement Aggrgation Enhancement, Bug#5303378
8494 -- Call aggregate_material_requirements for a visit
8495 -- If a visit task has more than one requirement for the same item, then this method will aggregate
8496 -- all those requirements into a single requirement
8497 PROCEDURE Aggregate_Material_Reqrs
8498 (p_api_version IN NUMBER,
8499 p_init_msg_list IN VARCHAR2,
8500 p_commit IN VARCHAR2,
8501 p_validation_level IN NUMBER,
8502 p_module_type IN VARCHAR2,
8503 p_visit_id IN NUMBER,
8504 x_return_status OUT NOCOPY VARCHAR2,
8505 x_msg_count OUT NOCOPY NUMBER,
8506 x_msg_data OUT NOCOPY VARCHAR2
8507 )
8508 IS
8509 -- get all tasks in planning status for a visit
8510 CURSOR get_visit_tasks_cur(c_visit_id NUMBER) IS
8511 SELECT visit_task_id
8512 FROM ahl_visit_tasks_b
8513 WHERE visit_id = c_visit_id
8514 AND NVL(status_code,'X') = 'PLANNING';
8515
8516 -- Declare local variables
8517 l_api_version CONSTANT NUMBER := 1.0;
8518 l_api_name CONSTANT VARCHAR2(30) := 'Aggregate_Material_Reqrs';
8519 L_DEBUG_KEY CONSTANT VARCHAR2(100) := 'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name;
8520 l_init_msg_list VARCHAR2(1) := 'F';
8521 l_return_status VARCHAR2(1);
8522 l_msg_count NUMBER;
8523 l_msg_data VARCHAR2(2000);
8524 l_visit_task_id NUMBER;
8525 l_reservation_id NUMBER;
8526 l_scheduled_matrial_id NUMBER;
8527 l_previous_item NUMBER := NULL;
8528
8529 BEGIN
8530 -- Standard start of API savepoint
8531 SAVEPOINT AGGREGATE_MATERIAL_REQRS;
8532
8533 -- Initialize return status to success before any code logic/validation
8534 x_return_status:= FND_API.G_RET_STS_SUCCESS;
8535
8536 -- Standard call to check for call compatibility
8537 IF NOT FND_API.COMPATIBLE_API_CALL (l_api_version, p_api_version, l_api_name, G_PKG_NAME)
8538 THEN
8539 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
8540 END IF;
8541
8542 -- Initialize message list if p_init_msg_list = FND_API.G_TRUE
8543 IF FND_API.TO_BOOLEAN(p_init_msg_list)
8544 THEN
8545 FND_MSG_PUB.INITIALIZE;
8546 END IF;
8547
8548 IF (l_log_procedure >= l_log_current_level) THEN
8549 fnd_log.string(l_log_procedure,
8550 L_DEBUG_KEY,
8551 'At the start of PL SQL procedure. Visit Id = ' || p_visit_id);
8552 END IF;
8553
8554 OPEN get_visit_tasks_cur(p_visit_id);
8555 LOOP
8556 FETCH get_visit_tasks_cur INTO l_visit_task_id;
8557 EXIT WHEN get_visit_tasks_cur%NOTFOUND;
8558 IF (l_log_statement >= l_log_current_level) THEN
8559 fnd_log.string(l_log_statement,
8560 L_DEBUG_KEY,
8561 'Before calling AGGREGATE_TASK_MATERIAL_REQRS for Visit Task Id: ' || l_visit_task_id);
8562 END IF;
8563
8564 AHL_VWP_PROJ_PROD_PVT.Aggregate_Task_Material_Reqrs
8565 (p_api_version => p_api_version,
8566 p_init_msg_list => p_init_msg_list,
8567 p_commit => p_commit,
8568 p_validation_level => p_validation_level,
8569 p_module_type => p_module_type,
8570 p_task_id => l_visit_task_id,
8571 p_rel_tsk_flag => 'N',
8572 x_return_status => l_return_status,
8573 x_msg_count => l_msg_count,
8574 x_msg_data => l_msg_data
8575 );
8576
8577 IF (l_log_statement >= l_log_current_level) THEN
8578 fnd_log.string(l_log_statement,
8579 L_DEBUG_KEY,
8580 'After calling AGGREGATE_TASK_MATERIAL_REQRS for Visit Task Id: ' ||
8581 l_visit_task_id || '. Return Status = '|| l_return_status);
8582 END IF;
8583
8584 IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
8585 x_msg_count := FND_MSG_PUB.count_msg;
8586 IF (l_log_statement >= l_log_current_level) THEN
8587 fnd_log.string(l_log_statement,
8588 L_DEBUG_KEY,
8589 'Errors from AGGREGATE_TASK_MATERIAL_REQRS. Message count: ' || x_msg_count);
8590 END IF;
8591 IF l_return_status = FND_API.G_RET_STS_ERROR THEN
8592 RAISE FND_API.G_EXC_ERROR;
8593 ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
8594 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
8595 END IF;
8596 END IF;
8597
8598 END LOOP;
8599 CLOSE get_visit_tasks_cur;
8600 END Aggregate_Material_Reqrs;
8601
8602 -------------------------------------------------------------------
8603 -- Procedure name : Aggregate_Task_Material_Reqrs
8604 -- Type : Private
8605 -- Function : Find the total requirment of a specific
8606 -- item at the task level
8607 -- Parameters :
8608 --
8609 -- Standard OUT Parameters :
8610 -- x_return_status OUT VARCHAR2 Required
8611 -- x_msg_count OUT NUMBER Required
8612 -- x_msg_data OUT VARCHAR2 Required
8613 --
8614 -- Aggregate_Task_Material_Reqrs Parameters:
8615 -- p_task_id IN NUMBER Required
8616 --
8617 -- Version :
8618 -- 30 November, 2007 RNAHATA Initial Version - 1.0
8619 -------------------------------------------------------------------
8620 PROCEDURE Aggregate_Task_Material_Reqrs
8621 (p_api_version IN NUMBER,
8622 p_init_msg_list IN VARCHAR2,
8623 p_commit IN VARCHAR2,
8624 p_validation_level IN NUMBER,
8625 p_module_type IN VARCHAR2,
8626 p_task_id IN NUMBER,
8627 p_rel_tsk_flag IN VARCHAR2 := 'Y',
8628 x_return_status OUT NOCOPY VARCHAR2,
8629 x_msg_count OUT NOCOPY NUMBER,
8630 x_msg_data OUT NOCOPY VARCHAR2
8631 )
8632 IS
8633 -- Cursor to get the duplicate material requirements
8634 CURSOR get_material_reqrs_cur(c_visit_task_id NUMBER) IS
8635 SELECT UNIQUE asmt1.scheduled_material_id,
8636 asmt1.visit_id,
8637 asmt1.visit_task_id,
8638 asmt1.inventory_item_id,
8639 asmt1.requested_quantity,
8640 asmt1.scheduled_quantity,
8641 asmt1.rt_oper_material_id,
8642 asmt1.item_group_id
8643 FROM ahl_schedule_materials asmt1,
8644 ahl_Schedule_materials asmt2
8645 WHERE asmt1.visit_id = asmt2.visit_id
8646 AND asmt1.visit_task_id = asmt2.visit_task_id
8647 AND asmt1.inventory_item_id = asmt2.inventory_item_id
8648 AND NVL(asmt1.operation_code,'X') = NVL(asmt2.operation_code,'X')
8649 AND asmt1.scheduled_material_id <> asmt2.scheduled_material_id
8650 AND NVL(asmt1.status,'X') = 'ACTIVE'
8651 AND NVL(asmt2.status,'X') = 'ACTIVE'
8652 AND asmt1.visit_task_id = c_visit_task_id
8653 ORDER BY asmt1.inventory_item_id;
8654 l_material_reqrs_rec get_material_reqrs_cur%ROWTYPE;
8655
8656 CURSOR check_reservation_exist (c_scheduled_material_id IN NUMBER) IS
8657 SELECT reservation_id
8658 FROM mtl_reservations
8659 WHERE demand_source_line_detail = c_scheduled_material_id
8660 AND external_source_code = 'AHL';
8661
8662 -- Declare local variables
8663 L_API_NAME CONSTANT VARCHAR2(30) := 'Aggregate_Task_Material_Reqrs';
8664 l_api_version CONSTANT NUMBER := 1.0;
8665 L_DEBUG_KEY CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
8666 l_init_msg_list VARCHAR2(1) := 'F';
8667 l_reservation_id NUMBER;
8668 l_scheduled_matrial_id NUMBER;
8669 l_previous_item NUMBER := NULL;
8670
8671 BEGIN
8672 -- Initialize return status to success before any code logic/validation
8673 x_return_status:= FND_API.G_RET_STS_SUCCESS;
8674
8675 IF (l_log_procedure >= l_log_current_level) THEN
8676 fnd_log.string(l_log_procedure,
8677 L_DEBUG_KEY ||'.begin',
8678 'At the start of PL SQL procedure. Visit Task Id = ' || p_task_id);
8679 END IF;
8680
8681 -- Standard call to check for call compatibility
8682 IF NOT FND_API.COMPATIBLE_API_CALL (l_api_version, p_api_version, l_api_name, G_PKG_NAME)
8683 THEN
8684 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
8685 END IF;
8686
8687 -- Initialize message list if p_init_msg_list = FND_API.G_TRUE
8688 IF FND_API.TO_BOOLEAN(p_init_msg_list)
8689 THEN
8690 FND_MSG_PUB.INITIALIZE;
8691 END IF;
8692
8693 -- initialize the counter
8694 l_previous_item := NULL;
8695
8696 -- For each task in status planning, get details if there mutiple requirements for the same item
8697 OPEN get_material_reqrs_cur(p_task_id);
8698 LOOP
8699 FETCH get_material_reqrs_cur INTO l_material_reqrs_rec;
8700 EXIT WHEN get_material_reqrs_cur%NOTFOUND;
8701
8702 IF (l_log_statement >= l_log_current_level) THEN
8703 fnd_log.string(l_log_statement,
8704 L_DEBUG_KEY,
8705 'Fetching Material Requirements for task.');
8706 END IF;
8707
8708 IF l_previous_item IS NULL THEN
8709 -- if the first duplicate occurance for a task
8710 l_scheduled_matrial_id := l_material_reqrs_rec.scheduled_material_id;
8711 IF (l_log_statement >= l_log_current_level) THEN
8712 fnd_log.string(l_log_statement,
8713 L_DEBUG_KEY,
8714 'First Requirement Id: ' || l_scheduled_matrial_id);
8715 END IF;
8716 ELSIF l_previous_item = l_material_reqrs_rec.inventory_item_id THEN
8717 -- merge the records
8718 IF p_rel_tsk_flag = 'Y' THEN
8719 OPEN check_reservation_exist(l_material_reqrs_rec.scheduled_material_id);
8720 FETCH check_reservation_exist INTO l_reservation_id;
8721 IF check_reservation_exist%FOUND THEN
8722
8723 IF (l_log_statement >= l_log_current_level) THEN
8724 fnd_log.string(l_log_statement,
8725 L_DEBUG_KEY,
8726 'Before calling AHL_RSV_RESERVATIONS_PVT.TRNSFR_RSRV_FOR_MATRL_REQR');
8727 fnd_log.string(l_log_statement,
8728 L_DEBUG_KEY,
8729 'l_material_reqrs_rec.scheduled_material_id->' || l_material_reqrs_rec.scheduled_material_id);
8730 fnd_log.string(l_log_statement,
8731 L_DEBUG_KEY,'l_scheduled_matrial_id->' || l_scheduled_matrial_id);
8732 END IF;
8733
8734 -- Call Transfer reservations
8735 AHL_RSV_RESERVATIONS_PVT.TRNSFR_RSRV_FOR_MATRL_REQR
8736 (p_api_version => l_api_version,
8737 p_init_msg_list => l_init_msg_list,
8738 p_module_type => p_module_type,
8739 x_msg_count => x_msg_count,
8740 x_msg_data => x_msg_data,
8741 x_return_status => x_return_status,
8742 p_visit_task_id => p_task_id,
8743 p_from_mat_req_id => l_material_reqrs_rec.scheduled_material_id,
8744 p_to_mat_req_id => l_scheduled_matrial_id
8745 );
8746
8747 IF (l_log_statement >= l_log_current_level) THEN
8748 fnd_log.string(l_log_statement,
8749 L_DEBUG_KEY,
8750 'After calling AHL_RSV_RESERVATIONS_PVT.TRNSFR_RSRV_FOR_MATRL_REQR. Return Status = '||
8751 x_return_status);
8752 END IF;
8753
8754 IF (x_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
8755 x_msg_count := FND_MSG_PUB.count_msg;
8756 IF (l_log_statement >= l_log_current_level) THEN
8757 fnd_log.string(l_log_statement,
8758 L_DEBUG_KEY,
8759 'Errors from AHL_RSV_RESERVATIONS_PVT.TRNSFR_RSRV_FOR_MATRL_REQR. Message count: ' || x_msg_count);
8760 END IF;
8761 IF x_return_status = FND_API.G_RET_STS_ERROR THEN
8762 RAISE FND_API.G_EXC_ERROR;
8763 ELSIF x_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
8764 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
8765 END IF;
8766 END IF;
8767 END IF;
8768 END IF;
8769
8770 IF (l_log_statement >= l_log_current_level) THEN
8771 fnd_log.string(l_log_statement,
8772 L_DEBUG_KEY,
8773 'Updating ahl_schedule_materials with new Material Requirements');
8774 END IF;
8775
8776 -- Add the requirements into the first record
8777 UPDATE ahl_schedule_materials
8778 SET scheduled_quantity = NVL(scheduled_quantity,0) + NVL(l_material_reqrs_rec.scheduled_quantity,0),
8779 item_group_id = NVL(item_group_id,l_material_reqrs_rec.item_group_id),
8780 requested_quantity = NVL(requested_quantity,0) + NVL(l_material_reqrs_rec.requested_quantity,0)
8781 WHERE scheduled_material_id = l_scheduled_matrial_id;
8782
8783 IF (l_log_statement >= l_log_current_level) THEN
8784 fnd_log.string(l_log_statement,
8785 L_DEBUG_KEY,
8786 'Deleting the old material requirements from table ahl_schedule_materials ');
8787 END IF;
8788
8789 -- Mark the current row as deleted
8790 UPDATE ahl_Schedule_materials
8791 SET status = 'DELETED',requested_quantity = 0
8792 WHERE scheduled_material_id = l_material_reqrs_rec.scheduled_material_id;
8793
8794 ELSE -- New duplicate inventory item id as material req
8795 l_scheduled_matrial_id := l_material_reqrs_rec.scheduled_material_id;
8796 IF (l_log_statement >= l_log_current_level) THEN
8797 fnd_log.string(l_log_statement,
8798 L_DEBUG_KEY,
8799 'New Duplicate Inventory Item Id. Requirement Id: ' || l_scheduled_matrial_id ||
8800 ', Item Id: ' || l_material_reqrs_rec.inventory_item_id);
8801 END IF;
8802 END IF; -- not the same item
8803 -- make the current item the previous item, before reading the next record
8804 l_previous_item := l_material_reqrs_rec.inventory_item_id;
8805 END LOOP;
8806 CLOSE get_material_reqrs_cur;
8807
8808 IF (l_log_procedure >= l_log_current_level) THEN
8809 fnd_log.string(l_log_procedure,
8810 L_DEBUG_KEY ||'.end',
8811 'At the end of PL SQL procedure. Return Status =' || x_return_status);
8812 END IF;
8813
8814 END Aggregate_Task_Material_Reqrs;
8815
8816 -------------------------------------------------------------------
8817 -- Procedure name : Update_Project_Task_Times
8818 -- Type : Private
8819 -- Function : Update the project task start/end dates
8820 -- with the workorder schedule start/end dates
8821 -- Parameters :
8822 -- Standard IN Parameters :
8823 -- p_commit IN VARCHAR2 Fnd_Api.G_FALSE
8824 --
8825 -- Update_Project_Task_Times Parameters
8826 -- p_prd_workorder_tbl IN AHL_PRD_WORKORDER_PVT.PRD_WORKORDER_TBL Required
8827 --
8828 -- Standard OUT Parameters :
8829 -- x_return_status OUT VARCHAR2 Required
8830 -- x_msg_count OUT NUMBER Required
8831 -- x_msg_data OUT VARCHAR2 Required
8832 --
8833 -- Version :
8834 -- 04 January, 2007 Bug#5758813 SOWSUBRA Initial Version - 1.0
8835 -------------------------------------------------------------------
8836 PROCEDURE Update_Project_Task_Times
8837 ( p_prd_workorder_tbl IN AHL_PRD_WORKORDER_PVT.PRD_WORKORDER_TBL,
8838 p_commit IN VARCHAR2 := Fnd_Api.G_FALSE,
8839 x_return_status OUT NOCOPY VARCHAR2,
8840 x_msg_count OUT NOCOPY NUMBER,
8841 x_msg_data OUT NOCOPY VARCHAR2
8842 )
8843 AS
8844
8845 l_task_in_tbl PA_PROJECT_PUB.TASK_IN_TBL_TYPE;
8846 task_index NUMBER;
8847 idx NUMBER;
8848 l_project_rec PA_PROJECT_PUB.PROJECT_IN_REC_TYPE;
8849 L_API_NAME CONSTANT VARCHAR2(30) := 'Update_Project_Task_Times';
8850 L_DEBUG_KEY CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
8851 l_msg_count NUMBER;
8852 l_msg_data VARCHAR2(2000);
8853 l_return_status VARCHAR2(1);
8854 l_task_out PA_PROJECT_PUB.TASK_OUT_TBL_TYPE;
8855 l_workflow_started VARCHAR2(1);
8856 l_key_members PA_PROJECT_PUB.PROJECT_ROLE_TBL_TYPE;
8857 l_class_categories PA_PROJECT_PUB.CLASS_CATEGORY_TBL_TYPE;
8858 l_project_out PA_PROJECT_PUB.PROJECT_OUT_REC_TYPE;
8859
8860
8861 --fetches the schedule start and completion date of workorder
8862 CURSOR get_wo_schedule_dates_cur(p_wo_id IN NUMBER) IS
8863 SELECT WDJ.SCHEDULED_START_DATE, WDJ.SCHEDULED_COMPLETION_DATE
8864 FROM WIP_DISCRETE_JOBS WDJ, AHL_WORKORDERS WO
8865 WHERE WDJ.WIP_ENTITY_ID = WO.WIP_ENTITY_ID AND
8866 WO.WORKORDER_ID = p_wo_id;
8867 get_wo_schedule_dates_rec get_wo_schedule_dates_cur%ROWTYPE;
8868
8869 --fetches project task id, the task start and end date of visit task
8870 CURSOR get_task_dates_cur(p_wo_id IN NUMBER) IS
8871 SELECT AVT.PROJECT_TASK_ID, AVT.START_DATE_TIME, AVT.END_DATE_TIME,
8872 PAT.DESCRIPTION -- Pass the old description back again
8873 FROM AHL_VISIT_TASKS_B AVT, AHL_WORKORDERS WO,
8874 PA_TASKS PAT
8875 WHERE WO.VISIT_TASK_ID = AVT.VISIT_TASK_ID AND
8876 WO.WORKORDER_ID = p_wo_id AND
8877 PAT.TASK_ID (+) = AVT.PROJECT_TASK_ID;
8878 get_task_dates_rec get_task_dates_cur%ROWTYPE;
8879
8880 --fetch the project id, visit start date and visit end date
8881 CURSOR get_visit_details_cur (p_wo_id IN NUMBER) IS
8882 SELECT wo.workorder_id, av.visit_id, av.project_id, av.start_date_time, av.close_date_time
8883 FROM ahl_workorders wo, ahl_visits_b av
8884 WHERE WO.WORKORDER_ID = p_wo_id
8885 AND wo.visit_id = av.visit_id
8886 AND wo.visit_task_id IS NULL
8887 AND wo.master_workorder_flag = 'Y';
8888 visit_details_rec get_visit_details_cur%ROWTYPE;
8889
8890 BEGIN
8891 -- Initialize return status to success before any code logic/validation
8892 x_return_status:= FND_API.G_RET_STS_SUCCESS;
8893
8894 IF (l_log_procedure >= l_log_current_level) THEN
8895 fnd_log.string(l_log_procedure,
8896 L_DEBUG_KEY ||'.begin',
8897 'At the start of PL SQL procedure. p_prd_workorder_tbl.COUNT = ' || p_prd_workorder_tbl.COUNT);
8898 END IF;
8899 --for each workorder get the schduled start/end time
8900 IF p_prd_workorder_tbl.count > 0 THEN
8901 task_index := 1;
8902 FOR idx IN p_prd_workorder_tbl.FIRST..p_prd_workorder_tbl.LAST
8903 LOOP
8904 IF (l_log_statement >= l_log_current_level) THEN
8905 fnd_log.string(l_log_statement,
8906 L_DEBUG_KEY,
8907 'Workorder Id(' || idx || '): ' || p_prd_workorder_tbl(idx).workorder_id);
8908 END IF;
8909
8910 OPEN get_wo_schedule_dates_cur(p_prd_workorder_tbl(idx).workorder_id);
8911 FETCH get_wo_schedule_dates_cur INTO get_wo_schedule_dates_rec;
8912 CLOSE get_wo_schedule_dates_cur;
8913
8914 OPEN get_task_dates_cur(p_prd_workorder_tbl(idx).workorder_id);
8915 FETCH get_task_dates_cur INTO get_task_dates_rec;
8916 CLOSE get_task_dates_cur;
8917
8918 --update the task start and end dates with workorder scheduled start/end dates.
8919 IF ((get_wo_schedule_dates_rec.scheduled_start_date <> get_task_dates_rec.start_date_time) OR
8920 (get_wo_schedule_dates_rec.scheduled_completion_date <> get_task_dates_rec.end_date_time)) THEN
8921 l_task_in_tbl(task_index).pa_task_id := get_task_dates_rec.project_task_id;
8922 --Fix for the Bug 7009212; rnahata truncated the task times
8923 l_task_in_tbl(task_index).task_start_date := trunc(get_wo_schedule_dates_rec.scheduled_start_date);
8924 l_task_in_tbl(task_index).task_completion_date := trunc(get_wo_schedule_dates_rec.scheduled_completion_date);
8925 --rnahata End
8926 -- jaramana Jan 5, 2005: Due to some reason, the task's Description does not get retained
8927 -- but gets corrupted if not passed (or left default at PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR)
8928 l_task_in_tbl(task_index).TASK_DESCRIPTION := get_task_dates_rec.description;
8929
8930 IF (l_log_statement >= l_log_current_level) THEN
8931 fnd_log.string(l_log_statement,
8932 L_DEBUG_KEY,
8933 'task_index = ' || task_index);
8934 fnd_log.string(l_log_statement,
8935 L_DEBUG_KEY,
8936 'pa_task_id = '|| l_task_in_tbl(task_index).pa_task_id);
8937 fnd_log.string(l_log_statement,
8938 L_DEBUG_KEY,
8939 'task_start_date = ' || l_task_in_tbl(task_index).task_start_date);
8940 fnd_log.string(l_log_statement,
8941 L_DEBUG_KEY,
8942 'task_completion_date = ' || l_task_in_tbl(task_index).task_completion_date);
8943 END IF;
8944 task_index := task_index + 1;
8945 END IF; -- Dates are not same
8946 END LOOP;
8947 END IF; -- p_prd_workorder_tbl.count > 0
8948
8949 IF (l_log_statement >= l_log_current_level) THEN
8950 fnd_log.string(l_log_statement,
8951 L_DEBUG_KEY,
8952 'l_task_in_tbl.count = ' || l_task_in_tbl.count);
8953 END IF;
8954 --update the master visit wo also with the visit start/end times.
8955 IF l_task_in_tbl.count > 0 THEN
8956 OPEN get_visit_details_cur(p_prd_workorder_tbl(p_prd_workorder_tbl.FIRST).workorder_id);
8957 FETCH get_visit_details_cur INTO visit_details_rec;
8958 CLOSE get_visit_details_cur;
8959
8960 l_project_rec.PA_PROJECT_ID := visit_details_rec.project_id;
8961 --Fix for the Bug 7009212; rnahata truncated the task times
8962 l_project_rec.START_DATE := trunc(visit_details_rec.start_date_time);
8963 l_project_rec.COMPLETION_DATE := trunc(visit_details_rec.close_date_time);
8964 l_project_rec.SCHEDULED_START_DATE := trunc(visit_details_rec.start_date_time);
8965 --rnahata End
8966 IF (l_log_statement >= l_log_current_level) THEN
8967 fnd_log.string(l_log_statement,
8968 L_DEBUG_KEY,
8969 'Before calling PA_PROJECT_PUB.update_project');
8970 END IF;
8971
8972 --Now call update_project api to update the values in projects table
8973 PA_PROJECT_PUB.UPDATE_PROJECT(
8974 p_api_version_number => 1,
8975 p_commit => p_commit,
8976 p_msg_count => l_msg_count,
8977 p_msg_data => l_msg_data,
8978 p_return_status => l_return_status,
8979 p_workflow_started => l_workflow_started,
8980 p_pm_product_code => G_PM_PRODUCT_CODE,
8981 p_project_in => l_project_rec,
8982 p_project_out => l_project_out,
8983 p_key_members => l_key_members,
8984 p_class_categories => l_class_categories,
8985 p_tasks_in => l_task_in_tbl,
8986 p_tasks_out => l_task_out);
8987
8988 IF (l_log_statement >= l_log_current_level) THEN
8989 fnd_log.string(l_log_statement,
8990 L_DEBUG_KEY,
8991 'After calling PA_PROJECT_PUB.update_project. Return Status = ' || l_return_status);
8992 END IF;
8993
8994 IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
8995 IF (l_log_statement >= l_log_current_level) THEN
8996 fnd_log.string(l_log_statement,
8997 L_DEBUG_KEY,
8998 'Errors from PA_PROJECT_PUB.update_project. Message count: ' ||
8999 l_msg_count || ', message data: ' || l_msg_data);
9000 END IF;
9001 IF l_return_status = FND_API.G_RET_STS_ERROR THEN
9002 RAISE FND_API.G_EXC_ERROR;
9003 ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
9004 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
9005 END IF;
9006 END IF; -- Return Status is not success
9007 END IF; -- l_task_in_tbl.count > 0
9008
9009 IF (l_log_procedure >= l_log_current_level) THEN
9010 fnd_log.string(l_log_procedure,
9011 L_DEBUG_KEY ||'.end',
9012 'At the end of PL SQL procedure. Return Status = ' || x_return_status);
9013 END IF;
9014
9015 END Update_Project_Task_Times;
9016
9017 -- SATHAPLI, 05-Jun-2008 - Cursory analysis shows that this API Create_Job_Tasks is not in use anymore.
9018 -- Retaining the API code in the end of the package for any future references.
9019 --------------------------------------------------------------------
9020 -- PROCEDURE
9021 -- Create_Job_Tasks
9022 --
9023 -- PURPOSE
9024 --
9025 --
9026 --------------------------------------------------------------------
9027 PROCEDURE Create_Job_Tasks(
9028 p_api_version IN NUMBER :=1.0,
9029 p_init_msg_list IN VARCHAR2 := Fnd_Api.g_false,
9030 p_commit IN VARCHAR2 := Fnd_Api.g_false,
9031 p_validation_level IN NUMBER := Fnd_Api.g_valid_level_full,
9032 p_module_type IN VARCHAR2 := Null,
9033 p_x_task_Tbl IN OUT NOCOPY Task_Tbl_Type,
9034 x_return_status OUT NOCOPY VARCHAR2,
9035 x_msg_count OUT NOCOPY NUMBER,
9036 x_msg_data OUT NOCOPY VARCHAR2
9037 )
9038 IS
9039 L_API_VERSION CONSTANT NUMBER := 1.0;
9040 L_API_NAME CONSTANT VARCHAR2(30) := 'Create_Job_Tasks';
9041 L_DEBUG_KEY CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
9042 l_msg_count NUMBER;
9043 l_route_id NUMBER;
9044 l_job_ct NUMBER;
9045 i NUMBER;
9046 j NUMBER;
9047 z NUMBER;
9048 idx NUMBER;
9049 z_return_status VARCHAR2(1);
9050 l_return_status VARCHAR2(1);
9051 y_return_status VARCHAR2(1);
9052 l_flag VARCHAR2(1);
9053 l_status_flag VARCHAR2(1);
9054 l_msg_data VARCHAR2(2000);
9055 l_prd_workorder_tbl AHL_PRD_WORKORDER_PVT.PRD_WORKORDER_TBL;
9056 /* Begin Changes by Shkalyan */
9057 l_prd_workorder_rel_tbl AHL_PRD_WORKORDER_PVT.PRD_WORKORDER_REL_TBL;
9058 l_firm_planned_flag VARCHAR2(1) := FND_PROFILE.value('AHL_PRD_FIRM_PLANNED_FLAG');
9059 l_visit_wo_id NUMBER;
9060 l_visit_wo_ovn NUMBER;
9061 /* End Changes by Shkalyan */
9062 l_visit_end_time DATE;
9063 --
9064 -- To find count for tasks for visit
9065 CURSOR c_route (x_id IN NUMBER) IS
9066 SELECT Route_Id FROM AHL_MR_ROUTES_V
9067 WHERE MR_ROUTE_ID = x_id;
9068
9069 -- To find visit related information
9070 CURSOR c_visit (x_id IN NUMBER) IS
9071 SELECT * FROM AHL_VISITS_VL
9072 WHERE VISIT_ID = x_id;
9073 c_visit_rec c_visit%ROWTYPE;
9074
9075 -- To find task related information
9076 CURSOR c_task (x_id IN NUMBER) IS
9077 SELECT * FROM AHL_VISIT_TASKS_VL
9078 WHERE VISIT_TASK_ID = x_id ;
9079 c_task_rec c_task%ROWTYPE;
9080
9081 -- To find count for jobs tasks
9082 CURSOR c_job (x_id IN NUMBER) IS
9083 SELECT count(*) FROM AHL_WORKORDERS
9084 WHERE VISIT_TASK_ID = x_id
9085 AND STATUS_CODE not in ('22','7');
9086
9087 CURSOR c_chk_job (x_id IN NUMBER) IS
9088 SELECT * FROM AHL_WORKORDERS
9089 WHERE VISIT_TASK_ID = x_id
9090 AND STATUS_CODE not in ('22','7');
9091 c_chk_job_rec c_chk_job%ROWTYPE;
9092
9093 -- To find job for Visit
9094 CURSOR c_visit_job (x_id IN NUMBER) IS
9095 SELECT workorder_id, object_version_number
9096 FROM AHL_WORKORDERS
9097 WHERE VISIT_ID = x_id
9098 AND VISIT_TASK_ID IS NULL
9099 AND MASTER_WORKORDER_FLAG = 'Y'
9100 AND STATUS_CODE not in ('22','7');
9101
9102 --Post11510. Added to get summary task start, end time
9103 CURSOR get_summary_task_times_csr(p_task_id IN NUMBER)IS
9104 SELECT min(start_date_time), max(end_date_time)
9105 FROM ahl_visit_tasks_vl VST
9106 START WITH visit_task_id = p_task_id
9107 AND NVL(VST.status_code, 'Y') <> NVL ('DELETED', 'X')
9108 CONNECT BY originating_task_id = PRIOR visit_task_id;
9109
9110 -- post 11.5.10
9111 -- yazhou Jul-20-2005 start
9112 CURSOR c_visit_task_exists(x_visit_id IN NUMBER)
9113 IS
9114 SELECT 'x'
9115 FROM ahl_visit_tasks_b
9116 WHERE visit_id = x_visit_id
9117 AND STATUS_CODE = 'PLANNING';
9118
9119 CURSOR c_get_wo_details(x_visit_id IN NUMBER)
9120 IS
9121 SELECT scheduled_start_date,
9122 SCHEDULED_COMPLETION_DATE
9123 FROM wip_discrete_jobs
9124 WHERE wip_entity_id =
9125 (
9126 SELECT
9127 wip_entity_id
9128 FROM ahl_workorders
9129 WHERE
9130 master_workorder_flag = 'Y' AND
9131 visit_task_id IS null AND
9132 status_code not in (22,7) and
9133 visit_id=x_visit_id
9134 );
9135 c_get_wo_details_rec c_get_wo_details%ROWTYPE;
9136
9137 l_dummy VARCHAR2(1);
9138 -- yazhou Jul-20-2005 end
9139 BEGIN
9140 --------------------- initialize -----------------------
9141 SAVEPOINT Create_Job_Tasks;
9142
9143 IF (l_log_procedure >= l_log_current_level) THEN
9144 fnd_log.string(l_log_procedure,L_DEBUG_KEY||'.begin','At the start of the PLSQL procedure');
9145 END IF;
9146
9147 -- Initialize message list if p_init_msg_list is set to TRUE.
9148 IF Fnd_Api.to_boolean(p_init_msg_list) THEN
9149 Fnd_Msg_Pub.initialize;
9150 END IF;
9151
9152 -- Initialize API return status to success
9153 x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
9154
9155 -- Standard call to check for call compatibility.
9156 IF NOT Fnd_Api.COMPATIBLE_API_CALL(l_api_version,
9157 p_api_version,
9158 l_api_name,G_PKG_NAME) THEN
9159 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
9160 END IF;
9161
9162 --------------------------- Start of Body -------------------------------------
9163 IF (l_log_statement >= l_log_current_level) THEN
9164 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Task table count = '||p_x_task_Tbl.COUNT);
9165 END IF;
9166
9167 IF (p_x_task_Tbl.COUNT > 0) THEN
9168 i := p_x_task_Tbl.FIRST;
9169
9170 IF (l_log_statement >= l_log_current_level) THEN
9171 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Visit Id= ' || p_x_task_Tbl(i).visit_id);
9172 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Task table value of Index i=' || i);
9173 END IF;
9174
9175 WHILE i IS NOT NULL LOOP
9176 p_x_task_Tbl(i).operation_flag := 'C';
9177
9178 OPEN c_visit (p_x_task_Tbl(i).visit_id);
9179 FETCH c_visit INTO c_visit_rec;
9180 CLOSE c_visit;
9181
9182 --IF c_task_rec.department_id IS NULL THEN
9183 IF c_visit_rec.department_id IS NOT NULL THEN
9184 p_x_task_Tbl(i).department_id := c_visit_rec.department_id ;
9185 ELSE
9186 p_x_task_Tbl(i).department_id := NULL ;
9187 END IF;
9188 --END IF;
9189
9190 IF (l_log_statement >= l_log_current_level) THEN
9191 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Before calling AHL_VWP_TASKS_PVT.Create_Task');
9192 END IF;
9193
9194 -- Call create Visit Task API
9195 AHL_VWP_TASKS_PVT.Create_Task (
9196 p_api_version => p_api_version,
9197 p_init_msg_list => Fnd_Api.g_false,
9198 p_validation_level => p_validation_level,
9199 p_module_type => 'SR', --p_module_type,
9200 p_x_task_rec => p_x_task_Tbl(i),
9201 x_return_status => x_return_status,
9202 x_msg_count => x_msg_count,
9203 x_msg_data => x_msg_data);
9204
9205 IF (l_log_statement >= l_log_current_level) THEN
9206 fnd_log.string(l_log_statement,L_DEBUG_KEY,'After calling AHL_VWP_TASKS_PVT.Create_Task - x_return_status = '|| x_return_status);
9207 END IF;
9208 EXIT WHEN x_return_status <> 'S';
9209 i:= p_x_task_Tbl.NEXT(i);
9210 END LOOP;
9211 END IF;
9212
9213 IF x_return_status <> 'S' THEN
9214 RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
9215 END IF;
9216
9217 IF (p_x_task_Tbl.COUNT > 0) THEN
9218 i := p_x_task_Tbl.FIRST;
9219 -- yazhou 15Aug2005 starts
9220 -- Bug# 4552764 fix
9221 OPEN c_visit (p_x_task_Tbl(i).visit_id);
9222 FETCH c_visit INTO c_visit_rec;
9223 CLOSE c_visit;
9224
9225 IF (l_log_statement >= l_log_current_level) THEN
9226 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Before calling AHL_VWP_TIMES_PVT.adjust_task_times');
9227 END IF;
9228
9229 IF c_visit_rec.start_date_time < SYSDATE THEN
9230 WHILE i IS NOT NULL
9231 LOOP
9232 AHL_VWP_TIMES_PVT.adjust_task_times(
9233 p_api_version => 1.0,
9234 p_init_msg_list => Fnd_Api.G_FALSE,
9235 p_commit => Fnd_Api.G_FALSE,
9236 p_validation_level => Fnd_Api.G_VALID_LEVEL_FULL,
9237 x_return_status => l_return_status,
9238 x_msg_count => l_msg_count,
9239 x_msg_data => l_msg_data,
9240 p_task_id => p_x_task_Tbl(i).visit_task_id,
9241 p_reset_sysdate_flag => FND_API.G_TRUE);
9242
9243 i:= p_x_task_Tbl.NEXT(i);
9244 END LOOP;
9245 END IF;
9246 --The visit end date
9247 l_visit_end_time := AHL_VWP_TIMES_PVT.get_visit_end_time(c_visit_rec.visit_id);
9248
9249 IF (l_log_statement >= l_log_current_level) THEN
9250 fnd_log.string(l_log_statement,L_DEBUG_KEY,'After calling AHL_VWP_TIMES_PVT.adjust_task_times - l_visit_end_time = '||l_visit_end_time);
9251 END IF;
9252 -- yazhou 15Aug2005 ends
9253 END IF;
9254
9255 -- yazhou 06Oct2005 starts
9256 -- bug fix #4658861
9257 OPEN c_get_wo_details(c_visit_rec.visit_id);
9258 FETCH c_get_wo_details into c_get_wo_details_rec;
9259 CLOSE c_get_wo_details;
9260 -- yazhou 06Oct2005 ends
9261 -- Post 11.5.10
9262 -- RROY
9263
9264 -- Yazhou Note: since we are checking for derived visit end time here, if there are other task in planning
9265 -- status with end date exceeding visit planned end date, then non-routine cannot be created
9266 IF TRUNC(l_visit_end_time) > TRUNC(c_visit_rec.close_date_time) THEN
9267 --yazhou Jul-20-2005 start
9268 -- Set visit status to partially released
9269 -- UPDATE AHL_VISITS_B SET STATUS_CODE = 'PARTIALLY RELEASED',
9270 -- OBJECT_VERSION_NUMBER = c_visit_rec.object_version_number + 1
9271 -- WHERE VISIT_ID = c_visit_rec.visit_id;
9272 --yazhou Jul-20-2005 end
9273
9274 -- yazhou Sep-15-2005 starts
9275 -- bug fix 4613220
9276 IF (p_x_task_Tbl.COUNT > 0) THEN
9277 i := p_x_task_Tbl.FIRST;
9278 END IF;
9279 -- Error Message
9280 FND_MESSAGE.Set_Name('AHL','AHL_VWP_CRT_JOB_ERR');
9281 Fnd_Message.Set_Token('TASK_NUMBER', p_x_task_tbl(i).visit_task_number);
9282 Fnd_Message.Set_Token('END_DATE', TRUNC(l_visit_end_time));
9283 -- yazhou Sep-15-2005 ends
9284 FND_MSG_PUB.ADD;
9285 -- yazhou 06Oct2005 starts
9286 -- bug fix #4658861
9287 -- Note: since we are checking for derived end time here, if there are other task in planning
9288 -- status with end date exceeding visit master WO end date, then non-routine cannot be created
9289
9290 ELSIF TRUNC(l_visit_end_time) > TRUNC(c_get_wo_details_rec.scheduled_completion_date) THEN
9291 -- Error Message
9292 Fnd_Message.SET_NAME('AHL','AHL_VWP_DATE_EXCD_WO_DATE');
9293 Fnd_Message.Set_Token('VISIT_END_DATE', l_visit_end_time);
9294 FND_MSG_PUB.ADD;
9295 -- yazhou 06Oct2005 ends
9296 ELSE
9297 -- Start for 11.5.10 release
9298 -- By shbhanda 05-Jun-03
9299 -- For creating/updating Master Workorder in production for the visit in VWP
9300 idx := 1;
9301 /* Begin Changes by Shkalyan */
9302 l_prd_workorder_tbl(idx).MASTER_WORKORDER_FLAG := 'Y';
9303 l_prd_workorder_tbl(idx).BATCH_ID := c_visit_rec.visit_number;
9304 l_prd_workorder_tbl(idx).HEADER_ID := 0; -- Visit
9305
9306 OPEN c_visit_job (c_visit_rec.visit_id);
9307 FETCH c_visit_job INTO l_visit_wo_id, l_visit_wo_ovn;
9308 CLOSE c_visit_job;
9309
9310 IF l_visit_wo_id IS NOT NULL THEN
9311 l_prd_workorder_tbl(idx).DML_OPERATION := 'U';
9312 l_prd_workorder_tbl(idx).WORKORDER_ID := l_visit_wo_id;
9313 l_prd_workorder_tbl(idx).OBJECT_VERSION_NUMBER := l_visit_wo_ovn;
9314 ELSE
9315 l_prd_workorder_tbl(idx).DML_OPERATION := 'C';
9316 l_prd_workorder_tbl(idx).STATUS_CODE := '1';
9317 l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG := 1; -- Firm
9318 END IF;
9319 /* End Changes by Shkalyan */
9320
9321 l_prd_workorder_tbl(idx).VISIT_ID := c_visit_rec.visit_id;
9322 l_prd_workorder_tbl(idx).ORGANIZATION_ID := c_visit_rec.organization_id;
9323 l_prd_workorder_tbl(idx).PROJECT_ID := c_visit_rec.project_id;
9324 l_prd_workorder_tbl(idx).DEPARTMENT_ID := c_visit_rec.department_id ;
9325 l_prd_workorder_tbl(idx).INVENTORY_ITEM_ID := c_visit_rec.inventory_item_id ;
9326 l_prd_workorder_tbl(idx).ITEM_INSTANCE_ID := c_visit_rec.item_instance_id ;
9327 l_prd_workorder_tbl(idx).SCHEDULED_START_DATE := c_visit_rec.start_date_time;
9328 --l_prd_workorder_tbl(idx).SCHEDULED_END_DATE := l_visit_end_time;
9329 -- Changed by Shbhanda on 30th Jan 04
9330 l_prd_workorder_tbl(idx).SCHEDULED_END_DATE := c_visit_rec.close_date_time;
9331 l_prd_workorder_tbl(idx).JOB_DESCRIPTION := c_visit_rec.visit_name ;
9332
9333 idx := idx + 1;
9334
9335 IF (p_x_task_Tbl.COUNT > 0) THEN
9336 i := p_x_task_Tbl.FIRST;
9337 j := 0;
9338
9339 WHILE i IS NOT NULL LOOP
9340 -- Call create WIP Job API
9341 OPEN c_job(p_x_task_Tbl(i).visit_task_id);
9342 FETCH c_job INTO l_job_ct;
9343 CLOSE c_job;
9344
9345 IF (l_log_statement >= l_log_current_level) THEN
9346 fnd_log.string(l_log_statement,L_DEBUG_KEY,'For job count = ' || l_job_ct);
9347 END IF;
9348
9349 IF l_job_ct > 0 THEN
9350 i := i + 1;
9351 ELSE
9352 OPEN c_task(p_x_task_Tbl(i).visit_task_id);
9353 FETCH c_task INTO c_task_rec;
9354 CLOSE c_task;
9355
9356 /* Begin Changes by Shkalyan */
9357 -- Form the Workorder Relationship Parenting to the Visit
9358 l_prd_workorder_rel_tbl(idx-1).DML_OPERATION := 'C';
9359 l_prd_workorder_rel_tbl(idx-1).PARENT_HEADER_ID := 0; -- Visit
9360 l_prd_workorder_rel_tbl(idx-1).CHILD_HEADER_ID := c_task_rec.visit_task_number;
9361 l_prd_workorder_rel_tbl(idx-1).BATCH_ID := c_visit_rec.visit_number;
9362 l_prd_workorder_rel_tbl(idx-1).RELATIONSHIP_TYPE := 1;
9363
9364 -- Form the Workorder Record
9365 l_prd_workorder_tbl(idx).DML_OPERATION := 'C';
9366 l_prd_workorder_tbl(idx).MASTER_WORKORDER_FLAG := 'N';
9367 l_prd_workorder_tbl(idx).BATCH_ID := c_visit_rec.visit_number;
9368 l_prd_workorder_tbl(idx).HEADER_ID := c_task_rec.visit_task_number;
9369 /* End Changes by Shkalyan */
9370
9371 l_prd_workorder_tbl(idx).VISIT_ID := c_visit_rec.visit_id;
9372 l_prd_workorder_tbl(idx).ORGANIZATION_ID := c_visit_rec.organization_id;
9373 l_prd_workorder_tbl(idx).PROJECT_ID := c_visit_rec.project_id;
9374 l_prd_workorder_tbl(idx).STATUS_CODE := '1';
9375 l_prd_workorder_tbl(idx).INVENTORY_ITEM_ID := c_task_rec.inventory_item_id ;
9376 l_prd_workorder_tbl(idx).ITEM_INSTANCE_ID := c_task_rec.instance_id ;
9377 l_prd_workorder_tbl(idx).VISIT_TASK_ID := c_task_rec.visit_task_id ;
9378 l_prd_workorder_tbl(idx).VISIT_TASK_NUMBER := c_task_rec.visit_task_number ;
9379 l_prd_workorder_tbl(idx).PROJECT_TASK_ID := c_task_rec.project_task_id ;
9380 l_prd_workorder_tbl(idx).JOB_DESCRIPTION := c_task_rec.visit_task_name ;
9381
9382 IF c_task_rec.department_id IS NOT NULL AND c_task_rec.department_id <> FND_API.g_miss_num THEN
9383 l_prd_workorder_tbl(idx).DEPARTMENT_ID := c_task_rec.department_id ;
9384 ELSE
9385 l_prd_workorder_tbl(idx).DEPARTMENT_ID := c_visit_rec.department_id ;
9386 END IF;
9387
9388 IF c_task_rec.mr_route_id IS NOT NULL AND c_task_rec.mr_route_id <> FND_API.g_miss_num THEN
9389 OPEN c_route (c_task_rec.mr_route_id);
9390 FETCH c_route INTO l_route_id;
9391 CLOSE c_route;
9392 l_prd_workorder_tbl(idx).ROUTE_ID := l_route_id ;
9393 ELSE
9394 l_prd_workorder_tbl(idx).ROUTE_ID := Null;
9395 END IF;
9396
9397 --POST11510 cxcheng. If summary task, use the min,max for sub tasks
9398 IF (c_task_rec.task_type_code = 'SUMMARY') THEN
9399 OPEN get_summary_task_times_csr(c_task_rec.visit_task_id);
9400 FETCH get_summary_task_times_csr INTO l_prd_workorder_tbl(idx).SCHEDULED_START_DATE,
9401 l_prd_workorder_tbl(idx).SCHEDULED_END_DATE ;
9402 CLOSE get_summary_task_times_csr;
9403 ELSE
9404 l_prd_workorder_tbl(idx).SCHEDULED_START_DATE := c_task_rec.start_date_time;
9405 l_prd_workorder_tbl(idx).SCHEDULED_END_DATE := c_task_rec.end_date_time;
9406 END IF;
9407
9408 /* Begin Changes by Shkalyan */
9409 IF (l_firm_planned_flag IS NOT NULL AND
9410 l_firm_planned_flag = '2') THEN
9411 l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG := 2; -- Planned
9412 ELSE
9413 l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG := 1; -- Firm
9414 END IF;
9415 /* End Changes by Shkalyan */
9416 idx := idx + 1;
9417 i := p_x_task_Tbl.NEXT(i);
9418 END IF;
9419 END LOOP;
9420 END IF;
9421
9422 IF l_prd_workorder_tbl.COUNT > 0 THEN
9423 IF (l_log_statement >= l_log_current_level) THEN
9424 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Before calling AHL_PRD_WORKORDER_PVT.Process_Jobs');
9425 END IF;
9426
9427 /* Begin Changes by Shkalyan */
9428 AHL_PRD_WORKORDER_PVT.Process_Jobs
9429 (p_api_version => p_api_version,
9430 p_init_msg_list => p_init_msg_list,
9431 p_commit => Fnd_Api.g_false,
9432 p_validation_level => p_validation_level,
9433 p_default => FND_API.G_TRUE,
9434 p_module_type => p_module_type,
9435 x_return_status => x_return_status,
9436 x_msg_count => x_msg_count,
9437 x_msg_data => x_msg_data,
9438 p_x_prd_workorder_tbl => l_prd_workorder_tbl,
9439 p_prd_workorder_rel_tbl => l_prd_workorder_rel_tbl
9440 );
9441 /* End Changes by Shkalyan */
9442 IF (l_log_statement >= l_log_current_level) THEN
9443 fnd_log.string(l_log_statement,L_DEBUG_KEY,'After calling AHL_PRD_WORKORDER_PVT.Process_Jobs - x_return_status = '||x_return_status);
9444 END IF;
9445
9446 IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
9447 RAISE Fnd_Api.G_EXC_ERROR;
9448 END IF;
9449 END IF; -- To find if the visit has any tasks
9450
9451 IF (p_x_task_Tbl.COUNT > 0) THEN
9452 i := p_x_task_Tbl.FIRST;
9453 WHILE i IS NOT NULL LOOP
9454 OPEN c_chk_job(p_x_task_Tbl(i).visit_task_id);
9455 FETCH c_chk_job INTO c_chk_job_rec;
9456 CLOSE c_chk_job;
9457
9458 p_x_task_Tbl(i).workorder_id := c_chk_job_rec.workorder_id;
9459
9460 --yazhou Jul-18-2005 start
9461 -- Fix for bug # 4078095
9462 UPDATE AHL_VISIT_TASKS_B
9463 SET STATUS_CODE = 'RELEASED',
9464 OBJECT_VERSION_NUMBER = OBJECT_VERSION_NUMBER + 1
9465 WHERE VISIT_TASK_ID = p_x_task_Tbl(i).visit_task_id
9466 AND STATUS_CODE = 'PLANNING';
9467 --yazhou Jul-18-2005 end
9468 i := p_x_task_Tbl.NEXT(i);
9469 END LOOP;
9470 END IF;
9471
9472 IF (l_log_statement >= l_log_current_level) THEN
9473 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Updated visit to Released..');
9474 END IF;
9475 --yazhou Jul-20-2005 start
9476
9477 OPEN c_visit_task_exists(c_visit_rec.visit_id);
9478 FETCH c_visit_task_exists INTO l_dummy;
9479
9480 OPEN c_get_wo_details(c_visit_rec.visit_id);
9481 FETCH c_get_wo_details into c_get_wo_details_rec;
9482 IF (c_visit_task_exists%NOTFOUND and
9483 c_visit_rec.start_date_time = c_get_wo_details_rec.scheduled_start_date and
9484 c_visit_rec.close_date_time = c_get_wo_details_rec.scheduled_completion_date) THEN
9485 UPDATE ahl_visits_b
9486 SET status_code = 'RELEASED',
9487 object_version_number = object_version_number + 1
9488 WHERE visit_id = c_visit_rec.visit_id;
9489
9490 IF (l_log_statement >= l_log_current_level) THEN
9491 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Before updating the task flag');
9492 END IF;
9493
9494 IF c_visit_rec.any_task_chg_flag = 'Y' THEN
9495 AHL_VWP_RULES_PVT.Update_Visit_Task_Flag
9496 (p_visit_id => c_visit_rec.visit_id,
9497 p_flag => 'N',
9498 x_return_status => x_return_status);
9499 END IF;
9500 END IF;
9501 CLOSE c_visit_task_exists;
9502 CLOSE c_get_wo_details;
9503 END IF;
9504 -- yazhou Jul-20-2005 end
9505 -- RROY
9506 ---------------------------End of Body-------------------------------------
9507 -- END of API body.
9508 -- Standard check of p_commit.
9509
9510 IF Fnd_Api.To_Boolean (p_commit) THEN
9511 COMMIT WORK;
9512 END IF;
9513
9514 Fnd_Msg_Pub.count_and_get(
9515 p_encoded => Fnd_Api.g_false,
9516 p_count => x_msg_count,
9517 p_data => x_msg_data);
9518
9519 IF (l_log_procedure >= l_log_current_level) THEN
9520 fnd_log.string(l_log_procedure,L_DEBUG_KEY||'.end','At the end of the PLSQL procedure');
9521 END IF;
9522
9523 EXCEPTION
9524 WHEN Fnd_Api.g_exc_error THEN
9525 ROLLBACK TO Create_Job_Tasks;
9526 x_return_status := Fnd_Api.g_ret_sts_error;
9527 Fnd_Msg_Pub.count_and_get (
9528 p_encoded => Fnd_Api.g_false,
9529 p_count => x_msg_count,
9530 p_data => x_msg_data
9531 );
9532 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
9533 ROLLBACK TO Create_Job_Tasks;
9534 x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
9535 Fnd_Msg_Pub.count_and_get (
9536 p_encoded => Fnd_Api.g_false,
9537 p_count => x_msg_count,
9538 p_data => x_msg_data
9539 );
9540 WHEN OTHERS THEN
9541 ROLLBACK TO Create_Job_Tasks;
9542 x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
9543 IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_unexp_error)
9544 THEN
9545 Fnd_Msg_Pub.add_exc_msg (G_PKG_NAME, l_api_name);
9546 END IF;
9547 Fnd_Msg_Pub.count_and_get (
9548 p_encoded => Fnd_Api.g_false,
9549 p_count => x_msg_count,
9550 p_data => x_msg_data
9551 );
9552 END Create_Job_Tasks;
9553
9554 END AHL_VWP_PROJ_PROD_PVT;