1 PACKAGE BODY AHL_VWP_PROJ_PROD_PVT AS
2 /* $Header: AHLVPRDB.pls 120.88.12020000.4 2013/03/13 06:34:41 prakkum ship $ */
3
4 -- Global CONSTANTS
5 G_PKG_NAME CONSTANT VARCHAR2(30) := 'AHL_VWP_PROJ_PROD_PVT';
6 G_APP_NAME CONSTANT VARCHAR2(3) := 'AHL';
7 --G_DEBUG VARCHAR2(1):= FND_PROFILE.VALUE('AHL_API_FILE_DEBUG_ON');
8 G_DEBUG VARCHAR2(1) := AHL_DEBUG_PUB.is_log_enabled;
9
10 G_PM_PRODUCT_CODE CONSTANT VARCHAR2(30) := 'AHL';
11 G_TRANS_TSK_TRAIL_NAME CONSTANT VARCHAR2(1) := 'X'; --PRAKKUM :: 11/06/2012 :: Bug 14068468
12
13 ------------------------------------
14 -- Common constants and variables --
15 ------------------------------------
16 l_log_current_level NUMBER := fnd_log.g_current_runtime_level;
17 l_log_statement NUMBER := fnd_log.level_statement;
18 l_log_procedure NUMBER := fnd_log.level_procedure;
19 l_log_error NUMBER := fnd_log.level_error;
20 l_log_unexpected NUMBER := fnd_log.level_unexpected;
21 -----------------------------------------------------------------
22
23 -- Record Type for track on tasks for which jobs has been created
24 TYPE Job_Rec_Type IS RECORD
25 (TASK_ID NUMBER,
26 WORKORDER_ID NUMBER,
27 RETURN_STATUS VARCHAR2(30));
28
29 -- Table Type for Unit config check on SerialId
30 TYPE Job_Tbl_Type IS TABLE OF Job_Rec_Type
31 INDEX BY BINARY_INTEGER;
32
33 -- Table Type for Dept for Tasks
34 TYPE Dept_Tbl_Type IS TABLE OF NUMBER
35 INDEX BY BINARY_INTEGER;
36
37 -------------------------------------------------------------------
38 -- Procedure name : Push_to_Production
39 -- Type : Private
40 -- Function : To push a visit to production
41 -- Parameters :
42 --
43 -- Standard IN Parameters :
44 -- p_api_version IN NUMBER Required
45 -- p_init_msg_list IN VARCHAR2 Default FND_API.G_FALSE
46 -- p_commit IN VARCHAR2 Default FND_API.G_FALSE
47 -- p_validation_level IN NUMBER Default FND_API.G_VALID_LEVEL_FULL
48 -- p_default IN VARCHAR2 Default FND_API.G_TRUE
49 -- p_module_type IN VARCHAR2 Default NULL.
50 --
51 -- Standard OUT Parameters :
52 -- x_return_status OUT VARCHAR2 Required
53 -- x_msg_count OUT NUMBER Required
54 -- x_msg_data OUT VARCHAR2 Required
55 --
56 -- Push_to_Production Parameters:
57 -- p_visit_id IN NUMBER Required
58 -- p_release_flag IN VARCHAR2 Required
59 -- The visit id which is to be pushed to production.
60 --
61 -- Version :
62 -- Initial Version 1.0
63 -------------------------------------------------------------------
64 PROCEDURE Push_to_Production
65 (p_api_version IN NUMBER,
66 p_init_msg_list IN VARCHAR2 := Fnd_Api.g_false,
67 p_commit IN VARCHAR2 := Fnd_Api.g_false,
68 p_validation_level IN NUMBER := Fnd_Api.g_valid_level_full,
69 p_module_type IN VARCHAR2 := Null,
70 p_visit_id IN NUMBER,
71 p_release_flag IN VARCHAR2 := 'N',
72 p_orig_visit_id IN NUMBER := NULL, -- By yazhou 08/06/04 for TC changes
73 x_return_status OUT NOCOPY VARCHAR2,
74 x_msg_count OUT NOCOPY NUMBER,
75 x_msg_data OUT NOCOPY VARCHAR2
76 );
77
78 -------------------------------------------------------------------
79 -- Procedure name : Push_MR_to_Production
80 -- Type : Private
81 -- Function : To push a MR to production
82 -- Parameters :
83 --
84 -- Standard IN Parameters :
85 -- p_api_version IN NUMBER Required
86 -- p_init_msg_list IN VARCHAR2 Default FND_API.G_FALSE
87 -- p_commit IN VARCHAR2 Default FND_API.G_FALSE
88 -- p_validation_level IN NUMBER Default FND_API.G_VALID_LEVEL_FULL
89 -- p_module_type IN VARCHAR2 Default NULL.
90 --
91 -- Standard OUT Parameters :
92 -- x_return_status OUT VARCHAR2 Required
93 -- x_msg_count OUT NUMBER Required
94 -- x_msg_data OUT VARCHAR2 Required
95 --
96 -- PRAKKUM :: PIE Changes :: 13-OCT-2010 :: CORRECTION
97 -- Push_MR_to_Production Parameters:
98 -- p_visit_id IN NUMBER Required
99 -- p_unit_effectivity_id IN NUMBER Required
100 -- p_release_flag IN VARCHAR2 optional
101 --
102 -- Version :
103 -- Initial Version 1.0 Created by Yazhou
104 -------------------------------------------------------------------
105 PROCEDURE Push_MR_to_Production
106 (p_api_version IN NUMBER,
107 p_init_msg_list IN VARCHAR2 := Fnd_Api.g_false,
108 p_commit IN VARCHAR2 := Fnd_Api.g_false,
109 p_validation_level IN NUMBER := Fnd_Api.g_valid_level_full,
110 p_module_type IN VARCHAR2 := Null,
111 p_visit_id IN NUMBER,
112 p_unit_effectivity_id IN NUMBER,
113 p_release_flag IN VARCHAR2 := 'N',
114 --TCHIMIRA::ER 9368251 ::15-JUN-2010 :: Added to include firm-planned flag(1 is Firm and 2 is Planned)as entered by user
115 p_firm_planned_flag IN NUMBER,
116 x_return_status OUT NOCOPY VARCHAR2,
117 x_msg_count OUT NOCOPY NUMBER,
118 x_msg_data OUT NOCOPY VARCHAR2
119 );
120
121 -------------------------------------------------------------------
122 -- Procedure name : Add_MR_to_Project
123 -- Type : Private
124 -- Function : To add Project Task for all the tasks for a given MR
125 -- when SR tasks are created in prodution
126 -- Parameters :
127 --
128 -- Standard IN Parameters :
129 -- p_api_version IN NUMBER Required
130 -- p_init_msg_list IN VARCHAR2 Default FND_API.G_FALSE
131 -- p_commit IN VARCHAR2 Default FND_API.G_FALSE
132 -- p_validation_level IN NUMBER Default FND_API.G_VALID_LEVEL_FULL
133 -- p_default IN VARCHAR2 Default FND_API.G_TRUE
134 -- p_module_type IN VARCHAR2 Default NULL.
135 --
136 -- Standard OUT Parameters :
137 -- x_return_status OUT VARCHAR2 Required
138 -- x_msg_count OUT NUMBER Required
139 -- x_msg_data OUT VARCHAR2 Required
140 --
141 -- PRAKKUM :: PIE Changes :: 13-OCT-2010 :: CORRECTION
142 -- Add_MR_to_Project Parameters:
143 -- p_visit_id IN NUMBER Required
144 -- p_unit_effectivity_id IN NUMBER Required
145 --
146 -- Version :
147 -- Initial Version 1.0 29-Jul-2005 Yazhou
148 -------------------------------------------------------------------
149 PROCEDURE Add_MR_to_Project(
150 p_api_version IN NUMBER,
151 p_init_msg_list IN VARCHAR2 := Fnd_Api.g_false,
152 p_commit IN VARCHAR2 := Fnd_Api.g_false,
153 p_validation_level IN NUMBER := Fnd_Api.g_valid_level_full,
154 p_module_type IN VARCHAR2 := Null,
155 p_visit_id IN NUMBER,
156 p_unit_effectivity_id IN NUMBER,
157 x_return_status OUT NOCOPY VARCHAR2,
158 x_msg_count OUT NOCOPY NUMBER,
159 x_msg_data OUT NOCOPY VARCHAR2
160 );
161
162 -------------------------------------------------------------------
163 -- Procedure name : Create_Project
164 -- Type : Private
165 -- Function : To create Project when visit is pushed to projects
166 -- Parameters :
167 --
168 --------------------------------------------------------------------
169 PROCEDURE Create_Project(
170 p_visit_id IN NUMBER,
171 x_return_status OUT NOCOPY VARCHAR2
172 );
173
174 ------------------------------------------------------------------
175 -- Procedure name : Validate_tasks_bef_production
176 -- Type : Private
177 -- Function : Validate the tasks before pushing the tasks to prodn.
178 -- Parameters :
179 --
180 -- Standard OUT Parameters :
181 -- x_return_status OUT VARCHAR2 Required
182 -- x_msg_count OUT NUMBER Required
183 -- x_msg_data OUT VARCHAR2 Required
184 --
185 -- Validate_tasks_bef_production Parameters:
186 -- p_visit_id IN NUMBER Required
187 -- p_tasks_tbl IN Task_Tbl_Type Required
188 -- x_tasks_tbl OUT Task_Tbl_Type Required
189 --
190 -- Version :
191 -- 30 November, 2007 RNAHATA Initial Version - 1.0
192 -------------------------------------------------------------------
193
194 PROCEDURE Validate_tasks_bef_production(
195 p_visit_id IN NUMBER,
196 p_tasks_tbl IN Task_Tbl_Type,
197 x_tasks_tbl OUT NOCOPY Task_Tbl_Type,
198 x_return_status OUT NOCOPY VARCHAR2,
199 x_msg_count OUT NOCOPY NUMBER,
200 x_msg_data OUT NOCOPY VARCHAR2
201 );
202
203 -------------------------------------------------------------------
204 -- Procedure name : Push_tasks_to_production
205 -- Type : Private
206 -- Function : Push the selected tasks to production.
207 -- Parameters :
208 --
209 -- Standard IN Parameters :
210 -- p_api_version IN NUMBER Required
211 -- p_init_msg_list IN VARCHAR2 Default FND_API.G_FALSE
212 -- p_commit IN VARCHAR2 Default FND_API.G_FALSE
213 -- p_validation_level IN NUMBER Default FND_API.G_VALID_LEVEL_FULL
214 -- p_module_type IN VARCHAR2 Default Null
215 --
216 -- Standard OUT Parameters :
217 -- x_return_status OUT VARCHAR2 Required
218 -- x_msg_count OUT NUMBER Required
219 -- x_msg_data OUT VARCHAR2 Required
220 --
221 -- Push_tasks_to_production Parameters:
222 -- p_visit_id IN NUMBER Required
223 -- p_tasks_tbl IN Task_Tbl_Type Required
224 -- p_release_flag IN VARCHAR2 Default = 'N'
225 --
226 -- Version :
227 -- 30 November, 2007 RNAHATA Initial Version - 1.0
228 -------------------------------------------------------------------
229
230 PROCEDURE Push_tasks_to_production(
231 p_api_version IN NUMBER,
232 p_init_msg_list IN VARCHAR2 := Fnd_Api.g_false,
233 p_validation_level IN NUMBER := Fnd_Api.g_valid_level_full,
234 p_module_type IN VARCHAR2 := Null,
235 p_visit_id IN NUMBER,
236 p_tasks_tbl IN Task_Tbl_Type,
237 p_release_flag IN VARCHAR2 := 'N',
238 x_return_status OUT NOCOPY VARCHAR2,
239 x_msg_count OUT NOCOPY NUMBER,
240 x_msg_data OUT NOCOPY VARCHAR2
241 );
242
243 -- AnRaj added for ACL changes in VWP
244 -- Bug number 4297066
245 -------------------------------------------------------------------
246 -- Procedure name : check_unit_quarantined
247 -- Type : Private
248 -- Function : To check whether the Unit is quarantined
249 -- Parameters : p_visit_id
250 -- Parameters : item_instance_id
251 ----------------------------------------------------------------------
252 PROCEDURE check_unit_quarantined(
253 p_visit_id IN NUMBER,
254 item_instance_id IN NUMBER
255 );
256
257 -------------------------------------------------------------------
258 -- Procedure name : Aggregate_Task_Material_Reqrs
259 -- Type : Private
260 -- Function : Find the total requirment of a specific
261 -- item at the task level
262 -- Parameters :
263 --
264 -- Standard OUT Parameters :
265 -- x_return_status OUT VARCHAR2 Required
266 -- x_msg_count OUT NUMBER Required
267 -- x_msg_data OUT VARCHAR2 Required
268 --
269 -- Aggregate_Task_Material_Reqrs Parameters:
270 -- p_task_id IN NUMBER Required
271 --
272 -- Version :
273 -- 30 November, 2007 RNAHATA Initial Version - 1.0
274 -------------------------------------------------------------------
275 PROCEDURE Aggregate_Task_Material_Reqrs
276 (p_api_version IN NUMBER,
277 p_init_msg_list IN VARCHAR2,
278 p_commit IN VARCHAR2,
279 p_validation_level IN NUMBER,
280 p_module_type IN VARCHAR2,
281 p_task_id IN NUMBER,
282 p_rel_tsk_flag IN VARCHAR2 := 'Y',
283 x_return_status OUT NOCOPY VARCHAR2,
284 x_msg_count OUT NOCOPY NUMBER,
285 x_msg_data OUT NOCOPY VARCHAR2
286 );
287
288 PROCEDURE Aggregate_Material_Reqrs
289 (p_api_version IN NUMBER,
290 p_init_msg_list IN VARCHAR2,
291 p_commit IN VARCHAR2,
292 p_validation_level IN NUMBER,
293 p_module_type IN VARCHAR2,
294 p_visit_id IN NUMBER,
295 x_return_status OUT NOCOPY VARCHAR2,
296 x_msg_count OUT NOCOPY NUMBER,
297 x_msg_data OUT NOCOPY VARCHAR2
298 );
299
300
301 -- PRAKKUM :: PIE :: 13-OCT-2010 :: START
302 -- Added new this procedure
303 -------------------------------------------------------------------
304 -- Procedure name : Add_Task_To_Project_Int
305 -- Type : Private
306 -- Function : New helper function to call from Add_MR_to_Project
307 -- Parameters :
308 -- Add_Task_To_Project_Int Parameters
309 -- p_project_id IN NUMBER Required
310 -- p_project_number IN VARCHAR2 Required
311 -- p_task_number IN VARCHAR2 Required
312 -- p_task_reference IN VARCHAR2 Required
313 -- p_task_name IN VARCHAR2 Required
314 -- p_task_description IN VARCHAR2 Required
315 -- p_task_start_date IN DATE Required
316 -- p_task_completion_date IN DATE Required
317 -- p_parent_task_reference IN VARCHAR2 Required
318 -- x_task_id OUT NOCOPY NUMBER Required
319 --
320 -- Standard OUT Parameters :
321 -- x_return_status OUT VARCHAR2 Required
322 -- x_msg_count OUT NUMBER Required
323 -- x_msg_data OUT VARCHAR2 Required
324 --
325 -- Version :
326 -------------------------------------------------------------------
327
328 PROCEDURE Add_Task_To_Project_Int(
329 p_project_id IN NUMBER,
330 p_project_number IN VARCHAR2,
331 p_task_number IN VARCHAR2,
332 p_task_reference IN VARCHAR2,
333 p_task_name IN VARCHAR2,
334 p_long_task_name IN VARCHAR2,
335 p_task_description IN VARCHAR2,
336 p_task_start_date IN DATE,
337 p_task_completion_date IN DATE,
338 p_parent_task_reference IN VARCHAR2,
339 p_service_type_code IN VARCHAR2,
340 x_return_status OUT NOCOPY VARCHAR2,
341 x_msg_count OUT NOCOPY NUMBER,
342 x_msg_data OUT NOCOPY VARCHAR2,
343 x_task_id OUT NOCOPY NUMBER
344 );
345
346 -- To sort a table of Project Tasks by their display_sequence.
347 PROCEDURE Sort_Task_Table (p_x_task_tbl IN OUT NOCOPY PA_PROJECT_PUB.TASK_IN_TBL_TYPE);
348
349 -- PRAKKUM :: PIE :: 13-OCT-2010 :: END
350
351 -- salogan added for supplier warranty starts
352 PROCEDURE Get_Entl_rec_for_delete(
353 p_visit_id IN NUMBER,
354 x_warranty_entl_tbl OUT NOCOPY AHL_WARRANTY_ENTL_PVT.Warranty_Entl_Tbl_Type
355 );
356 -- salogan added for supplier warranty ends
357
358 -- SKPATHAK :: ER:12730539 :: 01-AUG-2011
359 -- To validate whether the passed stages have any predessor stage in planning status
360 PROCEDURE Validate_Stage_Predecessors ( p_visit_id IN NUMBER,
361 p_stages_tbl IN AHL_VWP_VISITS_STAGES_PVT.Visit_Stages_Tbl_Type,
362 x_has_pre_in_planning OUT NOCOPY VARCHAR2);
363
364 -- SATRAJEN :: Bug 12990261 :: FUnction to sum up all the error messages :: Jun 2012.
365 -- Same functionality as the procedure Validate_MR_Route_Date except for raising the error messages in the same place.
366
367 FUNCTION Validate_MR_Route_Date(
368 p_mr_route_id IN NUMBER,
369 p_visit_task_number IN NUMBER,
370 p_start_date_time IN DATE,
371 p_end_date_time IN DATE
372 )
373 RETURN NUMBER; -- PRAKKUM :: FPBug 16481732 for BaseBug 15884730 :: 16/11/2012
374
375 -- SATRAJEN :: End of Bug 12990261 :: Jun 2012.
376
377 --TCHIMIRA::P2P CP ER 9151144::02-DEC-2009::BEGIN
378 --------------------------------------------------------------------
379 -- PROCEDURE
380 -- BG_Release_Visit
381 --
382 -- PURPOSE
383 -- To carry push to Production and Plan Visit as background processes
384 -- Parameters :
385
386 -- Standard IN Parameters :
387 -- p_commit IN VARCHAR2 Fnd_Api.G_FALSE
388 --
389 -- Standard OUT Parameters :
390 -- x_return_status OUT VARCHAR2 Required
391 -- x_msg_count OUT NUMBER Required
392 -- x_msg_data OUT VARCHAR2 Required
393
394 -- BG_Release_visit Parameters :
395 -- p_visit_id IN NUMBER Required
396 -- visit id is required to get visit number and passed to concurrent program
397 -- p_release_flag IN VARCHAR2 Required
398 -- This is passed to concurrent program as an argument
399 -- x_request_id OUT NUMBER Required
400 -- Stores request id that is passed from concurrent program
401
402 -- Version :
403 -- 02 Dec, 2009 P2P CP ER 9151144 TCHIMIRA Initial Version - 1.0
404 --------------------------------------------------------------------
405 PROCEDURE BG_Release_Visit
406 ( p_api_version IN NUMBER,
407 p_init_msg_list IN VARCHAR2 := Fnd_Api.G_FALSE,
408 p_commit IN VARCHAR2 := Fnd_Api.G_FALSE,
409 p_validation_level IN NUMBER := Fnd_Api.G_VALID_LEVEL_FULL,
410 p_module_type IN VARCHAR2 := NULL,
411 p_visit_id IN NUMBER,
412 p_release_flag IN VARCHAR2 := 'U',
413 x_request_id OUT NOCOPY NUMBER,
414 x_return_status OUT NOCOPY VARCHAR2,
415 x_msg_count OUT NOCOPY NUMBER,
416 x_msg_data OUT NOCOPY VARCHAR2
417 )
418 IS
419 --Standard local variables
420 L_API_NAME CONSTANT VARCHAR2(30) := 'BG_Release_Visit';
421 L_API_VERSION CONSTANT NUMBER := 1.0;
422 L_DEBUG_KEY CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
423 l_msg_data VARCHAR2(2000);
424 l_return_status VARCHAR2(1);
425 l_msg_count NUMBER;
426 l_Error_Tbl_Type Error_Tbl_Type;
427 l_error_msg VARCHAR2(5000);
428 l_error_count NUMBER;
429 l_commit VARCHAR2(1) := 'F';
430 l_validate_error CONSTANT VARCHAR2(1) := 'V';
431 l_req_id NUMBER;
432 l_phase_code VARCHAR2(1);
433 l_curr_org_id NUMBER;
434 -- SKPATHAK :: 02-MAY-2011 :: VWPE: ER:12424063 :: Added below two local variables
435 l_visit_status VARCHAR2(30);
436 l_module_type VARCHAR2(3) := p_module_type;
437
438 -- To find visit related information
439 CURSOR c_visit (c_id IN NUMBER) IS
440 SELECT * FROM AHL_VISITS_B
441 WHERE VISIT_ID = c_id
442 FOR UPDATE OF OBJECT_VERSION_NUMBER;
443 c_visit_rec c_visit%ROWTYPE;
444
445 --Cursor to fetch phase
446 --salogan::Modified the cursor to handle both request id from P2P and Cost Estimation CP ER 9299910::01-JUN-2009::BEGIN
447 --Cursor to fetch phase
448 CURSOR c_conc_req_phase(c_id IN NUMBER) IS
449 SELECT 'X'
450 FROM FND_CONCURRENT_REQUESTS FCR, AHL_VISITS_B AVB
451 WHERE FCR.REQUEST_ID IN ( AVB.CST_EST_REQUEST_ID, AVB.REQUEST_ID )
452 AND FCR.PHASE_CODE IN ('P', 'R')
453 AND AVB.VISIT_ID = c_id;
454 l_dummy_val c_conc_req_phase%ROWTYPE;
455 --salogan::Modified the cursor to handle both request id from P2P and Cost Estimation CP ER 9299910::01-JUN-2009::END
456
457 -- SKPATHAK :: 02-MAY-2011 :: VWPE: ER:12424063
458 --Get visit status
459 CURSOR get_visit_status (c_visit_id IN NUMBER) IS
460 SELECT status_code
461 FROM ahl_visits_b
462 WHERE visit_id = c_visit_id;
463
464 --CHANGES by jrotich bug #13028686 begin
465 CURSOR c_stages_without_types(c_visit_id IN NUMBER ) IS
466 SELECT DISTINCT STAGES.STAGE_ID ,
467 STAGES.STAGE_NAME
468 FROM AHL_VISIT_TASKS_B TASKS,
469 AHL_VWP_STAGES_VL STAGES
470 WHERE
471 TASKS.VISIT_ID= c_visit_id AND
472 STAGES.STAGE_ID=TASKS.STAGE_ID AND
473 TASKS.TASK_TYPE_CODE <> 'STAGE' AND --SKPATHAK :: stages not having any visit tasks need not be validated
474 NOT EXISTS (
475 SELECT STAGE_ID
476 FROM AHL_VISIT_STAGE_TYP_ASOC
477 WHERE STAGE_ID=STAGES.STAGE_ID);
478 l_invalid_stage BOOLEAN;
479 --CHANGES by jrotich bug #13028686 end
480
481 BEGIN
482
483 IF (l_log_procedure >= l_log_current_level) THEN
484 fnd_log.string(l_log_procedure,L_DEBUG_KEY||'.begin','At the start of the PLSQL procedure. Visit Id = ' || p_visit_id);
485 END IF;
486 -- Standard start of API savepoint
487 SAVEPOINT BG_Release_Visit_Pvt;
488
489 -- Initialize message list if p_init_msg_list is set to TRUE
490 IF FND_API.To_Boolean(p_init_msg_list) THEN
491 FND_MSG_PUB.Initialize;
492 END IF;
493 -- Initialize API return status to success
494 x_return_status := FND_API.G_RET_STS_SUCCESS;
495
496 -- Standard call to check for call compatibility.
497 IF NOT FND_API.COMPATIBLE_API_CALL(l_api_version,
498 p_api_version,
499 l_api_name,G_PKG_NAME) THEN
500 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
501 END IF;
502
503 -- Check for Required Parameters
504 IF(p_visit_id IS NULL OR p_visit_id = FND_API.G_MISS_NUM) THEN
505 FND_MESSAGE.Set_Name(G_PM_PRODUCT_CODE,'AHL_VWP_CST_INPUT_MISS');
506 FND_MSG_PUB.ADD;
507 IF (l_log_unexpected >= l_log_current_level)THEN
508 fnd_log.string
509 (
510 l_log_unexpected,
511 'ahl.plsql.AHL_VWP_CST_WO_PVT.Release_Visit',
512 'Visit id is mandatory but found null in input '
513 );
514 END IF;
515 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
516 END IF;
517
518 --salogan::Modified the cursor fetch to handle both request id from P2P and Cost Estimation CP ER 9299910::01-JUN-2009::BEGIN
519 OPEN c_conc_req_phase(p_visit_id);
520 FETCH c_conc_req_phase INTO l_dummy_val;
521 IF(c_conc_req_phase%FOUND) THEN
522 FND_MESSAGE.Set_Name(G_PM_PRODUCT_CODE,'AHL_VWP_CP_P2P_IN_PROGS');
523 FND_MSG_PUB.ADD;
524 RAISE FND_API.G_EXC_ERROR;
525 END IF;
526 CLOSE c_conc_req_phase;
527 --salogan::Modified the cursor fetch to handle both request id from P2P and Cost Estimation CP ER 9299910::01-JUN-2009::END
528
529 -- SKPATHAK :: 02-MAY-2011 :: VWPE: ER:12424063
530 -- If the concurrent program has been launched for plan visit, pass 'CST' as the module type so that WOs are created in DRAFT status
531 OPEN get_visit_status (p_visit_id);
532 FETCH get_visit_status INTO l_visit_status;
533 IF get_visit_status%NOTFOUND THEN
534 FND_MESSAGE.Set_Name(G_PM_PRODUCT_CODE,'AHL_VWP_INVALID_VST');
535 FND_MESSAGE.SET_TOKEN('VISIT_ID', p_visit_id);
536 FND_MSG_PUB.ADD;
537 CLOSE get_visit_status;
538 RAISE FND_API.G_EXC_ERROR;
539 END IF;
540 CLOSE get_visit_status;
541 -- If visit status is draft, CP for plan visit need to be launched
542 IF l_visit_status = 'DRAFT' THEN
543 l_module_type := 'CST';
544 END IF;
545 --CHANGES by jrotich bug #13028686 begin
546 IF l_visit_status <> 'DRAFT' THEN -- SKPATHAK :: have this validation only during P2P and NOT during plan visit
547 IF (l_log_statement >= l_log_current_level)THEN
548 fnd_log.string (l_log_statement,L_DEBUG_KEY, 'Validating stage details, visit status: '||l_visit_status);
549 END IF;
550
551 l_invalid_stage :=FALSE;
552 FOR stage_details_rec in c_stages_without_types(p_visit_id)
553 LOOP
554 l_invalid_stage :=TRUE;
555 IF (l_log_statement >= l_log_current_level) THEN
556 fnd_log.string(l_log_statement,
557 L_DEBUG_KEY,
558 'Stage does not have an associated stage type ' ||
559 stage_details_rec.stage_name);
560 END IF;
561 FND_MESSAGE.SET_NAME('AHL', 'AHL_VWP_NO_STAGE_TYPE');
562 FND_MESSAGE.SET_TOKEN('STAGE_NAME',stage_details_rec.stage_name);
563 FND_MSG_PUB.ADD;
564
565 END LOOP;
566 END IF;
567
568 IF(l_invalid_stage=TRUE) THEN
569 RAISE FND_API.G_EXC_ERROR;
570 END IF;
571
572 --CHANGES by jrotich bug #13028686 END
573
574 IF (l_log_statement >= l_log_current_level)THEN
575 fnd_log.string (l_log_statement,L_DEBUG_KEY, 'Before Calling AHL_VWP_PROJ_PROD_PVT.Validate_Before_Production, visit status: '||l_visit_status);
576 END IF;
577
578 --Valdate before push to production happens
579 AHL_VWP_PROJ_PROD_PVT.Validate_Before_Production
580 (p_api_version => l_api_version,
581 p_init_msg_list => p_init_msg_list,
582 p_commit => l_commit,
583 p_validation_level => p_validation_level,
584 p_module_type => l_module_type,
585 p_visit_id => p_visit_id,
586 x_error_tbl => l_error_tbl_type,
587 x_return_status => l_return_status,
588 x_msg_count => l_msg_count,
589 x_msg_data => l_msg_data);
590
591 IF (l_log_statement >= l_log_current_level)THEN
592 fnd_log.string (l_log_statement, L_DEBUG_KEY, 'After Calling AHL_VWP_PROJ_PROD_PVT.Validate_Before_Production - l_return_status = '||l_return_status);
593 END IF;
594
595 IF l_error_tbl_type.COUNT > 0 THEN
596 l_return_status := l_validate_error;
597 x_return_status := l_validate_error;
598 ELSIF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
599 -- Check Error Message stack.
600 x_msg_count := FND_MSG_PUB.count_msg;
601
602 IF (l_log_statement >= l_log_current_level)THEN
603 fnd_log.string ( l_log_statement, L_DEBUG_KEY,'Errors from AHL_VWP_PROJ_PROD_PVT.Validate_Before_Production - '||x_msg_count);
604 END IF;
605 RAISE Fnd_Api.g_exc_error;
606 ELSE
607 --salogan::Commented the repeated code CP ER 9299910::01-JUN-2009::BEGIN
608 --IF(l_phase_code IN('R' , 'P')) THEN
609 --FND_MESSAGE.Set_Name(G_PM_PRODUCT_CODE,'AHL_VWP_CP_P2P_IN_PROGS');
610 --FND_MSG_PUB.ADD;
611 --RAISE FND_API.G_EXC_ERROR;
612 --END IF;
613 --salogan::Commented the repeated code CP ER 9299910::01-JUN-2009::END
614
615 IF (l_log_statement >= l_log_current_level) THEN
616 FND_LOG.STRING(l_log_statement,L_DEBUG_KEY,
617 ' Before calling concurrent program to push the visit to production ');
618 END IF;
619
620 OPEN c_visit(p_visit_id);
621 FETCH c_visit INTO c_visit_rec;
622
623 IF (l_log_statement >= l_log_current_level) THEN
624 fnd_log.string(l_log_statement,L_DEBUG_KEY, 'concurrent parameter values p_api_version -> '||p_api_version||' , visit_number -> '||c_visit_rec.visit_number||' , p_release_flag -> '||p_release_flag);
625 END IF;
626
627 l_curr_org_id := MO_GLOBAL.get_current_org_id();
628 FND_REQUEST.SET_ORG_ID(l_curr_org_id);
629
630 -- SKPATHAK :: 02-MAY-2011 :: VWPE: ER:12424063
631 -- If the visit status is DRAFT, treat the call of this API from front end as Plan_visit else as P2P
632 -- Also note that we are passing the fourth argument 'caller' as JAVA, since this API is being called from JAVA layer
633 -- The concurrent programs can also be launched through FORM, in which case FORMS will be passed as caller to BG_Push_to_Production
634 IF l_visit_status = 'DRAFT' THEN
635 l_req_id := FND_REQUEST.SUBMIT_REQUEST(
636 application => 'AHL',
637 program => 'AHLVWPPLN', --launch concurrent program for plan_visit
638 argument1 => p_api_version,
639 argument2 => c_visit_rec.visit_number,
640 argument3 => p_release_flag,
641 argument4 => 'JAVA');
642 ELSE
643 l_req_id := FND_REQUEST.SUBMIT_REQUEST(
644 application => 'AHL',
645 program => 'AHLVWPP2P', --launch concurrent program for P2P
646 argument1 => p_api_version,
647 argument2 => c_visit_rec.visit_number,
648 argument3 => p_release_flag);
649 END IF;
650
651 IF (l_log_statement >= l_log_current_level) THEN
652 fnd_log.string(l_log_statement,L_DEBUG_KEY,'l_req_id = '|| l_req_id);
653 END IF;
654
655 IF (l_req_id = 0) THEN
656 IF (l_log_statement >= l_log_current_level) THEN
657 fnd_log.string(l_log_statement,L_DEBUG_KEY, ' Concurrent program request failed.');
658 END IF;
659 ELSE
660 IF (l_log_statement >= l_log_current_level) THEN
661 fnd_log.string(l_log_statement,L_DEBUG_KEY, ' Concurrent program request successful.');
662 END IF;
663
664 x_request_id := l_req_id;
665 --Update the table with l_req_id
666 UPDATE ahl_visits_b
667 SET REQUEST_ID = l_req_id,
668 OBJECT_VERSION_NUMBER = object_version_number + 1,-- PRAKKUM :: PIE :: 13-OCT-2010 ::
669 LAST_UPDATE_DATE = SYSDATE,
670 LAST_UPDATED_BY = Fnd_Global.USER_ID,
671 LAST_UPDATE_LOGIN = Fnd_Global.LOGIN_ID
672 WHERE visit_id = p_visit_id;
673 CLOSE c_visit;
674 COMMIT WORK;
675
676 END IF;
677 END IF;
678 IF (l_log_procedure >= l_log_current_level)THEN
679 fnd_log.string ( l_log_procedure,L_DEBUG_KEY ||'.end','At the end of PLSQL procedure, x_return_status=' || x_return_status);
680 END IF;
681 EXCEPTION
682 WHEN FND_API.G_EXC_ERROR THEN
683 x_return_status := FND_API.G_RET_STS_ERROR;
684 ROLLBACK TO BG_Release_Visit_Pvt;
685 FND_MSG_PUB.count_and_get(
686 p_count => x_msg_count,
687 p_data => x_msg_data,
688 p_encoded => fnd_api.g_false);
689
690 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
691 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
692 ROLLBACK TO BG_Release_Visit_Pvt;
693 FND_MSG_PUB.count_and_get(
694 p_count => x_msg_count,
695 p_data => x_msg_data,
696 p_encoded => fnd_api.g_false);
697
698 WHEN OTHERS THEN
699 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
700 ROLLBACK TO BG_Release_Visit_Pvt;
701 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
702 fnd_msg_pub.add_exc_msg(
703 p_pkg_name => G_PKG_NAME,
704 p_procedure_name => 'BG_Release_Visit',
705 p_error_text => SUBSTR(SQLERRM,1,500));
706 END IF;
707 FND_MSG_PUB.count_and_get(p_count => x_msg_count,
708 p_data => x_msg_data,
709 p_encoded => fnd_api.g_false);
710
711 END BG_Release_Visit;
712 --------------------------------------------------------------------
713 -- PROCEDURE
714 -- BG_Push_to_Production
715 --
716 -- PURPOSE
717 -- Made as an executable for the P2P CP and for Plan_visit CP
718 -- BG_Push_to_Production Parameters :
719 -- p_visit_number IN NUMBER
720 -- errbuf OUT VARCHAR2 Required
721 -- Defines in pl/sql to store procedure to get error messages into log file
722 -- retcode OUT NUMBER Required
723 -- To get the status of the concurrent program
724
725 -- Version :
726 -- 02 Dec, 2009 P2P CP ER 9151144 TCHIMIRA Initial Version - 1.0
727 --------------------------------------------------------------------
728 PROCEDURE BG_Push_to_Production(
729 errbuf OUT NOCOPY VARCHAR2,
730 retcode OUT NOCOPY NUMBER,
731 p_api_version IN NUMBER,
732 p_visit_number IN NUMBER,
733 p_release_flag IN VARCHAR2 := 'U',
734 p_caller IN VARCHAR2 := NULL
735 )
736 IS
737
738
739 -- Local variables section
740 l_msg_count NUMBER;
741 l_msg_data VARCHAR2(2000);
742 l_return_status VARCHAR2(1);
743 l_api_version NUMBER := 1.0;
744 l_api_name VARCHAR2(30) := 'BG_Push_to_Production';
745 l_err_msg VARCHAR2(2000);
746 l_msg_index_out NUMBER;
747 l_visit_id NUMBER;
748
749 BEGIN
750
751 -- Standard start of API savepoint
752 SAVEPOINT BG_Push_to_Production;
753
754 -- 1. Initialize error message stack by default
755 FND_MSG_PUB.Initialize;
756
757 -- Standard call to check for call compatibility
758 IF NOT FND_API.Compatible_API_Call(l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
759 retcode := 2;
760 errbuf := FND_MSG_PUB.Get;
761 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
762 END IF;
763
764 -- 2. Dump all input parameters
765 fnd_file.put_line(fnd_file.log, '*************API input parameters**************');
766 fnd_file.put_line(fnd_file.log, 'p_visit_number -> '|| p_visit_number);
767 fnd_file.put_line(fnd_file.log, 'p_caller -> '|| p_caller);
768 fnd_file.put_line(fnd_file.log, 'p_release_flag -> '||p_release_flag);
769 fnd_file.put_line(fnd_file.log, 'fnd_global.USER_ID -> '|| fnd_global.USER_ID);
770 fnd_file.put_line(fnd_file.log, 'fnd_global.RESP_ID -> '||fnd_global.RESP_ID);
771 fnd_file.put_line(fnd_file.log, 'fnd_global.PROG_APPL_ID -> '|| fnd_global.PROG_APPL_ID);
772 fnd_file.put_line(fnd_file.log, 'mo_global.get_current_org_id -> '|| mo_global.get_current_org_id());
773
774 SELECT visit_id INTO l_visit_id FROM AHL_VISITS_B WHERE visit_number = p_visit_number;
775
776 IF l_visit_id IS NOT NULL THEN
777
778 fnd_file.put_line(fnd_file.log, 'before calling AHL_VWP_PROJ_PROD_PVT.Release_visit');
779 fnd_file.put_line(fnd_file.log, 'visit_id -> '||l_visit_id);
780
781
782 -- SKPATHAK :: 02-MAY-2011 :: VWPE: ER:12424063
783 --If the caller if 'FORMS' or 'JAVA', then the request has been launched for Plan_Visit else for P2P
784 IF p_caller IN ('FORMS', 'JAVA') THEN
785 AHL_VWP_PROJ_PROD_PVT.plan_visit(
786 p_api_version => p_api_version,
787 p_init_msg_list => Fnd_Api.G_FALSE,
788 p_commit => Fnd_Api.g_false,
789 p_validation_level => Fnd_Api.G_VALID_LEVEL_FULL,
790 p_caller => p_caller,
791 p_visit_id => l_visit_id,
792 x_return_status => l_return_status,
793 x_msg_count => l_msg_count,
794 x_msg_data => l_msg_data);
795
796 l_msg_count := FND_MSG_PUB.Count_Msg;
797 IF (l_msg_count > 0) THEN
798 fnd_file.put_line(fnd_file.log, 'Following error occured while plan visit..');
799 IF (l_return_status = FND_API.G_RET_STS_ERROR) THEN
800 RAISE FND_API.G_EXC_ERROR;
801 ELSE
802 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
803 END IF;
804 END IF;
805 ELSE
806 AHL_VWP_PROJ_PROD_PVT.Release_Visit(
807 p_api_version => p_api_version,
808 p_module_type => 'JSP', --passing p_module_type as JSP
809 p_visit_id => l_visit_id,
810 p_release_flag => p_release_flag,
811 x_return_status => l_return_status,
812 x_msg_count => l_msg_count,
813 x_msg_data => l_msg_data);
814
815 l_msg_count := FND_MSG_PUB.Count_Msg;
816 IF (l_msg_count > 0) THEN
817 fnd_file.put_line(fnd_file.log, 'Following error occured while pushing the visit to production..');
818 IF (l_return_status = FND_API.G_RET_STS_ERROR) THEN
819 RAISE FND_API.G_EXC_ERROR;
820 ELSE
821 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
822 END IF;
823 END IF;
824 END IF; --p_caller check
825 END IF; --l_visit_id IS NOT NULL
826
827 EXCEPTION
828 WHEN FND_API.G_EXC_ERROR THEN
829 ROLLBACK TO BG_Push_to_Production;
830 retcode := 2;
831 FOR i IN 1..l_msg_count
832 LOOP
833 fnd_msg_pub.get( p_msg_index => i,
834 p_encoded => FND_API.G_FALSE,
835 p_data => l_err_msg,
836 p_msg_index_out => l_msg_index_out);
837
838 fnd_file.put_line(FND_FILE.LOG, 'Err message-'||l_msg_index_out||':' || l_err_msg);
839 END LOOP;
840
841
842 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
843 ROLLBACK TO BG_Push_to_Production;
844 retcode := 2;
845 l_msg_count := Fnd_Msg_Pub.count_msg;
846 FOR i IN 1..l_msg_count
847 LOOP
848 fnd_msg_pub.get( p_msg_index => i,
849 p_encoded => FND_API.G_FALSE,
850 p_data => l_err_msg,
851 p_msg_index_out => l_msg_index_out);
852
853 fnd_file.put_line(FND_FILE.LOG, 'Err message-'||l_msg_index_out||':' || l_err_msg);
854 END LOOP;
855
856
857 WHEN OTHERS THEN
858 ROLLBACK TO BG_Push_to_Production;
859 retcode := 2;
860 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
861 fnd_msg_pub.add_exc_msg(p_pkg_name => G_PKG_NAME,
862 p_procedure_name => 'BG_Push_to_Production',
863 p_error_text => SUBSTR(SQLERRM,1,500));
864 END IF;
865 l_msg_count := Fnd_Msg_Pub.count_msg;
866 FOR i IN 1..l_msg_count
867 LOOP
868 fnd_msg_pub.get( p_msg_index => i,
869 p_encoded => FND_API.G_FALSE,
870 p_data => l_err_msg,
871 p_msg_index_out => l_msg_index_out);
872
873 fnd_file.put_line(FND_FILE.LOG, 'Err message-'||l_msg_index_out||':' || l_err_msg);
874 END LOOP;
875
876
877 END BG_Push_to_Production;
878 --TCHIMIRA::P2P CP ER 9151144::02-DEC-2009::END
879
880 --****************************************************************--
881 --------------------------------------------------------------------
882 -- VWP INTEGRATION WITH PROJECTS --
883 --------------------------------------------------------------------
884 --****************************************************************--
885
886 --------------------------------------------------------------------
887 -- PROCEDURE
888 -- Integrate_to_Projects
889 --
890 -- PURPOSE
891 -- To Integrate with Projects i.e creating projects for
892 -- visits and project tasks for all associated visit task
893 --------------------------------------------------------------------
894 PROCEDURE Integrate_to_Projects (
895 p_api_version IN NUMBER,
896 p_init_msg_list IN VARCHAR2 := Fnd_Api.g_false,
897 p_commit IN VARCHAR2 := Fnd_Api.g_false,
898 p_validation_level IN NUMBER := Fnd_Api.g_valid_level_full,
899 p_module_type IN VARCHAR2 := Null,
900 p_visit_id IN NUMBER,
901 x_return_status OUT NOCOPY VARCHAR2,
902 x_msg_count OUT NOCOPY NUMBER,
903 x_msg_data OUT NOCOPY VARCHAR2)
904
905 IS
906 L_API_VERSION CONSTANT NUMBER := 1.0;
907 L_API_NAME CONSTANT VARCHAR2(30) := 'Integrate_to_Projects';
908 L_DEBUG_KEY CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
909
910 -- To find visit related information
911 CURSOR c_visit (x_id IN NUMBER) IS
912 SELECT * FROM AHL_VISITS_VL
913 WHERE VISIT_ID = x_id;
914 c_visit_rec c_visit%ROWTYPE;
915
916 BEGIN
917 --------------------- initialize -----------------------
918 SAVEPOINT Integrate_to_Projects;
919
920 IF (l_log_procedure >= l_log_current_level) THEN
921 fnd_log.string(l_log_procedure,
922 L_DEBUG_KEY ||'.begin',
923 'At the start of PL SQL procedure. Visit Id = ' || p_visit_id);
924 END IF;
925
926 -- Initialize message list if p_init_msg_list is set to TRUE.
927 IF Fnd_Api.to_boolean(p_init_msg_list) THEN
928 Fnd_Msg_Pub.initialize;
929 END IF;
930
931 -- Initialize API return status to success
932 x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
933
934 -- Standard call to check for call compatibility.
935 IF NOT Fnd_Api.COMPATIBLE_API_CALL(l_api_version,
936 p_api_version,
937 l_api_name,G_PKG_NAME)
938 THEN
939 RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
940 END IF;
941
942 IF (l_log_statement >= l_log_current_level) THEN
943 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Visit Id= '|| p_visit_id);
944 END IF;
945
946 OPEN c_visit (p_visit_id);
947 FETCH c_visit INTO c_visit_rec;
948 CLOSE c_visit;
949
950 IF (l_log_statement >= l_log_current_level) THEN
951 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Visits Project Id = '|| c_visit_rec.PROJECT_ID);
952 END IF;
953
954 IF c_visit_rec.PROJECT_ID IS NULL THEN
955 IF (l_log_statement >= l_log_current_level) THEN
956 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Before calling Create_Project');
957 END IF;
958
959 -- Call Create_Project local procedure to create project tasks
960 Create_Project (
961 p_visit_id => p_visit_id,
962 x_return_status => x_return_status);
963
964 IF (l_log_statement >= l_log_current_level) THEN
965 fnd_log.string(l_log_statement,L_DEBUG_KEY,'After calling Create_Project - '||x_return_status);
966 END IF;
967 ELSE
968 IF (l_log_statement >= l_log_current_level) THEN
969 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Before calling Update_Project');
970 END IF;
971
972 -- Call Update_Project local procedure to update project tasks
973 Update_Project (
974 p_api_version => p_api_version,
975 p_init_msg_list => p_init_msg_list,
976 p_commit => p_commit,
977 p_validation_level => p_validation_level,
978 p_module_type => p_module_type,
979 p_visit_id => p_visit_id,
980 x_return_status => x_return_status,
981 x_msg_count => x_msg_count,
982 x_msg_data => x_msg_data);
983
984 IF (l_log_statement >= l_log_current_level) THEN
985 fnd_log.string(l_log_statement,L_DEBUG_KEY,'After calling Update_Project - '||x_return_status);
986 END IF;
987 END IF;
988
989 ---------------------------End of Body-------------------------------------
990 --
991 -- END of API body.
992 --
993 -- Standard check of p_commit.
994 IF Fnd_Api.To_Boolean ( p_commit ) THEN
995 COMMIT WORK;
996 END IF;
997
998 Fnd_Msg_Pub.count_and_get(
999 p_encoded => Fnd_Api.g_false,
1000 p_count => x_msg_count,
1001 p_data => x_msg_data
1002 );
1003
1004 IF (l_log_procedure >= l_log_current_level) THEN
1005 fnd_log.string(l_log_procedure,L_DEBUG_KEY ||'.end','End of PL/SQL procedure');
1006 END IF;
1007
1008 EXCEPTION
1009 WHEN Fnd_Api.g_exc_error THEN
1010 ROLLBACK TO Integrate_to_Projects;
1011 x_return_status := Fnd_Api.g_ret_sts_error;
1012 Fnd_Msg_Pub.count_and_get (
1013 p_encoded => Fnd_Api.g_false,
1014 p_count => x_msg_count,
1015 p_data => x_msg_data
1016 );
1017 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
1018 ROLLBACK TO Integrate_to_Projects;
1019 x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
1020 Fnd_Msg_Pub.count_and_get (
1021 p_encoded => Fnd_Api.g_false,
1022 p_count => x_msg_count,
1023 p_data => x_msg_data
1024 );
1025 WHEN OTHERS THEN
1026 ROLLBACK TO Integrate_to_Projects;
1027 x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
1028 IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_unexp_error) THEN
1029 Fnd_Msg_Pub.add_exc_msg (G_PKG_NAME, L_API_NAME);
1030 END IF;
1031 Fnd_Msg_Pub.count_and_get (
1032 p_encoded => Fnd_Api.g_false,
1033 p_count => x_msg_count,
1034 p_data => x_msg_data
1035 );
1036 END Integrate_to_Projects;
1037
1038 -- PRAKKUM :: PIE :: 13-OCT-2010
1039 -- Commented out this procedure as it is no longer in use
1040 /*
1041 --------------------------------------------------------------------
1042 -- PROCEDURE
1043 -- Add_Task_to_Project
1044 --
1045 -- PURPOSE
1046 --
1047 --
1048 --------------------------------------------------------------------
1049 PROCEDURE Add_Task_to_Project(
1050 p_api_version IN NUMBER,
1051 p_init_msg_list IN VARCHAR2 := Fnd_Api.g_false,
1052 p_commit IN VARCHAR2 := Fnd_Api.g_false,
1053 p_validation_level IN NUMBER := Fnd_Api.g_valid_level_full,
1054 p_module_type IN VARCHAR2 := Null,
1055 p_visit_task_id IN NUMBER,
1056
1057 x_return_status OUT NOCOPY VARCHAR2,
1058 x_msg_count OUT NOCOPY NUMBER,
1059 x_msg_data OUT NOCOPY VARCHAR2
1060 )
1061 IS
1062 L_API_VERSION CONSTANT NUMBER := 1.0;
1063 L_API_NAME CONSTANT VARCHAR2(30) := 'Add_Task_to_Project';
1064 L_DEBUG_KEY CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
1065
1066 G_EXC_ERROR EXCEPTION;
1067 l_msg_count NUMBER;
1068 l_task_id NUMBER;
1069 l_pa_project_id_out NUMBER;
1070 l_msg_index_out NUMBER;
1071 l_return_status VARCHAR2(1);
1072 l_chk_project VARCHAR2(1);
1073 l_proj_ref_flag VARCHAR2(1);
1074 l_project_tsk_flag VARCHAR2(1);
1075 l_default VARCHAR2(30);
1076 l_msg_data VARCHAR2(2000);
1077 l_pa_project_number_out VARCHAR2(25);
1078 l_commit VARCHAR2(1) := 'F';
1079 l_init_msg_list VARCHAR2(1) := 'F';
1080
1081 -- To find visit related information
1082 CURSOR c_visit (x_id IN NUMBER) IS
1083 SELECT * FROM AHL_VISITS_VL
1084 WHERE VISIT_ID = x_id;
1085 c_visit_rec c_visit%ROWTYPE;
1086
1087 -- To find tasks information for visit
1088 CURSOR c_task (x_id IN NUMBER) IS
1089 SELECT T1.PROJECT_ID, T1.VISIT_NUMBER, T2.*
1090 FROM AHL_VISITS_VL T1, AHL_VISIT_TASKS_VL T2
1091 WHERE VISIT_TASK_ID = x_id
1092 AND T1.VISIT_ID = T2.VISIT_ID;
1093
1094 c_task_rec c_task%ROWTYPE;
1095
1096 BEGIN
1097 --------------------- initialize -----------------------
1098 SAVEPOINT Add_Task_to_Project;
1099
1100 -- Debug info.
1101 IF (l_log_procedure >= l_log_current_level) THEN
1102 fnd_log.string(l_log_procedure,L_DEBUG_KEY ||'.begin','At the start of PLSQL procedure');
1103 END IF;
1104
1105 -- Initialize message list if p_init_msg_list is set to TRUE.
1106 IF Fnd_Api.to_boolean(p_init_msg_list) THEN
1107 Fnd_Msg_Pub.initialize;
1108 END IF;
1109
1110 -- Initialize API return status to success
1111 x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
1112
1113 -- Standard call to check for call compatibility.
1114 IF NOT Fnd_Api.COMPATIBLE_API_CALL(l_api_version,
1115 p_api_version,
1116 L_API_NAME,G_PKG_NAME) THEN
1117 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1118 END IF;
1119
1120 IF (l_log_statement >= l_log_current_level) THEN
1121 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Visit Task Id = '|| p_visit_task_id);
1122 END IF;
1123
1124 ----------------------------------------- Cursor ----------------------------------
1125 OPEN c_task (p_visit_task_id);
1126 FETCH c_task INTO c_task_rec;
1127 CLOSE c_task;
1128
1129 OPEN c_Visit(c_task_rec.visit_id);
1130 FETCH c_visit INTO c_visit_rec;
1131 CLOSE c_Visit;
1132 ----------------------------------------- Start of Body ----------------------------------
1133 -- To check Project responsibilites
1134 -- post 11.5.10 change -- Post 11.5.10
1135 -- change start
1136
1137 -- RROY
1138 IF (l_log_statement >= l_log_current_level) THEN
1139 fnd_log.string(l_log_statement,
1140 L_DEBUG_KEY,
1141 'Before calling AHL_VWP_RULES_PVT.Check_Proj_Responsibility.');
1142 END IF;
1143
1144 AHL_VWP_RULES_PVT.Check_Proj_Responsibility
1145 (x_check_project => l_chk_project,
1146 x_return_status => l_return_status);
1147
1148 IF (l_log_statement >= l_log_current_level) THEN
1149 fnd_log.string(l_log_statement,
1150 L_DEBUG_KEY,
1151 'After calling AHL_VWP_RULES_PVT.Check_Proj_Responsibility. Return Status = ' ||
1152 l_return_status);
1153 END IF;
1154
1155 IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
1156 IF (l_log_statement >= l_log_current_level) THEN
1157 fnd_log.string(l_log_statement,
1158 L_DEBUG_KEY,
1159 'Errors from AHL_VWP_RULES_PVT.Check_Proj_Responsibility.');
1160 END IF;
1161 IF l_return_status = FND_API.G_RET_STS_ERROR THEN
1162 RAISE FND_API.G_EXC_ERROR;
1163 ELSE
1164 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1165 END IF;
1166 END IF;
1167
1168 IF l_chk_project = 'Y' THEN
1169 IF c_task_rec.PROJECT_TASK_ID IS NULL THEN
1170 -- change end
1171 IF (l_log_statement >= l_log_current_level) THEN
1172 fnd_log.string(l_log_statement,
1173 L_DEBUG_KEY,
1174 'Before calling PA_PROJECT_PUB.CHECK_UNIQUE_TASK_NUMBER.');
1175 fnd_log.string(l_log_statement,
1176 L_DEBUG_KEY,
1177 'p_project_id = ' || c_visit_rec.project_id);
1178 fnd_log.string(l_log_statement,
1179 L_DEBUG_KEY,
1180 'p_pm_project_reference = ' || c_visit_rec.visit_number);
1181 fnd_log.string(l_log_statement,
1182 L_DEBUG_KEY,
1183 'p_task_number = ' || c_task_rec.visit_task_number);
1184 END IF;
1185
1186 PA_PROJECT_PUB.Check_Unique_Task_Number
1187 ( p_api_version_number => 1,
1188 p_init_msg_list => l_init_msg_list,
1189 p_return_status => l_return_status,
1190 p_msg_count => l_msg_count,
1191 p_msg_data => l_msg_data,
1192 p_project_id => c_visit_rec.project_id,
1193 p_pm_project_reference => c_visit_rec.visit_number,
1194 p_task_number => c_task_rec.visit_task_number,
1195 p_unique_task_number_flag => l_project_tsk_flag
1196 );
1197
1198 IF (l_log_statement >= l_log_current_level) THEN
1199 fnd_log.string(l_log_statement,
1200 L_DEBUG_KEY,
1201 'After calling PA_PROJECT_PUB.check_unique_task_number. p_unique_task_number_flag = ' ||
1202 l_project_tsk_flag || ' Return Status = ' || l_return_status);
1203 IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
1204 fnd_log.string(l_log_statement,
1205 L_DEBUG_KEY,
1206 'Errors from PA_PROJECT_PUB.check_unique_task_number. Message count: ' ||
1207 l_msg_count || ', message data: ' || l_msg_data);
1208 END IF;
1209 fnd_log.string(l_log_statement,
1210 L_DEBUG_KEY,
1211 'Before calling PA_PROJECT_PUB.check_unique_task_reference.');
1212 END IF;
1213
1214 PA_PROJECT_PUB.Check_Unique_Task_Reference
1215 (p_api_version_number => 1,
1216 p_init_msg_list => l_init_msg_list,
1217 p_return_status => l_return_status,
1218 p_msg_count => l_msg_count,
1219 p_msg_data => l_msg_data,
1220 p_project_id => c_visit_rec.project_id,
1221 p_pm_project_reference => c_visit_rec.visit_number,
1222 p_pm_task_reference => c_task_rec.visit_task_number,
1223 p_unique_task_ref_flag => l_proj_ref_flag
1224 );
1225
1226 IF (l_log_statement >= l_log_current_level) THEN
1227 fnd_log.string(l_log_statement,L_DEBUG_KEY,'After calling -- Check_Unique_Task_Reference l_proj_ref_flag = ' || l_proj_ref_flag);
1228 END IF;
1229
1230 IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
1231 IF (l_log_statement >= l_log_current_level) THEN
1232 fnd_log.string(l_log_statement,
1233 L_DEBUG_KEY,
1234 'Errors from PA_PROJECT_PUB.check_unique_task_number. Message count: ' ||
1235 l_msg_count || ', message data: ' || l_msg_data);
1236 END IF;
1237 IF (l_return_status = FND_API.G_RET_STS_ERROR) THEN
1238 RAISE FND_API.G_EXC_ERROR;
1239 ELSE
1240 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1241 END IF;
1242 END IF;
1243
1244 IF l_project_tsk_flag = 'Y' AND l_proj_ref_flag = 'Y' THEN
1245 IF (l_log_statement >= l_log_current_level) THEN
1246 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Before calling PA_PROJECT_PUB.ADD_TASK..');
1247 fnd_log.string(l_log_statement,L_DEBUG_KEY,'c_task_rec.PROJECT_ID=: ' || c_task_rec.PROJECT_ID);
1248 fnd_log.string(l_log_statement,L_DEBUG_KEY,'c_task_rec.VISIT_NUMBER=: ' || c_task_rec.VISIT_NUMBER);
1249 fnd_log.string(l_log_statement,L_DEBUG_KEY,'c_task_rec.VISIT_TASK_NUMBER=: ' || c_task_rec.VISIT_TASK_NUMBER);
1250 fnd_log.string(l_log_statement,L_DEBUG_KEY,'c_task_rec.VISIT_TASK_NAME=: ' || c_task_rec.VISIT_TASK_NAME);
1251 fnd_log.string(l_log_statement,L_DEBUG_KEY,'c_task_rec.DESCRIPTION=: ' || c_task_rec.DESCRIPTION);
1252 END IF;
1253
1254 PA_PROJECT_PUB.ADD_TASK
1255 (p_api_version_number => 1
1256 ,p_commit => l_commit
1257 ,p_init_msg_list => l_init_msg_list
1258 ,p_msg_count => l_msg_count
1259 ,p_msg_data => l_msg_data
1260 ,p_return_status => l_return_status
1261 ,p_pm_product_code => G_PM_PRODUCT_CODE
1262 ,p_pm_project_reference => c_task_rec.VISIT_NUMBER
1263 ,p_pa_project_id => c_task_rec.PROJECT_ID
1264 ,p_pm_task_reference => c_task_rec.VISIT_TASK_NUMBER
1265 ,p_pa_task_number => c_task_rec.VISIT_TASK_NUMBER
1266 -- SKPATHAK :: Bug 8321556 :: 23-MAR-2009 :: Use SUBSTRB instead of SUBSTR
1267 ,p_task_name => SUBSTRB( c_task_rec.VISIT_TASK_NAME , 1,15)
1268 -- AnRaj: Changed for Bug#5069540
1269 --Begin changes by rnahata for Bug 5758813
1270 -- ,p_task_description => SUBSTR(c_task_rec.DESCRIPTION,1,250)
1271 -- PRAKKUM :: Bug 8321557 :: 10-DEC-2010 :: Use SUBSTRB instead of SUBSTR
1272 ,p_task_description => SUBSTRB(c_task_rec.visit_task_name,1,250)
1273 --Fix for the Bug 7009212. rnahata truncated the dates
1274 ,p_task_start_date => trunc(c_task_rec.start_date_time)
1275 ,p_task_completion_date => trunc(c_task_rec.end_date_time)
1276 -- End changes by rnahata for Bug 5758813
1277 ,p_pa_project_id_out => l_pa_project_id_out
1278 ,p_pa_project_number_out => l_pa_project_number_out
1279 ,p_task_id => l_task_id
1280 );
1281
1282 IF (l_log_statement >= l_log_current_level) THEN
1283 fnd_log.string(l_log_statement,L_DEBUG_KEY,'After calling PA_PROJECT_PUB.ADD_TASK - l_return_status = '||l_return_status);
1284 END IF;
1285
1286 IF (l_return_status <> 'S') THEN
1287 IF (fnd_msg_pub.count_msg > 0 ) THEN
1288 FOR i IN 1..fnd_msg_pub.count_msg
1289 LOOP
1290 fnd_msg_pub.get( p_msg_index => i,
1291 p_encoded => 'F',
1292 p_data => l_msg_data,
1293 p_msg_index_out => l_msg_index_out);
1294
1295 IF (l_log_statement >= l_log_current_level) THEN
1296 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Error - '||l_msg_data);
1297 END IF;
1298 END LOOP;
1299 ELSE
1300 IF (l_log_statement >= l_log_current_level) THEN
1301 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Another Error - '||l_msg_data);
1302 END IF;
1303 END IF;
1304 RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
1305 END IF;
1306
1307 IF l_return_status = 'S' THEN
1308 UPDATE AHL_VISIT_TASKS_B
1309 SET PROJECT_TASK_ID = l_task_id,
1310 OBJECT_VERSION_NUMBER = object_version_number + 1,
1311 --TCHIMIRA::BUG 9222622 ::15-DEC-2009::UPDATE WHO COLUMNS
1312 LAST_UPDATE_DATE = SYSDATE,
1313 LAST_UPDATED_BY = Fnd_Global.USER_ID,
1314 LAST_UPDATE_LOGIN = Fnd_Global.LOGIN_ID
1315 WHERE VISIT_TASK_ID = p_visit_task_id;
1316 END IF;
1317
1318 ELSIF l_project_tsk_flag = 'N' AND l_proj_ref_flag = 'Y' THEN
1319 x_return_status := Fnd_Api.g_ret_sts_error;
1320 IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_error) THEN
1321 Fnd_Message.set_name ('AHL', 'AHL_VWP_PROJ_TSK_REF_NOT_UNIQ');
1322 Fnd_Msg_Pub.ADD;
1323 END IF;
1324 ELSIF l_project_tsk_flag = 'Y' AND l_proj_ref_flag = 'N' THEN
1325 x_return_status := Fnd_Api.g_ret_sts_error;
1326 IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_error) THEN
1327 Fnd_Message.set_name ('AHL', 'AHL_VWP_PROJ_TSK_NUM_NOT_UNIQ');
1328 Fnd_Msg_Pub.ADD;
1329 END IF;
1330 ELSE
1331 x_return_status := Fnd_Api.g_ret_sts_error;
1332 IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_error) THEN
1333 Fnd_Message.set_name ('AHL', 'AHL_VWP_PROJ_TASK_NOT_UNIQUE');
1334 Fnd_Msg_Pub.ADD;
1335 END IF;
1336 END IF;
1337 END IF;
1338
1339 END IF; -- l_chk_project
1340 ---------------------------End of Body-------------------------------------
1341 --
1342 -- END of API body.
1343 --
1344 -- Standard check of p_commit.
1345
1346 IF Fnd_Api.To_Boolean (p_commit) THEN
1347 COMMIT WORK;
1348 END IF;
1349
1350 Fnd_Msg_Pub.count_and_get(
1351 p_encoded => Fnd_Api.g_false,
1352 p_count => x_msg_count,
1353 p_data => x_msg_data
1354 );
1355
1356 IF (l_log_procedure >= l_log_current_level) THEN
1357 fnd_log.string(l_log_procedure,L_DEBUG_KEY ||'.end','End of the procedure');
1358 END IF;
1359
1360 EXCEPTION
1361 WHEN Fnd_Api.g_exc_error THEN
1362 ROLLBACK TO Add_Task_to_Project;
1363 x_return_status := Fnd_Api.g_ret_sts_error;
1364 Fnd_Msg_Pub.count_and_get (
1365 p_encoded => Fnd_Api.g_false,
1366 p_count => x_msg_count,
1367 p_data => x_msg_data
1368 );
1369 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
1370 ROLLBACK TO Add_Task_to_Project;
1371 x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
1372 Fnd_Msg_Pub.count_and_get (
1373 p_encoded => Fnd_Api.g_false,
1374 p_count => x_msg_count,
1375 p_data => x_msg_data
1376 );
1377 WHEN OTHERS THEN
1378 ROLLBACK TO Add_Task_to_Project;
1379 x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
1380 IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_unexp_error) THEN
1381 Fnd_Msg_Pub.add_exc_msg (G_PKG_NAME, L_API_NAME);
1382 END IF;
1383 Fnd_Msg_Pub.count_and_get (
1384 p_encoded => Fnd_Api.g_false,
1385 p_count => x_msg_count,
1386 p_data => x_msg_data
1387 );
1388 END Add_Task_to_Project;
1389 */
1390
1391 --------------------------------------------------------------------
1392 -- PROCEDURE
1393 -- Delete_Task_to_Project
1394 --
1395 -- PURPOSE
1396 -- To delete Project and its tasks if visit in VWP is deleted
1397 --------------------------------------------------------------------
1398 PROCEDURE Delete_Task_to_Project(
1399 p_visit_task_id IN NUMBER,
1400 x_return_status OUT NOCOPY VARCHAR2)
1401 AS
1402 -- Define local Variables
1403 L_API_NAME CONSTANT VARCHAR2(30) := 'Delete_Task_to_Project';
1404 L_DEBUG_KEY CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
1405
1406 l_count NUMBER;
1407 l_msg_count NUMBER;
1408 l_project_id NUMBER;
1409 l_task_id NUMBER;
1410 i NUMBER;
1411
1412 l_return_status VARCHAR2(1);
1413 l_chk_project VARCHAR2(1);
1414 l_del_task_flag VARCHAR2(1);
1415 l_commit VARCHAR2(1) := 'F';
1416 l_init_msg_list VARCHAR2(1) := 'F';
1417 l_default VARCHAR2(30);
1418 l_msg_data VARCHAR2(2000);
1419 G_EXC_ERROR EXCEPTION;
1420
1421 -- Define local Cursors
1422 -- To find all tasks related information
1423 CURSOR c_Task (x_id IN NUMBER) IS
1424 SELECT * FROM Ahl_Visit_Tasks_VL
1425 WHERE Visit_Task_ID = x_id;
1426 c_task_rec c_Task%ROWTYPE;
1427
1428 -- To find visit related information
1429 CURSOR c_visit (x_id IN NUMBER) IS
1430 SELECT * FROM AHL_VISITS_VL
1431 WHERE VISIT_ID = x_id;
1432 c_visit_rec c_visit%ROWTYPE;
1433
1434 --VWPE: ER:12424063 :: SKPATHAK :: 07-JUN-2012
1435 --Get the parent project task for a given task
1436 CURSOR c_get_parent_project_task (c_project_task_id IN NUMBER) IS
1437 SELECT PARENT.TASK_ID PARENT_TASK_ID, PARENT.PM_TASK_REFERENCE PARENT_TASK_REFERENCE
1438 FROM PA_TASKS TASK, PA_TASKS PARENT
1439 WHERE TASK.TASK_ID = c_project_task_id
1440 AND PARENT.TASK_ID (+) = TASK.PARENT_TASK_ID;
1441
1442 parent_project_task_rec c_get_parent_project_task%ROWTYPE;
1443
1444 l_new_structure_flag VARCHAR2(1);
1445
1446 BEGIN
1447
1448 x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
1449
1450 IF (l_log_procedure >= l_log_current_level) THEN
1451 fnd_log.string(l_log_procedure,L_DEBUG_KEY ||'.begin','At the start of the procedure');
1452 END IF;
1453
1454 OPEN c_task (p_visit_task_id);
1455 FETCH c_task INTO c_task_rec;
1456 CLOSE c_task;
1457
1458 OPEN c_visit (c_task_rec.visit_id);
1459 FETCH c_visit INTO c_visit_rec;
1460 CLOSE c_visit;
1461
1462 -- To check Project responsibilites
1463 -- Post 11.5.10
1464 -- RROY
1465 IF (l_log_statement >= l_log_current_level) THEN
1466 fnd_log.string(l_log_statement,
1467 L_DEBUG_KEY,
1468 'Before calling AHL_VWP_RULES_PVT.Check_Proj_Responsibility');
1469 END IF;
1470 AHL_VWP_RULES_PVT.Check_Proj_Responsibility
1471 ( x_check_project => l_chk_project,
1472 x_return_status => l_return_status);
1473
1474 IF (l_log_statement >= l_log_current_level) THEN
1475 fnd_log.string(l_log_statement,
1476 L_DEBUG_KEY,
1477 'After calling AHL_VWP_RULES_PVT.Check_Proj_Responsibility. Return Status = ' || l_return_status);
1478 END IF;
1479
1480 IF (l_return_status <> Fnd_Api.G_RET_STS_SUCCESS) THEN
1481 IF (l_log_statement >= l_log_current_level) THEN
1482 fnd_log.string(l_log_statement,
1483 L_DEBUG_KEY,
1484 'Errors from AHL_VWP_RULES_PVT.Check_Proj_Responsibility');
1485 END IF;
1486 x_return_status := l_return_status;
1487 IF l_return_status = FND_API.G_RET_STS_ERROR THEN
1488 RAISE FND_API.G_EXC_ERROR;
1489 ELSE
1490 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1491 END IF;
1492 END IF;
1493
1494 IF (l_log_statement >= l_log_current_level) THEN
1495 fnd_log.string(l_log_statement,
1496 L_DEBUG_KEY,
1497 'p_visit_task_id = '||p_visit_task_id);
1498 fnd_log.string(l_log_statement,
1499 L_DEBUG_KEY,
1500 'visit_id = '||c_visit_rec.visit_id);
1501 fnd_log.string(l_log_statement,
1502 L_DEBUG_KEY,
1503 'l_chk_project = '||l_chk_project);
1504 END IF;
1505
1506 IF l_chk_project = 'Y' THEN
1507 IF (l_log_statement >= l_log_current_level) THEN
1508 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Before calling PA_PROJECT_PUB.CHECK_DELETE_TASK_OK');
1509 fnd_log.string(l_log_statement,L_DEBUG_KEY,'c_visit_rec.PROJECT_ID - '|| c_visit_rec.PROJECT_ID);
1510 fnd_log.string(l_log_statement,L_DEBUG_KEY,'c_visit_rec.visit_number - '|| c_visit_rec.visit_number);
1511 fnd_log.string(l_log_statement,L_DEBUG_KEY,'c_task_rec.PROJECT_TASK_ID - '|| c_task_rec.PROJECT_TASK_ID);
1512 fnd_log.string(l_log_statement,L_DEBUG_KEY,'c_task_rec.VISIT_TASK_NUMBER - '|| c_task_rec.VISIT_TASK_NUMBER);
1513 fnd_log.string(l_log_statement,L_DEBUG_KEY,'c_task_rec.status_code - '|| c_task_rec.status_code);
1514 fnd_log.string(l_log_statement,L_DEBUG_KEY,'l_del_task_flag - '|| l_del_task_flag);
1515 END IF;
1516
1517 PA_PROJECT_PUB.CHECK_DELETE_TASK_OK
1518 ( p_api_version_number => 1
1519 , p_init_msg_list => l_init_msg_list
1520 , p_return_status => l_return_status
1521 , p_msg_count => l_msg_count
1522 , p_msg_data => l_msg_data
1523 , p_project_id => c_visit_rec.PROJECT_ID
1524 , p_pm_project_reference => c_visit_rec.visit_number
1525 , p_task_id => c_task_rec.PROJECT_TASK_ID
1526 , p_pm_task_reference => c_task_rec.VISIT_TASK_NUMBER
1527 , p_delete_task_ok_flag => l_del_task_flag
1528 );
1529
1530 IF (l_log_statement >= l_log_current_level) THEN
1531 fnd_log.string(l_log_statement,
1532 L_DEBUG_KEY,
1533 'After calling PA_PROJECT_PUB.check_delete_task_ok. Return Status = ' ||
1534 l_return_status || ', delete task flag = ' || l_del_task_flag);
1535 END IF;
1536
1537 IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
1538 IF (l_log_statement >= l_log_current_level) THEN
1539 fnd_log.string(l_log_statement,
1540 L_DEBUG_KEY,
1541 'Errors from PA_PROJECT_PUB.check_delete_task_ok. Message count: ' ||
1542 l_msg_count || ', message data: ' || l_msg_data);
1543 END IF;
1544 x_return_status := l_return_status;
1545 RAISE FND_API.G_EXC_ERROR;
1546 ELSE
1547 IF l_del_task_flag = 'Y' THEN
1548 IF (l_log_statement >= l_log_current_level) THEN
1549 fnd_log.string(l_log_statement,
1550 L_DEBUG_KEY,
1551 'Before calling PA_PROJECT_PUB.delete_task.');
1552 fnd_log.string(l_log_statement,
1553 L_DEBUG_KEY,
1554 'c_task_rec.task_type_code --@>'||c_task_rec.task_type_code);
1555 END IF;
1556 --VWPE: ER:12424063 :: SKPATHAK :: 07-JUN-2012
1557 --Get the rollup task details for a given non-summary, non-stage task
1558 IF c_task_rec.task_type_code NOT IN ('SUMMARY','STAGE') THEN
1559 OPEN c_get_parent_project_task (c_task_rec.PROJECT_TASK_ID);
1560 FETCH c_get_parent_project_task INTO parent_project_task_rec;
1561 CLOSE c_get_parent_project_task;
1562 END IF;
1563
1564 -- SOSAHNI :: INTERNAL BUG :: 17-JAN-2013 :: Cancel Visit Issue
1565 -- Moved the code in order to find whether the project tasks follow new task structure before cancelling/deleting any task
1566 Use_New_Task_Structure
1567 ( p_visit_id => c_visit_rec.visit_id,
1568 x_new_structure_flag => l_new_structure_flag
1569 );
1570
1571 PA_PROJECT_PUB.DELETE_TASK
1572 ( p_api_version_number => 1
1573 ,p_commit => l_commit
1574 ,p_init_msg_list => l_init_msg_list
1575 ,p_msg_count => l_msg_count
1576 ,p_msg_data => l_msg_data
1577 ,p_return_status => l_return_status
1578 ,p_pm_product_code => G_PM_PRODUCT_CODE
1579 ,p_pm_project_reference => c_visit_rec.visit_number
1580 ,p_pa_project_id => c_visit_rec.PROJECT_ID
1581 ,p_pm_task_reference => c_task_rec.VISIT_TASK_NUMBER
1582 ,p_pa_task_id => c_task_rec.PROJECT_TASK_ID
1583 ,p_cascaded_delete_flag => 'N'
1584 ,p_project_id => l_project_id
1585 ,p_task_id => l_task_id
1586 );
1587
1588 IF (l_log_statement >= l_log_current_level) THEN
1589 fnd_log.string(l_log_statement,
1590 L_DEBUG_KEY,
1591 'After calling PA_PROJECT_PUB.delete_task. Return Status = ' ||
1592 l_return_status);
1593 END IF;
1594
1595 IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
1596 IF (l_log_statement >= l_log_current_level) THEN
1597 fnd_log.string(l_log_statement,
1598 L_DEBUG_KEY,
1599 'Errors from PA_PROJECT_PUB.delete_task. Message count: ' ||
1600 l_msg_count || ', message data: ' || l_msg_data);
1601 END IF;
1602 x_return_status := Fnd_Api.g_ret_sts_error;
1603 RAISE FND_API.G_EXC_ERROR;
1604 END IF;
1605
1606 --VWPE: ER:12424063 :: SKPATHAK :: 07-JUN-2012 :: START
1607 --Delete the rollup task details for a given non-summary, non-stage task
1608 -- SKPATHAK :: 07-OCT-2011 :: VWPE ER: 12856858 :: Old Visits cannot have roll-up tasks
1609 /*Use_New_Task_Structure
1610 ( p_visit_id => c_visit_rec.visit_id,
1611 x_new_structure_flag => l_new_structure_flag
1612 );*/
1613 IF (l_log_statement >= l_log_current_level) THEN
1614 fnd_log.string(l_log_statement,
1615 L_DEBUG_KEY,
1616 'c_task_rec.task_type_code ** l_new_structure_flag = ' ||c_task_rec.task_type_code||' ** '||l_new_structure_flag);
1617 END IF;
1618
1619 IF c_task_rec.task_type_code NOT IN ('SUMMARY','STAGE') AND l_new_structure_flag = 'Y' THEN
1620
1621 IF (l_log_statement >= l_log_current_level) THEN
1622 fnd_log.string(l_log_statement,
1623 L_DEBUG_KEY,
1624 'Deleting rollup task');
1625 fnd_log.string(l_log_statement,
1626 L_DEBUG_KEY,
1627 'Before calling PA_PROJECT_PUB.delete_task.');
1628 END IF;
1629
1630 PA_PROJECT_PUB.DELETE_TASK
1631 ( p_api_version_number => 1
1632 ,p_commit => l_commit
1633 ,p_init_msg_list => l_init_msg_list
1634 ,p_msg_count => l_msg_count
1635 ,p_msg_data => l_msg_data
1636 ,p_return_status => l_return_status
1637 ,p_pm_product_code => G_PM_PRODUCT_CODE
1638 ,p_pm_project_reference => c_visit_rec.visit_number
1639 ,p_pa_project_id => c_visit_rec.PROJECT_ID
1640 ,p_pm_task_reference => parent_project_task_rec.PARENT_TASK_REFERENCE
1641 ,p_pa_task_id => parent_project_task_rec.PARENT_TASK_ID
1642 ,p_cascaded_delete_flag => 'N'
1643 ,p_project_id => l_project_id
1644 ,p_task_id => l_task_id
1645 );
1646
1647 IF (l_log_statement >= l_log_current_level) THEN
1648 fnd_log.string(l_log_statement,
1649 L_DEBUG_KEY,
1650 'After calling PA_PROJECT_PUB.delete_task. Return Status = ' ||
1651 l_return_status);
1652 END IF;
1653
1654 IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
1655 IF (l_log_statement >= l_log_current_level) THEN
1656 fnd_log.string(l_log_statement,
1657 L_DEBUG_KEY,
1658 'Errors from PA_PROJECT_PUB.delete_task. Message count: ' ||
1659 l_msg_count || ', message data: ' || l_msg_data);
1660 END IF;
1661 x_return_status := Fnd_Api.g_ret_sts_error;
1662 RAISE FND_API.G_EXC_ERROR;
1663 END IF;
1664 END IF;
1665 --VWPE: ER:12424063 :: SKPATHAK :: 07-JUN-2012 :: END
1666
1667 END IF;
1668 END IF;
1669 END IF;
1670
1671 IF (l_log_procedure >= l_log_current_level) THEN
1672 fnd_log.string(l_log_procedure,
1673 L_DEBUG_KEY ||'.end',
1674 'At the end of PL SQL procedure. Return Status = ' || x_return_status);
1675 END IF;
1676
1677 END Delete_Task_to_Project;
1678
1679 --------------------------------------------------------------------
1680 -- PROCEDURE
1681 -- Create_Project
1682 --
1683 -- PURPOSE
1684 -- To create Project and project tasks for the visit and its tasks
1685 --------------------------------------------------------------------
1686 PROCEDURE Create_Project(
1687 p_visit_id IN NUMBER,
1688 x_return_status OUT NOCOPY VARCHAR2)
1689 AS
1690 --
1691 -- Define local Variables
1692 L_API_NAME CONSTANT VARCHAR2(30) := 'Create_Project';
1693 L_DEBUG_KEY CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
1694 l_count NUMBER;
1695 l_msg_count NUMBER;
1696 l_obj_version NUMBER;
1697 l_created_project_id NUMBER;
1698 l_msg_index_out NUMBER;
1699 i NUMBER;
1700 Z NUMBER;
1701 CREATED_FROM_PROJECT_ID NUMBER;
1702 l_return_status VARCHAR2(1);
1703 l_chk_project VARCHAR2(1);
1704 l_workflow_started VARCHAR2(1);
1705 l_valid_flag VARCHAR2(1):= 'N';
1706 l_commit VARCHAR2(1) := 'F';
1707 l_init_msg_list VARCHAR2(1) := 'F';
1708 l_project_flag VARCHAR2(1):= 'N';
1709 l_default VARCHAR2(30);
1710 l_msg_data VARCHAR2(2000);
1711 G_EXC_ERROR EXCEPTION;
1712
1713 -- PRAKKUM :: PIE :: 13-OCT-2010
1714 -- Associative array of visit task id to project task ref
1715 TYPE Ref_Tbl_Type IS TABLE OF VARCHAR2(30) INDEX BY BINARY_INTEGER;
1716 l_id_ref_map_Tbl Ref_Tbl_Type;
1717
1718 -- Define local table and record datatypes
1719 l_project_rec PA_PROJECT_PUB.PROJECT_IN_REC_TYPE;
1720 l_project_out PA_PROJECT_PUB.PROJECT_OUT_REC_TYPE;
1721 l_task_in PA_PROJECT_PUB.TASK_IN_TBL_TYPE;
1722 l_task_out PA_PROJECT_PUB.TASK_OUT_TBL_TYPE;
1723 l_key_members PA_PROJECT_PUB.PROJECT_ROLE_TBL_TYPE;
1724 l_class_categories PA_PROJECT_PUB.CLASS_CATEGORY_TBL_TYPE;
1725 -- Post 11.5.10
1726 -- RROY
1727 l_param_data PJM_PROJECT_PARAM_PUB.ParamRecType;
1728 -- yazhou 26Sept2005 starts
1729 -- ER#4618348
1730 -- l_project_name_prefix VARCHAR2(10);
1731 l_project_num_prefix VARCHAR2(10);
1732 l_visit_name_len NUMBER;
1733 -- yazhou 26Sept2005 ends
1734 --Bug#5587893
1735 /*sowsubra - Added a new profile that enables user to specify project status
1736 when a visit is pushed to prodn.*/
1737 l_project_status_code VARCHAR2(30);
1738 l_new_txns_flag VARCHAR2(1):= 'N'; -- Added by rnahata for Bug 6334682
1739
1740 -- Define local Cursors
1741 -- To find visit related information
1742 CURSOR c_visit (x_id IN NUMBER) IS
1743 SELECT * FROM AHL_VISITS_VL
1744 WHERE VISIT_ID = x_id;
1745 c_visit_rec c_visit%ROWTYPE;
1746
1747 -- To find count for tasks for visit
1748 CURSOR c_task_ct (x_id IN NUMBER) IS
1749 SELECT count(*) FROM AHL_VISIT_TASKS_VL
1750 WHERE VISIT_ID = x_id
1751 AND NVL(status_code, 'Y') <> NVL ('DELETED', 'X') ;
1752
1753 -- To find tasks information for visit
1754 CURSOR c_task (x_id IN NUMBER) IS
1755 SELECT * FROM AHL_VISIT_TASKS_VL
1756 WHERE VISIT_ID = x_id
1757 AND NVL(status_code, 'Y') <> NVL ('DELETED', 'X') ;
1758 c_task_rec c_task%ROWTYPE;
1759
1760 -- To find tasks information for visit
1761 CURSOR c_task_OVN (x_id IN NUMBER, x_task_num IN NUMBER) IS
1762 SELECT OBJECT_VERSION_NUMBER FROM AHL_VISIT_TASKS_VL
1763 WHERE VISIT_ID = x_id AND VISIT_TASK_NUMBER = x_task_num;
1764
1765 -- To get the cost group for the Org
1766 CURSOR c_cost_group(p_org_id IN NUMBER) IS
1767 SELECT default_cost_group_id
1768 FROM mtl_parameters
1769 WHERE organization_id = p_org_id;
1770
1771 -- Added by rnahata for Bug 6334682
1772 CURSOR c_new_txns_flag(c_project_status_code IN VARCHAR) IS
1773 SELECT ENABLED_FLAG FROM PA_PROJECT_STATUS_CONTROLS
1774 WHERE PROJECT_STATUS_CODE LIKE c_project_status_code
1775 AND ACTION_CODE LIKE 'NEW_TXNS';
1776
1777 /*Added by rnahata for Bug 5758813 - fetches the task details for all the tasks in the visit
1778 The first part of the union fetches task details for all the Planned and Unplanned tasks.
1779 The second part fetches task details of all the MR/NR/SR Summary tasks.
1780 The third part fetches task details of all the manually created Summary and Unassociated tasks.
1781 */
1782 -- PRAKKUM :: 24-NOV-2010 :: Bug 9705164 :: FP12.0.9-12.2:PIE :: START
1783 -- Changed the below cursor to fetch results in the order of the cost parent hierarchy of visit tasks
1784 -- Need to pass these tasks' details to the Projects API, in the order of their hierarchy
1785 CURSOR get_prj_route_dtls_cur (p_visit_id IN NUMBER) IS
1786 SELECT * FROM (
1787 SELECT SUBSTR(NVL(ar.route_no,avt.visit_task_name),1,20) task_name,
1788 SUBSTR(NVL(ar.title,avt.visit_task_name),1,250) description,
1789 avt.visit_task_name, avt.visit_task_number, avt.start_date_time task_start_date, avt.visit_task_id,
1790 avt.end_date_time task_end_date, avt.task_type_code, avt.cost_parent_id, avt.service_type_code, avt.status_code -- PRAKKUM :: PIE :: 13-OCT-2010
1791 , avt.repair_batch_name --PRAKKUM :: 11/06/2012 :: Bug 14068468
1792 FROM ahl_routes_vl ar,ahl_visit_tasks_vl avt, ahl_mr_routes mrr
1793 WHERE avt.visit_id = p_visit_id
1794 AND NVL(avt.status_code,'Y') = 'PLANNING'
1795 AND avt.task_type_code NOT IN ('SUMMARY','UNASSOCIATED','STAGE') ----SKPATHAK :: VWPE: ER:12424063 :: 13-JUN-2012 :: Need not create project task for a stage
1796 AND avt.mr_route_id = mrr.mr_route_id (+)
1797 AND mrr.route_id = ar.route_id (+)
1798 UNION ALL
1799 SELECT SUBSTR(NVL(amh.title,avt.visit_task_name),1,20) task_name, NVL(amh.title,avt.visit_task_name) description,
1800 avt.visit_task_name, avt.visit_task_number, avt.start_date_time task_start_date, avt.visit_task_id,
1801 avt.end_date_time task_end_date, avt.task_type_code, avt.cost_parent_id, avt.service_type_code, avt.status_code -- PRAKKUM :: PIE :: 13-OCT-2010
1802 , avt.repair_batch_name --PRAKKUM :: 11/06/2012 :: Bug 14068468
1803 FROM ahl_mr_headers_v amh,ahl_visit_tasks_vl avt
1804 WHERE avt.visit_id = p_visit_id
1805 AND NVL(avt.status_code,'Y') = 'PLANNING'
1806 AND avt.task_type_code = 'SUMMARY'
1807 AND avt.summary_task_flag = 'N'
1808 AND avt.mr_id = amh.mr_header_id (+)
1809 UNION ALL
1810 SELECT SUBSTR(avt.visit_task_name,1,20) task_name, avt.visit_task_name description,
1811 avt.visit_task_name, avt.visit_task_number, avt.start_date_time task_start_date, avt.visit_task_id,
1812 avt.end_date_time task_end_date, avt.task_type_code, avt.cost_parent_id, avt.service_type_code, avt.status_code -- PRAKKUM :: PIE :: 13-OCT-2010
1813 , avt.repair_batch_name --PRAKKUM :: 11/06/2012 :: Bug 14068468
1814 FROM ahl_visit_tasks_vl avt
1815 WHERE avt.visit_id = p_visit_id
1816 AND NVL(avt.status_code,'Y') = 'PLANNING'
1817 AND ((avt.task_type_code = 'SUMMARY' AND avt.summary_task_flag = 'Y')
1818 OR (avt.task_type_code ='UNASSOCIATED'))
1819 --ORDER BY 4;
1820 )
1821 START WITH cost_parent_id IS NULL AND NVL(status_code,'Y') = 'PLANNING'
1822 CONNECT BY PRIOR visit_task_id = cost_parent_id;
1823 -- PRAKKUM :: 24-NOV-2010 :: Bug 9705164 :: FP12.0.9-12.2:PIE :: END
1824 -- End changes by rnahata for Bug 5758813
1825
1826 get_prj_route_dtls_rec get_prj_route_dtls_cur%ROWTYPE;
1827
1828 l_is_comp_visit VARCHAR2(1) := 'N'; --PRAKKUM :: 11/06/2012 :: Bug 14068468
1829
1830 CURSOR get_proj_details (x_prjId IN NUMBER)
1831 IS
1832 SELECT pt.task_id,pt.project_id,pt.parent_task_id, pt.task_name
1833 FROM PA_TASKS pt
1834 WHERE
1835 pt.project_id=x_prjId;
1836
1837 get_proj_details_rec get_proj_details%ROWTYPE;
1838
1839 BEGIN
1840 -- Initialize API return status to success
1841 x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
1842
1843 IF (l_log_procedure >= l_log_current_level) THEN
1844 fnd_log.string(l_log_procedure,
1845 L_DEBUG_KEY ||'.begin',
1846 'At the start of PL SQL procedure. Visit Id = ' || p_visit_id);
1847 END IF;
1848
1849 --Bug#5587893
1850 /*sowsubra - starts */
1851 l_project_status_code := nvl(FND_PROFILE.VALUE('AHL_INITIAL_PROJECT_STATUS'),'SUBMITTED');
1852
1853 /*
1854 IF (l_project_status_code IS NULL) THEN
1855 IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_error) THEN
1856 Fnd_Message.set_name ('AHL', 'AHL_PROJECT_STATUS_NOT_SET');
1857 Fnd_Msg_Pub.ADD;
1858 END IF;
1859 RAISE FND_API.G_EXC_ERROR;
1860 END IF;
1861 */
1862 /*sowsubra - ends */
1863
1864 -- Begin changes by rnahata for Bug 6334682
1865 IF (l_log_statement >= l_log_current_level) THEN
1866 fnd_log.string(l_log_statement,
1867 L_DEBUG_KEY,
1868 'Initial project status code is: ' || l_project_status_code);
1869 END IF;
1870 OPEN c_new_txns_flag(l_project_status_code);
1871 FETCH c_new_txns_flag INTO l_new_txns_flag;
1872 CLOSE c_new_txns_flag;
1873 IF (l_log_statement >= l_log_current_level) THEN
1874 fnd_log.string(l_log_statement,
1875 L_DEBUG_KEY,
1876 'Create New Transaction Flag = ' || l_new_txns_flag);
1877 END IF;
1878 IF (l_new_txns_flag = 'N') THEN
1879 IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_error) THEN
1880 Fnd_Message.SET_NAME('AHL','AHL_PRJ_NEW_TXN_DISABLED');
1881 Fnd_Message.SET_TOKEN('PRJ_STATUS', l_project_status_code);
1882 Fnd_Msg_Pub.ADD;
1883 END IF;
1884 RAISE Fnd_Api.G_EXC_ERROR;
1885 END IF;
1886 -- End changes by rnahata for Bug 6334682
1887
1888 OPEN c_Visit(p_visit_id);
1889 FETCH c_visit INTO c_visit_rec;
1890 CLOSE c_Visit;
1891
1892 --PRAKKUM :: 11/06/2012 :: Bug 14068468
1893 -- Flag to find whether visit is component visit or not
1894 l_is_comp_visit := AHL_CMP_UTIL_PKG.Is_Comp_Visit (p_visit_id);
1895 IF (l_log_statement >= l_log_current_level) THEN
1896 fnd_log.string(l_log_statement,L_DEBUG_KEY,'p_visit_id ** l_is_comp_visit--@> '||p_visit_id||' ** '||l_is_comp_visit);
1897 END IF;
1898
1899 IF (c_visit_rec.START_DATE_TIME IS NOT NULL
1900 AND c_visit_rec.START_DATE_TIME <> Fnd_Api.G_MISS_DATE
1901 AND c_visit_rec.DEPARTMENT_ID IS NOT NULL
1902 AND c_visit_rec.DEPARTMENT_ID <> FND_API.G_MISS_NUM) THEN
1903
1904 -- Post 11.5.10
1905 -- RROY
1906 IF c_visit_rec.project_template_id IS NOT NULL THEN
1907 CREATED_FROM_PROJECT_ID := c_visit_rec.project_template_id;
1908 ELSE
1909 CREATED_FROM_PROJECT_ID := nvl(FND_PROFILE.VALUE('AHL_DEFAULT_PA_TEMPLATE_ID'),0);
1910 END IF;
1911
1912 IF (l_log_statement >= l_log_current_level) THEN
1913 fnd_log.string(l_log_statement,L_DEBUG_KEY,'CREATED_FROM_PROJECT_ID = '||CREATED_FROM_PROJECT_ID);
1914 END IF;
1915
1916 -- yazhou 26Sept2005 starts
1917 -- ER#4618348
1918
1919 --l_project_name_prefix := SUBSTR(FND_PROFILE.VALUE('AHL_PROJECT_PREFIX'),1,10);
1920 l_project_num_prefix := SUBSTR(FND_PROFILE.VALUE('AHL_PROJECT_NUM_PREFIX'),1,10);
1921
1922 IF (l_log_statement >= l_log_current_level) THEN
1923 fnd_log.string(l_log_statement,L_DEBUG_KEY,'l_project_num_prefix = '||l_project_num_prefix);
1924 END IF;
1925
1926 --l_visit_name_len := 30 - nvl(length(SubStr(l_project_name_prefix,1,255)),0);
1927
1928 -- TO CREATE PROJECT IN PROJECTS
1929 l_Project_rec.PM_PROJECT_REFERENCE := l_project_num_prefix || to_char(c_visit_rec.visit_number);
1930 -- l_Project_rec.PROJECT_NAME := l_project_name_prefix|| SUBSTR(c_visit_rec.visit_name,1,l_visit_name_len);
1931 l_Project_rec.PROJECT_NAME := l_project_num_prefix || to_char(c_visit_rec.visit_number);
1932 -- yazhou 26Sept2005 ends
1933 l_Project_rec.CREATED_FROM_PROJECT_ID := CREATED_FROM_PROJECT_ID;
1934 -- yazhou 08Nov2005 starts
1935 -- Changed by jaramana on April 28, 2005 to fix Bug 4273892
1936 -- l_Project_rec.PROJECT_STATUS_CODE := 'ACTIVE';
1937 -- Changed by sowsubra to fix Bug#5587893
1938 -- l_Project_rec.PROJECT_STATUS_CODE := 'SUBMITTED';
1939 l_Project_rec.PROJECT_STATUS_CODE := l_project_status_code ;
1940 -- yazhou 08Nov2005 ends
1941
1942 -- AnRaj: Changed for Bug#5069540
1943 -- SKPATHAK :: Bug 8321556 :: 23-MAR-2009 :: Use SUBSTRB instead of SUBSTR
1944 l_Project_rec.DESCRIPTION := SUBSTRB(c_visit_rec.description,1,250);
1945 --Fix for the Bug 7009212. rnahata truncated the time components
1946 l_Project_rec.START_DATE := trunc(c_visit_rec.start_date_time);
1947 l_Project_rec.COMPLETION_DATE := null; -- pass completion date as null for the project and all its tasks :: PRAKKUM :: PIE :: 13-OCT-2010
1948 l_Project_rec.SCHEDULED_START_DATE := trunc(c_visit_rec.start_date_time);
1949 --rnahata End
1950
1951 OPEN c_task_ct(p_visit_id);
1952 FETCH c_task_ct INTO l_count;
1953 CLOSE c_task_ct;
1954
1955 IF (l_log_statement >= l_log_current_level) THEN
1956 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Tasks Count = '||l_count);
1957 END IF;
1958
1959 IF l_count > 0 THEN
1960 IF (l_log_statement >= l_log_current_level) THEN
1961 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Inside Tasks as Count more than zero');
1962 END IF;
1963 -- Begin changes by rnahata for Bug 5758813
1964 OPEN get_prj_route_dtls_cur(p_visit_id);
1965 i:=1;
1966 LOOP
1967 -- PRAKKUM :: PIE :: 13-OCT-2010 ::START
1968 FETCH get_prj_route_dtls_cur INTO get_prj_route_dtls_rec;
1969 EXIT WHEN get_prj_route_dtls_cur%NOTFOUND;
1970 IF get_prj_route_dtls_rec.task_type_code <> 'SUMMARY' THEN
1971 -- Not a Summary task: First create a rollup task
1972 l_task_in(i).PM_TASK_REFERENCE := get_prj_route_dtls_rec.visit_task_number || '-1';
1973 l_task_in(i).TASK_NAME := SUBSTRB(get_prj_route_dtls_rec.task_name,1,15) || '-1';
1974 l_task_in(i).LONG_TASK_NAME := get_prj_route_dtls_rec.task_name || '-1';
1975 l_task_in(i).PA_TASK_NUMBER := get_prj_route_dtls_rec.visit_task_number || '-1';
1976 l_task_in(i).TASK_START_DATE := trunc(get_prj_route_dtls_rec.task_start_date); -- Pass visit date for Rollup tasks
1977 l_task_in(i).TASK_COMPLETION_DATE := null;
1978 -- Store the value of the cost parent id temporarily
1979 -- which will be reset or overwritten later with the task number corresponding to this cost parent
1980 IF (get_prj_route_dtls_rec.cost_parent_id IS NOT NULL) THEN
1981 l_task_in(i).PM_PARENT_TASK_REFERENCE := '-' || get_prj_route_dtls_rec.cost_parent_id;
1982 ELSE
1983 l_task_in(i).PM_PARENT_TASK_REFERENCE := null;
1984 END IF;
1985 -- Then add the non-summary task under the rollup task
1986 i := i + 1;
1987 l_task_in(i).PM_TASK_REFERENCE := get_prj_route_dtls_rec.visit_task_number;
1988 l_task_in(i).TASK_NAME := SUBSTRB(get_prj_route_dtls_rec.task_name,1,15);
1989 l_task_in(i).LONG_TASK_NAME := get_prj_route_dtls_rec.task_name;
1990 l_task_in(i).PA_TASK_NUMBER := get_prj_route_dtls_rec.visit_task_number;
1991 l_task_in(i).TASK_DESCRIPTION := SUBSTRB(get_prj_route_dtls_rec.description,1,250);
1992 l_task_in(i).TASK_START_DATE := trunc(get_prj_route_dtls_rec.task_start_date);
1993 l_task_in(i).TASK_COMPLETION_DATE := null;
1994 l_task_in(i).SERVICE_TYPE_CODE := get_prj_route_dtls_rec.service_type_code;
1995 l_task_in(i).PM_PARENT_TASK_REFERENCE := get_prj_route_dtls_rec.visit_task_number || '-1'; -- Parent is the rollup task added above
1996 -- Store the ref in the associative array
1997 -- to keep route tasks to always be leaf tasks even if something is added underneath
1998 -- If the non-summary task has a child, it is actually the child of the rollup and not the child of the route
1999 l_id_ref_map_Tbl(get_prj_route_dtls_rec.visit_task_id) := get_prj_route_dtls_rec.visit_task_number || '-1';
2000
2001 ELSE
2002
2003 -- Summary Task
2004 l_task_in(i).PM_TASK_REFERENCE := get_prj_route_dtls_rec.visit_task_number;
2005 l_task_in(i).TASK_NAME := SUBSTRB(get_prj_route_dtls_rec.task_name,1,15);
2006 l_task_in(i).LONG_TASK_NAME := get_prj_route_dtls_rec.task_name;
2007 l_task_in(i).PA_TASK_NUMBER := get_prj_route_dtls_rec.visit_task_number;
2008 l_task_in(i).TASK_DESCRIPTION := SUBSTRB(get_prj_route_dtls_rec.description,1,250);
2009 l_task_in(i).TASK_START_DATE := trunc(get_prj_route_dtls_rec.task_start_date);--Pass visit start date to avoid error from Projects
2010 l_task_in(i).TASK_COMPLETION_DATE := null;
2011 l_task_in(i).SERVICE_TYPE_CODE := get_prj_route_dtls_rec.service_type_code;
2012 -- Store the value of the cost parent id temporarily
2013 -- which will be reset or overwritten later with the task number corresponding to this cost parent
2014 IF (get_prj_route_dtls_rec.cost_parent_id IS NOT NULL) THEN
2015 l_task_in(i).PM_PARENT_TASK_REFERENCE := '-' || get_prj_route_dtls_rec.cost_parent_id;
2016 ELSE
2017 l_task_in(i).PM_PARENT_TASK_REFERENCE := null;
2018 END IF;
2019 -- Store the ref in the associative array
2020 l_id_ref_map_Tbl(get_prj_route_dtls_rec.visit_task_id) := get_prj_route_dtls_rec.visit_task_number;
2021
2022 --PRAKKUM :: 11/06/2012 :: Bug 14068468
2023 -- IF repair batch name exists, then visit is considered as component visit, visit task that referencing as repair batch summary task
2024 -- So create a child dummy task to hold transactions
2025 IF (l_log_statement >= l_log_current_level) THEN
2026 fnd_log.string(l_log_statement,L_DEBUG_KEY,'get_prj_route_dtls_rec.repair_batch_name--@>'||get_prj_route_dtls_rec.repair_batch_name);
2027 END IF;
2028 IF l_is_comp_visit = 'Y' AND get_prj_route_dtls_rec.repair_batch_name IS NOT NULL THEN
2029 i := i + 1;
2030 l_task_in(i).PM_TASK_REFERENCE := get_prj_route_dtls_rec.visit_task_number|| '-' || G_TRANS_TSK_TRAIL_NAME;
2031 l_task_in(i).TASK_NAME := SUBSTRB(get_prj_route_dtls_rec.task_name,1,15)|| '-' || G_TRANS_TSK_TRAIL_NAME;
2032 l_task_in(i).LONG_TASK_NAME := get_prj_route_dtls_rec.task_name|| '-' || G_TRANS_TSK_TRAIL_NAME;
2033 l_task_in(i).PA_TASK_NUMBER := get_prj_route_dtls_rec.visit_task_number|| '-' || G_TRANS_TSK_TRAIL_NAME;
2034 l_task_in(i).TASK_START_DATE := trunc(get_prj_route_dtls_rec.task_start_date);
2035 l_task_in(i).TASK_COMPLETION_DATE := null;
2036 l_task_in(i).SERVICE_TYPE_CODE := get_prj_route_dtls_rec.service_type_code;
2037 l_task_in(i).PM_PARENT_TASK_REFERENCE := get_prj_route_dtls_rec.visit_task_number; -- Parent is the rollup task added above
2038 END IF;
2039
2040 END IF;
2041
2042 i := i + 1;
2043 END LOOP;
2044 CLOSE get_prj_route_dtls_cur;
2045 -- PRAKKUM :: PIE :: 13-OCT-2010 ::END
2046 END IF; -- End of l_count
2047
2048 -- PRAKKUM :: PIE :: 13-OCT-2010 :: START
2049 IF l_task_in.COUNT > 0 THEN
2050 -- Setup the parent task for all Summary and Rollup Tasks
2051 i := l_task_in.FIRST;
2052 LOOP
2053 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
2054 fnd_log.string(fnd_log.level_statement, L_DEBUG_KEY, 'i = ' || i ||
2055 ', l_task_in(i).pm_parent_task_reference = ' || l_task_in(i).pm_parent_task_reference);
2056 END IF;
2057 IF (l_task_in(i).pm_parent_task_reference IS NOT NULL AND (SUBSTR(l_task_in(i).pm_parent_task_reference, 1, 1) = '-')) THEN
2058 -- Has a parent whose index is not known: Lookup the index in the associative array
2059 l_task_in(i).pm_parent_task_reference := l_id_ref_map_Tbl(TO_NUMBER(SUBSTR(l_task_in(i).pm_parent_task_reference, 2)));
2060 END IF;
2061 EXIT WHEN i = l_task_in.LAST ;
2062 i := l_task_in.NEXT(i);
2063 END LOOP;
2064
2065 i := l_task_in.FIRST;
2066
2067 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
2068 LOOP
2069 fnd_log.string(fnd_log.level_statement, L_DEBUG_KEY, 'Index i = '|| i || ', PA_TASK_NUMBER = ' || l_task_in(i).PA_TASK_NUMBER ||
2070 ', pm_parent_task_reference = ' || l_task_in(i).pm_parent_task_reference);
2071 fnd_log.string(fnd_log.level_statement,L_DEBUG_KEY,'TASK REFERENCE - '|| l_task_in(i).PM_TASK_REFERENCE);
2072 fnd_log.string(fnd_log.level_statement,L_DEBUG_KEY,'TASK NAME - '|| l_task_in(i).TASK_NAME);
2073 fnd_log.string(fnd_log.level_statement,L_DEBUG_KEY,'TASK NUMBER - '|| l_task_in(i).PA_TASK_NUMBER);
2074 fnd_log.string(fnd_log.level_statement,L_DEBUG_KEY,'TASK_DESCRIPTION - '|| l_task_in(i).TASK_DESCRIPTION);
2075 fnd_log.string(fnd_log.level_statement,L_DEBUG_KEY,'TASK_START_DATE - '|| l_task_in(i).TASK_START_DATE);
2076 fnd_log.string(fnd_log.level_statement,L_DEBUG_KEY,'TASK_COMPLETION_DATE - '|| l_task_in(i).TASK_COMPLETION_DATE);
2077
2078 EXIT WHEN i = l_task_in.LAST ;
2079 i := l_task_in.NEXT(i);
2080 END LOOP;
2081 END IF;
2082
2083 END IF; -- End of l_task_in
2084 -- PRAKKUM :: PIE :: 13-OCT-2010 :: END
2085 -- To check Project responsibilites
2086 -- Post 11.5.10
2087 -- RROY
2088
2089 IF (l_log_statement >= l_log_current_level) THEN
2090 fnd_log.string(l_log_statement,
2091 L_DEBUG_KEY,
2092 'Before calling AHL_VWP_RULES_PVT.Check_Proj_Responsibility');
2093 END IF;
2094
2095 AHL_VWP_RULES_PVT.Check_Proj_Responsibility
2096 (x_check_project => l_chk_project,
2097 x_return_status => l_return_status);
2098
2099 IF (l_log_statement >= l_log_current_level) THEN
2100 fnd_log.string(l_log_statement,
2101 L_DEBUG_KEY,
2102 'After calling AHL_VWP_RULES_PVT.Check_Proj_Responsibility. Return Status = ' || l_return_status);
2103 END IF;
2104
2105 IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
2106 IF (l_log_statement >= l_log_current_level) THEN
2107 fnd_log.string(l_log_statement,
2108 L_DEBUG_KEY,
2109 'Errors from AHL_VWP_RULES_PVT.Check_Proj_Responsibility');
2110 END IF;
2111 x_return_status := l_return_status;
2112 IF l_return_status = FND_API.G_RET_STS_ERROR THEN
2113 RAISE FND_API.G_EXC_ERROR;
2114 ELSE
2115 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2116 END IF;
2117 END IF;
2118
2119 IF l_chk_project = 'Y' THEN
2120 IF (l_log_statement >= l_log_current_level) THEN
2121 fnd_log.string(l_log_statement,
2122 L_DEBUG_KEY,
2123 'Before calling PA_PROJECT_PUB.check_unique_project_reference to check for ' || l_project_num_prefix || c_visit_rec.visit_number);
2124 END IF;
2125
2126 PA_PROJECT_PUB.Check_Unique_Project_Reference(
2127 p_api_version_number => 1,
2128 p_init_msg_list => l_init_msg_list,
2129 p_return_status => l_return_status,
2130 p_msg_count => l_msg_count,
2131 p_msg_data => l_msg_data,
2132 -- Modified by rnahata on February 19, 2008 for Bug 6685071
2133 -- by prepending the l_project_num_prefix
2134 p_pm_project_reference => l_project_num_prefix || c_visit_rec.visit_number,
2135 p_unique_project_ref_flag => l_project_flag);
2136
2137 IF (l_log_statement >= l_log_current_level) THEN
2138 fnd_log.string(l_log_statement,
2139 L_DEBUG_KEY,
2140 'Returned from PA_PROJECT_PUB.check_unique_project_reference: p_unique_project_ref_flag = ' || l_project_flag || ', 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,
2146 L_DEBUG_KEY,
2147 'Errors from PA_PROJECT_PUB.check_unique_project_reference. Message count: ' ||
2148 l_msg_count || ', message data: ' || l_msg_data);
2149 END IF;
2150 IF l_return_status = FND_API.G_RET_STS_ERROR THEN
2151 RAISE FND_API.G_EXC_ERROR;
2152 ELSE
2153 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2154 END IF;
2155 END IF;
2156
2157 IF l_project_flag = 'Y' THEN
2158 IF (l_log_statement >= l_log_current_level) THEN
2159 fnd_log.string(l_log_statement,
2160 L_DEBUG_KEY,
2161 'Before calling PA_PROJECT_PUB.create_project');
2162 END IF;
2163
2164 PA_PROJECT_PUB.CREATE_PROJECT
2165 (p_api_version_number => 1,
2166 p_commit => l_commit,
2167 p_init_msg_list => l_init_msg_list,
2168 p_msg_count => l_msg_count,
2169 p_msg_data => l_msg_data,
2170 p_return_status => x_return_status,
2171 p_workflow_started => l_workflow_started,
2172 p_pm_product_code => G_PM_PRODUCT_CODE,
2173 p_project_in => l_project_rec,
2174 p_project_out => l_project_out,
2175 p_key_members => l_key_members,
2176 p_class_categories => l_class_categories,
2177 p_tasks_in => l_task_in,
2178 p_tasks_out => l_task_out
2179 );
2180
2181 IF (l_log_statement >= l_log_current_level) THEN
2182 fnd_log.string(l_log_statement,
2183 L_DEBUG_KEY,
2184 'After calling PA_PROJECT_PUB.create_project. Project_Id = ' ||
2185 l_project_out.pa_project_id || ' Return Status = ' || x_return_status);
2186 END IF;
2187
2188 IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
2189 IF (l_log_statement >= l_log_current_level) THEN
2190 fnd_log.string(l_log_statement,
2191 L_DEBUG_KEY,
2192 'Errors from PA_PROJECT_PUB.create_project. Message count: ' ||
2193 l_msg_count || ', message data: ' || l_msg_data);
2194 END IF;
2195 IF l_return_status = FND_API.G_RET_STS_ERROR THEN
2196 RAISE FND_API.G_EXC_ERROR;
2197 ELSE
2198 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2199 END IF;
2200 END IF;
2201
2202 IF x_return_status = 'S' THEN
2203 UPDATE AHL_VISITS_B
2204 SET PROJECT_ID = l_project_out.pa_project_id,
2205 OBJECT_VERSION_NUMBER = c_visit_rec.object_version_number + 1,
2206 --TCHIMIRA::BUG 9222622 ::15-DEC-2009::UPDATE WHO COLUMNS
2207 LAST_UPDATE_DATE = SYSDATE,
2208 LAST_UPDATED_BY = Fnd_Global.USER_ID,
2209 LAST_UPDATE_LOGIN = Fnd_Global.LOGIN_ID
2210 WHERE VISIT_ID = p_visit_id;
2211 -- RROY
2212 -- Post 11.5.10
2213 -- Call Create_Project_Parameter API
2214 -- RROY
2215 -- Confirm the parameters
2216 -- Other parameters are not mandatory
2217
2218 OPEN c_cost_group(c_visit_rec.organization_id);
2219 FETCH c_cost_group INTO l_param_data.cost_group_id;
2220 CLOSE c_cost_group;
2221
2222 l_param_data.project_id := l_project_out.pa_project_id;
2223 l_param_data.organization_id := c_visit_rec.organization_id;
2224 --l_param_data.cost_group_id := NVL(l_param_data.cost_group_id,1);
2225 l_param_data.wip_acct_class_code := NULL;
2226 l_param_data.eam_acct_class_code := NULL;
2227 l_param_data.ipv_expenditure_type := NULL;
2228 l_param_data.erv_expenditure_type := NULL;
2229 l_param_data.freight_expenditure_type := NULL;
2230 l_param_data.tax_expenditure_type := NULL;
2231 l_param_data.misc_expenditure_type := NULL;
2232 l_param_data.ppv_expenditure_type := NULL;
2233 l_param_data.dir_item_expenditure_type := 'Machine Usage';
2234 -- yazhou 06Oct2005 starts
2235 -- Bug fix #4658861
2236 --l_param_data.start_date_active := c_visit_rec.start_date_time;
2237 --l_param_data.end_date_active := c_visit_rec.close_date_time;
2238 l_param_data.start_date_active := NULL;
2239 l_param_data.end_date_active := NULL;
2240 -- yazhou 06Oct2005 ends
2241 -- Changes made by jaramana on May 5, 2006 to accommodate PJM Bug 5197977/5194650
2242 IF (l_log_statement >= l_log_current_level) THEN
2243 FND_LOG.STRING(l_log_statement, L_DEBUG_KEY, 'About to set MFG_ORGANIZATION_ID Profile with ' || c_visit_rec.organization_id);
2244 END IF;
2245 FND_PROFILE.PUT('MFG_ORGANIZATION_ID', TO_CHAR(c_visit_rec.organization_id));
2246
2247 PJM_PROJECT_PARAM_PUB.Create_Project_Parameter(
2248 p_api_version => 1.0,
2249 p_init_msg_list => l_init_msg_list,
2250 p_commit => l_commit,
2251 x_return_status => l_return_status,
2252 x_msg_count => l_msg_count,
2253 x_msg_data => l_msg_data,
2254 p_param_data => l_param_data);
2255
2256 IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
2257 IF (l_log_statement >= l_log_current_level) THEN
2258 fnd_log.string(l_log_statement,
2259 L_DEBUG_KEY,
2260 'Errors from PJM_PROJECT_PARAM_PUB.Create_Project_Parameter. Message count: ' ||
2261 l_msg_count || ', message data: ' || l_msg_data);
2262 END IF;
2263
2264 IF l_return_status = FND_API.G_RET_STS_ERROR THEN
2265 RAISE FND_API.G_EXC_ERROR;
2266 ELSE
2267 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2268 END IF;
2269 END IF;
2270 -- RROY
2271 IF l_task_out.COUNT > 0 THEN
2272 z := l_task_out.FIRST;
2273 LOOP
2274 IF (l_log_statement >= l_log_current_level) THEN
2275 fnd_log.string(l_log_statement,
2276 L_DEBUG_KEY,
2277 'Updating all tasks project_task_id = ' ||
2278 l_task_out(z).pa_task_id);
2279 END IF;
2280
2281 --PRAKKUM :: PIE :: 13-OCT-2010 ::START
2282 -- Update AHL_VISIT_TASKS_B only for non-rollup tasks
2283 IF (INSTR(l_task_in(z).PA_TASK_NUMBER, '-') = 0) THEN
2284 OPEN c_Task_OVN(p_visit_id,l_task_in(z).PA_TASK_NUMBER);
2285 FETCH c_Task_OVN INTO l_obj_version;
2286 CLOSE c_Task_OVN;
2287
2288 UPDATE AHL_VISIT_TASKS_B
2289 SET PROJECT_TASK_ID = l_task_out(z).pa_task_id,
2290 OBJECT_VERSION_NUMBER = l_obj_version + 1,
2291 --TCHIMIRA::BUG 9222622 ::15-DEC-2009::UPDATE WHO COLUMNS
2292 LAST_UPDATE_DATE = SYSDATE,
2293 LAST_UPDATED_BY = Fnd_Global.USER_ID,
2294 LAST_UPDATE_LOGIN = Fnd_Global.LOGIN_ID
2295 WHERE VISIT_ID = p_visit_id AND VISIT_TASK_NUMBER = l_task_in(z).PA_TASK_NUMBER;
2296 END IF;
2297 --PRAKKUM :: PIE :: 13-OCT-2010 ::END
2298 EXIT WHEN z = l_task_out.LAST ;
2299 z := l_task_out.NEXT(z);
2300 END LOOP;
2301 END IF; -- End of l_task_out.COUNT
2302 END IF; -- End of x_return_status = 'S'
2303 ELSE -- Else of l_project_flag = 'Y'
2304 x_return_status := Fnd_Api.g_ret_sts_error;
2305 IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_error) THEN
2306 Fnd_Message.set_name ('AHL', 'AHL_VWP_PROJECT_NOT_UNIQUE');
2307 Fnd_Msg_Pub.ADD;
2308 END IF;
2309 END IF; -- End of l_project_flag = 'Y'
2310 END IF; --- End of l_chk_project = 'Y'
2311 ELSIF c_visit_rec.START_DATE_TIME IS NULL or c_visit_rec.START_DATE_TIME = Fnd_Api.G_MISS_DATE THEN
2312 x_return_status := Fnd_Api.g_ret_sts_error;
2313 IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_error) THEN
2314 Fnd_Message.set_name ('AHL', 'AHL_VWP_VISIT_ST_DT_MISSING');
2315 Fnd_Msg_Pub.ADD;
2316 END IF;
2317 END IF; -- End of Start Time and Department null Check
2318
2319 IF (l_log_statement >= l_log_current_level) THEN
2320 FOR get_proj_details_rec IN get_proj_details(l_project_out.pa_project_id)
2321 LOOP
2322 fnd_log.string(l_log_statement, L_DEBUG_KEY , 'task_id--@>'||get_proj_details_rec.task_id);
2323 fnd_log.string(l_log_statement, L_DEBUG_KEY , 'project_id--@>'||get_proj_details_rec.project_id);
2324 fnd_log.string(l_log_statement, L_DEBUG_KEY , 'parent_task_id--@>'||get_proj_details_rec.parent_task_id);
2325 fnd_log.string(l_log_statement, L_DEBUG_KEY , 'task_name--@>'||get_proj_details_rec.task_name);
2326 END LOOP;
2327 END IF;
2328
2329 IF (l_log_procedure >= l_log_current_level) THEN
2330 fnd_log.string(l_log_procedure,
2331 L_DEBUG_KEY ||'.end',
2332 'At the end of PL SQL procedure. Return Status = ' || x_return_status);
2333 END IF;
2334 END Create_Project;
2335
2336 --------------------------------------------------------------------
2337 -- PROCEDURE
2338 -- Update_Project
2339 --
2340 -- PURPOSE
2341 -- To update Project status to CLOSED when visit is set as Closed/Canceled
2342 --------------------------------------------------------------------
2343 PROCEDURE Update_Project(
2344 p_api_version IN NUMBER,
2345 p_init_msg_list IN VARCHAR2 := Fnd_Api.g_false,
2346 p_commit IN VARCHAR2 := Fnd_Api.g_false,
2347 p_validation_level IN NUMBER := Fnd_Api.g_valid_level_full,
2348 p_module_type IN VARCHAR2 := Null,
2349 p_visit_id IN NUMBER,
2350
2351 x_return_status OUT NOCOPY VARCHAR2,
2352 x_msg_count OUT NOCOPY NUMBER,
2353 x_msg_data OUT NOCOPY VARCHAR2)
2354 AS
2355 -- Define local Variables
2356 L_API_NAME CONSTANT VARCHAR2(30) := 'Update_Project';
2357 L_API_VERSION CONSTANT NUMBER := 1.0;
2358 L_DEBUG_KEY CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
2359 l_count NUMBER;
2360 l_msg_count NUMBER;
2361 l_created_project_id NUMBER;
2362 i NUMBER;
2363 l_msg_index_out NUMBER;
2364 -- PRAKKUM :: PIE Changes :: 13-OCT-2010
2365 -- CREATED_FROM_PROJECT_ID NUMBER;
2366 l_return_status VARCHAR2(1);
2367 l_chk_project VARCHAR2(1);
2368 l_workflow_started VARCHAR2(1);
2369 l_valid_flag VARCHAR2(1):= 'N';
2370 l_commit VARCHAR2(1) := 'F';
2371 l_init_msg_list VARCHAR2(1) := 'F';
2372 l_default VARCHAR2(30);
2373 l_msg_data VARCHAR2(2000);
2374 G_EXC_ERROR EXCEPTION;
2375
2376 -- Define local table and record datatypes
2377 l_project_rec PA_PROJECT_PUB.PROJECT_IN_REC_TYPE;
2378 l_project_out PA_PROJECT_PUB.PROJECT_OUT_REC_TYPE;
2379 l_param_data PJM_PROJECT_PARAM_PUB.ParamRecType;
2380 l_task_in PA_PROJECT_PUB.TASK_IN_TBL_TYPE;
2381 l_op_task_in PA_PROJECT_PUB.TASK_IN_TBL_TYPE;
2382 l_display_seq NUMBER;
2383 l_task_out PA_PROJECT_PUB.TASK_OUT_TBL_TYPE;
2384 l_key_members PA_PROJECT_PUB.PROJECT_ROLE_TBL_TYPE;
2385 l_class_categories PA_PROJECT_PUB.CLASS_CATEGORY_TBL_TYPE;
2386
2387 -- yazhou 26Sept2005 starts
2388 -- ER#4618348
2389 -- l_project_name_prefix VARCHAR2(10);
2390 l_project_num_prefix VARCHAR2(10);
2391 l_visit_name_len NUMBER;
2392 -- yazhou 26Sept2005 ends
2393
2394 -- PRAKKUM :: PIE :: 13-OCT-2010 :: START
2395 l_top_task_id NUMBER := NULL;
2396 l_new_structure_flag VARCHAR2(1);
2397 -- Associative array of visit task id to project task ref
2398 TYPE Ref_Tbl_Type IS TABLE OF VARCHAR2(30) INDEX BY BINARY_INTEGER;
2399 l_id_ref_map_Tbl Ref_Tbl_Type;
2400
2401 -- PRAKKUM :: 24-NOV-2010 :: Bug 9370120 :: FP:12.0-12.2
2402 TYPE Id_Tbl_Type IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
2403 l_task_id_tbl Id_Tbl_Type;
2404 -- PRAKKUM :: 08-JAN-2013 :: FPBug 16481709 for BaseBug 14828418 : In reference of bug 9047048
2405 l_parent_task_id_tbl Id_Tbl_Type;
2406 l_tasks_disp_seq_tbl Id_Tbl_Type;
2407
2408 l_is_wp_separate_from_fn VARCHAR2(1);
2409 l_is_wp_versioning_enabled VARCHAR2(1);
2410 l_pass_entire_structure VARCHAR2(1) := 'N'; -- Default to 'N';
2411 l_task_ref_tbl ref_tbl_type;
2412 l_parent_task_ref_tbl ref_tbl_type;
2413 L_CURR_TASK_COUNT NUMBER;
2414
2415 -- PRAKKUM :: 08-JAN-2013 :: FPBug 16481709 for BaseBug 14828418 : In reference of bug 9047048
2416 -- Changed code to resolve error that being thrown if non-cmro project tasks have hierarchy
2417 -- This cursor gets the task ref and parent task ref for all the tasks in the given project
2418 CURSOR get_project_tasks_csr (c_project_id IN NUMBER) IS
2419 SELECT ppe.pm_source_reference, ppe1.pm_source_reference PARENT_TASK_REFERENCE, ppe.proj_element_id TASK_ID
2420 , parent_p_tsks.task_id PARENT_TASK_ID, PPEV.DISPLAY_SEQUENCE
2421 --SELECT ppe.pm_source_reference, ppe1.pm_source_reference PARENT_TASK_REFERENCE, ppe.proj_element_id
2422 FROM pa_proj_element_versions ppev, pa_object_relationships por,
2423 pa_proj_element_versions ppev1, pa_proj_elements ppe,
2424 pa_proj_elements ppe1,
2425 pa_tasks parent_p_tsks
2426 WHERE ppev.element_version_id = por.object_id_to1
2427 AND por.relationship_type = 'S' -- WORKPLAN STRUCTURE
2428 AND por.object_id_from1 = ppev1.element_version_id
2429 AND ppev.project_id = c_project_id
2430 AND ppev1.project_id = c_project_id
2431 AND ppe.project_id = ppev.project_id
2432 AND ppe.proj_element_id = ppev.proj_element_id
2433 AND ppe1.project_id = ppev1.project_id
2434 AND ppe1.proj_element_id = ppev1.proj_element_id
2435 AND parent_p_tsks.task_id (+) = ppe1.proj_element_id
2436 ORDER BY ppev.DISPLAY_SEQUENCE;
2437
2438 -- PRAKKUM :: 08-JAN-2013 :: FPBug 16481709 for BaseBug 14828418 : In reference of bug 9047048
2439 -- This cursor gets the task ref and parent task ref for all the tasks in the given project
2440 -- leaving out those in the current visit (represented by its top task id)
2441 CURSOR get_other_vst_prj_tsks_csr(c_project_id IN NUMBER, c_top_task_id IN NUMBER) IS
2442 SELECT CURR.PM_TASK_REFERENCE, P_CURR.PM_TASK_REFERENCE PARENT_TASK_REFERENCE,
2443 CURR.TASK_ID -- PRAKKUM :: 24-NOV-2010 :: Bug 9370120 :: FP:12.0-12.2 :: Fetch project task id as well
2444 , P_CURR.task_id PARENT_TASK_ID, PPEV.DISPLAY_SEQUENCE
2445 FROM PA_TASKS CURR, PA_PROJ_ELEMENT_VERSIONS PPEV, PA_TASKS P_CURR
2446 WHERE CURR.PROJECT_ID = c_project_id
2447 AND CURR.TOP_TASK_ID <> c_top_task_id
2448 AND PPEV.PROJ_ELEMENT_ID = CURR.TASK_ID
2449 AND PPEV.PROJECT_ID = c_project_id
2450 AND P_CURR.TASK_ID (+) = CURR.PARENT_TASK_ID
2451 ORDER BY PPEV.DISPLAY_SEQUENCE;
2452 -- PRAKKUM :: PIE :: 13-OCT-2010 :: END
2453
2454 -- PRAKKUM :: 04-JAN-2013 :: FPBug 16481709 for BaseBug 14828418 : In reference of bug 9047048 :: START
2455 -- Query to retrive only project tasks whihc are not mapped to visits - excluding roll up tasks
2456 CURSOR get_prj_tsks_not_mapd_to_vst(c_project_id IN NUMBER, c_visit_id IN NUMBER) IS
2457 SELECT CURR.TASK_ID TASK_ID, CURR.PARENT_TASK_ID PARENT_TASK_ID, PPEV.DISPLAY_SEQUENCE
2458 FROM PA_TASKS CURR,
2459 PA_PROJ_ELEMENT_VERSIONS PPEV
2460 WHERE CURR.PROJECT_ID = c_project_id
2461 AND CURR.TOP_TASK_ID not IN
2462 (
2463 SELECT DISTINCT TOP_TASK_ID
2464 FROM AHL_VISIT_TASKS_VL VT, PA_PROJ_ELEMENT_VERSIONS PPEV, PA_TASKS PTSKS
2465 WHERE PPEV.PROJECT_ID = c_project_id
2466 AND VT.VISIT_ID = c_visit_id -- PRAKKUM :: 17-JAN-2013 :: FPBug 16481709 for BaseBug 14828418
2467 AND PPEV.PROJ_ELEMENT_ID = VT.PROJECT_TASK_ID
2468 AND PTSKS.TASK_ID = PPEV.PROJ_ELEMENT_ID
2469 ) /* Query to get all the top project tasks corresponding to visits */
2470 AND PPEV.PROJ_ELEMENT_ID = CURR.TASK_ID
2471 AND PPEV.PROJECT_ID = c_project_id
2472 ORDER BY PPEV.DISPLAY_SEQUENCE;
2473
2474 CURSOR get_vst_prj_top_task(c_project_id IN AHL_VISITS_B.PROJECT_ID%TYPE, c_visit_id IN AHL_VISITS_B.VISIT_ID%TYPE) IS
2475 SELECT distinct PTSKS.TOP_TASK_ID TOP_TASK_ID
2476 FROM AHL_VISIT_TASKS_VL VT, PA_PROJ_ELEMENT_VERSIONS PPEV, PA_TASKS PTSKS
2477 WHERE PPEV.PROJECT_ID = c_project_id
2478 AND PPEV.PROJ_ELEMENT_ID = VT.PROJECT_TASK_ID
2479 AND PTSKS.TASK_ID = PPEV.PROJ_ELEMENT_ID
2480 AND VT.VISIT_ID = c_visit_id;
2481 l_vst_prj_top_tsk_rec get_vst_prj_top_task%RowType;
2482 -- PRAKKUM :: 04-JAN-2013 :: FPBug 16481709 for BaseBug 14828418 : In reference of bug 9047048 :: END
2483
2484 -- Define local Cursors
2485 -- To find visit related information
2486 CURSOR c_visit (x_id IN NUMBER) IS
2487 SELECT * FROM AHL_VISITS_VL
2488 WHERE VISIT_ID = x_id;
2489 c_visit_rec c_visit%ROWTYPE;
2490
2491 -- To find count for tasks for visit
2492 CURSOR c_task_ct (x_id IN NUMBER) IS
2493 SELECT count(*) FROM AHL_VISIT_TASKS_VL
2494 WHERE VISIT_ID = x_id
2495 AND NVL(status_code, 'Y') <> NVL ('DELETED', 'X') ;
2496
2497 -- PRAKKUM :: PIE :: 13-OCT-2010 ::
2498 -- To find tasks information for visit
2499 CURSOR c_task (x_id IN NUMBER) IS
2500 -- SELECT * FROM AHL_VISIT_TASKS_VL
2501 -- WHERE VISIT_ID = x_id
2502 -- AND NVL(status_code, 'Y') <> NVL ('DELETED', 'X');
2503 SELECT PPEV.DISPLAY_SEQUENCE, VT.*
2504 FROM AHL_VISIT_TASKS_VL VT, PA_PROJ_ELEMENT_VERSIONS PPEV
2505 WHERE VT.VISIT_ID = x_id
2506 AND NVL(VT.status_code, 'Y') <> NVL ('DELETED', 'X')
2507 AND PPEV.PROJ_ELEMENT_ID (+) = VT.PROJECT_TASK_ID;
2508 c_task_rec c_task%ROWTYPE;
2509
2510 -- To find tasks information for visit
2511 CURSOR c_task_proj (x_id IN NUMBER) IS
2512 SELECT TASK_ID, TASK_NUMBER
2513 FROM PA_TASKS
2514 WHERE PROJECT_ID = x_id;
2515 c_task_proj_rec c_task_proj%ROWTYPE;
2516
2517 -- PRAKKUM :: PIE :: 13-OCT-2010
2518 -- To find project task id, given the task number
2519 CURSOR get_task_id_parent_ref_csr (c_project_id IN NUMBER, c_task_number IN VARCHAR2) IS
2520 SELECT CURR.TASK_ID, PARENT.PM_TASK_REFERENCE PARENT_TASK_REFERENCE
2521 FROM PA_TASKS CURR, PA_TASKS PARENT
2522 WHERE CURR.PROJECT_ID = c_project_id
2523 AND CURR.TASK_NUMBER = c_task_number
2524 AND PARENT.TASK_ID (+) = CURR.PARENT_TASK_ID;
2525
2526 CURSOR get_task_disp_seq_csr (c_project_task_id IN NUMBER) IS
2527 SELECT PPEV.DISPLAY_SEQUENCE
2528 FROM PA_PROJ_ELEMENT_VERSIONS PPEV
2529 WHERE PPEV.PROJ_ELEMENT_ID = c_project_task_id;
2530
2531 CURSOR c_pjm_param(x_proj_id IN NUMBER,x_org_id IN NUMBER) IS
2532 SELECT 'x'
2533 FROM pjm_project_parameters_v
2534 WHERE project_id = x_proj_id
2535 AND organization_id = x_org_id;
2536
2537 l_dummy VARCHAR2(1);
2538
2539 -- To get the cost group for the Org
2540 CURSOR c_cost_group(p_org_id IN NUMBER) IS
2541 SELECT default_cost_group_id
2542 FROM mtl_parameters
2543 WHERE organization_id = p_org_id;
2544
2545 --Bug#5587893
2546 /*sowsubra - starts*/
2547 -- To get the project status for visit updation
2548 CURSOR c_proj_status_code(x_id IN NUMBER) IS
2549 SELECT ppa.project_status_code
2550 FROM ahl_visits_b avb, pa_projects_all ppa
2551 WHERE avb.visit_id = x_id
2552 AND avb.project_id = ppa.project_id;
2553
2554 l_prj_status_code_fdb pa_projects_all.project_status_code%TYPE;
2555 /*sowsubra - ends*/
2556
2557 /*
2558 Modified by rnahata for Bug 5758813
2559 Fetches the task details for all the tasks in the visit
2560 The first part of the union fetches task details for all the Planned and Unplanned tasks.
2561 The second part fetches task details of all the MR/NR/SR Summary tasks.
2562 The third part fetches task details of all the manually created Summary and Unassociated tasks.
2563 */
2564 -- PRAKKUM :: 24-NOV-2010 :: Bug 9705164 :: FP12.0.9-12.2:PIE :: START
2565 -- Changed the below cursor to fetch results in the order of the cost parent hierarchy of visit tasks
2566 -- Need to pass these tasks' details to the Projects API, in the order of their hierarchy
2567 -- PRAKKUM :: PIE :: 28-OCT-2010 :: START Commented planning
2568 CURSOR get_prj_route_dtls_cur (p_visit_id IN NUMBER) IS
2569 SELECT * FROM (
2570 SELECT SUBSTR(NVL(ar.route_no,avt.visit_task_name),1,20) task_name,
2571 SUBSTR(NVL(ar.title,avt.visit_task_name),1,250) description,
2572 avt.visit_task_name, avt.visit_task_number, avt.start_date_time task_start_date,
2573 avt.end_date_time task_end_date, avt.project_Task_id project_task_id, ppev.display_sequence,
2574 avt.task_type_code, avt.cost_parent_id, avt.service_type_code, avt.visit_task_id
2575 , avt.repair_batch_name --PRAKKUM :: 11/06/2012 :: Bug 14068468
2576 FROM ahl_routes_vl ar,ahl_visit_tasks_vl avt, ahl_mr_routes mrr, pa_proj_element_versions ppev
2577 WHERE avt.visit_id = p_visit_id
2578 --VWPE: ER:12424063 :: SKPATHAK :: 07-JUN-2012 :: Tasks should not be in deleted status
2579 AND NVL(avt.status_code,'Y') <> 'DELETED'
2580 AND avt.task_type_code NOT IN ('SUMMARY','UNASSOCIATED','STAGE') ----SKPATHAK :: VWPE: ER:12424063 :: 13-JUN-2012 :: Need not create project task for a stage
2581 AND avt.mr_route_id = mrr.mr_route_id (+)
2582 AND mrr.route_id = ar.route_id (+)
2583 AND ppev.proj_element_id (+) = avt.project_task_id
2584 UNION ALL
2585 SELECT SUBSTR(NVL(amh.title,avt.visit_task_name),1,20) task_name, NVL(amh.title,avt.visit_task_name) description,
2586 avt.visit_task_name, avt.visit_task_number, avt.start_date_time task_start_date,
2587 avt.end_date_time task_end_date, avt.project_Task_id project_task_id, ppev.display_sequence,
2588 avt.task_type_code, avt.cost_parent_id, avt.service_type_code, avt.visit_task_id
2589 , avt.repair_batch_name --PRAKKUM :: 11/06/2012 :: Bug 14068468
2590 FROM ahl_mr_headers_v amh,ahl_visit_tasks_vl avt, pa_proj_element_versions ppev
2591 WHERE avt.visit_id = p_visit_id
2592 --VWPE: ER:12424063 :: SKPATHAK :: 07-JUN-2012 :: Tasks should not be in deleted status
2593 AND NVL(avt.status_code,'Y') <> 'DELETED'
2594 AND avt.task_type_code = 'SUMMARY'
2595 AND avt.summary_task_flag = 'N'
2596 AND avt.mr_id = amh.mr_header_id (+)
2597 AND ppev.proj_element_id (+) = avt.project_task_id
2598 UNION ALL
2599 SELECT SUBSTR(avt.visit_task_name,1,20) task_name, avt.visit_task_name description,
2600 avt.visit_task_name, avt.visit_task_number, avt.start_date_time task_start_date,
2601 avt.end_date_time task_end_date, avt.project_Task_id project_task_id, ppev.display_sequence,
2602 avt.task_type_code, avt.cost_parent_id, avt.service_type_code, avt.visit_task_id
2603 , avt.repair_batch_name --PRAKKUM :: 11/06/2012 :: Bug 14068468
2604 FROM ahl_visit_tasks_vl avt, pa_proj_element_versions ppev
2605 WHERE avt.visit_id = p_visit_id
2606 --VWPE: ER:12424063 :: SKPATHAK :: 07-JUN-2012 :: Tasks should not be in deleted status
2607 AND NVL(avt.status_code,'Y') <> 'DELETED'
2608 AND ((avt.task_type_code = 'SUMMARY' AND avt.summary_task_flag = 'Y')
2609 OR (avt.task_type_code ='UNASSOCIATED'))
2610 AND ppev.proj_element_id (+) = avt.project_task_id
2611 --ORDER BY 4;
2612 )
2613 START WITH cost_parent_id IS NULL
2614 CONNECT BY PRIOR visit_task_id = cost_parent_id;
2615 -- End changes by rnahata for Bug 5758813
2616 -- PRAKKUM :: PIE :: 28-OCT-2010 :: END Commented planning
2617 -- PRAKKUM :: 24-NOV-2010 :: Bug 9705164 :: FP12.0.9-12.2:PIE :: END
2618
2619 get_prj_route_dtls_rec get_prj_route_dtls_cur%ROWTYPE;
2620
2621 -- SKPATHAK :: Bug 14016007 :: 29-APR-2012 :: Added the below cursor
2622 --Fetch the project number
2623 CURSOR get_project_number (c_project_id IN NUMBER) IS
2624 SELECT segment1
2625 from pa_projects_all
2626 where project_id = c_project_id;
2627 l_project_number VARCHAR2(25);
2628
2629 --PRAKKUM :: 11/06/2012 :: Bug 14068468 :: START
2630 l_is_comp_visit VARCHAR2(1) := 'N';
2631
2632 /* Query to find whether visit have any repair batch with transactions on it. If so, visit is treated as old component visit and also
2633 further transactions will be done only over repair batch task itself */
2634 CURSOR is_rep_batch_have_trans(c_visit_id IN NUMBER)
2635 IS
2636 SELECT 'Y' FROM
2637 AHL_VISITS_B vst
2638 WHERE
2639 visit_id = c_visit_id AND
2640 EXISTS (
2641 SELECT 1
2642 FROM ahl_visit_tasks_b avt,
2643 pa_tasks pt
2644 WHERE avt.visit_id = vst.visit_id
2645 AND avt.visit_id = c_visit_id
2646 AND avt.repair_batch_name IS NOT NULL
2647 and avt.project_task_id = pt.task_id
2648 AND EXISTS (
2649 SELECT 1
2650 FROM mtl_material_transactions mmt
2651 WHERE mmt.project_id = vst.PROJECT_ID
2652 AND mmt.task_id = nvl(pt.task_id,mmt.task_id)
2653 )
2654 );
2655
2656 l_is_vst_hav_trx_on_rep_btch VARCHAR2(1) := 'N';
2657 --PRAKKUM :: 11/06/2012 :: Bug 14068468 :: END
2658
2659 BEGIN
2660 SAVEPOINT Update_project;
2661
2662 IF (l_log_procedure >= l_log_current_level) THEN
2663 fnd_log.string(l_log_procedure,
2664 L_DEBUG_KEY ||'.begin',
2665 'At the start of PL SQL procedure. Visit Id = ' || p_visit_id);
2666 END IF;
2667
2668 -- Initialize message list if p_init_msg_list is set to TRUE.
2669 IF Fnd_Api.to_boolean(p_init_msg_list) THEN
2670 Fnd_Msg_Pub.initialize;
2671 END IF;
2672
2673 -- Initialize API return status to success
2674 x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
2675
2676 -- Standard call to check for call compatibility.
2677 IF NOT Fnd_Api.COMPATIBLE_API_CALL(l_api_version,
2678 p_api_version,
2679 l_api_name,G_PKG_NAME)
2680 THEN
2681 RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
2682 END IF;
2683
2684 -- To check Project responsibilites
2685 -- Post 11.5.10
2686 -- RROY
2687 IF (l_log_statement >= l_log_current_level) THEN
2688 fnd_log.string(l_log_statement,
2689 L_DEBUG_KEY,
2690 'Before calling AHL_VWP_RULES_PVT.Check_Proj_Responsibility');
2691 END IF;
2692 AHL_VWP_RULES_PVT.Check_Proj_Responsibility
2693 ( x_check_project => l_chk_project,
2694 x_return_status => l_return_status);
2695
2696 IF (l_log_statement >= l_log_current_level) THEN
2697 fnd_log.string(l_log_statement,
2698 L_DEBUG_KEY,
2699 'After calling AHL_VWP_RULES_PVT.Check_Proj_Responsibility. Return Status = ' || l_return_status);
2700 END IF;
2701
2702 IF (l_return_status <> Fnd_Api.G_RET_STS_SUCCESS) THEN
2703 IF (l_log_statement >= l_log_current_level) THEN
2704 fnd_log.string(l_log_statement,
2705 L_DEBUG_KEY,
2706 'Errors from AHL_VWP_RULES_PVT.Check_Proj_Responsibility');
2707 END IF;
2708 x_return_status := l_return_status;
2709 IF l_return_status = FND_API.G_RET_STS_ERROR THEN
2710 RAISE FND_API.G_EXC_ERROR;
2711 ELSE
2712 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2713 END IF;
2714 END IF;
2715
2716 IF l_chk_project = 'Y' THEN
2717 OPEN c_Visit(p_visit_id);
2718 FETCH c_visit INTO c_visit_rec;
2719 CLOSE c_Visit;
2720
2721 OPEN is_rep_batch_have_trans(p_visit_id);
2722 FETCH is_rep_batch_have_trans INTO l_is_vst_hav_trx_on_rep_btch;
2723 CLOSE is_rep_batch_have_trans;
2724
2725 --PRAKKUM :: 11/06/2012 :: Bug 14068468
2726 l_is_comp_visit := AHL_CMP_UTIL_PKG.Is_Comp_Visit (p_visit_id);
2727 IF (l_log_statement >= l_log_current_level) THEN
2728 fnd_log.string(l_log_statement,L_DEBUG_KEY,'p_visit_id --@> '||p_visit_id);
2729 fnd_log.string(l_log_statement,L_DEBUG_KEY,'l_is_vst_hav_trx_on_rep_btch--@> '||l_is_vst_hav_trx_on_rep_btch);
2730 fnd_log.string(l_log_statement,L_DEBUG_KEY,'l_is_comp_visit--@> '||l_is_comp_visit);
2731 END IF;
2732
2733 -- PRAKKUM :: PIE:FP :: 13-OCT-2010 :: START
2734 IF c_visit_rec.PROJECT_ID IS NOT NULL THEN
2735 l_is_wp_separate_from_fn := PA_PROJ_TASK_STRUC_PUB.IS_WP_SEPARATE_FROM_FN(c_visit_rec.PROJECT_ID);
2736 l_is_wp_versioning_enabled := PA_PROJ_TASK_STRUC_PUB.IS_WP_VERSIONING_ENABLED(c_visit_rec.PROJECT_ID);
2737 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2738 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'c_visit_rec.PROJECT_ID = ' || c_visit_rec.PROJECT_ID ||
2739 ', l_is_wp_separate_from_fn = ' || l_is_wp_separate_from_fn ||
2740 ' and l_is_wp_versioning_enabled = ' || l_is_wp_versioning_enabled);
2741 END IF;
2742 IF (l_is_wp_separate_from_fn = 'N') THEN
2743 -- Workplan is enabled, Using Shared Structure
2744 -- In order to avoid the error with updating projects with Work Plan Structure enabled,
2745 -- just pass the task reference and the parent task reference for all existing tasks even if there is no change
2746 l_pass_entire_structure := 'Y';
2747 END IF;
2748 END IF;
2749 -- PRAKKUM :: PIE:FP :: 13-OCT-2010 :: END
2750
2751 --Bug#5587893
2752 OPEN c_proj_status_code(p_visit_id);
2753 FETCH c_proj_status_code INTO l_prj_status_code_fdb;
2754 CLOSE c_proj_status_code;
2755
2756 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
2757 c_visit_rec.start_date_time := SYSDATE;
2758 END IF;
2759
2760 IF (c_visit_rec.START_DATE_TIME IS NOT NULL
2761 AND c_visit_rec.START_DATE_TIME <> Fnd_Api.G_MISS_DATE
2762 AND c_visit_rec.DEPARTMENT_ID IS NOT NULL
2763 AND c_visit_rec.DEPARTMENT_ID <> FND_API.G_MISS_NUM) THEN
2764
2765 -- PRAKKUM :: PIE:FP :: 19-NOV-2010 ::
2766 /*
2767 IF c_visit_rec.project_template_id IS NOT NULL THEN
2768 CREATED_FROM_PROJECT_ID := c_visit_rec.project_template_id;
2769 ELSE
2770 CREATED_FROM_PROJECT_ID := nvl(FND_PROFILE.VALUE('AHL_DEFAULT_PA_TEMPLATE_ID'),0);
2771 END IF;
2772 */
2773
2774 -- yazhou 26Sept2005 starts
2775 -- ER#4618348
2776
2777 --l_project_name_prefix := SUBSTR(FND_PROFILE.VALUE('AHL_PROJECT_PREFIX'),1,10);
2778 --l_project_num_prefix := SUBSTR(FND_PROFILE.VALUE('AHL_PROJECT_NUM_PREFIX'),1,10);
2779 -- SKPATHAK :: Bug 14016007 :: 29-APR-2012
2780 -- Since in this API only a project is updated and not created, instead of getting project number prefix from the profile, derive it from already created project
2781 OPEN get_project_number (c_visit_rec.PROJECT_ID);
2782 FETCH get_project_number INTO l_project_number;
2783 CLOSE get_project_number;
2784 IF (l_project_number = (to_char(c_visit_rec.visit_number))) THEN
2785 l_project_num_prefix := null;
2786 ELSE
2787 l_project_num_prefix := SUBSTR (l_project_number, 0, (length(l_project_number) - length(to_char(c_visit_rec.visit_number))));
2788 END IF;
2789
2790 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
2791 fnd_log.string(fnd_log.level_statement,L_DEBUG_KEY,'l_project_num_prefix = ' || l_project_num_prefix);
2792 END IF;
2793
2794
2795 -- PRAKKUM :: PIE Changes :: 15-OCT-2010 :: START
2796 IF (l_log_statement >= l_log_current_level) THEN
2797 fnd_log.string(l_log_statement, L_DEBUG_KEY, 'Before calling Use_New_Task_Structure.');
2798 END IF;
2799
2800 Use_New_Task_Structure
2801 ( p_visit_id => p_visit_id,
2802 x_new_structure_flag => l_new_structure_flag
2803 );
2804 -- If a visit is being pushed into production for the first time under a parent project,
2805 -- and the cost has not been estimated for this visit, create a top level task
2806 -- If the visit is in Planning and project_id is not null and top task is null and project_template_id is null,
2807 -- need to create the hierarchy under the existing project
2808 -- SKPATHAK :: VWPE: ER:12424063 :: 08-JUN-2012 :: Going forward, initial status of the visit will be draft
2809 IF (c_visit_rec.STATUS_CODE = 'DRAFT' AND
2810 c_visit_rec.PROJECT_ID IS NOT NULL AND
2811 c_visit_rec.TOP_PROJECT_TASK_ID IS NULL AND
2812 c_visit_rec.PROJECT_TEMPLATE_ID IS NULL) THEN
2813
2814 -- TYPE 1: Visit is being pushed into production for the first time under a parent project
2815 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
2816 fnd_log.string(fnd_log.level_statement, L_DEBUG_KEY, 'TYPE 1');
2817 END IF;
2818
2819 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
2820 fnd_log.string(fnd_log.level_statement, L_DEBUG_KEY, 'Adding top task to Project Id: ' || c_visit_rec.PROJECT_ID);
2821 END IF;
2822 l_Project_rec.PA_PROJECT_ID := c_visit_rec.PROJECT_ID; -- Update the Parent Project
2823 -- Create the Top Task
2824 l_task_in(1).PM_TASK_REFERENCE := l_project_num_prefix || to_char(c_visit_rec.visit_number);
2825 -- PRAKKUM :: Bug 8321557 :: 10-DEC-2010 :: Use SUBSTRB instead of SUBSTR
2826 l_task_in(1).TASK_NAME := SUBSTRB(c_visit_rec.visit_name,1,15);
2827 l_task_in(1).LONG_TASK_NAME := c_visit_rec.visit_name;
2828 l_task_in(1).PA_TASK_NUMBER := l_project_num_prefix || to_char(c_visit_rec.visit_number);
2829 l_task_in(1).TASK_DESCRIPTION := SUBSTRB(c_visit_rec.description,1,250);
2830 l_task_in(1).TASK_START_DATE := trunc(c_visit_rec.start_date_time);
2831 l_task_in(1).TASK_COMPLETION_DATE := null;
2832 l_task_in(1).PM_PARENT_TASK_REFERENCE := null; -- No parent task for the top task
2833 l_top_task_id := -1;
2834
2835
2836 OPEN c_task_ct(p_visit_id);
2837 FETCH c_task_ct INTO l_count;
2838 CLOSE c_task_ct;
2839
2840 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
2841 fnd_log.string(fnd_log.level_statement, L_DEBUG_KEY, 'Number of tasks = ' || l_count);
2842 END IF;
2843
2844 IF l_count > 0 THEN
2845 OPEN get_prj_route_dtls_cur(p_visit_id);
2846 i := 2; -- Top Task index is 1
2847 LOOP
2848 FETCH get_prj_route_dtls_cur INTO get_prj_route_dtls_rec;
2849 EXIT WHEN get_prj_route_dtls_cur%NOTFOUND;
2850 -- If the visit start has been changed such that the visit start date is later than the visit task start date
2851 -- Then make the project task start date same as visit start date
2852 -- Later on, this will again be updated on the basis of EAM re-scheduling using Update_Project_Task_Times
2853 IF c_visit_rec.start_date_time > get_prj_route_dtls_rec.task_start_date THEN
2854 get_prj_route_dtls_rec.task_start_date := c_visit_rec.start_date_time;
2855 END IF;
2856 IF get_prj_route_dtls_rec.task_type_code <> 'SUMMARY' THEN
2857 -- Not a Summary task: First create a rollup task
2858 l_task_in(i).PM_TASK_REFERENCE := c_visit_rec.visit_number || '-' || get_prj_route_dtls_rec.visit_task_number || '-1';
2859 l_task_in(i).TASK_NAME := SUBSTRB(get_prj_route_dtls_rec.task_name,1,15) || '-1';
2860 l_task_in(i).LONG_TASK_NAME := get_prj_route_dtls_rec.task_name || '-1';
2861 l_task_in(i).PA_TASK_NUMBER := c_visit_rec.visit_number || '-' || get_prj_route_dtls_rec.visit_task_number || '-1';
2862 l_task_in(i).TASK_START_DATE := trunc(c_visit_rec.start_date_time); -- Pass visit date for Rollup tasks
2863 l_task_in(i).TASK_COMPLETION_DATE := null;--trunc(c_visit_rec.close_date_time); -- Pass visit date for Rollup tasks
2864 -- Store the value of the cost parent id temporarily
2865 -- which will be reset or overwritten later with the task number corresponding to this cost parent
2866 IF (get_prj_route_dtls_rec.cost_parent_id IS NOT NULL) THEN
2867 l_task_in(i).PM_PARENT_TASK_REFERENCE := '-' || get_prj_route_dtls_rec.cost_parent_id;
2868 ELSE
2869 -- Add this under the top task
2870 l_task_in(i).PM_PARENT_TASK_REFERENCE := l_project_num_prefix || to_char(c_visit_rec.visit_number);
2871 END IF;
2872 -- Then add the non-summary task under the rollup task
2873 i := i + 1;
2874 l_task_in(i).PM_TASK_REFERENCE := c_visit_rec.visit_number || '-' || get_prj_route_dtls_rec.visit_task_number;
2875 l_task_in(i).TASK_NAME := SUBSTRB(get_prj_route_dtls_rec.task_name,1,15);
2876 l_task_in(i).LONG_TASK_NAME := get_prj_route_dtls_rec.task_name;
2877 l_task_in(i).PA_TASK_NUMBER := c_visit_rec.visit_number || '-' || get_prj_route_dtls_rec.visit_task_number;
2878 l_task_in(i).TASK_DESCRIPTION := SUBSTRB(get_prj_route_dtls_rec.description,1,250);
2879 l_task_in(i).TASK_START_DATE := trunc(get_prj_route_dtls_rec.task_start_date);
2880 l_task_in(i).TASK_COMPLETION_DATE := null;
2881 l_task_in(i).SERVICE_TYPE_CODE := get_prj_route_dtls_rec.service_type_code;
2882 l_task_in(i).PM_PARENT_TASK_REFERENCE := c_visit_rec.visit_number || '-' || get_prj_route_dtls_rec.visit_task_number || '-1'; -- Parent is the rollup task added above
2883 -- Store the ref in the associative array
2884 -- To make the rollup as the parent always and
2885 -- to keep route tasks to always be leaf tasks even if something is added underneath
2886 -- If the non-summary task has a child, it is actually the child of the rollup and not the child of the route
2887 l_id_ref_map_Tbl(get_prj_route_dtls_rec.visit_task_id) := c_visit_rec.visit_number || '-' || get_prj_route_dtls_rec.visit_task_number || '-1';
2888 ELSE
2889 -- Summary Task
2890 l_task_in(i).PM_TASK_REFERENCE := c_visit_rec.visit_number || '-' || get_prj_route_dtls_rec.visit_task_number;
2891 l_task_in(i).TASK_NAME := SUBSTRB(get_prj_route_dtls_rec.task_name,1,15);
2892 l_task_in(i).LONG_TASK_NAME := get_prj_route_dtls_rec.task_name;
2893 l_task_in(i).PA_TASK_NUMBER := c_visit_rec.visit_number || '-' || get_prj_route_dtls_rec.visit_task_number;
2894 l_task_in(i).TASK_DESCRIPTION := SUBSTRB(get_prj_route_dtls_rec.description,1,250);
2895 l_task_in(i).TASK_START_DATE := trunc(c_visit_rec.start_date_time);--Pass visit start date to avoid error from Projects
2896 l_task_in(i).TASK_COMPLETION_DATE := null;
2897 l_task_in(i).SERVICE_TYPE_CODE := get_prj_route_dtls_rec.service_type_code;
2898 -- Store the value of the cost parent id temporarily
2899 -- which will be reset or overwritten later with the task number corresponding to this cost parent
2900 IF (get_prj_route_dtls_rec.cost_parent_id IS NOT NULL) THEN
2901 l_task_in(i).PM_PARENT_TASK_REFERENCE := '-' || get_prj_route_dtls_rec.cost_parent_id;
2902 ELSE
2903 -- Add this under the top task
2904 l_task_in(i).PM_PARENT_TASK_REFERENCE := l_project_num_prefix || to_char(c_visit_rec.visit_number);
2905 END IF;
2906 -- Store the ref in the associative array
2907 l_id_ref_map_Tbl(get_prj_route_dtls_rec.visit_task_id) := c_visit_rec.visit_number || '-' || get_prj_route_dtls_rec.visit_task_number;
2908
2909 --PRAKKUM :: 11/06/2012 :: Bug 14068468
2910 -- IF repair batch name exists, then visit is considered as component visit, visit task that referencing as repair batch summary task
2911 -- So create a child dummy task to hold transactions
2912 IF (l_log_statement >= l_log_current_level) THEN
2913 fnd_log.string(l_log_statement,L_DEBUG_KEY,'get_prj_route_dtls_rec.repair_batch_name--@>'||get_prj_route_dtls_rec.repair_batch_name);
2914 END IF;
2915 IF l_is_comp_visit = 'Y' AND get_prj_route_dtls_rec.repair_batch_name IS NOT NULL AND NVL(l_is_vst_hav_trx_on_rep_btch,'N') = 'N' THEN
2916 i := i + 1;
2917 l_task_in(i).PM_TASK_REFERENCE := c_visit_rec.visit_number || '-' || get_prj_route_dtls_rec.visit_task_number || '-' || G_TRANS_TSK_TRAIL_NAME;
2918 l_task_in(i).TASK_NAME := SUBSTRB(get_prj_route_dtls_rec.task_name,1,15)|| '-' || G_TRANS_TSK_TRAIL_NAME;
2919 l_task_in(i).LONG_TASK_NAME := get_prj_route_dtls_rec.task_name|| '-' || G_TRANS_TSK_TRAIL_NAME;
2920 l_task_in(i).PA_TASK_NUMBER := c_visit_rec.visit_number || '-' || get_prj_route_dtls_rec.visit_task_number|| '-' || G_TRANS_TSK_TRAIL_NAME;
2921 l_task_in(i).TASK_START_DATE := trunc(get_prj_route_dtls_rec.task_start_date);
2922 l_task_in(i).TASK_COMPLETION_DATE := null;
2923 l_task_in(i).SERVICE_TYPE_CODE := get_prj_route_dtls_rec.service_type_code;
2924 l_task_in(i).PM_PARENT_TASK_REFERENCE := c_visit_rec.visit_number || '-' || get_prj_route_dtls_rec.visit_task_number; -- Parent is the rollup task added above
2925
2926 -- For the rollup task, get the Project Task Id from the Task Number in case the project task is already created
2927 OPEN get_task_id_parent_ref_csr(c_project_id => c_visit_rec.PROJECT_ID, c_task_number => l_task_in(i).PA_TASK_NUMBER);
2928 FETCH get_task_id_parent_ref_csr INTO l_task_in(i).PA_TASK_ID, l_task_in(i).PM_PARENT_TASK_REFERENCE;
2929 CLOSE get_task_id_parent_ref_csr;
2930
2931 IF (l_task_in(i).PA_TASK_ID IS NOT NULL AND l_task_in(i).PA_TASK_ID <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM) THEN
2932 OPEN get_task_disp_seq_csr(c_project_task_id => l_task_in(i).PA_TASK_ID);
2933 FETCH get_task_disp_seq_csr INTO l_task_in(i).DISPLAY_SEQUENCE;
2934 CLOSE get_task_disp_seq_csr;
2935 END IF;
2936
2937 IF (l_log_statement >= l_log_current_level) THEN
2938 fnd_log.string(l_log_statement,L_DEBUG_KEY,'repair batch child task id--@>'||l_task_in(i).PA_TASK_ID);
2939 fnd_log.string(l_log_statement,L_DEBUG_KEY,'repair batch child task name--@>'||l_task_in(i).PM_PARENT_TASK_REFERENCE);
2940 fnd_log.string(l_log_statement,L_DEBUG_KEY,'repair batch child DISPLAY_SEQUENCE--@>'||l_task_in(i).DISPLAY_SEQUENCE);
2941 END IF;
2942
2943 END IF;
2944
2945 END IF;
2946
2947 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
2948 fnd_log.string(fnd_log.level_statement, L_DEBUG_KEY, 'Visit Task index: ' || i || ', Name = ' || l_task_in(i).TASK_NAME);
2949 END IF;
2950 i := i + 1;
2951 END LOOP; -- All tasks
2952 CLOSE get_prj_route_dtls_cur;
2953
2954 -- Setup the parent task for summary and rollup tasks
2955 IF l_task_in.COUNT > 0 THEN
2956 i := l_task_in.FIRST;
2957 LOOP
2958 IF (l_task_in(i).pm_parent_task_reference IS NOT NULL AND (SUBSTR(l_task_in(i).pm_parent_task_reference, 1, 1) = '-')) THEN
2959 -- Has a parent whose index is not known: Lookup the index in the associative array
2960 l_task_in(i).pm_parent_task_reference := l_id_ref_map_Tbl(TO_NUMBER(SUBSTR(l_task_in(i).pm_parent_task_reference, 2)));
2961 END IF;
2962 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
2963 fnd_log.string(fnd_log.level_statement, L_DEBUG_KEY, 'Index i = '|| i || ', PA_TASK_NUMBER = ' || l_task_in(i).PA_TASK_NUMBER ||
2964 ', PM_PARENT_TASK_REFERENCE = ' || l_task_in(i).pm_parent_task_reference);
2965 fnd_log.string(fnd_log.level_statement,L_DEBUG_KEY,'PM_TASK_REFERENCE: '|| l_task_in(i).PM_TASK_REFERENCE);
2966 fnd_log.string(fnd_log.level_statement,L_DEBUG_KEY,'TASK_NAME: '|| l_task_in(i).TASK_NAME);
2967 fnd_log.string(fnd_log.level_statement,L_DEBUG_KEY,'TASK_DESCRIPTION: '|| l_task_in(i).TASK_DESCRIPTION);
2968 fnd_log.string(fnd_log.level_statement,L_DEBUG_KEY,'TASK_START_DATE: '|| l_task_in(i).TASK_START_DATE);
2969 fnd_log.string(fnd_log.level_statement,L_DEBUG_KEY,'TASK_COMPLETION_DATE: '|| l_task_in(i).TASK_COMPLETION_DATE);
2970 fnd_log.string(fnd_log.level_statement,L_DEBUG_KEY,'PA_TASK_ID: '|| l_task_in(i).PA_TASK_ID);
2971 END IF;
2972 EXIT WHEN i = l_task_in.LAST ;
2973 i := l_task_in.NEXT(i);
2974 END LOOP; -- All Tasks
2975 END IF; -- l_task_in.COUNT > 0
2976 END IF; -- l_count > 0
2977
2978 -- Check if using Shared Workplan Structure: If so need to pass all existing tasks
2979 -- (will be only for other visits - the current visit is being pushed into production now only)
2980 -- through l_task_in
2981 IF (l_is_wp_separate_from_fn = 'N') THEN
2982 -- Workplan is enabled, Using Shared Structure
2983 -- In order to avoid the error with updating projects with Work Plan Structure enabled,
2984 -- just pass the task reference and the parent task reference for all existing tasks even if there is no change
2985 OPEN get_project_tasks_csr(c_project_id => c_visit_rec.PROJECT_ID);
2986 -- PRAKKUM :: 08-JAN-2013 :: FPBug 16481709 for BaseBug 14828418 : In reference of bug 9047048 :: START
2987 -- Changed code to resolve error that being thrown if non-cmro project tasks have hierarchy
2988 --FETCH get_project_tasks_csr BULK COLLECT INTO l_task_ref_tbl, l_parent_task_ref_tbl,l_task_id_tbl; -- PRAKKUM :: 24-NOV-2010 :: Bug 9370120 :: FP:12.0-12.2 :: Fetch project task id as well, and populate l_task_in with it
2989 FETCH get_project_tasks_csr BULK COLLECT INTO l_task_ref_tbl, l_parent_task_ref_tbl, l_task_id_tbl, l_parent_task_id_tbl, l_tasks_disp_seq_tbl;
2990 CLOSE get_project_tasks_csr;
2991 IF l_task_id_tbl.count > 0 THEN
2992 L_CURR_TASK_COUNT := l_task_in.COUNT;
2993 FOR k IN l_task_id_tbl.FIRST..l_task_id_tbl.LAST LOOP
2994 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2995 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY,
2996 'k = ' || k ||
2997 ', PM_TASK_REFERENCE = ' || l_task_ref_tbl(k) ||
2998 ', PM_PARENT_TASK_REFERENCE = ' || l_parent_task_ref_tbl(k)||
2999 ', PA_TASK_ID = ' || l_task_id_tbl(k) ||
3000 ', PARENT_PA_TASK_ID = ' || l_parent_task_id_tbl(k) ||
3001 ', DISPLAY_SEQUENCE = ' || l_tasks_disp_seq_tbl(k));
3002 END IF;
3003 l_task_in(k + L_CURR_TASK_COUNT).PA_TASK_ID := l_task_id_tbl(k);
3004 IF l_task_ref_tbl(k) IS NOT NULL THEN --Project tasks created from Projects UI, wont have task_reference
3005 l_task_in(k + L_CURR_TASK_COUNT).PM_TASK_REFERENCE := l_task_ref_tbl(k);
3006 l_task_in(k + L_CURR_TASK_COUNT).PM_PARENT_TASK_REFERENCE := l_parent_task_ref_tbl(k);
3007 ELSE -- Only project tasks created from Projects UI will come to this block
3008 l_task_in(k + L_CURR_TASK_COUNT).PA_PARENT_TASK_ID := l_parent_task_id_tbl(k);
3009 END IF;
3010 l_task_in(k + L_CURR_TASK_COUNT).DISPLAY_SEQUENCE := l_tasks_disp_seq_tbl(k);
3011 END LOOP;
3012 END IF; -- l_task_id_tbl.count > 0
3013 -- PRAKKUM :: 08-JAN-2013 :: FPBug 16481709 for BaseBug 14828418 : In reference of bug 9047048 :: END
3014 END IF; -- l_is_wp_separate_from_fn = N
3015
3016 -- PRAKKUM :: 08-JAN-2013 :: FPBug 16481709 for BaseBug 14828418 : In reference of bug 9047048
3017 Sort_Task_Table(l_task_in);
3018
3019 ELSIF (l_new_structure_flag='Y') THEN
3020 --If the visit was created using project name, and either it has already been pushed to production
3021 --or cost has been estimated for it
3022 IF ((c_visit_rec.PROJECT_ID IS NOT NULL) AND
3023 (c_visit_rec.TOP_PROJECT_TASK_ID IS NOT NULL)) THEN
3024 -- TYPE 2: Visit was created using project name, Top Task already exists for visit
3025 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
3026 fnd_log.string(fnd_log.level_statement, L_DEBUG_KEY, 'TYPE 2');
3027 END IF;
3028 l_Project_rec.PA_PROJECT_ID := c_visit_rec.PROJECT_ID; -- Update the Parent Project
3029 -- Update the Top Task
3030 l_task_in(1).TASK_START_DATE := trunc(c_visit_rec.start_date_time);
3031 l_task_in(1).TASK_COMPLETION_DATE := trunc(c_visit_rec.close_date_time);
3032 l_task_in(1).PA_TASK_ID := c_visit_rec.TOP_PROJECT_TASK_ID;
3033
3034 l_task_in(1).PM_TASK_REFERENCE := l_project_num_prefix || to_char(c_visit_rec.visit_number);
3035 l_task_in(1).PM_PARENT_TASK_REFERENCE := null;
3036 OPEN get_task_disp_seq_csr(c_project_task_id => c_visit_rec.TOP_PROJECT_TASK_ID);
3037 FETCH get_task_disp_seq_csr INTO l_task_in(1).DISPLAY_SEQUENCE;
3038 CLOSE get_task_disp_seq_csr;
3039
3040 OPEN c_task_ct(p_visit_id);
3041 FETCH c_task_ct INTO l_count;
3042 CLOSE c_task_ct;
3043
3044 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
3045 fnd_log.string(fnd_log.level_statement, L_DEBUG_KEY, 'Number of tasks = ' || l_count);
3046 END IF;
3047
3048 IF l_count > 0 THEN
3049 OPEN get_prj_route_dtls_cur(p_visit_id);
3050 i := 2; -- Top Task index is 1
3051 LOOP
3052 FETCH get_prj_route_dtls_cur INTO get_prj_route_dtls_rec;
3053 EXIT WHEN get_prj_route_dtls_cur%NOTFOUND;
3054 IF c_visit_rec.start_date_time > get_prj_route_dtls_rec.task_start_date THEN
3055 get_prj_route_dtls_rec.task_start_date := c_visit_rec.start_date_time;
3056 END IF;
3057
3058 IF get_prj_route_dtls_rec.task_type_code <> 'SUMMARY' THEN
3059 -- Not a Summary task: First create a rollup task
3060 l_task_in(i).PM_TASK_REFERENCE := c_visit_rec.visit_number || '-' || get_prj_route_dtls_rec.visit_task_number || '-1';
3061 l_task_in(i).TASK_NAME := SUBSTRB(get_prj_route_dtls_rec.task_name,1,15) || '-1';
3062 l_task_in(i).LONG_TASK_NAME := get_prj_route_dtls_rec.task_name || '-1';
3063 l_task_in(i).PA_TASK_NUMBER := c_visit_rec.visit_number || '-' || get_prj_route_dtls_rec.visit_task_number || '-1';
3064 l_task_in(i).TASK_START_DATE := trunc(c_visit_rec.start_date_time); -- Pass visit date for Rollup tasks
3065 l_task_in(i).TASK_COMPLETION_DATE := null;
3066 -- For the rollup task, get the Project Task Id from the Task Number in case the project task is already created
3067 OPEN get_task_id_parent_ref_csr(c_project_id => c_visit_rec.PROJECT_ID, c_task_number => l_task_in(i).PA_TASK_NUMBER);
3068 FETCH get_task_id_parent_ref_csr INTO l_task_in(i).PA_TASK_ID, l_task_in(i).PM_PARENT_TASK_REFERENCE;
3069 CLOSE get_task_id_parent_ref_csr;
3070 IF l_task_in(i).PA_TASK_ID IS NOT NULL THEN
3071 OPEN get_task_disp_seq_csr(c_project_task_id => l_task_in(i).PA_TASK_ID);
3072 FETCH get_task_disp_seq_csr INTO l_task_in(i).DISPLAY_SEQUENCE;
3073 CLOSE get_task_disp_seq_csr;
3074 END IF;
3075
3076 -- Store the value of the cost parent id temporarily
3077 -- which will be reset or overwritten later with the task number corresponding to this cost parent
3078 IF l_task_in(i).PA_TASK_ID = PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM THEN --i.e. above cursor did not fetch anything
3079 IF (get_prj_route_dtls_rec.cost_parent_id IS NOT NULL) THEN
3080 l_task_in(i).PM_PARENT_TASK_REFERENCE := '-' || get_prj_route_dtls_rec.cost_parent_id;
3081 ELSE
3082 -- Add this under the top task
3083 l_task_in(i).PM_PARENT_TASK_REFERENCE := l_project_num_prefix || to_char(c_visit_rec.visit_number);
3084 END IF;
3085 END IF;
3086
3087 -- Then add the non-summary task under the rollup task
3088 i := i + 1;
3089 l_task_in(i).PM_TASK_REFERENCE := c_visit_rec.visit_number || '-' || get_prj_route_dtls_rec.visit_task_number;
3090 l_task_in(i).TASK_NAME := SUBSTRB(get_prj_route_dtls_rec.task_name,1,15);
3091 l_task_in(i).LONG_TASK_NAME := get_prj_route_dtls_rec.task_name;
3092 l_task_in(i).PA_TASK_NUMBER := c_visit_rec.visit_number || '-' || get_prj_route_dtls_rec.visit_task_number;
3093 l_task_in(i).TASK_DESCRIPTION := SUBSTRB(get_prj_route_dtls_rec.description,1,250);
3094 l_task_in(i).TASK_START_DATE := trunc(get_prj_route_dtls_rec.task_start_date);
3095 l_task_in(i).TASK_COMPLETION_DATE := null;
3096 l_task_in(i).SERVICE_TYPE_CODE := get_prj_route_dtls_rec.service_type_code;
3097 IF get_prj_route_dtls_rec.PROJECT_TASK_ID IS NOT NULL THEN
3098 l_task_in(i).PA_TASK_ID := get_prj_route_dtls_rec.PROJECT_TASK_ID;
3099 l_task_in(i).DISPLAY_SEQUENCE := get_prj_route_dtls_rec.DISPLAY_SEQUENCE;
3100 END IF;
3101 l_task_in(i).PM_PARENT_TASK_REFERENCE := c_visit_rec.visit_number || '-' || get_prj_route_dtls_rec.visit_task_number || '-1'; -- Parent is the rollup task added above
3102
3103 -- To make the rollup as the parent always and
3104 -- to keep route tasks to always be leaf tasks even if something is added underneath
3105 -- If the non-summary task has a child, it is actually the child of the rollup and not the child of the route
3106 l_id_ref_map_Tbl(get_prj_route_dtls_rec.visit_task_id) := c_visit_rec.visit_number || '-' || get_prj_route_dtls_rec.visit_task_number || '-1';
3107 ELSE
3108 -- Summary Task
3109 l_task_in(i).PM_TASK_REFERENCE := c_visit_rec.visit_number || '-' || get_prj_route_dtls_rec.visit_task_number;
3110 l_task_in(i).TASK_NAME := SUBSTRB(get_prj_route_dtls_rec.task_name,1,15);
3111 l_task_in(i).LONG_TASK_NAME := get_prj_route_dtls_rec.task_name;
3112 l_task_in(i).PA_TASK_NUMBER := c_visit_rec.visit_number || '-' || get_prj_route_dtls_rec.visit_task_number;
3113 l_task_in(i).TASK_DESCRIPTION := SUBSTRB(get_prj_route_dtls_rec.description,1,250);
3114 l_task_in(i).TASK_START_DATE := trunc(c_visit_rec.start_date_time); --Pass visit start date to avoid error from Projects
3115 l_task_in(i).TASK_COMPLETION_DATE := null;
3116 l_task_in(i).SERVICE_TYPE_CODE := get_prj_route_dtls_rec.service_type_code;
3117 IF get_prj_route_dtls_rec.PROJECT_TASK_ID IS NOT NULL THEN
3118 l_task_in(i).PA_TASK_ID := get_prj_route_dtls_rec.PROJECT_TASK_ID;
3119 l_task_in(i).DISPLAY_SEQUENCE := get_prj_route_dtls_rec.DISPLAY_SEQUENCE;
3120 END IF;
3121 -- Store the value of the cost parent id temporarily
3122 -- which will be reset or overwritten later with the task number corresponding to this cost parent
3123 IF (get_prj_route_dtls_rec.cost_parent_id IS NOT NULL) THEN
3124 l_task_in(i).PM_PARENT_TASK_REFERENCE := '-' || get_prj_route_dtls_rec.cost_parent_id;
3125 ELSE
3126 -- Add this under the top task
3127 l_task_in(i).PM_PARENT_TASK_REFERENCE := l_project_num_prefix || to_char(c_visit_rec.visit_number);
3128
3129 END IF;
3130 -- Store the ref in the associative array
3131 l_id_ref_map_Tbl(get_prj_route_dtls_rec.visit_task_id) := c_visit_rec.visit_number || '-' || get_prj_route_dtls_rec.visit_task_number;
3132
3133 --PRAKKUM :: 11/06/2012 :: Bug 14068468
3134 -- IF repair batch name exists, then visit is considered as component visit, visit task that referencing as repair batch summary task
3135 -- So create a child dummy task to hold transactions
3136 IF (l_log_statement >= l_log_current_level) THEN
3137 fnd_log.string(l_log_statement,L_DEBUG_KEY,'get_prj_route_dtls_rec.repair_batch_name--@>'||get_prj_route_dtls_rec.repair_batch_name);
3138 END IF;
3139 IF l_is_comp_visit = 'Y' AND get_prj_route_dtls_rec.repair_batch_name IS NOT NULL AND NVL(l_is_vst_hav_trx_on_rep_btch,'N') = 'N' THEN
3140 i := i + 1;
3141 l_task_in(i).PM_TASK_REFERENCE := c_visit_rec.visit_number || '-' || get_prj_route_dtls_rec.visit_task_number || '-' || G_TRANS_TSK_TRAIL_NAME;
3142 l_task_in(i).TASK_NAME := SUBSTRB(get_prj_route_dtls_rec.task_name,1,15)|| '-' || G_TRANS_TSK_TRAIL_NAME;
3143 l_task_in(i).LONG_TASK_NAME := get_prj_route_dtls_rec.task_name|| '-' || G_TRANS_TSK_TRAIL_NAME;
3144 l_task_in(i).PA_TASK_NUMBER := c_visit_rec.visit_number || '-' || get_prj_route_dtls_rec.visit_task_number|| '-' || G_TRANS_TSK_TRAIL_NAME;
3145 l_task_in(i).TASK_START_DATE := trunc(get_prj_route_dtls_rec.task_start_date);
3146 l_task_in(i).TASK_COMPLETION_DATE := null;
3147 l_task_in(i).SERVICE_TYPE_CODE := get_prj_route_dtls_rec.service_type_code;
3148 l_task_in(i).PM_PARENT_TASK_REFERENCE := c_visit_rec.visit_number || '-' || get_prj_route_dtls_rec.visit_task_number; -- Parent is the rollup task added above
3149
3150 -- For the rollup task, get the Project Task Id from the Task Number in case the project task is already created
3151 OPEN get_task_id_parent_ref_csr(c_project_id => c_visit_rec.PROJECT_ID, c_task_number => l_task_in(i).PA_TASK_NUMBER);
3152 FETCH get_task_id_parent_ref_csr INTO l_task_in(i).PA_TASK_ID, l_task_in(i).PM_PARENT_TASK_REFERENCE;
3153 CLOSE get_task_id_parent_ref_csr;
3154
3155 IF (l_task_in(i).PA_TASK_ID IS NOT NULL AND l_task_in(i).PA_TASK_ID <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM) THEN
3156 OPEN get_task_disp_seq_csr(c_project_task_id => l_task_in(i).PA_TASK_ID);
3157 FETCH get_task_disp_seq_csr INTO l_task_in(i).DISPLAY_SEQUENCE;
3158 CLOSE get_task_disp_seq_csr;
3159 END IF;
3160
3161 IF (l_log_statement >= l_log_current_level) THEN
3162 fnd_log.string(l_log_statement,L_DEBUG_KEY,'repair batch child task id--@>'||l_task_in(i).PA_TASK_ID);
3163 fnd_log.string(l_log_statement,L_DEBUG_KEY,'repair batch child task name--@>'||l_task_in(i).PM_PARENT_TASK_REFERENCE);
3164 fnd_log.string(l_log_statement,L_DEBUG_KEY,'repair batch child DISPLAY_SEQUENCE--@>'||l_task_in(i).DISPLAY_SEQUENCE);
3165 END IF;
3166 END IF;
3167
3168 END IF;
3169
3170 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
3171 fnd_log.string(fnd_log.level_statement, L_DEBUG_KEY, 'Visit Task index: ' || i || ', Name = ' || l_task_in(i).TASK_NAME);
3172 END IF;
3173 i := i + 1;
3174 END LOOP; -- All tasks
3175 CLOSE get_prj_route_dtls_cur;
3176
3177 -- Setup the parent task for summary and rollup tasks
3178 IF l_task_in.COUNT > 0 THEN
3179 i := l_task_in.FIRST;
3180 LOOP
3181 IF (l_task_in(i).pm_parent_task_reference IS NOT NULL AND (SUBSTR(l_task_in(i).pm_parent_task_reference, 1, 1) = '-')) THEN
3182 -- Has a parent whose index is not known: Lookup the index in the associative array
3183 l_task_in(i).pm_parent_task_reference := l_id_ref_map_Tbl(TO_NUMBER(SUBSTR(l_task_in(i).pm_parent_task_reference, 2)));
3184 END IF;
3185 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
3186 fnd_log.string(fnd_log.level_statement, L_DEBUG_KEY, 'Index i = '|| i || ', PA_TASK_NUMBER = ' || l_task_in(i).PA_TASK_NUMBER ||
3187 ', PM_PARENT_TASK_REFERENCE = ' || l_task_in(i).pm_parent_task_reference);
3188 fnd_log.string(fnd_log.level_statement,L_DEBUG_KEY,'PM_TASK_REFERENCE: '|| l_task_in(i).PM_TASK_REFERENCE);
3189 fnd_log.string(fnd_log.level_statement,L_DEBUG_KEY,'TASK_NAME: '|| l_task_in(i).TASK_NAME);
3190 fnd_log.string(fnd_log.level_statement,L_DEBUG_KEY,'TASK_DESCRIPTION: '|| l_task_in(i).TASK_DESCRIPTION);
3191 fnd_log.string(fnd_log.level_statement,L_DEBUG_KEY,'TASK_START_DATE: '|| l_task_in(i).TASK_START_DATE);
3192 fnd_log.string(fnd_log.level_statement,L_DEBUG_KEY,'TASK_COMPLETION_DATE: '|| l_task_in(i).TASK_COMPLETION_DATE);
3193 fnd_log.string(fnd_log.level_statement,L_DEBUG_KEY,'PA_TASK_ID: '|| l_task_in(i).PA_TASK_ID);
3194 END IF;
3195 EXIT WHEN i = l_task_in.LAST ;
3196 i := l_task_in.NEXT(i);
3197 END LOOP; -- All Tasks
3198 END IF; -- l_task_in.COUNT > 0
3199 END IF; -- l_count > 0
3200
3201 -- Check if using Shared Workplan Structure: If so need to pass all tasks of all OTHER visits
3202 -- also through l_task_in.
3203 -- Note that this is a shared project and l_task_in contains tasks for current visit only so far.
3204 IF (l_is_wp_separate_from_fn = 'N') THEN
3205 -- Workplan is enabled, Using Shared Structure
3206 -- In order to avoid the error with updating projects with Work Plan Structure enabled,
3207 -- just pass the task reference and the parent task reference for all existing tasks
3208 -- of all other visits even if there is no change
3209 OPEN get_other_vst_prj_tsks_csr(c_project_id => c_visit_rec.PROJECT_ID,
3210 c_top_task_id => c_visit_rec.TOP_PROJECT_TASK_ID);
3211 -- PRAKKUM :: 08-JAN-2013 :: FPBug 16481709 for BaseBug 14828418 : In reference of bug 9047048 :: START
3212 FETCH get_other_vst_prj_tsks_csr BULK COLLECT INTO l_task_ref_tbl, l_parent_task_ref_tbl, l_task_id_tbl, l_parent_task_id_tbl, l_tasks_disp_seq_tbl;
3213 CLOSE get_other_vst_prj_tsks_csr;
3214 IF l_task_id_tbl.count > 0 THEN
3215 --L_CURR_TASK_COUNT := l_task_in.COUNT;
3216 FOR k IN l_task_id_tbl.FIRST..l_task_id_tbl.LAST LOOP
3217 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3218 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY,
3219 'k = ' || k ||
3220 ', PM_TASK_REFERENCE = ' || l_task_ref_tbl(k) ||
3221 ', PM_PARENT_TASK_REFERENCE = ' || l_parent_task_ref_tbl(k)||
3222 ', PA_TASK_ID = ' || l_task_id_tbl(k) ||
3223 ', PARENT_PA_TASK_ID = ' || l_parent_task_id_tbl(k) ||
3224 ', DISPLAY_SEQUENCE = ' || l_tasks_disp_seq_tbl(k));
3225 END IF;
3226 l_op_task_in(k).PA_TASK_ID := l_task_id_tbl(k);
3227 IF l_task_ref_tbl(k) IS NOT NULL THEN --Project tasks created from Projects UI, wont have task_reference
3228 l_op_task_in(k).PM_TASK_REFERENCE := l_task_ref_tbl(k);
3229 l_op_task_in(k).PM_PARENT_TASK_REFERENCE := l_parent_task_ref_tbl(k);
3230 ELSE -- Only project tasks created from Projects UI will come to this block
3231 l_op_task_in(k).PA_PARENT_TASK_ID := l_parent_task_id_tbl(k);
3232 END IF;
3233 l_op_task_in(k).DISPLAY_SEQUENCE := l_tasks_disp_seq_tbl(k);
3234 END LOOP;
3235 END IF; -- l_task_id_tbl.count > 0
3236 -- PRAKKUM :: 08-JAN-2013 :: FPBug 16481709 for BaseBug 14828418 : In reference of bug 9047048 :: END
3237 END IF; -- l_is_wp_separate_from_fn = N
3238
3239 -- Added by jaramana on 06-OCT-2009 for the WBS ER 8674208
3240 Sort_Task_Table(l_op_task_in);
3241
3242 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
3243 fnd_log.string(fnd_log.level_statement, L_DEBUG_KEY, 'l_task_in.COUNT --@>'||l_task_in.COUNT);
3244 fnd_log.string(fnd_log.level_statement, L_DEBUG_KEY, 'l_op_task_in.COUNT --@>'||l_op_task_in.COUNT);
3245 END IF;
3246
3247 -- PRAKKUM :: FPBug 16481709 for BaseBug 14828418 :: 31/01/2013
3248 -- Added code to pass all project tasks belonging to visit together
3249 -- So visit which updated latest will be last in display sequence
3250 IF (l_is_wp_separate_from_fn = 'N') THEN
3251 IF l_task_in.COUNT>0 THEN
3252 --Merge Tables
3253 L_CURR_TASK_COUNT := l_op_task_in.COUNT;
3254 FOR k IN l_task_in.FIRST..l_task_in.LAST LOOP
3255 l_op_task_in(k+L_CURR_TASK_COUNT) := l_task_in(k);
3256 END LOOP;
3257 l_task_in := l_op_task_in;
3258 END IF;
3259 END IF; -- l_is_wp_separate_from_fn
3260
3261 --Else if the visit was created using project template and obviously since it is in update project
3262 --API, so either the cost has already been estimated or the visit has been pushed to production
3263 ELSIF(c_visit_rec.PROJECT_ID IS NOT NULL AND
3264 c_visit_rec.TOP_PROJECT_TASK_ID IS NULL AND
3265 c_visit_rec.PROJECT_TEMPLATE_ID IS NOT NULL) THEN
3266 -- TYPE 3: Visit with Project created using a template
3267 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
3268 fnd_log.string(fnd_log.level_statement, L_DEBUG_KEY, 'TYPE 3');
3269 END IF;
3270 -- Update the Project
3271 l_Project_rec.DESCRIPTION := SUBSTRB(c_visit_rec.description,1,250);
3272 l_Project_rec.START_DATE := trunc(c_visit_rec.start_date_time);
3273 l_Project_rec.COMPLETION_DATE := null;
3274 l_Project_rec.SCHEDULED_START_DATE := trunc(c_visit_rec.start_date_time);
3275 l_Project_rec.PA_PROJECT_ID := c_visit_rec.PROJECT_ID;
3276 IF c_visit_rec.status_code = 'CLOSED' OR c_visit_rec.status_code = 'CANCELLED' THEN
3277 l_Project_rec.PROJECT_STATUS_CODE := 'CLOSED';
3278 ELSIF p_module_type = 'UPT' OR p_module_type = 'DEL' THEN
3279 l_Project_rec.PROJECT_STATUS_CODE := 'REJECTED';
3280 ELSE
3281 l_Project_rec.PROJECT_STATUS_CODE := l_prj_status_code_fdb;
3282 END IF;
3283
3284 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
3285 fnd_log.string(fnd_log.level_statement,L_DEBUG_KEY,'After assigning all values to project record type');
3286 END IF;
3287
3288
3289 OPEN c_task_ct(p_visit_id);
3290 FETCH c_task_ct INTO l_count;
3291 CLOSE c_task_ct;
3292
3293 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
3294 fnd_log.string(fnd_log.level_statement, L_DEBUG_KEY, 'Number of tasks = ' || l_count);
3295 END IF;
3296
3297 IF l_count > 0 THEN
3298 OPEN get_prj_route_dtls_cur(p_visit_id);
3299 i := 1; -- No Top Task
3300 LOOP
3301 FETCH get_prj_route_dtls_cur INTO get_prj_route_dtls_rec;
3302 EXIT WHEN get_prj_route_dtls_cur%NOTFOUND;
3303 IF c_visit_rec.start_date_time > get_prj_route_dtls_rec.task_start_date THEN
3304 get_prj_route_dtls_rec.task_start_date := c_visit_rec.start_date_time;
3305 END IF;
3306
3307 IF get_prj_route_dtls_rec.task_type_code <> 'SUMMARY' THEN
3308 -- Not a Summary task: First create a rollup task
3309 l_task_in(i).PM_TASK_REFERENCE := get_prj_route_dtls_rec.visit_task_number || '-1';
3310 l_task_in(i).TASK_NAME := SUBSTRB(get_prj_route_dtls_rec.task_name,1,15) || '-1';
3311 l_task_in(i).LONG_TASK_NAME := get_prj_route_dtls_rec.task_name || '-1';
3312 l_task_in(i).PA_TASK_NUMBER := get_prj_route_dtls_rec.visit_task_number || '-1';
3313 l_task_in(i).TASK_START_DATE := trunc(c_visit_rec.start_date_time); -- Pass visit date for Rollup tasks
3314 l_task_in(i).TASK_COMPLETION_DATE := null;--trunc(c_visit_rec.close_date_time); -- Pass visit date for Rollup tasks
3315 -- For the rollup task, get the Project Task Id from the Task Number in case the project task is already created
3316 OPEN get_task_id_parent_ref_csr(c_project_id => c_visit_rec.PROJECT_ID, c_task_number => l_task_in(i).PA_TASK_NUMBER);
3317 FETCH get_task_id_parent_ref_csr INTO l_task_in(i).PA_TASK_ID, l_task_in(i).PM_PARENT_TASK_REFERENCE;
3318 CLOSE get_task_id_parent_ref_csr;
3319
3320 IF (l_task_in(i).PA_TASK_ID IS NOT NULL AND l_task_in(i).PA_TASK_ID <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM) THEN
3321 OPEN get_task_disp_seq_csr(c_project_task_id => l_task_in(i).PA_TASK_ID);
3322 FETCH get_task_disp_seq_csr INTO l_task_in(i).DISPLAY_SEQUENCE;
3323 CLOSE get_task_disp_seq_csr;
3324 END IF;
3325
3326 -- Store the value of the cost parent id temporarily
3327 -- which will be reset or overwritten later with the task number corresponding to this cost parent
3328 IF l_task_in(i).PA_TASK_ID = PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM THEN --i.e. above cursor did not fetch anything
3329 IF (get_prj_route_dtls_rec.cost_parent_id IS NOT NULL) THEN
3330 l_task_in(i).PM_PARENT_TASK_REFERENCE := '-' || get_prj_route_dtls_rec.cost_parent_id;
3331 ELSE
3332 l_task_in(i).PM_PARENT_TASK_REFERENCE := null;
3333 END IF;
3334 END IF;
3335 -- Then add the non-summary task under the rollup task
3336 i := i + 1;
3337 l_task_in(i).PM_TASK_REFERENCE := get_prj_route_dtls_rec.visit_task_number;
3338 l_task_in(i).TASK_NAME := SUBSTRB(get_prj_route_dtls_rec.task_name,1,15);
3339 l_task_in(i).LONG_TASK_NAME := get_prj_route_dtls_rec.task_name;
3340 l_task_in(i).PA_TASK_NUMBER := get_prj_route_dtls_rec.visit_task_number;
3341 l_task_in(i).TASK_DESCRIPTION := SUBSTRB(get_prj_route_dtls_rec.description,1,250);
3342 l_task_in(i).TASK_START_DATE := trunc(get_prj_route_dtls_rec.task_start_date);
3343 l_task_in(i).TASK_COMPLETION_DATE := null;
3344 l_task_in(i).SERVICE_TYPE_CODE := get_prj_route_dtls_rec.service_type_code;
3345 IF get_prj_route_dtls_rec.PROJECT_TASK_ID IS NOT NULL THEN
3346 l_task_in(i).PA_TASK_ID := get_prj_route_dtls_rec.PROJECT_TASK_ID;
3347 l_task_in(i).DISPLAY_SEQUENCE := get_prj_route_dtls_rec.DISPLAY_SEQUENCE;
3348 END IF;
3349 l_task_in(i).PM_PARENT_TASK_REFERENCE := get_prj_route_dtls_rec.visit_task_number || '-1'; -- Parent is the rollup task added above
3350 -- To make the rollup as the parent always and
3351 -- to keep route tasks to always be leaf tasks even if something is added underneath
3352 -- If the non-summary task has a child, it is actually the child of the rollup and not the child of the route
3353 l_id_ref_map_Tbl(get_prj_route_dtls_rec.visit_task_id) := get_prj_route_dtls_rec.visit_task_number || '-1';
3354 ELSE
3355 -- Summary Task
3356 l_task_in(i).PM_TASK_REFERENCE := get_prj_route_dtls_rec.visit_task_number;
3357 l_task_in(i).TASK_NAME := SUBSTRB(get_prj_route_dtls_rec.task_name,1,15);
3358 l_task_in(i).LONG_TASK_NAME := get_prj_route_dtls_rec.task_name;
3359 l_task_in(i).PA_TASK_NUMBER := get_prj_route_dtls_rec.visit_task_number;
3360 l_task_in(i).TASK_DESCRIPTION := SUBSTRB(get_prj_route_dtls_rec.description,1,250);
3361 l_task_in(i).TASK_START_DATE := trunc(c_visit_rec.start_date_time);--Pass visit start date to avoid error from Projects
3362 l_task_in(i).TASK_COMPLETION_DATE := null;
3363 l_task_in(i).SERVICE_TYPE_CODE := get_prj_route_dtls_rec.service_type_code;
3364 IF get_prj_route_dtls_rec.PROJECT_TASK_ID IS NOT NULL THEN
3365 l_task_in(i).PA_TASK_ID := get_prj_route_dtls_rec.PROJECT_TASK_ID;
3366 l_task_in(i).DISPLAY_SEQUENCE := get_prj_route_dtls_rec.DISPLAY_SEQUENCE;
3367 END IF;
3368 -- Store the value of the cost parent id temporarily
3369 -- which will be reset or overwritten later with the task number corresponding to this cost parent
3370 IF (get_prj_route_dtls_rec.cost_parent_id IS NOT NULL) THEN
3371 l_task_in(i).PM_PARENT_TASK_REFERENCE := '-' || get_prj_route_dtls_rec.cost_parent_id;
3372 ELSE
3373 l_task_in(i).PM_PARENT_TASK_REFERENCE := null;
3374 END IF;
3375 -- Store the ref in the associative array
3376 l_id_ref_map_Tbl(get_prj_route_dtls_rec.visit_task_id) := get_prj_route_dtls_rec.visit_task_number;
3377
3378 --PRAKKUM :: 11/06/2012 :: Bug 14068468
3379 -- IF repair batch name exists, then visit is considered as component visit, visit task that referencing as repair batch summary task
3380 -- So create a child dummy task to hold transactions
3381 IF (l_log_statement >= l_log_current_level) THEN
3382 fnd_log.string(l_log_statement,L_DEBUG_KEY,'get_prj_route_dtls_rec.repair_batch_name--@>'||get_prj_route_dtls_rec.repair_batch_name);
3383 END IF;
3384 IF l_is_comp_visit = 'Y' AND get_prj_route_dtls_rec.repair_batch_name IS NOT NULL AND NVL(l_is_vst_hav_trx_on_rep_btch,'N') = 'N' THEN
3385 i := i + 1;
3386 l_task_in(i).PM_TASK_REFERENCE := get_prj_route_dtls_rec.visit_task_number || '-' || G_TRANS_TSK_TRAIL_NAME;
3387 l_task_in(i).TASK_NAME := SUBSTRB(get_prj_route_dtls_rec.task_name,1,15)|| '-' || G_TRANS_TSK_TRAIL_NAME;
3388 l_task_in(i).LONG_TASK_NAME := get_prj_route_dtls_rec.task_name|| '-' || G_TRANS_TSK_TRAIL_NAME;
3389 l_task_in(i).PA_TASK_NUMBER := get_prj_route_dtls_rec.visit_task_number|| '-' || G_TRANS_TSK_TRAIL_NAME;
3390 l_task_in(i).TASK_START_DATE := trunc(get_prj_route_dtls_rec.task_start_date);
3391 l_task_in(i).TASK_COMPLETION_DATE := null;
3392 l_task_in(i).SERVICE_TYPE_CODE := get_prj_route_dtls_rec.service_type_code;
3393 l_task_in(i).PM_PARENT_TASK_REFERENCE := get_prj_route_dtls_rec.visit_task_number; -- Parent is the rollup task added above
3394
3395 -- For the rollup task, get the Project Task Id from the Task Number in case the project task is already created
3396 OPEN get_task_id_parent_ref_csr(c_project_id => c_visit_rec.PROJECT_ID, c_task_number => l_task_in(i).PA_TASK_NUMBER);
3397 FETCH get_task_id_parent_ref_csr INTO l_task_in(i).PA_TASK_ID, l_task_in(i).PM_PARENT_TASK_REFERENCE;
3398 CLOSE get_task_id_parent_ref_csr;
3399
3400 IF (l_task_in(i).PA_TASK_ID IS NOT NULL AND l_task_in(i).PA_TASK_ID <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM) THEN
3401 OPEN get_task_disp_seq_csr(c_project_task_id => l_task_in(i).PA_TASK_ID);
3402 FETCH get_task_disp_seq_csr INTO l_task_in(i).DISPLAY_SEQUENCE;
3403 CLOSE get_task_disp_seq_csr;
3404 END IF;
3405
3406 IF (l_log_statement >= l_log_current_level) THEN
3407 fnd_log.string(l_log_statement,L_DEBUG_KEY,'repair batch child task id--@>'||l_task_in(i).PA_TASK_ID);
3408 fnd_log.string(l_log_statement,L_DEBUG_KEY,'repair batch child task name--@>'||l_task_in(i).PM_PARENT_TASK_REFERENCE);
3409 fnd_log.string(l_log_statement,L_DEBUG_KEY,'repair batch child DISPLAY_SEQUENCE--@>'||l_task_in(i).DISPLAY_SEQUENCE);
3410 END IF;
3411
3412 END IF;
3413
3414 END IF;
3415
3416 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
3417 fnd_log.string(fnd_log.level_statement, L_DEBUG_KEY, 'Visit Task index: ' || i || ', Name = ' || l_task_in(i).TASK_NAME);
3418 END IF;
3419 i := i + 1;
3420 END LOOP; -- All tasks
3421 CLOSE get_prj_route_dtls_cur;
3422
3423 -- Setup the parent task for summary and rollup tasks
3424 IF l_task_in.COUNT > 0 THEN
3425 i := l_task_in.FIRST;
3426 LOOP
3427 IF (l_task_in(i).pm_parent_task_reference IS NOT NULL AND (SUBSTR(l_task_in(i).pm_parent_task_reference, 1, 1) = '-')) THEN
3428 -- Has a parent whose index is not known: Lookup the index in the associative array
3429 l_task_in(i).pm_parent_task_reference := l_id_ref_map_Tbl(TO_NUMBER(SUBSTR(l_task_in(i).pm_parent_task_reference, 2)));
3430 END IF;
3431 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
3432 fnd_log.string(fnd_log.level_statement, L_DEBUG_KEY, 'Index i = '|| i || ', PA_TASK_NUMBER = ' || l_task_in(i).PA_TASK_NUMBER ||
3433 ', PM_PARENT_TASK_REFERENCE = ' || l_task_in(i).pm_parent_task_reference);
3434 fnd_log.string(fnd_log.level_statement,L_DEBUG_KEY,'PM_TASK_REFERENCE: '|| l_task_in(i).PM_TASK_REFERENCE);
3435 fnd_log.string(fnd_log.level_statement,L_DEBUG_KEY,'TASK_NAME: '|| l_task_in(i).TASK_NAME);
3436 fnd_log.string(fnd_log.level_statement,L_DEBUG_KEY,'TASK_DESCRIPTION: '|| l_task_in(i).TASK_DESCRIPTION);
3437 fnd_log.string(fnd_log.level_statement,L_DEBUG_KEY,'TASK_START_DATE: '|| l_task_in(i).TASK_START_DATE);
3438 fnd_log.string(fnd_log.level_statement,L_DEBUG_KEY,'TASK_COMPLETION_DATE: '|| l_task_in(i).TASK_COMPLETION_DATE);
3439 fnd_log.string(fnd_log.level_statement,L_DEBUG_KEY,'PA_TASK_ID: '|| l_task_in(i).PA_TASK_ID);
3440 END IF;
3441 EXIT WHEN i = l_task_in.LAST ;
3442 i := l_task_in.NEXT(i);
3443 END LOOP; -- All Tasks
3444 END IF; -- l_task_in.COUNT > 0
3445 END IF; -- l_count > 0
3446
3447 -- PRAKKUM :: 04-JAN-2013 :: FPBug 16481709 for BaseBug 14828418 : In reference of bug 9047048 :: START
3448 -- Check if using Shared Workplan Structure: If so need to pass all tasks of all OTHER visits
3449 -- also through l_task_in.
3450 -- Note that this is a shared project and l_task_in contains tasks for current visit only so far.
3451 IF (l_is_wp_separate_from_fn = 'N') THEN
3452 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3453 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY,' PROCESSING TO PASS ENTIRE HIERARCHY ');
3454 END IF;
3455 -- Workplan is enabled, Using Shared Structure
3456 -- In order to avoid the error with updating projects with Work Plan Structure enabled,
3457 -- just pass the task reference and the parent task reference for all existing tasks
3458 -- of all other visits even if there is no change
3459 OPEN get_prj_tsks_not_mapd_to_vst(c_project_id => c_visit_rec.PROJECT_ID,
3460 c_visit_id => c_visit_rec.VISIT_ID);-- PRAKKUM :: 17-JAN-2013 :: FPBug 16481709 for BaseBug 14828418
3461 FETCH get_prj_tsks_not_mapd_to_vst BULK COLLECT INTO l_task_id_tbl, l_parent_task_id_tbl, l_tasks_disp_seq_tbl;
3462 CLOSE get_prj_tsks_not_mapd_to_vst;
3463 IF l_task_id_tbl.count > 0 THEN
3464 L_CURR_TASK_COUNT := l_task_in.COUNT;
3465 FOR k IN l_task_id_tbl.FIRST..l_task_id_tbl.LAST LOOP
3466 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3467 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY,
3468 'k = ' || k ||
3469 ', PA_TASK_ID = ' || l_task_id_tbl(k) ||
3470 ', PARENT_PA_TASK_ID = ' || l_parent_task_id_tbl(k) ||
3471 ', DISPLAY_SEQUENCE = ' || l_tasks_disp_seq_tbl(k));
3472 END IF;
3473 l_task_in(k + L_CURR_TASK_COUNT).PA_TASK_ID := l_task_id_tbl(k);
3474 l_task_in(k + L_CURR_TASK_COUNT).PA_PARENT_TASK_ID := l_parent_task_id_tbl(k);
3475 l_task_in(k + L_CURR_TASK_COUNT).DISPLAY_SEQUENCE := l_tasks_disp_seq_tbl(k);
3476 END LOOP;
3477 END IF; -- l_task_ref_tbl.count > 0
3478 END IF; -- l_is_wp_separate_from_fn = N
3479 -- PRAKKUM :: 04-JAN-2013 :: FPBug 16481709 for BaseBug 14828418 : In reference of bug 9047048 :: END
3480
3481 Sort_Task_Table(l_task_in);
3482
3483 END IF;
3484 ELSE --l_new_structure_flag='Y'
3485 -- TYPE 4: Use the old hierarchy
3486 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
3487 fnd_log.string(fnd_log.level_statement, L_DEBUG_KEY, 'TYPE 4');
3488 END IF;
3489 --Follow the old hierarchy
3490
3491 -- TO UPDATE PROJECT IN PROJECTS
3492 l_Project_rec.PM_PROJECT_REFERENCE := l_project_num_prefix || to_char(c_visit_rec.visit_number);
3493 l_Project_rec.PROJECT_NAME := l_project_num_prefix || to_char(c_visit_rec.visit_number);
3494 l_Project_rec.DESCRIPTION := SUBSTRB(c_visit_rec.description,1,250);
3495 l_Project_rec.START_DATE := trunc(c_visit_rec.start_date_time);
3496 l_Project_rec.COMPLETION_DATE := null;--c_visit_rec.close_date_time;
3497 l_Project_rec.SCHEDULED_START_DATE := c_visit_rec.start_date_time;
3498 l_Project_rec.PA_PROJECT_ID := c_visit_rec.PROJECT_ID;
3499 IF c_visit_rec.status_code = 'CLOSED' OR c_visit_rec.status_code = 'CANCELLED' THEN
3500 l_Project_rec.PROJECT_STATUS_CODE := 'CLOSED';
3501 ELSIF p_module_type = 'UPT' OR p_module_type = 'DEL' THEN
3502 l_Project_rec.PROJECT_STATUS_CODE := 'REJECTED';
3503 ELSE
3504 l_Project_rec.PROJECT_STATUS_CODE := l_prj_status_code_fdb;
3505 END IF;
3506
3507 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
3508 fnd_log.string(fnd_log.level_statement,L_DEBUG_KEY,'After assigning all values to project record type' || 'Project date = ' || l_Project_rec.START_DATE);
3509 END IF;
3510
3511 OPEN c_task_ct(p_visit_id);
3512 FETCH c_task_ct INTO l_count;
3513 CLOSE c_task_ct;
3514
3515 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
3516 fnd_log.string(fnd_log.level_statement,L_DEBUG_KEY,'Number of tasks = ' || l_count);
3517 END IF;
3518 --PRAKKUM :: PIE :: 28-OCT-2010 :: Changed get_prj_route_dtls_cur to c_task
3519 IF l_count > 0 THEN
3520 OPEN c_task(p_visit_id);
3521 i := 1;
3522 LOOP
3523 FETCH c_task INTO c_task_rec;
3524 EXIT WHEN c_task%NOTFOUND;
3525 IF c_task%NOTFOUND THEN
3526 CLOSE c_task;
3527 ELSE
3528 IF c_visit_rec.start_date_time >= NVL(c_task_rec.start_date_time, c_visit_rec.start_date_time) THEN
3529 c_task_rec.start_date_time := c_visit_rec.start_date_time;
3530 END IF;
3531
3532 l_task_in(i).PM_TASK_REFERENCE := c_task_rec.visit_task_number;
3533 l_task_in(i).TASK_NAME := SUBSTRB(c_task_rec.visit_task_name,1,15);
3534 l_task_in(i).PA_TASK_NUMBER := c_task_rec.visit_task_number;
3535 l_task_in(i).TASK_DESCRIPTION := SUBSTRB(c_task_rec.description,1,250);
3536 l_task_in(i).TASK_START_DATE := trunc(c_visit_rec.start_date_time); --l_task_START_TIME;
3537 l_task_in(i).TASK_COMPLETION_DATE := Null; --l_task_END_TIME;
3538 IF c_task_rec.PROJECT_TASK_ID IS NOT NULL THEN
3539 l_task_in(i).PA_TASK_ID := c_task_rec.PROJECT_TASK_ID;
3540 ELSE
3541 l_task_in(i).PA_TASK_ID := Null;
3542 END IF;
3543 -- PRAKKUM :: 04-JAN-2013 :: FPBug 16481709 for BaseBug 14828418 : In reference of bug 9047048
3544 l_task_in(i).DISPLAY_SEQUENCE := c_task_rec.DISPLAY_SEQUENCE;
3545 -- No need to pass PM_PARENT_TASK_REFERENCE for old visits - will always be null
3546 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
3547 fnd_log.string(fnd_log.level_statement,L_DEBUG_KEY,'Visit Tasks = ' || i || 'Name = ' || l_task_in(i).TASK_NAME);
3548 END IF;
3549 i := i + 1;
3550 END IF;
3551 END LOOP;
3552 CLOSE c_task;
3553 END IF;
3554
3555 -- PRAKKUM :: 04-JAN-2013 :: FPBug 16481709 for BaseBug 14828418 : In reference of bug 9047048 :: START
3556 -- Check if using Shared Workplan Structure: If so need to pass all tasks of all OTHER visits
3557 -- also through l_task_in.
3558 -- Note that this is a shared project and l_task_in contains tasks for current visit only so far.
3559 IF (l_is_wp_separate_from_fn = 'N') THEN
3560 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3561 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY,' PROCESSING TO PASS ENTIRE HIERARCHY ');
3562 END IF;
3563 -- Workplan is enabled, Using Shared Structure
3564 -- In order to avoid the error with updating projects with Work Plan Structure enabled,
3565 -- just pass the task reference and the parent task reference for all existing tasks
3566 -- of all other visits even if there is no change
3567 OPEN get_prj_tsks_not_mapd_to_vst(c_project_id => c_visit_rec.PROJECT_ID,
3568 c_visit_id => c_visit_rec.VISIT_ID);-- PRAKKUM :: 17-JAN-2013 :: FPBug 16481709 for BaseBug 14828418);
3569 FETCH get_prj_tsks_not_mapd_to_vst BULK COLLECT INTO l_task_id_tbl, l_parent_task_id_tbl, l_tasks_disp_seq_tbl;
3570 CLOSE get_prj_tsks_not_mapd_to_vst;
3571 IF l_task_id_tbl.count > 0 THEN
3572 L_CURR_TASK_COUNT := l_task_in.COUNT;
3573 FOR k IN l_task_id_tbl.FIRST..l_task_id_tbl.LAST LOOP
3574 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3575 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY,
3576 'k = ' || k ||
3577 ', PA_TASK_ID = ' || l_task_id_tbl(k) ||
3578 ', PARENT_PA_TASK_ID = ' || l_parent_task_id_tbl(k) ||
3579 ', DISPLAY_SEQUENCE = ' || l_tasks_disp_seq_tbl(k));
3580 END IF;
3581 l_task_in(k + L_CURR_TASK_COUNT).PA_TASK_ID := l_task_id_tbl(k);
3582 l_task_in(k + L_CURR_TASK_COUNT).PA_PARENT_TASK_ID := l_parent_task_id_tbl(k);
3583 l_task_in(k + L_CURR_TASK_COUNT).DISPLAY_SEQUENCE := l_tasks_disp_seq_tbl(k);
3584 END LOOP;
3585 END IF; -- l_task_ref_tbl.count > 0
3586 END IF; -- l_is_wp_separate_from_fn = N
3587
3588 Sort_Task_Table(l_task_in);
3589 -- PRAKKUM :: 04-JAN-2013 :: FPBug 16481709 for BaseBug 14828418 : In reference of bug 9047048 :: END
3590
3591 END IF; -- New Parent Project Flow or Old Flow
3592 -- PRAKKUM :: PIE Changes :: 15-OCT-2010 :: END
3593 -- Need to update proejct for
3594 IF c_visit_rec.PROJECT_ID IS NOT NULL THEN
3595 IF (l_log_statement >= l_log_current_level) THEN
3596 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Visit Project ID = ' || c_visit_rec.PROJECT_ID);
3597 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Before calling PA_PROJECT_PUB.UPDATE_PROJECT');
3598 END IF;
3599
3600 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
3601 fnd_log.string(fnd_log.level_statement, L_DEBUG_KEY, 'l_task_in.COUNT --@>'||l_task_in.COUNT);
3602 IF l_task_in.COUNT > 0 THEN
3603 fnd_log.string(fnd_log.level_statement, L_DEBUG_KEY, 'List of Project Tasks getting passed ');
3604 FOR i in l_task_in.FIRST .. l_task_in.LAST LOOP
3605 fnd_log.string(fnd_log.level_statement, L_DEBUG_KEY, ' PA_TASK_ID --@>'||l_task_in(i).PA_TASK_ID ||
3606 ' PA_PARENT_TASK_ID --@>'||l_task_in(i).PA_PARENT_TASK_ID ||
3607 ' PM_TASK_REFERENCE --@>'||l_task_in(i).PM_TASK_REFERENCE ||
3608 ' PM_PARENT_TASK_REFERENCE --@>'||l_task_in(i).PM_PARENT_TASK_REFERENCE ||
3609 ' TASK_NAME --@>'||l_task_in(i).TASK_NAME ||
3610 ' LONG_TASK_NAME --@>'||l_task_in(i).LONG_TASK_NAME ||
3611 ' PA_TASK_NUMBER --@>'||l_task_in(i).PA_TASK_NUMBER ||
3612 ' TASK_START_DATE --@>'||l_task_in(i).TASK_START_DATE ||
3613 ' TASK_COMPLETION_DATE --@>'||l_task_in(i).TASK_COMPLETION_DATE ||
3614 ' SERVICE_TYPE_CODE --@>'||l_task_in(i).SERVICE_TYPE_CODE ||
3615 ' DISPLAY_SEQUENCE --@>'||l_task_in(i).DISPLAY_SEQUENCE);
3616 END LOOP; -- i loop
3617 fnd_log.string(fnd_log.level_statement, L_DEBUG_KEY, 'End of Project Tasks');
3618 END IF;
3619 END IF;
3620
3621 PA_PROJECT_PUB.UPDATE_PROJECT
3622 (p_api_version_number => 1,
3623 p_commit => l_commit,
3624 p_init_msg_list => l_init_msg_list,
3625 p_msg_count => l_msg_count,
3626 p_msg_data => l_msg_data,
3627 p_return_status => l_return_status,
3628 p_workflow_started => l_workflow_started,
3629 p_pm_product_code => G_PM_PRODUCT_CODE,
3630 p_project_in => l_project_rec,
3631 p_project_out => l_project_out,
3632 p_key_members => l_key_members,
3633 p_class_categories => l_class_categories,
3634 p_tasks_in => l_task_in,
3635 p_tasks_out => l_task_out,
3636 p_pass_entire_structure => l_pass_entire_structure
3637 ); -- PRAKKUM :: FP:PIE :: 13-OCT-2010 ::
3638
3639 IF (l_log_statement >= l_log_current_level) THEN
3640 fnd_log.string(l_log_statement,L_DEBUG_KEY,'After calling PA_PROJECT_PUB.UPDATE_PROJECT - l_return_status = '||l_return_status);
3641 END IF;
3642
3643 IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
3644 IF (l_log_statement >= l_log_current_level) THEN
3645 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Errors from PA_PROJECT_PUB.UPDATE_PROJECT - l_msg_count = '||l_msg_count);
3646 END IF;
3647 RAISE Fnd_Api.g_exc_error;
3648 END IF;
3649
3650 -- PRAKKUM :: FP:PIE :: 13-OCT-2010 ::
3651 /*IF (l_top_task_id = -1) THEN
3652 l_top_task_id := l_task_out(1).pa_task_id;
3653 END IF;*/
3654
3655 -- If the Visit Organisation is chnaged after costing
3656 -- need to set pjm paramters for the new org if it doesnot exist.
3657 OPEN c_pjm_param(c_visit_rec.project_id, c_visit_rec.organization_id);
3658 FETCH c_pjm_param INTO l_dummy;
3659 IF c_pjm_param%NOTFOUND THEN -- need to create for new org
3660
3661 OPEN c_cost_group(c_visit_rec.organization_id);
3662 FETCH c_cost_group INTO l_param_data.cost_group_id;
3663 CLOSE c_cost_group;
3664
3665 l_param_data.project_id := c_visit_rec.project_id;
3666 l_param_data.organization_id := c_visit_rec.organization_id;
3667 -- l_param_data.cost_group_id := NVL(l_param_data.cost_group_id,1);
3668 l_param_data.wip_acct_class_code := NULL;
3669 l_param_data.eam_acct_class_code := NULL;
3670 l_param_data.ipv_expenditure_type := NULL;
3671 l_param_data.erv_expenditure_type := NULL;
3672 l_param_data.freight_expenditure_type := NULL;
3673 l_param_data.tax_expenditure_type := NULL;
3674 l_param_data.misc_expenditure_type := NULL;
3675 l_param_data.ppv_expenditure_type := NULL;
3676 l_param_data.dir_item_expenditure_type := 'Machine Usage';
3677 -- yazhou 06Oct2005 starts
3678 -- Bug fix #4658861
3679 -- l_param_data.start_date_active := c_visit_rec.start_date_time;
3680 -- l_param_data.end_date_active := c_visit_rec.close_date_time;
3681 l_param_data.start_date_active := NULL;
3682 l_param_data.end_date_active := NULL;
3683 -- yazhou 06Oct2005 ends
3684
3685 PJM_PROJECT_PARAM_PUB.CREATE_PROJECT_PARAMETER(
3686 p_api_version => 1.0,
3687 p_init_msg_list => p_init_msg_list,
3688 p_commit => l_commit,
3689 x_return_status => l_return_status,
3690 x_msg_count => l_msg_count,
3691 x_msg_data => l_msg_data,
3692 p_param_data => l_param_data);
3693
3694 IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
3695 CLOSE c_pjm_param;
3696 RAISE FND_API.G_EXC_ERROR;
3697 END IF;
3698 -- RROY
3699 END IF;
3700 CLOSE c_pjm_param;
3701
3702 -- Merge process fro 11.5 10 bug fix on cmrdv10p env.
3703 -- Bug# 3594083 fix by shbhanda on 04/23
3704 -- To update all tasks without project task with project task id
3705 -- PRAKKUM :: PIE Changes :: 13-OCT-2010 :: START
3706 -- To update all tasks without project task with project task id
3707
3708 -- PRAKKUM :: 04-JAN-2013 :: FPBug 16481709 for BaseBug 14828418 : In reference of bug 9047048
3709 -- Top task id won't be null if project details populated using Type 1 method (l_top_task_id:-1),
3710 -- in other cases it will be null
3711 IF (l_log_statement >= l_log_current_level) THEN
3712 fnd_log.string(l_log_statement,L_DEBUG_KEY,'l_top_task_id = ' || l_top_task_id);
3713 END IF;
3714
3715 OPEN c_task_proj(c_visit_rec.PROJECT_ID);
3716 LOOP
3717 FETCH c_task_proj INTO c_task_proj_rec;
3718 EXIT WHEN c_task_proj%NOTFOUND;
3719 -- Update AHL_VISIT_TASKS_B only for non-rollup tasks
3720 IF (c_visit_rec.TOP_PROJECT_TASK_ID IS NULL
3721 AND l_top_task_id IS NULL) THEN
3722 IF (INSTR(c_task_proj_rec.task_number, '-') = 0) THEN -- tasks not under a visit level top task
3723 UPDATE AHL_VISIT_TASKS_B SET
3724 PROJECT_TASK_ID = c_task_proj_rec.task_id,
3725 OBJECT_VERSION_NUMBER = OBJECT_VERSION_NUMBER + 1,
3726 --TCHIMIRA::BUG 9222622 ::15-DEC-2009::UPDATE WHO COLUMNS
3727 LAST_UPDATE_DATE = SYSDATE,
3728 LAST_UPDATED_BY = Fnd_Global.USER_ID,
3729 LAST_UPDATE_LOGIN = Fnd_Global.LOGIN_ID
3730 /*B6436358 - sowsubra - Visit task number is of type number and task number in projects
3731 is of type char. Hence the invalid number error. And so added a to_char function to convert
3732 the visit task number to character*/
3733 WHERE VISIT_ID = p_visit_id AND TO_CHAR(VISIT_TASK_NUMBER) = c_task_proj_rec.task_number
3734 AND PROJECT_TASK_ID is NULL;
3735 END IF;
3736 ELSE
3737 IF (INSTR(c_task_proj_rec.task_number,'-',1,2) = 0) THEN -- tasks under a visit top task
3738 UPDATE AHL_VISIT_TASKS_B SET
3739 PROJECT_TASK_ID = c_task_proj_rec.task_id,
3740 OBJECT_VERSION_NUMBER = OBJECT_VERSION_NUMBER + 1,
3741 --TCHIMIRA::BUG 9222622 ::15-DEC-2009::UPDATE WHO COLUMNS
3742 LAST_UPDATE_DATE = SYSDATE,
3743 LAST_UPDATED_BY = Fnd_Global.USER_ID,
3744 LAST_UPDATE_LOGIN = Fnd_Global.LOGIN_ID
3745 /*B6436358 - sowsubra - Visit task number is of type number and task number in projects
3746 is of type char. Hence the invalid number error. And so added a to_char function to convert
3747 the visit task number to character*/
3748 WHERE VISIT_ID = p_visit_id
3749 AND TO_CHAR(c_visit_rec.visit_number) || '-' || TO_CHAR(VISIT_TASK_NUMBER) = c_task_proj_rec.task_number
3750 AND PROJECT_TASK_ID is NULL;
3751 END IF;
3752 END IF;
3753 END LOOP;
3754 CLOSE c_task_proj;
3755
3756 -- PRAKKUM :: 04-JAN-2013 :: FPBug 16481709 for BaseBug 14828418 : In reference of bug 9047048
3757 -- Moved code to update top task after mapping project tasks with visit tasks
3758 -- PRAKKUM :: FP:PIE :: 13-OCT-2010 ::
3759 IF (l_top_task_id = -1) THEN
3760 -- Added code to retrieve correct top task id
3761 IF l_pass_entire_structure = 'Y' THEN
3762 IF (l_log_statement >= l_log_current_level) THEN
3763 fnd_log.string(l_log_statement,L_DEBUG_KEY,'c_visit_rec.PROJECT_ID = ' || c_visit_rec.PROJECT_ID);
3764 fnd_log.string(l_log_statement,L_DEBUG_KEY,'c_visit_rec.VISIT_ID = ' || c_visit_rec.VISIT_ID);
3765 END IF;
3766 OPEN get_vst_prj_top_task(c_visit_rec.PROJECT_ID, c_visit_rec.VISIT_ID);
3767 FETCH get_vst_prj_top_task INTO l_vst_prj_top_tsk_rec;
3768 CLOSE get_vst_prj_top_task;
3769 l_top_task_id := l_vst_prj_top_tsk_rec.TOP_TASK_ID;
3770 ELSE
3771 l_top_task_id := l_task_out(1).pa_task_id;
3772 END IF;
3773 END IF;
3774
3775 IF (l_log_statement >= l_log_current_level) THEN
3776 fnd_log.string(l_log_statement,L_DEBUG_KEY,'l_top_task_id = ' || l_top_task_id);
3777 END IF;
3778
3779 -- Update AHL_VISITS_B.TOP_PROJECT_TASK_ID with the top task id just created
3780 IF l_top_task_id IS NOT NULL THEN
3781 UPDATE AHL_VISITS_B
3782 SET TOP_PROJECT_TASK_ID = l_top_task_id
3783 WHERE VISIT_ID = p_visit_id;
3784 END IF;
3785 END IF; -- c_visit_rec.PROJECT_ID IS NOT NULL
3786 -- PRAKKUM :: PIE Changes :: 13-OCT-2010 :: END
3787 ELSIF c_visit_rec.START_DATE_TIME IS NULL or c_visit_rec.START_DATE_TIME = Fnd_Api.G_MISS_DATE THEN
3788 x_return_status := Fnd_Api.g_ret_sts_error;
3789 IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_error) THEN
3790 Fnd_Message.set_name ('AHL', 'AHL_VWP_VISIT_ST_DT_MISSING');
3791 Fnd_Msg_Pub.ADD;
3792 END IF;
3793 END IF; -- check for visit's start date time
3794 END IF; -- l_chk_project
3795
3796 ---------------------------End of API Body---------------------------------------
3797 --Standard check to count messages
3798 l_msg_count := Fnd_Msg_Pub.count_msg;
3799
3800 IF l_msg_count > 0 THEN
3801 X_msg_count := l_msg_count;
3802 X_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
3803 RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
3804 END IF;
3805
3806 IF (l_log_procedure >= l_log_current_level) THEN
3807 fnd_log.string(l_log_procedure,L_DEBUG_KEY ||'.end','End of the procedure');
3808 END IF;
3809
3810 EXCEPTION
3811 WHEN FND_API.G_EXC_ERROR THEN
3812 x_return_status := FND_API.G_RET_STS_ERROR;
3813 ROLLBACK TO Update_Project;
3814 FND_MSG_PUB.count_and_get(p_count => x_msg_count,
3815 p_data => x_msg_data,
3816 p_encoded => fnd_api.g_false);
3817
3818 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
3819 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
3820 ROLLBACK TO Update_Project;
3821 FND_MSG_PUB.count_and_get(p_count => x_msg_count,
3822 p_data => x_msg_data,
3823 p_encoded => fnd_api.g_false);
3824
3825 WHEN OTHERS THEN
3826 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
3827 ROLLBACK TO Update_Project;
3828 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
3829 fnd_msg_pub.add_exc_msg(p_pkg_name => G_PKG_NAME,
3830 p_procedure_name => 'Update_Project',
3831 p_error_text => SUBSTR(SQLERRM,1,500));
3832 END IF;
3833 FND_MSG_PUB.count_and_get(p_count => x_msg_count,
3834 p_data => x_msg_data,
3835 p_encoded => fnd_api.g_false);
3836
3837 END Update_Project;
3838
3839 --------------------------------------------------------------------
3840 -- PROCEDURE
3841 -- Delete_Project
3842 --
3843 -- PURPOSE
3844 -- To delete Project and its tasks if visit in VWP is deleted
3845 --------------------------------------------------------------------
3846 PROCEDURE Delete_Project(
3847 p_api_version IN NUMBER,
3848 p_init_msg_list IN VARCHAR2 := Fnd_Api.g_false,
3849 p_commit IN VARCHAR2 := Fnd_Api.g_false,
3850 p_validation_level IN NUMBER := Fnd_Api.g_valid_level_full,
3851 p_module_type IN VARCHAR2 := Null,
3852 p_visit_id IN NUMBER,
3853 x_return_status OUT NOCOPY VARCHAR2,
3854 x_msg_count OUT NOCOPY NUMBER,
3855 x_msg_data OUT NOCOPY VARCHAR2 )
3856 AS
3857 -- Define local Variables
3858 L_API_NAME CONSTANT VARCHAR2(30) := 'Delete_Project';
3859 L_DEBUG_KEY CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
3860 L_API_VERSION CONSTANT NUMBER := 1.0;
3861 l_count NUMBER;
3862 l_msg_count NUMBER;
3863 l_created_project_id NUMBER;
3864 i NUMBER;
3865 l_return_status VARCHAR2(1);
3866 l_chk_project VARCHAR2(1);
3867 l_del_proj_flag VARCHAR2(1);
3868 l_valid_flag VARCHAR2(1):= 'N';
3869 l_commit VARCHAR2(1) := 'F';
3870 l_init_msg_list VARCHAR2(1) := 'F';
3871 l_default VARCHAR2(30);
3872 l_msg_data VARCHAR2(2000);
3873 G_EXC_ERROR EXCEPTION;
3874
3875 -- Define local Cursors
3876 -- To find visit related information
3877 CURSOR c_visit (x_id IN NUMBER) IS
3878 SELECT * FROM AHL_VISITS_VL
3879 WHERE VISIT_ID = x_id;
3880 c_visit_rec c_visit%ROWTYPE;
3881
3882 -- To find whether the visit project occurs in PJM_PROJECT_PARAMETERS table
3883 CURSOR c_Project(x_proj_id IN NUMBER) IS
3884 SELECT count(*) FROM PJM_PROJECT_PARAMETERS
3885 WHERE Project_ID = x_proj_id;
3886 BEGIN
3887
3888 SAVEPOINT Delete_project;
3889
3890 IF (l_log_procedure >= l_log_current_level) THEN
3891 fnd_log.string(l_log_procedure,L_DEBUG_KEY ||'.begin','At the start of the procedure');
3892 END IF;
3893
3894 -- Initialize message list if p_init_msg_list is set to TRUE.
3895 IF Fnd_Api.to_boolean(p_init_msg_list)THEN
3896 Fnd_Msg_Pub.initialize;
3897 END IF;
3898
3899 -- Initialize API return status to success
3900 x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
3901
3902 -- Standard call to check for call compatibility.
3903 IF NOT Fnd_Api.COMPATIBLE_API_CALL(l_api_version,
3904 p_api_version,
3905 L_API_NAME,G_PKG_NAME) THEN
3906 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3907 END IF;
3908
3909 IF (l_log_statement >= l_log_current_level) THEN
3910 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Visit Id=' || p_visit_id);
3911 END IF;
3912
3913 OPEN c_visit (p_visit_id);
3914 FETCH c_visit INTO c_visit_rec;
3915 CLOSE c_visit;
3916
3917 -- To check Project responsibilites
3918 -- Post 11.5.10
3919 -- RROY
3920 AHL_VWP_RULES_PVT.Check_Proj_Responsibility
3921 (x_check_project => l_chk_project,
3922 x_return_status => l_return_status);
3923
3924 IF l_return_status <> Fnd_Api.G_RET_STS_SUCCESS THEN
3925 x_return_status := l_return_status;
3926 RAISE G_EXC_ERROR;
3927 END IF;
3928
3929 IF l_chk_project = 'Y' THEN
3930 OPEN c_Project(c_visit_rec.PROJECT_ID);
3931 FETCH c_Project INTO l_count;
3932 CLOSE c_Project;
3933
3934 IF l_count > 0 THEN -- merge process for 11.5 10 bug# 3470801 fix on CMRDV10P
3935 Fnd_Message.SET_NAME('AHL','AHL_VWP_PROJ_PJM_PARA');
3936 Fnd_Message.SET_TOKEN('VISIT_NUMBER', c_visit_rec.Visit_Number);
3937 Fnd_Msg_Pub.ADD;
3938 RAISE Fnd_Api.G_EXC_ERROR;
3939 ELSE
3940 IF (l_log_statement >= l_log_current_level) THEN
3941 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Before calling : PA_PROJECT_PUB.CHECK_DELETE_PROJECT_OK');
3942 END IF;
3943
3944 PA_PROJECT_PUB.CHECK_DELETE_PROJECT_OK
3945 ( p_api_version_number => 1
3946 , p_init_msg_list => l_init_msg_list
3947 , p_return_status => l_return_status
3948 , p_msg_count => l_msg_count
3949 , p_msg_data => l_msg_data
3950 , p_project_id => c_visit_rec.PROJECT_ID
3951 , p_pm_project_reference => c_visit_rec.visit_number
3952 , p_delete_project_ok_flag => l_del_proj_flag
3953 );
3954
3955 IF (l_log_statement >= l_log_current_level) THEN
3956 fnd_log.string(l_log_statement,L_DEBUG_KEY,'After calling PA_PROJECT_PUB.CHECK_DELETE_PROJECT_OK - l_return_status = '||l_return_status);
3957 END IF;
3958
3959 IF l_return_status <> 'S' THEN
3960 RAISE G_EXC_ERROR;
3961 END IF;
3962
3963 IF (l_log_statement >= l_log_current_level) THEN
3964 fnd_log.string(l_log_statement,L_DEBUG_KEY,'l_del_proj_flag = '||l_del_proj_flag);
3965 END IF;
3966
3967 IF l_del_proj_flag = 'Y' THEN
3968 IF (l_log_statement >= l_log_current_level) THEN
3969 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Before calling PA_PROJECT_PUB.DELETE_PROJECT');
3970 END IF;
3971
3972 PA_PROJECT_PUB.DELETE_PROJECT
3973 ( p_api_version_number => 1
3974 ,p_commit => l_commit
3975 ,p_init_msg_list => l_init_msg_list
3976 ,p_msg_count => l_msg_count
3977 ,p_msg_data => l_msg_data
3978 ,p_return_status => l_return_status
3979 ,p_pm_product_code => G_PM_PRODUCT_CODE
3980 ,p_pm_project_reference => c_visit_rec.visit_number
3981 ,p_pa_project_id => c_visit_rec.PROJECT_ID
3982 );
3983
3984 IF (l_log_statement >= l_log_current_level) THEN
3985 fnd_log.string(l_log_statement,L_DEBUG_KEY,'After calling PA_PROJECT_PUB.DELETE_PROJECT - l_return_status = '||l_return_status);
3986 END IF;
3987
3988 IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
3989 IF (l_log_statement >= l_log_current_level) THEN
3990 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Errors from PA_PROJECT_PUB.DELETE_PROJECT API : '|| x_msg_count );
3991 END IF;
3992 RAISE Fnd_Api.g_exc_error;
3993 END IF;
3994 END IF;
3995 END IF;
3996 END IF;
3997
3998 ---------------------------End of API Body---------------------------------------
3999 --Standard check to count messages
4000 l_msg_count := Fnd_Msg_Pub.count_msg;
4001
4002 IF l_msg_count > 0 THEN
4003 X_msg_count := l_msg_count;
4004 X_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
4005 RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
4006 END IF;
4007
4008 IF (l_log_procedure >= l_log_current_level) THEN
4009 fnd_log.string(l_log_procedure,L_DEBUG_KEY ||'.end','End of the procedure');
4010 END IF;
4011
4012 EXCEPTION
4013 WHEN FND_API.G_EXC_ERROR THEN
4014 x_return_status := FND_API.G_RET_STS_ERROR;
4015 ROLLBACK TO Delete_Project;
4016 FND_MSG_PUB.count_and_get(p_count => x_msg_count,
4017 p_data => x_msg_data,
4018 p_encoded => fnd_api.g_false);
4019
4020 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
4021 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4022 ROLLBACK TO Delete_Project;
4023 FND_MSG_PUB.count_and_get(p_count => x_msg_count,
4024 p_data => x_msg_data,
4025 p_encoded => fnd_api.g_false);
4026
4027 WHEN OTHERS THEN
4028 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4029 ROLLBACK TO Delete_Project;
4030 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
4031 fnd_msg_pub.add_exc_msg(p_pkg_name => G_PKG_NAME,
4032 p_procedure_name => 'Delete_Project',
4033 p_error_text => SUBSTR(SQLERRM,1,500));
4034 END IF;
4035 FND_MSG_PUB.count_and_get(p_count => x_msg_count,
4036 p_data => x_msg_data,
4037 p_encoded => fnd_api.g_false);
4038 END Delete_Project;
4039
4040
4041 -- SATRAJEN :: BUG 12990261 :: Minimize the number of Error Messages :: Jun 2012
4042 --****************************************************************--
4043 --------------------------------------------------------------------
4044 -- VWP INTEGRATION WITH PRODUCTION --
4045 --------------------------------------------------------------------
4046 --****************************************************************--
4047
4048 ------------------------------------------------------------------
4049 -- Function name : Validate_MR_Route_Date
4050 -- Type : Private
4051 -- Function : Validate if the tasks associated to MR Route Id
4052 -- have an expired MR Id / Route Id. Also to sum up
4053 -- all the error messages.
4054 -- Parameters :
4055 --
4056 -- Validate_MR_Route_Date Parameters:
4057 -- p_mr_route_id IN NUMBER Required
4058 -- p_visit_task_number IN NUMBER Required
4059 -- p_start_date_time IN DATE Required
4060 -- p_end_date_time IN DATE Required
4061 --
4062 -- Version :
4063 -- 21/06/2012 SATRAJEN Initial Version - 1.0
4064 -- Added for Bug 12990261
4065 -------------------------------------------------------------------
4066
4067 FUNCTION Validate_MR_Route_Date(
4068 p_mr_route_id IN NUMBER,
4069 p_visit_task_number IN NUMBER,
4070 p_start_date_time IN DATE,
4071 p_end_date_time IN DATE
4072 )
4073 RETURN NUMBER -- PRAKKUM :: FPBug 16481732 for BaseBug 15884730 :: 16/11/2012
4074 IS
4075 -- Define local Variables
4076 L_API_NAME CONSTANT VARCHAR2(30) := 'Validate_MR_Route_Date';
4077 L_DEBUG_KEY CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
4078 --Flag value is a number manipulated in binary form to keep information of validation errors that found
4079 x_valid_flag NUMBER :=0; -- PRAKKUM :: FPBug 16481732 for BaseBug 15884730 :: 16/11/2012
4080
4081
4082 -- To find MR related Information
4083 CURSOR c_mr_header (c_id IN NUMBER) IS
4084 SELECT mrh1.effective_from,mrh1.effective_to
4085 FROM AHL_MR_HEADERS_APP_V mrh1, AHL_MR_ROUTES mrr
4086 WHERE mrh1.mr_status_code = 'COMPLETE' AND
4087 trunc(mrh1.effective_from) <= trunc(sysdate) AND
4088 trunc(nvl(mrh1.effective_to,sysdate)) >= trunc(sysdate) AND
4089 mrr.mr_route_id = c_id AND
4090 mrh1.mr_header_id = mrr.mr_header_id AND
4091 mrh1.version_number = (select max(version_number)
4092 from AHL_MR_HEADERS_APP_V mrh2
4093 where mrh2.title = mrh1.title
4094 and mrh2.mr_status_code = 'COMPLETE'
4095 and trunc(effective_from) <= trunc(sysdate) AND
4096 trunc(nvl(effective_to,sysdate)) >= trunc(sysdate));
4097
4098 c_mr_header_rec c_mr_header%ROWTYPE;
4099
4100 -- To find Route related Information
4101 CURSOR c_route (c_id IN NUMBER) IS
4102 SELECT ra.*
4103 FROM AHL_ROUTES_APP_V ra, AHL_MR_ROUTES mrr
4104 WHERE ra.route_id = mrr.route_id AND
4105 mrr.mr_route_id = c_id AND
4106 ra.revision_status_code = 'COMPLETE';
4107
4108 c_route_rec c_route%ROWTYPE;
4109
4110 BEGIN
4111
4112 -- Log API Entry Point
4113 IF (l_log_procedure >= l_log_current_level) THEN
4114 fnd_log.string(l_log_procedure,
4115 L_DEBUG_KEY ||'.begin',
4116 'At the start of PL SQL procedure.');
4117 fnd_log.string(l_log_procedure,
4118 L_DEBUG_KEY,
4119 'MR Route Id = ' || p_mr_route_id || 'Visit Task Number = ' || p_visit_task_number ||
4120 'Start Date = ' || p_start_date_time || 'End Date = ' || p_end_date_time);
4121 END IF;
4122
4123 IF p_mr_route_id IS NOT NULL THEN
4124 OPEN c_route (p_mr_route_id);
4125 FETCH c_route INTO c_route_rec;
4126
4127 IF c_route%FOUND THEN
4128 CLOSE c_route;
4129
4130 IF (l_log_statement >= l_log_current_level) THEN
4131 fnd_log.string(l_log_statement,
4132 L_DEBUG_KEY,
4133 'Checking Route Start and End Dates');
4134 END IF;
4135
4136 IF TRUNC(c_route_rec.start_date_active) > p_start_date_time THEN
4137
4138 -- SATRAJEN :: Bug 12990261 :: Commented to Sum up all the error Messages :: Jun 2012
4139 /*Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_TSK_STDT_ROUT_STDT');
4140 Fnd_Message.Set_Token('TASK_NUMBER', p_visit_task_number);
4141 Fnd_Msg_Pub.ADD;*/
4142 -- PRAKKUM :: FPBug 16481732 for BaseBug 15884730 :: 16/11/2012
4143 --bitor value of x and y=(x+y)-bitand(x,y);
4144 x_valid_flag := (x_valid_flag+POWER(2,0))-bitand(x_valid_flag,POWER(2,0));
4145
4146 END IF;
4147
4148 IF TRUNC(c_route_rec.end_date_active) IS NOT NULL THEN
4149 IF TRUNC(c_route_rec.end_date_active) < p_end_date_time THEN
4150
4151 -- SATRAJEN :: Bug 12990261 :: Commented to Sum up all the error Messages :: Jun 2012
4152 /*Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_TSK_ENDT_ROUT_ENDT');
4153 Fnd_Message.Set_Token('TASK_NUMBER', p_visit_task_number);
4154 Fnd_Msg_Pub.ADD;*/
4155 -- PRAKKUM :: FPBug 16481732 for BaseBug 15884730 :: 16/11/2012
4156 --bitor value of x and y=(x+y)-bitand(x,y);
4157 x_valid_flag := (x_valid_flag+POWER(2,1))-bitand(x_valid_flag,POWER(2,1));
4158
4159 END IF;
4160 END IF;
4161
4162 ELSE -- Else of c_route%FOUND check
4163
4164 CLOSE c_route;
4165
4166 -- SATRAJEN :: Bug 12990261 :: Commented to Sum up all the error Messages :: Jun 2012
4167 /*Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_TSK_NO_ROUTE');
4168 Fnd_Message.Set_Token('TASK_NUMBER', p_visit_task_number);
4169 Fnd_Msg_Pub.ADD;*/
4170 -- PRAKKUM :: FPBug 16481732 for BaseBug 15884730 :: 16/11/2012
4171 --bitor value of x and y=(x+y)-bitand(x,y);
4172 x_valid_flag := (x_valid_flag+POWER(2,2))-bitand(x_valid_flag,POWER(2,2));
4173
4174 END IF; -- End of c_route%FOUND check
4175
4176 -- If the tasks associated to MR Route Id have an expired MR Id
4177 -- then it cannot be pushed into Production Planning.
4178 OPEN c_mr_header (p_mr_route_id);
4179 FETCH c_mr_header INTO c_mr_header_rec;
4180
4181 IF c_mr_header%FOUND THEN
4182 CLOSE c_mr_header;
4183
4184 IF (l_log_statement >= l_log_current_level) THEN
4185 fnd_log.string(l_log_statement,
4186 L_DEBUG_KEY,
4187 'Checking MR Start and End Dates');
4188 END IF;
4189
4190 IF TRUNC(c_mr_header_rec.effective_from) > p_start_date_time THEN
4191 -- SATRAJEN :: Bug 12990261 :: Commented to Sum up all the error Messages :: Jun 2012
4192 /*Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_NO_TS_SD_LT_MR');
4193 Fnd_Message.Set_Token('TASK_NUMBER', p_visit_task_number);
4194 Fnd_Msg_Pub.ADD;*/
4195 -- PRAKKUM :: FPBug 16481732 for BaseBug 15884730 :: 16/11/2012
4196 --bitor value of x and y=(x+y)-bitand(x,y);
4197 x_valid_flag := (x_valid_flag+POWER(2,3))-bitand(x_valid_flag,POWER(2,3));
4198 END IF;
4199 IF TRUNC(c_mr_header_rec.effective_to) IS NOT NULL THEN
4200 IF TRUNC(c_mr_header_rec.effective_to) < p_end_date_time THEN
4201
4202 -- SATRAJEN :: Bug 12990261 :: Commented to Sum up all the error Messages :: Jun 2012
4203 /*Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_NO_TS_ED_GT_MR');
4204 Fnd_Message.Set_Token('TASK_NUMBER', p_visit_task_number);
4205 Fnd_Msg_Pub.ADD;*/
4206 -- PRAKKUM :: FPBug 16481732 for BaseBug 15884730 :: 16/11/2012
4207 --bitor value of x and y=(x+y)-bitand(x,y);
4208 x_valid_flag := (x_valid_flag+POWER(2,4))-bitand(x_valid_flag,POWER(2,4));
4209 END IF;
4210 END IF;
4211
4212 ELSE -- Else for c_mr_header%FOUND check
4213 CLOSE c_mr_header;
4214
4215 -- SATRAJEN :: Bug 12990261 :: Commented to Sum up all the error Messages :: Jun 2012
4216 /*Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_NO_MR_ID');
4217 Fnd_Message.Set_Token('TASK_NUMBER', p_visit_task_number);
4218 Fnd_Msg_Pub.ADD;*/
4219 -- PRAKKUM :: FPBug 16481732 for BaseBug 15884730 :: 16/11/2012
4220 --bitor value of x and y=(x+y)-bitand(x,y);
4221 x_valid_flag := (x_valid_flag+POWER(2,5))-bitand(x_valid_flag,POWER(2,5));
4222
4223 END IF; -- End of c_mr_header%FOUND check
4224 END IF; -- End of p_mr_route_id IS NOT NULL check
4225
4226 IF (l_log_statement >= l_log_current_level) THEN
4227 fnd_log.string(l_log_statement,
4228 L_DEBUG_KEY,
4229 'x_valid_flag --@>'||x_valid_flag);
4230 END IF;
4231
4232 ---------------------------End of API Body---------------------------------------
4233 IF (l_log_procedure >= l_log_current_level) THEN
4234 fnd_log.string(l_log_procedure,
4235 L_DEBUG_KEY ||'.end',
4236 'At the end of PL SQL Function.');
4237 END IF;
4238 RETURN x_valid_flag;
4239
4240 END Validate_MR_Route_Date;
4241
4242
4243
4244 --****************************************************************--
4245 --------------------------------------------------------------------
4246 -- VWP INTEGRATION WITH PRODUCTION --
4247 --------------------------------------------------------------------
4248 --****************************************************************--
4249
4250 ------------------------------------------------------------------
4251 -- Procedure name : Validate_MR_Route_Date
4252 -- Type : Private
4253 -- Function : Validate if the tasks associated to MR Route Id
4254 -- have an expired MR Id / Route Id.
4255 -- Parameters :
4256 --
4257 -- Validate_MR_Route_Date Parameters:
4258 -- p_mr_route_id IN NUMBER Required
4259 -- p_visit_task_number IN NUMBER Required
4260 -- p_start_date_time IN DATE Required
4261 -- p_end_date_time IN DATE Required
4262 --
4263 -- Version :
4264 -- 28 Sep, 2007 RNAHATA Initial Version - 1.0
4265 -- Added for Bug 6448678
4266 -------------------------------------------------------------------
4267
4268 PROCEDURE Validate_MR_Route_Date(
4269 p_mr_route_id IN NUMBER,
4270 p_visit_task_number IN NUMBER,
4271 p_start_date_time IN DATE,
4272 p_end_date_time IN DATE
4273 )
4274 AS
4275 -- Define local Variables
4276 L_API_NAME CONSTANT VARCHAR2(30) := 'Validate_MR_Route_Date';
4277 L_DEBUG_KEY CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
4278
4279 -- To find MR related Information
4280 CURSOR c_mr_header (c_id IN NUMBER) IS
4281 SELECT mrh1.effective_from,mrh1.effective_to
4282 FROM AHL_MR_HEADERS_APP_V mrh1, AHL_MR_ROUTES mrr
4283 WHERE mrh1.mr_status_code = 'COMPLETE' AND
4284 trunc(mrh1.effective_from) <= trunc(sysdate) AND
4285 trunc(nvl(mrh1.effective_to,sysdate)) >= trunc(sysdate) AND
4286 mrr.mr_route_id = c_id AND
4287 mrh1.mr_header_id = mrr.mr_header_id AND
4288 mrh1.version_number = (select max(version_number)
4289 from AHL_MR_HEADERS_APP_V mrh2
4290 where mrh2.title = mrh1.title
4291 and mrh2.mr_status_code = 'COMPLETE'
4292 and trunc(effective_from) <= trunc(sysdate) AND
4293 trunc(nvl(effective_to,sysdate)) >= trunc(sysdate));
4294
4295 c_mr_header_rec c_mr_header%ROWTYPE;
4296
4297 -- To find Route related Information
4298 CURSOR c_route (c_id IN NUMBER) IS
4299 SELECT ra.*
4300 FROM AHL_ROUTES_APP_V ra, AHL_MR_ROUTES mrr
4301 WHERE ra.route_id = mrr.route_id AND
4302 mrr.mr_route_id = c_id AND
4303 ra.revision_status_code = 'COMPLETE';
4304
4305 c_route_rec c_route%ROWTYPE;
4306
4307 BEGIN
4308
4309 -- Log API Entry Point
4310 IF (l_log_procedure >= l_log_current_level) THEN
4311 fnd_log.string(l_log_procedure,
4312 L_DEBUG_KEY ||'.begin',
4313 'At the start of PL SQL procedure.');
4314 fnd_log.string(l_log_procedure,
4315 L_DEBUG_KEY,
4316 'MR Route Id = ' || p_mr_route_id || 'Visit Task Number = ' || p_visit_task_number ||
4317 'Start Date = ' || p_start_date_time || 'End Date = ' || p_end_date_time);
4318 END IF;
4319
4320 IF p_mr_route_id IS NOT NULL THEN
4321 OPEN c_route (p_mr_route_id);
4322 FETCH c_route INTO c_route_rec;
4323
4324 IF c_route%FOUND THEN
4325 CLOSE c_route;
4326
4327 IF (l_log_statement >= l_log_current_level) THEN
4328 fnd_log.string(l_log_statement,
4329 L_DEBUG_KEY,
4330 'Checking Route Start and End Dates');
4331 END IF;
4332
4333 IF TRUNC(c_route_rec.start_date_active) > p_start_date_time THEN
4334
4335 Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_TSK_STDT_ROUT_STDT');
4336 Fnd_Message.Set_Token('TASK_NUMBER', p_visit_task_number);
4337 Fnd_Msg_Pub.ADD;
4338
4339 END IF;
4340
4341 IF TRUNC(c_route_rec.end_date_active) IS NOT NULL THEN
4342 IF TRUNC(c_route_rec.end_date_active) < p_end_date_time THEN
4343
4344 Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_TSK_ENDT_ROUT_ENDT');
4345 Fnd_Message.Set_Token('TASK_NUMBER', p_visit_task_number);
4346 Fnd_Msg_Pub.ADD;
4347
4348 END IF;
4349 END IF;
4350
4351 ELSE -- Else of c_route%FOUND check
4352
4353 CLOSE c_route;
4354
4355 Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_TSK_NO_ROUTE');
4356 Fnd_Message.Set_Token('TASK_NUMBER', p_visit_task_number);
4357 Fnd_Msg_Pub.ADD;
4358
4359 END IF; -- End of c_route%FOUND check
4360
4361 -- If the tasks associated to MR Route Id have an expired MR Id
4362 -- then it cannot be pushed into Production Planning.
4363 OPEN c_mr_header (p_mr_route_id);
4364 FETCH c_mr_header INTO c_mr_header_rec;
4365
4366 IF c_mr_header%FOUND THEN
4367 CLOSE c_mr_header;
4368
4369 IF (l_log_statement >= l_log_current_level) THEN
4370 fnd_log.string(l_log_statement,
4371 L_DEBUG_KEY,
4372 'Checking MR Start and End Dates');
4373 END IF;
4374
4375 IF TRUNC(c_mr_header_rec.effective_from) > p_start_date_time THEN
4376 Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_NO_TS_SD_LT_MR');
4377 Fnd_Message.Set_Token('TASK_NUMBER', p_visit_task_number);
4378 Fnd_Msg_Pub.ADD;
4379
4380 END IF;
4381 IF TRUNC(c_mr_header_rec.effective_to) IS NOT NULL THEN
4382 IF TRUNC(c_mr_header_rec.effective_to) < p_end_date_time THEN
4383
4384 Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_NO_TS_ED_GT_MR');
4385 Fnd_Message.Set_Token('TASK_NUMBER', p_visit_task_number);
4386 Fnd_Msg_Pub.ADD;
4387
4388 END IF;
4389 END IF;
4390
4391 ELSE -- Else for c_mr_header%FOUND check
4392 CLOSE c_mr_header;
4393
4394 Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_NO_MR_ID');
4395 Fnd_Message.Set_Token('TASK_NUMBER', p_visit_task_number);
4396 Fnd_Msg_Pub.ADD;
4397
4398 END IF; -- End of c_mr_header%FOUND check
4399 END IF; -- End of p_mr_route_id IS NOT NULL check
4400
4401 ---------------------------End of API Body---------------------------------------
4402 IF (l_log_procedure >= l_log_current_level) THEN
4403 fnd_log.string(l_log_procedure,
4404 L_DEBUG_KEY ||'.end',
4405 'At the end of PL SQL procedure.');
4406 END IF;
4407
4408 END Validate_MR_Route_Date;
4409
4410 --------------------------------------------------------------------
4411 -- PROCEDURE
4412 -- Validate_Before_Production
4413 --
4414 -- PURPOSE
4415 -- To validate Visit and all its Tasks before the push to production
4416 --------------------------------------------------------------------
4417 PROCEDURE Validate_Before_Production
4418 (
4419 p_api_version IN NUMBER,
4420 p_init_msg_list IN VARCHAR2 := Fnd_Api.g_false,
4421 p_commit IN VARCHAR2 := Fnd_Api.g_false,
4422 p_validation_level IN NUMBER := Fnd_Api.g_valid_level_full,
4423 p_module_type IN VARCHAR2 := 'JSP',
4424 p_visit_id IN NUMBER,
4425
4426 x_error_tbl OUT NOCOPY Error_Tbl_Type,
4427 x_return_status OUT NOCOPY VARCHAR2,
4428 x_msg_count OUT NOCOPY NUMBER,
4429 x_msg_data OUT NOCOPY VARCHAR2
4430 )
4431 IS
4432 L_API_VERSION CONSTANT NUMBER := 1.0;
4433 L_API_NAME CONSTANT VARCHAR2(30) := 'Validate_Before_Production';
4434 --part-chgER - sowsubra
4435 L_DEBUG_KEY CONSTANT VARCHAR2(90) := 'ahl.plsql.'||G_PKG_NAME||'.'||L_API_NAME;
4436 l_dept_Tbl Dept_Tbl_Type;
4437 l_error_tbl Error_Tbl_Type;
4438 l_visit_end_time DATE;
4439 -- l_flag VARCHAR2(1):= 'N';
4440 l_return_status VARCHAR2(1);
4441 l_chk_flag VARCHAR2(1);
4442 l_check_flag VARCHAR2(1);
4443 l_proj_task_flag VARCHAR2(1);
4444 -- Post 11.5.10
4445 -- RROY
4446 l_hierarchy_flag VARCHAR2(1);
4447 l_job_released_flag VARCHAR2(1);
4448 l_task_invalid_flag VARCHAR2(1);
4449 -- RROY
4450 l_default VARCHAR2(30);
4451 l_temp VARCHAR2(2000);
4452 l_msg_data VARCHAR2(2000);
4453 l_plan_end_hour NUMBER;
4454 -- Post 11.5.10
4455 -- RROY
4456 l_start_from_hour NUMBER;
4457 l_visit_task_id NUMBER;
4458 -- RROY
4459 l_end_hour NUMBER;
4460 l_visit_task_id NUMBER;
4461 l_count NUMBER;
4462 l_msg_count NUMBER :=0;
4463 l_data VARCHAR2(2000);
4464 l_count1 NUMBER;
4465 l_count2 NUMBER;
4466 i NUMBER:=0;
4467 j NUMBER:=0;
4468 x NUMBER:=0;
4469 l_dept_flag VARCHAR2(1):= 'N';
4470 l_dept NUMBER;
4471 l_dummy_i NUMBER;
4472 l_val_task_tbl AHL_VWP_RULES_PVT.Task_Tbl_Type; --SKPATHAK :: VWPE
4473 l_plan_date_flag VARCHAR2(1):= 'N'; -- SOSAHNI :: BUG 16061401 :: FP base bug :: 12929344 :: 10/01/2013 :: Flag to check if plan date is missing
4474
4475 -- To find visit related information
4476 -- Added where condition for checking DELETED status in 11.5.10
4477 -- PRAKKUM :: VWPE: ER:12673125 :: 23-JUN-2011 :: Upgrade Changes
4478 CURSOR c_visit (x_id IN NUMBER) IS
4479 SELECT AHL_VISITS_VL.*,AHL_VWP_VISITS_PVT.Is_Old_Visit(VISIT_ID) IS_OLD_VISIT FROM AHL_VISITS_VL
4480 WHERE VISIT_ID = x_id
4481 AND NVL(STATUS_CODE,'X') <> 'DELETED';
4482 c_visit_rec c_visit%ROWTYPE;
4483
4484 -- To find visit dept has any dept shifts
4485 CURSOR c_dept (x_id IN NUMBER) IS
4486 SELECT COUNT(*) FROM AHL_DEPARTMENT_SHIFTS
4487 WHERE DEPARTMENT_ID = x_id;
4488
4489 /* Begin Changes by Shkalyan */
4490 -- To find task related information
4491 -- Added where condition for checking DELETED status in 11.5.10
4492 /* MANESING::Component Maintenance Planning Project, 07-Aug-2011, added visit task CLOSED status
4493 * in cursor query to prevent fetching tasks that are Closed due to Repair Batch closure.
4494 */
4495 CURSOR c_task (x_visit_id IN NUMBER) IS
4496 SELECT * FROM AHL_VISIT_TASKS_VL
4497 WHERE VISIT_ID = x_visit_id
4498 AND NVL(STATUS_CODE,'X') not in ('DELETED','RELEASED','CLOSED')
4499 AND (TASK_TYPE_CODE <> 'SUMMARY' OR
4500 (TASK_TYPE_CODE = 'SUMMARY' AND
4501 MR_ID IS NOT NULL));
4502 /* End Changes by Shkalyan */
4503 c_task_rec c_task%ROWTYPE;
4504
4505 -- VWP11.5.10 Enhancements
4506 -- To find whether any visit which is in a primaryplan has any simulation plans
4507 CURSOR c_simulation (x_id IN NUMBER) IS
4508 SELECT COUNT(*) FROM AHL_SIMULATION_PLANS_VL
4509 WHERE SIMULATION_PLAN_ID = x_id
4510 AND PRIMARY_PLAN_FLAG = 'Y';
4511
4512 -- AnRaj: Following two cursors have been changed due to performnace issues
4513 -- Bug Number 4919291
4514 -- To find MR header related information
4515 /* CURSOR c_mr_header (x_id IN NUMBER) IS
4516 SELECT T1.* FROM AHL_MR_HEADERS_APP_V T1, AHL_MR_ROUTES_V T2
4517 WHERE T1.MR_HEADER_ID = T2.MR_HEADER_ID
4518 AND T2.MR_ROUTE_ID = x_id;
4519 */
4520
4521 -- yazhou 02-Jun-2006 starts
4522 -- bug fix#5209826
4523 /*
4524 CURSOR c_mr_header (x_id IN NUMBER) IS
4525 SELECT T1.EFFECTIVE_FROM,T1.EFFECTIVE_TO
4526 FROM AHL_MR_HEADERS_APP_V T1, AHL_MR_ROUTES_V T2
4527 WHERE T1.MR_HEADER_ID = T2.MR_HEADER_ID
4528 AND T2.MR_ROUTE_ID = x_id;
4529 */
4530 CURSOR c_mr_header (x_id IN NUMBER) IS
4531 SELECT T1.EFFECTIVE_FROM,T1.EFFECTIVE_TO
4532 FROM ahl_mr_headers_app_v T1, AHL_MR_ROUTES_V T2
4533 WHERE T1.mr_status_code = 'COMPLETE' AND
4534 trunc(T1.effective_from) <= trunc(sysdate) AND
4535 trunc(nvl(T1.effective_to,sysdate)) >= trunc(sysdate) AND
4536 T2.MR_ROUTE_ID = x_id AND
4537 T1.MR_HEADER_ID = T2.MR_HEADER_ID AND
4538 T1.version_number = (select max(version_number)
4539 from ahl_mr_headers_app_v mr1
4540 where mr1.title = T1.title
4541 and mr1.mr_status_code = 'COMPLETE'
4542 and trunc(effective_from) <= trunc(sysdate) AND
4543 trunc(nvl(effective_to,sysdate)) >= trunc(sysdate));
4544
4545 -- yazhou 02-Jun-2006 ends
4546
4547 c_mr_header_rec c_mr_header%ROWTYPE;
4548
4549 -- To find route related information
4550 /* CURSOR c_route (x_id IN NUMBER) IS
4551 SELECT T1.* FROM AHL_ROUTES_APP_V T1, AHL_MR_ROUTES_V T2
4552 WHERE T1.ROUTE_ID = T2.ROUTE_ID
4553 AND T2.MR_ROUTE_ID = x_id
4554 AND T1.REVISION_STATUS_CODE = 'COMPLETE';
4555 */
4556 CURSOR c_route (x_id IN NUMBER) IS
4557 SELECT T1.START_DATE_ACTIVE,T1.END_DATE_ACTIVE
4558 FROM AHL_ROUTES_APP_V T1, AHL_MR_ROUTES_V T2
4559 WHERE T1.ROUTE_ID = T2.ROUTE_ID
4560 AND T2.MR_ROUTE_ID = x_id
4561 AND T1.REVISION_STATUS_CODE = 'COMPLETE';
4562 c_route_rec c_route%ROWTYPE;
4563 -- End of Fix for 4919291
4564
4565 -- To find only those routes which are there in tasks table but not in route table for a visit
4566 -- Added where condition for checking DELETED status in 11.5.10
4567 /* MANESING::Component Maintenance Planning Project, 07-Aug-2011, added visit task CLOSED status
4568 * in cursor query to prevent fetching tasks that are Closed due to Repair Batch closure.
4569 */
4570 CURSOR c_route_chk (x_id IN NUMBER) IS
4571 SELECT VT.MR_ROUTE_ID
4572 FROM AHL_VISIT_TASKS_B VT
4573 WHERE VT.VISIT_ID = x_id
4574 AND NVL(STATUS_CODE,'X') not in ('DELETED','RELEASED','CLOSED')
4575 AND VT.MR_Route_ID IS NOT NULL
4576 AND NOT EXISTS (
4577 SELECT 1
4578 FROM AHL_MR_ROUTES T1, AHL_ROUTES_APP_V T2, AHL_MR_HEADERS_APP_V B
4579 WHERE T1.MR_ROUTE_ID = VT.MR_ROUTE_ID
4580 AND T1.MR_HEADER_ID = B.MR_HEADER_ID
4581 AND T1.ROUTE_ID = T2.ROUTE_ID
4582 AND T2.REVISION_STATUS_CODE = 'COMPLETE');
4583 c_route_chk_rec c_route_chk%ROWTYPE;
4584
4585 -- To find visit task id for the non-summary tasks which have no MR Routes
4586 -- Added where condition for checking DELETED status in 11.5.10
4587 /* MANESING::Component Maintenance Planning Project, 07-Aug-2011, added visit task CLOSED status
4588 * in cursor query to prevent fetching tasks that are Closed due to Repair Batch closure.
4589 */
4590 CURSOR c_route_tsk (x_id IN NUMBER) IS
4591 SELECT VISIT_TASK_ID, VISIT_TASK_NUMBER FROM AHL_VISIT_TASKS_B
4592 WHERE VISIT_ID = x_id
4593 AND NVL(STATUS_CODE,'X') not in ('DELETED','RELEASED','CLOSED')
4594 AND MR_Route_ID IS NULL
4595 AND TASK_TYPE_CODE <> 'SUMMARY';
4596
4597 /* commented out for bug fix 4081044
4598 yazhou 03-Jan-2005
4599 -- To find count for Item and MR Header ID
4600 CURSOR c_check (x_item_id IN NUMBER, x_mr_route_id IN NUMBER) IS
4601 SELECT count(*) FROM Ahl_MR_Items_V T1, AHL_MR_ROUTES_APP_V T2
4602 WHERE T1.Inventory_Item_ID = x_item_id
4603 AND T1.MR_HEADER_ID = T2.MR_HEADER_ID
4604 AND MR_ROUTE_ID = x_mr_route_id;
4605 */
4606
4607 -- To find all departments from a visit's tasks table
4608 -- Added where condition for checking DELETED status in 11.5.10
4609 /* MANESING::Component Maintenance Planning Project, 07-Aug-2011, added visit task CLOSED status
4610 * in cursor query to prevent fetching tasks that are Closed due to Repair Batch closure.
4611 */
4612 CURSOR c_dept_task (x_id IN NUMBER) IS
4613 SELECT DEPARTMENT_ID FROM AHL_VISIT_TASKS_B
4614 WHERE VISIT_ID = x_id
4615 AND NVL(STATUS_CODE,'X') not in ('DELETED','RELEASED','CLOSED')
4616 AND DEPARTMENT_ID IS NOT NULL;
4617 c_dept_task_rec c_dept_task%ROWTYPE;
4618
4619 -- To find all departments from a visit's tasks table
4620 -- Added where condition for checking DELETED status in 11.5.10
4621 /* MANESING::Component Maintenance Planning Project, 07-Aug-2011, added visit task CLOSED status
4622 * in cursor query to prevent fetching tasks that are Closed due to Repair Batch closure.
4623 */
4624 CURSOR c_dept_tsk (x_id IN NUMBER) IS
4625 SELECT DEPARTMENT_ID, VISIT_TASK_NUMBER FROM AHL_VISIT_TASKS_B
4626 WHERE VISIT_ID = x_id
4627 AND NVL(STATUS_CODE,'X') not in ('DELETED','RELEASED','CLOSED')
4628 AND DEPARTMENT_ID IS NOT NULL;
4629 c_dept_tsk_rec c_dept_tsk%ROWTYPE;
4630
4631 /*sowsubra - part-chgER - 18 July, 2007 - start*/
4632 CURSOR c_get_inst_item (c_instance_id IN NUMBER) IS
4633 SELECT INVENTORY_ITEM_ID, INSTANCE_NUMBER FROM CSI_ITEM_INSTANCES
4634 WHERE instance_id = c_instance_id;
4635
4636 c_inst_item_rec c_get_inst_item%ROWTYPE;
4637 /*sowsubra - part-chgER - end*/
4638
4639 -- To find out if the item instances associated to a visit or task is still active
4640 -- CURSOR c_serial (p_serial_id IN NUMBER, p_item_id IN NUMBER, p_org_id IN NUMBER) IS
4641 -- part-chgER - changed the name of the cusror.
4642 CURSOR c_instance (c_instance_id IN NUMBER, c_item_id IN NUMBER, c_org_id IN NUMBER) IS
4643 SELECT count(*)FROM CSI_ITEM_INSTANCES
4644 WHERE Instance_Id = c_instance_id
4645 AND Inventory_Item_Id = c_item_id
4646 AND Inv_Master_Organization_Id = c_org_id
4647 AND ACTIVE_START_DATE <= sysdate
4648 AND (ACTIVE_END_DATE >= sysdate OR ACTIVE_END_DATE IS NULL);
4649
4650 -- RROY
4651
4652 -- bug fix 4077103 -yazhou
4653 -- To check the current status of the Unit
4654 CURSOR c_uc_status (p_instance_id IN NUMBER) IS
4655 SELECT name, AHL_UTIL_UC_PKG.GET_UC_STATUS_CODE(UNIT_CONFIG_HEADER_ID) uc_status
4656 FROM ahl_unit_config_headers uc,
4657 csi_item_instances csis
4658 WHERE uc.csi_item_instance_id=csis.instance_id
4659 AND (uc.active_end_date IS NULL OR uc.active_end_date > SYSDATE)
4660 AND csis.instance_id = p_instance_id;
4661
4662 c_uc_status_rec c_uc_status%ROWTYPE;
4663 -- SKPATHAK :: ER:12730539 :: 01-AUG-2011
4664 CURSOR get_task_status (c_task_id IN NUMBER) IS
4665 SELECT status_code FROM ahl_visit_tasks_b
4666 WHERE visit_task_id = c_task_id;
4667 l_task_status VARCHAR2(30);
4668
4669 BEGIN
4670 --------------------- initialize -----------------------
4671 SAVEPOINT Validate_Before_Production;
4672
4673 IF (l_log_procedure >= l_log_current_level) THEN
4674 fnd_log.string(l_log_procedure,
4675 L_DEBUG_KEY ||'.begin',
4676 'At the start of PL SQL procedure. Visit Id = ' || p_visit_id);
4677 END IF;
4678
4679 -- Initialize message list if p_init_msg_list is set to TRUE.
4680 IF Fnd_Api.to_boolean(p_init_msg_list) THEN
4681 Fnd_Msg_Pub.initialize;
4682 END IF;
4683
4684 -- Initialize API return status to success
4685 x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
4686
4687 -- Standard call to check for call compatibility.
4688 IF NOT Fnd_Api.COMPATIBLE_API_CALL(l_api_version,
4689 p_api_version,
4690 l_api_name,G_PKG_NAME) THEN
4691 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4692 END IF;
4693
4694 OPEN c_visit (p_visit_id);
4695 FETCH c_visit INTO c_visit_rec;
4696 CLOSE c_visit;
4697
4698 -- SKPATHAK :: 02-MAY-2011 :: VWPE: ER:12424063
4699 -- If the visit does not have visit type associated to it, an error should be thrown
4700 -- Errored only if visit is not an old visit -- PRAKKUM :: VWPE: ER:12673125 :: 23-JUN-2011 :: Upgrade Changes
4701 IF c_visit_rec.visit_type_code IS NULL AND c_visit_rec.IS_OLD_VISIT <> 'Y' THEN
4702 Fnd_Message.SET_NAME('AHL','AHL_VWP_VISIT_TYPE_MAND');
4703 Fnd_Message.Set_Token('VISIT_NUMBER', c_visit_rec.VISIT_NUMBER);
4704 Fnd_Msg_Pub.ADD;
4705 END IF;
4706
4707 -- To check if the unit is quarantined
4708 -- AnRaj added for R 12.0 ACL changes in VWP, Start
4709 check_unit_quarantined(p_visit_id,c_visit_rec.Item_Instance_Id);
4710 -- AnRaj added for R 12.0 ACL changes in VWP, End
4711 IF c_visit_rec.TEMPLATE_FLAG = 'N' THEN
4712 -- To check visit's start date is not null
4713 IF c_visit_rec.START_DATE_TIME IS NULL THEN
4714 IF (l_log_statement >= l_log_current_level) THEN
4715 fnd_log.string(l_log_statement,
4716 L_DEBUG_KEY,
4717 'Visit Start Date is null.');
4718 END IF;
4719 -- By shbhanda 05/21/04 for TC changes
4720 Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_NO_ST_DATE');
4721 Fnd_Message.Set_Token('VISIT_NUMBER', c_visit_rec.VISIT_NUMBER);
4722 Fnd_Msg_Pub.ADD;
4723 END IF;
4724
4725 -- To check visit's status is not null and it should be only planning or partially released
4726 IF c_visit_rec.STATUS_CODE IS NOT NULL THEN
4727 -- SKPATHAK :: 02-MAY-2011 :: VWPE: ER:12424063 :: Consider the new status DRAFT as well
4728 IF ((c_visit_rec.STATUS_CODE NOT IN ('PLANNING', 'PARTIALLY RELEASED', 'DRAFT'))
4729 OR (c_visit_rec.STATUS_CODE = 'DRAFT' and p_module_type NOT IN ('CST','VWP'))) THEN
4730 IF (l_log_statement >= l_log_current_level) THEN
4731 fnd_log.string(l_log_statement,
4732 L_DEBUG_KEY,
4733 'Visit Status Code is not Planning/Partially Released.');
4734 END IF;
4735 Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_NOT_PLANNING'); -- **** IMPortant uPDATE FOR PARTIALLY RELEASED
4736 Fnd_Message.Set_Token('VISIT_NUMBER', c_visit_rec.VISIT_NUMBER);
4737 Fnd_Msg_Pub.ADD;
4738 /* l_temp := 'ERROR: Visit Number ' || c_visit_rec.VISIT_NUMBER || ' : Status Code is not Planning or Partially Released' ;
4739 l_error_tbl(j).Msg_Index := j;
4740 l_error_tbl(j).Msg_Data := l_temp;
4741 j := j + 1;*/
4742
4743 --VWPE :: tchimira :: 15-FEB -2011 :: start
4744 --As a part of the VWPE Enhancement, we need to allow the user to P2P a past dated visit that is in Planning status. For this, we need --to remove the below check.Commenting for the same.
4745 /*ELSIF TRUNC(c_visit_rec.start_date_time) < TRUNC(SYSDATE) AND c_visit_rec.STATUS_CODE <> 'PARTIALLY RELEASED'
4746 THEN
4747 IF (l_log_statement >= l_log_current_level) THEN
4748 fnd_log.string(l_log_statement,
4749 L_DEBUG_KEY,
4750 'Visit Status Code is Planning and Visit Start Date is less than sysdate. ');
4751 END IF;
4752 Fnd_Message.SET_NAME('AHL','AHL_VWP_START_DATE_LT_SYS');
4753 Fnd_Message.Set_Token('VISIT_NUMBER', c_visit_rec.VISIT_NUMBER);
4754 Fnd_Msg_Pub.ADD;
4755 /* l_error_tbl(j).Msg_Index := j;
4756 l_error_tbl(j).Msg_Data := REPLACE(FND_MESSAGE.GET_STRING(APPIN => 'AHL',
4757 NAMEIN => 'AHL_VWP_START_DATE_LT_SYS')
4758 ,'VISIT_NUMBER',c_visit_rec.VISIT_NUMBER);
4759 j := j + 1; */
4760 --VWPE :: tchimira :: 15-FEB -2011 :: end
4761 END IF;
4762 -- visit's status is null
4763 ELSE
4764 IF (l_log_statement >= l_log_current_level) THEN
4765 fnd_log.string(l_log_statement,
4766 L_DEBUG_KEY,
4767 'Visit Status Code is null.');
4768 END IF;
4769 Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_NO_STATUS');
4770 Fnd_Message.Set_Token('VISIT_NUMBER', c_visit_rec.VISIT_NUMBER);
4771 Fnd_Msg_Pub.ADD;
4772
4773 /*l_temp := 'ERROR: Visit Number ' || c_visit_rec.VISIT_NUMBER || ' : Status Code Missing' ;
4774 l_error_tbl(j).Msg_Index := j;
4775 l_error_tbl(j).Msg_Data := l_temp;
4776 j := j + 1; */
4777 END IF;
4778
4779 -- To check visit's organization is not null
4780 IF c_visit_rec.ORGANIZATION_ID IS NULL THEN
4781 IF (l_log_statement >= l_log_current_level) THEN
4782 fnd_log.string(l_log_statement,
4783 L_DEBUG_KEY,
4784 'Visit Organization is null.');
4785 END IF;
4786
4787 Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_NO_ORG');
4788 Fnd_Message.Set_Token('VISIT_NUMBER', c_visit_rec.VISIT_NUMBER);
4789 Fnd_Msg_Pub.ADD;
4790
4791 /* l_temp := 'ERROR: Visit Number ' || c_visit_rec.VISIT_NUMBER || ' : Organization Missing' ;
4792 l_error_tbl(j).Msg_Index := j;
4793 l_error_tbl(j).Msg_Data := l_temp;
4794 j := j + 1; */
4795 END IF;
4796
4797 -- To check visit's department is not null
4798 IF c_visit_rec.DEPARTMENT_ID IS NULL THEN
4799 IF (l_log_statement >= l_log_current_level) THEN
4800 fnd_log.string(l_log_statement,
4801 L_DEBUG_KEY,
4802 'Visit Department is null.');
4803 END IF;
4804
4805 Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_NO_DEPT');
4806 Fnd_Message.Set_Token('VISIT_NUMBER', c_visit_rec.VISIT_NUMBER);
4807 Fnd_Msg_Pub.ADD;
4808
4809 /* l_temp := 'ERROR: Visit Number ' || c_visit_rec.VISIT_NUMBER || ' : Department Missing';
4810 l_error_tbl(j).Msg_Index := j;
4811 l_error_tbl(j).Msg_Data := l_temp;
4812 j := j + 1; */
4813 END IF;
4814
4815 -- Start by shbhanda on 29-Jan-04
4816 -- To check visit's close date time i.e planned end date is not null
4817 IF c_visit_rec.CLOSE_DATE_TIME IS NULL AND p_module_type = 'CST' THEN -- SOSAHNI :: BUG 16061401 :: FP base bug 12929344 :: 10/01/2013 :: Added a p_module_type condition to check if action is 'Plan Visit' or 'Validate'
4818 IF (l_log_statement >= l_log_current_level) THEN
4819 fnd_log.string(l_log_statement,
4820 L_DEBUG_KEY,
4821 'Visit Plan End Date is null.');
4822 END IF;
4823
4824 Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_NO_PLN_END_DT');
4825 Fnd_Message.Set_Token('VISIT_NUMBER', c_visit_rec.VISIT_NUMBER);
4826 Fnd_Msg_Pub.ADD;
4827
4828 /* l_temp := 'ERROR: Visit Number ' || c_visit_rec.VISIT_NUMBER || ' : Planned end date missing' ;
4829 l_error_tbl(j).Msg_Index := j;
4830 l_error_tbl(j).Msg_Data := l_temp;
4831 j := j + 1; */
4832
4833 l_plan_date_flag:= 'Y'; -- SOSAHNI :: BUG 16061401 :: FP base bug 12929344 :: 10/01/2013 :: Set flag to mark error is shown to avoid further display of error message
4834 END IF;
4835 -- End by shbhanda on 29-Jan-04
4836
4837 -- SOSAHNI :: BUG 16061401 :: FP base bug 12929344 :: 10/01/2013 :: Added a p_module_type condition to check if action is 'PushToProduction'. Then only this error message is printed - start
4838 IF c_visit_rec.close_date_time IS NULL AND p_module_type = 'OAF' THEN
4839 IF (l_log_statement >= l_log_current_level) THEN
4840 fnd_log.string(l_log_statement,
4841 L_DEBUG_KEY,
4842 'Visit Plan End Date is needed for p2p.');
4843 END IF;
4844
4845 Fnd_Message.SET_NAME('AHL','AHL_VWP_PLN_END_DATE_NULL');
4846 Fnd_Message.Set_Token('VISIT_NUMBER', c_visit_rec.VISIT_NUMBER);
4847 Fnd_Msg_Pub.ADD;
4848
4849 /* l_temp := 'ERROR: Visit Number ' || c_visit_rec.VISIT_NUMBER || ' : Planned end date missing' ;
4850 l_error_tbl(j).Msg_Index := j;
4851 l_error_tbl(j).Msg_Data := l_temp;
4852 j := j + 1; */
4853
4854 l_plan_date_flag:= 'Y';
4855 END IF;
4856 -- End by SOSAHNI on 10/01/2013 for BUG 16061401 :: FP base bug 12929344
4857
4858 -- To check visit's simulation plan lies in primary plan
4859 IF c_visit_rec.SIMULATION_PLAN_ID IS NOT NULL THEN
4860 OPEN c_simulation (c_visit_rec.SIMULATION_PLAN_ID);
4861 FETCH c_simulation INTO l_count;
4862 CLOSE c_simulation;
4863 IF l_count = 0 THEN
4864 IF (l_log_statement >= l_log_current_level) THEN
4865 fnd_log.string(l_log_statement,
4866 L_DEBUG_KEY,
4867 'Visit has 0 Simulations.');
4868 END IF;
4869
4870 Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_NO_PRIM_PLAN');
4871 Fnd_Message.Set_Token('VISIT_NUMBER', c_visit_rec.VISIT_NUMBER);
4872 Fnd_Msg_Pub.ADD;
4873 END IF;
4874 END IF;
4875
4876 --sowsubra FP:Bug#5758829
4877 /*When the visit type code is not null, then validate the type code to see if
4878 the visit type is enabled and not end-dated.*/
4879 IF c_visit_rec.visit_type_code IS NOT NULL THEN
4880 IF (l_log_statement >= l_log_current_level) THEN
4881 fnd_log.string(l_log_statement,
4882 L_DEBUG_KEY,
4883 'Before calling AHL_VWP_RULES_PVT.CHECK_LOOKUP_NAME_OR_ID.');
4884 END IF;
4885
4886 AHL_VWP_RULES_PVT.CHECK_LOOKUP_NAME_OR_ID (
4887 p_lookup_type => 'AHL_PLANNING_VISIT_TYPE',
4888 p_lookup_code => trim(c_visit_rec.visit_type_code),
4889 p_meaning => NULL,
4890 p_check_id_flag => 'Y',
4891 x_lookup_code => c_visit_rec.visit_type_code,
4892 x_return_status => l_return_status);
4893
4894 IF (l_log_statement >= l_log_current_level) THEN
4895 fnd_log.string(l_log_statement,
4896 L_DEBUG_KEY,
4897 'After calling AHL_VWP_RULES_PVT.CHECK_LOOKUP_NAME_OR_ID.');
4898 END IF;
4899
4900 IF NVL(l_return_status, 'X') <> 'S' THEN
4901 Fnd_Message.SET_NAME('AHL','AHL_VWP_TYPE_CODE_NOT_EXISTS');
4902 Fnd_Msg_Pub.ADD;
4903 RAISE Fnd_Api.G_EXC_ERROR;
4904 END IF;
4905 END IF;
4906
4907 /*sowsubra - part-chgER - 18 July, 2007- start*/
4908 -- only when unit is associated with the visit then check if the item-instance
4909 IF (c_visit_rec.item_instance_id IS NOT NULL) THEN
4910 OPEN c_get_inst_item(c_visit_rec.item_instance_id);
4911 FETCH c_get_inst_item INTO c_inst_item_rec;
4912 CLOSE c_get_inst_item;
4913
4914 IF (l_log_statement >= l_log_current_level) THEN
4915 fnd_log.string(l_log_statement,
4916 L_DEBUG_KEY,
4917 'Item Id from csi instances = ' || c_inst_item_rec.inventory_item_id);
4918 fnd_log.string(l_log_statement,
4919 L_DEBUG_KEY,
4920 'Instance number from csi instances = ' || c_inst_item_rec.instance_number);
4921 fnd_log.string(l_log_statement,
4922 L_DEBUG_KEY,
4923 'Visit Item Id = ' || c_visit_rec.Inventory_Item_Id);
4924 END IF;
4925
4926 IF c_inst_item_rec.inventory_item_id = c_visit_rec.Inventory_Item_Id THEN
4927 /*sowsubra - part-chgER - end*/
4928 -- To check visit must be associated to an Active Item Instance.
4929 -- To find out if the item instances associated to the visit is still active
4930 IF c_visit_rec.Item_Instance_Id IS NOT NULL THEN
4931 OPEN c_instance (c_visit_rec.Item_Instance_Id, c_visit_rec.Inventory_Item_Id, c_visit_rec.Item_Organization_Id);
4932 FETCH c_instance INTO l_count;
4933 CLOSE c_instance;
4934 IF l_count = 0 THEN
4935
4936 Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_INST_NO_ACTIVE');
4937 Fnd_Message.Set_Token('VISIT_NUMBER', c_visit_rec.VISIT_NUMBER);
4938 Fnd_Msg_Pub.ADD;
4939 END IF;
4940 END IF;
4941 ELSE
4942 -- SKPATHAK :: Bug 8312388 :: 07-MAY-2009
4943 -- Earlier the error AHL_VWP_VST_INST_ITM_CHNGD was thrown if
4944 -- c_inst_item_rec.inventory_item_id and c_visit_rec.Inventory_Item_Id were
4945 -- not the same. This check has now been removed.
4946 IF (l_log_statement >= l_log_current_level) THEN
4947 fnd_log.string(l_log_statement, L_DEBUG_KEY,
4948 'Visit Instance has undergone part number change.');
4949 END IF;
4950 END IF;
4951 END IF; --c_visit_rec.item_instance_id IS NOT NULL
4952
4953 -- bug fix 4077103 -yazhou
4954 -- To check visit must be associated to an Active Unit.
4955 -- Also the unit must be in Complete or Incomplete status
4956 IF c_visit_rec.Item_Instance_Id IS NOT NULL THEN
4957 OPEN c_uc_status (c_visit_rec.Item_Instance_Id);
4958 FETCH c_uc_status INTO c_uc_status_rec;
4959 CLOSE c_uc_status;
4960
4961 IF c_uc_status_rec.uc_status not in ('COMPLETE','INCOMPLETE') THEN
4962
4963 IF (l_log_statement >= l_log_current_level) THEN
4964 fnd_log.string(l_log_statement,
4965 L_DEBUG_KEY,
4966 c_uc_status_rec.name || ' UC status is invalid: '|| c_uc_status_rec.uc_status);
4967 END IF;
4968
4969 Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_INVALID_UC');
4970 Fnd_Message.Set_Token('VISIT_NUMBER', c_visit_rec.VISIT_NUMBER);
4971 Fnd_Message.Set_Token('UNIT_NAME', c_uc_status_rec.name);
4972 Fnd_Msg_Pub.ADD;
4973 END IF;
4974 END IF;
4975
4976 -- To check tasks must be associated to Active Item Instances.
4977 -- To find out if the item instances associated to the tasks are still active
4978
4979 OPEN c_task (p_visit_id);
4980 LOOP
4981 FETCH c_task INTO c_task_rec;
4982 EXIT WHEN c_task%NOTFOUND;
4983
4984 /*commented out by sowsubra as a visit can be created without a unit, then the tasks
4985 present in the visit should be still validated.*/
4986 --IF c_visit_rec.Item_Instance_Id IS NOT NULL THEN
4987
4988 /*sowsubra - part-chgER - 18 July, 2007 - start*/
4989 IF (c_task_rec.instance_id IS NOT NULL) THEN
4990 OPEN c_get_inst_item(c_task_rec.instance_id);
4991 FETCH c_get_inst_item INTO c_inst_item_rec;
4992 CLOSE c_get_inst_item;
4993
4994 IF (l_log_statement >= l_log_current_level) THEN
4995 fnd_log.string(l_log_statement,
4996 L_DEBUG_KEY,
4997 'Item Id from csi instances - ' || c_inst_item_rec.inventory_item_id);
4998 fnd_log.string(l_log_statement,
4999 L_DEBUG_KEY,
5000 'Visit Item Id - ' || c_task_rec.Inventory_Item_Id);
5001 END IF;
5002
5003 IF c_inst_item_rec.inventory_item_id = c_task_rec.Inventory_Item_Id THEN
5004 IF c_task_rec.INSTANCE_ID IS NOT NULL THEN
5005 OPEN c_instance (c_task_rec.INSTANCE_ID, c_task_rec.Inventory_Item_Id, c_task_rec.Item_Organization_Id);
5006 FETCH c_instance INTO l_count;
5007 CLOSE c_instance;
5008
5009 IF l_count = 0 THEN
5010 Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_TSK_INST_NO_ACTIVE');
5011 Fnd_Message.Set_Token('TASK_NUMBER', c_task_rec.VISIT_TASK_NUMBER);
5012 Fnd_Msg_Pub.ADD;
5013 END IF;
5014 END IF;
5015 ELSE
5016 -- SKPATHAK :: Bug 8312388 :: 07-MAY-2009
5017 -- Earlier the error AHL_VWP_TSK_INST_ITM_CHNGD was thrown if
5018 -- c_inst_item_rec.inventory_item_id and c_task_rec.Inventory_Item_Id were
5019 -- not the same. This check has now been removed.
5020 IF (l_log_statement >= l_log_current_level) THEN
5021 fnd_log.string(l_log_statement, L_DEBUG_KEY,
5022 'Task Instance has undergone part number change.');
5023 END IF;
5024 END IF;
5025 END IF; -- c_task_rec.instance_id is not null
5026 /*sowsubra - part-chgER - end*/
5027 END LOOP;
5028 CLOSE c_task;
5029 --END IF; -- End for Check Instance Id presence
5030
5031 -- NR-MR Changes - sowsubra - Begin comment
5032 /* The check for instance_in_config_tree for the visit instance is redundant since
5033 in instance_in_config_tree, the visit instance is compared against itself.*/
5034 /***
5035
5036 -- To check visit must be associated to an Item Instance.
5037 -- To check all task's serial number are still active
5038 IF c_visit_rec.Item_Instance_Id IS NOT NULL THEN
5039
5040 --BEGIN: jeli added for bug 3777720
5041 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
5042 --END: jeli added for bug 3777720
5043 Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_INST_NO_FOUND');
5044 Fnd_Message.Set_Token('VISIT_NUMBER',c_visit_rec.VISIT_NUMBER);
5045 Fnd_Msg_Pub.ADD;
5046 END IF;
5047 END IF;
5048
5049 IF c_visit_rec.Item_Instance_Id IS NOT NULL THEN
5050
5051 OPEN c_task (p_visit_id);
5052 LOOP
5053 FETCH c_task INTO c_task_rec;
5054 EXIT WHEN c_task%NOTFOUND;
5055 IF c_task_rec.INSTANCE_ID IS NOT NULL THEN
5056 -- IF l_check_flag = 'N' THEN
5057 --BEGIN: jeli added for bug 3777720
5058 IF (AHL_VWP_RULES_PVT.instance_in_config_tree(p_visit_id, c_task_rec.instance_id) = FND_API.G_RET_STS_ERROR) THEN
5059 --END: jeli added for bug 3777720
5060 Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_INST_NO_FOUND');
5061 Fnd_Message.Set_Token('VISIT_NUMBER', c_visit_rec.VISIT_NUMBER);
5062 Fnd_Msg_Pub.ADD;
5063 END IF;
5064 END IF;
5065 END LOOP;
5066 CLOSE c_task;
5067
5068 -- Removed for POst 11.5.10 Changes by Senthil.
5069 -- ELSE
5070 -- IF (l_log_statement >= l_log_current_level) THEN
5071 -- fnd_log.string(l_log_statement,
5072 -- L_DEBUG_KEY,
5073 -- 'Check Visit Serial Number');
5074 -- END IF;
5075 -- l_temp := 'ERROR: Visit Number ' || c_visit_rec.VISIT_NUMBER || ' : Serial Number Missing' ;
5076 -- l_error_tbl(j).Msg_Index := j;
5077 -- l_error_tbl(j).Msg_Data := l_temp;
5078 -- j := j + 1;
5079
5080 END IF; -- End for Check Instance Id presence
5081 ***/
5082 -- NR-MR Changes - sowsubra - end comment
5083
5084 -- To check visit must be associated to a Project ID
5085 -- Check for the proejct id presence in PJM_PROJECT_PARAMETER table
5086 -- Post 11.5.10
5087 -- RROY
5088 /*
5089 IF c_visit_rec.Project_Id IS NOT NULL THEN
5090 OPEN c_Project(c_visit_rec.Project_Id);
5091 FETCH c_Project INTO l_count;
5092 CLOSE c_Project;
5093 IF l_count = 0 THEN
5094 l_temp := 'ERROR: Visit Number ' || c_visit_rec.VISIT_NUMBER || ' : This project should be included in PJM_PROJECT_PARAMETERS from PA' ;
5095 l_error_tbl(j).Msg_Index := j;
5096 l_error_tbl(j).Msg_Data := l_temp;
5097 j := j + 1;
5098 END IF;
5099 ELSE
5100 l_temp := 'ERROR: Visit Number ' || c_visit_rec.VISIT_NUMBER || ' : No Project is associated to this Visit' ;
5101 l_error_tbl(j).Msg_Index := j;
5102 l_error_tbl(j).Msg_Data := l_temp;
5103 j := j + 1;
5104 END IF;
5105 */
5106 -- Post 11.5.10
5107 -- RROY
5108
5109 -- To check all routes for visit's tasks must exists
5110 IF (l_log_statement >= l_log_current_level) THEN
5111 fnd_log.string(l_log_statement,
5112 L_DEBUG_KEY,
5113 'Initially, FLAG = ' || l_chk_flag);
5114 END IF;
5115
5116 OPEN c_route_chk (p_visit_id);
5117 l_chk_flag := 'N';
5118 LOOP
5119 FETCH c_route_chk INTO c_route_chk_rec;
5120 EXIT WHEN c_route_chk%NOTFOUND;
5121 IF c_route_chk%FOUND THEN
5122 l_chk_flag := 'Y';
5123 END IF;
5124 END LOOP;
5125 CLOSE c_route_chk;
5126
5127 IF (l_log_statement >= l_log_current_level) THEN
5128 fnd_log.string(l_log_statement,
5129 L_DEBUG_KEY,
5130 'After Route Check, FLAG = ' || l_chk_flag);
5131 END IF;
5132
5133 -- To check visit's department should have dept shifts defined
5134 OPEN c_dept (c_visit_rec.department_id);
5135 FETCH c_dept INTO l_count;
5136 CLOSE c_dept;
5137
5138 -- To find if the all visit tasks dept has department shifts defined
5139 OPEN c_dept_task (p_visit_id);
5140 i:=0;
5141 LOOP
5142 FETCH c_dept_task INTO c_dept_task_rec;
5143 EXIT WHEN c_dept_task%NOTFOUND;
5144 IF c_dept_task%FOUND THEN
5145 IF (l_log_statement >= l_log_current_level) THEN
5146 fnd_log.string(l_log_statement,
5147 L_DEBUG_KEY,
5148 'task dept' || c_dept_task_rec.department_id);
5149 END IF;
5150 OPEN c_dept (c_dept_task_rec.department_id);
5151 FETCH c_dept INTO l_dept;
5152 l_dept_Tbl(i) := l_dept;
5153 IF (l_log_statement >= l_log_current_level) THEN
5154 fnd_log.string(l_log_statement,
5155 L_DEBUG_KEY,
5156 'task dept count ' || l_dept);
5157 END IF;
5158 i := i + 1;
5159 CLOSE c_dept;
5160 END IF;
5161 END LOOP;
5162 CLOSE c_dept_task;
5163
5164 IF (l_log_statement >= l_log_current_level) THEN
5165 fnd_log.string(l_log_statement,
5166 L_DEBUG_KEY,
5167 'task dept table count ' || l_dept_Tbl.COUNT);
5168 END IF;
5169
5170 IF l_dept_Tbl.COUNT > 0 THEN
5171 l_dept_flag := 'N';
5172 x := l_dept_Tbl.FIRST;
5173 LOOP
5174 IF (l_log_statement >= l_log_current_level) THEN
5175 fnd_log.string(l_log_statement,
5176 L_DEBUG_KEY,
5177 'task dept table values ' || l_dept_Tbl(x));
5178 END IF;
5179 IF l_dept_Tbl(x) = 0 THEN
5180 l_dept_flag := 'Y';
5181 EXIT WHEN l_dept_flag = 'Y';
5182 END IF;
5183 EXIT WHEN x = l_dept_Tbl.LAST ;
5184 x := l_dept_Tbl.NEXT(x);
5185 END LOOP;
5186 END IF;
5187
5188 IF (c_visit_rec.START_DATE_TIME IS NOT NULL
5189 AND c_visit_rec.START_DATE_TIME <> Fnd_Api.g_miss_date)
5190 AND (c_visit_rec.DEPARTMENT_ID IS NOT NULL
5191 AND c_visit_rec.DEPARTMENT_ID <> Fnd_Api.g_miss_num)
5192 AND l_count > 0 AND l_chk_flag = 'N' AND l_dept_flag = 'N' THEN
5193
5194 --The visit end date
5195 -- SKPATHAK :: 02-MAY-2011 :: VWPE: ER:12424063
5196 -- Validation comparing visit's calculated and planned end is no more needed, planned end date should not be null is still valid
5197 IF c_visit_rec.close_date_time IS NULL AND l_plan_date_flag = 'N' THEN -- SOSAHNI :: BUG 16061401 :: FP base bug 12929344 :: 10/01/2013 :: Added a l_plan_date_flag condition to check if plan date error was not previously found
5198 Fnd_Message.SET_NAME('AHL','AHL_VWP_PLN_END_DATE_NULL');
5199 Fnd_Message.Set_Token('VISIT_NUMBER',
5200 c_visit_rec.VISIT_NUMBER);
5201 Fnd_Msg_Pub.ADD;
5202 END IF;
5203
5204
5205 -- To find any visit task if Tasks associated to a route/MR, must be associated to the item as set up in FMP
5206 OPEN c_task(p_visit_id);
5207 LOOP
5208 FETCH c_task INTO c_task_rec;
5209 EXIT WHEN c_task%NOTFOUND;
5210
5211 IF c_task_rec.task_type_code IS NOT NULL THEN
5212 IF UPPER(c_task_rec.task_type_code) = 'PLANNED' THEN
5213 --- Changes made by VSUNDARA for Production - SR Integration
5214 IF c_task_rec.mr_route_id is null THEN
5215 IF c_task_rec.SERVICE_REQUEST_ID is null OR c_task_rec.UNIT_EFFECTIVITY_ID is null THEN
5216 Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_NO_SR_UE'); --***** change this
5217 Fnd_Message.Set_Token('VISIT_NUMBER', c_visit_rec.VISIT_NUMBER);
5218 Fnd_Msg_Pub.ADD;
5219 END IF; --Added by jeli on 07/26/04 when merging code otherwise it couldn't pass compilation
5220 END IF; --- End Changes made by VSUNDARA for Production - SR Integration
5221 END IF;
5222 END IF;
5223
5224 IF UPPER(c_task_rec.task_type_code) = 'UNASSOCIATED' AND c_task_rec.DURATION IS NULL THEN
5225
5226 IF (l_log_statement >= l_log_current_level) THEN
5227 fnd_log.string(l_log_statement,
5228 L_DEBUG_KEY,
5229 'Unassociated Task. Task Duration is null');
5230 END IF;
5231 Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_TSK_NO_DURATION');
5232 Fnd_Message.Set_Token('TASK_NUMBER', c_task_rec.VISIT_TASK_NUMBER);
5233 Fnd_Msg_Pub.ADD;
5234 END IF; -- End for c_task_rec.task_type_code check
5235
5236 -- To find all visit tasks must be associated to an item and item instance.
5237 IF c_task_rec.instance_id IS NULL THEN
5238 IF (l_log_statement >= l_log_current_level) THEN
5239 fnd_log.string(l_log_statement,
5240 L_DEBUG_KEY,
5241 'Check Task Serial');
5242 END IF;
5243 Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_TSK_NO_SERIAL');
5244 Fnd_Message.Set_Token('TASK_NUMBER', c_task_rec.VISIT_TASK_NUMBER);
5245 Fnd_Msg_Pub.ADD;
5246 END IF;
5247
5248 IF c_task_rec.inventory_item_id IS NULL THEN
5249 IF (l_log_statement >= l_log_current_level) THEN
5250 fnd_log.string(l_log_statement,
5251 L_DEBUG_KEY,
5252 'Task Inventory Item is null.');
5253 END IF;
5254 Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_TSK_NO_ITEM');
5255 Fnd_Message.Set_Token('TASK_NUMBER', c_task_rec.VISIT_TASK_NUMBER);
5256 Fnd_Msg_Pub.ADD;
5257 END IF;
5258
5259 -- Begin changes by rnahata for Bug 6448678
5260 IF (l_log_statement >= l_log_current_level) THEN
5261 fnd_log.string(l_log_statement,
5262 L_DEBUG_KEY,
5263 'Before calling Validate_MR_Route_Date. l_msg_count = ' || l_msg_count);
5264 END IF;
5265
5266 -- SKPATHAK :: ER:12730539 :: 01-AUG-2011
5267 -- If the task's summary task is in partially implemented, need not validate MR and routes
5268 OPEN get_task_status (c_task_rec.originating_task_id);
5269 FETCH get_task_status INTO l_task_status;
5270 CLOSE get_task_status;
5271 IF l_task_status <> 'PARTIALLY RELEASED' THEN
5272
5273 Validate_MR_Route_Date(
5274 p_mr_route_id => c_task_rec.mr_route_id,
5275 p_visit_task_number => c_task_rec.visit_task_number,
5276 p_start_date_time => sysdate,
5277 p_end_date_time => sysdate);
5278
5279 IF (l_log_statement >= l_log_current_level) THEN
5280 fnd_log.string(l_log_statement,
5281 L_DEBUG_KEY,
5282 'After calling Validate_MR_Route_Date for Task Id: ' ||
5283 c_task_rec.visit_task_id || ' and l_msg_count = ' || l_msg_count);
5284 END IF;
5285 -- End changes by rnahata for Bug 6448678
5286 END IF;
5287
5288 END LOOP; -- End of loop to check c_task cursor
5289 CLOSE c_task;
5290
5291 ELSE
5292
5293 IF c_visit_rec.DEPARTMENT_ID IS NOT NULL AND l_count = 0 THEN -- SOSAHNI :: BUG 16061392 :: FP base bug :: 12990824 :: 10/01/2013 :: Added check for Department ID not null
5294 Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_NO_DEPT_SHIFT');
5295 Fnd_Message.Set_Token('VISIT_NUMBER', c_visit_rec.VISIT_NUMBER);
5296 Fnd_Msg_Pub.ADD;
5297 END IF;
5298
5299 IF l_chk_flag = 'Y' THEN
5300 Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_RT_EXISTS');
5301 Fnd_Message.Set_Token('VISIT_NUMBER', c_visit_rec.VISIT_NUMBER);
5302 Fnd_Msg_Pub.ADD;
5303 END IF;
5304
5305 IF l_dept_flag = 'Y' THEN
5306 OPEN c_dept_tsk (p_visit_id);
5307 LOOP
5308 FETCH c_dept_tsk INTO c_dept_tsk_rec;
5309 EXIT WHEN c_dept_tsk%NOTFOUND;
5310 IF c_dept_tsk%FOUND THEN
5311 IF (l_log_statement >= l_log_current_level) THEN
5312 fnd_log.string(l_log_statement,
5313 L_DEBUG_KEY,
5314 'Task Dept' || c_dept_tsk_rec.department_id);
5315 END IF;
5316 OPEN c_dept (c_dept_tsk_rec.department_id);
5317 FETCH c_dept INTO l_dept;
5318 IF l_dept = 0 THEN
5319 IF (l_log_statement >= l_log_current_level) THEN
5320 fnd_log.string(l_log_statement,
5321 L_DEBUG_KEY,
5322 'Task Dept Count ' || l_dept);
5323 END IF;
5324 Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_NO_DEPT_SHIFT');
5325 Fnd_Message.Set_Token('TASK_NUMBER', c_dept_tsk_rec.VISIT_TASK_NUMBER);
5326 Fnd_Msg_Pub.ADD;
5327 END IF;
5328 CLOSE c_dept;
5329 END IF;
5330 END LOOP;
5331 CLOSE c_dept_tsk;
5332 END IF;
5333 END IF;
5334
5335 /* MANESING::Component Maintenance Planning Project, 05-Jul-2011
5336 * Following validation needs to be bypassed for Component Visits, else it will fail when
5337 * the Component Visit is in Planning status, and it contains only Repair Batches (summary tasks).
5338 */
5339 IF c_task_rec.visit_task_id IS NULL AND c_visit_rec.STATUS_CODE = 'PLANNING' AND
5340 AHL_CMP_UTIL_PKG.Is_Comp_Visit (c_visit_rec.visit_id) = 'N' THEN
5341
5342 IF (l_log_statement >= l_log_current_level) THEN
5343 fnd_log.string(l_log_statement,
5344 L_DEBUG_KEY,
5345 'No Task Found for the Visit');
5346 END IF;
5347
5348 Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_TASK_NULL');
5349 Fnd_Message.Set_Token('VISIT_NUMBER', c_visit_rec.VISIT_NUMBER);
5350 Fnd_Msg_Pub.ADD;
5351
5352 END IF;
5353 END IF;
5354
5355 -- SKPATHAK :: ER:12730539 :: 01-AUG-2011 :: START :: Validate Return to Supply Flags
5356 IF (l_log_statement >= l_log_current_level) THEN
5357 fnd_log.string(l_log_statement,
5358 L_DEBUG_KEY,
5359 'Before Calling AHL_VWP_RULES_PVT.Validate_Return_To_Supply. p_visit_id = ' || p_visit_id );
5360 END IF;
5361
5362 IF (p_visit_id IS NOT NULL AND p_module_type NOT IN ('CST','TSK','MR')) THEN
5363
5364 AHL_VWP_RULES_PVT.Validate_Return_To_Supply
5365 (
5366 p_api_version => 1.0,
5367 p_init_msg_list => FND_API.G_FALSE,
5368 p_commit => FND_API.G_FALSE,
5369 p_validation_level => FND_API.G_VALID_LEVEL_FULL,
5370 p_module_type => 'VST',
5371 p_visit_id => p_visit_id,
5372 p_tasks_tbl => l_val_task_tbl,
5373 x_return_status => l_return_status,
5374 x_msg_count => l_msg_count,
5375 x_msg_data => l_msg_data
5376 );
5377
5378 IF (l_log_statement >= l_log_current_level) THEN
5379 fnd_log.string(l_log_statement,
5380 L_DEBUG_KEY,
5381 'After Calling AHL_VWP_RULES_PVT.Validate_Return_To_Supply. Return Status = ' || l_return_status );
5382 END IF;
5383
5384 IF l_return_status <> 'S' THEN
5385 -- SOSAHNI :: BUG 16089769 :: FP base bug 14098719 :: 10/01/2013 :: Added a loop to include all error messages in error table for showing error message on UI - Start
5386 /*l_error_tbl(1).Msg_Index := 1;
5387 l_error_tbl(1).Msg_Data := l_msg_data;*/
5388
5389 j := 1;
5390 l_msg_count := Fnd_Msg_Pub.count_msg;
5391 FOR i IN 1..l_msg_count LOOP
5392 FND_MSG_PUB.get (
5393 p_msg_index => i,
5394 p_encoded => FND_API.G_FALSE,
5395 p_data => x_msg_data,
5396 p_msg_index_out => x_msg_count);
5397 l_error_tbl(j).Msg_Index := j;
5398 l_error_tbl(j).Msg_Data := x_msg_data;
5399 j := j + 1;
5400 END LOOP;
5401 -- End by SOSAHNI on 10/01/2013 for BUG 16089769 :: FP base bug 14098719
5402 x_error_tbl := l_error_tbl;
5403 RAISE Fnd_Api.g_exc_error;
5404 END IF;
5405
5406 END IF;
5407 -- SKPATHAK :: ER:12730539 :: 01-AUG-2011 :: END
5408
5409 l_msg_count := Fnd_Msg_Pub.count_msg;
5410
5411 IF (l_log_statement >= l_log_current_level) THEN
5412 fnd_log.string(l_log_statement,
5413 L_DEBUG_KEY,
5414 'After calling *count_msg* l_count = ' || l_msg_count);
5415 fnd_log.string(l_log_statement,
5416 L_DEBUG_KEY,
5417 'Start calling Fnd_Msg_Pub.GET');
5418 END IF;
5419
5420 j := 1;
5421
5422 FOR i IN 1..l_msg_count LOOP
5423
5424 IF (l_log_statement >= l_log_current_level) THEN
5425 fnd_log.string(l_log_statement,
5426 L_DEBUG_KEY,
5427 '------------------------------------------------');
5428 END IF;
5429
5430 FND_MSG_PUB.get (
5431 p_msg_index => i, -- SOSAHNI :: BUG 16061401 :: FP base bug 12929344 :: 10/01/2013 :: Found this error while testing for this bug. Error message is not displayed when error count is one. Hence added the parameter
5432 p_encoded => FND_API.G_FALSE,
5433 p_data => l_data,
5434 p_msg_index_out => l_msg_count);
5435 IF (l_log_statement >= l_log_current_level) THEN
5436 fnd_log.string(l_log_statement,
5437 L_DEBUG_KEY,
5438 'Error Message : '||l_data);
5439 END IF;
5440 l_error_tbl(j).Msg_Index := j;
5441 l_error_tbl(j).Msg_Data := l_data;
5442 j := j + 1;
5443
5444 END LOOP;
5445 IF (l_log_statement >= l_log_current_level) THEN
5446 fnd_log.string(l_log_statement,
5447 L_DEBUG_KEY,
5448 'End calling Fnd_Msg_Pub.GET');
5449 END IF;
5450
5451 x_error_tbl := l_error_tbl;
5452
5453 -------------------- finish --------------------------
5454 -- END of API body.
5455 -- Standard check of p_commit.
5456
5457 IF Fnd_Api.To_Boolean (p_commit) THEN
5458 COMMIT WORK;
5459 END IF;
5460
5461 Fnd_Msg_Pub.count_and_get(
5462 p_encoded => Fnd_Api.g_false,
5463 p_count => x_msg_count,
5464 p_data => x_msg_data
5465 );
5466
5467 IF (l_log_procedure >= l_log_current_level) THEN
5468 fnd_log.string(l_log_procedure,
5469 L_DEBUG_KEY ||'.end',
5470 'At the end of PL SQL procedure. Return Status = ' || x_return_status);
5471 END IF;
5472
5473 EXCEPTION
5474 WHEN Fnd_Api.g_exc_error THEN
5475 ROLLBACK TO Validate_Before_Production;
5476 x_return_status := Fnd_Api.g_ret_sts_error;
5477 Fnd_Msg_Pub.count_and_get (
5478 p_encoded => Fnd_Api.g_false,
5479 p_count => x_msg_count,
5480 p_data => x_msg_data
5481 );
5482 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
5483 ROLLBACK TO Validate_Before_Production;
5484 x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
5485 Fnd_Msg_Pub.count_and_get (
5486 p_encoded => Fnd_Api.g_false,
5487 p_count => x_msg_count,
5488 p_data => x_msg_data
5489 );
5490 WHEN OTHERS THEN
5491 ROLLBACK TO Validate_Before_Production;
5492 x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
5493 IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_unexp_error)
5494 THEN
5495 Fnd_Msg_Pub.add_exc_msg (G_PKG_NAME, l_api_name);
5496 END IF;
5497 Fnd_Msg_Pub.count_and_get (
5498 p_encoded => Fnd_Api.g_false,
5499 p_count => x_msg_count,
5500 p_data => x_msg_data
5501 );
5502 END Validate_Before_Production;
5503
5504 --------------------------------------------------------------------
5505 -- PROCEDURE
5506 -- Get_Task_Relationships
5507 --
5508 -- PURPOSE
5509 -- To get all the Relationships for the Visit Task.
5510 --------------------------------------------------------------------
5511
5512 PROCEDURE Get_Task_Relationships
5513 ( p_visit_id IN NUMBER,
5514 p_visit_number IN NUMBER,
5515 p_visit_task_id IN NUMBER,
5516 p_x_relationship_tbl IN OUT NOCOPY AHL_PRD_WORKORDER_PVT.prd_workorder_rel_tbl
5517 ) IS
5518
5519 CURSOR get_mwo_wip_entity_id(x_visit_id IN NUMBER) IS
5520 SELECT wip_entity_id
5521 FROM AHL_WORKORDERS
5522 WHERE visit_id = x_visit_id
5523 AND VISIT_TASK_ID IS NULL
5524 AND MASTER_WORKORDER_FLAG = 'Y';
5525
5526 CURSOR get_task_dtls(c_visit_task_id IN NUMBER) IS
5527 SELECT visit_task_number, task_type_code, SERVICE_REQUEST_ID, MR_ID, originating_task_id
5528 FROM AHL_VISIT_TASKS_B
5529 WHERE visit_task_id = c_visit_task_id;
5530
5531 -- Get all the Parent Task Records For the Visit Task
5532 CURSOR get_parent_task_dtls(c_visit_task_id NUMBER) IS
5533 SELECT PARENT.visit_task_number, PARENT.visit_task_id
5534 FROM AHL_VISIT_TASKS_B PARENT, AHL_VISIT_TASKS_B CHILD
5535 WHERE PARENT.visit_task_id = CHILD.originating_task_id
5536 AND CHILD.visit_task_id = c_visit_task_id;
5537
5538 CURSOR does_wo_exist_csr(c_visit_task_id NUMBER) IS
5539 SELECT 1 FROM AHL_WORKORDERS
5540 WHERE VISIT_TASK_ID = c_visit_task_id;
5541
5542 CURSOR get_wip_entity_id(c_visit_task_id NUMBER) IS
5543 SELECT wip_entity_id FROM AHL_WORKORDERS
5544 WHERE VISIT_TASK_ID = c_visit_task_id;
5545
5546 L_API_NAME CONSTANT VARCHAR2(30) := 'Get_Task_Relationships';
5547 L_DEBUG_KEY CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
5548 rel_count NUMBER;
5549 l_task_wip_id NUMBER := 0;
5550 l_visit_task_no NUMBER;
5551 l_visit_task_type VARCHAR2(30);
5552 l_orig_task_id NUMBER := 0;
5553 l_parent_task_number NUMBER;
5554 l_parent_visit_task_id NUMBER;
5555 l_mwo_wip_entity_id NUMBER;
5556 l_parent_task_wip_id NUMBER := 0;
5557 l_sr_id NUMBER := 0;
5558 l_mr_id NUMBER := 0;
5559
5560 BEGIN
5561
5562 IF (l_log_procedure >= l_log_current_level) THEN
5563 fnd_log.string(l_log_procedure,
5564 L_DEBUG_KEY ||'.begin',
5565 'At the start of PL SQL procedure.');
5566 fnd_log.string(l_log_procedure,
5567 L_DEBUG_KEY,
5568 'Visit Id = ' || p_visit_id ||
5569 ', Visit Number = ' || p_visit_number ||
5570 ', Visit Task Id = ' || p_visit_task_id);
5571 END IF;
5572
5573 rel_count := p_x_relationship_tbl.COUNT;
5574
5575 -- Create relationship only if WO doesn't exist for p_task_id
5576 OPEN does_wo_exist_csr(p_visit_task_id);
5577 FETCH does_wo_exist_csr INTO l_task_wip_id;
5578 IF does_wo_exist_csr%FOUND THEN
5579 CLOSE does_wo_exist_csr;
5580 RETURN;
5581 END IF;
5582 CLOSE does_wo_exist_csr;
5583
5584 OPEN get_task_dtls(p_visit_task_id);
5585 FETCH get_task_dtls into l_visit_task_no, l_visit_task_type, l_sr_id, l_mr_id, l_orig_task_id;
5586 CLOSE get_task_dtls;
5587
5588 OPEN get_parent_task_dtls(p_visit_task_id);
5589 FETCH get_parent_task_dtls INTO l_parent_task_number, l_parent_visit_task_id;
5590 CLOSE get_parent_task_dtls;
5591
5592 OPEN get_mwo_wip_entity_id(p_visit_id);
5593 FETCH get_mwo_wip_entity_id INTO l_mwo_wip_entity_id;
5594 CLOSE get_mwo_wip_entity_id;
5595
5596 OPEN get_wip_entity_id(l_parent_visit_task_id);
5597 FETCH get_wip_entity_id INTO l_parent_task_wip_id;
5598 CLOSE get_wip_entity_id;
5599
5600 IF (l_log_statement >= l_log_current_level) THEN
5601 fnd_log.string(l_log_statement,
5602 L_DEBUG_KEY,
5603 'Total Relationships : ' || rel_count);
5604 fnd_log.string(l_log_statement,
5605 L_DEBUG_KEY,
5606 'Getting Parent Tasks for task : ' || l_visit_task_no);
5607 END IF;
5608
5609 rel_count := rel_count + 1;
5610 p_x_relationship_tbl(rel_count).batch_id := p_visit_number;
5611 p_x_relationship_tbl(rel_count).dml_operation := 'C';
5612 p_x_relationship_tbl(rel_count).relationship_type := 1;
5613 p_x_relationship_tbl(rel_count).child_header_id := l_visit_task_no;
5614
5615 IF (l_orig_task_id IS NOT NULL) THEN
5616 p_x_relationship_tbl(rel_count).parent_wip_entity_id := l_parent_task_wip_id;
5617 p_x_relationship_tbl(rel_count).parent_header_id := l_parent_task_number;
5618 ELSE
5619 -- If the Originating Task is null, make the the Visit's MWO as the parent of this task's WO
5620 p_x_relationship_tbl(rel_count).parent_wip_entity_id := l_mwo_wip_entity_id;
5621 p_x_relationship_tbl(rel_count).parent_header_id := 0;
5622 END IF;
5623
5624 IF (l_log_statement >= l_log_current_level) THEN
5625 fnd_log.string(l_log_statement,
5626 L_DEBUG_KEY,
5627 'Total Relationships : ' || rel_count);
5628 fnd_log.string(l_log_statement,
5629 L_DEBUG_KEY,
5630 'All tasks obtained for task : ' || l_visit_task_no);
5631 END IF;
5632
5633 IF (l_log_procedure >= l_log_current_level) THEN
5634 fnd_log.string(l_log_procedure,
5635 L_DEBUG_KEY ||'.end',
5636 'At the end of PL SQL procedure. p_x_relationship_tbl.COUNT = ' ||
5637 p_x_relationship_tbl.COUNT);
5638 END IF;
5639
5640 END Get_Task_Relationships;
5641
5642 --------------------------------------------------------------------
5643 -- PROCEDURE
5644 -- Get_Visit_Relationships
5645 --
5646 -- PURPOSE
5647 -- To get all the Relationships for the Visit. These include :
5648 -- 1.A record for Each MR to MR / Visit Relationship.
5649 -- 2.A record for Each Visit Task to MR Relationship.
5650 -- 3.A record for Each Visit Task to Visit Relationship for Unassociated Tasks.
5651 --------------------------------------------------------------------
5652
5653 PROCEDURE Get_Visit_Relationships
5654 (
5655 p_visit_id IN NUMBER,
5656 p_visit_number IN NUMBER,
5657 p_x_relationship_tbl IN OUT NOCOPY AHL_PRD_WORKORDER_PVT.prd_workorder_rel_tbl
5658 )
5659 AS
5660 L_API_VERSION CONSTANT NUMBER := 1.0;
5661 L_API_NAME CONSTANT VARCHAR2(30) := 'Get_Visit_Relationships';
5662 L_DEBUG_KEY CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
5663 l_wip_entity_id NUMBER;
5664 l_parent_wip_entity_id NUMBER;
5665 rel_count NUMBER := 0;
5666 mr_count NUMBER := 0;
5667
5668 /*-- Get all the Task Records corresponding to a MR.
5669 CURSOR get_mrs_for_visit(c_visit_id NUMBER)
5670 IS
5671 SELECT visit_task_id,
5672 visit_task_number,
5673 NVL(originating_task_id, -1)
5674 FROM AHL_VISIT_TASKS_B
5675 WHERE visit_id = c_visit_id
5676 AND task_type_code='SUMMARY'
5677 AND mr_id IS NOT NULL
5678 ORDER BY 3;*/
5679
5680 /* Changes made by VSUNDARA for SR INTEGRATION*/
5681 -- Get all the Task Records corresponding to a MR.
5682 CURSOR get_mrs_for_visit(c_visit_id NUMBER)
5683 IS
5684 SELECT visit_task_id,
5685 visit_task_number,
5686 NVL(originating_task_id, -1)
5687 FROM AHL_VISIT_TASKS_B
5688 WHERE visit_id = c_visit_id
5689 AND task_type_code='SUMMARY'
5690 AND (mr_id IS NOT NULL OR unit_effectivity_id IS NOT NULL)
5691 AND NVL(STATUS_CODE, 'X') <> 'DELETED'
5692 -- SKPATHAK :: Bug 9444849 :: 19-MAR-2010
5693 -- This condition added during bug #4075702 fix is not needed
5694 -- since after opening this cursor we have a check if the visit task id fetched by this cursor already has a corresponding WO
5695 -- so only for tasks in planning we are building the relationships
5696 -- Also it is necessary to remove this condition to fix the bug 9444849, since the parent task can be implemented as well
5697 --AND NVL(STATUS_CODE, 'X') = 'PLANNING' --Srini Bug #4075702
5698 ORDER BY 3;
5699 /* End */
5700
5701 TYPE mr_task_rec_type IS RECORD
5702 (
5703 visit_task_id NUMBER,
5704 visit_task_number NUMBER,
5705 originating_task_id NUMBER
5706 );
5707
5708 TYPE mr_task_tbl_type IS TABLE OF mr_task_rec_type INDEX BY BINARY_INTEGER;
5709
5710 l_mrs_for_visit mr_task_tbl_type;
5711
5712 -- Get all the Tasks associated to a MR.
5713 CURSOR get_tasks_for_mr(c_visit_id NUMBER, c_mr_task_id NUMBER)
5714 IS
5715 SELECT visit_task_number, visit_task_id
5716 FROM AHL_VISIT_TASKS_B
5717 WHERE visit_id = c_visit_id
5718 AND originating_task_id = c_mr_task_id
5719 AND task_type_code <> 'SUMMARY'
5720 AND NVL(STATUS_CODE, 'X') = 'PLANNING' --Srini Bug #4075702
5721 AND NVL(STATUS_CODE, 'X') <> 'DELETED';
5722
5723 --SKPATHAK :: VWPE ER-12424063 :: 09-JUN-2011 :: For relationship, consider stage tasks as well
5724 -- Get all the Unassociated Tasks and Stage Tasks.
5725 CURSOR get_unassoc_stage_tasks(c_visit_id NUMBER)
5726 IS
5727 SELECT visit_task_number, visit_task_id
5728 FROM AHL_VISIT_TASKS_B
5729 WHERE visit_id = c_visit_id
5730 AND NVL(STATUS_CODE, 'X') = 'PLANNING'
5731 AND task_type_code IN ('UNASSOCIATED','STAGE');
5732
5733 -- yazhou 27-Jun-2006 starts
5734 -- fix along with bug#5377347, should get the active job for the task only
5735
5736 CURSOR get_wo(c_visit_task_id NUMBER)
5737 IS
5738 SELECT wip_entity_id
5739 FROM AHL_WORKORDERS
5740 WHERE VISIT_TASK_ID = c_visit_task_id
5741 -- SKPATHAK :: Bug 9940275 :: 18-AUG-2010 :: Removed status '7' from below condtn
5742 -- This cursor is used to check if a visit task has a corresponding WO and if not, WO relationship needs to be created
5743 -- So even if the status is 7 (cancelled), cursor must fetch the result, since relationship need not be created in this case
5744 AND STATUS_CODE <> '22';
5745
5746 CURSOR get_parent_wo(c_visit_task_id NUMBER)
5747 IS
5748 SELECT wip_entity_id
5749 FROM AHL_WORKORDERS
5750 WHERE VISIT_TASK_ID = c_visit_task_id
5751 AND STATUS_CODE NOT IN ('22','7');
5752 -- yazhou 27-Jun-2006 ends
5753
5754 CURSOR get_mwo(c_visit_id NUMBER)
5755 IS
5756 SELECT wip_entity_id
5757 FROM AHL_WORKORDERS
5758 WHERE visit_id = c_visit_id
5759 AND VISIT_TASK_ID IS NULL
5760 AND MASTER_WORKORDER_FLAG = 'Y'
5761 AND STATUS_CODE NOT IN ('7', '22');
5762
5763 BEGIN
5764
5765 IF (l_log_procedure >= l_log_current_level) THEN
5766 fnd_log.string(l_log_procedure,L_DEBUG_KEY||'.begin','At the start of PLSQL procedure');
5767 END IF;
5768
5769 rel_count := p_x_relationship_tbl.COUNT;
5770 -- Get all the Task Records corresponding to a MR for the Visit.
5771 OPEN get_mrs_for_visit(p_visit_id);
5772 LOOP
5773 EXIT WHEN get_mrs_for_visit%NOTFOUND;
5774 mr_count := mr_count + 1;
5775 FETCH get_mrs_for_visit
5776 INTO l_mrs_for_visit(mr_count).visit_task_id,
5777 l_mrs_for_visit(mr_count).visit_task_number,
5778 l_mrs_for_visit(mr_count).originating_task_id;
5779 END LOOP;
5780 CLOSE get_mrs_for_visit;
5781
5782 IF (l_log_statement >= l_log_current_level) THEN
5783 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Total MRs for Visit : '||l_mrs_for_visit.COUNT);
5784 END IF;
5785
5786 IF (l_mrs_for_visit.COUNT > 0) THEN
5787 FOR i IN l_mrs_for_visit.FIRST..l_mrs_for_visit.LAST LOOP
5788 -- if the visit task already has a workorder then do not
5789 -- create a relationship for it
5790 OPEN get_wo(l_mrs_for_visit(i).visit_task_id);
5791 FETCH get_wo INTO l_wip_entity_id;
5792 IF get_wo%NOTFOUND THEN
5793 rel_count := rel_count + 1;
5794 p_x_relationship_tbl(rel_count).batch_id := p_visit_number;
5795 p_x_relationship_tbl(rel_count).child_header_id := l_mrs_for_visit(i).visit_task_number;
5796 p_x_relationship_tbl(rel_count).relationship_type := 1;
5797 p_x_relationship_tbl(rel_count).dml_operation := 'C';
5798 -- Loop to Find out Parent MRs
5799 IF (l_mrs_for_visit(i).originating_task_id <> -1) THEN
5800 FOR j IN l_mrs_for_visit.FIRST..l_mrs_for_visit.LAST LOOP
5801 IF (l_mrs_for_visit(i).originating_task_id = l_mrs_for_visit(j).visit_task_id) THEN
5802 p_x_relationship_tbl(rel_count).parent_header_id := l_mrs_for_visit(j).visit_task_number;
5803 OPEN get_parent_wo(l_mrs_for_visit(j).visit_task_id);
5804 FETCH get_parent_wo INTO l_parent_wip_entity_id;
5805 IF get_parent_wo%FOUND THEN
5806 p_x_relationship_tbl(rel_count).parent_wip_entity_id := l_parent_wip_entity_id;
5807 END IF;
5808 CLOSE get_parent_wo;
5809 EXIT;
5810 END IF;
5811 END LOOP;
5812 END IF;
5813 -- If no Parent MR is found set the parent as the Visit
5814 IF (p_x_relationship_tbl(rel_count).parent_header_id IS NULL) THEN
5815 p_x_relationship_tbl(rel_count).parent_header_id := 0;
5816 OPEN get_mwo(p_visit_id);
5817 FETCH get_mwo INTO l_parent_wip_entity_id;
5818 IF get_mwo%FOUND THEN
5819 p_x_relationship_tbl(rel_count).parent_wip_entity_id := l_parent_wip_entity_id;
5820 END IF;
5821 CLOSE get_mwo;
5822 END IF;
5823 END IF;
5824 CLOSE get_wo;
5825 END LOOP;
5826 END IF;
5827
5828 IF (l_log_statement >= l_log_current_level) THEN
5829 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Getting Tasks for MRs');
5830 END IF;
5831 -- Get all the Tasks for a MR.
5832 IF (l_mrs_for_visit.COUNT > 0) THEN
5833 FOR i IN l_mrs_for_visit.FIRST..l_mrs_for_visit.LAST LOOP
5834 FOR mr_tasks_cursor IN get_tasks_for_mr(p_visit_id, l_mrs_for_visit(i).visit_task_id) LOOP
5835 OPEN get_wo(mr_tasks_cursor.visit_task_id);
5836 FETCH get_wo INTO l_wip_entity_id;
5837 IF get_wo%NOTFOUND THEN
5838 rel_count := rel_count + 1;
5839 p_x_relationship_tbl(rel_count).batch_id := p_visit_number;
5840 p_x_relationship_tbl(rel_count).parent_header_id := l_mrs_for_visit(i).visit_task_number;
5841 p_x_relationship_tbl(rel_count).child_header_id := mr_tasks_cursor.visit_task_number;
5842 p_x_relationship_tbl(rel_count).relationship_type := 1;
5843 p_x_relationship_tbl(rel_count).dml_operation := 'C';
5844 -- if this visit task is already in shop floor then get the wip_entity_id
5845 OPEN get_parent_wo(l_mrs_for_visit(i).visit_task_id);
5846 FETCH get_parent_wo INTO l_parent_wip_entity_id;
5847 IF get_parent_wo%FOUND THEN
5848 p_x_relationship_tbl(rel_count).parent_wip_entity_id := l_parent_wip_entity_id;
5849 END IF;
5850 CLOSE get_parent_wo;
5851 END IF;
5852 CLOSE get_wo;
5853 END LOOP;
5854 END LOOP;
5855 END IF;
5856
5857 IF (l_log_statement >= l_log_current_level) THEN
5858 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Getting Unassociated Tasks for Visit');
5859 END IF;
5860
5861 -- Get all Un-associated Tasks for a Visit.
5862 OPEN get_mwo(p_visit_id);
5863 FETCH get_mwo INTO l_parent_wip_entity_id;
5864 IF get_mwo%NOTFOUND THEN
5865 l_parent_wip_entity_id := 0;
5866 END IF;
5867 CLOSE get_mwo;
5868
5869 --SKPATHAK :: VWPE ER-12424063 :: 09-JUN-2011 :: For relationship, consider stage tasks as well
5870 FOR tsk_cursor IN get_unassoc_stage_tasks(p_visit_id) LOOP
5871 OPEN get_wo(tsk_cursor.visit_task_id);
5872 FETCH get_wo INTO l_wip_entity_id;
5873 IF get_wo%NOTFOUND THEN
5874 rel_count := rel_count + 1;
5875 p_x_relationship_tbl(rel_count).batch_id := p_visit_number;
5876 p_x_relationship_tbl(rel_count).parent_header_id := 0; -- Visit
5877 p_x_relationship_tbl(rel_count).child_header_id := tsk_cursor.visit_task_number;
5878 p_x_relationship_tbl(rel_count).relationship_type := 1;
5879 p_x_relationship_tbl(rel_count).dml_operation := 'C';
5880 p_x_relationship_tbl(rel_count).parent_wip_entity_id := l_parent_wip_entity_id;
5881 END IF;
5882 CLOSE get_wo;
5883 END LOOP;
5884
5885 IF (l_log_procedure >= l_log_current_level) THEN
5886 fnd_log.string(l_log_procedure,L_DEBUG_KEY,'Total Relationships : ' || p_x_relationship_tbl.COUNT );
5887 fnd_log.string(l_log_procedure,L_DEBUG_KEY||'.end','At the end of PLSQL procedure');
5888 END IF;
5889
5890 END Get_Visit_Relationships;
5891
5892 --------------------------------------------------------------------
5893 -- PROCEDURE
5894 -- Get_Task_Dependencies
5895 --
5896 -- PURPOSE
5897 -- To get all the Technical Dependencies for the Visit Task.
5898 --------------------------------------------------------------------
5899
5900 PROCEDURE Get_Task_Dependencies
5901 (
5902 p_visit_number IN NUMBER,
5903 p_visit_task_id IN NUMBER,
5904 p_visit_task_number IN NUMBER,
5905 p_x_relationship_tbl IN OUT NOCOPY AHL_PRD_WORKORDER_PVT.prd_workorder_rel_tbl
5906 )
5907 AS
5908 L_API_VERSION CONSTANT NUMBER := 1.0;
5909 L_API_NAME CONSTANT VARCHAR2(30) := 'Get_Task_Dependencies';
5910 L_DEBUG_KEY CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
5911
5912 -- Get all the Task Dependencies.
5913 CURSOR get_tech_dependencies(c_visit_task_id NUMBER)
5914 IS
5915 SELECT PARENT.visit_task_number parent_task_number,
5916 CHILD.visit_task_number child_task_number
5917 FROM AHL_VISIT_TASKS_B PARENT,
5918 AHL_VISIT_TASKS_B CHILD,
5919 AHL_TASK_LINKS LINK
5920 WHERE PARENT.visit_task_id = LINK.parent_task_id
5921 AND CHILD.visit_task_id = LINK.visit_task_id
5922 AND NVL(PARENT.STATUS_CODE,'X') = 'PLANNING'
5923 AND NVL(CHILD.STATUS_CODE,'X') = 'PLANNING'
5924 AND (PARENT.visit_task_id = c_visit_task_id
5925 OR CHILD.visit_task_id = c_visit_task_id);
5926
5927 l_visit_task_number NUMBER;
5928 rel_count NUMBER;
5929 dup_found BOOLEAN;
5930
5931 BEGIN
5932
5933 IF (l_log_procedure >= l_log_current_level) THEN
5934 fnd_log.string(l_log_procedure,
5935 L_DEBUG_KEY ||'.begin',
5936 'At the start of PL SQL procedure.');
5937 fnd_log.string(l_log_procedure,
5938 L_DEBUG_KEY,
5939 'Visit Number = ' || p_visit_number ||
5940 ', Visit Task Id = ' || p_visit_task_id ||
5941 ', Visit Task Number = ' || p_visit_task_number);
5942 END IF;
5943
5944 rel_count := p_x_relationship_tbl.COUNT;
5945
5946 IF (l_log_statement >= l_log_current_level) THEN
5947 fnd_log.string(l_log_statement,
5948 L_DEBUG_KEY,
5949 'Total dependencies = ' || rel_count);
5950 END IF;
5951 -- Get the Technical Dependencies between Visit Tasks for a Visit.
5952 FOR tsk_cursor IN get_tech_dependencies(p_visit_task_id) LOOP
5953
5954 dup_found := FALSE;
5955 --Do not insert the row if it already exists in relationship table.
5956 --SKPATHAK :: VWPE: ER:12424063 :: 13-JUN-2012
5957 IF rel_count > 0 THEN
5958 FOR i IN p_x_relationship_tbl.FIRST..p_x_relationship_tbl.LAST LOOP
5959 IF (p_x_relationship_tbl(i).relationship_type = 2 AND
5960 p_x_relationship_tbl(i).parent_header_id = tsk_cursor.parent_task_number AND
5961 p_x_relationship_tbl(i).child_header_id = tsk_cursor.child_task_number) THEN
5962 dup_found := TRUE;
5963 EXIT;
5964 END IF;
5965 END LOOP;
5966 END IF;
5967
5968 IF (dup_found = FALSE) THEN
5969 rel_count := rel_count + 1;
5970 p_x_relationship_tbl(rel_count).batch_id := p_visit_number;
5971 p_x_relationship_tbl(rel_count).parent_header_id := tsk_cursor.parent_task_number;
5972 p_x_relationship_tbl(rel_count).child_header_id := tsk_cursor.child_task_number;
5973 p_x_relationship_tbl(rel_count).relationship_type := 2;
5974 p_x_relationship_tbl(rel_count).dml_operation := 'C';
5975 END IF;
5976
5977 END LOOP;
5978
5979 IF (l_log_procedure >= l_log_current_level ) THEN
5980 fnd_log.string(l_log_procedure,
5981 L_DEBUG_KEY,
5982 'Total dependencies for Visit Task ' || p_visit_task_number ||
5983 'is: '|| rel_count);
5984 fnd_log.string(l_log_procedure,
5985 L_DEBUG_KEY ||'.end',
5986 'At the end of PL SQL procedure.');
5987 END IF;
5988
5989 END Get_Task_Dependencies;
5990
5991 --------------------------------------------------------------------
5992 -- PROCEDURE
5993 -- Get_Visit_Dependencies
5994 --
5995 -- PURPOSE
5996 -- To get all the Technical Dependencies for the Visit.
5997 --------------------------------------------------------------------
5998
5999 PROCEDURE Get_Visit_Dependencies
6000 (
6001 p_visit_id IN NUMBER,
6002 p_visit_number IN NUMBER,
6003 p_x_relationship_tbl IN OUT NOCOPY AHL_PRD_WORKORDER_PVT.prd_workorder_rel_tbl
6004 )
6005 AS
6006 L_API_VERSION CONSTANT NUMBER := 1.0;
6007 L_API_NAME CONSTANT VARCHAR2(30) := 'Get_Visit_Dependencies';
6008 L_DEBUG_KEY CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
6009 rel_count NUMBER;
6010
6011 -- Get all the Task Dependencies.
6012 CURSOR get_tech_dependencies(c_visit_id NUMBER)
6013 IS
6014 SELECT PARENT.visit_task_number parent_task_number,
6015 CHILD.visit_task_number child_task_number
6016 FROM AHL_VISIT_TASKS_B PARENT,
6017 AHL_VISIT_TASKS_B CHILD,
6018 AHL_TASK_LINKS LINK
6019 WHERE PARENT.visit_task_id = LINK.parent_task_id
6020 AND CHILD.visit_task_id = LINK.visit_task_id
6021 AND NVL(PARENT.STATUS_CODE,'X') = 'PLANNING' --Srini Bug #4075702
6022 AND PARENT.visit_id = c_visit_id
6023 AND CHILD.visit_id = c_visit_id;
6024
6025 BEGIN
6026
6027 IF (l_log_procedure >= l_log_current_level) THEN
6028 fnd_log.string(l_log_procedure,
6029 L_DEBUG_KEY ||'.begin',
6030 'At the start of PL SQL procedure.');
6031 END IF;
6032
6033 rel_count := p_x_relationship_tbl.COUNT;
6034
6035 -- Get the Technical Dependencies between Visit Tasks for a Visit.
6036 FOR tsk_cursor IN get_tech_dependencies(p_visit_id) LOOP
6037 rel_count := rel_count + 1;
6038 p_x_relationship_tbl(rel_count).batch_id := p_visit_number;
6039 p_x_relationship_tbl(rel_count).parent_header_id := tsk_cursor.parent_task_number;
6040 p_x_relationship_tbl(rel_count).child_header_id := tsk_cursor.child_task_number;
6041 p_x_relationship_tbl(rel_count).relationship_type := 2;
6042 p_x_relationship_tbl(rel_count).dml_operation := 'C';
6043 END LOOP;
6044
6045 IF (l_log_procedure >= l_log_current_level ) THEN
6046 fnd_log.string(l_log_procedure,
6047 L_DEBUG_KEY,
6048 'Total Relationships : ' || p_x_relationship_tbl.COUNT);
6049 fnd_log.string(l_log_procedure,
6050 L_DEBUG_KEY ||'.end',
6051 'At the end of PL SQL procedure.');
6052 END IF;
6053
6054 END Get_Visit_Dependencies;
6055
6056 /* End Changes by Shkalyan */
6057
6058 --------------------------------------------------------------------
6059 -- PROCEDURE
6060 -- Push_to_Production
6061 --
6062 -- PURPOSE
6063 -- To push visit along with all its tasks to Production for create jobs
6064 --------------------------------------------------------------------
6065 PROCEDURE Push_to_Production
6066 ( p_api_version IN NUMBER,
6067 p_init_msg_list IN VARCHAR2 := Fnd_Api.g_false,
6068 p_commit IN VARCHAR2 := Fnd_Api.g_false,
6069 p_validation_level IN NUMBER := Fnd_Api.g_valid_level_full,
6070 p_module_type IN VARCHAR2 := Null,
6071 p_visit_id IN NUMBER,
6072 p_release_flag IN VARCHAR2 := 'N', -- By shbhanda 05/21/04 for TC changes
6073 p_orig_visit_id IN NUMBER := NULL, -- By yazhou 08/06/04 for TC changes
6074 x_return_status OUT NOCOPY VARCHAR2,
6075 x_msg_count OUT NOCOPY NUMBER,
6076 x_msg_data OUT NOCOPY VARCHAR2
6077 )
6078 IS
6079 L_API_VERSION CONSTANT NUMBER := 1.0;
6080 L_API_NAME CONSTANT VARCHAR2(30) := 'Push_to_Production';
6081 L_DEBUG_KEY CONSTANT VARCHAR2(100):= 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
6082 l_prd_workorder_tbl AHL_PRD_WORKORDER_PVT.PRD_WORKORDER_TBL;
6083 /* Begin Changes by Shkalyan */
6084 l_prd_workorder_rel_tbl AHL_PRD_WORKORDER_PVT.PRD_WORKORDER_REL_TBL;
6085 l_firm_planned_flag VARCHAR2(1) := FND_PROFILE.value('AHL_PRD_FIRM_PLANNED_FLAG');
6086 l_visit_wo_id NUMBER;
6087 l_visit_wo_ovn NUMBER;
6088 l_visit_wo_status VARCHAR2(30);
6089 l_visit_wo_start_time DATE;
6090 l_visit_wo_end_time DATE;
6091 l_orig_visit_status VARCHAR2(30);
6092 l_orig_task_status VARCHAR2(30);
6093 l_workorder_id NUMBER;
6094 l_workorder_ovn NUMBER;
6095 l_workorder_status VARCHAR2(30);
6096 /* End Changes by Shkalyan */
6097 l_return_status VARCHAR2(1);
6098 l_msg_count NUMBER;
6099 l_msg_data VARCHAR2(2000);
6100 idx NUMBER;
6101 l_count NUMBER;
6102 l_route_id NUMBER;
6103 l_commit VARCHAR2(1) := 'F';
6104 l_visit_end_time DATE;
6105 l_temp_msg_count NUMBER:=0; --rnahata
6106 l_init_msg_list VARCHAR2(1) := 'F';
6107 --PRAKKUM :: PIE :: 13-OCT-2010
6108 l_new_structure_flag VARCHAR2(1);
6109 l_def_stage_task_id NUMBER; --added by tchimira for VWPE
6110 l_planned_order_flag VARCHAR2(1); --added by skpathak for VWPE
6111 l_is_comp_visit VARCHAR2(1) := AHL_CMP_UTIL_PKG.Is_Comp_Visit (p_visit_id);
6112 -- SATRAJEN :: Bug 12990261 :: Sum up all error messages :: Jun 2012
6113 l_task_nos_1 VARCHAR2(1000):= '';
6114 l_task_nos_2 VARCHAR2(1000):= '';
6115 l_task_nos_3 VARCHAR2(1000):= '';
6116 l_task_nos_4 VARCHAR2(1000):= '';
6117 l_task_nos_5 VARCHAR2(1000):= '';
6118 l_task_nos_6 VARCHAR2(1000):= '';
6119 l_valid_flag NUMBER;
6120 -- SATRAJEN :: BUG 14336467 :: Prevent erroring out in case of operational visit. :: 12-07-2012
6121 l_invalid_mr VARCHAR2(1):='N';
6122 l_auto_visit_flag VARCHAR2(10):=NULL;
6123 l_unit_sch_id NUMBER;
6124
6125
6126 -- To find visit related information
6127 CURSOR c_visit (x_id IN NUMBER) IS
6128 SELECT AHL_VISITS_VL.*, AHL_VWP_VISITS_PVT.Is_Old_Visit(VISIT_ID) IS_OLD_VISIT FROM AHL_VISITS_VL
6129 WHERE VISIT_ID = x_id;
6130
6131 c_visit_rec c_visit%ROWTYPE;
6132 c_orig_visit_rec c_visit%ROWTYPE;
6133
6134 /* Begin Changes by VSUNDARA For SR Integration*/
6135 -- To find task related information
6136 CURSOR c_task (x_id IN NUMBER) IS
6137 SELECT * FROM AHL_VISIT_TASKS_VL
6138 WHERE VISIT_ID = x_id
6139 AND NVL(STATUS_CODE, 'X') = 'PLANNING'
6140 AND (TASK_TYPE_CODE <> 'SUMMARY' OR
6141 (TASK_TYPE_CODE = 'SUMMARY' AND
6142 (MR_ID IS NOT NULL OR UNIT_EFFECTIVITY_ID IS NOT NULL)));
6143 /* End */
6144
6145 c_task_rec c_task%ROWTYPE;
6146 c_orig_task_rec c_task%ROWTYPE;
6147
6148 /* Begin Changes by Shkalyan */
6149 -- To find count for tasks for visit
6150 CURSOR c_task_ct (x_id IN NUMBER) IS
6151 SELECT count(*) FROM AHL_VISIT_TASKS_VL
6152 WHERE VISIT_ID = x_id
6153 AND NVL(STATUS_CODE, 'X') = 'PLANNING'
6154 AND (TASK_TYPE_CODE <> 'SUMMARY' OR
6155 (TASK_TYPE_CODE = 'SUMMARY' AND
6156 MR_ID IS NOT NULL OR UNIT_EFFECTIVITY_ID IS NOT NULL));
6157 /* End Changes by Shkalyan */
6158
6159 -- To find Route Id from MR Routes view
6160 CURSOR c_route (x_id IN NUMBER) IS
6161 SELECT Route_Id FROM AHL_MR_ROUTES_V
6162 WHERE MR_ROUTE_ID = x_id;
6163
6164 /* Begin Changes by Shkalyan */
6165 -- To find job for task
6166 CURSOR c_job (x_id IN NUMBER) IS
6167 SELECT workorder_id, object_version_number, status_code
6168 FROM AHL_WORKORDERS
6169 WHERE VISIT_TASK_ID = x_id
6170 AND STATUS_CODE not in ('22','7'); --(22-Deleted, 7-Cancelled)
6171
6172 --transit check visit change
6173 --yazhou start
6174 -- To find master workorder for Visit
6175 CURSOR c_visit_job (x_visit_id IN NUMBER) IS
6176 SELECT wo.workorder_id, wo.object_version_number, wo.status_code,
6177 WIP.SCHEDULED_START_DATE,
6178 WIP.SCHEDULED_COMPLETION_DATE
6179 FROM AHL_WORKORDERS WO,
6180 WIP_DISCRETE_JOBS WIP
6181 WHERE wo.VISIT_ID = x_visit_id
6182 AND wo.VISIT_TASK_ID IS NULL
6183 AND wo.MASTER_WORKORDER_FLAG = 'Y'
6184 AND WIP.WIP_ENTITY_ID = WO.WIP_ENTITY_ID
6185 AND wo.STATUS_CODE not in ('22','7'); --(22-Deleted, 7-Cancelled)
6186
6187 CURSOR c_visit_wo_status (x_visit_id IN NUMBER) IS
6188 SELECT wo.status_code
6189 FROM AHL_WORKORDERS WO
6190 WHERE wo.VISIT_ID = x_visit_id
6191 AND wo.VISIT_TASK_ID IS NULL
6192 AND wo.MASTER_WORKORDER_FLAG = 'Y'
6193 AND wo.STATUS_CODE not in ('22','7'); --(22-Deleted, 7-Cancelled)
6194
6195 -- Get workorder status for the coresponding job in originating visit
6196 CURSOR c_wo_status (x_orig_visit_id IN NUMBER, x_visit_task_id IN NUMBER) IS
6197 SELECT wo.status_code
6198 FROM AHL_WORKORDERS WO,
6199 AHL_VISIT_TASKS_B t
6200 WHERE wo.VISIT_ID = x_orig_visit_id
6201 AND wo.visit_task_id = t.visit_task_id
6202 AND t.visit_task_number = (Select visit_task_number
6203 from ahl_visit_tasks_b
6204 where visit_task_id = x_visit_task_id)
6205 AND wo.STATUS_CODE not in ('22','7'); --(22-Deleted, 7-Cancelled)
6206 -- yazhou end
6207
6208 /* End Changes by Shkalyan */
6209
6210 --Post11510. Added to get summary task start, end time
6211 CURSOR get_summary_task_times_csr(x_task_id IN NUMBER)IS
6212 SELECT min(start_date_time), max(end_date_time)
6213 --TCHIMIRA::19-FEB-2010::BUG 9384614
6214 -- Use the base table instead of the vl view
6215 FROM ahl_visit_tasks_b VST
6216 START WITH visit_task_id = x_task_id
6217 -- anraj changed coz the nvl on the RHS is not required
6218 -- AND NVL(VST.status_code, 'Y') <> NVL ('DELETED', 'X')
6219 AND NVL(VST.status_code, 'Y') <> 'DELETED'
6220 CONNECT BY originating_task_id = PRIOR visit_task_id;
6221
6222 -- Added by Jerry on 08/13/2004 per Yan and Alex's request
6223 -- Yan added the condition to filter out summary tasks on 08/31/2005
6224 CURSOR get_independent_tasks(c_visit_id IN NUMBER) IS
6225 select t.visit_task_id
6226 from ahl_visit_tasks_b t,
6227 ahl_visits_b v
6228 where v.visit_id = c_visit_id
6229 and v.visit_id = t.visit_id
6230 --and v.status_code = 'PARTIALLY RELEASED'
6231 and v.status_code IN ('PLANNING', 'PARTIALLY RELEASED') -- PRAKKUM :: BUG Internal :: 19/01/2012 :: Task Time Adjustments
6232 and t.start_date_time < SYSDATE
6233 and t.status_code ='PLANNING'
6234 and t.task_type_code <>'SUMMARY'
6235 -- SKPATHAK :: ER: 9147951 :: 11-JAN-2010 :: Adjust task times only if past task start date is null
6236 and t.past_task_start_date IS NULL
6237 and (not exists (select 1 from ahl_task_links l0
6238 where l0.parent_task_id = t.visit_task_id
6239 or l0.visit_task_id = t.visit_task_id)
6240 or t.visit_task_id in (select l1.parent_task_id from ahl_task_links l1
6241 where not exists (select l2.visit_task_id from ahl_task_links l2
6242 where l2.visit_task_id = l1.parent_task_id)));
6243 --Modified by Srini Nov08, 2004 to create master workorder not having an asset
6244
6245 -- anraj: Modified the cursor definition to exclude the tasks in status DELETED
6246 CURSOR get_task_inst_dtls(c_visit_id IN NUMBER)
6247 IS
6248 SELECT inventory_item_id,instance_id
6249 FROM ahl_visit_tasks_vl
6250 WHERE visit_id = c_visit_id
6251 AND NVL(status_code, 'Y') <> 'DELETED'
6252 AND ROWNUM = 1;
6253 get_task_inst_rec get_task_inst_dtls%ROWTYPE;
6254
6255 /* Added by rnahata for Bug 6447196 */
6256 CURSOR c_get_vst_status_and_date (c_visit_id IN NUMBER) IS
6257 SELECT status_code, close_date_time
6258 FROM ahl_visits_b
6259 WHERE visit_id = c_visit_id;
6260 get_vst_status_and_date_rec c_get_vst_status_and_date%ROWTYPE;
6261
6262 /* Added by rnahata for Bug 5758813
6263 Fetches the route information for updating workorder
6264 description for tasks created from Routes */
6265 CURSOR get_wo_dtls_for_mrtasks_cur (p_task_id IN NUMBER) IS
6266 --TCHIMIRA::Bug 9149770 ::09-FEB-2010
6267 --use substrb and lengthb instead of substr and length respectively
6268 SELECT ar.route_no||'.'||substrb(ar.title,1,(240 - (lengthb(ar.route_no) + 1))) workorder_description
6269 FROM ahl_routes_vl ar,ahl_visit_tasks_b avt, ahl_mr_routes mrr
6270 WHERE avt.visit_task_id = p_task_id
6271 AND nvl(avt.status_code,'Y') = 'PLANNING'
6272 AND avt.mr_route_id = mrr.mr_route_id
6273 AND mrr.route_id = ar.route_id;
6274 get_wo_dtls_for_mrtasks_rec get_wo_dtls_for_mrtasks_cur%ROWTYPE;
6275
6276 -- SKPATHAK :: 02-MAY-2011 :: VWPE: ER:12424063
6277 -- Get all the planning stages' tasks and duplicate tasks of the visit
6278 CURSOR get_visit_tasks_to_cancel (c_visit_id IN NUMBER) IS
6279 SELECT wo.workorder_id, stage.stage_id, task.task_type_code
6280 FROM ahl_visit_tasks_b task, ahl_vwp_stages_b stage, ahl_workorders wo
6281 WHERE task.visit_id = c_visit_id
6282 AND task.stage_id = stage.stage_id(+)
6283 -- do not select the default stage task
6284 AND ((task.task_type_code = 'STAGE' AND task.stage_id IS NOT NULL)
6285 OR task.task_type_code = 'DUPLICATE')
6286 -- SKPATHAK :: 07-JUN-2011 :: VWPE: ER:12424063 :: Consider partially implemented stages also
6287 AND stage.stage_status_code IN ('PLANNING', 'PARTIALLY RELEASED')
6288 AND task.visit_task_id = wo.visit_task_id;
6289
6290 -- TCHIMIRA :: 28-JUN-2011 :: VWPE: ER:12673125 :: START
6291 -- Cursor to fetch default stage task ID
6292 CURSOR c_get_vst_def_stage_task (c_visit_id IN NUMBER) IS
6293 SELECT VISIT_TASK_ID
6294 FROM AHL_VISIT_TASKS_B
6295 WHERE STAGE_ID IS NULL
6296 AND TASK_TYPE_CODE = 'STAGE'
6297 AND VISIT_ID = c_visit_id;
6298 -- TCHIMIRA :: 28-JUN-2011 :: VWPE: ER:12673125 :: END
6299
6300 -- SKPATHAK :: ER:12730539 :: 01-AUG-2011
6301 CURSOR get_task_status (c_task_id IN NUMBER) IS
6302 SELECT status_code FROM ahl_visit_tasks_b
6303 WHERE visit_task_id = c_task_id;
6304 l_task_status VARCHAR2(30);
6305
6306 -- MANESING::Component Maintenance Planning Project, 02-Nov-2011, added following cursor
6307 -- Cursor to get any instance from UC table
6308 CURSOR get_any_uc_inst_csr IS
6309 SELECT INST.inventory_item_id, UC.csi_item_instance_id
6310 FROM AHL_UNIT_CONFIG_HEADERS UC,
6311 CSI_ITEM_INSTANCES INST
6312 WHERE UC.unit_config_status_code = 'COMPLETE'
6313 AND NVL(UC.active_end_date, SYSDATE+1) > SYSDATE
6314 AND INST.instance_id = UC.csi_item_instance_id
6315 AND rownum = 1;
6316
6317 -- MANESING::Component Maintenance Planning Project, 02-Nov-2011, added following cursor
6318 -- Cursor to get serial number given the item instance id
6319 CURSOR get_inst_serial_no_csr (c_instance_id NUMBER) IS
6320 SELECT serial_number
6321 FROM CSI_ITEM_INSTANCES
6322 WHERE instance_id = c_instance_id;
6323 l_serial_number VARCHAR2(30);
6324
6325 -- MANESING::Component Maintenance Planning Project, 02-Nov-2011, added following cursor
6326 -- Cursor to find a serialized instance in any of Repair Batches within the given Component Visit
6327 CURSOR get_serialized_inst_csr (c_visit_id NUMBER) IS
6328 SELECT INST.inventory_item_id, INST.instance_id
6329 FROM AHL_VISIT_TASKS_B TSK,
6330 CSI_ITEM_INSTANCES INST
6331 WHERE TSK.visit_id = c_visit_id
6332 AND TSK.status_code NOT IN ('DELETED', 'CANCELLED', 'CLOSED')
6333 AND TSK.instance_id = INST.instance_id
6334 AND INST.serial_number IS NOT NULL
6335 AND rownum = 1;
6336 serialized_inst_rec get_serialized_inst_csr%ROWTYPE;
6337
6338 l_max_schedule_start_date DATE; --BUG 13373947 :: PRAKKUM :: 10/02/2012
6339
6340 BEGIN
6341 --------------------- initialize -----------------------
6342
6343 SAVEPOINT Push_to_Production;
6344 IF (l_log_procedure >= l_log_current_level) THEN
6345 fnd_log.string(l_log_procedure,
6346 L_DEBUG_KEY ||'.begin',
6347 'At the start of PL SQL procedure. Visit Id = ' || p_visit_id);
6348 END IF;
6349
6350 -- Initialize message list if p_init_msg_list is set to TRUE.
6351 IF Fnd_Api.to_boolean(p_init_msg_list)
6352 THEN
6353 Fnd_Msg_Pub.initialize;
6354 END IF;
6355
6356 -- Initialize API return status to success
6357 x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
6358
6359 -- Standard call to check for call compatibility.
6360 IF NOT Fnd_Api.COMPATIBLE_API_CALL(l_api_version,
6361 p_api_version,
6362 l_api_name,G_PKG_NAME)
6363 THEN
6364 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
6365 END IF;
6366
6367 IF (l_log_statement >= l_log_current_level) THEN
6368 fnd_log.string(l_log_statement,
6369 L_DEBUG_KEY,
6370 'Before calling AHL_VWP_TIMES_PVT.Calculate_Task_Times');
6371 END IF;
6372
6373 -- Calculate Task Start/End time
6374 AHL_VWP_TIMES_PVT.CALCULATE_TASK_TIMES(
6375 p_api_version => 1.0,
6376 p_init_msg_list => Fnd_Api.G_FALSE,
6377 p_commit => Fnd_Api.G_FALSE,
6378 p_validation_level => Fnd_Api.G_VALID_LEVEL_FULL,
6379 x_return_status => l_return_status,
6380 x_msg_count => l_msg_count,
6381 x_msg_data => l_msg_data,
6382 p_visit_id => p_visit_id);
6383
6384 IF (l_log_statement >= l_log_current_level) THEN
6385 fnd_log.string(l_log_statement,
6386 L_DEBUG_KEY,
6387 'After calling AHL_VWP_TIMES_PVT.Calculate_Task_Times. Return Status = ' || l_return_status);
6388 END IF;
6389
6390 IF (l_return_status <> Fnd_Api.G_RET_STS_SUCCESS) THEN
6391 IF (l_log_statement >= l_log_current_level) THEN
6392 fnd_log.string(l_log_statement,
6393 L_DEBUG_KEY,
6394 'Errors from AHL_VWP_TIMES_PVT.Calculate_Task_Times. Message count: ' ||
6395 l_msg_count || ', message data: ' || l_msg_data);
6396 END IF;
6397 END IF;
6398
6399 /*rnahata - B6447196 - start*/
6400 /*c_visit_rec fetch has been moved after the project details are updated for the visit. Hence
6401 moved the cursor after integrate_to_projects*/
6402 OPEN c_get_vst_status_and_date (p_visit_id);
6403 FETCH c_get_vst_status_and_date INTO get_vst_status_and_date_rec;
6404 CLOSE c_get_vst_status_and_date;
6405 /*rnahata - B6447196 - end*/
6406
6407 --Jerry updated on 08/13/2004 after discussion with Yan and Alex for adjusting task start date
6408 --IF get_vst_status_and_date_rec.STATUS_CODE = 'PARTIALLY RELEASED' THEN
6409 -- PRAKKUM :: BUG Internal :: 19/01/2012 :: Task Time Adjustments
6410 IF get_vst_status_and_date_rec.STATUS_CODE = 'PLANNING' OR get_vst_status_and_date_rec.STATUS_CODE = 'PARTIALLY RELEASED' THEN
6411 IF (l_log_statement >= l_log_current_level) THEN
6412 fnd_log.string(l_log_statement,
6413 L_DEBUG_KEY,
6414 'Before calling AHL_VWP_TIMES_PVT.adjust_task_times');
6415 END IF;
6416 FOR l_get_independent_tasks IN get_independent_tasks(p_visit_id) LOOP
6417 AHL_VWP_TIMES_PVT.adjust_task_times(
6418 p_api_version => 1.0,
6419 p_init_msg_list => Fnd_Api.G_FALSE,
6420 p_commit => Fnd_Api.G_FALSE,
6421 p_validation_level => Fnd_Api.G_VALID_LEVEL_FULL,
6422 x_return_status => l_return_status,
6423 x_msg_count => l_msg_count,
6424 x_msg_data => l_msg_data,
6425 p_task_id => l_get_independent_tasks.visit_task_id,
6426 p_reset_sysdate_flag => FND_API.G_TRUE);
6427 END LOOP;
6428
6429 IF (l_log_statement >= l_log_current_level) THEN
6430 fnd_log.string(l_log_statement,
6431 L_DEBUG_KEY,
6432 'After calling AHL_VWP_TIMES_PVT.adjust_task_times. Return Status = ' || l_return_status);
6433 END IF;
6434
6435 IF (l_return_status <> Fnd_Api.G_RET_STS_SUCCESS) THEN
6436 IF (l_log_statement >= l_log_current_level) THEN
6437 fnd_log.string(l_log_statement,
6438 L_DEBUG_KEY,
6439 'Errors from AHL_VWP_TIMES_PVT.adjust_task_times. Message count: ' ||
6440 l_msg_count || ', message data: ' || l_msg_data);
6441 END IF;
6442 END IF;
6443
6444 l_visit_end_time := AHL_VWP_TIMES_PVT.get_visit_end_time(p_visit_id);
6445 IF (l_log_statement >= l_log_current_level) THEN
6446 fnd_log.string(l_log_statement,
6447 L_DEBUG_KEY,
6448 'l_visit_end_time --@>'||l_visit_end_time);
6449 END IF;
6450 IF l_visit_end_time > get_vst_status_and_date_rec.close_date_time THEN
6451 Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_TSK_STDT_ADJU');
6452 Fnd_Message.Set_Token('VISIT_END_DATE', l_visit_end_time);
6453 Fnd_Msg_Pub.ADD;
6454 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
6455 END IF;
6456 END IF;
6457
6458 /*rnahata - B6447196 - start*/
6459 /*moved the call to integrate to projects after task times gets updated
6460 esp in case of visits that is partially implemented*/
6461 idx := idx + 1;
6462 --Call prrojects
6463 -- Post 11.5.10
6464 -- RROY
6465
6466 IF (l_log_statement >= l_log_current_level) THEN
6467 fnd_log.string(l_log_statement,
6468 L_DEBUG_KEY,
6469 'Before calling INTEGRATE_TO_PROJECTS');
6470 END IF;
6471
6472 AHL_VWP_PROJ_PROD_PVT.Integrate_to_Projects
6473 (p_api_version => l_api_version,
6474 p_init_msg_list => p_init_msg_list,
6475 p_commit => l_commit,
6476 p_validation_level => p_validation_level,
6477 p_module_type => p_module_type,
6478 p_visit_id => p_visit_id,
6479 x_return_status => l_return_status,
6480 x_msg_count => l_msg_count,
6481 x_msg_data => x_msg_data);
6482
6483 IF (l_log_statement >= l_log_current_level) THEN
6484 fnd_log.string(l_log_statement,
6485 L_DEBUG_KEY,
6486 'After calling INTEGRATE_TO_PROJECTS. l_return_status '||l_return_status);
6487 END IF;
6488
6489 IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
6490 -- Check Error Message stack.
6491 x_msg_count := FND_MSG_PUB.count_msg;
6492 RAISE FND_API.G_EXC_ERROR;
6493 END IF;
6494
6495 -- Post 11.5.10
6496 -- RROY
6497 OPEN c_visit (p_visit_id);
6498 FETCH c_visit INTO c_visit_rec;
6499 CLOSE c_visit;
6500 /*rnahata - B6447196 - end*/
6501
6502 -- Begin changes by rnahata for Bug 6448678
6503 l_temp_msg_count := Fnd_Msg_Pub.count_msg;
6504
6505 IF (l_log_statement >= l_log_current_level) THEN
6506 fnd_log.string(l_log_statement,
6507 L_DEBUG_KEY,
6508 'Before calling VALIDATE_MR_ROUTE_DATE. l_msg_count = ' || l_msg_count);
6509 END IF;
6510
6511 OPEN c_task (p_visit_id);
6512 LOOP
6513 FETCH c_task INTO c_task_rec;
6514 EXIT WHEN c_task%NOTFOUND;
6515 -- SKPATHAK :: ER:12730539 :: 01-AUG-2011
6516 -- If the task's summary task is in partially implemented status, need not validate its route/MR
6517 OPEN get_task_status (c_task_rec.originating_task_id);
6518 FETCH get_task_status INTO l_task_status;
6519 CLOSE get_task_status;
6520 IF l_task_status <> 'PARTIALLY RELEASED' THEN
6521 --SATRAJEN :: BUG 12990261 :: Called a different function to sum up all task numbers. :: Jun 2012
6522 --Validate_MR_Route_Date
6523 l_valid_flag := Validate_MR_Route_Date
6524 (
6525 p_mr_route_id => c_task_rec.mr_route_id,
6526 p_visit_task_number => c_task_rec.visit_task_number,
6527 p_start_date_time => c_task_rec.start_date_time,
6528 p_end_date_time => c_task_rec.end_date_time
6529 );
6530
6531 IF (l_log_statement >= l_log_current_level) THEN
6532 fnd_log.string(l_log_statement,
6533 L_DEBUG_KEY,
6534 'After calling VALIDATE_MR_ROUTE_DATE for task Id: ' ||
6535 c_task_rec.visit_task_id ||', l_msg_count = ' || l_msg_count);
6536 fnd_log.string(l_log_statement,
6537 L_DEBUG_KEY,
6538 'c_task_rec.visit_task_number ** l_valid_flag --@> ' ||c_task_rec.visit_task_number||' ** '||l_valid_flag);
6539 END IF;
6540
6541 -- SATRAJEN :: BUG 12990261 :: :: Jun 2012
6542 -- Added logic for Bug 14336467 :: 12-JUL-2012
6543 IF BitAND(l_valid_flag,POWER(2,0))<>0 THEN l_task_nos_1 := l_task_nos_1 || c_task_rec.visit_task_number || ',' ; l_invalid_mr := 'Y'; END IF;
6544 IF BitAND(l_valid_flag,POWER(2,1))<>0 THEN l_task_nos_2 := l_task_nos_2 || c_task_rec.visit_task_number || ',' ; l_invalid_mr := 'Y'; END IF;
6545 IF BitAND(l_valid_flag,POWER(2,2))<>0 THEN l_task_nos_3 := l_task_nos_3 || c_task_rec.visit_task_number || ',' ; l_invalid_mr := 'Y'; END IF;
6546 IF BitAND(l_valid_flag,POWER(2,3))<>0 THEN l_task_nos_4 := l_task_nos_4 || c_task_rec.visit_task_number || ',' ; l_invalid_mr := 'Y'; END IF;
6547 IF BitAND(l_valid_flag,POWER(2,4))<>0 THEN l_task_nos_5 := l_task_nos_5 || c_task_rec.visit_task_number || ',' ; l_invalid_mr := 'Y'; END IF;
6548 IF BitAND(l_valid_flag,POWER(2,5))<>0 THEN l_task_nos_6 := l_task_nos_6 || c_task_rec.visit_task_number || ',' ; l_invalid_mr := 'Y'; END IF;
6549 -- END of Bug 12990261 :: Jun 2012
6550
6551 END IF;
6552
6553 END LOOP;
6554
6555 -- SATRAJEN :: BUG 14336467 :: 12-JUL-2012 :: To prevent erroring out in case of OPERATIONAL visits.
6556 l_auto_visit_flag := c_visit_rec.auto_visit_type_flag ;
6557 l_unit_sch_id := c_visit_rec.unit_schedule_id ;
6558
6559 IF (l_log_statement >= l_log_current_level) THEN
6560 fnd_log.string(l_log_statement, L_DEBUG_KEY, 'l_auto_visit_flag--@>'||l_auto_visit_flag );
6561 fnd_log.string(l_log_statement, L_DEBUG_KEY, 'l_unit_sch_id--@>'||l_unit_sch_id );
6562 END IF;
6563
6564 -- On plan visit : p_module_type = 'CST'
6565 -- And if it is operational visit running from concurrent procedure create/update operational visits.
6566 IF (l_auto_visit_flag IS NOT NULL AND l_unit_sch_id IS NOT NULL AND p_module_type = 'CST' ) THEN
6567 IF (l_invalid_mr = 'Y') THEN
6568 Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_MR_ASSOC_FAIL');
6569 Fnd_Msg_Pub.ADD;
6570 END IF;
6571 ELSE
6572 -- SATRAJEN :: Bug 12990261 :: Jun 2012
6573 IF (LENGTH(l_task_nos_1) > 0) THEN
6574 l_task_nos_1 := SUBSTR (l_task_nos_1,0,(LENGTH(l_task_nos_1)-1));
6575 Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_TSK_STDT_ROUT_STDT');
6576 Fnd_Message.Set_Token('TASK_NUMBER', l_task_nos_1);
6577 Fnd_Msg_Pub.ADD;
6578 END IF;
6579
6580 IF (LENGTH(l_task_nos_2) > 0) THEN
6581 l_task_nos_2 := SUBSTR (l_task_nos_2,0,(LENGTH(l_task_nos_2)-1));
6582 Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_TSK_ENDT_ROUT_ENDT');
6583 Fnd_Message.Set_Token('TASK_NUMBER', l_task_nos_2);
6584 Fnd_Msg_Pub.ADD;
6585 END IF;
6586
6587 IF (LENGTH(l_task_nos_3) > 0) THEN
6588 l_task_nos_3 := SUBSTR (l_task_nos_3,0,(LENGTH(l_task_nos_3)-1));
6589 Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_TSK_NO_ROUTE');
6590 Fnd_Message.Set_Token('TASK_NUMBER', l_task_nos_3);
6591 Fnd_Msg_Pub.ADD;
6592 END IF;
6593
6594 IF (LENGTH(l_task_nos_4) > 0) THEN
6595 l_task_nos_4 := SUBSTR (l_task_nos_4,0,(LENGTH(l_task_nos_4)-1));
6596 Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_NO_TS_SD_LT_MR');
6597 Fnd_Message.Set_Token('TASK_NUMBER', l_task_nos_4);
6598 Fnd_Msg_Pub.ADD;
6599 END IF;
6600
6601 IF (LENGTH(l_task_nos_5) > 0) THEN
6602 l_task_nos_5 := SUBSTR (l_task_nos_5,0,(LENGTH(l_task_nos_5)-1));
6603 Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_NO_TS_ED_GT_MR');
6604 Fnd_Message.Set_Token('TASK_NUMBER', l_task_nos_5);
6605 Fnd_Msg_Pub.ADD;
6606 END IF;
6607
6608 IF (LENGTH(l_task_nos_6) > 0) THEN
6609 l_task_nos_6 := SUBSTR (l_task_nos_6,0,(LENGTH(l_task_nos_6)-1));
6610 Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_NO_MR_ID');
6611 Fnd_Message.Set_Token('TASK_NUMBER', l_task_nos_6);
6612 Fnd_Msg_Pub.ADD;
6613 END IF;
6614
6615 -- END of Bug 12990261 :: Jun 2012
6616 END IF; -- l_auto_visit_flag is not null check.
6617 -- END of Bug 14336467 :: 12-JUL-2012
6618
6619 CLOSE c_task;
6620
6621 l_msg_count := Fnd_Msg_Pub.count_msg;
6622 IF (l_msg_count <> l_temp_msg_count) THEN
6623 IF (l_log_statement >= l_log_current_level) THEN
6624 fnd_log.string(l_log_statement,
6625 L_DEBUG_KEY,
6626 'Errors from VALIDATE_MR_ROUTE_DATE. Message count: ' || l_msg_count);
6627 END IF;
6628 RAISE FND_API.G_EXC_ERROR;
6629 END IF;
6630 -- End changes by rnahata for Bug 6448678
6631
6632 -- transit check visit Change
6633 -- yazhou start
6634 IF p_orig_visit_id IS NOT NULL THEN
6635
6636 OPEN c_visit (p_orig_visit_id);
6637 FETCH c_visit INTO c_orig_visit_rec;
6638 CLOSE c_visit;
6639
6640 OPEN c_visit_wo_status (p_orig_visit_id);
6641 FETCH c_visit_wo_status INTO l_orig_visit_status;
6642 CLOSE c_visit_wo_status;
6643 END IF;
6644 -- yazhou end
6645
6646 -- SKPATHAK :: ER:12730539 :: 01-AUG-2011 :: START
6647 -- Need to update materials for this visit on P2P
6648 IF (l_log_statement >= l_log_current_level) THEN
6649 fnd_log.string(l_log_statement,
6650 L_DEBUG_KEY,
6651 'Before Calling AHL_LTP_REQST_MATRL_PUB.Process_Planned_Materials. p_visit_id = ' || p_visit_id );
6652 END IF;
6653
6654 IF (p_visit_id IS NOT NULL) THEN
6655 AHL_LTP_REQST_MATRL_PUB.Process_Planned_Materials (
6656 p_api_version => 1.0,
6657 p_init_msg_list => FND_API.G_FALSE,
6658 p_commit => FND_API.G_FALSE,
6659 p_validation_level => FND_API.G_VALID_LEVEL_FULL,
6660 p_visit_id => p_visit_id,
6661 p_operation_flag => 'U',
6662 x_planned_order_flag => l_planned_order_flag,
6663 x_return_status => l_return_status,
6664 x_msg_count => l_msg_count,
6665 x_msg_data => x_msg_data);
6666
6667 IF (l_log_statement >= l_log_current_level) THEN
6668 fnd_log.string(l_log_statement,
6669 L_DEBUG_KEY,
6670 'After Calling AHL_LTP_REQST_MATRL_PUB.Process_Planned_Materials. Return Status = ' || l_return_status );
6671 END IF;
6672
6673 IF NVL(l_return_status,'x') <> FND_API.G_RET_STS_SUCCESS THEN
6674 x_msg_count := l_msg_count;
6675 x_return_status := l_return_status;
6676 IF l_return_status = Fnd_Api.g_ret_sts_error THEN
6677 RAISE Fnd_Api.g_exc_error;
6678 ELSIF l_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
6679 RAISE Fnd_Api.g_exc_unexpected_error;
6680 END IF;
6681 END IF;
6682 END IF;
6683
6684 -- Delete UMP BOM data when UE is pushed to production (any status)
6685 DELETE FROM AHL_UMP_RESOURCE_REQMNTS
6686 WHERE object_type = 'UE'
6687 AND MAINTENANCE_REQMNT_ID IN (SELECT unit_effectivity_id FROM ahl_visit_tasks_b WHERE visit_id = p_visit_id);
6688
6689 DELETE FROM AHL_UMP_MATERIAL_REQMNTS
6690 WHERE object_type = 'UE'
6691 AND MAINTENANCE_REQMNT_ID IN (SELECT unit_effectivity_id FROM ahl_visit_tasks_b WHERE visit_id = p_visit_id);
6692
6693 DELETE FROM AHL_UMP_MAINT_REQMNTS
6694 WHERE object_type = 'UE'
6695 AND MAINTENANCE_REQMNT_ID IN (SELECT unit_effectivity_id FROM ahl_visit_tasks_b WHERE visit_id = p_visit_id);
6696 -- SKPATHAK :: ER:12730539 :: 01-AUG-2011 :: END
6697
6698 -- Start for 11.5.10 release
6699 -- By shbhanda 05-Jun-03
6700 -- For creating/updating Master Workorder in production for the visit in VWP
6701
6702 --VWPE :: tchimira :: 15-FEB -2011 :: start
6703 IF (l_log_statement >= l_log_current_level) THEN
6704 fnd_log.string(l_log_statement,
6705 L_DEBUG_KEY,
6706 'Past Dated Flag value is : ' || c_visit_rec.past_dated_visit_flag);
6707 END IF;
6708 --Now if the value of the l_PAST_DATED_VISIT_FLAG is Y which means it is past dated visit.
6709 -- Create WOs as firm so that they will not be considered by PS schedule engine.
6710 IF(c_visit_rec.past_dated_visit_flag = 'Y') THEN
6711 l_firm_planned_flag := 1; --Firm
6712 END IF;
6713 --VWPE :: tchimira :: 15-FEB -2011 :: end
6714
6715 /* Begin Changes by Shkalyan */
6716
6717 idx := 0;
6718
6719 OPEN c_visit_job (p_visit_id);
6720 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;
6721 CLOSE c_visit_job;
6722 --
6723 OPEN get_task_inst_dtls(p_visit_id);
6724 FETCH get_task_inst_dtls INTO get_task_inst_rec;
6725 CLOSE get_task_inst_dtls;
6726 --
6727 -- master workorder for visit already exists
6728 IF l_visit_wo_id IS NOT NULL THEN
6729
6730 -- If visit dates changed then reschedule the jobs
6731 -- SKPATHAK :: 20-JUN-2011 :: VWPE: ER:12673125
6732 -- If visit's status is not draft, do NOT reshedule the visit jobs since the rescheduling has already been done during visit dates update
6733 IF ((l_visit_wo_start_time <> c_visit_rec.START_DATE_TIME
6734 OR l_visit_wo_end_time <> c_visit_rec.CLOSE_DATE_TIME) AND c_visit_rec.status_code = 'DRAFT') THEN
6735
6736 IF (l_log_statement >= l_log_current_level) THEN
6737 fnd_log.string(l_log_statement,
6738 L_DEBUG_KEY,
6739 'Before calling AHL_PRD_WORKORDER_PVT.reschedule_visit_jobs');
6740 END IF;
6741
6742 AHL_PRD_WORKORDER_PVT.reschedule_visit_jobs(
6743 P_API_VERSION => 1.0,
6744 x_return_status => l_return_status,
6745 x_msg_count => l_msg_count,
6746 x_msg_data => l_msg_data,
6747 P_VISIT_ID => p_visit_id,
6748 p_x_scheduled_start_date => c_visit_rec.START_DATE_TIME,
6749 p_x_scheduled_end_date => c_visit_rec.CLOSE_DATE_TIME);
6750
6751 IF (l_log_statement >= l_log_current_level) THEN
6752 fnd_log.string(l_log_statement,
6753 L_DEBUG_KEY,
6754 'After calling AHL_PRD_WORKORDER_PVT.reschedule_visit_jobs. Return Status = ' || l_return_status);
6755 END IF;
6756
6757 IF (l_return_status <> Fnd_Api.G_RET_STS_SUCCESS) THEN
6758 IF (l_log_statement >= l_log_current_level) THEN
6759 fnd_log.string(l_log_statement,
6760 L_DEBUG_KEY,
6761 'Errors from AHL_PRD_WORKORDER_PVT.reschedule_visit_jobs. Message count: ' ||
6762 l_msg_count || ', message data: ' || l_msg_data);
6763 END IF;
6764 IF l_return_status = FND_API.G_RET_STS_ERROR THEN
6765 RAISE FND_API.G_EXC_ERROR;
6766 ELSE
6767 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
6768 END IF;
6769 END IF;
6770
6771 END IF; --reschedule visit jobs
6772
6773 -- If p_module_type is 'CST' then master workorder status should stay as DRAFT
6774 -- Update only workorder time
6775
6776 -- Re-Query the OVN for the workorder again since its been updated by
6777 -- AHL_PRD_WORKORDER_PVT.RESCHEDULE_VISIT_JOBS API.
6778 -- Balaji added this fix as a part of BAE OVN bug fix for workorders.
6779 OPEN c_visit_job (p_visit_id);
6780 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;
6781 CLOSE c_visit_job;
6782
6783 IF p_module_type = 'CST' THEN
6784 idx := idx+1;
6785 l_prd_workorder_tbl(idx).DML_OPERATION := 'U';
6786 l_prd_workorder_tbl(idx).WORKORDER_ID := l_visit_wo_id;
6787 l_prd_workorder_tbl(idx).OBJECT_VERSION_NUMBER := l_visit_wo_ovn;
6788 l_prd_workorder_tbl(idx).SCHEDULED_START_DATE := c_visit_rec.start_date_time;
6789 l_prd_workorder_tbl(idx).SCHEDULED_END_DATE := c_visit_rec.close_date_time;
6790 END IF;
6791
6792 -- If visit master workorder status is already RELEASED, the no change should be made
6793
6794 IF p_module_type <> 'CST' AND l_visit_wo_status <> '3' THEN
6795 --TCHIMIRA::P2P CP ER 9151144::02-DEC-2009
6796 --Modified the if condition
6797 IF (p_release_flag = 'Y' OR p_release_flag = 'R') THEN
6798 -- change status from UNRELEASED/DRAFT to RELEASED
6799 idx := idx+1;
6800 l_prd_workorder_tbl(idx).DML_OPERATION := 'U';
6801 l_prd_workorder_tbl(idx).WORKORDER_ID := l_visit_wo_id;
6802 l_prd_workorder_tbl(idx).OBJECT_VERSION_NUMBER := l_visit_wo_ovn;
6803 l_prd_workorder_tbl(idx).STATUS_CODE := '3'; -- Released
6804 l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG := 1; -- Firm
6805 -- l_prd_workorder_tbl(idx).VALIDATE_STRUCTURE := 'Y'; -- rroy - TC - validate entire structure
6806 l_prd_workorder_tbl(idx).SCHEDULED_START_DATE := c_visit_rec.start_date_time;
6807 l_prd_workorder_tbl(idx).SCHEDULED_END_DATE := c_visit_rec.close_date_time;
6808 ELSIF l_visit_wo_status = '17' THEN
6809 -- Master workorder was in Draft status
6810 -- Need to make it UNRELEASED now
6811 idx := idx+1;
6812 l_prd_workorder_tbl(idx).DML_OPERATION := 'U';
6813 l_prd_workorder_tbl(idx).WORKORDER_ID := l_visit_wo_id;
6814 l_prd_workorder_tbl(idx).OBJECT_VERSION_NUMBER := l_visit_wo_ovn;
6815 l_prd_workorder_tbl(idx).SCHEDULED_START_DATE := c_visit_rec.start_date_time;
6816 l_prd_workorder_tbl(idx).SCHEDULED_END_DATE := c_visit_rec.close_date_time;
6817 l_prd_workorder_tbl(idx).STATUS_CODE := '1'; -- Unreleased
6818 l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG := 1; -- Firm
6819 -- Added by jaramana on 20-OCT-2009 for Bug 9016332
6820 -- Also need to handle if the Master Work Order is in Unreleased status
6821 -- and user does P2P with Unreleased work orders
6822 ELSIF l_visit_wo_status = '1' THEN
6823 -- Master workorder is in Unreleased status and user wants to keep it that way
6824 idx := idx+1;
6825 l_prd_workorder_tbl(idx).DML_OPERATION := 'U';
6826 l_prd_workorder_tbl(idx).WORKORDER_ID := l_visit_wo_id;
6827 l_prd_workorder_tbl(idx).OBJECT_VERSION_NUMBER := l_visit_wo_ovn;
6828 l_prd_workorder_tbl(idx).SCHEDULED_START_DATE := c_visit_rec.start_date_time;
6829 l_prd_workorder_tbl(idx).SCHEDULED_END_DATE := c_visit_rec.close_date_time;
6830 l_prd_workorder_tbl(idx).STATUS_CODE := '1'; -- Unreleased
6831 l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG := 1; -- Firm
6832 -- End addition by jaramana on 20-OCT-2009 for Bug 9016332
6833 END IF;
6834 ELSIF p_module_type <> 'CST' THEN
6835 idx := idx+1;
6836 l_prd_workorder_tbl(idx).DML_OPERATION := 'U';
6837 l_prd_workorder_tbl(idx).WORKORDER_ID := l_visit_wo_id;
6838 l_prd_workorder_tbl(idx).OBJECT_VERSION_NUMBER := l_visit_wo_ovn;
6839 --l_prd_workorder_tbl(idx).STATUS_CODE := '3'; -- Released
6840 --l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG := 1; -- Firm
6841 --l_prd_workorder_tbl(idx).VALIDATE_STRUCTURE := 'Y'; -- rroy - TC - validate entire structure
6842 l_prd_workorder_tbl(idx).SCHEDULED_START_DATE := c_visit_rec.start_date_time;
6843 l_prd_workorder_tbl(idx).SCHEDULED_END_DATE := c_visit_rec.close_date_time;
6844 END IF;
6845 l_prd_workorder_tbl(idx).BATCH_ID := c_visit_rec.VISIT_NUMBER;
6846 l_prd_workorder_tbl(idx).HEADER_ID := 0; -- Visit
6847
6848 /* MANESING::Component Maintenance Planning Project, 02-Nov-2011
6849 * This is a workaround for Component Visits. Visit master workorder may have been created with an
6850 * instance in UC table due to non-serialized instance in 1st Repair Batch. Therefore, if available,
6851 * update visit master workorder instance with serialized instance in any of the Repair Batches in this
6852 * Component Visit, otherwise let still there be UC instance in Visit master workorder.
6853 */
6854 IF (l_is_comp_visit = 'Y') THEN
6855
6856 -- check whether any serialized instance is available in any of the Repair Batches for this Component Visit
6857 OPEN get_serialized_inst_csr (p_visit_id);
6858 FETCH get_serialized_inst_csr INTO serialized_inst_rec;
6859 IF (get_serialized_inst_csr%FOUND) THEN
6860 l_prd_workorder_tbl(idx).inventory_item_id := serialized_inst_rec.inventory_item_id;
6861 l_prd_workorder_tbl(idx).item_instance_id := serialized_inst_rec.instance_id;
6862 ELSE
6863 OPEN get_any_uc_inst_csr;
6864 FETCH get_any_uc_inst_csr INTO l_prd_workorder_tbl(idx).inventory_item_id,
6865 l_prd_workorder_tbl(idx).item_instance_id;
6866 CLOSE get_any_uc_inst_csr;
6867 END IF;
6868 CLOSE get_serialized_inst_csr;
6869 END IF; -- if l_is_comp_visit = 'Y'
6870
6871 ELSE -- Visit Master Workorder doesn't exist
6872
6873 idx := idx+1;
6874
6875 l_prd_workorder_tbl(idx).DML_OPERATION := 'C';
6876
6877 IF (p_module_type = 'CST') THEN
6878 l_prd_workorder_tbl(idx).STATUS_CODE := '17'; -- draft
6879
6880 -- sracha 27Jul05. Create Draft WO as firm to avoid scheduling by EAM.
6881 --l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG := 2; -- Planned
6882 l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG := 1; -- Firm
6883
6884 ELSE
6885 IF p_orig_visit_id IS NOT NULL THEN
6886 -- Create master workorder in same status as that of the originating visit
6887 l_prd_workorder_tbl(idx).STATUS_CODE := l_orig_visit_status;
6888 ELSE
6889 --TCHIMIRA::P2P CP ER 9151144::02-DEC-2009::Modified if condition
6890 IF (p_release_flag = 'Y' OR p_release_flag = 'R') THEN
6891 l_prd_workorder_tbl(idx).STATUS_CODE := '3'; -- Released
6892 ELSE
6893 l_prd_workorder_tbl(idx).STATUS_CODE := '1'; -- Unreleased
6894 END IF;
6895 END IF;
6896
6897 l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG := 1; -- Firm
6898
6899 END IF;
6900 -- Post 11.5.10 Changes by senthil
6901 l_prd_workorder_tbl(idx).SCHEDULED_START_DATE := c_visit_rec.start_date_time;
6902 -- Changed by Shbhanda on 30th Jan 04
6903 l_prd_workorder_tbl(idx).SCHEDULED_END_DATE := c_visit_rec.close_date_time;
6904
6905 l_prd_workorder_tbl(idx).MASTER_WORKORDER_FLAG := 'Y';
6906 l_prd_workorder_tbl(idx).BATCH_ID := c_visit_rec.VISIT_NUMBER;
6907 l_prd_workorder_tbl(idx).HEADER_ID := 0; -- Visit
6908 /* End Changes by Shkalyan */
6909 l_prd_workorder_tbl(idx).VISIT_ID := p_visit_id;
6910 l_prd_workorder_tbl(idx).ORGANIZATION_ID := c_visit_rec.organization_id;
6911 l_prd_workorder_tbl(idx).PROJECT_ID := c_visit_rec.project_id;
6912 l_prd_workorder_tbl(idx).DEPARTMENT_ID := c_visit_rec.department_id ;
6913 l_prd_workorder_tbl(idx).JOB_DESCRIPTION := c_visit_rec.visit_name;
6914 l_prd_workorder_tbl(idx).INVENTORY_ITEM_ID := NVL(c_visit_rec.inventory_item_id,get_task_inst_rec.inventory_item_id);
6915 l_prd_workorder_tbl(idx).ITEM_INSTANCE_ID := NVL(c_visit_rec.item_instance_id,get_task_inst_rec.instance_id);
6916
6917 /* MANESING::Component Maintenance Planning Project, 02-Nov-2011
6918 * This is a workaround for Component Visits. If the 1st Repair Batch is created for a non-serialized
6919 * instance, then create visit master workorder with any instance in UC table.
6920 */
6921 IF (l_is_comp_visit = 'Y') THEN
6922
6923 -- check whether visit master workorder instance is serialized
6924 OPEN get_inst_serial_no_csr (l_prd_workorder_tbl(idx).item_instance_id);
6925 FETCH get_inst_serial_no_csr INTO l_serial_number;
6926 IF (get_inst_serial_no_csr%FOUND) THEN
6927
6928 -- if 1st Repair Batch instance is non-serialized
6929 IF (l_serial_number IS NULL) THEN
6930 OPEN get_any_uc_inst_csr;
6931 FETCH get_any_uc_inst_csr INTO l_prd_workorder_tbl(idx).inventory_item_id,
6932 l_prd_workorder_tbl(idx).item_instance_id;
6933 CLOSE get_any_uc_inst_csr;
6934 END IF;
6935 END IF;
6936 CLOSE get_inst_serial_no_csr;
6937 END IF; -- if l_is_comp_visit = 'Y'
6938
6939 END IF; --visit master workorder exist
6940
6941 -- Create Workorders for tasks that have no workorder in production
6942 -- Update workorder only if the previous status is DRAFT
6943
6944 OPEN c_task_ct(p_visit_id);
6945 FETCH c_task_ct INTO l_count;
6946 CLOSE c_task_ct;
6947
6948 IF (l_log_statement >= l_log_current_level) THEN
6949 fnd_log.string(l_log_statement,
6950 L_DEBUG_KEY,
6951 'Task Count' || l_count);
6952 END IF;
6953
6954 IF l_count > 0 THEN
6955 OPEN c_task(p_visit_id);
6956 FETCH c_task INTO c_task_rec;
6957 WHILE c_task%FOUND LOOP
6958
6959 /* Begin Changes by Shkalyan */
6960 IF p_orig_visit_id is not NULL THEN
6961 -- Check the workorder status for the coresponding task in originating visit
6962
6963 l_orig_task_status := null;
6964
6965 OPEN c_wo_status(p_orig_visit_id,c_task_rec.visit_task_id);
6966 FETCH c_wo_status INTO l_orig_task_status;
6967 CLOSE c_wo_status;
6968 END IF;
6969
6970 IF p_orig_visit_id is NULL OR l_orig_task_status is not null THEN
6971
6972 -- Merge process for 11.5.10 bug fix on CMRDV10P
6973 -- Fix for Bug 3549573
6974 l_workorder_id := NULL;
6975 l_workorder_ovn := NULL;
6976 l_workorder_status := NULL;
6977
6978 -- To get the Workorder for Visit Task
6979 OPEN c_job(c_task_rec.visit_task_id);
6980 FETCH c_job INTO l_workorder_id, l_workorder_ovn, l_workorder_status;
6981 CLOSE c_job;
6982
6983 -- if workorder exists for the task
6984 IF l_workorder_id IS NOT NULL THEN
6985 IF (l_log_statement >= l_log_current_level) THEN
6986 fnd_log.string(l_log_statement,
6987 L_DEBUG_KEY,
6988 'Workorder Id for Task = ' || l_workorder_id);
6989 END IF;
6990 -- If p_module_type is 'CST' then workorder status should stay as DRAFT
6991 -- Update only workorder time
6992
6993 IF p_module_type = 'CST' THEN
6994 idx := idx+1;
6995 l_prd_workorder_tbl(idx).DML_OPERATION := 'U';
6996 l_prd_workorder_tbl(idx).WORKORDER_ID := l_workorder_id;
6997 l_prd_workorder_tbl(idx).OBJECT_VERSION_NUMBER := l_workorder_ovn;
6998
6999 --POST11510 cxcheng. If summary task, use the min,max for sub tasks
7000 IF (c_task_rec.task_type_code = 'SUMMARY') THEN
7001 OPEN get_summary_task_times_csr(c_task_rec.visit_task_id);
7002 FETCH get_summary_task_times_csr INTO l_prd_workorder_tbl(idx).SCHEDULED_START_DATE,
7003 l_prd_workorder_tbl(idx).SCHEDULED_END_DATE;
7004 CLOSE get_summary_task_times_csr;
7005 ELSE
7006 l_prd_workorder_tbl(idx).SCHEDULED_START_DATE := c_task_rec.START_DATE_TIME;
7007 l_prd_workorder_tbl(idx).SCHEDULED_END_DATE := c_task_rec.END_DATE_TIME;
7008 END IF;
7009
7010 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;
7011 l_prd_workorder_tbl(idx).HEADER_ID := c_task_rec.visit_task_number;
7012
7013 END IF;
7014 -- Only update task if previous status is DRAFT
7015 -- SKPATHAK :: 20-JUN-2011 :: VWPE: ER:12673125
7016 -- Do not release or unrelease duplicate or stage tasks
7017 IF ( p_module_type <> 'CST' AND l_workorder_status = '17' AND c_task_rec.task_type_code NOT IN ('STAGE','DUPLICATE')) THEN
7018 idx := idx+1;
7019 --TCHIMIRA::P2P CP ER 9151144::02-DEC-2009::Modified if condition
7020 IF (p_release_flag = 'Y' OR p_release_flag = 'R') THEN
7021 l_prd_workorder_tbl(idx).STATUS_CODE := '3'; -- Released
7022 ELSE
7023 l_prd_workorder_tbl(idx).STATUS_CODE := '1'; -- Unreleased
7024 END IF;
7025 l_prd_workorder_tbl(idx).DML_OPERATION := 'U';
7026 l_prd_workorder_tbl(idx).WORKORDER_ID := l_workorder_id;
7027 l_prd_workorder_tbl(idx).OBJECT_VERSION_NUMBER := l_workorder_ovn;
7028 IF ( l_firm_planned_flag IS NOT NULL AND
7029 -- SKPATHAK :: ER: 9147951 :: 11-JAN-2010
7030 -- For task with past task dates, WOs are always firm irrespective of the profile value
7031 c_task_rec.past_task_start_date IS NULL AND
7032 l_firm_planned_flag = '2' ) THEN
7033 l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG := 2; -- Planned
7034 ELSE
7035 l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG := 1; -- Firm
7036 END IF;
7037 --POST11510 cxcheng. If summary task, use the min,max for sub tasks
7038 IF (c_task_rec.task_type_code = 'SUMMARY') THEN
7039 OPEN get_summary_task_times_csr(c_task_rec.visit_task_id);
7040 FETCH get_summary_task_times_csr INTO l_prd_workorder_tbl(idx).SCHEDULED_START_DATE,
7041 l_prd_workorder_tbl(idx).SCHEDULED_END_DATE ;
7042 CLOSE get_summary_task_times_csr;
7043 ELSE
7044 l_prd_workorder_tbl(idx).SCHEDULED_START_DATE := c_task_rec.START_DATE_TIME;
7045 l_prd_workorder_tbl(idx).SCHEDULED_END_DATE := c_task_rec.END_DATE_TIME;
7046 END IF;
7047
7048 /* Begin changes by rnahata for Bug 5758813 - For summary tasks (both manual and MR summary tasks)
7049 and unassociated tasks the task name is passed as the workorder description.
7050 And for the Route tasks, the route number concatenated with the route title is
7051 passed as workorder description.*/
7052
7053 IF (c_task_rec.task_type_code IN ('SUMMARY','UNASSOCIATED')) THEN
7054 l_prd_workorder_tbl(idx).JOB_DESCRIPTION := c_task_rec.visit_task_name;
7055 ELSE
7056 OPEN get_wo_dtls_for_mrtasks_cur(c_task_rec.visit_task_id);
7057 FETCH get_wo_dtls_for_mrtasks_cur INTO get_wo_dtls_for_mrtasks_rec;
7058 --salogan added for bug 9754641 begin
7059 IF get_wo_dtls_for_mrtasks_cur%NOTFOUND THEN
7060 get_wo_dtls_for_mrtasks_rec.workorder_description := NULL;
7061 END IF;
7062 --salogan added for bug 9754641 begin
7063 CLOSE get_wo_dtls_for_mrtasks_cur;
7064 l_prd_workorder_tbl(idx).JOB_DESCRIPTION := get_wo_dtls_for_mrtasks_rec.workorder_description;
7065 END IF;
7066 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;
7067 l_prd_workorder_tbl(idx).BATCH_ID := c_visit_rec.visit_number;
7068 l_prd_workorder_tbl(idx).HEADER_ID := c_task_rec.visit_task_number;
7069 END IF;
7070 /* End Changes by Shkalyan */
7071
7072 --l_prd_workorder_tbl(idx).VISIT_ID := p_visit_id;
7073 --l_prd_workorder_tbl(idx).ORGANIZATION_ID := c_visit_rec.organization_id;
7074 --l_prd_workorder_tbl(idx).PROJECT_ID := c_visit_rec.project_id;
7075 --l_prd_workorder_tbl(idx).INVENTORY_ITEM_ID := c_task_rec.inventory_item_id ;
7076 --l_prd_workorder_tbl(idx).ITEM_INSTANCE_ID := c_task_rec.instance_id ;
7077 --l_prd_workorder_tbl(idx).VISIT_TASK_ID := c_task_rec.visit_task_id ;
7078 --l_prd_workorder_tbl(idx).VISIT_TASK_NUMBER := c_task_rec.visit_task_number ;
7079 --l_prd_workorder_tbl(idx).PROJECT_TASK_ID := c_task_rec.project_task_id ;
7080 --l_prd_workorder_tbl(idx).JOB_DESCRIPTION := c_task_rec.visit_task_name ;
7081
7082 ELSE -- workorder doesn't exist
7083 idx := idx+1;
7084 l_prd_workorder_tbl(idx).DML_OPERATION := 'C';
7085 IF (p_module_type = 'CST') THEN
7086 l_prd_workorder_tbl(idx).STATUS_CODE := '17'; -- Draft
7087 -- sracha 27Jul05. Create Draft WO as firm to avoid scheduling by EAM.
7088 --l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG := 2; -- Planned
7089 -- Modified the below line by tchimira on 20-Mar-2012 for the bug 13695008
7090 -- Pass the value from the profile so that PS schedules draft work orders also.
7091 l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG := NVL(l_firm_planned_flag, 1);
7092
7093 ELSE
7094 IF p_orig_visit_id IS NOT NULL THEN
7095 -- Create master workorder in same status as that of the originating visit
7096 l_prd_workorder_tbl(idx).STATUS_CODE := l_orig_task_status;
7097 ELSE
7098 IF (p_release_flag = 'Y' OR p_release_flag = 'R') THEN
7099 l_prd_workorder_tbl(idx).STATUS_CODE := '3'; -- Released
7100 ELSE
7101 l_prd_workorder_tbl(idx).STATUS_CODE := '1'; -- Unreleased
7102 END IF;
7103 -- SKPATHAK :: 18-JUL-2011 :: VWPE 12730539
7104 -- Always create draft WOs for stage tasks
7105 IF c_task_rec.task_type_code = 'STAGE' THEN
7106 l_prd_workorder_tbl(idx).STATUS_CODE := '17'; -- Draft
7107 END IF;
7108
7109 END IF;
7110
7111 IF ( l_firm_planned_flag IS NOT NULL AND
7112 -- SKPATHAK :: ER: 9147951 :: 11-JAN-2010
7113 -- For task with past task dates, WOs are always firm irrespective of the profile value
7114 c_task_rec.past_task_start_date IS NULL AND
7115 l_firm_planned_flag = '2' ) THEN
7116 l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG := 2; -- Planned
7117 ELSE
7118 l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG := 1; -- Firm
7119 END IF;
7120
7121 /*
7122 Get_Task_Dependencies
7123 (
7124 p_visit_number => c_visit_rec.visit_number,
7125 p_visit_task_id => c_task_rec.visit_task_id,
7126 p_visit_task_number => c_task_rec.visit_task_number,
7127 p_x_relationship_tbl => l_prd_workorder_rel_tbl
7128 );
7129 */
7130 END IF; -- 'CST'
7131 IF (c_task_rec.task_type_code = 'SUMMARY') THEN
7132 l_prd_workorder_tbl(idx).MASTER_WORKORDER_FLAG := 'Y';
7133 ELSE
7134 l_prd_workorder_tbl(idx).MASTER_WORKORDER_FLAG := 'N';
7135 END IF;
7136
7137 l_prd_workorder_tbl(idx).BATCH_ID := c_visit_rec.visit_number;
7138 l_prd_workorder_tbl(idx).HEADER_ID := c_task_rec.visit_task_number;
7139 /* End Changes by Shkalyan */
7140 l_prd_workorder_tbl(idx).VISIT_ID := p_visit_id;
7141 l_prd_workorder_tbl(idx).ORGANIZATION_ID := c_visit_rec.organization_id;
7142 l_prd_workorder_tbl(idx).INVENTORY_ITEM_ID := c_task_rec.inventory_item_id ;
7143 l_prd_workorder_tbl(idx).ITEM_INSTANCE_ID := c_task_rec.instance_id ;
7144 l_prd_workorder_tbl(idx).VISIT_TASK_ID := c_task_rec.visit_task_id ;
7145 l_prd_workorder_tbl(idx).VISIT_TASK_NUMBER := c_task_rec.visit_task_number ;
7146 -- PRAKKUM :: PIE :: 13-OCT-2010
7147 -- Pass the Project Task Id only for work orders that don't correspond to Summary Tasks
7148 IF ( c_task_rec.task_type_code <> 'SUMMARY' ) THEN
7149 l_prd_workorder_tbl(idx).PROJECT_TASK_ID := c_task_rec.project_task_id ;
7150 l_prd_workorder_tbl(idx).PROJECT_ID := c_visit_rec.project_id;
7151 END IF;
7152
7153 /*B5758813 - rnahata - For summary tasks (both manual and MR summary tasks)
7154 and unassociated tasks the task name is passed as the workorder description.
7155 And for the MR tasks, the route number concatenated with the route title is
7156 passed as workorder description.*/
7157 IF (c_task_rec.task_type_code IN ('SUMMARY','UNASSOCIATED')) THEN
7158 l_prd_workorder_tbl(idx).JOB_DESCRIPTION := c_task_rec.visit_task_name;
7159 ELSE
7160 OPEN get_wo_dtls_for_mrtasks_cur(c_task_rec.visit_task_id);
7161 FETCH get_wo_dtls_for_mrtasks_cur INTO get_wo_dtls_for_mrtasks_rec;
7162 --salogan added for bug 9754641 begin
7163 IF get_wo_dtls_for_mrtasks_cur%NOTFOUND THEN
7164 get_wo_dtls_for_mrtasks_rec.workorder_description := NULL;
7165 END IF;
7166 --salogan added for bug 9754641 begin
7167 CLOSE get_wo_dtls_for_mrtasks_cur;
7168 l_prd_workorder_tbl(idx).JOB_DESCRIPTION := get_wo_dtls_for_mrtasks_rec.workorder_description;
7169 END IF;
7170
7171 IF c_task_rec.mr_route_id IS NOT NULL AND c_task_rec.mr_route_id <> FND_API.g_miss_num THEN
7172 OPEN c_route (c_task_rec.mr_route_id);
7173 FETCH c_route INTO l_route_id;
7174 CLOSE c_route;
7175 l_prd_workorder_tbl(idx).ROUTE_ID := l_route_id ;
7176 ELSE
7177 l_prd_workorder_tbl(idx).ROUTE_ID := Null;
7178 END IF;
7179
7180 IF c_task_rec.department_id IS NOT NULL
7181 AND c_task_rec.department_id <> FND_API.g_miss_num THEN
7182 l_prd_workorder_tbl(idx).DEPARTMENT_ID := c_task_rec.department_id ;
7183 ELSE
7184 l_prd_workorder_tbl(idx).DEPARTMENT_ID := c_visit_rec.department_id ;
7185 END IF;
7186
7187 --POST11510 cxcheng. If summary task, use the min,max for sub tasks
7188 IF (c_task_rec.task_type_code = 'SUMMARY') THEN
7189 OPEN get_summary_task_times_csr(c_task_rec.visit_task_id);
7190 FETCH get_summary_task_times_csr INTO l_prd_workorder_tbl(idx).SCHEDULED_START_DATE,
7191 l_prd_workorder_tbl(idx).SCHEDULED_END_DATE ;
7192 CLOSE get_summary_task_times_csr;
7193 ELSE
7194 l_prd_workorder_tbl(idx).SCHEDULED_START_DATE := c_task_rec.START_DATE_TIME;
7195 l_prd_workorder_tbl(idx).SCHEDULED_END_DATE := c_task_rec.END_DATE_TIME;
7196 END IF;
7197
7198 END IF; -- workorder exist
7199
7200 END IF; -- p_orig_visit null or orig_task_status null
7201
7202 FETCH c_task INTO c_task_rec;
7203 END LOOP;
7204
7205 CLOSE c_task;
7206
7207 END IF; -- l_count
7208 -- yazhou end
7209
7210 IF l_prd_workorder_tbl.COUNT > 0 THEN
7211
7212 --BUG 13373947 :: PRAKKUM :: 10/02/2012 :: START
7213 -- IF visit planned end date is in PAST and visit itself is not past dated then validate workorder shcedule start dates
7214 IF ( c_visit_rec.close_date_time IS NOT NULL AND c_visit_rec.close_date_time<SYSDATE ) AND NVL(c_visit_rec.PAST_DATED_VISIT_FLAG,'N')='N' THEN
7215
7216 l_max_schedule_start_date := c_visit_rec.close_date_time;
7217 For loopvar IN l_prd_workorder_tbl.FIRST..l_prd_workorder_tbl.LAST
7218 LOOP
7219
7220 IF (l_log_statement >= l_log_current_level) THEN
7221 fnd_log.string(l_log_statement, L_DEBUG_KEY, 'l_prd_workorder_tbl(idx).SCHEDULED_START_DATE --@>'
7222 || TO_CHAR(l_prd_workorder_tbl(idx).SCHEDULED_START_DATE,'DD-MON-YYYY HH24:MI:SS'));
7223 fnd_log.string(l_log_statement, L_DEBUG_KEY, 'get_vst_status_and_date_rec.close_date_time --@>'
7224 || TO_CHAR(get_vst_status_and_date_rec.close_date_time,'DD-MON-YYYY HH24:MI:SS'));
7225 END IF;
7226
7227 IF l_prd_workorder_tbl(idx).SCHEDULED_START_DATE IS NOT NULL AND get_vst_status_and_date_rec.close_date_time IS NOT NULL THEN
7228 IF l_prd_workorder_tbl(idx).SCHEDULED_START_DATE > get_vst_status_and_date_rec.close_date_time THEN
7229 -- Find max schedule start date
7230 IF l_prd_workorder_tbl(idx).SCHEDULED_START_DATE > l_max_schedule_start_date THEN
7231 l_max_schedule_start_date := l_prd_workorder_tbl(idx).SCHEDULED_START_DATE;
7232 END IF;
7233 END IF;
7234 END IF;
7235 END LOOP;
7236
7237 IF (l_log_statement >= l_log_current_level) THEN
7238 fnd_log.string(l_log_statement, L_DEBUG_KEY, 'l_max_schedule_start_date --@>'
7239 || TO_CHAR(l_max_schedule_start_date,'DD-MON-YYYY HH24:MI:SS'));
7240 END IF;
7241
7242 IF l_max_schedule_start_date > c_visit_rec.close_date_time THEN -- Validation Error
7243 Fnd_Message.SET_NAME('AHL','AHL_VWP_NON_PS_PLAN_ED_DATE');
7244 Fnd_Msg_Pub.ADD;
7245 RAISE Fnd_Api.G_EXC_ERROR;
7246 END IF;
7247
7248 END IF;
7249 --BUG 13373947 :: PRAKKUM :: 10/02/2012 :: END
7250
7251 /* Begin Changes by Shkalyan */
7252 IF (l_log_statement >= l_log_current_level) THEN
7253 fnd_log.string(l_log_statement,
7254 L_DEBUG_KEY,
7255 'Before calling GET_VISIT_RELATIONSHIPS.');
7256 END IF;
7257 -- yazhou starts
7258 -- IF l_visit_wo_id IS NULL THEN
7259 Get_Visit_Relationships
7260 (
7261 p_visit_id => p_visit_id,
7262 p_visit_number => c_visit_rec.visit_number,
7263 p_x_relationship_tbl => l_prd_workorder_rel_tbl
7264 );
7265
7266 IF (l_log_statement >= l_log_current_level) THEN
7267 fnd_log.string(l_log_statement,
7268 L_DEBUG_KEY,
7269 'After calling GET_VISIT_RELATIONSHIPS.');
7270 END IF;
7271 -- END IF;
7272 -- yazhou ends
7273
7274 -- Commented the below code by tchimira on 14-MAR-2012 as per the requirement stated in the bug 13695008
7275 /*IF (l_log_statement >= l_log_current_level) THEN
7276 fnd_log.string(l_log_statement,
7277 L_DEBUG_KEY,
7278 'Before calling GET_VISIT_DEPENDENCIES.');
7279 END IF;
7280
7281 IF (p_module_type <> 'CST') THEN
7282 Get_Visit_Dependencies
7283 (
7284 p_visit_id => p_visit_id,
7285 p_visit_number => c_visit_rec.visit_number,
7286 p_x_relationship_tbl => l_prd_workorder_rel_tbl
7287 );
7288 END IF;
7289
7290 IF (l_log_statement >= l_log_current_level) THEN
7291 fnd_log.string(l_log_statement,
7292 L_DEBUG_KEY,
7293 'After calling GET_VISIT_DEPENDENCIES.');
7294 END IF;*/
7295
7296 IF (l_log_statement >= l_log_current_level) THEN
7297 fnd_log.string(l_log_statement,
7298 L_DEBUG_KEY,
7299 'Before calling AHL_PRD_WORKORDER_PVT.Process_Jobs. l_prd_workorder_tbl.COUNT = ' || l_prd_workorder_tbl.COUNT);
7300 END IF;
7301
7302 AHL_PRD_WORKORDER_PVT.Process_Jobs
7303 ( p_api_version => p_api_version,
7304 p_init_msg_list => p_init_msg_list,
7305 p_commit => FND_API.G_FALSE,
7306 p_validation_level => p_validation_level,
7307 p_default => FND_API.G_TRUE,
7308 p_module_type => p_module_type,
7309 x_return_status => l_return_status,
7310 x_msg_count => x_msg_count,
7311 x_msg_data => x_msg_data,
7312 p_x_prd_workorder_tbl => l_prd_workorder_tbl,
7313 p_prd_workorder_rel_tbl => l_prd_workorder_rel_tbl
7314 );
7315 /* End Changes by Shkalyan */
7316
7317 IF (l_log_statement >= l_log_current_level) THEN
7318 fnd_log.string(l_log_statement,
7319 L_DEBUG_KEY,
7320 'After calling AHL_PRD_WORKORDER_PVT.Process_Jobs. Return Status = ' || l_return_status);
7321 END IF;
7322
7323 IF (l_return_status <> Fnd_Api.G_RET_STS_SUCCESS) THEN
7324 IF (l_log_statement >= l_log_current_level) THEN
7325 fnd_log.string(l_log_statement,
7326 L_DEBUG_KEY,
7327 'Errors from AHL_PRD_WORKORDER_PVT.Process_Jobs. Message count: ' ||
7328 l_msg_count || ', message data: ' || l_msg_data);
7329 END IF;
7330 IF l_return_status = FND_API.G_RET_STS_ERROR THEN
7331 RAISE FND_API.G_EXC_ERROR;
7332 ELSE
7333 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
7334 END IF;
7335 END IF;
7336
7337 -- Begin changes by rnahata for Bug 5758813
7338 /*The project start/end dates have to be updated with the workorder scheduled
7339 start/end dates.*/
7340 IF (l_log_statement >= l_log_current_level) THEN
7341 For i IN l_prd_workorder_tbl.FIRST..l_prd_workorder_tbl.LAST
7342 LOOP
7343 fnd_log.string(l_log_statement,
7344 L_DEBUG_KEY,
7345 'WorkOrder Id ('||i||'): '||l_prd_workorder_tbl(i).workorder_id);
7346 END LOOP;
7347 END IF;
7348
7349 IF (l_log_statement >= l_log_current_level) THEN
7350 fnd_log.string(l_log_statement,
7351 L_DEBUG_KEY,
7352 'Before calling Update_Project_Task_Times.');
7353 END IF;
7354
7355 Update_Project_Task_Times(p_prd_workorder_tbl => l_prd_workorder_tbl,
7356 p_commit =>'F',
7357 x_return_status => l_return_status,
7358 x_msg_count => l_msg_count,
7359 x_msg_data => l_msg_data);
7360
7361 IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
7362 x_msg_count := FND_MSG_PUB.count_msg;
7363 IF (l_log_statement >= l_log_current_level) THEN
7364 fnd_log.string(l_log_statement,
7365 L_DEBUG_KEY,
7366 'Errors from Update_Project_Task_Times. Message count: ' || x_msg_count);
7367 END IF;
7368 IF l_return_status = FND_API.G_RET_STS_ERROR THEN
7369 RAISE FND_API.G_EXC_ERROR;
7370 ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
7371 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
7372 END IF;
7373 ELSE
7374 IF (l_log_statement >= l_log_current_level) THEN
7375 fnd_log.string(l_log_statement,
7376 L_DEBUG_KEY,
7377 'Returned Success from Update_Project_Task_Times');
7378 END IF;
7379 END IF;
7380 -- End changes by rnahata for Bug 5758813
7381 END IF; -- To find if the visit has any tasks
7382
7383 IF (l_log_statement >= l_log_current_level) THEN
7384 fnd_log.string(l_log_statement,
7385 L_DEBUG_KEY,
7386 'Update Visit -- Released');
7387 END IF;
7388 --transit check visit change
7389 -- yazhou start
7390 IF (p_module_type <> 'CST') THEN
7391 IF p_orig_visit_id is null THEN
7392 --------------------------------- R12 changes For Serial Number Reservations Start----------------------------------
7393 ----------------------------------AnRaj added on 15th June 2005-----------------------------------------------------
7394 -- When a visit is pushed to production, all the material reservations that were
7395 -- created will have to be transferred with the WIP details
7396
7397 IF (l_log_statement >= l_log_current_level) THEN
7398 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Before calling AHL_RSV_RESERVATIONS_PVT.TRANSFER_RESERVATION');
7399 END IF;
7400
7401 AHL_RSV_RESERVATIONS_PVT.TRANSFER_RESERVATION
7402 (
7403 p_api_version => l_api_version,
7404 p_init_msg_list => l_init_msg_list,
7405 x_return_status => l_return_status,
7406 p_module_type => p_module_type,
7407 x_msg_count => l_msg_count,
7408 x_msg_data => l_msg_data,
7409 p_visit_id => p_visit_id
7410 );
7411
7412 IF (l_log_statement >= l_log_current_level) THEN
7413 fnd_log.string(l_log_statement,L_DEBUG_KEY,'After calling AHL_RSV_RESERVATIONS_PVT.TRANSFER_RESERVATION - l_return_status : '||l_return_status);
7414 END IF;
7415
7416 -- handle the exceptions, if any
7417 IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
7418 IF (l_log_statement >= l_log_current_level) THEN
7419 fnd_log.string(l_log_statement,
7420 L_DEBUG_KEY,
7421 ':Errors from AHL_RSV_RESERVATIONS_PVT.TRANSFER_RESERVATION API : ' || x_msg_count );
7422 END IF;
7423 RAISE Fnd_Api.g_exc_error;
7424 END IF;
7425 --------------------------------- R12 changes For Serial Number Reservations End----------------------------------
7426
7427 -- SKPATHAK :: 02-MAY-2011 :: VWPE: ER:12424063 :: Cancel stage and duplicate tasks and change stage WOs
7428 FOR l_task_to_cancel_rec IN get_visit_tasks_to_cancel (p_visit_id) LOOP
7429 IF (l_task_to_cancel_rec.task_type_code = 'STAGE' and l_task_to_cancel_rec.stage_id IS NOT NULL) THEN
7430 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
7431 fnd_log.string(fnd_log.level_statement,L_DEBUG_KEY,' c_visit_rec.IS_OLD_VISIT= '||c_visit_rec.IS_OLD_VISIT);
7432 END IF;
7433 IF c_visit_rec.IS_OLD_VISIT <> 'Y' THEN -- VWPE 12730539:: PRAKKUM :: 15-JUL-2011
7434 UPDATE AHL_VWP_STAGES_B
7435 SET STAGE_STATUS_CODE = 'RELEASED',
7436 OBJECT_VERSION_NUMBER = OBJECT_VERSION_NUMBER + 1,
7437 LAST_UPDATE_DATE = SYSDATE,
7438 LAST_UPDATED_BY = Fnd_Global.USER_ID,
7439 LAST_UPDATE_LOGIN = Fnd_Global.LOGIN_ID
7440 WHERE STAGE_ID = l_task_to_cancel_rec.stage_id;
7441 END IF;
7442 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
7443 fnd_log.string(fnd_log.level_statement,L_DEBUG_KEY,'Before calling AHL_PRD_WORKORDER_PVT.cancel_visit_jobs l_workorder_id= '||l_workorder_id);
7444 END IF;
7445 END IF;
7446
7447 AHL_PRD_WORKORDER_PVT.cancel_visit_jobs
7448 (p_api_version => 1.0,
7449 p_init_msg_list => FND_API.G_FALSE,
7450 p_commit => FND_API.G_FALSE,
7451 p_validation_level => FND_API.G_VALID_LEVEL_FULL,
7452 p_default => FND_API.G_FALSE,
7453 p_module_type => NULL,
7454 x_return_status => l_return_status,
7455 x_msg_count => l_msg_count,
7456 x_msg_data => l_msg_data,
7457 p_visit_id => NULL,
7458 p_unit_effectivity_id => NULL,
7459 p_workorder_id => l_task_to_cancel_rec.workorder_id);
7460
7461 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
7462 fnd_log.string(fnd_log.level_statement,L_DEBUG_KEY,'After calling AHL_PRD_WORKORDER_PVT.cancel_visit_jobs - l_return_status : '||l_return_status);
7463 END IF;
7464
7465 IF NVL(l_return_status,'x') <> FND_API.G_RET_STS_SUCCESS THEN
7466 x_msg_count := l_msg_count;
7467 x_return_status := l_return_status;
7468 IF l_return_status = Fnd_Api.g_ret_sts_error THEN
7469 RAISE Fnd_Api.g_exc_error;
7470 ELSIF l_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
7471 RAISE Fnd_Api.g_exc_unexpected_error;
7472 END IF;
7473 END IF;
7474 END LOOP;
7475
7476 UPDATE AHL_VISITS_B
7477 SET STATUS_CODE = 'RELEASED',
7478 OBJECT_VERSION_NUMBER = OBJECT_VERSION_NUMBER + 1,
7479 --TCHIMIRA::BUG 9222622 ::15-DEC-2009::UPDATE WHO COLUMNS
7480 LAST_UPDATE_DATE = SYSDATE,
7481 LAST_UPDATED_BY = Fnd_Global.USER_ID,
7482 LAST_UPDATE_LOGIN = Fnd_Global.LOGIN_ID
7483 WHERE VISIT_ID = p_visit_id;
7484
7485 ELSE
7486 UPDATE AHL_VISITS_B
7487 SET STATUS_CODE = c_orig_visit_rec.STATUS_CODE,
7488 OBJECT_VERSION_NUMBER = OBJECT_VERSION_NUMBER + 1,
7489 --TCHIMIRA::BUG 9222622 ::15-DEC-2009::UPDATE WHO COLUMNS
7490 LAST_UPDATE_DATE = SYSDATE,
7491 LAST_UPDATED_BY = Fnd_Global.USER_ID,
7492 LAST_UPDATE_LOGIN = Fnd_Global.LOGIN_ID
7493 WHERE VISIT_ID = p_visit_id;
7494 END IF;
7495
7496 END IF;
7497
7498 IF ( p_module_type <> 'CST' ) THEN
7499 IF p_orig_visit_id is null THEN
7500
7501 UPDATE AHL_VISIT_TASKS_B
7502 SET STATUS_CODE = 'RELEASED',
7503 OBJECT_VERSION_NUMBER = OBJECT_VERSION_NUMBER + 1,
7504 --TCHIMIRA::BUG 9222622 ::15-DEC-2009::UPDATE WHO COLUMNS
7505 LAST_UPDATE_DATE = SYSDATE,
7506 LAST_UPDATED_BY = Fnd_Global.USER_ID,
7507 LAST_UPDATE_LOGIN = Fnd_Global.LOGIN_ID
7508 WHERE VISIT_ID = p_visit_id
7509 AND STATUS_CODE IN ('PLANNING', 'PARTIALLY RELEASED')
7510 --SKPATHAK :: VWPE ER-12424063 :: 09-JUN-2011 :: Update the status of stage and duplicate tasks to CANCELLED
7511 AND TASK_TYPE_CODE NOT IN ('STAGE','DUPLICATE');
7512
7513 UPDATE AHL_VISIT_TASKS_B
7514 SET STATUS_CODE = 'CANCELLED',
7515 OBJECT_VERSION_NUMBER = OBJECT_VERSION_NUMBER + 1,
7516 --TCHIMIRA::BUG 9222622 ::15-DEC-2009::UPDATE WHO COLUMNS
7517 LAST_UPDATE_DATE = SYSDATE,
7518 LAST_UPDATED_BY = Fnd_Global.USER_ID,
7519 LAST_UPDATE_LOGIN = Fnd_Global.LOGIN_ID
7520 WHERE VISIT_ID = p_visit_id
7521 AND STATUS_CODE = 'PLANNING'
7522 AND ((TASK_TYPE_CODE = 'STAGE' AND STAGE_ID IS NOT NULL)
7523 OR TASK_TYPE_CODE = 'DUPLICATE');
7524
7525 ELSE
7526 UPDATE AHL_VISIT_TASKS_B
7527 SET STATUS_CODE = 'RELEASED',
7528 OBJECT_VERSION_NUMBER = OBJECT_VERSION_NUMBER + 1,
7529 --TCHIMIRA::BUG 9222622 ::15-DEC-2009::UPDATE WHO COLUMNS
7530 LAST_UPDATE_DATE = SYSDATE,
7531 LAST_UPDATED_BY = Fnd_Global.USER_ID,
7532 LAST_UPDATE_LOGIN = Fnd_Global.LOGIN_ID
7533 WHERE VISIT_ID = p_visit_id
7534 AND STATUS_CODE IN ('PLANNING', 'PARTIALLY RELEASED')
7535 --SKPATHAK :: VWPE ER-12424063 :: 09-JUN-2011 :: Need not s update the status of stage and duplicate tasks to RELEASED
7536 AND TASK_TYPE_CODE NOT IN ('STAGE','DUPLICATE')
7537 AND VISIT_TASK_NUMBER in (Select VISIT_TASK_NUMBER
7538 FROM ahl_visit_tasks_b
7539 where visit_id = p_orig_visit_id
7540 AND STATUS_CODE = 'RELEASED');
7541
7542 --SKPATHAK :: VWPE ER-12424063 :: 09-JUN-2011 :: Update the status of stage and duplicate tasks to CANCELLED
7543 UPDATE AHL_VISIT_TASKS_B
7544 SET STATUS_CODE = 'CANCELLED',
7545 OBJECT_VERSION_NUMBER = OBJECT_VERSION_NUMBER + 1,
7546 --TCHIMIRA::BUG 9222622 ::15-DEC-2009::UPDATE WHO COLUMNS
7547 LAST_UPDATE_DATE = SYSDATE,
7548 LAST_UPDATED_BY = Fnd_Global.USER_ID,
7549 LAST_UPDATE_LOGIN = Fnd_Global.LOGIN_ID
7550 WHERE VISIT_ID = p_visit_id
7551 AND STATUS_CODE = 'PLANNING'
7552 AND TASK_TYPE_CODE IN ('STAGE','DUPLICATE')
7553 AND VISIT_TASK_NUMBER in (Select VISIT_TASK_NUMBER
7554 FROM ahl_visit_tasks_b
7555 where visit_id = p_orig_visit_id
7556 AND STATUS_CODE = 'RELEASED');
7557 END IF;
7558 END IF;
7559 -- yazhou end
7560
7561 -- Start By Shbhanda 16th Feb 2004 --
7562 -- Earlier this code was in Release_Visit procedure
7563 -- was moved here as whenever the visit is pushed to production
7564 -- 'any_task_chg_flag' in Visit should always be 'N'
7565 -----------------------------------------------
7566 -- To call AHL_VWP_RULES_PVT.Update_Visit_Task_Flag to update any_task_chg_flag as 'N'
7567 IF (l_log_statement >= l_log_current_level) THEN
7568 fnd_log.string(l_log_statement,
7569 L_DEBUG_KEY,
7570 'Before calling AHL_VWP_RULES_PVT.Update_Visit_Task_Flag.');
7571 END IF;
7572
7573 IF c_visit_rec.any_task_chg_flag = 'Y' THEN
7574 AHL_VWP_RULES_PVT.Update_Visit_Task_Flag
7575 (p_visit_id => p_visit_id,
7576 p_flag => 'N',
7577 x_return_status => x_return_status);
7578 END IF;
7579
7580 IF (l_log_statement >= l_log_current_level) THEN
7581 fnd_log.string(l_log_statement,
7582 L_DEBUG_KEY,
7583 'After calling AHL_VWP_RULES_PVT.Update_Visit_Task_Flag');
7584 END IF;
7585 -- End By Shbhanda 16th Feb 2004 -------------
7586
7587 /* MANESING::Component Maintenance Planning Project, 05-Jul-2011
7588 * There is no need to delete Stage materials for Component Visits
7589 * as there won't be any Stage associated with them.
7590 */
7591 IF (l_is_comp_visit = 'N') THEN
7592
7593 -- TCHIMIRA :: 28-JUN-2011 :: VWP: ER:12673125 :: START
7594 -- We need to delete materials of default stage task when a visit is P2Ped
7595 IF ( p_module_type <> 'CST' ) THEN
7596 IF AHL_VWP_VISITS_PVT.Is_Old_Visit(p_visit_id) = 'N' THEN -- PRAKKUM :: VWPE: ER:12856858 :: 10-AUG-2011 :: Upgrade Changes
7597 IF (l_log_statement >= l_log_current_level) THEN
7598 fnd_log.string(l_log_statement,
7599 L_DEBUG_KEY,
7600 'Before calling AHL_LTP_REQST_MATRL_PVT.Delete_Default_Stage_Materials');
7601 END IF;
7602 OPEN c_get_vst_def_stage_task(p_visit_id);
7603 FETCH c_get_vst_def_stage_task INTO l_def_stage_task_id;
7604 CLOSE c_get_vst_def_stage_task;
7605
7606 AHL_LTP_REQST_MATRL_PVT.Delete_Default_Stage_Materials (
7607 p_api_version => 1.0 ,
7608 p_init_msg_list => FND_API.G_TRUE,
7609 p_commit => FND_API.G_FALSE,
7610 p_validation_level => FND_API.G_VALID_LEVEL_FULL,
7611 p_module_type => 'VST',
7612 p_visit_task_id => l_def_stage_task_id,
7613 x_return_status => l_return_status,
7614 x_msg_count => l_msg_count,
7615 x_msg_data => l_msg_data
7616 );
7617
7618 IF (l_log_statement >= l_log_current_level) THEN
7619 fnd_log.string(l_log_statement,
7620 L_DEBUG_KEY,
7621 'After calling AHL_LTP_REQST_MATRL_PVT.Delete_Default_Stage_Materials. and return status is:'||l_return_status);
7622 END IF;
7623 -- Check Error Message stack.
7624 IF NVL(l_return_status,'x') <> FND_API.G_RET_STS_SUCCESS THEN
7625 x_msg_count := l_msg_count;
7626 x_return_status := l_return_status;
7627 IF l_return_status = Fnd_Api.g_ret_sts_error THEN
7628 RAISE Fnd_Api.g_exc_error;
7629 ELSIF l_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
7630 RAISE Fnd_Api.g_exc_unexpected_error;
7631 END IF;
7632 END IF;
7633 END IF;
7634 END IF;
7635 -- TCHIMIRA :: 28-JUN-2011 :: VWP: ER:12673125 :: END
7636 END IF; -- if l_is_comp_visit = 'N'
7637
7638 ---------------------------End of Body-------------------------------------
7639 -- END of API body.
7640 -- Standard check of p_commit.
7641
7642 IF Fnd_Api.To_Boolean (p_commit) THEN
7643 COMMIT WORK;
7644 END IF;
7645
7646 Fnd_Msg_Pub.count_and_get(
7647 p_encoded => Fnd_Api.g_false,
7648 p_count => x_msg_count,
7649 p_data => x_msg_data
7650 );
7651
7652 IF (l_log_procedure >= l_log_current_level) THEN
7653 fnd_log.string(l_log_procedure,
7654 L_DEBUG_KEY ||'.end',
7655 'At the end of PL SQL procedure. Return Status = ' || x_return_status);
7656 END IF;
7657
7658 EXCEPTION
7659 WHEN Fnd_Api.g_exc_error THEN
7660 ROLLBACK TO Push_to_Production;
7661 x_return_status := Fnd_Api.g_ret_sts_error;
7662 Fnd_Msg_Pub.count_and_get (
7663 p_encoded => Fnd_Api.g_false,
7664 p_count => x_msg_count,
7665 p_data => x_msg_data
7666 );
7667 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
7668 ROLLBACK TO Push_to_Production;
7669 x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
7670 Fnd_Msg_Pub.count_and_get (
7671 p_encoded => Fnd_Api.g_false,
7672 p_count => x_msg_count,
7673 p_data => x_msg_data
7674 );
7675 WHEN OTHERS THEN
7676 ROLLBACK TO Push_to_Production;
7677 x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
7678 IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_unexp_error)
7679 THEN
7680 Fnd_Msg_Pub.add_exc_msg (G_PKG_NAME, l_api_name);
7681 END IF;
7682 Fnd_Msg_Pub.count_and_get (
7683 p_encoded => Fnd_Api.g_false,
7684 p_count => x_msg_count,
7685 p_data => x_msg_data
7686 );
7687 END Push_to_Production;
7688
7689 -------------------------------------------------------------------
7690 -- Procedure name : Release_Visit
7691 -- Type : Private
7692 --
7693 --
7694 -- Function :To Validate before pushing visit and its tasks to production
7695 --
7696 --
7697 -- Pre-reqs :
7698 -- Parameters :
7699 --
7700 -- Standard IN Parameters :
7701 -- p_api_version IN NUMBER Required
7702 -- p_init_msg_list IN VARCHAR2 Default FND_API.G_FALSE
7703 -- p_commit IN VARCHAR2 Default FND_API.G_FALSE
7704 -- p_validation_level IN NUMBER Default FND_API.G_VALID_LEVEL_FULL
7705 --
7706 -- Standard OUT Parameters :
7707 -- x_return_status OUT VARCHAR2 Required
7708 -- x_msg_count OUT NUMBER Required
7709 -- x_msg_data OUT VARCHAR2 Required
7710 --
7711 -- Release visit Parameters:
7712 -- p_visit_id IN NUMBER Required
7713 --
7714 -- Version :
7715 -- 09/09/2003 SSURAPAN Initial Creation
7716 -------------------------------------------------------------------
7717 PROCEDURE Release_Visit (
7718 p_api_version IN NUMBER,
7719 p_init_msg_list IN VARCHAR2 := Fnd_Api.G_FALSE,
7720 p_commit IN VARCHAR2 := Fnd_Api.G_FALSE,
7721 p_validation_level IN NUMBER := Fnd_Api.G_VALID_LEVEL_FULL,
7722 p_module_type IN VARCHAR2 := NULL,
7723 p_visit_id IN NUMBER,
7724 p_release_flag IN VARCHAR2 := 'N', -- By shbhanda 05/21/04 fro TC changes
7725 p_orig_visit_id IN NUMBER := NULL, -- By yazhou 08/06/04 for TC changes
7726 x_return_status OUT NOCOPY VARCHAR2,
7727 x_msg_count OUT NOCOPY NUMBER,
7728 x_msg_data OUT NOCOPY VARCHAR2)
7729 IS
7730 --Standard local variables
7731 L_API_NAME CONSTANT VARCHAR2(30) := 'Release_Visit';
7732 L_API_VERSION CONSTANT NUMBER := 1.0;
7733 L_DEBUG_KEY CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
7734 l_msg_data VARCHAR2(2000);
7735 l_return_status VARCHAR2(1);
7736 l_msg_count NUMBER;
7737 l_Error_Tbl_Type Error_Tbl_Type;
7738 l_error_msg VARCHAR2(5000);
7739 l_error_count NUMBER;
7740 l_commit VARCHAR2(1) := 'F';
7741 --Post 11.5.10
7742 -- RROY
7743 l_validate_error CONSTANT VARCHAR2(1) := 'V';
7744 --l_projects_error CONSTANT VARCHAR2(1) := 'R';
7745 l_push_error CONSTANT VARCHAR2(1) := 'P';
7746 -- RROY
7747 --TCHIMIRA::P2P CP ER 9151144::02-DEC-2009
7748 l_err_msg VARCHAR2(2000);
7749 l_msg_index_out NUMBER;
7750 l_phase_code VARCHAR2(1);
7751
7752 --TCHIMIRA::P2P CP ER 9151144::09-DEC-2009
7753 l_entl_rec_tbl AHL_WARRANTY_ENTL_PVT.Warranty_Entl_Tbl_Type; --salogan added for supplier warranty
7754
7755 --salogan::Modified the cursor to handle both request id from P2P and Cost Estimation CP ER 9299910::01-JUN-2009::BEGIN
7756 --Cursor to fetch phase
7757 CURSOR c_conc_req_phase(c_id IN NUMBER) IS
7758 SELECT 'X'
7759 FROM FND_CONCURRENT_REQUESTS FCR, AHL_VISITS_B AVB
7760 WHERE FCR.REQUEST_ID IN ( AVB.CST_EST_REQUEST_ID, AVB.REQUEST_ID )
7761 AND FCR.PHASE_CODE IN ('P', 'R')
7762 AND AVB.VISIT_ID = c_id;
7763 l_dummy_val c_conc_req_phase%ROWTYPE;
7764 --salogan::Modified the cursor to handle both request id from P2P and Cost Estimation CP ER 9299910::01-JUN-2009::END
7765
7766 -- To find visit related information
7767 CURSOR c_visit (x_id IN NUMBER) IS
7768 SELECT * FROM AHL_VISITS_VL
7769 WHERE VISIT_ID = x_id
7770 -- TCHIMIRA :: Bug 8594339 :: 19-NOV-2009
7771 -- Lock the visit record
7772 FOR UPDATE OF OBJECT_VERSION_NUMBER;
7773 c_visit_rec c_visit%ROWTYPE;
7774
7775 -- SKPATHAK :: Bug 9971127 :: 13-AUG-2010
7776 -- Added this cursor to validate if any of the children UEs for a given visit is in EXCEPTION status
7777 -- and if yes, return the MR title corresponding to one of the UEs in EXCEPTION status
7778 CURSOR c_validate_ue_status (x_id IN NUMBER) IS
7779 SELECT mr.title
7780 FROM ahl_visit_tasks_vl avt, ahl_unit_effectivities_b ue, ahl_mr_headers_b mr
7781 WHERE avt.visit_id = x_id
7782 AND NVL(avt.status_code, 'X') = 'PLANNING'
7783 AND (avt.task_type_code <> 'SUMMARY' OR
7784 (avt.task_type_code = 'SUMMARY' AND
7785 (avt.mr_id IS NOT NULL OR avt.unit_effectivity_id IS NOT NULL)))
7786 AND avt.unit_effectivity_id = ue.unit_effectivity_id
7787 AND NVL(ue.status_code, 'X') = 'EXCEPTION'
7788 AND ue.mr_header_id = mr.mr_header_id
7789 AND rownum = 1;
7790 l_mr_title VARCHAR2(200);
7791
7792 --CHANGES by jrotich bug #13028686 begin
7793 CURSOR c_stages_without_types(c_visit_id IN NUMBER ) IS
7794 SELECT DISTINCT STAGES.STAGE_ID ,
7795 STAGES.STAGE_NAME
7796 FROM AHL_VISIT_TASKS_B TASKS,
7797 AHL_VWP_STAGES_VL STAGES
7798 WHERE
7799 TASKS.VISIT_ID= c_visit_id AND
7800 STAGES.STAGE_ID=TASKS.STAGE_ID AND
7801 TASKS.TASK_TYPE_CODE <> 'STAGE' AND --SKPATHAK :: stages not having any visit tasks need not be validated
7802 NOT EXISTS (
7803 SELECT STAGE_ID
7804 FROM AHL_VISIT_STAGE_TYP_ASOC
7805 WHERE STAGE_ID=STAGES.STAGE_ID);
7806 l_invalid_stage BOOLEAN;
7807 --CHANGES by jrotich bug #13028686 end
7808
7809 BEGIN
7810
7811 IF (l_log_procedure >= l_log_current_level) THEN
7812 fnd_log.string(l_log_procedure,L_DEBUG_KEY||'.begin','At the start of the PLSQL procedure');
7813 END IF;
7814
7815 -- Standard start of API savepoint
7816 SAVEPOINT Release_Visit_Pvt;
7817
7818
7819
7820 -- Initialize message list if p_init_msg_list is set to TRUE
7821 IF FND_API.To_Boolean(p_init_msg_list) THEN
7822 FND_MSG_PUB.Initialize;
7823 END IF;
7824
7825 -- Initialize message list if p_init_msg_list is set to TRUE
7826 IF FND_API.To_Boolean(p_init_msg_list) THEN
7827 FND_MSG_PUB.Initialize;
7828 END IF;
7829 -- Initialize API return status to success
7830 x_return_status := FND_API.G_RET_STS_SUCCESS;
7831
7832 -- Standard call to check for call compatibility.
7833 IF NOT FND_API.COMPATIBLE_API_CALL(l_api_version,
7834 p_api_version,
7835 l_api_name,G_PKG_NAME) THEN
7836 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
7837 END IF;
7838
7839 --
7840
7841 IF (l_log_statement >= l_log_current_level) THEN
7842 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Visit ID : '||p_visit_id);
7843 END IF;
7844
7845 -- Check for Required Parameters
7846 IF(p_visit_id IS NULL OR p_visit_id = FND_API.G_MISS_NUM) THEN
7847 FND_MESSAGE.Set_Name(G_PM_PRODUCT_CODE,'AHL_VWP_CST_INPUT_MISS');
7848 FND_MSG_PUB.ADD;
7849 IF (l_log_unexpected >= l_log_current_level)THEN
7850 fnd_log.string
7851 (
7852 l_log_unexpected,
7853 'ahl.plsql.AHL_VWP_CST_WO_PVT.Release_Visit',
7854 'Visit id is mandatory but found null in input '
7855 );
7856 END IF;
7857 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
7858 END IF;
7859
7860 -- SKPATHAK :: Bug 9971127 :: 13-AUG-2010
7861 -- Added this cursor to validate if any of the children UEs for a given visit is in EXCEPTION status
7862 -- and if yes, return the MR title corresponding to one of the UEs in EXCEPTION status
7863 OPEN c_validate_ue_status (p_visit_id);
7864 FETCH c_validate_ue_status INTO l_mr_title;
7865 IF c_validate_ue_status%FOUND THEN
7866 CLOSE c_validate_ue_status;
7867 Fnd_Message.SET_NAME('AHL','AHL_VWP_UE_EXP_STATUS');
7868 Fnd_Message.Set_Token('MR_TITLE',l_mr_title);
7869 Fnd_Msg_Pub.ADD;
7870 RAISE Fnd_Api.G_EXC_ERROR;
7871 END IF;
7872 CLOSE c_validate_ue_status;
7873
7874 --TCHIMIRA::P2P CP ER 9151144::09-DEC-2009::BEGIN
7875 --Throws an error if the phase code is either pending or running
7876 IF(p_release_flag = 'Y' OR p_release_flag = 'N')THEN
7877 --salogan::Modified the cursor fetch to handle both request id from P2P and Cost Estimation CP ER 9299910::01-JUN-2009::BEGIN
7878 OPEN c_conc_req_phase(p_visit_id);
7879 FETCH c_conc_req_phase INTO l_dummy_val;
7880 IF(c_conc_req_phase%FOUND) THEN
7881 FND_MESSAGE.Set_Name(G_PM_PRODUCT_CODE,'AHL_VWP_CP_P2P_IN_PROGS');
7882 FND_MSG_PUB.ADD;
7883 RAISE FND_API.G_EXC_ERROR;
7884 END IF;
7885 CLOSE c_conc_req_phase;
7886 --salogan::Modified the cursor fetch to handle both request id from P2P and Cost Estimation CP ER 9299910::01-JUN-2009::END
7887 END IF;
7888 --TCHIMIRA::P2P CP ER 9151144::09-DEC-2009::END
7889
7890 -- TCHIMIRA :: Bug 8594339 :: 19-NOV-2009
7891 -- Lock the visit record
7892 OPEN c_visit(p_visit_id);
7893 FETCH c_visit INTO c_visit_rec;
7894
7895
7896 --CHANGES by jrotich bug #13028686 begin
7897 IF p_module_type <> 'CST' THEN -- SKPATHAK :: have this validation only during P2P and NOT during plan visit
7898 IF (l_log_statement >= l_log_current_level)THEN
7899 fnd_log.string (l_log_statement,L_DEBUG_KEY, 'Validating stage details');
7900 END IF;
7901
7902 l_invalid_stage :=FALSE;
7903 FOR stage_details_rec in c_stages_without_types(p_visit_id)
7904 LOOP
7905 l_invalid_stage :=TRUE;
7906 IF (l_log_statement >= l_log_current_level) THEN
7907 fnd_log.string(l_log_statement,
7908 L_DEBUG_KEY,
7909 'Stage does not have an associated stage type ' ||
7910 stage_details_rec.stage_name);
7911 END IF;
7912 FND_MESSAGE.SET_NAME('AHL', 'AHL_VWP_NO_STAGE_TYPE');
7913 FND_MESSAGE.SET_TOKEN('STAGE_NAME',stage_details_rec.stage_name);
7914 FND_MSG_PUB.ADD;
7915
7916 END LOOP;
7917
7918 IF(l_invalid_stage=TRUE) THEN
7919 RAISE FND_API.G_EXC_ERROR;
7920 END IF;
7921 END IF;
7922
7923 --CHANGES by jrotich bug #13028686 END
7924
7925 --TCHIMIRA::P2P CP ER 9151144::02-DEC-2009::Modified the if condition to check if the P2P is normal or background
7926 IF(p_release_flag = 'Y' OR p_release_flag = 'N')THEN
7927 IF (l_log_statement >= l_log_current_level)THEN
7928 fnd_log.string (l_log_statement,L_DEBUG_KEY, 'Before Calling Validate Before Production');
7929 END IF;
7930
7931 --Valdate before push to production happens
7932 AHL_VWP_PROJ_PROD_PVT.Validate_Before_Production
7933 (p_api_version => l_api_version,
7934 p_init_msg_list => p_init_msg_list,
7935 p_commit => l_commit,
7936 p_validation_level => p_validation_level,
7937 p_module_type => p_module_type,
7938 p_visit_id => p_visit_id,
7939 x_error_tbl => l_error_tbl_type,
7940 x_return_status => l_return_status,
7941 x_msg_count => l_msg_count,
7942 x_msg_data => l_msg_data);
7943
7944 IF (l_log_statement >= l_log_current_level)THEN
7945 fnd_log.string (l_log_statement, L_DEBUG_KEY, 'After Calling Validate Before Production - l_return_status = '||l_return_status);
7946 END IF;
7947 END IF;
7948 -- Post 11.5.10
7949 -- RROY
7950 IF l_error_tbl_type.COUNT > 0 THEN
7951 l_return_status := l_validate_error;
7952 x_return_status := l_validate_error;
7953 ELSIF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
7954 -- Check Error Message stack.
7955 x_msg_count := FND_MSG_PUB.count_msg;
7956
7957 IF (l_log_statement >= l_log_current_level)THEN
7958 fnd_log.string ( l_log_statement, L_DEBUG_KEY,'Errors from Validate Before Production - '||x_msg_count);
7959 END IF;
7960 -- TCHIMIRA :: Bug 8594339 :: 19-NOV-2009
7961 CLOSE c_visit;
7962 RAISE Fnd_Api.g_exc_error;
7963 ELSE
7964 IF (l_log_statement >= l_log_current_level)THEN
7965 fnd_log.string(l_log_statement,L_DEBUG_KEY, 'Before Calling aggregate_material_requirements');
7966 END IF;
7967
7968 -- AnRaj: Added as part of Material Requirement Aggrgation Enhancement, Bug#5303378
7969 -- Call aggregate_material_requirements for a visit
7970 -- If a visit task has more than one requirement for the same item, then this method will aggregate
7971 -- all those requirements into a single requirement
7972 Aggregate_Material_Reqrs
7973 ( p_api_version => l_api_version,
7974 p_init_msg_list => p_init_msg_list,
7975 p_commit => l_commit,
7976 p_validation_level => p_validation_level,
7977 p_module_type => p_module_type,
7978 p_visit_id => p_visit_id,
7979 x_return_status => l_return_status,
7980 x_msg_count => l_msg_count,
7981 x_msg_data => l_msg_data
7982 );
7983 IF (l_log_statement >= l_log_current_level)THEN
7984 fnd_log.string(l_log_statement,L_DEBUG_KEY, 'After Calling aggregate_material_requirements - l_return_status = '||l_return_status);
7985 END IF;
7986
7987 IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
7988 x_msg_count := FND_MSG_PUB.count_msg;
7989 IF (l_log_statement >= l_log_current_level)THEN
7990 fnd_log.string( l_log_statement,L_DEBUG_KEY,'Errors from aggregate_material_requirements: ' || x_msg_count);
7991 END IF;
7992 -- TCHIMIRA :: Bug 8594339 :: 19-NOV-2009
7993 CLOSE c_visit;
7994 RAISE Fnd_Api.g_exc_error;
7995 END IF;
7996
7997 --salogan added the following code for supplier warranty starts
7998 Get_Entl_rec_for_Delete(
7999 p_visit_id => p_visit_id,
8000 x_warranty_entl_tbl => l_entl_rec_tbl);
8001
8002 IF (l_log_statement >= l_log_current_level) THEN
8003 fnd_log.string(l_log_statement,
8004 L_DEBUG_KEY,
8005 'Before calling AHL_WARRANTY_ENTL_PVT.Process_Warranty_Entitlements.');
8006 END IF;
8007
8008 --Not passing p_commit the main API commits the data at the end
8009 AHL_WARRANTY_ENTL_PVT.Process_Warranty_Entitlements(
8010 p_api_version => l_api_version,
8011 p_validation_level => p_validation_level,
8012 p_module_type => p_module_type,
8013 p_user_role => AHL_WARRANTY_ENTL_PVT.G_USER_PLANNER,
8014 p_x_warranty_entl_tbl => l_entl_rec_tbl,
8015 x_return_status => l_return_status,
8016 x_msg_count => l_msg_count,
8017 x_msg_data => l_msg_data);
8018
8019 IF (l_log_statement >= l_log_current_level) THEN
8020 fnd_log.string(l_log_statement,
8021 L_DEBUG_KEY,
8022 'After calling AHL_WARRANTY_ENTL_PVT.Process_Warranty_Entitlements. Return Status = ' ||
8023 l_return_status);
8024 END IF;
8025
8026 l_msg_count := Fnd_Msg_Pub.count_msg;
8027 IF l_msg_count > 0 OR l_return_status <> Fnd_Api.g_ret_sts_success THEN
8028 x_msg_count := l_msg_count;
8029 x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
8030 RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
8031 END IF;
8032 -- salogan added for supplier warranty ends
8033
8034 IF (l_log_statement >= l_log_current_level)THEN
8035 fnd_log.string(l_log_statement,L_DEBUG_KEY, 'Before calling Push_to_Production');
8036 END IF;
8037
8038 --Call push to production with module type 'CST'
8039 AHL_VWP_PROJ_PROD_PVT.Push_to_Production
8040 (p_api_version => l_api_version,
8041 p_init_msg_list => p_init_msg_list,
8042 p_commit => l_commit,
8043 p_validation_level => p_validation_level,
8044 p_module_type => p_module_type, --'JSP', -- earlier 'CST'
8045 p_visit_id => p_visit_id,
8046 p_release_flag => p_release_flag,
8047 p_orig_visit_id => p_orig_visit_id,
8048 x_return_status => l_return_status,
8049 x_msg_count => l_msg_count,
8050 x_msg_data => l_msg_data);
8051
8052 IF (l_log_statement >= l_log_current_level)THEN
8053 fnd_log.string(l_log_statement,L_DEBUG_KEY, 'After calling Push_to_Production - l_return_status = '||l_return_status);
8054 END IF;
8055
8056 IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
8057 -- Check Error Message stack.
8058 x_msg_count := FND_MSG_PUB.count_msg;
8059 IF (l_log_statement >= l_log_current_level)THEN
8060 fnd_log.string( l_log_statement,L_DEBUG_KEY, 'Errors from Push to Production: ' || x_msg_count );
8061 END IF;
8062 -- TCHIMIRA :: Bug 8594339 :: 19-NOV-2009
8063 CLOSE c_visit;
8064 RAISE Fnd_Api.g_exc_error;
8065 END IF;
8066
8067 IF (l_log_statement >= l_log_current_level)THEN
8068 fnd_log.string(l_log_statement,L_DEBUG_KEY, 'Before calling AHL_LTP_SIMUL_PLAN_PVT.delete_simul_visits');
8069 END IF;
8070
8071 -- SKPATHAK :: 02-MAY-2011 :: VWPE: ER:12424063
8072 -- Below call is not needed since LTP is being removed so no simulation visit exists
8073 -- Delete simulated visits associated to this visit
8074 /*AHL_LTP_SIMUL_PLAN_PVT.delete_simul_visits
8075 (p_api_version => l_api_version,
8076 p_init_msg_list => p_init_msg_list,
8077 p_commit => l_commit,
8078 p_validation_level => p_validation_level,
8079 p_visit_id => p_visit_id,
8080 x_return_status => l_return_status,
8081 x_msg_count => l_msg_count,
8082 x_msg_data => l_msg_data);
8083
8084 IF (l_log_statement >= l_log_current_level)THEN
8085 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);
8086 END IF;
8087
8088 IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
8089 -- Check Error Message stack.
8090 x_msg_count := FND_MSG_PUB.count_msg;
8091 IF (l_log_statement >= l_log_current_level)THEN
8092 fnd_log.string( l_log_statement,L_DEBUG_KEY,'Errors from delete_simul_visits: '||x_msg_count);
8093 END IF;
8094 -- TCHIMIRA :: Bug 8594339 :: 19-NOV-2009
8095 CLOSE c_visit;
8096 RAISE Fnd_Api.g_exc_error;
8097 END IF;*/
8098 END IF;
8099 -- Post 11.5.10
8100 -- RROY
8101 -- TCHIMIRA :: Bug 8594339 :: 19-NOV-2009
8102 CLOSE c_visit;
8103
8104 -- Standard check of p_commit
8105 IF FND_API.TO_BOOLEAN(p_commit) THEN
8106 COMMIT WORK;
8107 END IF;
8108
8109 IF (l_log_procedure >= l_log_current_level)THEN
8110 fnd_log.string ( l_log_procedure,L_DEBUG_KEY ||'.end','At the end of PLSQL procedure');
8111 END IF;
8112
8113 EXCEPTION
8114 WHEN FND_API.G_EXC_ERROR THEN
8115 x_return_status := FND_API.G_RET_STS_ERROR;
8116 ROLLBACK TO Release_Visit_Pvt;
8117 FND_MSG_PUB.count_and_get(p_count => x_msg_count,
8118 p_data => x_msg_data,
8119 p_encoded => fnd_api.g_false);
8120
8121
8122 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
8123 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
8124 ROLLBACK TO Release_Visit_Pvt;
8125 FND_MSG_PUB.count_and_get(p_count => x_msg_count,
8126 p_data => x_msg_data,
8127 p_encoded => fnd_api.g_false);
8128
8129
8130 WHEN OTHERS THEN
8131 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
8132 ROLLBACK TO Release_Visit_Pvt;
8133 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
8134 fnd_msg_pub.add_exc_msg(p_pkg_name => G_PKG_NAME,
8135 p_procedure_name => 'Release_Visit',
8136 p_error_text => SUBSTR(SQLERRM,1,500));
8137 END IF;
8138 FND_MSG_PUB.count_and_get(p_count => x_msg_count,
8139 p_data => x_msg_data,
8140 p_encoded => fnd_api.g_false);
8141
8142 END Release_Visit;
8143
8144 -------------------------------------------------------------------
8145 -- Procedure name : Release_Tasks
8146 -- Type : Private
8147 -- Function : Validate the tasks and then push tasks to production
8148 -- Parameters :
8149 --
8150 -- Standard IN Parameters :
8151 -- p_api_version IN NUMBER Required
8152 -- p_init_msg_list IN VARCHAR2 Default FND_API.G_FALSE
8153 -- p_commit IN VARCHAR2 Default FND_API.G_FALSE
8154 -- p_validation_level IN NUMBER Default FND_API.G_VALID_LEVEL_FULL
8155 --
8156 -- Standard OUT Parameters :
8157 -- x_return_status OUT VARCHAR2 Required
8158 -- x_msg_count OUT NUMBER Required
8159 -- x_msg_data OUT VARCHAR2 Required
8160 --
8161 -- Parameters:
8162 -- p_visit_id IN NUMBER Required
8163 -- p_release_flag IN VARCHAR2 Default 'N'
8164 -- p_tasks_tbl IN Task_Tbl_Type Required
8165 --
8166 -- Version :
8167 -- 30 November, 2007 RNAHATA Initial Version - 1.0
8168 -------------------------------------------------------------------
8169 PROCEDURE Release_Tasks(
8170 p_api_version IN NUMBER,
8171 p_init_msg_list IN VARCHAR2 := Fnd_Api.G_FALSE,
8172 p_commit IN VARCHAR2 := Fnd_Api.G_FALSE,
8173 p_validation_level IN NUMBER := Fnd_Api.G_VALID_LEVEL_FULL,
8174 p_module_type IN VARCHAR2 := Null,
8175 p_visit_id IN NUMBER,
8176 p_tasks_tbl IN Task_Tbl_Type,
8177 p_release_flag IN VARCHAR2 := 'N',
8178 x_return_status OUT NOCOPY VARCHAR2,
8179 x_msg_count OUT NOCOPY NUMBER,
8180 x_msg_data OUT NOCOPY VARCHAR2)
8181 IS
8182 L_API_NAME CONSTANT VARCHAR2(30) := 'Release_Tasks';
8183 L_API_VERSION CONSTANT NUMBER := 1.0;
8184 L_DEBUG_KEY CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
8185 l_msg_data VARCHAR2(2000);
8186 l_return_status VARCHAR2(1);
8187 l_msg_count NUMBER;
8188 l_Error_Tbl_Type Error_Tbl_Type;
8189 l_tasks_tbl Task_Tbl_Type;
8190 l_validate_visit NUMBER:= 0;
8191 l_temp_msg_count NUMBER:=0; --rnahata
8192 -- SKPATHAK :: ER:12730539 :: 01-AUG-2011
8193 l_val_task_tbl AHL_VWP_RULES_PVT.Task_Tbl_Type;
8194
8195 -- chk if the visit is valid
8196 CURSOR c_validate_visit (x_id IN NUMBER) IS
8197 SELECT 1 FROM AHL_VISITS_B
8198 WHERE VISIT_ID = x_id;
8199
8200 -- chk if the visit is in partially released or planning status
8201 CURSOR c_visit_info (x_id IN NUMBER) IS
8202 SELECT start_date_time,status_code FROM AHL_VISITS_B
8203 WHERE VISIT_ID = x_id
8204 AND NVL(STATUS_CODE,'X') IN ('PARTIALLY RELEASED', 'PLANNING');
8205
8206 c_visit_info_rec c_visit_info%ROWTYPE;
8207
8208 -- SKPATHAK :: ER:12730539 :: 01-AUG-2011
8209 CURSOR get_task_status (c_task_id IN NUMBER) IS
8210 SELECT status_code FROM ahl_visit_tasks_b
8211 WHERE visit_task_id = c_task_id;
8212 l_task_status VARCHAR2(30);
8213
8214 BEGIN
8215
8216 IF (l_log_procedure >= l_log_current_level) THEN
8217 fnd_log.string(l_log_procedure,
8218 L_DEBUG_KEY ||'.begin',
8219 'At the start of PL SQL procedure. Visit Id = ' || p_visit_id ||
8220 'p_tasks_tbl.COUNT = ' || p_tasks_tbl.COUNT);
8221 END IF;
8222
8223 -- Standard start of API savepoint
8224 SAVEPOINT Release_Tasks_Pvt;
8225
8226 -- Initialize message list if p_init_msg_list is set to TRUE
8227 IF FND_API.To_Boolean(p_init_msg_list) THEN
8228 FND_MSG_PUB.Initialize;
8229 END IF;
8230
8231 -- Initialize API return status to success
8232 x_return_status := FND_API.G_RET_STS_SUCCESS;
8233
8234 -- Standard call to check for call compatibility.
8235 IF NOT FND_API.COMPATIBLE_API_CALL(l_api_version,
8236 p_api_version,
8237 l_api_name,G_PKG_NAME)
8238 THEN
8239 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
8240 END IF;
8241
8242 --Check for required parameters
8243 IF (p_visit_id IS NOT NULL) THEN
8244
8245 OPEN c_validate_visit(p_visit_id);
8246 FETCH c_validate_visit INTO l_validate_visit;
8247 CLOSE c_validate_visit;
8248
8249 --Validate visit
8250 IF (nvl(l_validate_visit,0) = 0) THEN
8251 IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_error) THEN
8252 FND_MESSAGE.Set_Name(G_PM_PRODUCT_CODE,'AHL_VWP_INVALID_VST');
8253 FND_MESSAGE.SET_TOKEN('VISIT_ID', p_visit_id);
8254 FND_MSG_PUB.ADD;
8255 END IF;
8256 RAISE FND_API.G_EXC_ERROR;
8257 END IF;
8258
8259 --Check if the visit is in planning or partially released status
8260 OPEN c_visit_info(p_visit_id);
8261 FETCH c_visit_info INTO c_visit_info_rec;
8262 IF c_visit_info%NOTFOUND THEN
8263 IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_error) THEN
8264 FND_MESSAGE.Set_Name(G_PM_PRODUCT_CODE,'AHL_VWP_VST_STATUS_INVALID');
8265 FND_MSG_PUB.ADD;
8266 END IF;
8267 CLOSE c_visit_info;
8268 RAISE FND_API.G_EXC_ERROR;
8269 END IF;
8270 CLOSE c_visit_info;
8271 --If visit_id is null
8272 ELSE
8273 IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_error) THEN
8274 FND_MESSAGE.Set_Name(G_PM_PRODUCT_CODE,'AHL_VWP_VISIT_NULL');
8275 FND_MSG_PUB.ADD;
8276 END IF;
8277 RAISE FND_API.G_EXC_ERROR;
8278 END IF;
8279
8280 --No tasks selected
8281 IF (p_tasks_tbl.COUNT = 0) THEN
8282 IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_error) THEN
8283 FND_MESSAGE.Set_Name(G_PM_PRODUCT_CODE,'AHL_VWP_NO_TASK_SEL');
8284 FND_MSG_PUB.ADD;
8285 END IF;
8286 RAISE FND_API.G_EXC_ERROR;
8287 END IF;
8288
8289 IF (l_log_statement >= l_log_current_level) THEN
8290 fnd_log.string(l_log_statement,
8291 L_DEBUG_KEY,
8292 'Before calling VALIDATE_BEFORE_PRODUCTION');
8293 END IF;
8294
8295 --Validate visit before pushing the tasks to production
8296 AHL_VWP_PROJ_PROD_PVT.Validate_Before_Production
8297 (p_api_version => l_api_version,
8298 p_init_msg_list => p_init_msg_list,
8299 p_commit => 'F',
8300 p_validation_level => p_validation_level,
8301 p_module_type => 'TSK',
8302 p_visit_id => p_visit_id,
8303 x_error_tbl => l_error_tbl_type,
8304 x_return_status => l_return_status,
8305 x_msg_count => l_msg_count,
8306 x_msg_data => l_msg_data);
8307
8308 IF (l_log_statement >= l_log_current_level) THEN
8309 fnd_log.string(l_log_statement,
8310 L_DEBUG_KEY,
8311 'After calling VALIDATE_BEFORE_PRODUCTION, Return Status = ' ||
8312 l_return_status);
8313 END IF;
8314
8315 IF (l_return_status <> FND_API.G_RET_STS_SUCCESS OR l_error_tbl_type.COUNT > 0) THEN
8316 -- Check Error Message stack.
8317 x_msg_count := FND_MSG_PUB.count_msg;
8318 IF (l_log_statement >= l_log_current_level) THEN
8319 fnd_log.string(l_log_statement,
8320 L_DEBUG_KEY,
8321 'Errors from VALIDATE_BEFORE_PRODUCTION. Message count: ' || x_msg_count);
8322 END IF;
8323 IF l_return_status = FND_API.G_RET_STS_ERROR THEN
8324 RAISE FND_API.G_EXC_ERROR;
8325 ELSE
8326 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
8327 END IF;
8328 END IF;
8329
8330 IF (l_log_statement >= l_log_current_level) THEN
8331 fnd_log.string(l_log_statement,
8332 L_DEBUG_KEY,
8333 'Before calling VALIDATE_TASKS_BEF_PRODUCTION. p_module_type = ' || p_module_type);
8334 END IF;
8335
8336 --Validate tasks before push to production happens
8337 AHL_VWP_PROJ_PROD_PVT.Validate_tasks_bef_production(
8338 p_visit_id => p_visit_id,
8339 p_tasks_tbl => p_tasks_tbl,
8340 x_tasks_tbl => l_tasks_tbl,
8341 x_return_status => l_return_status,
8342 x_msg_count => l_msg_count,
8343 x_msg_data => l_msg_data);
8344
8345 IF (l_log_statement >= l_log_current_level) THEN
8346 fnd_log.string(l_log_statement,
8347 L_DEBUG_KEY,
8348 'After calling VALIDATE_TASKS_BEF_PRODUCTION. Records in l_tasks_tbl: ' ||
8349 l_tasks_tbl.COUNT|| ', Return Status = ' || l_return_status);
8350 END IF;
8351
8352 IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
8353 -- Check Error Message stack.
8354 x_msg_count := FND_MSG_PUB.count_msg;
8355
8356 IF (l_log_statement >= l_log_current_level) THEN
8357 fnd_log.string(l_log_statement,
8358 L_DEBUG_KEY,
8359 'Errors from VALIDATE_TASKS_BEF_PRODUCTION. Message count: ' || x_msg_count);
8360 END IF;
8361
8362 IF l_return_status = FND_API.G_RET_STS_ERROR THEN
8363 RAISE FND_API.G_EXC_ERROR;
8364 ELSE
8365 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
8366 END IF;
8367 END IF; -- l_return_status <> FND_API.G_RET_STS_SUCCESS
8368
8369 -- SKPATHAK :: ER:12730539 :: 01-AUG-2011 :: START :: Validate Return to Supply Flags of only the released tasks
8370 -- SKPATHAK:: Moved this API call from after AHL_PRD_WORKORDER_PVT.Process_Jobs call to before AHL_PRD_WORKORDER_PVT.Process_Jobs call
8371 FOR i IN l_tasks_tbl.FIRST..l_tasks_tbl.LAST LOOP
8372 l_val_task_tbl(i) := l_tasks_tbl(i);
8373 END LOOP;
8374
8375 IF (l_log_statement >= l_log_current_level) THEN
8376 fnd_log.string(l_log_statement,
8377 L_DEBUG_KEY,
8378 'Before Calling AHL_VWP_RULES_PVT.Validate_Return_To_Supply. l_tasks_tbl.count = ' || l_tasks_tbl.count );
8379 END IF;
8380
8381 IF (p_visit_id IS NOT NULL) THEN
8382 AHL_VWP_RULES_PVT.Validate_Return_To_Supply
8383 (
8384 p_api_version => 1.0,
8385 p_init_msg_list => FND_API.G_FALSE,
8386 p_commit => FND_API.G_FALSE,
8387 p_validation_level => FND_API.G_VALID_LEVEL_FULL,
8388 p_module_type => null,
8389 p_visit_id => null,
8390 p_tasks_tbl => l_val_task_tbl,
8391 x_return_status => l_return_status,
8392 x_msg_count => l_msg_count,
8393 x_msg_data => l_msg_data
8394 );
8395
8396 IF (l_log_statement >= l_log_current_level) THEN
8397 fnd_log.string(l_log_statement,
8398 L_DEBUG_KEY,
8399 'After Calling AHL_VWP_RULES_PVT.Validate_Return_To_Supply. Return Status = ' || l_return_status );
8400 END IF;
8401
8402 IF NVL(l_return_status,'x') <> FND_API.G_RET_STS_SUCCESS THEN
8403 x_msg_count := l_msg_count;
8404 x_return_status := l_return_status;
8405 IF l_return_status = Fnd_Api.g_ret_sts_error THEN
8406 RAISE Fnd_Api.g_exc_error;
8407 ELSIF l_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
8408 RAISE Fnd_Api.g_exc_unexpected_error;
8409 END IF;
8410 END IF;
8411 END IF;
8412 -- SKPATHAK :: ER:12730539 :: 01-AUG-2011 :: END
8413
8414 IF (l_log_statement >= l_log_current_level) THEN
8415 fnd_log.string(l_log_statement,
8416 L_DEBUG_KEY,
8417 'Before calling AGGREGATE_TASK_MATERIAL_REQRS ');
8418 END IF;
8419
8420 --Total the material requirements for a specific item at task level
8421 FOR i IN l_tasks_tbl.FIRST..l_tasks_tbl.LAST
8422 LOOP
8423 AHL_VWP_PROJ_PROD_PVT.Aggregate_Task_Material_Reqrs
8424 ( p_api_version => p_api_version,
8425 p_init_msg_list => p_init_msg_list,
8426 p_commit => p_commit,
8427 p_validation_level => p_validation_level,
8428 p_module_type => p_module_type,
8429 p_task_id => l_tasks_tbl(i).visit_task_id,
8430 p_rel_tsk_flag => 'Y',
8431 x_return_status => l_return_status,
8432 x_msg_count => l_msg_count,
8433 x_msg_data => l_msg_data
8434 );
8435
8436 IF (l_log_statement >= l_log_current_level) THEN
8437 fnd_log.string(l_log_statement,
8438 L_DEBUG_KEY,
8439 'After calling AGGREGATE_TASK_MATERIAL_REQRS for Task Id: ' ||
8440 l_tasks_tbl(i).visit_task_id || '. Return Status = '|| l_return_status);
8441 END IF;
8442
8443 IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
8444 x_msg_count := FND_MSG_PUB.count_msg;
8445 IF (l_log_statement >= l_log_current_level) THEN
8446 fnd_log.string(l_log_statement,
8447 L_DEBUG_KEY,
8448 'Errors from AGGREGATE_TASK_MATERIAL_REQRS. Message count: ' || x_msg_count);
8449 END IF;
8450 IF l_return_status = FND_API.G_RET_STS_ERROR THEN
8451 RAISE FND_API.G_EXC_ERROR;
8452 ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
8453 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
8454 END IF;
8455 END IF;
8456 END LOOP;
8457
8458 --for paritally implemented visits adjust the task times
8459 IF (c_visit_info_rec.start_date_time < SYSDATE and c_visit_info_rec.status_code = 'PARTIALLY RELEASED') THEN
8460
8461 IF (l_log_statement >= l_log_current_level) THEN
8462 fnd_log.string(l_log_statement,
8463 L_DEBUG_KEY,
8464 'Before calling ADJUST_TASK_TIMES ');
8465 END IF;
8466
8467 FOR i IN l_tasks_tbl.FIRST..l_tasks_tbl.LAST
8468 LOOP
8469 -- SKPATHAK :: ER: 9147951 :: 11-JAN-2010 :: Call adjust_task_times only if past task dates are null
8470 SELECT past_task_start_date INTO l_tasks_tbl(i).past_task_start_date FROM ahl_visit_tasks_b WHERE visit_task_id = l_tasks_tbl(i).visit_task_id;
8471 IF l_tasks_tbl(i).past_task_start_date IS NULL THEN
8472 AHL_VWP_TIMES_PVT.adjust_task_times
8473 (p_api_version => l_api_version,
8474 p_init_msg_list => p_init_msg_list,
8475 p_commit => 'F',
8476 p_validation_level => p_validation_level,
8477 p_task_id => l_tasks_tbl(i).visit_task_id,
8478 p_reset_sysdate_flag => FND_API.G_TRUE,
8479 x_return_status => l_return_status,
8480 x_msg_count => l_msg_count,
8481 x_msg_data => l_msg_data
8482 );
8483 END IF;
8484
8485 IF (l_log_statement >= l_log_current_level) THEN
8486 fnd_log.string(l_log_statement,
8487 L_DEBUG_KEY,
8488 'After calling ADJUST_TASK_TIMES for task Id ' ||
8489 l_tasks_tbl(i).visit_task_id ||'. Return Status = '|| l_return_status);
8490 END IF;
8491
8492 IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
8493 x_msg_count := FND_MSG_PUB.count_msg;
8494 IF (l_log_statement >= l_log_current_level) THEN
8495 fnd_log.string(l_log_statement,
8496 L_DEBUG_KEY,
8497 'Errors from ADJUST_TASK_TIMES. Message count: ' || x_msg_count);
8498 END IF;
8499 IF l_return_status = FND_API.G_RET_STS_ERROR THEN
8500 RAISE FND_API.G_EXC_ERROR;
8501 ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
8502 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
8503 END IF;
8504 END IF;
8505 END LOOP;
8506 END IF; --partially released
8507
8508 l_temp_msg_count := Fnd_Msg_Pub.count_msg;
8509
8510 --Validate the MR/Route dates for all the tasks
8511 FOR i IN l_tasks_tbl.FIRST..l_tasks_tbl.LAST
8512 LOOP
8513 IF (l_log_statement >= l_log_current_level) THEN
8514 fnd_log.string(l_log_statement,
8515 L_DEBUG_KEY,
8516 'Before calling VALIDATE_MR_ROUTE_DATE. l_msg_count = ' || l_msg_count);
8517 END IF;
8518
8519 -- SKPATHAK :: ER:12730539 :: 01-AUG-2011
8520 -- If the task's summary task is in partially implemented status, need not validate its route/MR
8521 OPEN get_task_status (l_tasks_tbl(i).originating_task_id);
8522 FETCH get_task_status INTO l_task_status;
8523 CLOSE get_task_status;
8524 IF l_task_status <> 'PARTIALLY RELEASED' THEN
8525 Validate_MR_Route_Date
8526 (
8527 p_mr_route_id => l_tasks_tbl(i).MR_Route_Id,
8528 p_visit_task_number => l_tasks_tbl(i).VISIT_TASK_NUMBER,
8529 p_start_date_time => l_tasks_tbl(i).TASK_START_DATE,
8530 p_end_date_time => l_tasks_tbl(i).TASK_END_DATE
8531 );
8532
8533 IF (l_log_statement >= l_log_current_level) THEN
8534 fnd_log.string(l_log_statement,L_DEBUG_KEY,
8535 'After calling VALIDATE_MR_ROUTE_DATE for task Id: ' ||l_tasks_tbl(i).visit_task_id || ' and l_msg_count - ' || l_msg_count);
8536 END IF;
8537 END IF;
8538 END LOOP;
8539
8540 l_msg_count := Fnd_Msg_Pub.count_msg;
8541 IF (l_msg_count <> l_temp_msg_count) THEN
8542 IF (l_log_statement >= l_log_current_level) THEN
8543 fnd_log.string(l_log_statement,L_DEBUG_KEY,
8544 'Errors from VALIDATE_MR_ROUTE_DATE. Message count: ' || l_msg_count);
8545 END IF;
8546 RAISE FND_API.G_EXC_ERROR;
8547 END IF;
8548
8549 IF (l_log_statement >= l_log_current_level) THEN
8550 fnd_log.string(l_log_statement,
8551 L_DEBUG_KEY,
8552 'Before calling PUSH_TASKS_TO_PRODUCTION for visit id: ' ||p_visit_id);
8553 END IF;
8554
8555 --push the selected tasks to production
8556 AHL_VWP_PROJ_PROD_PVT.Push_tasks_to_production
8557 ( p_api_version => l_api_version,
8558 p_init_msg_list => p_init_msg_list,
8559 p_validation_level => p_validation_level,
8560 p_module_type => p_module_type,
8561 p_visit_id => p_visit_id,
8562 p_tasks_tbl => l_tasks_tbl,
8563 p_release_flag => p_release_flag,
8564 x_return_status => l_return_status,
8565 x_msg_count => l_msg_count,
8566 x_msg_data => l_msg_data
8567 );
8568
8569 IF (l_log_statement >= l_log_current_level) THEN
8570 fnd_log.string(l_log_statement,
8571 L_DEBUG_KEY,
8572 'After calling PUSH_TASKS_TO_PRODUCTION. Return Status = '|| l_return_status);
8573 END IF;
8574
8575 IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
8576 x_msg_count := FND_MSG_PUB.count_msg;
8577 IF (l_log_statement >= l_log_current_level) THEN
8578 fnd_log.string(l_log_statement,
8579 L_DEBUG_KEY,
8580 'Errors from PUSH_TASKS_TO_PRODUCTION. Message count: ' || x_msg_count);
8581 END IF;
8582 IF l_return_status = FND_API.G_RET_STS_ERROR THEN
8583 RAISE FND_API.G_EXC_ERROR;
8584 ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
8585 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
8586 END IF;
8587 END IF;
8588
8589 IF (l_log_statement >= l_log_current_level) THEN
8590 fnd_log.string(l_log_statement,
8591 L_DEBUG_KEY,
8592 'Before calling DELETE_SIMUL_VISITS for visit id: ' ||p_visit_id);
8593 END IF;
8594
8595 -- SKPATHAK :: 02-MAY-2011 :: VWPE: ER:12424063
8596 -- Below call is not needed since LTP is being removed so no simulation visit exists
8597 -- Delete the simulated visits
8598 /* AHL_LTP_SIMUL_PLAN_PVT.delete_simul_visits
8599 (p_api_version => l_api_version,
8600 p_init_msg_list => p_init_msg_list,
8601 p_commit => 'F',
8602 p_validation_level => p_validation_level,
8603 p_visit_id => p_visit_id,
8604 x_return_status => l_return_status,
8605 x_msg_count => l_msg_count,
8606 x_msg_data => l_msg_data);
8607
8608 IF (l_log_statement >= l_log_current_level) THEN
8609 fnd_log.string(l_log_statement,
8610 L_DEBUG_KEY,
8611 'After calling DELETE_SIMUL_VISITS for visit id ' ||p_visit_id||'. Return Status = '|| l_return_status);
8612 END IF;
8613
8614 IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
8615 x_msg_count := FND_MSG_PUB.count_msg;
8616 IF (l_log_statement >= l_log_current_level) THEN
8617 fnd_log.string(l_log_statement,
8618 L_DEBUG_KEY,
8619 'Errors from DELETE_SIMUL_TASKS. Message count: ' || x_msg_count);
8620 END IF;
8621 IF l_return_status = FND_API.G_RET_STS_ERROR THEN
8622 RAISE FND_API.G_EXC_ERROR;
8623 ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
8624 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
8625 END IF;
8626 END IF;*/
8627
8628 -- Standard check of p_commit
8629 IF FND_API.TO_BOOLEAN(p_commit) THEN
8630 COMMIT WORK;
8631 END IF;
8632
8633 Fnd_Msg_Pub.count_and_get(
8634 p_encoded => Fnd_Api.g_false,
8635 p_count => x_msg_count,
8636 p_data => x_msg_data
8637 );
8638
8639 IF (l_log_procedure >= l_log_current_level) THEN
8640 fnd_log.string(l_log_procedure,
8641 L_DEBUG_KEY||'.end',
8642 'At the end of PLSQL procedure. Return Status = ' || x_return_status);
8643 END IF;
8644
8645 EXCEPTION
8646 WHEN FND_API.G_EXC_ERROR THEN
8647 x_return_status := FND_API.G_RET_STS_ERROR;
8648 ROLLBACK TO Release_Tasks_Pvt;
8649 FND_MSG_PUB.count_and_get(p_count => x_msg_count,
8650 p_data => x_msg_data,
8651 p_encoded => fnd_api.g_false);
8652
8653 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
8654 x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
8655 ROLLBACK TO Release_Tasks_Pvt;
8656 Fnd_Msg_Pub.count_and_get (
8657 p_encoded => Fnd_Api.g_false,
8658 p_count => x_msg_count,
8659 p_data => x_msg_data);
8660
8661 WHEN OTHERS THEN
8662 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
8663 ROLLBACK TO Release_Tasks_Pvt;
8664 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
8665 fnd_msg_pub.add_exc_msg(p_pkg_name => G_PKG_NAME,
8666 p_procedure_name => 'Release_Tasks',
8667 p_error_text => SUBSTR(SQLERRM,1,500));
8668 END IF;
8669 FND_MSG_PUB.count_and_get(p_count => x_msg_count,
8670 p_data => x_msg_data,
8671 p_encoded => fnd_api.g_false);
8672
8673 END Release_Tasks;
8674
8675 ------------------------------------------------------------------
8676 -- Procedure name : Validate_tasks_bef_production
8677 -- Type : Private
8678 -- Function : Validate the tasks before pushing the tasks to prodn.
8679 -- Parameters :
8680 --
8681 -- Standard OUT Parameters :
8682 -- x_return_status OUT VARCHAR2 Required
8683 -- x_msg_count OUT NUMBER Required
8684 -- x_msg_data OUT VARCHAR2 Required
8685 --
8686 -- Validate_tasks_bef_production Parameters:
8687 -- p_visit_id IN NUMBER Required
8688 -- p_tasks_tbl IN Task_Tbl_Type Required
8689 -- x_tasks_tbl OUT Task_Tbl_Type Required
8690 --
8691 -- Version :
8692 -- 30 November, 2007 RNAHATA Initial Version - 1.0
8693 -------------------------------------------------------------------
8694
8695 PROCEDURE Validate_tasks_bef_production(
8696 p_visit_id IN NUMBER,
8697 p_tasks_tbl IN Task_Tbl_Type,
8698 x_tasks_tbl OUT NOCOPY Task_Tbl_Type,
8699 x_return_status OUT NOCOPY VARCHAR2,
8700 x_msg_count OUT NOCOPY NUMBER,
8701 x_msg_data OUT NOCOPY VARCHAR2
8702 ) IS
8703
8704 --cursor to fetch the details of the tasks that have been pushe to production
8705 CURSOR c_task_dtls(x_vst_task_id IN NUMBER) IS
8706 SELECT mr_id,visit_id,visit_task_id,status_code,task_type_code,nvl(originating_task_id,0) as originating_task_id,
8707 summary_task_flag, inventory_item_id,item_organization_id,visit_task_number,end_date_time
8708 FROM ahl_visit_tasks_b
8709 WHERE visit_task_id = x_vst_task_id
8710 -- SKPATHAK :: 02-MAY-2011 :: VWPE:: Commented the below line since summary tasks may not be in planning
8711 --AND NVL(status_code,'X') in ('PLANNING')
8712 order by visit_task_id;
8713
8714 c_tsk_dtls_rec c_task_dtls%ROWTYPE;
8715
8716 --cursor to fetch the summary task id of the planned/unplanned task
8717 CURSOR c_summary_tsk_dtl (x_originating_tsk_id IN NUMBER) IS
8718 SELECT mr_id,visit_id,visit_task_id,status_code,task_type_code,nvl(originating_task_id,0) as originating_task_id,
8719 summary_task_flag, inventory_item_id,item_organization_id,visit_task_number,end_date_time
8720 FROM ahl_visit_tasks_b
8721 WHERE visit_task_id = x_originating_tsk_id
8722 AND NVL(status_code,'X') = 'PLANNING'
8723 AND task_type_code = 'SUMMARY';
8724
8725 c_summary_tsk_rec c_summary_tsk_dtl%ROWTYPE;
8726
8727 -- SKPATHAK :: 13-JUN-2011 :: VWPE:: START
8728 -- Fetch the summary tasks which are in partially released or released status
8729 CURSOR c_par_rel_sum_tsk_dtl (x_originating_tsk_id IN NUMBER) IS
8730 SELECT visit_task_id,nvl(originating_task_id,0) as originating_task_id,visit_task_number
8731 FROM ahl_visit_tasks_b
8732 WHERE visit_task_id = x_originating_tsk_id
8733 AND NVL(status_code,'X') IN ( 'PARTIALLY RELEASED', 'RELEASED')
8734 AND task_type_code = 'SUMMARY';
8735 c_par_rel_sum_tsk_rec c_par_rel_sum_tsk_dtl%ROWTYPE;
8736
8737 CURSOR get_child_planning_tasks (c_task_id IN NUMBER)
8738 IS
8739 SELECT visit_task_id
8740 FROM ahl_visit_tasks_b
8741 WHERE originating_task_id = c_task_id
8742 AND status_code = 'PLANNING';
8743
8744 l_is_all_tasks_rel VARCHAR2(1) := 'N';
8745
8746 -- SKPATHAK :: 13-JUN-2011 :: VWPE:: END
8747
8748 --cursor to fetch master work order for the visit
8749 CURSOR c_fet_master_wo (x_visit_id IN NUMBER) IS
8750 SELECT wo.workorder_id, wo.status_code, wip.scheduled_start_date,wip.scheduled_completion_date
8751 FROM ahl_visits_b v, ahl_workorders wo, wip_discrete_jobs wip
8752 WHERE v.visit_id = x_visit_id
8753 AND NVL(v.status_code,'X') = 'PARTIALLY RELEASED'
8754 AND v.visit_id = wo.visit_id
8755 AND wo.visit_task_id IS NULL
8756 AND wo.master_workorder_flag = 'Y'
8757 AND wip.wip_entity_id = wo.wip_entity_id
8758 AND wo.STATUS_CODE not in ('22','7');
8759
8760 c_mst_wo_visit_rec c_fet_master_wo%ROWTYPE;
8761
8762 -- Get all the Parent Task Dependencies.
8763 CURSOR get_parent_task_dependencies (x_vst_task_id IN NUMBER) IS
8764 SELECT P.visit_task_number , P.visit_task_id
8765 FROM ahl_visit_tasks_b P,
8766 ahl_task_links L
8767 WHERE P.visit_task_id = L.parent_task_id
8768 AND L.visit_task_id = x_vst_task_id;
8769
8770 -- Get all the Child Task Dependencies.
8771 CURSOR get_child_task_dependencies (x_vst_task_id IN NUMBER) IS
8772 SELECT C.visit_task_number ,C.visit_task_id
8773 FROM ahl_visit_tasks_b C,
8774 ahl_task_links L
8775 WHERE C.visit_task_id = L.visit_task_id
8776 AND L.parent_task_id = x_vst_task_id;
8777
8778 c_par_tech_dep_rec get_parent_task_dependencies%ROWTYPE;
8779 c_ch_tech_dep_rec get_child_task_dependencies%ROWTYPE;
8780
8781 /*cursor to fetch all the child MR's/tasks for the summary MR to ensure all the dtl tasks are pushed to production*/
8782 CURSOR c_dtl_task_sum (x_vst_task_id IN NUMBER) IS
8783 select mr_id,visit_id,visit_task_id,status_code,task_type_code,nvl(originating_task_id,0) as originating_task_id,
8784 summary_task_flag, inventory_item_id,item_organization_id,visit_task_number,end_date_time
8785 FROM ahl_visit_tasks_b
8786 -- SKPATHAK :: 02-MAY-2011 :: VWPE: ER:12424063 :: Summary tasks may be in partially implemented status
8787 WHERE NVL(status_code,'X') in ('PLANNING','PARTIALLY RELEASED')
8788 START WITH visit_task_id = x_vst_task_id
8789 CONNECT BY originating_task_id = PRIOR visit_task_id
8790 order by visit_id,visit_task_id,mr_id;
8791
8792 c_dtl_task_sum_rec c_dtl_task_sum%ROWTYPE;
8793
8794 --CHANGES by jrotich bug #13028686 begin
8795 CURSOR c_task_stage_details(c_vst_task_id IN NUMBER) IS
8796 SELECT TASKS.STAGE_ID,
8797 STAGES.STAGE_NAME,
8798 STAGE_TYPES.STAGE_TYPE_CODE
8799 FROM AHL_VISIT_TASKS_B TASKS,
8800 AHL_VISIT_STAGE_TYP_ASOC STAGE_TYPES,
8801 AHL_VWP_STAGES_VL STAGES
8802 WHERE
8803 TASKS.VISIT_TASK_ID= c_vst_task_id AND
8804 TASKS.STAGE_ID=STAGE_TYPES.STAGE_ID(+) AND
8805 TASKS.STAGE_ID = STAGES.STAGE_ID;
8806
8807 l_task_stage_details c_task_stage_details%ROWTYPE;
8808
8809 --CHANGES by jrotich bug #13028686 end
8810
8811
8812
8813
8814
8815 j NUMBER := 0;
8816 K NUMBER := 0;
8817 m NUMBER := 0;
8818 L_API_NAME CONSTANT VARCHAR2(30) := 'Validate_tasks_bef_production';
8819 L_DEBUG_KEY CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
8820 lp_originating_task_id ahl_visit_tasks_vl.originating_task_id%TYPE;
8821 curr_task BOOLEAN := FALSE;
8822 parent_task BOOLEAN := FALSE;
8823 parent_task_found_flag BOOLEAN := FALSE;
8824 child_task BOOLEAN := FALSE;
8825
8826 BEGIN
8827 IF (l_log_procedure >= l_log_current_level) THEN
8828 fnd_log.string(l_log_procedure,
8829 L_DEBUG_KEY ||'.begin',
8830 'At the start of PL SQL procedure. Visit Id = ' ||
8831 p_visit_id || ', p_tasks_tbl.COUNT = ' || p_tasks_tbl.COUNT);
8832 END IF;
8833
8834 -- Standard start of API savepoint
8835 SAVEPOINT Validate_tasks_bef_prodn_pvt;
8836
8837 -- Initialize API return status to success
8838 x_return_status := FND_API.G_RET_STS_SUCCESS;
8839
8840 --chk if the visit is released/partially released.
8841 OPEN c_fet_master_wo (p_visit_id);
8842 FETCH c_fet_master_wo INTO c_mst_wo_visit_rec;
8843 IF c_fet_master_wo%NOTFOUND THEN
8844 x_msg_count := FND_MSG_PUB.count_msg;
8845 IF (l_log_statement >= l_log_current_level) THEN
8846 fnd_log.string(l_log_statement,
8847 L_DEBUG_KEY,
8848 'Visit not released: ' || c_tsk_dtls_rec.visit_task_number);
8849 END IF;
8850 END IF;
8851 CLOSE c_fet_master_wo;
8852
8853 FOR i IN p_tasks_tbl.FIRST..p_tasks_tbl.LAST
8854 LOOP
8855 OPEN c_task_dtls(p_tasks_tbl(i).visit_task_id);
8856 FETCH c_task_dtls INTO c_tsk_dtls_rec;
8857 IF c_task_dtls%NOTFOUND THEN
8858 x_msg_count := FND_MSG_PUB.count_msg;
8859 IF (l_log_statement >= l_log_current_level) THEN
8860 fnd_log.string(l_log_statement,
8861 L_DEBUG_KEY,
8862 'Task is either not in planning status or Invalid - ' ||
8863 p_tasks_tbl(i).visit_task_id);
8864 END IF;
8865 CLOSE c_task_dtls;
8866 FND_MESSAGE.Set_Name(G_PM_PRODUCT_CODE,'AHL_VWP_INVALID_TSK_ID');
8867 Fnd_Message.SET_TOKEN('TASK_ID', p_tasks_tbl(i).visit_task_id);
8868 FND_MSG_PUB.ADD;
8869 RAISE FND_API.G_EXC_ERROR;
8870 END IF;
8871 CLOSE c_task_dtls;
8872
8873
8874 --CHANGES by jrotich bug #13028686 begin
8875 OPEN c_task_stage_details(c_tsk_dtls_rec.visit_task_id);
8876 FETCH c_task_stage_details INTO l_task_stage_details;
8877 CLOSE c_task_stage_details;
8878
8879 IF (l_task_stage_details.stage_id IS NOT NULL) AND
8880 (l_task_stage_details.stage_type_code IS NULL) THEN
8881 IF (l_log_statement >= l_log_current_level) THEN
8882 fnd_log.string(l_log_statement,
8883 L_DEBUG_KEY,
8884 'Task has an associated stage that does not have a stage_type ' ||
8885 c_tsk_dtls_rec.visit_task_id);
8886 END IF;
8887 FND_MESSAGE.SET_NAME('AHL', 'AHL_VWP_NO_STAGE_TYPE');
8888 FND_MESSAGE.SET_TOKEN('STAGE_NAME',l_task_stage_details.stage_name);
8889 FND_MSG_PUB.ADD;
8890 RAISE FND_API.G_EXC_ERROR;
8891 END IF;
8892 --CHANGES by jrotich bug #13028686 begin end;
8893
8894
8895
8896 /* if the visit is partially released, then the planned end time for the wo should not be
8897 exceed the scheduled end time */
8898 IF (c_mst_wo_visit_rec.scheduled_completion_date IS NOT NULL) AND
8899 (c_tsk_dtls_rec.end_date_time > c_mst_wo_visit_rec.scheduled_completion_date) THEN
8900 x_msg_count := FND_MSG_PUB.count_msg;
8901 IF (l_log_statement >= l_log_current_level) THEN
8902 fnd_log.string(l_log_statement,
8903 L_DEBUG_KEY,
8904 'Planned end time of the task is exceeding the scheduled completion time of the master WO: ' ||
8905 c_tsk_dtls_rec.visit_task_number);
8906 END IF;
8907 FND_MESSAGE.SET_NAME(G_PM_PRODUCT_CODE,'AHL_VWP_PET_EXCD_SCT');
8908 FND_MSG_PUB.ADD;
8909 RAISE FND_API.G_EXC_ERROR;
8910 END IF;
8911
8912 parent_task_found_flag := FALSE;
8913 /*when the summary task is selected then all child tasks/child mr's for the summary tasks/MR will be pushed to prodn.
8914 Fetches only summary tasks of MR's and not the manually added summary tasks.*/
8915
8916 IF (c_tsk_dtls_rec.task_type_code IN ('SUMMARY') AND c_tsk_dtls_rec.summary_task_flag = 'N') THEN
8917
8918 IF (x_tasks_tbl.COUNT > 0) THEN
8919 FOR m IN x_tasks_tbl.FIRST..x_tasks_tbl.LAST
8920 LOOP
8921 IF x_tasks_tbl(m).visit_task_id = c_tsk_dtls_rec.visit_task_id THEN
8922 parent_task_found_flag := TRUE;
8923 EXIT;
8924 END IF;
8925 END LOOP;
8926 END IF;
8927
8928 --inserts only if the summary task is not inserted already.
8929 IF NOT(parent_task_found_flag) THEN
8930 --this cursor fetches entire family tree of the selected MR with its children to be inserted.
8931 OPEN c_dtl_task_sum(c_tsk_dtls_rec.visit_task_id);
8932 LOOP
8933 FETCH c_dtl_task_sum INTO c_dtl_task_sum_rec;
8934 EXIT WHEN c_dtl_task_sum%NOTFOUND;
8935 --populating the output table with all the child parent MR's/tasks
8936 j := j + 1;
8937 x_tasks_tbl(j).visit_id := c_dtl_task_sum_rec.visit_id;
8938 x_tasks_tbl(j).visit_task_id := c_dtl_task_sum_rec.visit_task_id;
8939 x_tasks_tbl(j).inventory_item_id := c_dtl_task_sum_rec.inventory_item_id;
8940 x_tasks_tbl(j).item_organization_id := c_dtl_task_sum_rec.item_organization_id;
8941 x_tasks_tbl(j).mr_id := c_dtl_task_sum_rec.mr_id;
8942 x_tasks_tbl(j).task_type_code := c_dtl_task_sum_rec.task_type_code;
8943 x_tasks_tbl(j).task_status_code := c_dtl_task_sum_rec.status_code;
8944 x_tasks_tbl(j).originating_task_id := c_dtl_task_sum_rec.originating_task_id;
8945 x_tasks_tbl(j).visit_task_number := c_dtl_task_sum_rec.visit_task_number;
8946 END LOOP;
8947 CLOSE c_dtl_task_sum;
8948 END IF;
8949 END IF;
8950
8951 /*for each planned/unplanned/summary task ensure that the parent MR/task is selected.If not then throw
8952 an error message to the user asking him to select the parent MR*/
8953 IF (c_tsk_dtls_rec.task_type_code IN ('PLANNED','UNPLANNED', 'SUMMARY')) AND (c_tsk_dtls_rec.originating_task_id <> 0) THEN
8954
8955 --loop back to the parent MR to ensure that the child tasks/MR is also selected
8956 lp_originating_task_id := c_tsk_dtls_rec.originating_task_id;
8957
8958 LOOP
8959 parent_task_found_flag := FALSE;
8960
8961 --this cursor fetches the parent for each task
8962 OPEN c_summary_tsk_dtl(lp_originating_task_id);
8963 FETCH c_summary_tsk_dtl INTO c_summary_tsk_rec;
8964 IF c_summary_tsk_dtl%FOUND THEN
8965 --locate the summary task from the selected task list
8966 FOR k IN p_tasks_tbl.FIRST..p_tasks_tbl.LAST
8967 LOOP
8968 --chk if the summary task for the task is also selected
8969 IF p_tasks_tbl(k).visit_task_id = c_summary_tsk_rec.visit_task_id THEN
8970 parent_task_found_flag := TRUE;
8971 EXIT;
8972 END IF;
8973 END LOOP;
8974
8975 IF NOT(parent_task_found_flag) THEN --if summary task is not selected then throw an error
8976 x_msg_count := FND_MSG_PUB.count_msg;
8977 IF (l_log_statement >= l_log_current_level) THEN
8978 fnd_log.string(l_log_statement,
8979 L_DEBUG_KEY,
8980 'Select the summary task for the task: ' ||
8981 c_tsk_dtls_rec.visit_task_number);
8982 END IF;
8983 FND_MESSAGE.Set_Name(G_PM_PRODUCT_CODE,'AHL_VWP_SEL_SUM_TSK');
8984 Fnd_Message.SET_TOKEN('TASK_NUMBER', c_tsk_dtls_rec.visit_task_number);
8985 FND_MSG_PUB.ADD;
8986 RAISE FND_API.G_EXC_ERROR;
8987 END IF;
8988
8989 lp_originating_task_id := c_summary_tsk_rec.originating_task_id;
8990
8991 -- SKPATHAK :: 13-JUN-2011 :: VWPE:: START
8992 ELSE --c_summary_tsk_dtl%FOUND
8993 OPEN c_par_rel_sum_tsk_dtl(lp_originating_task_id);
8994 FETCH c_par_rel_sum_tsk_dtl INTO c_par_rel_sum_tsk_rec;
8995 IF c_par_rel_sum_tsk_dtl%FOUND THEN
8996
8997 --The summary task of the selected task is in partially released status
8998 --So populating the output table with all the child parent MR's/tasks
8999 j := j + 1;
9000 x_tasks_tbl(j).visit_id := c_tsk_dtls_rec.visit_id;
9001 x_tasks_tbl(j).visit_task_id := c_tsk_dtls_rec.visit_task_id;
9002 x_tasks_tbl(j).inventory_item_id := c_tsk_dtls_rec.inventory_item_id;
9003 x_tasks_tbl(j).item_organization_id := c_tsk_dtls_rec.item_organization_id;
9004 x_tasks_tbl(j).mr_id := c_tsk_dtls_rec.mr_id;
9005 x_tasks_tbl(j).task_type_code := c_tsk_dtls_rec.task_type_code;
9006 x_tasks_tbl(j).task_status_code := c_tsk_dtls_rec.status_code;
9007 x_tasks_tbl(j).originating_task_id := c_tsk_dtls_rec.originating_task_id;
9008 x_tasks_tbl(j).visit_task_number := c_tsk_dtls_rec.visit_task_number;
9009
9010 --Also update the summary task to Released status
9011 UPDATE ahl_visit_tasks_b
9012 SET status_code = 'RELEASED',
9013 OBJECT_VERSION_NUMBER = OBJECT_VERSION_NUMBER + 1,
9014 LAST_UPDATE_DATE = SYSDATE,
9015 LAST_UPDATED_BY = Fnd_Global.USER_ID,
9016 LAST_UPDATE_LOGIN = Fnd_Global.LOGIN_ID
9017 WHERE visit_task_id = lp_originating_task_id;
9018
9019 FOR child_planning_tasks_rec IN get_child_planning_tasks (c_par_rel_sum_tsk_rec.visit_task_id) LOOP
9020 IF (l_log_statement >= l_log_current_level) THEN
9021 fnd_log.string(l_log_statement,
9022 L_DEBUG_KEY,
9023 'Inside loop for get_child_planning_tasks, child_planning_tasks_rec.visit_task_id: ' ||
9024 child_planning_tasks_rec.visit_task_id);
9025 END IF;
9026 FOR k IN p_tasks_tbl.FIRST..p_tasks_tbl.LAST
9027 LOOP
9028 IF (l_log_statement >= l_log_current_level) THEN
9029 fnd_log.string(l_log_statement,
9030 L_DEBUG_KEY,
9031 'Inside loop for p_tasks_tbl, p_tasks_tbl('||k||').visit_task_id: ' ||
9032 p_tasks_tbl(k).visit_task_id);
9033 END IF;
9034 --Check if all the sub tasks of the summary task are selected, if not throw error
9035 IF p_tasks_tbl(k).visit_task_id = child_planning_tasks_rec.visit_task_id THEN
9036 l_is_all_tasks_rel := 'Y';
9037 EXIT;
9038 END IF;
9039 END LOOP;
9040 IF l_is_all_tasks_rel = 'N' AND p_tasks_tbl(i).unit_effectivity_id IS NOT NULL THEN
9041 FND_MESSAGE.Set_Name(G_PM_PRODUCT_CODE,'AHL_VWP_CHILD_TASK_SEL');
9042 Fnd_Message.SET_TOKEN('TASK_NUMBER', c_par_rel_sum_tsk_rec.visit_task_number);
9043 FND_MSG_PUB.ADD;
9044 RAISE FND_API.G_EXC_ERROR;
9045 ELSE
9046 l_is_all_tasks_rel := 'N';
9047 END IF;
9048 END LOOP;
9049 END IF;
9050 lp_originating_task_id := c_par_rel_sum_tsk_rec.originating_task_id;
9051 CLOSE c_par_rel_sum_tsk_dtl;
9052 END IF; --c_summary_tsk_dtl%FOUND
9053 CLOSE c_summary_tsk_dtl;
9054 -- SKPATHAK :: 13-JUN-2011 :: VWPE:: END
9055
9056 EXIT WHEN NVL(lp_originating_task_id,0) = 0;
9057 END LOOP;
9058
9059 END IF; --planned/unplanned tasks
9060
9061 IF ((c_tsk_dtls_rec.task_type_code = 'UNASSOCIATED') OR
9062 (c_tsk_dtls_rec.task_type_code = 'SUMMARY' AND c_tsk_dtls_rec.summary_task_flag = 'Y')) THEN
9063 j := j + 1;
9064 x_tasks_tbl(j).visit_id := c_tsk_dtls_rec.visit_id;
9065 x_tasks_tbl(j).visit_task_id := c_tsk_dtls_rec.visit_task_id;
9066 x_tasks_tbl(j).inventory_item_id := c_tsk_dtls_rec.inventory_item_id;
9067 x_tasks_tbl(j).item_organization_id := c_tsk_dtls_rec.item_organization_id;
9068 x_tasks_tbl(j).mr_id := c_tsk_dtls_rec.mr_id;
9069 x_tasks_tbl(j).task_type_code := c_tsk_dtls_rec.task_type_code;
9070 x_tasks_tbl(j).task_status_code := c_tsk_dtls_rec.status_code;
9071 x_tasks_tbl(j).originating_task_id := c_tsk_dtls_rec.originating_task_id;
9072 END IF; --unassociated/summary
9073
9074 END LOOP; --for all selected tasks
9075
9076 -- chk for each task which has a technical dependency with other MR's or unassociated tasks
9077 FOR i IN x_tasks_tbl.FIRST..x_tasks_tbl.LAST
9078 LOOP
9079 parent_task := FALSE;
9080 child_task := FALSE;
9081
9082 OPEN get_parent_task_dependencies (x_tasks_tbl(i).visit_task_id);
9083 LOOP
9084 FETCH get_parent_task_dependencies INTO c_par_tech_dep_rec;
9085 IF get_parent_task_dependencies%NOTFOUND THEN
9086 x_msg_count := FND_MSG_PUB.count_msg;
9087 IF (l_log_statement >= l_log_current_level) THEN
9088 fnd_log.string(l_log_statement,
9089 L_DEBUG_KEY,
9090 'Parent Technical task dependency not found for the task - ' ||
9091 x_tasks_tbl(i).visit_task_number);
9092 END IF;
9093 EXIT;
9094 ELSE --when parent dependency is found chk if the associated MR/unassociated tasks are also selected.
9095 FOR j IN x_tasks_tbl.FIRST..x_tasks_tbl.LAST
9096 LOOP
9097 IF (x_tasks_tbl(j).visit_task_id = c_par_tech_dep_rec.visit_task_id) THEN
9098 parent_task := TRUE;
9099 EXIT;
9100 END IF;
9101 END LOOP;
9102
9103 IF NOT(parent_task) THEN --parent task not selected
9104 x_msg_count := FND_MSG_PUB.count_msg;
9105 IF (l_log_statement >= l_log_current_level) THEN
9106 fnd_log.string(l_log_statement,
9107 L_DEBUG_KEY,
9108 'Parent tasks on which the task ' ||
9109 x_tasks_tbl(i).visit_task_number ||
9110 ' is technically dependent has not been selected.'||
9111 'Please select the technically dependent tasks too');
9112 END IF;
9113 CLOSE get_parent_task_dependencies;
9114 FND_MESSAGE.Set_Name(G_PM_PRODUCT_CODE,'AHL_VWP_SEL_TECH_DEP');
9115 Fnd_Message.SET_TOKEN('TASK_NUMBER', x_tasks_tbl(i).visit_task_number);
9116 FND_MSG_PUB.ADD;
9117 RAISE FND_API.G_EXC_ERROR;
9118 END IF; --parent task not selected
9119 END IF;
9120 END LOOP; --loop through the parent dependent records
9121 CLOSE get_parent_task_dependencies;
9122
9123 OPEN get_child_task_dependencies (x_tasks_tbl(i).visit_task_id);
9124 LOOP --loop through the child dependent records
9125 FETCH get_child_task_dependencies INTO c_ch_tech_dep_rec;
9126 IF get_child_task_dependencies%NOTFOUND THEN
9127 x_msg_count := FND_MSG_PUB.count_msg;
9128 IF (l_log_statement >= l_log_current_level) THEN
9129 fnd_log.string(l_log_statement,
9130 L_DEBUG_KEY,
9131 'Child Technical task dependency not found for the task - ' || x_tasks_tbl(i).visit_task_number);
9132 END IF;
9133 EXIT;
9134 ELSE --when child dependency is found chk if the associated MR/unassociated tasks are also selected.
9135 FOR j IN x_tasks_tbl.FIRST..x_tasks_tbl.LAST
9136 LOOP
9137 IF (x_tasks_tbl(j).visit_task_id = c_ch_tech_dep_rec.visit_task_id) THEN
9138 child_task := TRUE;
9139 EXIT;
9140 END IF;
9141 END LOOP;
9142
9143 IF NOT(child_task) THEN
9144 x_msg_count := FND_MSG_PUB.count_msg;
9145 IF (l_log_statement >= l_log_current_level) THEN
9146 fnd_log.string(l_log_statement,
9147 L_DEBUG_KEY,
9148 'Child tasks on which the task ' || x_tasks_tbl(i).visit_task_number || ' is technically dependent has not been selected.'||
9149 'Please select the technically dependent tasks too');
9150 END IF;
9151 CLOSE get_child_task_dependencies;
9152 FND_MESSAGE.Set_Name(G_PM_PRODUCT_CODE,'AHL_VWP_SEL_TECH_DEP');
9153 Fnd_Message.SET_TOKEN('TASK_NUMBER', x_tasks_tbl(i).visit_task_number);
9154 FND_MSG_PUB.ADD;
9155 RAISE FND_API.G_EXC_ERROR;
9156 END IF; --curr task not selected
9157 END IF;
9158 END LOOP; --loop through the child dependent records
9159 CLOSE get_child_task_dependencies;
9160
9161 END LOOP;
9162
9163 IF (l_log_procedure >= l_log_current_level) THEN
9164 fnd_log.string(l_log_procedure,
9165 L_DEBUG_KEY ||'.end',
9166 'At the end of PL SQL procedure. x_tasks_tbl.COUNT = ' || x_tasks_tbl.COUNT);
9167 END IF;
9168
9169 EXCEPTION
9170 WHEN FND_API.G_EXC_ERROR THEN
9171 x_return_status := FND_API.G_RET_STS_ERROR;
9172 ROLLBACK TO Validate_tasks_bef_prodn_pvt;
9173 FND_MSG_PUB.count_and_get(p_count => x_msg_count,
9174 p_data => x_msg_data,
9175 p_encoded => fnd_api.g_false);
9176
9177 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
9178 x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
9179 ROLLBACK TO Validate_tasks_bef_prodn_pvt;
9180 Fnd_Msg_Pub.count_and_get (
9181 p_encoded => Fnd_Api.g_false,
9182 p_count => x_msg_count,
9183 p_data => x_msg_data);
9184
9185 WHEN OTHERS THEN
9186 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
9187 ROLLBACK TO Validate_tasks_bef_prodn_pvt;
9188 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
9189 fnd_msg_pub.add_exc_msg(p_pkg_name => G_PKG_NAME,
9190 p_procedure_name => 'Validate_tasks_bef_production',
9191 p_error_text => SUBSTR(SQLERRM,1,500));
9192 END IF;
9193 FND_MSG_PUB.count_and_get(p_count => x_msg_count,
9194 p_data => x_msg_data,
9195 p_encoded => fnd_api.g_false);
9196
9197 END Validate_tasks_bef_production;
9198
9199 -------------------------------------------------------------------
9200 -- Procedure name : Push_tasks_to_production
9201 -- Type : Private
9202 -- Function : Push the selected tasks to production.
9203 -- Parameters :
9204 --
9205 -- Standard IN Parameters :
9206 -- p_api_version IN NUMBER Required
9207 -- p_init_msg_list IN VARCHAR2 Default FND_API.G_FALSE
9208 -- p_validation_level IN NUMBER Default FND_API.G_VALID_LEVEL_FULL
9209 -- p_module_type IN VARCHAR2 Default Null
9210 --
9211 -- Standard OUT Parameters :
9212 -- x_return_status OUT VARCHAR2 Required
9213 -- x_msg_count OUT NUMBER Required
9214 -- x_msg_data OUT VARCHAR2 Required
9215 --
9216 -- Push_tasks_to_production Parameters:
9217 -- p_module_type IN VARCHAR2 Default = NULL
9218 -- p_visit_id IN NUMBER Required
9219 -- p_tasks_tbl IN Task_Tbl_Type Required
9220 -- p_release_flag IN VARCHAR2 Default = 'N'
9221 --
9222 -- Version :
9223 -- 30 November, 2007 RNAHATA Initial Version - 1.0
9224 -------------------------------------------------------------------
9225
9226 PROCEDURE Push_tasks_to_production(
9227 p_api_version IN NUMBER,
9228 p_init_msg_list IN VARCHAR2 := Fnd_Api.g_false,
9229 p_validation_level IN NUMBER := Fnd_Api.g_valid_level_full,
9230 p_module_type IN VARCHAR2 := Null,
9231 p_visit_id IN NUMBER,
9232 p_tasks_tbl IN Task_Tbl_Type,
9233 p_release_flag IN VARCHAR2 ,
9234 x_return_status OUT NOCOPY VARCHAR2,
9235 x_msg_count OUT NOCOPY NUMBER,
9236 x_msg_data OUT NOCOPY VARCHAR2
9237 ) IS
9238
9239 --check if the visit master wo exists
9240 CURSOR c_fet_master_wo (x_visit_id IN NUMBER) IS
9241 SELECT 1 FROM ahl_workorders wo
9242 WHERE wo.visit_id = x_visit_id
9243 AND wo.visit_task_id IS NULL
9244 AND wo.master_workorder_flag = 'Y';
9245
9246 --fetch master work order for the visit
9247 CURSOR c_visit_master_wo (x_visit_id IN NUMBER) IS
9248 SELECT wo.workorder_id, wo.status_code, wip.scheduled_start_date,wip.scheduled_completion_date,wo.object_version_number
9249 FROM ahl_visits_b v, ahl_workorders wo, wip_discrete_jobs wip
9250 WHERE v.visit_id = x_visit_id
9251 AND v.visit_id = wo.visit_id
9252 AND wo.visit_task_id IS NULL
9253 AND wo.master_workorder_flag = 'Y'
9254 AND wip.wip_entity_id = wo.wip_entity_id
9255 AND wo.status_code not in ('22','7');
9256
9257 c_mst_wo_visit_rec c_visit_master_wo%ROWTYPE;
9258
9259 --fetch visit details
9260 CURSOR c_visit_dtl (x_visit_id IN NUMBER) IS
9261 SELECT ahl_visits_vl.*,AHL_VWP_VISITS_PVT.Is_Old_Visit(VISIT_ID) IS_OLD_VISIT FROM ahl_visits_vl
9262 WHERE visit_id = x_visit_id;
9263
9264 c_visit_dtl_rec c_visit_dtl%ROWTYPE;
9265
9266 --fetch task details
9267 CURSOR c_visit_task_dtl (x_visit_task_id IN NUMBER) IS
9268 SELECT * FROM ahl_visit_tasks_vl
9269 WHERE visit_task_id = x_visit_task_id;
9270
9271 c_visit_tsk_dtl_rec c_visit_task_dtl%ROWTYPE;
9272
9273 --check if the task wo exists
9274 CURSOR c_fet_task_wo (x_visit_id IN NUMBER, x_visit_task_id IN NUMBER) IS
9275 SELECT 1 FROM ahl_workorders wo
9276 WHERE wo.visit_id = x_visit_id
9277 AND wo.visit_task_id = x_visit_task_id
9278 AND wo.visit_task_id IS NOT NULL;
9279
9280 --fetch work order for the task
9281 CURSOR c_task_wo (x_visit_id IN NUMBER,x_visit_task_id IN NUMBER) IS
9282 SELECT v.visit_task_id, wo.workorder_id, wo.status_code, wip.scheduled_start_date,wip.scheduled_completion_date,wo.object_version_number
9283 FROM ahl_visit_tasks_b v, ahl_workorders wo, wip_discrete_jobs wip
9284 WHERE v.visit_id = x_visit_id
9285 AND v.visit_id = wo.visit_id
9286 AND wo.visit_task_id IS NOT NULL
9287 AND wo.visit_task_id = x_visit_task_id
9288 AND wip.wip_entity_id = wo.wip_entity_id
9289 AND wo.status_code not in ('22','7');
9290
9291 c_task_wo_rec c_task_wo%ROWTYPE;
9292
9293 --fetch summary task flag for the task
9294 CURSOR c_fet_sum_task_flg (x_visit_id IN NUMBER, x_visit_task_id IN NUMBER) IS
9295 SELECT summary_task_flag FROM ahl_visit_tasks_b
9296 WHERE visit_task_id = x_visit_task_id;
9297
9298 --fetch all the tasks in the visit
9299 CURSOR c_all_task_dtl (x_visit_id IN NUMBER) IS
9300 SELECT count(visit_task_id) FROM ahl_visit_tasks_b
9301 WHERE visit_id = x_visit_id
9302 AND NVL(status_code,'X') IN ('PLANNING');
9303
9304 --get summary task start, end time
9305 CURSOR get_summary_task_times_csr(x_task_id IN NUMBER)IS
9306 SELECT min(start_date_time), max(end_date_time)
9307 FROM ahl_visit_tasks_b VST
9308 START WITH visit_task_id = x_task_id
9309 AND NVL(VST.status_code, 'Y') <> 'DELETED'
9310 CONNECT BY originating_task_id = PRIOR visit_task_id;
9311
9312 --find Route Id from MR Routes view
9313 CURSOR c_route (x_id IN NUMBER) IS
9314 SELECT Route_Id FROM AHL_MR_ROUTES_V
9315 WHERE MR_ROUTE_ID = x_id;
9316
9317 --check if the visit master wo exists
9318 CURSOR c_fet_mas_wo_dtls (x_visit_id IN NUMBER) IS
9319 SELECT actual_start_date,actual_end_date
9320 FROM ahl_workorders wo
9321 WHERE wo.visit_id = x_visit_id
9322 AND wo.visit_task_id IS NULL
9323 AND wo.master_workorder_flag = 'Y';
9324
9325 c_fet_mas_wo_dtl_rec c_fet_mas_wo_dtls%ROWTYPE;
9326
9327 --Inventory item id and instance id to be defaulted when
9328 --the item and instance are not specified at the header level
9329 CURSOR default_task_inst_dtls(c_task_id IN NUMBER) IS
9330 SELECT inventory_item_id,instance_id
9331 FROM ahl_visit_tasks_b
9332 WHERE visit_task_id = c_task_id;
9333
9334 def_task_inst_rec default_task_inst_dtls%ROWTYPE;
9335
9336 /*B5758813 - rnahata - fetches the route information for updating workorder
9337 description for tasks created from Routes */
9338 CURSOR get_wo_dtls_for_mrtasks_cur (p_task_id IN NUMBER) IS
9339 --TCHIMIRA::Bug 9149770 ::09-FEB-2010
9340 --use substrb and lengthb instead of substr and length respectively
9341 SELECT ar.route_no||'.'||substrb(ar.title,1,(240 - (lengthb(ar.route_no) + 1))) workorder_description
9342 FROM ahl_routes_vl ar,ahl_visit_tasks_b avt, ahl_mr_routes mrr
9343 WHERE avt.visit_task_id = p_task_id
9344 and nvl(avt.status_code,'Y') = 'PLANNING'
9345 and avt.mr_route_id = mrr.mr_route_id
9346 and mrr.route_id = ar.route_id;
9347
9348 get_wo_dtls_for_mrtasks_rec get_wo_dtls_for_mrtasks_cur%ROWTYPE;
9349
9350 --get SR MWO details.
9351 CURSOR c_get_sr_mwo_dtls(p_sr_task_id IN NUMBER) IS
9352 SELECT WDJ.WIP_ENTITY_ID,
9353 AWO.WORKORDER_ID,
9354 AWO.OBJECT_VERSION_NUMBER,
9355 WDJ.SCHEDULED_START_DATE,
9356 WDJ.SCHEDULED_COMPLETION_DATE
9357 FROM AHL_WORKORDERS AWO,
9358 WIP_DISCRETE_JOBS WDJ
9359 WHERE WDJ.WIP_ENTITY_ID = AWO.WIP_ENTITY_ID
9360 AND AWO.VISIT_TASK_ID = p_sr_task_id
9361 AND AWO.MASTER_WORKORDER_FLAG = 'Y'
9362 AND AWO.STATUS_CODE <> 17;
9363
9364 l_sr_mwo_rec c_get_sr_mwo_dtls%ROWTYPE;
9365
9366 --get SR task details
9367 CURSOR c_get_sr_task_dtls(p_sr_task_id IN NUMBER) IS
9368 SELECT * FROM AHL_VISIT_TASKS_B vst
9369 WHERE vst.TASK_TYPE_CODE = 'SUMMARY'
9370 AND vst.MR_ID IS NULL
9371 AND vst.SERVICE_REQUEST_ID =
9372 (SELECT vst1.SERVICE_REQUEST_ID
9373 FROM ahl_visit_tasks_b vst1
9374 WHERE vst1.visit_task_id = p_sr_task_id);
9375
9376 --check if visit has planned tasks
9377 CURSOR c_visit_has_planned_tasks(p_visit_id IN NUMBER) IS
9378 SELECT 1 FROM ahl_visit_tasks_b
9379 WHERE visit_id = p_visit_id
9380 AND status_code = 'PLANNING'
9381 -- SATRAJEN :: Bug 13930098 :: Visit stays at PARTIALLY IMPLEMENTED status :: Do NOT consider the default stage task :: July 2012
9382 AND (TASK_TYPE_CODE <> 'STAGE'
9383 OR (STAGE_ID IS NOT NULL AND TASK_TYPE_CODE = 'STAGE'));
9384
9385 CURSOR c_visit_time_matches_MWO_time(p_visit_id IN NUMBER) IS
9386 SELECT 1
9387 FROM ahl_visits_b vst, ahl_workorders wo, wip_discrete_jobs wdj
9388 WHERE vst.visit_id = p_visit_id
9389 AND wo.visit_id = vst.visit_id
9390 AND wo.MASTER_WORKORDER_FLAG = 'Y'
9391 AND wo.visit_task_id IS NULL
9392 AND wdj.wip_entity_id = wo.wip_entity_id
9393 AND vst.start_date_time = wdj.scheduled_start_date
9394 AND vst.close_date_time = wdj.scheduled_completion_date;
9395
9396 -- MANESING::Bug 13713141, 16-Apr-2012, added following cursors
9397 -- Cursor to find out the Repair Batch for the given task
9398 CURSOR get_rpr_batch_for_task_csr (c_visit_task_id NUMBER) IS
9399 SELECT repair_batch_name
9400 FROM AHL_VISIT_TASKS_B
9401 WHERE cost_parent_id IS NULL
9402 START WITH visit_task_id = c_visit_task_id
9403 CONNECT BY visit_task_id = Prior cost_parent_id;
9404
9405 -- Cursor to check if Repair Batch has planned tasks
9406 CURSOR chk_rpr_batch_has_planed_tasks (c_repair_batch_name VARCHAR2) IS
9407 SELECT 'X'
9408 FROM AHL_VISIT_TASKS_B
9409 WHERE cost_parent_id IS NOT NULL -- to filter repair batch task
9410 AND status_code = 'PLANNING'
9411 START WITH repair_batch_name = c_repair_batch_name
9412 CONNECT BY cost_parent_id = Prior visit_task_id;
9413
9414 -- SKPATHAK :: 02-MAY-2011 :: VWPE: ER:12424063
9415 -- Get the stage id of the visit stages that are in planning and some of their tasks are released
9416 CURSOR get_stage_id (c_visit_id IN NUMBER) IS
9417 SELECT stage.stage_id
9418 FROM ahl_vwp_stages_b stage
9419 WHERE stage.visit_id = c_visit_id
9420 AND EXISTS (SELECT 1
9421 FROM ahl_visit_tasks_b task
9422 WHERE stage.stage_id = task.stage_id
9423 AND stage.stage_status_code = 'PLANNING'
9424 AND task.task_type_code <> 'STAGE'
9425 AND task.status_code = 'RELEASED');
9426
9427 -- Get the workorder id and task type for a given task
9428 CURSOR get_task_dets (c_task_id IN NUMBER) IS
9429 SELECT task.task_type_code, wo.workorder_id
9430 FROM ahl_visit_tasks_b task, ahl_workorders wo
9431 WHERE task.visit_task_id = c_task_id
9432 AND task.visit_task_id = wo.visit_task_id;
9433 task_dets_rec get_task_dets%ROWTYPE;
9434
9435 l_temp_num1 NUMBER := NULL;
9436 l_temp_num2 NUMBER := NULL;
9437 l_sr_task_dtls_rec c_get_sr_task_dtls%ROWTYPE;
9438 l_wo_tbl_count NUMBER := 0;
9439 l_sch_start_date DATE;
9440 l_sch_end_date DATE;
9441 i NUMBER := 0;
9442 l_chk_mst_wo NUMBER := 0;
9443 l_chk_task_wo NUMBER := 0;
9444 L_API_NAME CONSTANT VARCHAR2(30) := 'Push_tasks_to_production';
9445 L_API_VERSION CONSTANT NUMBER := 1.0;
9446 L_DEBUG_KEY CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
9447 l_msg_data VARCHAR2(2000);
9448 l_return_status VARCHAR2(1);
9449 l_msg_count NUMBER;
9450 l_prd_workorder_tbl AHL_PRD_WORKORDER_PVT.PRD_WORKORDER_TBL;
9451 idx NUMBER := 0;
9452 l_prd_workorder_rel_tbl AHL_PRD_WORKORDER_PVT.prd_workorder_rel_tbl;
9453 l_manual_summ_task_flag VARCHAR2(1) ;
9454 l_task_cnt NUMBER := 0;
9455 l_firm_planned_flag VARCHAR2(1) := FND_PROFILE.value('AHL_PRD_FIRM_PLANNED_FLAG');
9456 l_planned_order_flag VARCHAR2(1); --added by skpathak for VWPE
9457
9458 l_max_schedule_start_date DATE; --BUG 13373947 :: PRAKKUM :: 10/02/2012
9459 l_repair_batch_name VARCHAR2(240);
9460 l_dummy VARCHAR2(1);
9461
9462 BEGIN
9463 IF (l_log_procedure >= l_log_current_level) THEN
9464 fnd_log.string(l_log_procedure,
9465 L_DEBUG_KEY ||'.begin',
9466 'At the start of PL SQL procedure. Visit Id = ' ||
9467 p_visit_id || ', p_tasks_tbl.COUNT = ' || p_tasks_tbl.COUNT);
9468 END IF;
9469
9470 -- Standard start of API savepoint
9471 SAVEPOINT Push_tasks_to_prodn_pvt;
9472
9473 -- Initialize message list if p_init_msg_list is set to TRUE
9474 IF FND_API.To_Boolean(p_init_msg_list) THEN
9475 FND_MSG_PUB.Initialize;
9476 END IF;
9477
9478 -- Initialize API return status to success
9479 x_return_status := FND_API.G_RET_STS_SUCCESS;
9480
9481 IF NOT FND_API.COMPATIBLE_API_CALL(l_api_version,
9482 p_api_version,
9483 l_api_name,G_PKG_NAME)
9484 THEN
9485 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
9486 END IF;
9487
9488 IF (l_log_statement >= l_log_current_level) THEN
9489 fnd_log.string(l_log_statement,
9490 L_DEBUG_KEY,
9491 'Before calling INTEGRATE_TO_PROJECTS for Visit Id ' || p_visit_id);
9492 END IF;
9493
9494 --create the project id for the visit.
9495 AHL_VWP_PROJ_PROD_PVT.Integrate_to_Projects
9496 (p_api_version => l_api_version,
9497 p_init_msg_list => p_init_msg_list,
9498 p_commit => 'F',
9499 p_validation_level => p_validation_level,
9500 p_module_type => p_module_type,
9501 p_visit_id => p_visit_id,
9502 x_return_status => l_return_status,
9503 x_msg_count => l_msg_count,
9504 x_msg_data => x_msg_data);
9505
9506 IF (l_log_statement >= l_log_current_level) THEN
9507 fnd_log.string(l_log_statement,
9508 L_DEBUG_KEY,
9509 'After calling Integrate_to_Projects. l_return_status = ' || l_return_status);
9510 END IF;
9511
9512 IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
9513 x_msg_count := FND_MSG_PUB.count_msg;
9514 IF (l_log_statement >= l_log_current_level) THEN
9515 fnd_log.string(l_log_statement,
9516 L_DEBUG_KEY,
9517 'Errors from Integrate_to_Projects. Message count: ' || x_msg_count);
9518 END IF;
9519 IF l_return_status = FND_API.G_RET_STS_ERROR THEN
9520 RAISE FND_API.G_EXC_ERROR;
9521 ELSE
9522 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
9523 END IF;
9524 END IF;
9525
9526 -- SKPATHAK :: ER:12730539 :: 01-AUG-2011 :: START
9527 -- Need to update materials for this visit on P2P
9528 IF (l_log_statement >= l_log_current_level) THEN
9529 fnd_log.string(l_log_statement,
9530 L_DEBUG_KEY,
9531 'Before Calling AHL_LTP_REQST_MATRL_PUB.Process_Planned_Materials. p_visit_id = ' || p_visit_id );
9532 END IF;
9533
9534 IF (p_visit_id IS NOT NULL) THEN
9535 AHL_LTP_REQST_MATRL_PUB.Process_Planned_Materials (
9536 p_api_version => 1.0,
9537 p_init_msg_list => FND_API.G_FALSE,
9538 p_commit => FND_API.G_FALSE,
9539 p_validation_level => FND_API.G_VALID_LEVEL_FULL,
9540 p_visit_id => p_visit_id,
9541 p_operation_flag => 'U',
9542 x_planned_order_flag => l_planned_order_flag,
9543 x_return_status => l_return_status,
9544 x_msg_count => l_msg_count,
9545 x_msg_data => x_msg_data);
9546
9547 IF (l_log_statement >= l_log_current_level) THEN
9548 fnd_log.string(l_log_statement,
9549 L_DEBUG_KEY,
9550 'After Calling AHL_LTP_REQST_MATRL_PUB.Process_Planned_Materials. Return Status = ' || l_return_status );
9551 END IF;
9552
9553 IF NVL(l_return_status,'x') <> FND_API.G_RET_STS_SUCCESS THEN
9554 x_msg_count := l_msg_count;
9555 x_return_status := l_return_status;
9556 IF l_return_status = Fnd_Api.g_ret_sts_error THEN
9557 RAISE Fnd_Api.g_exc_error;
9558 ELSIF l_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
9559 RAISE Fnd_Api.g_exc_unexpected_error;
9560 END IF;
9561 END IF;
9562 END IF;
9563 -- SKPATHAK :: ER:12730539 :: 01-AUG-2011 :: END
9564
9565 --chk if master wo for the visit already exists
9566 OPEN c_fet_master_wo(p_visit_id);
9567 FETCH c_fet_master_wo INTO l_chk_mst_wo;
9568 CLOSE c_fet_master_wo;
9569
9570 OPEN c_visit_master_wo(p_visit_id);
9571 FETCH c_visit_master_wo INTO c_mst_wo_visit_rec;
9572 CLOSE c_visit_master_wo;
9573
9574 --fetch the visit details
9575 OPEN c_visit_dtl(p_visit_id);
9576 FETCH c_visit_dtl INTO c_visit_dtl_rec;
9577 CLOSE c_visit_dtl;
9578
9579 --VWPE :: tchimira :: 15-FEB -2011 :: start
9580 IF (l_log_statement >= l_log_current_level) THEN
9581 fnd_log.string(l_log_statement,
9582 L_DEBUG_KEY,
9583 'Past Dated Flag value is : ' || c_visit_dtl_rec.PAST_DATED_VISIT_FLAG);
9584 END IF;
9585
9586 --Now if the value of the PAST_DATED_VISIT_FLAG is Y which means it is past dated visit.
9587 -- Create WOs as firm so that they will not be considered by PS schedule engine.
9588 IF(c_visit_dtl_rec.PAST_DATED_VISIT_FLAG = 'Y') THEN
9589 l_firm_planned_flag := 1; --Firm
9590 END IF;
9591 --VWPE :: tchimira :: 15-FEB -2011 :: end
9592
9593
9594 --fetch the count of tasks in planning status.
9595 OPEN c_all_task_dtl (p_visit_id);
9596 FETCH c_all_task_dtl INTO l_task_cnt;
9597 CLOSE c_all_task_dtl;
9598
9599 idx := idx+1;
9600 l_prd_workorder_tbl(idx).SCHEDULED_START_DATE := c_visit_dtl_rec.start_date_time;
9601 l_prd_workorder_tbl(idx).SCHEDULED_END_DATE := c_visit_dtl_rec.close_date_time;
9602 l_prd_workorder_tbl(idx).BATCH_ID := c_visit_dtl_rec.VISIT_NUMBER;
9603 l_prd_workorder_tbl(idx).HEADER_ID := 0; -- Visit
9604 IF (nvl(l_chk_mst_wo,0) = 1) THEN --Visit master wo already exists
9605 l_prd_workorder_tbl(idx).DML_OPERATION := 'U';
9606 l_prd_workorder_tbl(idx).WORKORDER_ID := c_mst_wo_visit_rec.workorder_id;
9607 l_prd_workorder_tbl(idx).OBJECT_VERSION_NUMBER := c_mst_wo_visit_rec.object_version_number;
9608 IF (c_mst_wo_visit_rec.status_code <> 3) THEN
9609 IF (p_release_flag = 'Y') THEN
9610 -- change status from UNRELEASED/DRAFT to RELEASED
9611 l_prd_workorder_tbl(idx).STATUS_CODE := '3'; -- Released
9612 -- Visit Master Work Order should ALWAYS be FIRM (not dependent on profile)
9613 l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG := 1; -- Firm
9614 ELSIF c_mst_wo_visit_rec.status_code = '17' THEN
9615 -- Master workorder was in Draft status, make it UNRELEASED now
9616 l_prd_workorder_tbl(idx).STATUS_CODE := '1'; -- Unreleased
9617 -- Visit Master Work Order should ALWAYS be FIRM (not dependent on profile)
9618 l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG := 1; -- Firm
9619 END IF;
9620 END IF; --master work order status is not 3
9621 ELSE -- visit master workorder does not exist, create a master wo
9622 l_prd_workorder_tbl(idx).DML_OPERATION := 'C';
9623 -- Visit Master Work Order should ALWAYS be FIRM (not dependent on profile)
9624 l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG := 1; -- Firm
9625 l_prd_workorder_tbl(idx).MASTER_WORKORDER_FLAG := 'Y';
9626 l_prd_workorder_tbl(idx).VISIT_ID := p_visit_id;
9627 l_prd_workorder_tbl(idx).ORGANIZATION_ID := c_visit_dtl_rec.organization_id;
9628 l_prd_workorder_tbl(idx).PROJECT_ID := c_visit_dtl_rec.project_id;
9629 l_prd_workorder_tbl(idx).DEPARTMENT_ID := c_visit_dtl_rec.department_id ;
9630 IF p_release_flag = 'Y' THEN
9631 l_prd_workorder_tbl(idx).STATUS_CODE := '3'; -- Released
9632 ELSE
9633 l_prd_workorder_tbl(idx).STATUS_CODE := '1'; -- Unreleased
9634 END IF;
9635 IF (c_visit_dtl_rec.inventory_item_id IS NULL AND c_visit_dtl_rec.item_instance_id IS NULL) THEN
9636 /*When the unit is not specified at the visit level, fetch the first task's inventory_item_id
9637 and the instance_id from the list of user selected tasks.This inventory_item_id/instance_id
9638 will be used in the creation of master wo for the visit.*/
9639 OPEN default_task_inst_dtls(p_tasks_tbl(p_tasks_tbl.FIRST).visit_task_id);
9640 FETCH default_task_inst_dtls INTO def_task_inst_rec;
9641 CLOSE default_task_inst_dtls;
9642 l_prd_workorder_tbl(idx).INVENTORY_ITEM_ID := def_task_inst_rec.inventory_item_id;
9643 l_prd_workorder_tbl(idx).ITEM_INSTANCE_ID := def_task_inst_rec.instance_id;
9644 ELSE
9645 l_prd_workorder_tbl(idx).INVENTORY_ITEM_ID := c_visit_dtl_rec.inventory_item_id;
9646 l_prd_workorder_tbl(idx).ITEM_INSTANCE_ID := c_visit_dtl_rec.item_instance_id;
9647 END IF;
9648 l_prd_workorder_tbl(idx).JOB_DESCRIPTION := c_visit_dtl_rec.visit_name ;
9649 END IF; --visit master workorder exists or not
9650
9651 FOR i in p_tasks_tbl.FIRST..p_tasks_tbl.LAST LOOP --for all tasks
9652
9653 OPEN c_fet_sum_task_flg(p_visit_id, p_tasks_tbl(i).visit_task_id);
9654 FETCH c_fet_sum_task_flg INTO l_manual_summ_task_flag;
9655 CLOSE c_fet_sum_task_flg;
9656
9657 IF (l_manual_summ_task_flag = 'Y') THEN
9658 -- No work order will be created for manually created summary task
9659 -- Just update the task status to Released.
9660 UPDATE ahl_visit_tasks_b
9661 SET status_code = 'RELEASED',
9662 --TCHIMIRA::BUG 9222622 ::15-DEC-2009::UPDATE OVN AND WHO COLUMNS
9663 OBJECT_VERSION_NUMBER = OBJECT_VERSION_NUMBER + 1,
9664 LAST_UPDATE_DATE = SYSDATE,
9665 LAST_UPDATED_BY = Fnd_Global.USER_ID,
9666 LAST_UPDATE_LOGIN = Fnd_Global.LOGIN_ID
9667 WHERE visit_task_id = p_tasks_tbl(i).visit_task_id;
9668
9669 ELSE
9670 --check if the wo exists for the task
9671 OPEN c_fet_task_wo(p_visit_id, p_tasks_tbl(i).visit_task_id);
9672 FETCH c_fet_task_wo INTO l_chk_task_wo;
9673 CLOSE c_fet_task_wo;
9674
9675 --fetch the task details
9676 OPEN c_visit_task_dtl(p_tasks_tbl(i).visit_task_id);
9677 FETCH c_visit_task_dtl INTO c_visit_tsk_dtl_rec;
9678 CLOSE c_visit_task_dtl;
9679
9680 --fetch the workorder details for the task
9681 OPEN c_task_wo(p_visit_id , p_tasks_tbl(i).visit_task_id);
9682 FETCH c_task_wo INTO c_task_wo_rec;
9683 CLOSE c_task_wo;
9684
9685 IF (nvl(l_chk_task_wo,0) = 1) THEN --task wo for the visit already exists
9686 IF (c_task_wo_rec.status_code = 17) THEN -- Status is Draft
9687 idx := idx+1;
9688 l_prd_workorder_tbl(idx).dml_operation := 'U';
9689 l_prd_workorder_tbl(idx).workorder_id := c_task_wo_rec.workorder_id;
9690 l_prd_workorder_tbl(idx).object_version_number := c_task_wo_rec.object_version_number;
9691 l_prd_workorder_tbl(idx).item_instance_id := c_visit_tsk_dtl_rec.instance_id ;
9692 l_prd_workorder_tbl(idx).BATCH_ID := c_visit_dtl_rec.visit_number;
9693 l_prd_workorder_tbl(idx).HEADER_ID := c_visit_tsk_dtl_rec.visit_task_number;
9694 IF (p_release_flag = 'Y') THEN
9695 l_prd_workorder_tbl(idx).status_code := '3'; -- Released
9696 ELSE
9697 l_prd_workorder_tbl(idx).status_code := '1'; -- UnReleased
9698 END IF;
9699 IF (l_firm_planned_flag IS NOT NULL AND
9700 -- SKPATHAK :: ER: 9147951 :: 11-JAN-2010
9701 -- For task with past task dates, WOs are always firm irrespective of the profile value
9702 p_tasks_tbl(i).past_task_start_date IS NULL AND
9703 l_firm_planned_flag = '2') THEN
9704 l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG := 2; -- Planned
9705 ELSE
9706 l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG := 1; -- Firm
9707 END IF;
9708 -- If summary task, use the min,max of sub tasks
9709 IF (c_visit_tsk_dtl_rec.task_type_code = 'SUMMARY') THEN
9710 OPEN get_summary_task_times_csr(c_visit_tsk_dtl_rec.visit_task_id);
9711 FETCH get_summary_task_times_csr
9712 INTO l_prd_workorder_tbl(idx).SCHEDULED_START_DATE,
9713 l_prd_workorder_tbl(idx).SCHEDULED_END_DATE;
9714 CLOSE get_summary_task_times_csr;
9715 ELSE
9716 l_prd_workorder_tbl(idx).scheduled_start_date := c_visit_tsk_dtl_rec.start_date_time;
9717 l_prd_workorder_tbl(idx).scheduled_end_date := c_visit_tsk_dtl_rec.end_date_time;
9718 END IF;
9719 /*B5758813 - rnahata - For summary tasks (both manual and MR summary tasks)
9720 and unassociated tasks the task name is passed as the workorder description.
9721 And for the Route tasks, the route number concatenated with the route title is
9722 passed as workorder description.*/
9723 IF (c_visit_tsk_dtl_rec.task_type_code IN ('SUMMARY','UNASSOCIATED')) THEN
9724 l_prd_workorder_tbl(idx).JOB_DESCRIPTION := c_visit_tsk_dtl_rec.visit_task_name;
9725 ELSE
9726 OPEN get_wo_dtls_for_mrtasks_cur(c_visit_tsk_dtl_rec.visit_task_id);
9727 FETCH get_wo_dtls_for_mrtasks_cur INTO get_wo_dtls_for_mrtasks_rec;
9728 --salogan added for bug 9754641 begin
9729 IF get_wo_dtls_for_mrtasks_cur%NOTFOUND THEN
9730 get_wo_dtls_for_mrtasks_rec.workorder_description := NULL;
9731 END IF;
9732 --salogan added for bug 9754641 begin
9733 CLOSE get_wo_dtls_for_mrtasks_cur;
9734 l_prd_workorder_tbl(idx).JOB_DESCRIPTION := get_wo_dtls_for_mrtasks_rec.workorder_description;
9735 END IF;
9736 END IF; -- WO Status is Draft
9737 ELSE --work order does not exist for this task
9738 -- Create a new work order
9739 idx := idx+1;
9740 l_prd_workorder_tbl(idx).DML_OPERATION := 'C';
9741 IF p_release_flag = 'Y' THEN
9742 l_prd_workorder_tbl(idx).STATUS_CODE := '3'; -- Released
9743 ELSE
9744 l_prd_workorder_tbl(idx).STATUS_CODE := '1'; -- Unreleased
9745 END IF;
9746 IF (l_firm_planned_flag IS NOT NULL AND
9747 -- SKPATHAK :: ER: 9147951 :: 11-JAN-2010
9748 -- For task with past task dates, WOs are always firm irrespective of the profile value
9749 p_tasks_tbl(i).past_task_start_date IS NULL AND
9750 l_firm_planned_flag = '2') THEN
9751 l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG := 2; -- Planned
9752 ELSE
9753 l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG := 1; -- Firm
9754 END IF;
9755 IF (c_visit_tsk_dtl_rec.task_type_code = 'SUMMARY') THEN
9756 l_prd_workorder_tbl(idx).MASTER_WORKORDER_FLAG := 'Y';
9757 ELSE
9758 l_prd_workorder_tbl(idx).MASTER_WORKORDER_FLAG := 'N';
9759 END IF;
9760
9761 l_prd_workorder_tbl(idx).BATCH_ID := c_visit_dtl_rec.visit_number;
9762 l_prd_workorder_tbl(idx).HEADER_ID := c_visit_tsk_dtl_rec.visit_task_number;
9763 l_prd_workorder_tbl(idx).VISIT_ID := p_visit_id;
9764 l_prd_workorder_tbl(idx).ORGANIZATION_ID := c_visit_dtl_rec.organization_id;
9765 l_prd_workorder_tbl(idx).PROJECT_ID := c_visit_dtl_rec.project_id;
9766 l_prd_workorder_tbl(idx).INVENTORY_ITEM_ID := c_visit_tsk_dtl_rec.inventory_item_id ;
9767 l_prd_workorder_tbl(idx).ITEM_INSTANCE_ID := c_visit_tsk_dtl_rec.instance_id ;
9768 l_prd_workorder_tbl(idx).VISIT_TASK_ID := c_visit_tsk_dtl_rec.visit_task_id ;
9769 l_prd_workorder_tbl(idx).VISIT_TASK_NUMBER := c_visit_tsk_dtl_rec.visit_task_number ;
9770 --l_prd_workorder_tbl(idx).PROJECT_TASK_ID := c_visit_tsk_dtl_rec.project_task_id ;
9771 -- SKPATHAK :: PIE:FP :: 21-DEC-2010
9772 -- Pass the Project Task Id only for work orders that don't correspond to Summary Tasks
9773 IF ( c_visit_tsk_dtl_rec.task_type_code <> 'SUMMARY' ) THEN
9774 l_prd_workorder_tbl(idx).PROJECT_TASK_ID := c_visit_tsk_dtl_rec.project_task_id ;
9775 l_prd_workorder_tbl(idx).PROJECT_ID := c_visit_dtl_rec.project_id;
9776 END IF;
9777
9778 /*B5758813 - rnahata - For summary tasks (both manual and MR summary tasks)
9779 and unassociated tasks, the task name is passed as the workorder description.
9780 And for the MR tasks, the route number concatenated with the route title is
9781 passed as workorder description.*/
9782 IF (c_visit_tsk_dtl_rec.task_type_code IN ('SUMMARY','UNASSOCIATED')) THEN
9783 l_prd_workorder_tbl(idx).JOB_DESCRIPTION := c_visit_tsk_dtl_rec.visit_task_name;
9784 ELSE
9785 OPEN get_wo_dtls_for_mrtasks_cur(c_visit_tsk_dtl_rec.visit_task_id);
9786 FETCH get_wo_dtls_for_mrtasks_cur INTO get_wo_dtls_for_mrtasks_rec;
9787 --salogan added for bug 9754641 begin
9788 IF get_wo_dtls_for_mrtasks_cur%NOTFOUND THEN
9789 get_wo_dtls_for_mrtasks_rec.workorder_description := NULL;
9790 END IF;
9791 --salogan added for bug 9754641 begin
9792 CLOSE get_wo_dtls_for_mrtasks_cur;
9793 l_prd_workorder_tbl(idx).JOB_DESCRIPTION := get_wo_dtls_for_mrtasks_rec.workorder_description;
9794 END IF;
9795
9796 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
9797 OPEN c_route (c_visit_tsk_dtl_rec.mr_route_id);
9798 FETCH c_route INTO l_prd_workorder_tbl(idx).ROUTE_ID;
9799 CLOSE c_route;
9800 ELSE
9801 l_prd_workorder_tbl(idx).ROUTE_ID := Null;
9802 END IF;
9803
9804 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
9805 l_prd_workorder_tbl(idx).DEPARTMENT_ID := c_visit_tsk_dtl_rec.department_id ;
9806 ELSE
9807 l_prd_workorder_tbl(idx).DEPARTMENT_ID := c_visit_dtl_rec.department_id ;
9808 END IF;
9809
9810 -- If summary task, use the min,max of sub tasks
9811 IF (c_visit_tsk_dtl_rec.task_type_code = 'SUMMARY') THEN
9812 OPEN get_summary_task_times_csr(c_visit_tsk_dtl_rec.visit_task_id);
9813 FETCH get_summary_task_times_csr INTO l_prd_workorder_tbl(idx).SCHEDULED_START_DATE,
9814 l_prd_workorder_tbl(idx).SCHEDULED_END_DATE;
9815 CLOSE get_summary_task_times_csr;
9816 ELSE
9817 l_prd_workorder_tbl(idx).SCHEDULED_START_DATE := c_visit_tsk_dtl_rec.START_DATE_TIME;
9818 l_prd_workorder_tbl(idx).SCHEDULED_END_DATE := c_visit_tsk_dtl_rec.END_DATE_TIME;
9819 END IF;
9820 END IF; --work order exists or not for this task
9821
9822 IF (l_log_statement >= l_log_current_level) THEN
9823 fnd_log.string(l_log_statement,
9824 L_DEBUG_KEY,
9825 'Before calling Get_Task_Relationships for task id: ' ||p_tasks_tbl(i).visit_task_id);
9826 END IF;
9827
9828 AHL_VWP_PROJ_PROD_PVT.Get_Task_Relationships
9829 ( p_visit_id => p_visit_id,
9830 p_visit_number => c_visit_dtl_rec.visit_number,
9831 p_visit_task_id => c_visit_tsk_dtl_rec.visit_task_id,
9832 p_x_relationship_tbl => l_prd_workorder_rel_tbl
9833 );
9834
9835 IF (l_log_statement >= l_log_current_level) THEN
9836 fnd_log.string(l_log_statement,
9837 L_DEBUG_KEY,
9838 'After calling Get_Task_Relationships');
9839 END IF;
9840 END IF; -- Task is Manually Created Summary Task or not
9841 END LOOP; -- For all tasks in p_tasks_tbl
9842
9843 -- Commented the below code by tchimira on 14-MAR-2012 as per the requirement stated in the bug 13695008
9844 --first get the task relationships for the tasks, then collect the dependencies.
9845 /*IF (l_log_statement >= l_log_current_level) THEN
9846 fnd_log.string(l_log_statement,
9847 L_DEBUG_KEY,
9848 'Before calling Get_Task_Dependencies for tasks');
9849 END IF;
9850
9851 FOR i IN p_tasks_tbl.FIRST..p_tasks_tbl.LAST LOOP
9852 AHL_VWP_PROJ_PROD_PVT.Get_Task_Dependencies
9853 (
9854 p_visit_number => c_visit_dtl_rec.visit_number,
9855 p_visit_task_id => p_tasks_tbl(i).visit_task_id,
9856 p_visit_task_number => p_tasks_tbl(i).visit_task_number,
9857 p_x_relationship_tbl => l_prd_workorder_rel_tbl
9858 );
9859
9860 IF (l_log_statement >= l_log_current_level) THEN
9861 fnd_log.string(l_log_statement,
9862 L_DEBUG_KEY,
9863 'After calling Get_Task_Dependencies for task id: ' ||p_tasks_tbl(i).visit_task_id);
9864 END IF;
9865 END LOOP;*/ -- For all tasks in p_tasks_tbl
9866
9867 -- SR master workorder dates need to be adjusted when new MRs are added.
9868 -- Scheduled start date and Scheduled end date of SR MWO will be derived as follows
9869 -- 1. Scheduled start date will be least of scheduled start date of all existing workorders
9870 -- and new workorders that will be added.
9871 -- 2. Scheduled end date will be greatest of scheduled start date of all existing workorders
9872 -- and new workorders that will be added.
9873
9874 -- step 1. get sr summary tasks duration
9875 -- Note: Entire task table need be looped through. As in future
9876 -- requirement, we may need to accomodate cases were more than one
9877 -- Group task will be passed to this API.
9878 OPEN c_get_sr_task_dtls(p_tasks_tbl(p_tasks_tbl.FIRST).visit_task_id);
9879 FETCH c_get_sr_task_dtls INTO l_sr_task_dtls_rec;
9880 CLOSE c_get_sr_task_dtls;
9881
9882 OPEN get_summary_task_times_csr(l_sr_task_dtls_rec.visit_task_id);
9883 FETCH get_summary_task_times_csr INTO l_sch_start_date, l_sch_end_date;
9884 CLOSE get_summary_task_times_csr;
9885
9886 -- step 2. get sr mwo details including scheduled dates.
9887 OPEN c_get_sr_mwo_dtls(l_sr_task_dtls_rec.visit_task_id);
9888 FETCH c_get_sr_mwo_dtls INTO l_sr_mwo_rec;
9889 CLOSE c_get_sr_mwo_dtls;
9890
9891 -- step 3. update sr mwo details with new scheduled dates.
9892 IF (l_sr_mwo_rec.wip_entity_id IS NOT NULL) THEN
9893
9894 l_wo_tbl_count := l_prd_workorder_tbl.COUNT + 1;
9895
9896 --l_prd_workorder_tbl(l_wo_tbl_count).wip_entity_id := l_sr_mwo_rec.wip_entity_id;
9897 l_prd_workorder_tbl(l_wo_tbl_count).object_version_number := l_sr_mwo_rec.object_version_number;
9898 l_prd_workorder_tbl(l_wo_tbl_count).workorder_id := l_sr_mwo_rec.workorder_id;
9899 l_prd_workorder_tbl(l_wo_tbl_count).dml_operation := 'U';
9900
9901 l_prd_workorder_tbl(l_wo_tbl_count).scheduled_start_date := LEAST(l_sr_mwo_rec.scheduled_start_date,l_sch_start_date);
9902 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'));
9903 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'));
9904
9905 l_prd_workorder_tbl(l_wo_tbl_count).scheduled_end_date := GREATEST(l_sr_mwo_rec.scheduled_completion_date,l_sch_end_date);
9906 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'));
9907 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'));
9908
9909 l_prd_workorder_tbl(l_wo_tbl_count).batch_id := c_visit_dtl_rec.visit_number;
9910 l_prd_workorder_tbl(l_wo_tbl_count).header_id := l_sr_task_dtls_rec.visit_task_number;
9911
9912 IF (l_log_statement >= l_log_current_level) THEN
9913 fnd_log.string(l_log_statement,
9914 L_DEBUG_KEY,
9915 'SR MWO Dates before updating...');
9916 fnd_log.string(l_log_statement,
9917 L_DEBUG_KEY,
9918 '----------------------------------------------');
9919 fnd_log.string(l_log_statement,
9920 L_DEBUG_KEY,
9921 'scheduled_start_time->'||TO_CHAR(l_sr_mwo_rec.scheduled_start_date,'DD-MON-YYYY HH24:MI:SS'));
9922 fnd_log.string(l_log_statement,
9923 L_DEBUG_KEY,
9924 'scheduled_end_time->'||TO_CHAR(l_sr_mwo_rec.scheduled_completion_date,'DD-MON-YYYY HH24:MI:SS'));
9925 fnd_log.string(l_log_statement,
9926 L_DEBUG_KEY,
9927 'SR MWO Dates after updating...');
9928 fnd_log.string(l_log_statement,
9929 L_DEBUG_KEY,
9930 '----------------------------------------------');
9931 fnd_log.string(l_log_statement,
9932 L_DEBUG_KEY,
9933 'scheduled_start_time->'||TO_CHAR(l_prd_workorder_tbl(l_wo_tbl_count).scheduled_start_date,'DD-MON-YYYY HH24:MI:SS'));
9934 fnd_log.string(l_log_statement,
9935 L_DEBUG_KEY,
9936 'scheduled_end_time->'||TO_CHAR(l_prd_workorder_tbl(l_wo_tbl_count).scheduled_end_date,'DD-MON-YYYY HH24:MI:SS'));
9937 fnd_log.string(l_log_statement,
9938 L_DEBUG_KEY,
9939 'SR Task scheduled_start_time->'||TO_CHAR(l_sch_start_date,'DD-MON-YYYY HH24:MI:SS'));
9940 fnd_log.string(l_log_statement,
9941 L_DEBUG_KEY,
9942 'SR Task scheduled_end_time->'||TO_CHAR(l_sch_end_date,'DD-MON-YYYY HH24:MI:SS'));
9943 END IF; -- Statement Log Level
9944 END IF; -- wip_entity_id IS NOT NULL
9945
9946 --BUG 13373947 :: PRAKKUM :: 10/02/2012 :: START
9947 -- IF visit planned end date is in PAST and visit itself is not past dated then validate workorder shcedule start dates
9948 IF ( c_visit_dtl_rec.close_date_time IS NOT NULL AND c_visit_dtl_rec.close_date_time<SYSDATE ) AND NVL(c_visit_dtl_rec.PAST_DATED_VISIT_FLAG,'N')='N' THEN
9949
9950 l_max_schedule_start_date := c_visit_dtl_rec.close_date_time;
9951 For loopvar IN l_prd_workorder_tbl.FIRST..l_prd_workorder_tbl.LAST
9952 LOOP
9953
9954 IF (l_log_statement >= l_log_current_level) THEN
9955 fnd_log.string(l_log_statement, L_DEBUG_KEY, 'l_prd_workorder_tbl(idx).SCHEDULED_START_DATE --@>'
9956 || TO_CHAR(l_prd_workorder_tbl(idx).SCHEDULED_START_DATE,'DD-MON-YYYY HH24:MI:SS'));
9957 fnd_log.string(l_log_statement, L_DEBUG_KEY, 'get_vst_status_and_date_rec.close_date_time --@>'
9958 || TO_CHAR(c_visit_dtl_rec.close_date_time,'DD-MON-YYYY HH24:MI:SS'));
9959 END IF;
9960
9961 IF l_prd_workorder_tbl(idx).SCHEDULED_START_DATE IS NOT NULL AND c_visit_dtl_rec.close_date_time IS NOT NULL THEN
9962 IF l_prd_workorder_tbl(idx).SCHEDULED_START_DATE > c_visit_dtl_rec.close_date_time THEN
9963 -- Find max schedule start date
9964 IF l_prd_workorder_tbl(idx).SCHEDULED_START_DATE > l_max_schedule_start_date THEN
9965 l_max_schedule_start_date := l_prd_workorder_tbl(idx).SCHEDULED_START_DATE;
9966 END IF;
9967 END IF;
9968 END IF;
9969 END LOOP;
9970
9971 IF (l_log_statement >= l_log_current_level) THEN
9972 fnd_log.string(l_log_statement, L_DEBUG_KEY, 'l_max_schedule_start_date --@>'
9973 || TO_CHAR(l_max_schedule_start_date,'DD-MON-YYYY HH24:MI:SS'));
9974 END IF;
9975
9976 IF l_max_schedule_start_date > c_visit_dtl_rec.close_date_time THEN -- Validation Error
9977 Fnd_Message.SET_NAME('AHL','AHL_VWP_NON_PS_PLAN_ED_DATE');
9978 Fnd_Msg_Pub.ADD;
9979 RAISE Fnd_Api.G_EXC_ERROR;
9980 END IF;
9981
9982 END IF;
9983 --BUG 13373947 :: PRAKKUM :: 10/02/2012 :: END
9984
9985 IF (l_log_statement >= l_log_current_level) THEN
9986 fnd_log.string(l_log_statement,
9987 L_DEBUG_KEY,
9988 'Before calling PROCESS_JOBS for visit_id: ' || p_visit_id);
9989 END IF;
9990
9991 -- Call Production API to create work orders
9992 AHL_PRD_WORKORDER_PVT.Process_Jobs
9993 (p_api_version => l_api_version ,
9994 p_init_msg_list => p_init_msg_list,
9995 p_commit => 'F',
9996 p_validation_level => p_validation_level,
9997 p_default => FND_API.G_TRUE,
9998 p_module_type => p_module_type,
9999 x_return_status => l_return_status,
10000 x_msg_count => l_msg_count,
10001 x_msg_data => l_msg_data,
10002 p_x_prd_workorder_tbl => l_prd_workorder_tbl,
10003 p_prd_workorder_rel_tbl => l_prd_workorder_rel_tbl
10004 );
10005
10006 IF (l_log_statement >= l_log_current_level) THEN
10007 fnd_log.string(l_log_statement,
10008 L_DEBUG_KEY,
10009 'After calling PROCESS_JOBS for visit_id ' ||
10010 p_visit_id||', l_return_status: '|| l_return_status);
10011 END IF;
10012
10013 IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
10014 x_msg_count := FND_MSG_PUB.count_msg;
10015 IF (l_log_statement >= l_log_current_level) THEN
10016 fnd_log.string(l_log_statement,
10017 L_DEBUG_KEY,
10018 'Errors from PROCESS_JOBS. Message count: ' || x_msg_count);
10019 END IF;
10020 IF l_return_status = FND_API.G_RET_STS_ERROR THEN
10021 RAISE FND_API.G_EXC_ERROR;
10022 ELSE
10023 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
10024 END IF;
10025 END IF; -- Return Status is not Success
10026
10027 IF (l_log_statement >= l_log_current_level) THEN
10028 For i IN l_prd_workorder_tbl.FIRST..l_prd_workorder_tbl.LAST LOOP
10029 fnd_log.string(l_log_statement,
10030 L_DEBUG_KEY,
10031 'WorkOrder Id('||i||'): '||l_prd_workorder_tbl(i).workorder_id);
10032 END LOOP;
10033 END IF;
10034
10035 /*B5758813 - rnahata - starts*/
10036 /*The project start/end dates have to be updated with the workorder scheduled
10037 start/end dates.*/
10038 IF (l_log_statement >= l_log_current_level) THEN
10039 fnd_log.string(l_log_statement,
10040 L_DEBUG_KEY,
10041 'Before calling Update_Project_Task_Times.');
10042 END IF;
10043
10044 Update_Project_Task_Times(
10045 p_prd_workorder_tbl => l_prd_workorder_tbl,
10046 p_commit =>'F',
10047 x_return_status => l_return_status,
10048 x_msg_count => l_msg_count,
10049 x_msg_data => l_msg_data);
10050
10051 IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
10052 x_msg_count := FND_MSG_PUB.count_msg;
10053 IF (l_log_statement >= l_log_current_level) THEN
10054 fnd_log.string(l_log_statement,
10055 L_DEBUG_KEY,
10056 'Errors from Update_Project_Task_Times. Message count: ' || x_msg_count);
10057 END IF;
10058 IF l_return_status = FND_API.G_RET_STS_ERROR THEN
10059 RAISE FND_API.G_EXC_ERROR;
10060 ELSE
10061 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
10062 END IF;
10063 ELSE
10064 IF (l_log_statement >= l_log_current_level) THEN
10065 fnd_log.string(l_log_statement,
10066 L_DEBUG_KEY,
10067 'Returned Success from Update_Project_Task_Times');
10068 END IF;
10069 END IF; -- Return Status is Success or not
10070 /*B5758813 - rnahata - ends*/
10071
10072 -- SKPATHAK :: 02-MAY-2011 :: VWPE: ER:12424063 :: STARTS
10073 -- If the task type is duplicate, cancel the WO, else change
10074 FOR i IN p_tasks_tbl.FIRST..p_tasks_tbl.LAST LOOP
10075 OPEN get_task_dets (p_tasks_tbl(i).visit_task_id);
10076 FETCH get_task_dets INTO task_dets_rec;
10077 CLOSE get_task_dets;
10078 IF task_dets_rec.task_type_code = 'DUPLICATE' THEN
10079 UPDATE ahl_visit_tasks_b
10080 SET status_code = 'CANCELLED',
10081 OBJECT_VERSION_NUMBER = OBJECT_VERSION_NUMBER + 1,
10082 LAST_UPDATE_DATE = SYSDATE,
10083 LAST_UPDATED_BY = Fnd_Global.USER_ID,
10084 LAST_UPDATE_LOGIN = Fnd_Global.LOGIN_ID
10085 WHERE visit_task_id = p_tasks_tbl(i).visit_task_id;
10086 AHL_PRD_WORKORDER_PVT.cancel_visit_jobs
10087 (p_api_version => 1.0,
10088 p_init_msg_list => FND_API.G_TRUE,
10089 p_commit => FND_API.G_FALSE,
10090 p_validation_level => FND_API.G_VALID_LEVEL_FULL,
10091 p_default => FND_API.G_FALSE,
10092 p_module_type => NULL,
10093 x_return_status => l_return_status,
10094 x_msg_count => l_msg_count,
10095 x_msg_data => l_msg_data,
10096 p_visit_id => NULL,
10097 p_unit_effectivity_id => NULL,
10098 p_workorder_id => task_dets_rec.workorder_id);
10099 ELSE
10100 UPDATE ahl_visit_tasks_b
10101 SET status_code = 'RELEASED',
10102 OBJECT_VERSION_NUMBER = OBJECT_VERSION_NUMBER + 1,
10103 LAST_UPDATE_DATE = SYSDATE,
10104 LAST_UPDATED_BY = Fnd_Global.USER_ID,
10105 LAST_UPDATE_LOGIN = Fnd_Global.LOGIN_ID
10106 WHERE visit_task_id = p_tasks_tbl(i).visit_task_id;
10107 END IF;
10108 END LOOP;
10109
10110 -- If any of the tasks in a stage is in shop floor, modify the stage status to partially implemented
10111 IF (l_log_statement >= l_log_current_level) THEN
10112 fnd_log.string(l_log_statement,
10113 L_DEBUG_KEY,'c_visit_dtl_rec.IS_OLD_VISIT = ' || c_visit_dtl_rec.IS_OLD_VISIT );
10114 END IF;
10115 IF c_visit_dtl_rec.IS_OLD_VISIT<>'Y' THEN --VWPE 12730539:: PRAKKUM :: 15-JUL-2011
10116 FOR l_stage_rec IN get_stage_id (p_visit_id) LOOP
10117 UPDATE ahl_vwp_stages_b
10118 SET stage_status_code = 'PARTIALLY RELEASED',
10119 OBJECT_VERSION_NUMBER = OBJECT_VERSION_NUMBER + 1,
10120 LAST_UPDATE_DATE = SYSDATE,
10121 LAST_UPDATED_BY = Fnd_Global.USER_ID,
10122 LAST_UPDATE_LOGIN = Fnd_Global.LOGIN_ID
10123 WHERE stage_id = l_stage_rec.stage_id;
10124 END LOOP;
10125 END IF;
10126 -- SKPATHAK :: 02-MAY-2011 :: VWPE: ER:12424063 :: ENDS
10127
10128 -- SOSAHNI :: BUG 16089700 :: FP base bug 15843414 :: 10/01/2013 :: Moved this code for changing repair batch status before updating visit status - Start
10129 /* MANESING::Bug 13713141, 16-Apr-2012, For Component Visits, Repair Batch status should also
10130 * change similar to the way Visit status changes as Repair Batches are like mini-visits.
10131 * So, if all tasks under the Repair Batch are P2P, then its status should be 'RELEASED',
10132 * otherwise 'PARTIALLY RELEASED'.
10133 */
10134 IF (AHL_CMP_UTIL_PKG.Is_Comp_Visit (p_visit_id) = 'Y') THEN
10135
10136 -- find which Repair Batch, the selected tasks belongs to
10137 OPEN get_rpr_batch_for_task_csr (p_tasks_tbl(p_tasks_tbl.FIRST).visit_task_id);
10138 FETCH get_rpr_batch_for_task_csr INTO l_repair_batch_name;
10139 IF (get_rpr_batch_for_task_csr%FOUND) THEN
10140
10141 -- change Repair Batch status as mentioned above
10142 OPEN chk_rpr_batch_has_planed_tasks (l_repair_batch_name);
10143 FETCH chk_rpr_batch_has_planed_tasks INTO l_dummy;
10144
10145 -- if Repair Batch has planned tasks
10146 IF (chk_rpr_batch_has_planed_tasks%FOUND) THEN
10147 IF (l_log_statement >= l_log_current_level) THEN
10148 FND_LOG.string(l_log_statement, l_debug_key, 'Repair Batch ' || l_repair_batch_name || ' has atleast one planned task.');
10149 END IF;
10150
10151 UPDATE AHL_VISIT_TASKS_B
10152 SET status_code = 'PARTIALLY RELEASED',
10153 object_version_number = object_version_number + 1,
10154 last_update_date = SYSDATE,
10155 last_updated_by = Fnd_Global.USER_ID,
10156 last_update_login = Fnd_Global.LOGIN_ID
10157 WHERE repair_batch_name = l_repair_batch_name;
10158
10159 -- if Repair Batch has no planned tasks
10160 ELSE
10161 IF (l_log_statement >= l_log_current_level) THEN
10162 FND_LOG.string(l_log_statement, l_debug_key, 'Repair Batch ' || l_repair_batch_name || ' has no planned tasks.');
10163 END IF;
10164
10165 UPDATE AHL_VISIT_TASKS_B
10166 SET status_code = 'RELEASED',
10167 object_version_number = object_version_number + 1,
10168 last_update_date = SYSDATE,
10169 last_updated_by = Fnd_Global.USER_ID,
10170 last_update_login = Fnd_Global.LOGIN_ID
10171 WHERE repair_batch_name = l_repair_batch_name;
10172 END IF;
10173 CLOSE chk_rpr_batch_has_planed_tasks;
10174
10175 END IF;
10176 CLOSE get_rpr_batch_for_task_csr;
10177
10178 END IF; -- IF Component Visit
10179 -- End by SOSAHNI on 10/01/2013 for BUG 16089700 :: FP base bug 15843414
10180
10181 /*Check if the user had selected all the tasks otherwise
10182 update the visit as Partially released.*/
10183 OPEN c_visit_has_planned_tasks(p_visit_id);
10184 FETCH c_visit_has_planned_tasks into l_temp_num1;
10185 CLOSE c_visit_has_planned_tasks;
10186
10187 OPEN c_visit_time_matches_MWO_time(p_visit_id);
10188 FETCH c_visit_time_matches_MWO_time INTO l_temp_num2;
10189 CLOSE c_visit_time_matches_MWO_time;
10190
10191 IF l_temp_num1 IS NOT NULL OR l_temp_num2 is NULL THEN
10192 IF (l_log_statement >= l_log_current_level) THEN
10193 IF l_temp_num1 IS NOT NULL THEN
10194 fnd_log.string(l_log_statement,
10195 L_DEBUG_KEY,
10196 'Visit has some tasks in planning status. Setting Visit status to PARTIALLY RELEASED.');
10197 END IF;
10198 IF l_temp_num2 IS NULL THEN
10199 fnd_log.string(l_log_statement,
10200 L_DEBUG_KEY,
10201 'Visit times and Master Work order times do not match. Setting Visit status to PARTIALLY RELEASED.');
10202 END IF;
10203 END IF;
10204
10205 UPDATE ahl_visits_b
10206 SET status_code = 'PARTIALLY RELEASED',
10207 --TCHIMIRA::BUG 9222622 ::15-DEC-2009::UPDATE OVN AND WHO COLUMNS
10208 OBJECT_VERSION_NUMBER = OBJECT_VERSION_NUMBER + 1,
10209 LAST_UPDATE_DATE = SYSDATE,
10210 LAST_UPDATED_BY = Fnd_Global.USER_ID,
10211 LAST_UPDATE_LOGIN = Fnd_Global.LOGIN_ID
10212 WHERE visit_id = p_visit_id;
10213 ELSE
10214 IF (l_log_statement >= l_log_current_level) THEN
10215 fnd_log.string(l_log_statement,
10216 L_DEBUG_KEY,
10217 'Setting Visit status to RELEASED.');
10218 END IF;
10219
10220 UPDATE ahl_visits_b
10221 SET status_code = 'RELEASED',
10222 any_task_chg_flag ='N',
10223 --TCHIMIRA::BUG 9222622 ::15-DEC-2009::UPDATE OVN AND WHO COLUMNS
10224 OBJECT_VERSION_NUMBER = OBJECT_VERSION_NUMBER + 1,
10225 LAST_UPDATE_DATE = SYSDATE,
10226 LAST_UPDATED_BY = Fnd_Global.USER_ID,
10227 LAST_UPDATE_LOGIN = Fnd_Global.LOGIN_ID
10228 WHERE visit_id = p_visit_id;
10229 END IF;
10230
10231
10232 IF (l_log_procedure >= l_log_current_level) THEN
10233 fnd_log.string(l_log_procedure,
10234 L_DEBUG_KEY ||'.end',
10235 'At the end of PL SQL procedure. Return Status = ' || x_return_status);
10236 END IF;
10237
10238 EXCEPTION
10239 WHEN FND_API.G_EXC_ERROR THEN
10240 x_return_status := FND_API.G_RET_STS_ERROR;
10241 ROLLBACK TO Push_tasks_to_prodn_pvt;
10242 FND_MSG_PUB.count_and_get(p_count => x_msg_count,
10243 p_data => x_msg_data,
10244 p_encoded => fnd_api.g_false);
10245
10246 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
10247 x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
10248 ROLLBACK TO Push_tasks_to_prodn_pvt;
10249 Fnd_Msg_Pub.count_and_get (
10250 p_encoded => Fnd_Api.g_false,
10251 p_count => x_msg_count,
10252 p_data => x_msg_data);
10253
10254 WHEN OTHERS THEN
10255 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
10256 ROLLBACK TO Push_tasks_to_prodn_pvt;
10257 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
10258 fnd_msg_pub.add_exc_msg(p_pkg_name => G_PKG_NAME,
10259 p_procedure_name => 'Push_tasks_to_production',
10260 p_error_text => SUBSTR(SQLERRM,1,500));
10261 END IF;
10262 FND_MSG_PUB.count_and_get(p_count => x_msg_count,
10263 p_data => x_msg_data,
10264 p_encoded => fnd_api.g_false);
10265
10266 END Push_tasks_to_production;
10267
10268 -------------------------------------------------------------------
10269 -- Procedure name : check_unit_quarantined
10270 -- Type : Private
10271 -- Function : To check whether the Unit is quarantined
10272 -- Parameters : item_instance_id
10273
10274 -- AnRaj added for R 12.0 ACL changes in VWP
10275 -- Bug number 4297066
10276 ----------------------------------------------------------------------
10277 PROCEDURE check_unit_quarantined(
10278 p_visit_id IN NUMBER,
10279 item_instance_id IN NUMBER
10280 )
10281 IS
10282 L_API_NAME CONSTANT VARCHAR2(30) := 'check_unit_quarantined';
10283 L_DEBUG_KEY CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
10284 l_unit_name VARCHAR2(80);
10285 l_quarantined VARCHAR2(1);
10286 l_task_number NUMBER(15);
10287 l_instance_id NUMBER;
10288
10289 /* MANESING::Component Maintenance Planning Project, 07-Aug-2011, added visit task CLOSED status
10290 * in cursor query to prevent fetching tasks that are Closed due to Repair Batch closure.
10291 */
10292 CURSOR c_get_tasknumbers (x_visit_id IN NUMBER) IS
10293 SELECT visit_task_number,instance_id
10294 FROM ahl_visit_tasks_vl
10295 WHERE visit_id = p_visit_id
10296 AND NVL(STATUS_CODE,'X') NOT IN ('DELETED','RELEASED','CLOSED')
10297 AND TASK_TYPE_CODE <> 'SUMMARY';
10298 BEGIN
10299
10300 IF (l_log_procedure >= l_log_current_level) THEN
10301 fnd_log.string(l_log_procedure,L_DEBUG_KEY||'.begin', 'At the start of PL SQL procedure');
10302 fnd_log.string(l_log_procedure,L_DEBUG_KEY,'p_visit_id : '|| p_visit_id || 'item_instance_id : '|| item_instance_id);
10303 END IF;
10304
10305 IF item_instance_id IS NOT NULL THEN
10306 -- If the Visit header has an instance id, check for the corresponding Unit
10307 l_quarantined := ahl_util_uc_pkg.is_unit_quarantined(null,item_instance_id);
10308 IF l_quarantined = FND_API.G_TRUE THEN
10309 l_unit_name := ahl_util_uc_pkg.get_unit_name(item_instance_id);
10310 Fnd_Message.SET_NAME('AHL','AHL_VWP_VLD_HDR_UNIT_QRNT');
10311 -- The Unit for this Visit (UNIT_NAME-1) is quarantined.
10312 Fnd_Message.Set_Token('UNIT_NAME',l_unit_name);
10313 Fnd_Msg_Pub.ADD;
10314
10315 IF (l_log_statement >= l_log_current_level)THEN
10316 fnd_log.string (l_log_statement,L_DEBUG_KEY,'Unit : '||l_unit_name || ' is quarantined, Error message added');
10317 END IF;
10318 END IF; -- l_quarantined not true
10319 ELSE -- instance id is null
10320 -- If the visit does not have a unit at the header , then check for the units of all tasks
10321 OPEN c_get_tasknumbers (p_visit_id);
10322 LOOP
10323 FETCH c_get_tasknumbers INTO l_task_number,l_instance_id;
10324 EXIT WHEN c_get_tasknumbers%NOTFOUND;
10325 l_quarantined := ahl_util_uc_pkg.is_unit_quarantined(null,l_instance_id);
10326 IF l_quarantined = FND_API.G_TRUE THEN
10327 Fnd_Message.SET_NAME('AHL','AHL_VWP_VLD_TSK_UNIT_QRNT');
10328 -- The Unit for the Task (UNIT_NAME-1) is quarantined.
10329 Fnd_Message.Set_Token('TASK_NUMBER',l_task_number);
10330 Fnd_Msg_Pub.ADD;
10331 IF (l_log_statement >= l_log_current_level)THEN
10332 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Unit for this task: '||l_task_number||' is quarantined');
10333 END IF;
10334 END IF; -- l_quarantined not true
10335 END LOOP; -- c_get_tasknumbers
10336 END IF;
10337
10338 IF (l_log_procedure >= l_log_current_level) THEN
10339 fnd_log.string(l_log_procedure,L_DEBUG_KEY ||'.end','At the end of PL SQL procedure ');
10340 END IF;
10341 END check_unit_quarantined;
10342
10343 -------------------------------------------------------------------
10344 -- Procedure name : Release_MR
10345 -- Type : Private
10346 --
10347 --
10348 -- Function :To release all MRs associated to a given UE and return
10349 -- workorder ID for the root task. Requested by MEL/CDL.
10350 -- If p_module_type is 'PROD' and Validate_Before_Production
10351 -- fails, then no exception will be thrown and calling API is
10352 -- responsible to check return status ('V') and read from error stack.
10353 -- Pre-reqs :
10354 -- Parameters :
10355 --
10356 -- Standard IN Parameters :
10357 -- p_api_version IN NUMBER Required
10358 -- p_init_msg_list IN VARCHAR2 Default FND_API.G_FALSE
10359 -- p_commit IN VARCHAR2 Default FND_API.G_FALSE
10360 -- p_validation_level IN NUMBER Default FND_API.G_VALID_LEVEL_FULL
10361 --
10362 -- Standard OUT Parameters :
10363 -- x_return_status OUT VARCHAR2 Required ='V' if validation fails
10364 -- x_msg_count OUT NUMBER Required
10365 -- x_msg_data OUT VARCHAR2 Required
10366 -- x_workorder_id OUT NUMBER Required
10367 --
10368 -- Release visit Parameters:
10369 -- p_visit_id IN NUMBER Required
10370 -- p_unit_effectivity_id IN NUMBER Required
10371 -- p_release_flag IN VARCHAR2 optional
10372 --
10373 -- Version :
10374 -- 07/21/2005 YAZHOU Initial Creation
10375 -------------------------------------------------------------------
10376 PROCEDURE Release_MR (
10377 p_api_version IN NUMBER,
10378 p_init_msg_list IN VARCHAR2 := Fnd_Api.G_FALSE,
10379 p_commit IN VARCHAR2 := Fnd_Api.G_FALSE,
10380 p_validation_level IN NUMBER := Fnd_Api.G_VALID_LEVEL_FULL,
10381 p_module_type IN VARCHAR2 := NULL,
10382 p_visit_id IN NUMBER,
10383 p_unit_effectivity_id IN NUMBER,
10384 p_release_flag IN VARCHAR2 := 'N',
10385 -- SKPATHAK :: Bug 8343599 :: 14-APR-2009
10386 -- Added an optional parameter to prevent date recalculation
10387 p_recalculate_dates IN VARCHAR2 := 'Y',
10388 --TCHIMIRA::ER 9368251 ::15-JUN-2010 :: Added to include firm-planned flag(1 is Firm and 2 is Planned)as entered by user
10389 p_firm_planned_flag IN NUMBER,
10390 x_workorder_id OUT NOCOPY NUMBER,
10391 x_return_status OUT NOCOPY VARCHAR2,
10392 x_msg_count OUT NOCOPY NUMBER,
10393 x_msg_data OUT NOCOPY VARCHAR2)
10394 IS
10395 --Standard local variables
10396 l_api_name CONSTANT VARCHAR2(30) := 'Release_MR';
10397 l_api_version CONSTANT NUMBER := 1.0;
10398 L_DEBUG_KEY CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
10399 l_msg_data VARCHAR2(2000);
10400 l_return_status VARCHAR2(1);
10401 l_msg_count NUMBER;
10402 l_Error_Tbl_Type Error_Tbl_Type;
10403 l_error_msg VARCHAR2(5000);
10404 l_error_count NUMBER;
10405 l_commit VARCHAR2(1) := 'F';
10406 l_validate_error CONSTANT VARCHAR2(1) := 'V';
10407 l_MR_end_time DATE;
10408 l_visit_end_time DATE;
10409
10410 -- To find visit related information
10411 CURSOR c_visit (x_id IN NUMBER) IS
10412 SELECT * FROM AHL_VISITS_VL
10413 WHERE VISIT_ID = x_id;
10414 c_visit_rec c_visit%ROWTYPE;
10415
10416 CURSOR get_wo(c_visit_id NUMBER, c_unit_effectivity_id NUMBER) IS
10417 SELECT workorder_id
10418 FROM AHL_WORKORDERS
10419 WHERE VISIT_TASK_ID = (select visit_task_id from ahl_visit_tasks_b
10420 where visit_id = c_visit_id
10421 and unit_effectivity_id = c_unit_effectivity_id
10422 AND NVL(status_code, 'Y') <> 'DELETED'
10423 and originating_task_id is null)
10424 AND STATUS_CODE NOT IN ('7', '22');
10425
10426 CURSOR c_get_wo_details(x_visit_id IN NUMBER)
10427 IS
10428 SELECT
10429 scheduled_start_date,
10430 SCHEDULED_COMPLETION_DATE
10431 FROM wip_discrete_jobs
10432 WHERE wip_entity_id =
10433 (
10434 SELECT
10435 wip_entity_id
10436 FROM ahl_workorders
10437 WHERE
10438 master_workorder_flag = 'Y' AND
10439 visit_task_id IS null AND
10440 status_code not in (22,7) and
10441 visit_id=x_visit_id
10442 );
10443 c_get_wo_details_rec c_get_wo_details%ROWTYPE;
10444
10445 -- get end time of the root task for a given UE
10446 CURSOR get_summary_task_times_csr(x_visit_id IN NUMBER, x_unit_effectivity_id IN NUMBER)IS
10447 SELECT max(end_date_time)
10448 FROM ahl_visit_tasks_b VST
10449 where visit_id = x_visit_id
10450 AND NVL(VST.status_code, 'Y') <> 'DELETED'
10451 START WITH unit_effectivity_id = x_unit_effectivity_id
10452 and originating_task_id is null
10453 CONNECT BY originating_task_id = PRIOR visit_task_id;
10454
10455 -- Get all the parent tasks for a given UE that start in a past date
10456 CURSOR get_independent_tasks(x_visit_id IN NUMBER, x_unit_effectivity_id IN NUMBER) IS
10457 select distinct t.visit_task_id
10458 from ahl_visit_tasks_b t,
10459 ahl_visits_b v
10460 where v.visit_id = x_visit_id
10461 and v.visit_id = t.visit_id
10462 --and v.status_code = 'PARTIALLY RELEASED'
10463 and v.status_code IN ('PLANNING', 'PARTIALLY RELEASED') -- PRAKKUM :: BUG Internal :: 19/01/2012 :: Task Time Adjustments
10464 and t.start_date_time < SYSDATE
10465 and t.status_code ='PLANNING'
10466 and t.task_type_code <>'SUMMARY'
10467 -- SKPATHAK :: ER: 9147951 :: 11-JAN-2010 :: Adjust task times only if past task start date is null
10468 and t.past_task_start_date IS NULL
10469 and (not exists (select 1 from ahl_task_links l0
10470 where l0.parent_task_id = t.visit_task_id
10471 or l0.visit_task_id = t.visit_task_id )
10472 or t.visit_task_id in (select l1.parent_task_id from ahl_task_links l1
10473 where not exists (select l2.visit_task_id from ahl_task_links l2
10474 where l2.visit_task_id = l1.parent_task_id)))
10475 /*NR-MR Changes - For SR's created from non-routines have the originating wo as their originating task, hence they are not null.*/
10476 START WITH t.unit_effectivity_id = x_unit_effectivity_id
10477 AND (( t.originating_task_id is null AND 'SR' <> p_module_type)
10478 -- SKPATHAK :: Bug #9410052 :: 25-FEB-2010 :: Removed the condition "originating_task_id is not null"
10479 OR ( 'SR' = p_module_type
10480 and t.service_request_id is not null))
10481 CONNECT BY t.originating_task_id = PRIOR visit_task_id;
10482
10483 --CHANGES by jrotich bug #13028686 begin
10484 CURSOR c_stages_without_types(c_visit_id IN NUMBER, c_unit_effectivity_id IN NUMBER ) IS
10485 SELECT DISTINCT STAGES.STAGE_ID ,
10486 STAGES.STAGE_NAME
10487 FROM AHL_VISIT_TASKS_B TASKS,
10488 AHL_VWP_STAGES_VL STAGES
10489 WHERE
10490 TASKS.VISIT_ID= c_visit_id AND
10491 TASKS.UNIT_EFFECTIVITY_ID = c_unit_effectivity_id AND
10492 STAGES.STAGE_ID=TASKS.STAGE_ID AND
10493 NOT EXISTS (
10494 SELECT STAGE_ID
10495 FROM AHL_VISIT_STAGE_TYP_ASOC
10496 WHERE STAGE_ID=STAGES.STAGE_ID);
10497 l_invalid_stage BOOLEAN;
10498 --CHANGES by jrotich bug #13028686 end
10499
10500 BEGIN
10501
10502 IF (l_log_procedure >= l_log_current_level) THEN
10503 fnd_log.string(l_log_procedure, L_DEBUG_KEY ||'.begin',
10504 'At the start of PL SQL procedure. Visit Id = ' || p_visit_id ||
10505 ', p_recalculate_dates = ' || p_recalculate_dates);
10506 END IF;
10507
10508 -- Standard start of API savepoint
10509 SAVEPOINT Release_MR;
10510
10511 -- Initialize message list if p_init_msg_list is set to TRUE
10512 IF FND_API.To_Boolean( p_init_msg_list) THEN
10513 FND_MSG_PUB.Initialize;
10514 END IF;
10515
10516 -- Initialize API return status to success
10517 x_return_status := FND_API.G_RET_STS_SUCCESS;
10518
10519 -- Standard call to check for call compatibility.
10520 IF NOT FND_API.COMPATIBLE_API_CALL(l_api_version,
10521 p_api_version,
10522 l_api_name,G_PKG_NAME)THEN
10523 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
10524 END IF;
10525
10526 IF (l_log_statement >= l_log_current_level) THEN
10527 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Request for Release_MR Visit ID : ' || p_visit_id);
10528 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Request for Release_MR UE ID : ' || p_unit_effectivity_id);
10529 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Request for Release_MR Release Flag : ' || p_release_flag);
10530 END IF;
10531
10532 -- Check for Required Parameters
10533 IF(p_visit_id IS NULL OR p_visit_id = FND_API.G_MISS_NUM) THEN
10534 FND_MESSAGE.Set_Name(G_PM_PRODUCT_CODE,'AHL_VWP_CST_INPUT_MISS');
10535 FND_MSG_PUB.ADD;
10536 IF (l_log_unexpected >= l_log_current_level)THEN
10537 fnd_log.string(l_log_unexpected,L_DEBUG_KEY,'Visit id is mandatory but found null in input');
10538 END IF;
10539 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
10540 END IF;
10541
10542 IF(p_unit_effectivity_id IS NULL OR p_unit_effectivity_id = FND_API.G_MISS_NUM) THEN
10543 FND_MESSAGE.Set_Name(G_PM_PRODUCT_CODE,'AHL_VWP_UE_INPUT_MISS');
10544 FND_MSG_PUB.ADD;
10545 IF (l_log_unexpected >= l_log_current_level)THEN
10546 fnd_log.string(l_log_unexpected,L_DEBUG_KEY,'Unit Effectivity id is mandatory but found null in input ');
10547 END IF;
10548 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
10549 END IF;
10550
10551 --CHANGES by jrotich bug #13028686 begin
10552 IF (l_log_statement >= l_log_current_level)THEN
10553 fnd_log.string (l_log_statement,L_DEBUG_KEY, 'Validating stage details ');
10554 END IF;
10555
10556 l_invalid_stage :=FALSE;
10557 FOR stage_details_rec in c_stages_without_types(p_visit_id,p_unit_effectivity_id)
10558 LOOP
10559 l_invalid_stage :=TRUE;
10560 IF (l_log_statement >= l_log_current_level) THEN
10561 fnd_log.string(l_log_statement,
10562 L_DEBUG_KEY,
10563 'Stage does not have an associated stage type ' ||
10564 stage_details_rec.stage_name);
10565 END IF;
10566 FND_MESSAGE.SET_NAME('AHL', 'AHL_VWP_NO_STAGE_TYPE');
10567 FND_MESSAGE.SET_TOKEN('STAGE_NAME',stage_details_rec.stage_name);
10568 FND_MSG_PUB.ADD;
10569
10570 END LOOP;
10571
10572 IF(l_invalid_stage=TRUE) THEN
10573 RAISE FND_API.G_EXC_ERROR;
10574 END IF;
10575
10576 --CHANGES by jrotich bug #13028686 END
10577
10578 IF (l_log_statement >= l_log_current_level)THEN
10579 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Before Calling Validate Before Production for visit Id: ' ||p_visit_id);
10580 END IF;
10581
10582 --Valdate before push to production happens
10583 Validate_Before_Production
10584 (p_api_version => l_api_version,
10585 p_init_msg_list => p_init_msg_list,
10586 p_commit => l_commit,
10587 p_validation_level => p_validation_level,
10588 p_module_type => 'MR',
10589 p_visit_id => p_visit_id,
10590 x_error_tbl => l_error_tbl_type,
10591 x_return_status => l_return_status,
10592 x_msg_count => x_msg_count,
10593 x_msg_data => x_msg_data);
10594
10595 IF (l_log_statement >= l_log_current_level)THEN
10596 fnd_log.string(l_log_statement,L_DEBUG_KEY,'After Calling Validate Before Production - l_return_status : '|| l_return_status);
10597 END IF;
10598
10599 IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
10600 -- Check Error Message stack.
10601 x_msg_count := FND_MSG_PUB.count_msg;
10602 IF (l_log_statement >= l_log_current_level)THEN
10603 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Errors from Validate Before Production' || x_msg_count);
10604 END IF;
10605 RAISE Fnd_Api.g_exc_error;
10606 END IF;
10607
10608 IF l_error_tbl_type.COUNT > 0 THEN
10609 x_return_status := l_validate_error;
10610 ELSE
10611 OPEN c_visit (p_visit_id);
10612 FETCH c_visit INTO c_visit_rec;
10613 CLOSE c_visit;
10614 -- Adjust Task Start/End time if visit start date is a past date
10615 -- ER #4552764
10616
10617 --IF c_visit_rec.STATUS_CODE = 'PARTIALLY RELEASED' AND c_visit_rec.start_date_time < SYSDATE THEN
10618 -- PRAKKUM :: BUG Internal :: 19/01/2012 :: Task Time Adjustments
10619 IF ( c_visit_rec.STATUS_CODE = 'PLANNING' OR c_visit_rec.STATUS_CODE = 'PARTIALLY RELEASED' ) AND c_visit_rec.start_date_time < SYSDATE THEN
10620 -- SKPATHAK :: Bug 8343599 :: 14-APR-2009 :: Begin
10621 -- Recalculate the task times only if the user has not entered a start date for the NR
10622 -- If the user has entered a task start date, the callers should pass 'N'
10623 -- for the p_recalculate_dates parameter so that the original dates can be retained
10624 IF (NVL(p_recalculate_dates, 'Y') <> 'N') THEN
10625 FOR l_get_independent_tasks IN get_independent_tasks(c_visit_rec.visit_id,p_unit_effectivity_id)
10626 LOOP
10627 AHL_VWP_TIMES_PVT.adjust_task_times(
10628 p_api_version => 1.0,
10629 p_init_msg_list => Fnd_Api.G_FALSE,
10630 p_commit => Fnd_Api.G_FALSE,
10631 p_validation_level => Fnd_Api.G_VALID_LEVEL_FULL,
10632 x_return_status => l_return_status,
10633 x_msg_count => l_msg_count,
10634 x_msg_data => l_msg_data,
10635 p_task_id => l_get_independent_tasks.visit_task_id,
10636 p_reset_sysdate_flag => FND_API.G_TRUE);
10637 END LOOP;
10638 END IF;
10639 -- SKPATHAK :: Bug 8343599 :: 14-APR-2009 :: End
10640 l_visit_end_time := AHL_VWP_TIMES_PVT.get_visit_end_time(c_visit_rec.visit_id);
10641 IF l_visit_end_time > c_visit_rec.close_date_time THEN
10642 Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_TSK_STDT_ADJU');
10643 Fnd_Message.Set_Token('VISIT_END_DATE', l_visit_end_time);
10644 Fnd_Msg_Pub.ADD;
10645 x_return_status := l_validate_error;
10646 END IF;
10647 END IF;
10648 END IF;
10649
10650 IF x_return_status = FND_API.G_RET_STS_SUCCESS THEN
10651 /* Check visit end date instead
10652 --The MR end date
10653 OPEN get_summary_task_times_csr(p_visit_id, p_unit_effectivity_id);
10654 FETCH get_summary_task_times_csr into l_MR_end_time;
10655 CLOSE get_summary_task_times_csr;
10656 */
10657 l_visit_end_time := AHL_VWP_TIMES_PVT.get_visit_end_time(c_visit_rec.visit_id);
10658
10659 OPEN c_get_wo_details(c_visit_rec.visit_id);
10660 FETCH c_get_wo_details into c_get_wo_details_rec;
10661 -- Validate to check if derived visit end time now exceeds scheduled master work order completion time
10662 -- Note: since we are checking for derived visit end time here, if there are other task in planning
10663 -- status with end date exceeding visit master WO end date, then MR tasks cannot be created
10664 IF TRUNC(l_visit_end_time) > TRUNC(c_get_wo_details_rec.scheduled_completion_date) THEN
10665 x_return_status := l_validate_error;
10666 -- Error Message
10667 Fnd_Message.SET_NAME('AHL','AHL_VWP_DATE_EXCD_WO_DATE');
10668 Fnd_Message.Set_Token('VISIT_END_DATE', l_visit_end_time);
10669 FND_MSG_PUB.ADD;
10670 END IF;
10671 END IF;
10672
10673 IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
10674 -- Per MEL/CDL requirement, if tasks are sucessfully created but fail to be pushed
10675 -- to production, then they will stay in 'PLANNING' status.
10676 IF p_module_type <>'PROD' THEN
10677 -- Check Error Message stack.
10678 x_msg_count := FND_MSG_PUB.count_msg;
10679 IF (l_log_statement >= l_log_current_level)THEN
10680 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Errors from Validate Before Production'|| x_msg_count);
10681 END IF;
10682 RAISE Fnd_Api.g_exc_error;
10683 END IF;
10684 ELSE
10685 IF (l_log_statement >= l_log_current_level)THEN
10686 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Before Calling Push_MR_to_Production for UE Id: ' ||p_unit_effectivity_id);
10687 END IF;
10688
10689 Push_MR_to_Production
10690 (p_api_version => l_api_version,
10691 p_init_msg_list => p_init_msg_list,
10692 p_commit => l_commit,
10693 p_validation_level => p_validation_level,
10694 p_module_type => p_module_type,
10695 p_visit_id => p_visit_id,
10696 p_unit_effectivity_id => p_unit_effectivity_id,
10697 p_release_flag => p_release_flag,
10698 --TCHIMIRA::ER 9368251 ::15-JUN-2010 :: Added to include firm-planned flag(1 is Firm and 2 is Planned)as entered by user
10699 p_firm_planned_flag => p_firm_planned_flag,
10700 x_return_status => l_return_status,
10701 x_msg_count => l_msg_count,
10702 x_msg_data => l_msg_data);
10703
10704 IF (l_log_statement >= l_log_current_level)THEN
10705 fnd_log.string(l_log_statement,L_DEBUG_KEY,'After Calling Push_MR_to_Production - l_return_status : ' ||l_return_status);
10706 END IF;
10707
10708 IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
10709 -- Check Error Message stack.
10710 x_msg_count := FND_MSG_PUB.count_msg;
10711 IF (l_log_statement >= l_log_current_level)THEN
10712 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Errors from Push to Production: ' || x_msg_count);
10713 END IF;
10714 RAISE Fnd_Api.g_exc_error;
10715 END IF;
10716
10717 /*Return root root workorder ID for the given UE*/
10718 OPEN get_wo(p_visit_id, p_unit_effectivity_id);
10719 FETCH get_wo INTO x_workorder_id;
10720 CLOSE get_wo;
10721 END IF;
10722
10723 -- Standard check of p_commit
10724 IF FND_API.TO_BOOLEAN(p_commit) THEN
10725 COMMIT WORK;
10726 END IF;
10727
10728 Fnd_Msg_Pub.count_and_get(
10729 p_encoded => Fnd_Api.g_false,
10730 p_count => x_msg_count,
10731 p_data => x_msg_data);
10732
10733 IF (l_log_procedure >= l_log_current_level)THEN
10734 fnd_log.string(l_log_procedure,L_DEBUG_KEY||'.end','At the end of PLSQL procedure');
10735 END IF;
10736
10737 EXCEPTION
10738 WHEN FND_API.G_EXC_ERROR THEN
10739 x_return_status := FND_API.G_RET_STS_ERROR;
10740 ROLLBACK TO Release_MR;
10741 FND_MSG_PUB.count_and_get( p_count => x_msg_count,
10742 p_data => x_msg_data,
10743 p_encoded => fnd_api.g_false);
10744
10745
10746 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
10747 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
10748 ROLLBACK TO Release_MR;
10749 FND_MSG_PUB.count_and_get( p_count => x_msg_count,
10750 p_data => x_msg_data,
10751 p_encoded => fnd_api.g_false);
10752
10753
10754 WHEN OTHERS THEN
10755 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
10756 ROLLBACK TO Release_MR;
10757 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
10758 fnd_msg_pub.add_exc_msg(p_pkg_name => G_PKG_NAME,
10759 p_procedure_name => 'Release_MR',
10760 p_error_text => SUBSTR(SQLERRM,1,500));
10761 END IF;
10762 FND_MSG_PUB.count_and_get( p_count => x_msg_count,
10763 p_data => x_msg_data,
10764 p_encoded => fnd_api.g_false);
10765
10766 END Release_MR;
10767
10768 --------------------------------------------------------------------
10769 -- PROCEDURE
10770 -- Get_MR_Dependencies
10771 --
10772 -- PURPOSE
10773 -- To get all the Technical Dependencies for the MR.
10774 --------------------------------------------------------------------
10775
10776 PROCEDURE Get_MR_Dependencies
10777 (
10778 p_visit_id IN NUMBER,
10779 p_visit_number IN NUMBER,
10780 p_unit_effectivity_id IN NUMBER,
10781 p_module_type IN VARCHAR2 := Null, /*NR-MR Changes - sowsubra*/
10782 p_x_relationship_tbl IN OUT NOCOPY AHL_PRD_WORKORDER_PVT.prd_workorder_rel_tbl
10783 )
10784 AS
10785
10786 -- Get all the Task Dependencies for the given MR.
10787 CURSOR get_tech_dependencies( c_visit_id NUMBER, c_unit_effectivity_id NUMBER )
10788 IS
10789 SELECT distinct PARENT.visit_task_number parent_task_number,
10790 CHILD.visit_task_number child_task_number
10791 FROM AHL_VISIT_TASKS_B PARENT,
10792 AHL_VISIT_TASKS_B CHILD,
10793 AHL_TASK_LINKS LINK
10794 WHERE PARENT.visit_task_id = LINK.parent_task_id
10795 AND CHILD.visit_task_id = LINK.visit_task_id
10796 AND NVL(PARENT.STATUS_CODE,'X') = 'PLANNING' --Srini Bug #4075702
10797 AND PARENT.visit_id = c_visit_id
10798 AND CHILD.visit_id = c_visit_id
10799 AND PARENT.visit_task_id in (select visit_task_id from ahl_visit_tasks_b
10800 where visit_id = c_visit_id
10801 /*NR-MR Changes - For SR's created from non-routines have the originating wo as their originating task, hence they are not null.*/
10802 START WITH unit_effectivity_id = c_unit_effectivity_id
10803 AND (( originating_task_id is null AND 'SR' <> p_module_type)
10804 -- SKPATHAK :: Bug #9410052 :: 25-FEB-2010
10805 -- Removed the condition "originating_task_id is not null"
10806 OR ( 'SR' = p_module_type
10807 and service_request_id is not null))
10808 CONNECT BY originating_task_id = PRIOR visit_task_id)
10809 AND CHILD.visit_task_id in ( select visit_task_id from ahl_visit_tasks_b
10810 where visit_id = c_visit_id
10811 /*NR-MR Changes - For SR's created from non-routines have the originating wo as their originating task, hence they are not null.*/
10812 START WITH unit_effectivity_id = c_unit_effectivity_id
10813 AND (( originating_task_id is null AND 'SR' <> p_module_type)
10814 -- SKPATHAK :: Bug #9410052 :: 25-FEB-2010
10815 -- Removed the condition "originating_task_id is not null"
10816 OR ( 'SR' = p_module_type
10817 and service_request_id is not null))
10818 CONNECT BY originating_task_id = PRIOR visit_task_id);
10819
10820 l_api_name CONSTANT VARCHAR2(30):= 'Get_MR_Dependencies';
10821 L_DEBUG_KEY CONSTANT VARCHAR2(100):= 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
10822 rel_count NUMBER;
10823
10824 BEGIN
10825
10826 IF (l_log_procedure >= l_log_current_level) THEN
10827 fnd_log.string(l_log_procedure,L_DEBUG_KEY||'.begin','At the start of the procedure');
10828 END IF;
10829
10830 rel_count := p_x_relationship_tbl.COUNT;
10831
10832 IF (l_log_statement >= l_log_current_level) THEN
10833 fnd_log.string(l_log_statement,L_DEBUG_KEY,'rel_count - '||rel_count);
10834 END IF;
10835
10836 -- Get the Technical Dependencies between Visit Tasks for a Visit.
10837 FOR tsk_cursor IN get_tech_dependencies( p_visit_id , p_unit_effectivity_id) LOOP
10838 rel_count := rel_count + 1;
10839 p_x_relationship_tbl(rel_count).batch_id := p_visit_number;
10840 p_x_relationship_tbl(rel_count).parent_header_id := tsk_cursor.parent_task_number;
10841 p_x_relationship_tbl(rel_count).child_header_id := tsk_cursor.child_task_number;
10842 p_x_relationship_tbl(rel_count).relationship_type := 2;
10843 p_x_relationship_tbl(rel_count).dml_operation := 'C';
10844 END LOOP;
10845
10846 IF (l_log_procedure >= l_log_current_level) THEN
10847 fnd_log.string(l_log_procedure,L_DEBUG_KEY,'Total Relationships : ' || p_x_relationship_tbl.COUNT);
10848 fnd_log.string(l_log_procedure,L_DEBUG_KEY||'.end','At the end of procedure');
10849 END IF;
10850
10851 END Get_MR_Dependencies;
10852
10853 --------------------------------------------------------------------
10854 -- PROCEDURE
10855 -- Get_MR_Relationships
10856 --
10857 -- PURPOSE
10858 -- To get all the Relationships for the MR. These include :
10859 -- 1.A record for Each MR to MR / Visit Relationship.
10860 -- 2.A record for Each Visit Task to MR Relationship.
10861 --------------------------------------------------------------------
10862
10863 PROCEDURE Get_MR_Relationships
10864 (
10865 p_visit_id IN NUMBER,
10866 p_visit_number IN NUMBER,
10867 p_unit_effectivity_id IN NUMBER,
10868 p_module_type IN VARCHAR2 := Null, /*NR-MR Changes - sowsubra*/
10869 p_x_relationship_tbl IN OUT NOCOPY AHL_PRD_WORKORDER_PVT.prd_workorder_rel_tbl
10870 )
10871 AS
10872 -- Get all the MR tasks associated to the given UE.
10873 /*NR-MR Changes - sowsubra - modified the cursor to fetch the sr_id, mr_id and task type*/
10874 CURSOR get_mrs_for_UE( c_visit_id NUMBER , c_unit_effectivity_id NUMBER)
10875 IS
10876 SELECT distinct visit_task_id,
10877 visit_task_number,
10878 task_type_code,
10879 service_request_id,
10880 mr_id,
10881 NVL(originating_task_id, -1)
10882 FROM AHL_VISIT_TASKS_B
10883 WHERE visit_id = c_visit_id
10884 AND task_type_code='SUMMARY'
10885 -- SKPATHAK :: Bug 9444849 :: 19-MAR-2010
10886 -- This condition is not needed, since after opening this cursor we have a check if the visit task id fetched by this cursor
10887 -- already has a corresponding WO. So only for tasks in planning we are building the relationships
10888 -- Also it is necessary to remove this condition to fix the bug 9444849, since the parent task can be implemented as well
10889 -- AND NVL(STATUS_CODE, 'X') = 'PLANNING'
10890 /*NR-MR Changes - For SR's created from non-routines have the originating wo as their originating task, hence they are not null.*/
10891 START WITH unit_effectivity_id = c_unit_effectivity_id
10892 AND (( originating_task_id is null AND 'SR' <> p_module_type)
10893 -- SKPATHAK :: Bug #9410052 :: 25-FEB-2010 :: Removed the condition "originating_task_id is not null"
10894 OR ( 'SR' = p_module_type
10895 and service_request_id is not null))
10896 CONNECT BY originating_task_id = PRIOR visit_task_id
10897 order by 2;
10898
10899 TYPE mr_task_rec_type IS RECORD
10900 (
10901 visit_task_id NUMBER,
10902 visit_task_number NUMBER,
10903 /*NR-MR Changes - sowsubra - begin*/
10904 task_type_code VARCHAR2(30),
10905 service_request_id NUMBER,
10906 mr_id NUMBER,
10907 /*NR-MR Changes - sowsubra - end*/
10908 originating_task_id NUMBER
10909 );
10910
10911 TYPE mr_task_tbl_type IS TABLE OF mr_task_rec_type INDEX BY BINARY_INTEGER;
10912
10913 l_mrs_for_UE mr_task_tbl_type;
10914
10915 -- Get all the Tasks associated to a MR.
10916 CURSOR get_tasks_for_mr( c_visit_id NUMBER, c_mr_task_id NUMBER )
10917 IS
10918 SELECT visit_task_number, visit_task_id
10919 FROM AHL_VISIT_TASKS_B
10920 WHERE visit_id = c_visit_id
10921 AND originating_task_id = c_mr_task_id
10922 AND task_type_code <> 'SUMMARY'
10923 AND NVL(STATUS_CODE, 'X') = 'PLANNING';
10924
10925 CURSOR get_wo(c_visit_task_id NUMBER)
10926 IS
10927 SELECT wip_entity_id
10928 FROM AHL_WORKORDERS
10929 WHERE VISIT_TASK_ID = c_visit_task_id
10930 -- SKPATHAK :: Bug 9940275 :: 18-AUG-2010 :: Removed status '7' from below condtn
10931 -- This cursor is used to check if a visit task has a corresponding WO and if not, WO relationship needs to be created
10932 -- So even if the status is 7 (cancelled), cursor must fetch the result, since relationship need not be created in this case
10933 AND STATUS_CODE <> '22';
10934
10935 CURSOR get_parent_wo(c_visit_task_id NUMBER)
10936 IS
10937 SELECT wip_entity_id
10938 FROM AHL_WORKORDERS
10939 WHERE VISIT_TASK_ID = c_visit_task_id
10940 AND STATUS_CODE NOT IN ('7', '22');
10941
10942 CURSOR get_mwo(c_visit_id NUMBER)
10943 IS
10944 SELECT wip_entity_id
10945 FROM AHL_WORKORDERS
10946 WHERE visit_id = c_visit_id
10947 AND VISIT_TASK_ID IS NULL
10948 AND MASTER_WORKORDER_FLAG = 'Y'
10949 AND STATUS_CODE NOT IN ('7', '22');
10950
10951 l_api_name CONSTANT VARCHAR2(30):= 'Get_MR_Relationships';
10952 L_DEBUG_KEY CONSTANT VARCHAR2(100):= 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
10953
10954 l_wip_entity_id NUMBER;
10955 l_parent_wip_entity_id NUMBER;
10956 /*NR-MR Changes - sowsubra - begin*/
10957 l_parent_wo_id NUMBER := 0;
10958 /*NR-MR Changes - sowsubra - end*/
10959
10960 rel_count NUMBER := 0;
10961 mr_count NUMBER := 0;
10962
10963 BEGIN
10964
10965 IF (l_log_procedure >= l_log_current_level) THEN
10966 fnd_log.string(l_log_procedure,L_DEBUG_KEY||'.begin','At the start of the procedure');
10967 END IF;
10968
10969 rel_count := p_x_relationship_tbl.COUNT;
10970
10971 IF (l_log_statement >= l_log_current_level) THEN
10972 fnd_log.string(l_log_statement,L_DEBUG_KEY,'rel_count - '||rel_count);
10973 END IF;
10974
10975 -- Get all the Task Records corresponding to a MR for the given UE.
10976 OPEN get_mrs_for_UE( p_visit_id, p_unit_effectivity_id );
10977 LOOP
10978 EXIT WHEN get_mrs_for_UE%NOTFOUND;
10979 mr_count := mr_count + 1;
10980 FETCH get_mrs_for_UE
10981 INTO l_mrs_for_UE(mr_count).visit_task_id,
10982 l_mrs_for_UE(mr_count).visit_task_number,
10983 /*NR-MR Changes - sowsubra - begin*/
10984 l_mrs_for_UE(mr_count).task_type_code,
10985 l_mrs_for_UE(mr_count).service_request_id,
10986 l_mrs_for_UE(mr_count).mr_id,
10987 /*NR-MR Changes - sowsubra - end*/
10988 l_mrs_for_UE(mr_count).originating_task_id;
10989 END LOOP;
10990 CLOSE get_mrs_for_UE;
10991
10992 IF (l_log_statement >= l_log_current_level) THEN
10993 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Total MRs for Visit : ' || l_mrs_for_UE.COUNT);
10994 END IF;
10995
10996 OPEN get_mwo(p_visit_id);
10997 FETCH get_mwo INTO l_parent_wip_entity_id;
10998 CLOSE get_mwo;
10999
11000 IF ( l_mrs_for_UE.COUNT > 0 ) THEN
11001 FOR i IN l_mrs_for_UE.FIRST..l_mrs_for_UE.LAST LOOP
11002 -- if the visit task already has a workorder then do not
11003 -- create a relationship for it
11004 OPEN get_wo(l_mrs_for_UE(i).visit_task_id);
11005 FETCH get_wo INTO l_wip_entity_id;
11006 IF get_wo%NOTFOUND THEN
11007 rel_count := rel_count + 1;
11008 p_x_relationship_tbl(rel_count).batch_id := p_visit_number;
11009 p_x_relationship_tbl(rel_count).child_header_id := l_mrs_for_UE(i).visit_task_number;
11010 p_x_relationship_tbl(rel_count).relationship_type := 1;
11011 p_x_relationship_tbl(rel_count).dml_operation := 'C';
11012
11013 -- Loop to Find out Parent MRs
11014 IF ( l_mrs_for_UE(i).originating_task_id <> -1 ) THEN
11015 /*NR-MR Changes - sowsubra - begin*/
11016 /*MWO created for the SR Summary task should be child of visit MWO only.
11017 Hence the parent of the SR Summary task created from production will be visit.*/
11018 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
11019 /*OPEN get_mwo(p_visit_id);
11020 FETCH get_mwo INTO l_parent_wip_entity_id;
11021 CLOSE get_mwo;*/
11022 p_x_relationship_tbl(rel_count).parent_wip_entity_id := l_parent_wip_entity_id;
11023 p_x_relationship_tbl(rel_count).parent_header_id := 0;
11024 ELSE
11025 /*NR-MR Changes - sowsubra - end*/
11026 FOR j IN l_mrs_for_UE.FIRST..l_mrs_for_UE.LAST LOOP
11027 IF ( l_mrs_for_UE(i).originating_task_id = l_mrs_for_UE(j).visit_task_id ) THEN
11028 p_x_relationship_tbl(rel_count).parent_header_id := l_mrs_for_UE(j).visit_task_number;
11029 OPEN get_parent_wo(l_mrs_for_UE(j).visit_task_id);
11030 FETCH get_parent_wo INTO l_parent_wo_id;
11031 IF get_parent_wo%FOUND THEN
11032 p_x_relationship_tbl(rel_count).parent_wip_entity_id := l_parent_wo_id;
11033 END IF;
11034 CLOSE get_parent_wo;
11035 EXIT;
11036 END IF;
11037 END LOOP;
11038 END IF; /*NR-MR Changes - sowsubra*/
11039 END IF;
11040
11041 -- If no Parent MR is found set the parent as the Visit
11042 IF ( p_x_relationship_tbl(rel_count).parent_header_id IS NULL ) THEN
11043 p_x_relationship_tbl(rel_count).parent_header_id := 0;
11044 /*OPEN get_mwo(p_visit_id);
11045 FETCH get_mwo INTO l_parent_wip_entity_id;
11046 IF get_mwo%FOUND THEN*/
11047 p_x_relationship_tbl(rel_count).parent_wip_entity_id := l_parent_wip_entity_id;
11048 /*END IF;
11049 CLOSE get_mwo;*/
11050 END IF;
11051 END IF;
11052 CLOSE get_wo;
11053
11054 IF (l_log_statement >= l_log_current_level) THEN
11055 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Total MRs for Visit : ' || l_mrs_for_UE.COUNT);
11056 END IF;
11057 END LOOP;
11058 END IF;
11059
11060 IF (l_log_statement >= l_log_current_level) THEN
11061 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Getting Tasks for MRs');
11062 END IF;
11063 -- Get all the Tasks for a MR.
11064 IF ( l_mrs_for_UE.COUNT > 0 ) THEN
11065 FOR i IN l_mrs_for_UE.FIRST..l_mrs_for_UE.LAST
11066 LOOP
11067 FOR mr_tasks_cursor IN get_tasks_for_mr( p_visit_id, l_mrs_for_UE(i).visit_task_id )
11068 LOOP
11069 OPEN get_wo(mr_tasks_cursor.visit_task_id);
11070 FETCH get_wo INTO l_wip_entity_id;
11071 IF get_wo%NOTFOUND THEN
11072 rel_count := rel_count + 1;
11073 p_x_relationship_tbl(rel_count).batch_id := p_visit_number;
11074 p_x_relationship_tbl(rel_count).parent_header_id := l_mrs_for_UE(i).visit_task_number;
11075 p_x_relationship_tbl(rel_count).child_header_id := mr_tasks_cursor.visit_task_number;
11076 p_x_relationship_tbl(rel_count).relationship_type := 1;
11077 p_x_relationship_tbl(rel_count).dml_operation := 'C';
11078
11079 -- if this visit task is already in shop floor then get the wip_entity_id
11080 OPEN get_parent_wo(l_mrs_for_UE(i).visit_task_id);
11081 FETCH get_parent_wo INTO l_parent_wip_entity_id;
11082 IF get_parent_wo%FOUND THEN
11083 p_x_relationship_tbl(rel_count).parent_wip_entity_id := l_parent_wip_entity_id;
11084 END IF;
11085 CLOSE get_parent_wo;
11086 END IF;
11087 CLOSE get_wo;
11088 END LOOP;
11089 END LOOP;
11090 END IF;
11091
11092 IF (l_log_procedure >= l_log_current_level) THEN
11093 fnd_log.string(l_log_procedure,L_DEBUG_KEY,'Total Relationships : ' || p_x_relationship_tbl.COUNT );
11094 fnd_log.string(l_log_procedure,L_DEBUG_KEY||'.end','At the end of the procedure');
11095 END IF;
11096
11097 END Get_MR_Relationships;
11098
11099 --------------------------------------------------------------------
11100 -- PROCEDURE
11101 -- Push_MR_to_Production
11102 --
11103 -- PURPOSE
11104 -- To push MR along with all its tasks to Production
11105 --------------------------------------------------------------------
11106 PROCEDURE Push_MR_to_Production
11107 ( p_api_version IN NUMBER,
11108 p_init_msg_list IN VARCHAR2 := Fnd_Api.g_false,
11109 p_commit IN VARCHAR2 := Fnd_Api.g_false,
11110 p_validation_level IN NUMBER := Fnd_Api.g_valid_level_full,
11111 p_module_type IN VARCHAR2 := Null,
11112 p_visit_id IN NUMBER,
11113 p_unit_effectivity_id IN NUMBER,
11114 p_release_flag IN VARCHAR2 := 'N',
11115 --TCHIMIRA::ER 9368251 ::15-JUN-2010 :: Added to include firm-planned flag(1 is Firm and 2 is Planned)as entered by user
11116 p_firm_planned_flag IN NUMBER,
11117 x_return_status OUT NOCOPY VARCHAR2,
11118 x_msg_count OUT NOCOPY NUMBER,
11119 x_msg_data OUT NOCOPY VARCHAR2
11120 )
11121 IS
11122 L_API_VERSION CONSTANT NUMBER := 1.0;
11123 L_API_NAME CONSTANT VARCHAR2(30) := 'Push_MR_to_Production';
11124 L_DEBUG_KEY CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
11125 l_prd_workorder_tbl AHL_PRD_WORKORDER_PVT.PRD_WORKORDER_TBL;
11126 l_prd_workorder_rel_tbl AHL_PRD_WORKORDER_PVT.PRD_WORKORDER_REL_TBL;
11127 --commented by tchimira to honor the firm_planned_flag entered by the user for the ER 9368251
11128 -- VWPE - tchimira.Uncommented the below to put the passed firm_planned_flag in local variable
11129 -- which may be over written based on visit firmed_flag or past_dated_flag
11130 l_firm_planned_flag VARCHAR2(1) := p_firm_planned_flag;
11131 l_return_status VARCHAR2(1);
11132 l_msg_count NUMBER;
11133 l_msg_data VARCHAR2(2000);
11134 l_init_msg_list VARCHAR2(1) := 'F';
11135 l_commit VARCHAR2(1) := 'F';
11136 idx NUMBER;
11137 l_count NUMBER;
11138 l_route_id NUMBER;
11139 l_visit_end_time DATE;
11140 l_dummy VARCHAR2(1);
11141 -- SKPATHAK :: Bug 9827320 :: 13-JUL-2010 :: Reverted back the changes done for bug 9827320
11142 --l_temp_msg_count NUMBER:=0; -- Added by skpathak for bug #9445455 fix
11143
11144 -- To find visit related information
11145 CURSOR c_visit (x_visit_id IN NUMBER) IS
11146 SELECT * FROM AHL_VISITS_VL
11147 WHERE VISIT_ID = x_visit_id;
11148
11149 c_visit_rec c_visit%ROWTYPE;
11150
11151 -- To get all the tasks for the given UE
11152 CURSOR c_task (x_visit_id IN NUMBER, x_unit_effectivity_id IN NUMBER) IS
11153 -- SKPATHAK :: Bug 8340436 :: 23-MAR-2009
11154 -- Fetch distinct rows to avoid duplicates
11155 -- Select individual cols instead of *
11156 --SELECT * FROM AHL_VISIT_TASKS_VL
11157 SELECT distinct visit_task_id, originating_task_id, visit_id, unit_effectivity_id,
11158 status_code, service_request_id, project_task_id, visit_task_number,
11159 visit_task_name, description, object_version_number, task_type_code,
11160 inventory_item_id, instance_id, mr_route_id, department_id, start_date_time,
11161 end_date_time, past_task_start_date -- SKPATHAK :: ER: 9147951 :: 11-JAN-2010 :: Fetch past date too
11162 FROM AHL_VISIT_TASKS_VL
11163 WHERE VISIT_ID = x_visit_id
11164 AND NVL( STATUS_CODE, 'X' ) = 'PLANNING'
11165 /*NR-MR Changes*/
11166 START WITH unit_effectivity_id = x_unit_effectivity_id
11167 AND (( originating_task_id is null AND 'SR' <> p_module_type)
11168 -- SKPATHAK :: Bug #9410052 :: 25-FEB-2010 :: Removed the condition "originating_task_id is not null"
11169 OR ( 'SR' = p_module_type
11170 and service_request_id is not null))
11171 CONNECT BY originating_task_id = PRIOR visit_task_id;
11172
11173 c_task_rec c_task%ROWTYPE;
11174
11175 -- To get the count of all the tasks for the given UE
11176 CURSOR c_task_ct (x_visit_id IN NUMBER, x_unit_effectivity_id IN NUMBER) IS
11177 -- SKPATHAK :: Bug 8340436 :: 23-MAR-2009
11178 -- Fetch distinct rows to avoid duplicates and select visit_task_id instead of *
11179 --SELECT count(*) FROM AHL_VISIT_TASKS_B
11180 SELECT count(distinct visit_task_id) FROM AHL_VISIT_TASKS_B
11181 WHERE VISIT_ID = x_visit_id
11182 AND NVL( STATUS_CODE, 'X' ) = 'PLANNING'
11183 /*NR-MR Changes*/
11184 START WITH unit_effectivity_id = x_unit_effectivity_id
11185 AND (( originating_task_id is null AND 'SR' <> p_module_type)
11186 -- SKPATHAK :: Bug #9410052 :: 25-FEB-2010 :: Removed the condition "originating_task_id is not null"
11187 OR ( 'SR' = p_module_type
11188 and service_request_id is not null))
11189 CONNECT BY originating_task_id = PRIOR visit_task_id;
11190
11191 -- To find Route Id from MR Routes view
11192 CURSOR c_route (x_id IN NUMBER) IS
11193 SELECT Route_Id FROM AHL_MR_ROUTES_V
11194 WHERE MR_ROUTE_ID = x_id;
11195
11196 --To get summary task start, end time
11197 CURSOR get_summary_task_times_csr(x_task_id IN NUMBER)IS
11198 SELECT min(start_date_time), max(end_date_time)
11199 --TCHIMIRA::19-FEB-2010::BUG 9384614
11200 -- Use the base table instead of the vl view
11201 FROM ahl_visit_tasks_b VST
11202 START WITH visit_task_id = x_task_id
11203 AND NVL(VST.status_code, 'Y') <> 'DELETED'
11204 CONNECT BY originating_task_id = PRIOR visit_task_id;
11205
11206 CURSOR c_visit_task_exists(x_visit_id IN NUMBER)
11207 IS
11208 SELECT 'x'
11209 FROM ahl_visit_tasks_b
11210 WHERE visit_id = x_visit_id
11211 AND STATUS_CODE = 'PLANNING'
11212 -- SKPATHAK :: Bug 13930098 :: 20-APR-2012 :: Do NOT consider the default stage task
11213 AND (TASK_TYPE_CODE <> 'STAGE'
11214 OR (STAGE_ID IS NOT NULL AND TASK_TYPE_CODE = 'STAGE'));
11215
11216 CURSOR c_get_wo_details(x_visit_id IN NUMBER)
11217 IS
11218 SELECT
11219 scheduled_start_date,
11220 SCHEDULED_COMPLETION_DATE
11221 FROM wip_discrete_jobs
11222 WHERE wip_entity_id =
11223 (
11224 SELECT
11225 wip_entity_id
11226 FROM ahl_workorders
11227 WHERE
11228 master_workorder_flag = 'Y' AND
11229 visit_task_id IS null AND
11230 status_code not in (22,7) and
11231 visit_id=x_visit_id
11232 );
11233
11234 c_get_wo_details_rec c_get_wo_details%ROWTYPE;
11235 l_curr_task_id NUMBER := 0;
11236
11237 -- SATHAPLI::Bug 5758813, 04-Jun-2008
11238 -- Cursor to get the required format for the workorder description, given a visit task.
11239 CURSOR get_wo_dtls_for_mrtasks_cur (c_visit_task_id IN NUMBER) IS
11240 --TCHIMIRA::Bug 9149770 ::09-FEB-2010
11241 --use substrb and lengthb instead of substr and length respectively
11242 SELECT ar.route_no||'.'||SUBSTRB(ar.title, 1, (240 - (LENGTHB(ar.route_no) + 1))) workorder_description
11243 FROM ahl_routes_vl ar, ahl_visit_tasks_b avt,
11244 ahl_mr_routes mrr
11245 WHERE avt.visit_task_id = c_visit_task_id
11246 AND NVL(avt.status_code, 'X') = 'PLANNING'
11247 AND avt.mr_route_id = mrr.mr_route_id
11248 AND mrr.route_id = ar.route_id;
11249
11250 l_get_wo_dtls_rec get_wo_dtls_for_mrtasks_cur%ROWTYPE;
11251
11252 --PRAKKUM :: PIE :: 13-OCT-2010 :: Added this cursor
11253 -- To find visit master workorder details
11254 CURSOR get_visit_mwo_details_csr (c_visit_id IN NUMBER) IS
11255 SELECT wo.workorder_id, wo.object_version_number, wo.status_code,
11256 WIP.SCHEDULED_START_DATE,
11257 WIP.SCHEDULED_COMPLETION_DATE
11258 FROM AHL_WORKORDERS WO,
11259 WIP_DISCRETE_JOBS WIP
11260 WHERE wo.VISIT_ID = c_visit_id
11261 AND wo.VISIT_TASK_ID IS NULL
11262 AND wo.MASTER_WORKORDER_FLAG = 'Y'
11263 AND WIP.WIP_ENTITY_ID = WO.WIP_ENTITY_ID
11264 AND wo.STATUS_CODE not in ('22','7'); --(22-Deleted, 7-Cancelled)
11265
11266 get_visit_mwo_details_rec get_visit_mwo_details_csr%ROWTYPE;
11267
11268 -- MANESING::Bug 13713141, 16-Apr-2012, added following cursors
11269 -- Cursor to find out the Repair Batch for the given task
11270 CURSOR get_rpr_batch_for_task_csr (c_visit_task_id NUMBER) IS
11271 SELECT repair_batch_name
11272 FROM AHL_VISIT_TASKS_B
11273 WHERE cost_parent_id IS NULL
11274 START WITH visit_task_id = c_visit_task_id
11275 CONNECT BY visit_task_id = Prior cost_parent_id;
11276
11277 -- Cursor to check if Repair Batch has planned tasks
11278 CURSOR chk_rpr_batch_has_planed_tasks (c_repair_batch_name VARCHAR2) IS
11279 SELECT 'X'
11280 FROM AHL_VISIT_TASKS_B
11281 WHERE cost_parent_id IS NOT NULL -- to filter repair batch task
11282 AND status_code = 'PLANNING'
11283 START WITH repair_batch_name = c_repair_batch_name
11284 CONNECT BY cost_parent_id = Prior visit_task_id;
11285
11286 l_visit_task_for_rpr_calc NUMBER;
11287 l_repair_batch_name VARCHAR2(240);
11288
11289 BEGIN
11290 --------------------- initialize -----------------------
11291
11292 SAVEPOINT Push_MR_to_Production;
11293
11294 IF (l_log_procedure >= l_log_current_level) THEN
11295 fnd_log.string(l_log_procedure,L_DEBUG_KEY||'.begin','At the begin of the procedure');
11296 END IF;
11297
11298 -- Initialize message list if p_init_msg_list is set to TRUE.
11299 IF Fnd_Api.to_boolean(p_init_msg_list) THEN
11300 Fnd_Msg_Pub.initialize;
11301 END IF;
11302
11303 -- Initialize API return status to success
11304 x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
11305
11306 -- Standard call to check for call compatibility.
11307 IF NOT Fnd_Api.COMPATIBLE_API_CALL(l_api_version,
11308 p_api_version,
11309 l_api_name,G_PKG_NAME) THEN
11310 RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
11311 END IF;
11312
11313 IF (l_log_statement >= l_log_current_level) THEN
11314 fnd_log.string(l_log_statement,L_DEBUG_KEY,'p_unit_effectivity_id : '||p_unit_effectivity_id||'Visit Id : ' || p_visit_id);
11315 END IF;
11316
11317 -- SKPATHAK :: Bug 9827320 :: 13-JUL-2010 :: Reverted back the changes done for bug 9827320
11318 /*
11319 -- SKPATHAK :: Bug 9445455 :: 08-MAR-2010 :: START
11320 l_temp_msg_count := Fnd_Msg_Pub.count_msg;
11321
11322 IF (l_log_statement >= l_log_current_level) THEN
11323 fnd_log.string(l_log_statement,
11324 L_DEBUG_KEY,
11325 'Before calling VALIDATE_MR_ROUTE_DATE. l_msg_count = ' || l_msg_count);
11326 END IF;
11327
11328 OPEN c_task(p_visit_id, p_unit_effectivity_id);
11329 LOOP
11330 FETCH c_task INTO c_task_rec;
11331 EXIT WHEN c_task%NOTFOUND;
11332 Validate_MR_Route_Date
11333 (
11334 p_mr_route_id => c_task_rec.mr_route_id,
11335 p_visit_task_number => c_task_rec.visit_task_number,
11336 p_start_date_time => c_task_rec.start_date_time,
11337 p_end_date_time => c_task_rec.end_date_time
11338 );
11339
11340 IF (l_log_statement >= l_log_current_level) THEN
11341 fnd_log.string(l_log_statement,
11342 L_DEBUG_KEY,
11343 'After calling VALIDATE_MR_ROUTE_DATE for task Id: ' ||
11344 c_task_rec.visit_task_id ||', l_msg_count = ' || l_msg_count);
11345 END IF;
11346
11347 END LOOP;
11348 CLOSE c_task;
11349
11350 l_msg_count := Fnd_Msg_Pub.count_msg;
11351 IF (l_msg_count <> l_temp_msg_count) THEN
11352 IF (l_log_statement >= l_log_current_level) THEN
11353 fnd_log.string(l_log_statement,
11354 L_DEBUG_KEY,
11355 'Errors from VALIDATE_MR_ROUTE_DATE. Message count: ' || l_msg_count);
11356 END IF;
11357 RAISE FND_API.G_EXC_ERROR;
11358 END IF;
11359 -- SKPATHAK :: Bug 9445455 :: 08-MAR-2010 :: END
11360 */
11361
11362 --Create project tasks for the given MR
11363 IF (l_log_statement >= l_log_current_level) THEN
11364 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Before calling Add_MR_to_Projects');
11365 END IF;
11366
11367 Add_MR_to_Project
11368 (p_api_version => l_api_version,
11369 p_init_msg_list => p_init_msg_list,
11370 p_commit => l_commit,
11371 p_validation_level => p_validation_level,
11372 p_module_type => p_module_type,
11373 p_visit_id => p_visit_id,
11374 p_unit_effectivity_id => p_unit_effectivity_id,
11375 x_return_status => l_return_status,
11376 x_msg_count => l_msg_count,
11377 x_msg_data => x_msg_data);
11378
11379 IF (l_log_statement >= l_log_current_level) THEN
11380 fnd_log.string(l_log_statement,L_DEBUG_KEY,'After calling Add_MR_to_Projects - l_return_status : '||l_return_status);
11381 END IF;
11382
11383 IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
11384 -- Check Error Message stack.
11385 x_msg_count := FND_MSG_PUB.count_msg;
11386 RAISE Fnd_Api.g_exc_error;
11387 END IF;
11388
11389 OPEN c_visit (p_visit_id);
11390 FETCH c_visit INTO c_visit_rec;
11391 CLOSE c_visit;
11392
11393 -- Create Workorders for MR tasks
11394 OPEN c_task_ct(p_visit_id, p_unit_effectivity_id);
11395 FETCH c_task_ct INTO l_count;
11396 CLOSE c_task_ct;
11397
11398 IF (l_log_statement >= l_log_current_level) THEN
11399 fnd_log.string(l_log_statement,L_DEBUG_KEY, 'Task Count: ' || l_count);
11400 END IF;
11401
11402 --VWPE :: tchimira :: 15-FEB -2011 :: start
11403 IF (l_log_statement >= l_log_current_level) THEN
11404 fnd_log.string(l_log_statement,
11405 L_DEBUG_KEY,
11406 'Past Dated Flag value is : ' || c_visit_rec.PAST_DATED_VISIT_FLAG);
11407 END IF;
11408
11409 --Now if the value of the PAST_DATED_VISIT_FLAG is Y which means it is past dated visit.
11410 -- Create WOs as firm so that they will not be considered by PS schedule engine.
11411 IF(c_visit_rec.PAST_DATED_VISIT_FLAG = 'Y') THEN
11412 l_firm_planned_flag := 1; --Firm
11413 END IF;
11414 --VWPE :: tchimira :: 15-FEB -2011 :: end
11415
11416 -- PRAKKUM :: PIE :: 13-OCT-2010 :: START
11417 -- Get Master WO details
11418 OPEN get_visit_mwo_details_csr(p_visit_id);
11419 FETCH get_visit_mwo_details_csr INTO get_visit_mwo_details_rec;
11420 CLOSE get_visit_mwo_details_csr;
11421
11422
11423 idx := 1;
11424 l_prd_workorder_tbl(idx).SCHEDULED_START_DATE := get_visit_mwo_details_rec.SCHEDULED_START_DATE;
11425 l_prd_workorder_tbl(idx).SCHEDULED_END_DATE := get_visit_mwo_details_rec.SCHEDULED_COMPLETION_DATE;
11426 l_prd_workorder_tbl(idx).BATCH_ID := c_visit_rec.VISIT_NUMBER;
11427 l_prd_workorder_tbl(idx).HEADER_ID := 0; -- Visit
11428 l_prd_workorder_tbl(idx).DML_OPERATION := 'U';
11429 l_prd_workorder_tbl(idx).WORKORDER_ID := get_visit_mwo_details_rec.WORKORDER_ID;
11430 l_prd_workorder_tbl(idx).OBJECT_VERSION_NUMBER := get_visit_mwo_details_rec.OBJECT_VERSION_NUMBER;
11431 l_prd_workorder_tbl(idx).status_code := get_visit_mwo_details_rec.STATUS_CODE;
11432 l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG := 1; -- Firm
11433
11434 --SKPATHAK :: PIE :: 14-SEP-2009 :: END
11435
11436 IF l_count > 0 THEN
11437 idx := 0;
11438 OPEN c_task(p_visit_id, p_unit_effectivity_id);
11439 FETCH c_task INTO c_task_rec;
11440 WHILE c_task%FOUND LOOP
11441 IF (l_curr_task_id <> c_task_rec.visit_task_id) THEN
11442 idx := idx+1;
11443 l_prd_workorder_tbl(idx).DML_OPERATION := 'C';
11444 IF p_release_flag = 'Y' THEN
11445 l_prd_workorder_tbl(idx).STATUS_CODE := '3'; -- Released
11446 ELSE
11447 l_prd_workorder_tbl(idx).STATUS_CODE := '1'; -- Unreleased
11448 END IF;
11449
11450 --commented by tchimira to honor the firm_planned_flag entered by the user for the ER 9368251
11451 /*IF ( l_firm_planned_flag IS NOT NULL AND
11452 -- SKPATHAK :: ER: 9147951 :: 11-JAN-2010
11453 -- For task with past task dates, WOs are always firm irrespective of the profile value
11454 -- Also for the NRs which have user entered past dates, WOs should always be firm
11455 -- SKPATHAK :: 26-FEB-2010
11456 -- Reverted back the changes for making past dated NR WOs as firmed
11457 c_task_rec.past_task_start_date IS NULL AND
11458 l_firm_planned_flag = '2' ) THEN
11459 l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG := 2; -- Planned
11460 ELSE
11461 l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG := 1; -- Firm
11462 END IF; */
11463 --TCHIMIRA::ER 9368251 ::15-JUN-2010 :: Added to include firm-planned flag(1 is Firm and 2 is Planned)as entered by user
11464 -- If the passed firm flag is null get the value from profile.
11465 IF( l_firm_planned_flag IS NULL ) THEN
11466 l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG := NVL(FND_PROFILE.value( 'AHL_PRD_FIRM_PLANNED_FLAG'), 1);
11467 ELSE
11468 l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG := l_firm_planned_flag;
11469 END IF;
11470
11471 IF ( c_task_rec.task_type_code = 'SUMMARY' ) THEN
11472 l_prd_workorder_tbl(idx).MASTER_WORKORDER_FLAG := 'Y';
11473 ELSE
11474 l_prd_workorder_tbl(idx).MASTER_WORKORDER_FLAG := 'N';
11475 END IF;
11476
11477 l_prd_workorder_tbl(idx).BATCH_ID := c_visit_rec.visit_number;
11478 l_prd_workorder_tbl(idx).HEADER_ID := c_task_rec.visit_task_number;
11479 l_prd_workorder_tbl(idx).VISIT_ID := p_visit_id;
11480 l_prd_workorder_tbl(idx).ORGANIZATION_ID := c_visit_rec.organization_id;
11481 l_prd_workorder_tbl(idx).INVENTORY_ITEM_ID := c_task_rec.inventory_item_id ;
11482 l_prd_workorder_tbl(idx).ITEM_INSTANCE_ID := c_task_rec.instance_id ;
11483 l_prd_workorder_tbl(idx).VISIT_TASK_ID := c_task_rec.visit_task_id ;
11484 l_prd_workorder_tbl(idx).VISIT_TASK_NUMBER := c_task_rec.visit_task_number ;
11485 -- PRAKKUM :: PIE :: 13-OCT-2010
11486 -- Pass the Project Task Id only for work orders that don't correspond to Summary Tasks
11487 IF ( c_task_rec.task_type_code <> 'SUMMARY' ) THEN
11488 l_prd_workorder_tbl(idx).PROJECT_TASK_ID := c_task_rec.project_task_id ;
11489 l_prd_workorder_tbl(idx).PROJECT_ID := c_visit_rec.project_id;
11490 END IF;
11491
11492 -- SATHAPLI::Bug 5758813, 04-Jun-2008, fix start
11493 -- For planned (route) tasks, set the workorder description with the required format.
11494 -- l_prd_workorder_tbl(idx).JOB_DESCRIPTION := c_task_rec.visit_task_name ;
11495 IF (c_task_rec.task_type_code IN ('SUMMARY','UNASSOCIATED')) THEN
11496 l_prd_workorder_tbl(idx).JOB_DESCRIPTION := c_task_rec.visit_task_name;
11497 ELSE
11498 -- Fetch the required format for the workorder description.
11499 OPEN get_wo_dtls_for_mrtasks_cur(c_task_rec.visit_task_id);
11500 FETCH get_wo_dtls_for_mrtasks_cur INTO l_get_wo_dtls_rec;
11501 --salogan added for bug 9754641 begin
11502 IF get_wo_dtls_for_mrtasks_cur%NOTFOUND THEN
11503 l_get_wo_dtls_rec.workorder_description := NULL;
11504 END IF;
11505 --salogan added for bug 9754641 begin
11506 CLOSE get_wo_dtls_for_mrtasks_cur;
11507 l_prd_workorder_tbl(idx).JOB_DESCRIPTION := l_get_wo_dtls_rec.workorder_description;
11508 END IF;
11509 -- SATHAPLI::Bug 5758813, 04-Jun-2008, fix end
11510
11511 IF c_task_rec.mr_route_id IS NOT NULL AND c_task_rec.mr_route_id <> FND_API.g_miss_num THEN
11512 OPEN c_route (c_task_rec.mr_route_id);
11513 FETCH c_route INTO l_route_id;
11514 CLOSE c_route;
11515 l_prd_workorder_tbl(idx).ROUTE_ID := l_route_id ;
11516 ELSE
11517 l_prd_workorder_tbl(idx).ROUTE_ID := Null;
11518 END IF;
11519
11520 IF c_task_rec.department_id IS NOT NULL
11521 AND c_task_rec.department_id <> FND_API.g_miss_num THEN
11522 l_prd_workorder_tbl(idx).DEPARTMENT_ID := c_task_rec.department_id ;
11523 ELSE
11524 l_prd_workorder_tbl(idx).DEPARTMENT_ID := c_visit_rec.department_id ;
11525 END IF;
11526
11527 --If summary task, use the min,max for sub tasks
11528 IF (c_task_rec.task_type_code = 'SUMMARY') THEN
11529 OPEN get_summary_task_times_csr(c_task_rec.visit_task_id);
11530 FETCH get_summary_task_times_csr INTO l_prd_workorder_tbl(idx).SCHEDULED_START_DATE,
11531 l_prd_workorder_tbl(idx).SCHEDULED_END_DATE ;
11532 CLOSE get_summary_task_times_csr;
11533 ELSE
11534 l_prd_workorder_tbl(idx).SCHEDULED_START_DATE := c_task_rec.START_DATE_TIME;
11535 l_prd_workorder_tbl(idx).SCHEDULED_END_DATE := c_task_rec.END_DATE_TIME;
11536 END IF;
11537 /*NR-MR Changes*/
11538 l_curr_task_id := c_task_rec.visit_task_id;
11539 END IF;
11540 FETCH c_task INTO c_task_rec;
11541 END LOOP;
11542 CLOSE c_task;
11543 END IF; -- l_count
11544
11545 IF l_prd_workorder_tbl.COUNT > 0 THEN
11546 IF (l_log_statement >= l_log_current_level) THEN
11547 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Before Getting MR Relationships ');
11548 END IF;
11549
11550 Get_MR_Relationships
11551 (
11552 p_visit_id => p_visit_id,
11553 p_visit_number => c_visit_rec.visit_number,
11554 p_unit_effectivity_id =>p_unit_effectivity_id,
11555 p_module_type => p_module_type, /*NR-MR Changes - sowsubra*/
11556 p_x_relationship_tbl => l_prd_workorder_rel_tbl
11557 );
11558
11559 IF (l_log_statement >= l_log_current_level) THEN
11560 fnd_log.string(l_log_statement,L_DEBUG_KEY,'After Getting MR Relationships ');
11561 --fnd_log.string(l_log_statement,L_DEBUG_KEY,'Before Getting MR Dependencies ');
11562 END IF;
11563
11564 -- Commented the below code by tchimira on 14-MAR-2012 as per the requirement stated in the bug 13695008
11565 /*Get_MR_Dependencies
11566 (
11567 p_visit_id => p_visit_id,
11568 p_visit_number => c_visit_rec.visit_number,
11569 p_unit_effectivity_id =>p_unit_effectivity_id,
11570 p_module_type => p_module_type,
11571 p_x_relationship_tbl => l_prd_workorder_rel_tbl
11572 );*/
11573
11574 IF (l_log_statement >= l_log_current_level) THEN
11575 --fnd_log.string(l_log_statement,L_DEBUG_KEY,'After Getting MR Dependencies ');
11576 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Before calling AHL_PRD_WORKORDER_PVT.Process_Jobs ');
11577 END IF;
11578
11579 AHL_PRD_WORKORDER_PVT.Process_Jobs
11580 (
11581 p_api_version => p_api_version,
11582 p_init_msg_list => p_init_msg_list,
11583 p_commit => FND_API.G_FALSE,
11584 p_validation_level => p_validation_level,
11585 p_default => FND_API.G_TRUE,
11586 p_module_type => p_module_type,
11587 x_return_status => l_return_status,
11588 x_msg_count => x_msg_count,
11589 x_msg_data => x_msg_data,
11590 p_x_prd_workorder_tbl => l_prd_workorder_tbl,
11591 p_prd_workorder_rel_tbl=> l_prd_workorder_rel_tbl
11592 );
11593
11594 IF (l_log_statement >= l_log_current_level) THEN
11595 fnd_log.string(l_log_statement,L_DEBUG_KEY,'After calling AHL_PRD_WORKORDER_PVT.Process_Jobs - l_return_status : '||l_return_status);
11596 END IF;
11597
11598 IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
11599 IF (l_log_statement >= l_log_current_level) THEN
11600 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Errors from process_jobs API : ' || x_msg_count );
11601 END IF;
11602 RAISE Fnd_Api.g_exc_error;
11603 END IF;
11604
11605 -- SATHAPLI::Bug 5758813, 04-Jun-2008, fix start
11606 -- Update the project tasks' (corresponding to the visit tasks) start and end date with those of the workorders' created above.
11607 IF (l_log_statement >= l_log_current_level) THEN
11608 fnd_log.string(l_log_statement, l_debug_key, 'Before calling Update_Project_Task_Times.');
11609 END IF;
11610
11611 Update_Project_Task_Times(
11612 p_prd_workorder_tbl => l_prd_workorder_tbl,
11613 p_commit => 'F',
11614 x_return_status => l_return_status,
11615 x_msg_count => x_msg_count,
11616 x_msg_data => x_msg_data
11617 );
11618
11619 IF (l_log_statement >= l_log_current_level) THEN
11620 fnd_log.string(l_log_statement, l_debug_key, 'After calling Update_Project_Task_Times. x_return_status => '||x_return_status);
11621 END IF;
11622
11623 IF (l_return_status = FND_API.G_RET_STS_ERROR) THEN
11624 RAISE FND_API.G_EXC_ERROR;
11625 ELSIF (l_return_status = FND_API.G_RET_STS_UNEXP_ERROR) THEN
11626 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
11627 END IF;
11628 -- SATHAPLI::Bug 5758813, 04-Jun-2008, fix end
11629 END IF; -- To find if the visit has any tasks
11630
11631 -- Update the status of all the tasks for this given UE to RELEASED
11632 OPEN c_task(p_visit_id, p_unit_effectivity_id);
11633 FETCH c_task INTO c_task_rec;
11634 WHILE c_task%FOUND
11635 LOOP
11636 UPDATE AHL_VISIT_TASKS_B
11637 SET STATUS_CODE = 'RELEASED',
11638 OBJECT_VERSION_NUMBER = OBJECT_VERSION_NUMBER + 1,
11639 --TCHIMIRA::BUG 9222622 ::15-DEC-2009::UPDATE WHO COLUMNS
11640 LAST_UPDATE_DATE = SYSDATE,
11641 LAST_UPDATED_BY = Fnd_Global.USER_ID,
11642 LAST_UPDATE_LOGIN = Fnd_Global.LOGIN_ID
11643 WHERE VISIT_ID = p_visit_id
11644 AND VISIT_TASK_ID = c_task_rec.visit_task_id
11645 AND STATUS_CODE = 'PLANNING';
11646
11647 l_visit_task_for_rpr_calc := c_task_rec.visit_task_id;
11648
11649 FETCH c_task INTO c_task_rec;
11650 END LOOP;
11651 CLOSE c_task;
11652
11653 -- Update visit status to RELEASED only if no other change of the visit
11654 -- needs to be pushed to production
11655 OPEN c_visit_task_exists(c_visit_rec.visit_id);
11656 FETCH c_visit_task_exists INTO l_dummy;
11657
11658 OPEN c_get_wo_details(c_visit_rec.visit_id);
11659 FETCH c_get_wo_details into c_get_wo_details_rec;
11660 IF (c_visit_task_exists%NOTFOUND and
11661 c_visit_rec.start_date_time = c_get_wo_details_rec.scheduled_start_date and
11662 c_visit_rec.close_date_time = c_get_wo_details_rec.scheduled_completion_date) THEN
11663 UPDATE ahl_visits_b
11664 SET status_code = 'RELEASED',
11665 object_version_number = object_version_number + 1,
11666 --TCHIMIRA::BUG 9222622 ::15-DEC-2009::UPDATE WHO COLUMNS
11667 LAST_UPDATE_DATE = SYSDATE,
11668 LAST_UPDATED_BY = Fnd_Global.USER_ID,
11669 LAST_UPDATE_LOGIN = Fnd_Global.LOGIN_ID
11670 WHERE visit_id = c_visit_rec.visit_id;
11671
11672 IF (l_log_statement >= l_log_current_level) THEN
11673 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Before AHL_VWP_RULES_PVT.Update_Visit_Task_Flag Call');
11674 END IF;
11675
11676 IF c_visit_rec.any_task_chg_flag = 'Y' THEN
11677 AHL_VWP_RULES_PVT.Update_Visit_Task_Flag
11678 (p_visit_id => c_visit_rec.visit_id,
11679 p_flag => 'N',
11680 x_return_status => x_return_status);
11681 END IF;
11682
11683 IF (l_log_statement >= l_log_current_level) THEN
11684 fnd_log.string(l_log_statement,L_DEBUG_KEY,'After AHL_VWP_RULES_PVT.Update_Visit_Task_Flag Call');
11685 END IF;
11686 END IF;
11687
11688 /* MANESING::Bug 13713141, 16-Apr-2012, For Component Visits, Repair Batch status should also
11689 * change similar to the way Visit status changes as Repair Batches are like mini-visits.
11690 * So, if all tasks under the Repair Batch are P2P, then its status should be changed to 'RELEASED'.
11691 */
11692 IF (AHL_CMP_UTIL_PKG.Is_Comp_Visit (c_visit_rec.visit_id) = 'Y') THEN
11693
11694 -- find which Repair Batch, the selected tasks belongs to
11695 OPEN get_rpr_batch_for_task_csr (l_visit_task_for_rpr_calc);
11696 FETCH get_rpr_batch_for_task_csr INTO l_repair_batch_name;
11697 IF (get_rpr_batch_for_task_csr%FOUND) THEN
11698
11699 -- change Repair Batch status as mentioned above
11700 OPEN chk_rpr_batch_has_planed_tasks (l_repair_batch_name);
11701 FETCH chk_rpr_batch_has_planed_tasks INTO l_dummy;
11702
11703 -- if Repair Batch has planned tasks
11704 IF (chk_rpr_batch_has_planed_tasks%NOTFOUND) THEN
11705 IF (l_log_statement >= l_log_current_level) THEN
11706 FND_LOG.string(l_log_statement, l_debug_key, 'Repair Batch ' || l_repair_batch_name || ' has no planned tasks.');
11707 END IF;
11708
11709 UPDATE AHL_VISIT_TASKS_B
11710 SET status_code = 'RELEASED',
11711 object_version_number = object_version_number + 1,
11712 last_update_date = SYSDATE,
11713 last_updated_by = Fnd_Global.USER_ID,
11714 last_update_login = Fnd_Global.LOGIN_ID
11715 WHERE repair_batch_name = l_repair_batch_name;
11716
11717 END IF;
11718 CLOSE chk_rpr_batch_has_planed_tasks;
11719
11720 END IF;
11721 CLOSE get_rpr_batch_for_task_csr;
11722
11723 END IF; -- IF Component Visit
11724
11725 ---------------------------End of Body-------------------------------------
11726 -- Standard check of p_commit.
11727 IF Fnd_Api.To_Boolean (p_commit) THEN
11728 COMMIT WORK;
11729 END IF;
11730
11731 Fnd_Msg_Pub.count_and_get(
11732 p_encoded => Fnd_Api.g_false,
11733 p_count => x_msg_count,
11734 p_data => x_msg_data
11735 );
11736
11737 IF (l_log_procedure >= l_log_current_level) THEN
11738 fnd_log.string(l_log_procedure,L_DEBUG_KEY||'.end','At the end of plsql procedure');
11739 END IF;
11740
11741 EXCEPTION
11742 WHEN Fnd_Api.g_exc_error THEN
11743 ROLLBACK TO Push_MR_to_Production;
11744 x_return_status := Fnd_Api.g_ret_sts_error;
11745 Fnd_Msg_Pub.count_and_get (
11746 p_encoded => Fnd_Api.g_false,
11747 p_count => x_msg_count,
11748 p_data => x_msg_data
11749 );
11750 WHEN Fnd_Api.g_exc_unexpected_error THEN
11751 ROLLBACK TO Push_MR_to_Production;
11752 x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
11753 Fnd_Msg_Pub.count_and_get (
11754 p_encoded => Fnd_Api.g_false,
11755 p_count => x_msg_count,
11756 p_data => x_msg_data
11757 );
11758 WHEN OTHERS THEN
11759 ROLLBACK TO Push_MR_to_Production;
11760 x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
11761 IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_unexp_error)
11762 THEN
11763 Fnd_Msg_Pub.add_exc_msg (G_PKG_NAME, l_api_name);
11764 END IF;
11765 Fnd_Msg_Pub.count_and_get (
11766 p_encoded => Fnd_Api.g_false,
11767 p_count => x_msg_count,
11768 p_data => x_msg_data
11769 );
11770 END Push_MR_to_Production;
11771
11772 --------------------------------------------------------------------
11773 -- PROCEDURE
11774 -- Add_MR_to_Project
11775 --
11776 -- PURPOSE
11777 -- To add Project Task for all the tasks for a given MR
11778 -- when SR tasks are created in prodution
11779 --------------------------------------------------------------------
11780 PROCEDURE Add_MR_to_Project(
11781 p_api_version IN NUMBER,
11782 p_init_msg_list IN VARCHAR2 := Fnd_Api.g_false,
11783 p_commit IN VARCHAR2 := Fnd_Api.g_false,
11784 p_validation_level IN NUMBER := Fnd_Api.g_valid_level_full,
11785 p_module_type IN VARCHAR2 := Null,
11786 p_visit_id IN NUMBER,
11787 p_unit_effectivity_id IN NUMBER,
11788 x_return_status OUT NOCOPY VARCHAR2,
11789 x_msg_count OUT NOCOPY NUMBER,
11790 x_msg_data OUT NOCOPY VARCHAR2
11791 )
11792 IS
11793 L_API_VERSION CONSTANT NUMBER := 1.0;
11794 L_API_NAME CONSTANT VARCHAR2(30) := 'Add_MR_to_Project';
11795 L_DEBUG_KEY CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
11796 G_EXC_ERROR EXCEPTION;
11797 l_msg_count NUMBER;
11798 l_task_id NUMBER;
11799 l_pa_project_id_out NUMBER;
11800 l_msg_index_out NUMBER;
11801 l_return_status VARCHAR2(1);
11802 l_chk_project VARCHAR2(1);
11803 l_proj_ref_flag VARCHAR2(1);
11804 l_project_tsk_flag VARCHAR2(1);
11805 l_msg_data VARCHAR2(2000);
11806 l_pa_project_number_out VARCHAR2(25);
11807 l_commit VARCHAR2(1) := 'F';
11808 l_init_msg_list VARCHAR2(1) := 'F';
11809
11810 -- To find visit related information
11811 CURSOR c_visit (x_id IN NUMBER) IS
11812 SELECT * FROM AHL_VISITS_VL
11813 WHERE VISIT_ID = x_id;
11814 c_visit_rec c_visit%ROWTYPE;
11815
11816 -- To get all the tasks for the given UE
11817 CURSOR c_task (x_visit_id IN NUMBER, x_unit_effectivity_id IN NUMBER) IS
11818 -- SKPATHAK :: Bug 8340436 :: 23-MAR-2009
11819 -- Fetch distinct rows to avoid duplicates
11820 -- Select individual cols instead of *
11821 --SELECT * FROM AHL_VISIT_TASKS_VL
11822 SELECT distinct visit_task_id, originating_task_id, visit_id, unit_effectivity_id,
11823 status_code, service_request_id, project_task_id, visit_task_number,
11824 visit_task_name, description, object_version_number, start_date_time,
11825 end_date_time, task_type_code, cost_parent_id, service_type_code --PRAKKUM :: PIE :: 13-OCT-2010 :: Added three more columns
11826 FROM AHL_VISIT_TASKS_VL
11827 WHERE VISIT_ID = x_visit_id
11828 AND NVL( STATUS_CODE, 'X' ) = 'PLANNING'
11829 START WITH unit_effectivity_id = x_unit_effectivity_id
11830 AND (( originating_task_id is null AND 'SR' <> p_module_type)
11831 -- SKPATHAK :: Bug #9410052 :: 25-FEB-2010 :: Removed the condition "originating_task_id is not null"
11832 OR ( 'SR' = p_module_type
11833 and service_request_id is not null))
11834 CONNECT BY originating_task_id = PRIOR visit_task_id
11835 ORDER by visit_task_number; --PRAKKUM :: PIE :: 13-OCT-2010 :: Added ORDER BY clause
11836
11837 c_task_rec c_task%ROWTYPE;
11838 l_curr_task_id NUMBER := 0;
11839
11840 -- PRAKKUM :: PIE :: 13-OCT-2010
11841 -- Added new cursors
11842 CURSOR get_task_number_csr (c_visit_task_id IN NUMBER) IS
11843 SELECT visit_task_number, task_type_code from ahl_visit_tasks_b
11844 where visit_task_id = c_visit_task_id;
11845
11846 CURSOR top_task_ref_csr (c_top_project_task_id IN NUMBER) IS
11847 SELECT pm_task_reference from pa_tasks
11848 where task_id = c_top_project_task_id;
11849
11850
11851 -- SATHAPLI::Bug 5758813, 04-Jun-2008
11852 -- Cursor to get the required format used for the project task name and description, given a visit task.
11853 -- First part of the UNION is for the planned tasks (routes) attached to the NR.
11854 -- Second part is for the corresponding NR and MR summary tasks.
11855 CURSOR get_prj_task_dtls_cur (c_visit_task_id IN NUMBER) IS
11856 SELECT SUBSTR(NVL(ar.route_no, avt.visit_task_name), 1, 20) task_name,
11857 SUBSTR(NVL(ar.title, avt.visit_task_name), 1, 250) description
11858 FROM ahl_routes_vl ar, ahl_visit_tasks_vl avt,
11859 ahl_mr_routes mrr
11860 WHERE avt.visit_task_id = c_visit_task_id
11861 AND NVL(avt.status_code, 'X') = 'PLANNING'
11862 AND avt.task_type_code NOT IN ('SUMMARY', 'UNASSOCIATED')
11863 AND avt.mr_route_id = mrr.mr_route_id (+)
11864 AND mrr.route_id = ar.route_id (+)
11865 UNION ALL
11866 SELECT SUBSTR(NVL(amh.title, avt.visit_task_name), 1, 20) task_name,
11867 NVL(amh.title, avt.visit_task_name) description
11868 FROM ahl_mr_headers_v amh, ahl_visit_tasks_vl avt
11869 WHERE avt.visit_task_id = c_visit_task_id
11870 AND NVL(avt.status_code, 'X') = 'PLANNING'
11871 AND avt.task_type_code = 'SUMMARY'
11872 AND avt.summary_task_flag = 'N'
11873 AND avt.mr_id = amh.mr_header_id (+);
11874
11875 l_get_prj_task_dtls_cur_rec get_prj_task_dtls_cur%ROWTYPE;
11876
11877 -- PRAKKUM :: PIE:FP :: 13-OCT-2010 ::
11878 -- Added local variables
11879 l_task_reference VARCHAR2(25);
11880 l_top_task_reference VARCHAR2(25) := NULL;
11881 l_task_num_prefix VARCHAR2(25) := '';
11882 l_task_number VARCHAR2(25);
11883 l_task_name VARCHAR2(20);
11884 l_long_task_name VARCHAR2(250);
11885 l_task_description VARCHAR2(250);
11886 l_task_start_date DATE;
11887 l_task_completion_date DATE;
11888 l_parent_task_reference VARCHAR2(25);
11889 l_service_type_code VARCHAR2(30);
11890 l_temp_task_number NUMBER;
11891 l_temp_task_type VARCHAR2(30);
11892 l_new_structure_flag VARCHAR2(1);
11893
11894
11895 BEGIN
11896 --------------------- initialize -----------------------
11897 SAVEPOINT Add_MR_to_Project;
11898
11899 IF (l_log_procedure >= l_log_current_level) THEN
11900 fnd_log.string(l_log_procedure,L_DEBUG_KEY||'.begin','At the start of plsql procedure');
11901 END IF;
11902
11903 -- Initialize message list if p_init_msg_list is set to TRUE.
11904 IF Fnd_Api.to_boolean(p_init_msg_list) THEN
11905 Fnd_Msg_Pub.initialize;
11906 END IF;
11907
11908 -- Initialize API return status to success
11909 x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
11910
11911 -- Standard call to check for call compatibility.
11912 IF NOT Fnd_Api.COMPATIBLE_API_CALL(l_api_version,
11913 p_api_version,
11914 l_api_name,G_PKG_NAME) THEN
11915 RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
11916 END IF;
11917
11918 IF (l_log_statement >= l_log_current_level) THEN
11919 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Unit Effectivity ID = ' || p_unit_effectivity_id);
11920 END IF;
11921
11922 ----------------------------------------- Start of Body ----------------------------------
11923 -- To check Project responsibilites
11924
11925 -- Begin changes by jaramana on Mar 4, 2008 for bug 6788115 (FP of 6759574)
11926 -- As per update from ravichandran.velusamy in Projects team in the bug 6759574,
11927 -- the call to PA_INTERFACE_UTILS_PUB.Set_Global_Info may be removed.
11928 -- AHL_VWP_RULES_PVT.Check_Proj_Responsibility calls PA_INTERFACE_UTILS_PUB.Set_Global_Info
11929 /***
11930 AHL_VWP_RULES_PVT.Check_Proj_Responsibility
11931 (x_check_project => l_chk_project,
11932 x_return_status => l_return_status);
11933
11934 IF l_return_status <> Fnd_Api.G_RET_STS_SUCCESS THEN
11935 x_return_status := l_return_status;
11936 RAISE G_EXC_ERROR;
11937 END IF;
11938
11939 ***/
11940 l_chk_project := 'Y';
11941 -- End changes by jaramana on Mar 4, 2008 for bug 6788115 (FP of 6759574)
11942
11943 IF (l_log_statement >= l_log_current_level) THEN
11944 fnd_log.string(l_log_statement,L_DEBUG_KEY,'l_chk_project = ' || l_chk_project);
11945 END IF;
11946
11947 IF l_chk_project = 'Y' THEN
11948 ----------------------------------------- Cursor ----------------------------------
11949 OPEN c_Visit(p_visit_id);
11950 FETCH c_visit INTO c_visit_rec;
11951 CLOSE c_Visit;
11952
11953 -- PRAKKUM :: PIE Changes :: 13-OCT-2010 :: START
11954 IF (c_visit_rec.top_project_task_id is not null) THEN
11955 OPEN top_task_ref_csr(c_visit_rec.top_project_task_id);
11956 FETCH top_task_ref_csr INTO l_top_task_reference;
11957 CLOSE top_task_ref_csr;
11958 l_task_num_prefix := c_visit_rec.visit_number || '-';
11959 END IF;
11960
11961 IF (l_log_statement >= l_log_current_level) THEN
11962 fnd_log.string(l_log_statement, L_DEBUG_KEY, 'Before calling Use_New_Task_Structure.');
11963 END IF;
11964
11965 Use_New_Task_Structure
11966 ( p_visit_id => p_visit_id,
11967 x_new_structure_flag => l_new_structure_flag
11968 );
11969 IF (l_log_statement >= l_log_current_level) THEN
11970 fnd_log.string(l_log_statement, L_DEBUG_KEY, 'Returned Success from Use_New_Task_Structure.');
11971 END IF;
11972
11973 IF l_new_structure_flag = 'Y' THEN
11974 OPEN c_task(p_visit_id, p_unit_effectivity_id);
11975 FETCH c_task INTO c_task_rec;
11976 WHILE c_task%FOUND
11977 LOOP
11978 IF (c_task_rec.PROJECT_TASK_ID IS NULL) THEN
11979 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
11980 fnd_log.string(fnd_log.level_statement, L_DEBUG_KEY, 'Inside Loop: c_task_rec.visit_task_number = ' || c_task_rec.visit_task_number ||
11981 ', c_task_rec.visit_task_id = ' || c_task_rec.visit_task_id ||
11982 ', c_task_rec.originating_task_id = ' || c_task_rec.originating_task_id ||
11983 ', c_task_rec.unit_effectivity_id = ' || c_task_rec.unit_effectivity_id ||
11984 ', c_task_rec.service_request_id = ' || c_task_rec.service_request_id);
11985 END IF;
11986
11987 -- SATHAPLI::Bug 5758813, 04-Jun-2008 - Fetch the required format for the project task's name and description.
11988 OPEN get_prj_task_dtls_cur(c_task_rec.visit_task_id);
11989 FETCH get_prj_task_dtls_cur INTO l_get_prj_task_dtls_cur_rec;
11990 CLOSE get_prj_task_dtls_cur;
11991
11992 IF c_task_rec.task_type_code <> 'SUMMARY' THEN
11993 -- Not a Summary task: First create a rollup task
11994 l_task_reference := l_task_num_prefix || c_task_rec.visit_task_number || '-1';
11995 l_task_name := SUBSTRB(l_get_prj_task_dtls_cur_rec.task_name,1,15) || '-1';
11996 l_long_task_name := l_get_prj_task_dtls_cur_rec.task_name || '-1';
11997 l_task_number := l_task_reference;
11998 --SKPATHAK :: FP:PIE :: 21-DEC-2010 :: Pass task dates itself for NR tasks so as to ensure that parent project task start date is not after child's
11999 l_task_start_date := trunc(c_task_rec.start_date_time);
12000 --l_task_start_date := trunc(c_visit_rec.start_date_time); -- Pass visit date for Rollup tasks
12001 l_task_completion_date := null;
12002 IF (c_task_rec.cost_parent_id IS NOT NULL) THEN
12003 OPEN get_task_number_csr(c_task_rec.cost_parent_id);
12004 FETCH get_task_number_csr INTO l_temp_task_number, l_temp_task_type;
12005 CLOSE get_task_number_csr;
12006 l_parent_task_reference := l_task_num_prefix || l_temp_task_number;
12007 ELSE
12008 l_parent_task_reference := l_top_task_reference;
12009 END IF;
12010 l_service_type_code := null;
12011 -- Add the Rollup task to the project
12012 Add_Task_To_Project_Int(
12013 p_project_id => c_visit_rec.PROJECT_ID,
12014 p_project_number => c_visit_rec.visit_number,
12015 p_task_number => l_task_number,
12016 p_task_reference => l_task_reference,
12017 p_task_name => l_task_name,
12018 p_long_task_name => l_long_task_name,
12019 p_task_description => null,
12020 p_task_start_date => l_task_start_date,
12021 p_task_completion_date => l_task_completion_date,
12022 p_parent_task_reference => l_parent_task_reference,
12023 p_service_type_code => l_service_type_code,
12024 x_return_status => l_return_status,
12025 x_msg_count => l_msg_count,
12026 x_msg_data => l_msg_data,
12027 x_task_id => l_task_id);
12028
12029
12030 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
12031 fnd_log.string(fnd_log.level_statement, L_DEBUG_KEY, 'After calling Add_Task_To_Project_Int: - l_return_status: ' || l_return_status);
12032 END IF;
12033
12034 IF (l_return_status <> 'S') THEN
12035 IF (fnd_msg_pub.count_msg > 0 ) THEN
12036 FOR i IN 1..fnd_msg_pub.count_msg
12037 LOOP
12038 fnd_msg_pub.get(p_msg_index => i,
12039 p_encoded => 'F',
12040 p_data => l_msg_data,
12041 p_msg_index_out => l_msg_index_out);
12042 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
12043 fnd_log.string(fnd_log.level_statement, L_DEBUG_KEY, 'Error: ' ||l_msg_data);
12044 END IF;
12045 END LOOP;
12046 ELSE
12047 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
12048 fnd_log.string(fnd_log.level_statement, L_DEBUG_KEY, 'Another Error: '||l_msg_data);
12049 END IF;
12050 END IF;
12051 RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
12052 END IF;
12053
12054 -- Then add the non-summary (Route or Unassociated) task under the rollup task
12055 l_task_reference := l_task_num_prefix || c_task_rec.visit_task_number;
12056 l_task_name := SUBSTRB(l_get_prj_task_dtls_cur_rec.task_name,1,15);
12057 l_long_task_name := l_get_prj_task_dtls_cur_rec.task_name;
12058 l_task_number := l_task_reference;
12059 l_task_start_date := trunc(c_task_rec.start_date_time);
12060 l_task_completion_date := null;
12061 l_task_description := SUBSTRB(l_get_prj_task_dtls_cur_rec.description,1,250);
12062 l_parent_task_reference := l_task_num_prefix || c_task_rec.visit_task_number || '-1'; -- Set the rollup task as the parent for this task
12063
12064 ELSE
12065 -- Summary Task
12066 l_task_reference := l_task_num_prefix || c_task_rec.visit_task_number;
12067 l_task_name := SUBSTRB(l_get_prj_task_dtls_cur_rec.task_name,1,15);
12068 l_long_task_name := l_get_prj_task_dtls_cur_rec.task_name;
12069 l_task_number := l_task_reference;
12070 --SKPATHAK :: FP:PIE :: 21-DEC-2010 :: Pass task dates itself for NR tasks so as to ensure that parent project task start date is not after child's
12071 --l_task_start_date := trunc(c_visit_rec.start_date_time);--Pass visit start date to avoid error from Projects
12072 l_task_start_date := trunc(c_task_rec.start_date_time);
12073 l_task_completion_date := null;
12074 l_task_description := SUBSTRB(l_get_prj_task_dtls_cur_rec.description,1,250);
12075 IF (c_task_rec.cost_parent_id IS NOT NULL) THEN
12076 OPEN get_task_number_csr(c_task_rec.cost_parent_id);
12077 FETCH get_task_number_csr INTO l_temp_task_number, l_temp_task_type;
12078 CLOSE get_task_number_csr;
12079 IF (l_temp_task_type IS NOT NULL AND l_temp_task_type <> 'SUMMARY') THEN
12080 -- This is a SR: Make the rollup of the route/unassociated task as the parent
12081 l_parent_task_reference := l_task_num_prefix || l_temp_task_number || '-1';
12082 ELSE
12083 -- Set the parent
12084 l_parent_task_reference := l_task_num_prefix || l_temp_task_number;
12085 END IF;
12086 ELSE
12087 l_parent_task_reference := l_top_task_reference;
12088 END IF;
12089 END IF;
12090
12091 l_service_type_code := c_task_rec.service_type_code;
12092 -- Now add the Route/Unassociated/Summary Task to the Project
12093 Add_Task_To_Project_Int(
12094 p_project_id => c_visit_rec.PROJECT_ID,
12095 p_project_number => c_visit_rec.visit_number,
12096 p_task_number => l_task_number,
12097 p_task_reference => l_task_reference,
12098 p_task_name => l_task_name,
12099 p_long_task_name => l_long_task_name,
12100 p_task_description => l_task_description,
12101 p_task_start_date => l_task_start_date,
12102 p_task_completion_date => l_task_completion_date,
12103 p_parent_task_reference => l_parent_task_reference,
12104 p_service_type_code => l_service_type_code,
12105 x_return_status => l_return_status,
12106 x_msg_count => l_msg_count,
12107 x_msg_data => l_msg_data,
12108 x_task_id => l_task_id);
12109 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
12110 fnd_log.string(fnd_log.level_statement, L_DEBUG_KEY, 'After calling Add_Task_To_Project_Int: - l_return_status: ' || l_return_status);
12111 END IF;
12112 IF (l_return_status <> 'S') THEN
12113 IF (fnd_msg_pub.count_msg > 0 ) THEN
12114 FOR i IN 1..fnd_msg_pub.count_msg
12115 LOOP
12116 fnd_msg_pub.get(p_msg_index => i,
12117 p_encoded => 'F',
12118 p_data => l_msg_data,
12119 p_msg_index_out => l_msg_index_out);
12120 IF (l_log_statement >= l_log_current_level) THEN
12121 fnd_log.string(l_log_statement,L_DEBUG_KEY,': Error' ||l_msg_data);
12122 END IF;
12123 END LOOP;
12124 ELSE
12125 IF (l_log_statement >= l_log_current_level) THEN
12126 fnd_log.string(l_log_statement,L_DEBUG_KEY,': Another Error ='||l_msg_data);
12127 END IF;
12128 END IF;
12129 RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
12130 ELSE
12131 UPDATE AHL_VISIT_TASKS_B SET PROJECT_TASK_ID = l_task_id,
12132 OBJECT_VERSION_NUMBER = c_task_rec.object_version_number + 1,
12133 --TCHIMIRA::BUG 9222622 ::15-DEC-2009::UPDATE WHO COLUMNS
12134 LAST_UPDATE_DATE = SYSDATE,
12135 LAST_UPDATED_BY = Fnd_Global.USER_ID,
12136 LAST_UPDATE_LOGIN = Fnd_Global.LOGIN_ID
12137 WHERE VISIT_TASK_ID = c_task_rec.visit_task_id;
12138 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
12139 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Updated AHL_VISIT_TASKS_B: c_task_rec.visit_task_number = ' || c_task_rec.visit_task_number ||
12140 ', c_task_rec.visit_task_id = ' || c_task_rec.visit_task_id ||
12141 ', c_task_rec.originating_task_id = ' || c_task_rec.originating_task_id ||
12142 ', c_task_rec.unit_effectivity_id = ' || c_task_rec.unit_effectivity_id ||
12143 ', c_task_rec.service_request_id = ' || c_task_rec.service_request_id);
12144 END IF;
12145 END IF;
12146 END IF; -- c_task_rec.PROJECT_TASK_ID is null
12147 FETCH c_task INTO c_task_rec;
12148 END LOOP;
12149 CLOSE c_task;
12150 ELSE -- if l_new_structure_flag = 'Y'
12151 OPEN c_task(p_visit_id, p_unit_effectivity_id);
12152 FETCH c_task INTO c_task_rec;
12153 WHILE c_task%FOUND
12154 LOOP
12155 IF (c_task_rec.PROJECT_TASK_ID IS NULL) THEN
12156 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
12157 fnd_log.string(fnd_log.level_statement, L_DEBUG_KEY, 'Inside Loop: c_task_rec.visit_task_number = ' || c_task_rec.visit_task_number ||
12158 ', c_task_rec.visit_task_id = ' || c_task_rec.visit_task_id ||
12159 ', c_task_rec.originating_task_id = ' || c_task_rec.originating_task_id ||
12160 ', c_task_rec.unit_effectivity_id = ' || c_task_rec.unit_effectivity_id ||
12161 ', c_task_rec.service_request_id = ' || c_task_rec.service_request_id);
12162 END IF;
12163
12164 OPEN get_prj_task_dtls_cur(c_task_rec.visit_task_id);
12165 FETCH get_prj_task_dtls_cur INTO l_get_prj_task_dtls_cur_rec;
12166 CLOSE get_prj_task_dtls_cur;
12167
12168 l_task_reference := c_task_rec.visit_task_number;
12169 l_task_name := SUBSTRB(l_get_prj_task_dtls_cur_rec.task_name,1,15);
12170 l_long_task_name := l_get_prj_task_dtls_cur_rec.task_name;
12171 l_task_number := l_task_reference;
12172 l_task_start_date := trunc(c_task_rec.start_date_time);
12173 l_task_completion_date := trunc(c_task_rec.end_date_time);
12174 l_parent_task_reference:= null;
12175 l_task_description := SUBSTRB(l_get_prj_task_dtls_cur_rec.description,1,250);
12176 l_service_type_code := null;
12177
12178 -- Now add the Route/Unassociated/Summary Task to the Project
12179 Add_Task_To_Project_Int(
12180 p_project_id => c_visit_rec.PROJECT_ID,
12181 p_project_number => c_visit_rec.visit_number,
12182 p_task_number => l_task_number,
12183 p_task_reference => l_task_reference,
12184 p_task_name => l_task_name,
12185 p_long_task_name => l_long_task_name,
12186 p_task_description => l_task_description,
12187 p_task_start_date => l_task_start_date,
12188 p_task_completion_date => l_task_completion_date,
12189 p_parent_task_reference => l_parent_task_reference,
12190 p_service_type_code => l_service_type_code,
12191 x_return_status => l_return_status,
12192 x_msg_count => l_msg_count,
12193 x_msg_data => l_msg_data,
12194 x_task_id => l_task_id);
12195
12196 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
12197 fnd_log.string(fnd_log.level_statement, L_DEBUG_KEY, 'After calling Add_Task_To_Project_Int: - l_return_status: ' || l_return_status);
12198 END IF;
12199 IF (l_return_status <> 'S') THEN
12200 IF (fnd_msg_pub.count_msg > 0 ) THEN
12201 FOR i IN 1..fnd_msg_pub.count_msg
12202 LOOP
12203 fnd_msg_pub.get(p_msg_index => i,
12204 p_encoded => 'F',
12205 p_data => l_msg_data,
12206 p_msg_index_out => l_msg_index_out);
12207 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
12208 fnd_log.string(fnd_log.level_statement, L_DEBUG_KEY, 'Error: ' ||l_msg_data);
12209 END IF;
12210 END LOOP;
12211 ELSE
12212 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
12213 fnd_log.string(fnd_log.level_statement, L_DEBUG_KEY, 'Another Error: '||l_msg_data);
12214 END IF;
12215 END IF;
12216 RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
12217 ELSE
12218 UPDATE AHL_VISIT_TASKS_B SET PROJECT_TASK_ID = l_task_id,
12219 OBJECT_VERSION_NUMBER = c_task_rec.object_version_number + 1
12220 WHERE VISIT_TASK_ID = c_task_rec.visit_task_id;
12221 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
12222 fnd_log.string(fnd_log.level_statement, L_DEBUG_KEY, 'Updated AHL_VISIT_TASKS_B: c_task_rec.visit_task_number = ' || c_task_rec.visit_task_number ||
12223 ', c_task_rec.visit_task_id = ' || c_task_rec.visit_task_id ||
12224 ', c_task_rec.originating_task_id = ' || c_task_rec.originating_task_id ||
12225 ', c_task_rec.unit_effectivity_id = ' || c_task_rec.unit_effectivity_id ||
12226 ', c_task_rec.service_request_id = ' || c_task_rec.service_request_id);
12227 END IF;
12228 END IF;
12229 END IF; -- c_task_rec.PROJECT_TASK_ID is null
12230 FETCH c_task INTO c_task_rec;
12231 END LOOP;
12232 CLOSE c_task;
12233 END IF; -- l_new_structure_flag = 'Y'
12234 -- PRAKKUM :: PIE Changes :: 13-OCT-2010 :: END
12235 END IF; -- l_chk_project
12236
12237 ---------------------------End of Body-------------------------------------
12238 -- Standard check of p_commit.
12239
12240 IF Fnd_Api.To_Boolean ( p_commit ) THEN
12241 COMMIT WORK;
12242 END IF;
12243
12244 Fnd_Msg_Pub.count_and_get(
12245 p_encoded => Fnd_Api.g_false,
12246 p_count => x_msg_count,
12247 p_data => x_msg_data
12248 );
12249
12250 IF (l_log_procedure >= l_log_current_level) THEN
12251 fnd_log.string(l_log_procedure,L_DEBUG_KEY||'.end','At the end of plsql procedure');
12252 END IF;
12253
12254 EXCEPTION
12255 WHEN Fnd_Api.g_exc_error THEN
12256 ROLLBACK TO Add_MR_to_Project;
12257 x_return_status := Fnd_Api.g_ret_sts_error;
12258 Fnd_Msg_Pub.count_and_get (
12259 p_encoded => Fnd_Api.g_false,
12260 p_count => x_msg_count,
12261 p_data => x_msg_data
12262 );
12263 WHEN Fnd_Api.g_exc_unexpected_error THEN
12264 ROLLBACK TO Add_MR_to_Project;
12265 x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
12266 Fnd_Msg_Pub.count_and_get (
12267 p_encoded => Fnd_Api.g_false,
12268 p_count => x_msg_count,
12269 p_data => x_msg_data
12270 );
12271 WHEN OTHERS THEN
12272 ROLLBACK TO Add_MR_to_Project;
12273 x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
12274 IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_unexp_error)
12275 THEN
12276 Fnd_Msg_Pub.add_exc_msg (G_PKG_NAME, l_api_name);
12277 END IF;
12278 Fnd_Msg_Pub.count_and_get (
12279 p_encoded => Fnd_Api.g_false,
12280 p_count => x_msg_count,
12281 p_data => x_msg_data
12282 );
12283 END Add_MR_to_Project;
12284
12285 -- AnRaj: Added as part of Material Requirement Aggrgation Enhancement, Bug#5303378
12286 -- Call aggregate_material_requirements for a visit
12287 -- If a visit task has more than one requirement for the same item, then this method will aggregate
12288 -- all those requirements into a single requirement
12289 PROCEDURE Aggregate_Material_Reqrs
12290 (p_api_version IN NUMBER,
12291 p_init_msg_list IN VARCHAR2,
12292 p_commit IN VARCHAR2,
12293 p_validation_level IN NUMBER,
12294 p_module_type IN VARCHAR2,
12295 p_visit_id IN NUMBER,
12296 x_return_status OUT NOCOPY VARCHAR2,
12297 x_msg_count OUT NOCOPY NUMBER,
12298 x_msg_data OUT NOCOPY VARCHAR2
12299 )
12300 IS
12301 -- get all tasks in planning status for a visit
12302 CURSOR get_visit_tasks_cur(c_visit_id NUMBER) IS
12303 SELECT visit_task_id
12304 FROM ahl_visit_tasks_b
12305 WHERE visit_id = c_visit_id
12306 AND NVL(status_code,'X') = 'PLANNING';
12307
12308 -- Declare local variables
12309 l_api_version CONSTANT NUMBER := 1.0;
12310 l_api_name CONSTANT VARCHAR2(30) := 'Aggregate_Material_Reqrs';
12311 L_DEBUG_KEY CONSTANT VARCHAR2(100) := 'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name;
12312 l_init_msg_list VARCHAR2(1) := 'F';
12313 l_return_status VARCHAR2(1);
12314 l_msg_count NUMBER;
12315 l_msg_data VARCHAR2(2000);
12316 l_visit_task_id NUMBER;
12317 l_reservation_id NUMBER;
12318 l_scheduled_matrial_id NUMBER;
12319 l_previous_item NUMBER := NULL;
12320
12321 BEGIN
12322 -- Standard start of API savepoint
12323 SAVEPOINT AGGREGATE_MATERIAL_REQRS;
12324
12325 -- Initialize return status to success before any code logic/validation
12326 x_return_status:= FND_API.G_RET_STS_SUCCESS;
12327
12328 -- Standard call to check for call compatibility
12329 IF NOT FND_API.COMPATIBLE_API_CALL (l_api_version, p_api_version, l_api_name, G_PKG_NAME)
12330 THEN
12331 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
12332 END IF;
12333
12334 -- Initialize message list if p_init_msg_list = FND_API.G_TRUE
12335 IF FND_API.TO_BOOLEAN(p_init_msg_list)
12336 THEN
12337 FND_MSG_PUB.INITIALIZE;
12338 END IF;
12339
12340 IF (l_log_procedure >= l_log_current_level) THEN
12341 fnd_log.string(l_log_procedure,
12342 L_DEBUG_KEY,
12343 'At the start of PL SQL procedure. Visit Id = ' || p_visit_id);
12344 END IF;
12345
12346 OPEN get_visit_tasks_cur(p_visit_id);
12347 LOOP
12348 FETCH get_visit_tasks_cur INTO l_visit_task_id;
12349 EXIT WHEN get_visit_tasks_cur%NOTFOUND;
12350 IF (l_log_statement >= l_log_current_level) THEN
12351 fnd_log.string(l_log_statement,
12352 L_DEBUG_KEY,
12353 'Before calling AGGREGATE_TASK_MATERIAL_REQRS for Visit Task Id: ' || l_visit_task_id);
12354 END IF;
12355
12356 AHL_VWP_PROJ_PROD_PVT.Aggregate_Task_Material_Reqrs
12357 (p_api_version => p_api_version,
12358 p_init_msg_list => p_init_msg_list,
12359 p_commit => p_commit,
12360 p_validation_level => p_validation_level,
12361 p_module_type => p_module_type,
12362 p_task_id => l_visit_task_id,
12363 p_rel_tsk_flag => 'N',
12364 x_return_status => l_return_status,
12365 x_msg_count => l_msg_count,
12366 x_msg_data => l_msg_data
12367 );
12368
12369 IF (l_log_statement >= l_log_current_level) THEN
12370 fnd_log.string(l_log_statement,
12371 L_DEBUG_KEY,
12372 'After calling AGGREGATE_TASK_MATERIAL_REQRS for Visit Task Id: ' ||
12373 l_visit_task_id || '. Return Status = '|| l_return_status);
12374 END IF;
12375
12376 IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
12377 x_msg_count := FND_MSG_PUB.count_msg;
12378 IF (l_log_statement >= l_log_current_level) THEN
12379 fnd_log.string(l_log_statement,
12380 L_DEBUG_KEY,
12381 'Errors from AGGREGATE_TASK_MATERIAL_REQRS. Message count: ' || x_msg_count);
12382 END IF;
12383 IF l_return_status = FND_API.G_RET_STS_ERROR THEN
12384 RAISE FND_API.G_EXC_ERROR;
12385 ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
12386 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
12387 END IF;
12388 END IF;
12389
12390 END LOOP;
12391 CLOSE get_visit_tasks_cur;
12392 END Aggregate_Material_Reqrs;
12393
12394 -------------------------------------------------------------------
12395 -- Procedure name : Aggregate_Task_Material_Reqrs
12396 -- Type : Private
12397 -- Function : Find the total requirment of a specific
12398 -- item at the task level
12399 -- Parameters :
12400 --
12401 -- Standard OUT Parameters :
12402 -- x_return_status OUT VARCHAR2 Required
12403 -- x_msg_count OUT NUMBER Required
12404 -- x_msg_data OUT VARCHAR2 Required
12405 --
12406 -- Aggregate_Task_Material_Reqrs Parameters:
12407 -- p_task_id IN NUMBER Required
12408 --
12409 -- Version :
12410 -- 30 November, 2007 RNAHATA Initial Version - 1.0
12411 -------------------------------------------------------------------
12412 PROCEDURE Aggregate_Task_Material_Reqrs
12413 (p_api_version IN NUMBER,
12414 p_init_msg_list IN VARCHAR2,
12415 p_commit IN VARCHAR2,
12416 p_validation_level IN NUMBER,
12417 p_module_type IN VARCHAR2,
12418 p_task_id IN NUMBER,
12419 p_rel_tsk_flag IN VARCHAR2 := 'Y',
12420 x_return_status OUT NOCOPY VARCHAR2,
12421 x_msg_count OUT NOCOPY NUMBER,
12422 x_msg_data OUT NOCOPY VARCHAR2
12423 )
12424 IS
12425 -- Cursor to get the duplicate material requirements
12426 -- Modified by surrkuma for Service Bulletin on 07-Jun-2011
12427 -- Added mc_header_id null check to ignore Position based requirements
12428 CURSOR get_material_reqrs_cur(c_visit_task_id NUMBER) IS
12429 SELECT UNIQUE asmt1.scheduled_material_id,
12430 asmt1.visit_id,
12431 asmt1.visit_task_id,
12432 asmt1.inventory_item_id,
12433 asmt1.requested_quantity,
12434 asmt1.scheduled_quantity,
12435 asmt1.rt_oper_material_id,
12436 asmt1.item_group_id
12437 FROM ahl_schedule_materials asmt1,
12438 ahl_Schedule_materials asmt2
12439 WHERE asmt1.visit_id = asmt2.visit_id
12440 AND asmt1.visit_task_id = asmt2.visit_task_id
12441 AND asmt1.inventory_item_id = asmt2.inventory_item_id
12442 AND NVL(asmt1.operation_code,'X') = NVL(asmt2.operation_code,'X')
12443 AND asmt1.scheduled_material_id <> asmt2.scheduled_material_id
12444 AND NVL(asmt1.status,'X') = 'ACTIVE'
12445 AND NVL(asmt2.status,'X') = 'ACTIVE'
12446 AND asmt1.visit_task_id = c_visit_task_id
12447 AND asmt1.mc_header_id IS NULL
12448 AND asmt2.mc_header_id IS NULL
12449 ORDER BY asmt1.inventory_item_id;
12450 l_material_reqrs_rec get_material_reqrs_cur%ROWTYPE;
12451
12452 CURSOR check_reservation_exist (c_scheduled_material_id IN NUMBER) IS
12453 SELECT reservation_id
12454 FROM mtl_reservations
12455 WHERE demand_source_line_detail = c_scheduled_material_id
12456 AND external_source_code = 'AHL';
12457
12458 -- Declare local variables
12459 L_API_NAME CONSTANT VARCHAR2(30) := 'Aggregate_Task_Material_Reqrs';
12460 l_api_version CONSTANT NUMBER := 1.0;
12461 L_DEBUG_KEY CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
12462 l_init_msg_list VARCHAR2(1) := 'F';
12463 l_reservation_id NUMBER;
12464 l_scheduled_matrial_id NUMBER;
12465 l_previous_item NUMBER := NULL;
12466
12467 BEGIN
12468 -- Initialize return status to success before any code logic/validation
12469 x_return_status:= FND_API.G_RET_STS_SUCCESS;
12470
12471 IF (l_log_procedure >= l_log_current_level) THEN
12472 fnd_log.string(l_log_procedure,
12473 L_DEBUG_KEY ||'.begin',
12474 'At the start of PL SQL procedure. Visit Task Id = ' || p_task_id);
12475 END IF;
12476
12477 -- Standard call to check for call compatibility
12478 IF NOT FND_API.COMPATIBLE_API_CALL (l_api_version, p_api_version, l_api_name, G_PKG_NAME)
12479 THEN
12480 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
12481 END IF;
12482
12483 -- Initialize message list if p_init_msg_list = FND_API.G_TRUE
12484 IF FND_API.TO_BOOLEAN(p_init_msg_list)
12485 THEN
12486 FND_MSG_PUB.INITIALIZE;
12487 END IF;
12488
12489 -- initialize the counter
12490 l_previous_item := NULL;
12491
12492 -- For each task in status planning, get details if there mutiple requirements for the same item
12493 OPEN get_material_reqrs_cur(p_task_id);
12494 LOOP
12495 FETCH get_material_reqrs_cur INTO l_material_reqrs_rec;
12496 EXIT WHEN get_material_reqrs_cur%NOTFOUND;
12497
12498 IF (l_log_statement >= l_log_current_level) THEN
12499 fnd_log.string(l_log_statement,
12500 L_DEBUG_KEY,
12501 'Fetching Material Requirements for task.');
12502 END IF;
12503
12504 IF l_previous_item IS NULL THEN
12505 -- if the first duplicate occurance for a task
12506 l_scheduled_matrial_id := l_material_reqrs_rec.scheduled_material_id;
12507 IF (l_log_statement >= l_log_current_level) THEN
12508 fnd_log.string(l_log_statement,
12509 L_DEBUG_KEY,
12510 'First Requirement Id: ' || l_scheduled_matrial_id);
12511 END IF;
12512 ELSIF l_previous_item = l_material_reqrs_rec.inventory_item_id THEN
12513 -- merge the records
12514 IF p_rel_tsk_flag = 'Y' THEN
12515 OPEN check_reservation_exist(l_material_reqrs_rec.scheduled_material_id);
12516 FETCH check_reservation_exist INTO l_reservation_id;
12517 IF check_reservation_exist%FOUND THEN
12518
12519 IF (l_log_statement >= l_log_current_level) THEN
12520 fnd_log.string(l_log_statement,
12521 L_DEBUG_KEY,
12522 'Before calling AHL_RSV_RESERVATIONS_PVT.TRNSFR_RSRV_FOR_MATRL_REQR');
12523 fnd_log.string(l_log_statement,
12524 L_DEBUG_KEY,
12525 'l_material_reqrs_rec.scheduled_material_id->' || l_material_reqrs_rec.scheduled_material_id);
12526 fnd_log.string(l_log_statement,
12527 L_DEBUG_KEY,'l_scheduled_matrial_id->' || l_scheduled_matrial_id);
12528 END IF;
12529
12530 -- Call Transfer reservations
12531 AHL_RSV_RESERVATIONS_PVT.TRNSFR_RSRV_FOR_MATRL_REQR
12532 (p_api_version => l_api_version,
12533 p_init_msg_list => l_init_msg_list,
12534 p_module_type => p_module_type,
12535 x_msg_count => x_msg_count,
12536 x_msg_data => x_msg_data,
12537 x_return_status => x_return_status,
12538 p_visit_task_id => p_task_id,
12539 p_from_mat_req_id => l_material_reqrs_rec.scheduled_material_id,
12540 p_to_mat_req_id => l_scheduled_matrial_id
12541 );
12542
12543 IF (l_log_statement >= l_log_current_level) THEN
12544 fnd_log.string(l_log_statement,
12545 L_DEBUG_KEY,
12546 'After calling AHL_RSV_RESERVATIONS_PVT.TRNSFR_RSRV_FOR_MATRL_REQR. Return Status = '||
12547 x_return_status);
12548 END IF;
12549
12550 IF (x_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
12551 x_msg_count := FND_MSG_PUB.count_msg;
12552 IF (l_log_statement >= l_log_current_level) THEN
12553 fnd_log.string(l_log_statement,
12554 L_DEBUG_KEY,
12555 'Errors from AHL_RSV_RESERVATIONS_PVT.TRNSFR_RSRV_FOR_MATRL_REQR. Message count: ' || x_msg_count);
12556 END IF;
12557 IF x_return_status = FND_API.G_RET_STS_ERROR THEN
12558 RAISE FND_API.G_EXC_ERROR;
12559 ELSIF x_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
12560 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
12561 END IF;
12562 END IF;
12563 END IF;
12564 END IF;
12565
12566 IF (l_log_statement >= l_log_current_level) THEN
12567 fnd_log.string(l_log_statement,
12568 L_DEBUG_KEY,
12569 'Updating ahl_schedule_materials with new Material Requirements');
12570 END IF;
12571
12572 -- Add the requirements into the first record
12573 UPDATE ahl_schedule_materials
12574 SET scheduled_quantity = NVL(scheduled_quantity,0) + NVL(l_material_reqrs_rec.scheduled_quantity,0),
12575 item_group_id = NVL(item_group_id,l_material_reqrs_rec.item_group_id),
12576 requested_quantity = NVL(requested_quantity,0) + NVL(l_material_reqrs_rec.requested_quantity,0)
12577 WHERE scheduled_material_id = l_scheduled_matrial_id;
12578
12579 IF (l_log_statement >= l_log_current_level) THEN
12580 fnd_log.string(l_log_statement,
12581 L_DEBUG_KEY,
12582 'Deleting the old material requirements from table ahl_schedule_materials ');
12583 END IF;
12584
12585 -- Mark the current row as deleted
12586 UPDATE ahl_Schedule_materials
12587 SET status = 'DELETED',requested_quantity = 0
12588 WHERE scheduled_material_id = l_material_reqrs_rec.scheduled_material_id;
12589
12590 ELSE -- New duplicate inventory item id as material req
12591 l_scheduled_matrial_id := l_material_reqrs_rec.scheduled_material_id;
12592 IF (l_log_statement >= l_log_current_level) THEN
12593 fnd_log.string(l_log_statement,
12594 L_DEBUG_KEY,
12595 'New Duplicate Inventory Item Id. Requirement Id: ' || l_scheduled_matrial_id ||
12596 ', Item Id: ' || l_material_reqrs_rec.inventory_item_id);
12597 END IF;
12598 END IF; -- not the same item
12599 -- make the current item the previous item, before reading the next record
12600 l_previous_item := l_material_reqrs_rec.inventory_item_id;
12601 END LOOP;
12602 CLOSE get_material_reqrs_cur;
12603
12604 IF (l_log_procedure >= l_log_current_level) THEN
12605 fnd_log.string(l_log_procedure,
12606 L_DEBUG_KEY ||'.end',
12607 'At the end of PL SQL procedure. Return Status =' || x_return_status);
12608 END IF;
12609
12610 END Aggregate_Task_Material_Reqrs;
12611
12612 -- PRAKKUM :: PIE:FP :: 13-OCT-2010 :: START :: Modified this procedure
12613 -------------------------------------------------------------------
12614 -- Procedure name : Update_Project_Task_Times
12615 -- Type : Private
12616 -- Function : Update the project task start/end dates
12617 -- with the workorder schedule start/end dates
12618 -- Parameters :
12619 -- Standard IN Parameters :
12620 -- p_commit IN VARCHAR2 Fnd_Api.G_FALSE
12621 --
12622 -- Update_Project_Task_Times Parameters
12623 -- p_prd_workorder_tbl IN AHL_PRD_WORKORDER_PVT.PRD_WORKORDER_TBL Required
12624 --
12625 -- Standard OUT Parameters :
12626 -- x_return_status OUT VARCHAR2 Required
12627 -- x_msg_count OUT NUMBER Required
12628 -- x_msg_data OUT VARCHAR2 Required
12629 --
12630 -- Version :
12631 -- 04 January, 2007 Bug#5758813 SOWSUBRA Initial Version - 1.0
12632 -------------------------------------------------------------------
12633 PROCEDURE Update_Project_Task_Times
12634 ( p_prd_workorder_tbl IN AHL_PRD_WORKORDER_PVT.PRD_WORKORDER_TBL,
12635 p_commit IN VARCHAR2 := Fnd_Api.G_FALSE,
12636 x_return_status OUT NOCOPY VARCHAR2,
12637 x_msg_count OUT NOCOPY NUMBER,
12638 x_msg_data OUT NOCOPY VARCHAR2
12639 )
12640 AS
12641
12642 l_task_in_tbl PA_PROJECT_PUB.TASK_IN_TBL_TYPE;
12643 task_index NUMBER;
12644 idx NUMBER;
12645 l_project_rec PA_PROJECT_PUB.PROJECT_IN_REC_TYPE;
12646 L_API_NAME CONSTANT VARCHAR2(30) := 'Update_Project_Task_Times';
12647 L_DEBUG_KEY CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
12648 l_msg_count NUMBER;
12649 l_msg_data VARCHAR2(2000);
12650 l_return_status VARCHAR2(1);
12651 l_task_out PA_PROJECT_PUB.TASK_OUT_TBL_TYPE;
12652 l_workflow_started VARCHAR2(1);
12653 l_key_members PA_PROJECT_PUB.PROJECT_ROLE_TBL_TYPE;
12654 l_class_categories PA_PROJECT_PUB.CLASS_CATEGORY_TBL_TYPE;
12655 l_project_out PA_PROJECT_PUB.PROJECT_OUT_REC_TYPE;
12656
12657 -- Added by jaramana on 23-OCT-2009 for the WBS ER 8674208
12658 -- and to fix the bug 9047048
12659 l_is_wp_separate_from_fn VARCHAR2(1);
12660 l_is_wp_versioning_enabled VARCHAR2(1);
12661 l_pass_entire_structure VARCHAR2(1) := 'N'; -- Default to 'N';
12662 TYPE Ref_Tbl_Type IS TABLE OF VARCHAR2(30) INDEX BY BINARY_INTEGER;
12663 TYPE Desc_Tbl_Type IS TABLE OF VARCHAR2(250) INDEX BY BINARY_INTEGER;
12664 TYPE Id_Tbl_Type IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
12665 l_task_ref_tbl Ref_Tbl_Type;
12666 l_parent_task_ref_tbl Ref_Tbl_Type;
12667 l_task_desc_tbl Desc_Tbl_Type;
12668 l_task_id_tbl Id_Tbl_Type;
12669 l_parent_task_id_tbl Id_Tbl_Type;
12670 l_vst_task_id_tbl Id_Tbl_Type;
12671 l_task_map_tbl Id_Tbl_Type;
12672 l_temp_index NUMBER;
12673
12674 -- Added by jaramana on 23-OCT-2009 for the WBS ER 8674208
12675 -- This cursor gets the task details for all the tasks in the given project
12676 CURSOR get_all_prj_tsks_csr(c_project_id IN NUMBER, c_visit_id IN NUMBER) IS
12677 SELECT CURR.TASK_ID, CURR.DESCRIPTION, CURR.PM_TASK_REFERENCE, PARENT.PM_TASK_REFERENCE PARENT_TASK_REFERENCE, VTSK.VISIT_TASK_ID
12678 , CURR.PARENT_TASK_ID PARENT_TASK_ID -- PRAKKUM :: 08-JAN-2013 :: FPBug 16481709 for BaseBug 14828418 : In reference of bug 9047048
12679 FROM PA_TASKS CURR, PA_PROJ_ELEMENT_VERSIONS PPEV, PA_TASKS PARENT, AHL_VISIT_TASKS_B VTSK
12680 WHERE CURR.PROJECT_ID = c_project_id
12681 AND PPEV.PROJ_ELEMENT_ID = CURR.TASK_ID
12682 AND PPEV.PROJECT_ID = c_project_id
12683 AND PARENT.TASK_ID (+) = CURR.PARENT_TASK_ID
12684 AND VTSK.PROJECT_TASK_ID (+) = CURR.TASK_ID
12685 AND VTSK.VISIT_ID(+) = c_visit_id
12686 ORDER BY PPEV.DISPLAY_SEQUENCE;
12687
12688 --fetches the schedule start and completion date of workorder
12689 CURSOR get_wo_schedule_dates_cur(p_wo_id IN NUMBER) IS
12690 SELECT WDJ.SCHEDULED_START_DATE, WDJ.SCHEDULED_COMPLETION_DATE
12691 FROM WIP_DISCRETE_JOBS WDJ, AHL_WORKORDERS WO
12692 WHERE WDJ.WIP_ENTITY_ID = WO.WIP_ENTITY_ID AND
12693 WO.WORKORDER_ID = p_wo_id;
12694 get_wo_schedule_dates_rec get_wo_schedule_dates_cur%ROWTYPE;
12695
12696 --fetches project task id, the task start and end date of visit task
12697 CURSOR get_task_dates_cur(p_wo_id IN NUMBER) IS
12698 SELECT AVT.PROJECT_TASK_ID, AVT.START_DATE_TIME, AVT.END_DATE_TIME,
12699 PAT.DESCRIPTION -- Pass the old description back again
12700 FROM AHL_VISIT_TASKS_B AVT, AHL_WORKORDERS WO,
12701 PA_TASKS PAT
12702 WHERE WO.VISIT_TASK_ID = AVT.VISIT_TASK_ID AND
12703 WO.WORKORDER_ID = p_wo_id AND
12704 PAT.TASK_ID (+) = AVT.PROJECT_TASK_ID;
12705 get_task_dates_rec get_task_dates_cur%ROWTYPE;
12706
12707 --fetch the project id, visit start date and visit end date
12708 CURSOR get_visit_details_cur (p_wo_id IN NUMBER) IS
12709 --TCHIMIRA::BUG:9117467::23-NOV-2009
12710 --Removed the column wo.workorder_id from the select clause
12711 SELECT av.visit_id, av.project_id, av.start_date_time, av.close_date_time, av.top_project_task_id
12712 FROM ahl_workorders wo, ahl_visits_b av
12713 WHERE WO.WORKORDER_ID = p_wo_id
12714 AND wo.visit_id = av.visit_id;
12715 -- Changed by jaramana on 11-NOV-2009 for bug 9109020
12716 --AND wo.visit_task_id IS NULL
12717 --AND wo.master_workorder_flag = 'Y';
12718 visit_details_rec get_visit_details_cur%ROWTYPE;
12719
12720 --Fetch the project start date
12721 CURSOR get_prj_start_date_csr (c_project_id IN NUMBER) IS
12722 SELECT start_date
12723 from pa_projects_all
12724 where project_id = c_project_id;
12725
12726 BEGIN
12727 -- Initialize return status to success before any code logic/validation
12728 SAVEPOINT Update_Project_Task_Times;
12729
12730 x_return_status:= FND_API.G_RET_STS_SUCCESS;
12731
12732 IF (l_log_procedure >= l_log_current_level) THEN
12733 fnd_log.string(l_log_procedure,
12734 L_DEBUG_KEY ||'.begin',
12735 'At the start of PL SQL procedure. p_prd_workorder_tbl.COUNT = ' || p_prd_workorder_tbl.COUNT);
12736 END IF;
12737 --for each workorder get the schduled start/end time
12738 IF p_prd_workorder_tbl.count > 0 THEN
12739 -- Changes by jaramana on 23-OCT-2009 for the WBS ER 8674208
12740 -- and to fix the bug 9047048
12741 -- Check if using Shared Workplan Structure
12742 OPEN get_visit_details_cur(p_prd_workorder_tbl(p_prd_workorder_tbl.FIRST).workorder_id);
12743 FETCH get_visit_details_cur INTO visit_details_rec;
12744 CLOSE get_visit_details_cur;
12745 IF visit_details_rec.project_id IS NOT NULL THEN
12746 l_is_wp_separate_from_fn := PA_PROJ_TASK_STRUC_PUB.IS_WP_SEPARATE_FROM_FN(visit_details_rec.PROJECT_ID);
12747 l_is_wp_versioning_enabled := PA_PROJ_TASK_STRUC_PUB.IS_WP_VERSIONING_ENABLED(visit_details_rec.PROJECT_ID);
12748 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
12749 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'visit_details_rec.project_id = ' || visit_details_rec.project_id ||
12750 ', l_is_wp_separate_from_fn = ' || l_is_wp_separate_from_fn ||
12751 ' and l_is_wp_versioning_enabled = ' || l_is_wp_versioning_enabled);
12752 END IF;
12753 IF (l_is_wp_separate_from_fn = 'N') THEN
12754 -- Workplan is enabled, Using Shared Structure
12755 -- In order to avoid the error with updating projects with Work Plan Structure enabled,
12756 -- just pass the task reference and the parent task reference for all existing tasks even if there is no change
12757 l_pass_entire_structure := 'Y';
12758 END IF;
12759 END IF;
12760 IF (l_pass_entire_structure = 'Y') THEN
12761 -- Need to pass ALL the tasks on account of Projects restriction
12762 -- For better performance, do bulk collect of all project task details
12763 OPEN get_all_prj_tsks_csr(c_project_id => visit_details_rec.PROJECT_ID, c_visit_id => visit_details_rec.VISIT_ID);
12764 -- PRAKKUM :: 08-JAN-2013 :: FPBug 16481709 for BaseBug 14828418 : In reference of bug 9047048
12765 FETCH get_all_prj_tsks_csr BULK COLLECT INTO l_task_id_tbl, l_task_desc_tbl, l_task_ref_tbl, l_parent_task_ref_tbl, l_vst_task_id_tbl, l_parent_task_id_tbl;
12766 CLOSE get_all_prj_tsks_csr;
12767 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
12768 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'Collected all Project Tasks. l_task_id_tbl.count = ' || l_task_id_tbl.count);
12769 END IF;
12770
12771 -- For better performance, create a mapping table to get the index from p_prd_workorder_tbl given the visit_task_id
12772 FOR idx IN p_prd_workorder_tbl.FIRST..p_prd_workorder_tbl.LAST
12773 LOOP
12774 IF p_prd_workorder_tbl(idx).VISIT_TASK_ID IS NOT NULL THEN
12775 l_task_map_tbl(p_prd_workorder_tbl(idx).VISIT_TASK_ID) := idx;
12776 END IF;
12777 END LOOP;
12778 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
12779 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'Created Mapping Table l_task_map_tbl. l_task_map_tbl.count = ' || l_task_map_tbl.COUNT);
12780 END IF;
12781
12782 -- Now process all Project Tasks
12783 IF l_task_id_tbl.count > 0 THEN
12784 FOR k IN 1..l_task_ref_tbl.LAST LOOP
12785 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
12786 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'k = ' || k ||
12787 ', PA_TASK_ID = ' || l_task_id_tbl(k) ||
12788 ', PA_PARENT_TASK_ID = ' || l_parent_task_id_tbl(k) ||
12789 ', PM_TASK_REFERENCE = ' || l_task_ref_tbl(k) ||
12790 ', PM_PARENT_TASK_REFERENCE = ' || l_parent_task_ref_tbl(k));
12791 END IF;
12792 l_task_in_tbl(k).PA_TASK_ID := l_task_id_tbl(k);
12793 l_task_in_tbl(k).TASK_DESCRIPTION := l_task_desc_tbl(k);
12794 -- PRAKKUM :: 08-JAN-2013 :: FPBug 16481709 for BaseBug 14828418 : In reference of bug 9047048
12795 IF l_task_ref_tbl(k) IS NOT NULL THEN --Project tasks created from Projects UI, wont have task_reference
12796 l_task_in_tbl(k).PM_TASK_REFERENCE := l_task_ref_tbl(k);
12797 l_task_in_tbl(k).PM_PARENT_TASK_REFERENCE := l_parent_task_ref_tbl(k);
12798 ELSE -- Only project tasks created from Projects UI will come to this block
12799 l_task_in_tbl(k).PA_PARENT_TASK_ID := l_parent_task_id_tbl(k);
12800 END IF;
12801
12802 -- Check if the work order start time has been changed by EAM and if so, pass this too
12803 IF (l_vst_task_id_tbl(k) IS NOT NULL) THEN
12804 -- This project task belongs to the current visit
12805 IF (l_task_map_tbl.EXISTS(l_vst_task_id_tbl(k)) AND l_task_map_tbl(l_vst_task_id_tbl(k)) IS NOT NULL) THEN
12806 -- The visit task exists in p_prd_workorder_tbl
12807 l_temp_index := l_task_map_tbl(l_vst_task_id_tbl(k));
12808 OPEN get_wo_schedule_dates_cur(p_prd_workorder_tbl(l_temp_index).workorder_id);
12809 FETCH get_wo_schedule_dates_cur INTO get_wo_schedule_dates_rec;
12810 CLOSE get_wo_schedule_dates_cur;
12811
12812 OPEN get_task_dates_cur(p_prd_workorder_tbl(l_temp_index).workorder_id);
12813 FETCH get_task_dates_cur INTO get_task_dates_rec;
12814 CLOSE get_task_dates_cur;
12815
12816 -- If different, update the task start with workorder scheduled start dates
12817 IF (get_wo_schedule_dates_rec.scheduled_start_date <> get_task_dates_rec.start_date_time) THEN
12818 l_task_in_tbl(k).task_start_date := trunc(get_wo_schedule_dates_rec.scheduled_start_date);
12819 END IF;
12820 -- PRAKKUM :: Bug 9281476 :: 25-NOV-2010
12821 -- Populate scheduled dates also
12822 l_task_in_tbl(k).scheduled_start_date := trunc(get_wo_schedule_dates_rec.scheduled_start_date);
12823 l_task_in_tbl(k).scheduled_finish_date := trunc(get_wo_schedule_dates_rec.scheduled_completion_date);
12824 END IF; -- l_task_map_tbl check
12825 END IF; -- l_vst_task_id_tbl NOT NULL Check
12826 END LOOP; -- Loop on k (l_task_ref_tbl)
12827 END IF; -- l_task_id_tbl.count > 0
12828 ELSE
12829 -- l_pass_entire_structure is 'N'
12830 task_index := 1;
12831 FOR idx IN p_prd_workorder_tbl.FIRST..p_prd_workorder_tbl.LAST
12832 LOOP
12833 IF (l_log_statement >= l_log_current_level) THEN
12834 fnd_log.string(l_log_statement,
12835 L_DEBUG_KEY,
12836 'Workorder Id(' || idx || '): ' || p_prd_workorder_tbl(idx).workorder_id);
12837 END IF;
12838
12839 OPEN get_wo_schedule_dates_cur(p_prd_workorder_tbl(idx).workorder_id);
12840 FETCH get_wo_schedule_dates_cur INTO get_wo_schedule_dates_rec;
12841 CLOSE get_wo_schedule_dates_cur;
12842
12843 OPEN get_task_dates_cur(p_prd_workorder_tbl(idx).workorder_id);
12844 FETCH get_task_dates_cur INTO get_task_dates_rec;
12845 CLOSE get_task_dates_cur;
12846
12847 --update the task start and end dates with workorder scheduled start/end dates.
12848 -- PRAKKUM :: Bug 9281476 :: 25-NOV-2010
12849 -- Commented out the below if condition
12850 -- Pass the scheduled dates also
12851 /*IF ((get_wo_schedule_dates_rec.scheduled_start_date <> get_task_dates_rec.start_date_time) OR
12852 (get_wo_schedule_dates_rec.scheduled_completion_date <> get_task_dates_rec.end_date_time)) THEN*/
12853 -- Do NOT pass visit master WO details (for which project task id is null) for the project tasks
12854 IF get_task_dates_rec.project_task_id IS NOT NULL THEN
12855 l_task_in_tbl(task_index).scheduled_start_date := trunc(get_wo_schedule_dates_rec.scheduled_start_date);
12856 l_task_in_tbl(task_index).scheduled_finish_date := trunc(get_wo_schedule_dates_rec.scheduled_completion_date);
12857 l_task_in_tbl(task_index).pa_task_id := get_task_dates_rec.project_task_id;
12858 l_task_in_tbl(task_index).task_start_date := trunc(get_wo_schedule_dates_rec.scheduled_start_date);
12859 l_task_in_tbl(task_index).task_completion_date := null;
12860 l_task_in_tbl(task_index).TASK_DESCRIPTION := get_task_dates_rec.description;
12861
12862 IF (l_log_statement >= l_log_current_level) THEN
12863 fnd_log.string(l_log_statement,
12864 L_DEBUG_KEY,
12865 'task_index = ' || task_index);
12866 fnd_log.string(l_log_statement,
12867 L_DEBUG_KEY,
12868 'pa_task_id = '|| l_task_in_tbl(task_index).pa_task_id);
12869 fnd_log.string(l_log_statement,
12870 L_DEBUG_KEY,
12871 'task_start_date = ' || l_task_in_tbl(task_index).task_start_date);
12872 fnd_log.string(l_log_statement,
12873 L_DEBUG_KEY,
12874 'task_completion_date = ' || l_task_in_tbl(task_index).task_completion_date);
12875 END IF;
12876 task_index := task_index + 1;
12877 END IF; -- project task id is not null
12878 --END IF; -- Dates are not same
12879 END LOOP; -- LOOP on p_prd_workorder_tbl
12880 END IF; -- l_pass_entire_structure Check
12881 -- End changes by jaramana on 23-SEP-2009 for the WBS ER 8674208 and the bug 9047048
12882 END IF; -- p_prd_workorder_tbl.count > 0
12883
12884 IF (l_log_statement >= l_log_current_level) THEN
12885 fnd_log.string(l_log_statement,
12886 L_DEBUG_KEY,
12887 'l_task_in_tbl.count = ' || l_task_in_tbl.count);
12888 END IF;
12889 --update the master visit wo also with the visit start/end times.
12890 IF l_task_in_tbl.count > 0 THEN
12891
12892 l_project_rec.PA_PROJECT_ID := visit_details_rec.project_id;
12893 --Fix for the Bug 7009212; rnahata truncated the task times
12894 IF visit_details_rec.top_project_task_id IS NULL THEN
12895 l_project_rec.START_DATE := trunc(visit_details_rec.start_date_time);
12896 ELSE
12897 OPEN get_prj_start_date_csr(visit_details_rec.project_id);
12898 FETCH get_prj_start_date_csr INTO l_project_rec.START_DATE;
12899 CLOSE get_prj_start_date_csr;
12900 END IF;
12901 l_project_rec.COMPLETION_DATE := null;--trunc(visit_details_rec.close_date_time);
12902 l_project_rec.SCHEDULED_START_DATE := trunc(visit_details_rec.start_date_time);
12903 --rnahata End
12904 IF (l_log_statement >= l_log_current_level) THEN
12905 fnd_log.string(l_log_statement,
12906 L_DEBUG_KEY,
12907 'Before calling PA_PROJECT_PUB.update_project');
12908 END IF;
12909
12910 --Now call update_project api to update the values in projects table
12911 PA_PROJECT_PUB.UPDATE_PROJECT(
12912 p_api_version_number => 1,
12913 p_commit => p_commit,
12914 p_msg_count => l_msg_count,
12915 p_msg_data => l_msg_data,
12916 p_return_status => l_return_status,
12917 p_workflow_started => l_workflow_started,
12918 p_pm_product_code => G_PM_PRODUCT_CODE,
12919 p_project_in => l_project_rec,
12920 p_project_out => l_project_out,
12921 p_key_members => l_key_members,
12922 p_class_categories => l_class_categories,
12923 p_tasks_in => l_task_in_tbl,
12924 -- Added by jaramana on 23-OCT-2009 for the WBS ER 8674208
12925 p_pass_entire_structure => l_pass_entire_structure,
12926 p_tasks_out => l_task_out);
12927
12928 IF (l_log_statement >= l_log_current_level) THEN
12929 fnd_log.string(l_log_statement,
12930 L_DEBUG_KEY,
12931 'After calling PA_PROJECT_PUB.update_project. Return Status = ' || l_return_status);
12932 END IF;
12933 x_return_status := l_return_status;
12934
12935 IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
12936 IF (l_log_statement >= l_log_current_level) THEN
12937 fnd_log.string(l_log_statement,
12938 L_DEBUG_KEY,
12939 'Errors from PA_PROJECT_PUB.update_project. Message count: ' ||
12940 l_msg_count || ', message data: ' || l_msg_data);
12941 END IF;
12942 IF l_return_status = FND_API.G_RET_STS_ERROR THEN
12943 RAISE FND_API.G_EXC_ERROR;
12944 ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
12945 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
12946 END IF;
12947 END IF; -- Return Status is not success
12948 END IF; -- l_task_in_tbl.count > 0
12949
12950 IF (l_log_procedure >= l_log_current_level) THEN
12951 fnd_log.string(l_log_procedure,
12952 L_DEBUG_KEY ||'.end',
12953 'At the end of PL SQL procedure. Return Status = ' || x_return_status);
12954 END IF;
12955
12956 EXCEPTION
12957 WHEN FND_API.G_EXC_ERROR THEN
12958 x_return_status := FND_API.G_RET_STS_ERROR;
12959 ROLLBACK TO Update_Project_Task_Times;
12960 FND_MSG_PUB.count_and_get(p_count => x_msg_count,
12961 p_data => x_msg_data,
12962 p_encoded => fnd_api.g_false);
12963
12964 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
12965 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
12966 ROLLBACK TO Update_Project_Task_Times;
12967 FND_MSG_PUB.count_and_get(p_count => x_msg_count,
12968 p_data => x_msg_data,
12969 p_encoded => fnd_api.g_false);
12970
12971 WHEN OTHERS THEN
12972 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
12973 ROLLBACK TO Update_Project_Task_Times;
12974 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
12975 fnd_msg_pub.add_exc_msg(p_pkg_name => G_PKG_NAME,
12976 p_procedure_name => 'Update_Project',
12977 p_error_text => SUBSTR(SQLERRM,1,500));
12978 END IF;
12979 FND_MSG_PUB.count_and_get(p_count => x_msg_count,
12980 p_data => x_msg_data,
12981 p_encoded => fnd_api.g_false);
12982
12983 END Update_Project_Task_Times;
12984 -- PRAKKUM :: PIE:FP :: 13-OCT-2010 :: END :: Modified this procedure
12985
12986 -- SATHAPLI, 05-Jun-2008 - Cursory analysis shows that this API Create_Job_Tasks is not in use anymore.
12987 -- Retaining the API code in the end of the package for any future references.
12988 --------------------------------------------------------------------
12989 -- PROCEDURE
12990 -- Create_Job_Tasks
12991 --
12992 -- PURPOSE
12993 --
12994 --
12995 --------------------------------------------------------------------
12996 PROCEDURE Create_Job_Tasks(
12997 p_api_version IN NUMBER :=1.0,
12998 p_init_msg_list IN VARCHAR2 := Fnd_Api.g_false,
12999 p_commit IN VARCHAR2 := Fnd_Api.g_false,
13000 p_validation_level IN NUMBER := Fnd_Api.g_valid_level_full,
13001 p_module_type IN VARCHAR2 := Null,
13002 p_x_task_Tbl IN OUT NOCOPY Task_Tbl_Type,
13003 x_return_status OUT NOCOPY VARCHAR2,
13004 x_msg_count OUT NOCOPY NUMBER,
13005 x_msg_data OUT NOCOPY VARCHAR2
13006 )
13007 IS
13008 L_API_VERSION CONSTANT NUMBER := 1.0;
13009 L_API_NAME CONSTANT VARCHAR2(30) := 'Create_Job_Tasks';
13010 L_DEBUG_KEY CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
13011 l_msg_count NUMBER;
13012 l_route_id NUMBER;
13013 l_job_ct NUMBER;
13014 i NUMBER;
13015 j NUMBER;
13016 z NUMBER;
13017 idx NUMBER;
13018 z_return_status VARCHAR2(1);
13019 l_return_status VARCHAR2(1);
13020 y_return_status VARCHAR2(1);
13021 l_flag VARCHAR2(1);
13022 l_status_flag VARCHAR2(1);
13023 l_msg_data VARCHAR2(2000);
13024 l_prd_workorder_tbl AHL_PRD_WORKORDER_PVT.PRD_WORKORDER_TBL;
13025 /* Begin Changes by Shkalyan */
13026 l_prd_workorder_rel_tbl AHL_PRD_WORKORDER_PVT.PRD_WORKORDER_REL_TBL;
13027 l_firm_planned_flag VARCHAR2(1) := FND_PROFILE.value('AHL_PRD_FIRM_PLANNED_FLAG');
13028 l_visit_wo_id NUMBER;
13029 l_visit_wo_ovn NUMBER;
13030 /* End Changes by Shkalyan */
13031 l_visit_end_time DATE;
13032 --
13033 -- To find count for tasks for visit
13034 CURSOR c_route (x_id IN NUMBER) IS
13035 SELECT Route_Id FROM AHL_MR_ROUTES_V
13036 WHERE MR_ROUTE_ID = x_id;
13037
13038 -- To find visit related information
13039 CURSOR c_visit (x_id IN NUMBER) IS
13040 SELECT * FROM AHL_VISITS_VL
13041 WHERE VISIT_ID = x_id;
13042 c_visit_rec c_visit%ROWTYPE;
13043
13044 -- To find task related information
13045 CURSOR c_task (x_id IN NUMBER) IS
13046 SELECT * FROM AHL_VISIT_TASKS_VL
13047 WHERE VISIT_TASK_ID = x_id ;
13048 c_task_rec c_task%ROWTYPE;
13049
13050 -- To find count for jobs tasks
13051 CURSOR c_job (x_id IN NUMBER) IS
13052 SELECT count(*) FROM AHL_WORKORDERS
13053 WHERE VISIT_TASK_ID = x_id
13054 AND STATUS_CODE not in ('22','7');
13055
13056 CURSOR c_chk_job (x_id IN NUMBER) IS
13057 SELECT * FROM AHL_WORKORDERS
13058 WHERE VISIT_TASK_ID = x_id
13059 AND STATUS_CODE not in ('22','7');
13060 c_chk_job_rec c_chk_job%ROWTYPE;
13061
13062 -- To find job for Visit
13063 CURSOR c_visit_job (x_id IN NUMBER) IS
13064 SELECT workorder_id, object_version_number
13065 FROM AHL_WORKORDERS
13066 WHERE VISIT_ID = x_id
13067 AND VISIT_TASK_ID IS NULL
13068 AND MASTER_WORKORDER_FLAG = 'Y'
13069 AND STATUS_CODE not in ('22','7');
13070
13071 --Post11510. Added to get summary task start, end time
13072 CURSOR get_summary_task_times_csr(p_task_id IN NUMBER)IS
13073 SELECT min(start_date_time), max(end_date_time)
13074 --TCHIMIRA::19-FEB-2010::BUG 9384614
13075 -- Use the base table instead of the vl view
13076 FROM ahl_visit_tasks_b VST
13077 START WITH visit_task_id = p_task_id
13078 AND NVL(VST.status_code, 'Y') <> NVL ('DELETED', 'X')
13079 CONNECT BY originating_task_id = PRIOR visit_task_id;
13080
13081 -- post 11.5.10
13082 -- yazhou Jul-20-2005 start
13083 CURSOR c_visit_task_exists(x_visit_id IN NUMBER)
13084 IS
13085 SELECT 'x'
13086 FROM ahl_visit_tasks_b
13087 WHERE visit_id = x_visit_id
13088 AND STATUS_CODE = 'PLANNING';
13089
13090 CURSOR c_get_wo_details(x_visit_id IN NUMBER)
13091 IS
13092 SELECT scheduled_start_date,
13093 SCHEDULED_COMPLETION_DATE
13094 FROM wip_discrete_jobs
13095 WHERE wip_entity_id =
13096 (
13097 SELECT
13098 wip_entity_id
13099 FROM ahl_workorders
13100 WHERE
13101 master_workorder_flag = 'Y' AND
13102 visit_task_id IS null AND
13103 status_code not in (22,7) and
13104 visit_id=x_visit_id
13105 );
13106 c_get_wo_details_rec c_get_wo_details%ROWTYPE;
13107
13108 l_dummy VARCHAR2(1);
13109 -- yazhou Jul-20-2005 end
13110 BEGIN
13111 --------------------- initialize -----------------------
13112 SAVEPOINT Create_Job_Tasks;
13113
13114 IF (l_log_procedure >= l_log_current_level) THEN
13115 fnd_log.string(l_log_procedure,L_DEBUG_KEY||'.begin','At the start of the PLSQL procedure');
13116 END IF;
13117
13118 -- Initialize message list if p_init_msg_list is set to TRUE.
13119 IF Fnd_Api.to_boolean(p_init_msg_list) THEN
13120 Fnd_Msg_Pub.initialize;
13121 END IF;
13122
13123 -- Initialize API return status to success
13124 x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
13125
13126 -- Standard call to check for call compatibility.
13127 IF NOT Fnd_Api.COMPATIBLE_API_CALL(l_api_version,
13128 p_api_version,
13129 l_api_name,G_PKG_NAME) THEN
13130 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
13131 END IF;
13132
13133 --------------------------- Start of Body -------------------------------------
13134 IF (l_log_statement >= l_log_current_level) THEN
13135 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Task table count = '||p_x_task_Tbl.COUNT);
13136 END IF;
13137
13138 IF (p_x_task_Tbl.COUNT > 0) THEN
13139 i := p_x_task_Tbl.FIRST;
13140
13141 IF (l_log_statement >= l_log_current_level) THEN
13142 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Visit Id= ' || p_x_task_Tbl(i).visit_id);
13143 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Task table value of Index i=' || i);
13144 END IF;
13145
13146 WHILE i IS NOT NULL LOOP
13147 p_x_task_Tbl(i).operation_flag := 'C';
13148
13149 OPEN c_visit (p_x_task_Tbl(i).visit_id);
13150 FETCH c_visit INTO c_visit_rec;
13151 CLOSE c_visit;
13152
13153 --IF c_task_rec.department_id IS NULL THEN
13154 IF c_visit_rec.department_id IS NOT NULL THEN
13155 p_x_task_Tbl(i).department_id := c_visit_rec.department_id ;
13156 ELSE
13157 p_x_task_Tbl(i).department_id := NULL ;
13158 END IF;
13159 --END IF;
13160
13161 IF (l_log_statement >= l_log_current_level) THEN
13162 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Before calling AHL_VWP_TASKS_PVT.Create_Task');
13163 END IF;
13164
13165 -- Call create Visit Task API
13166 AHL_VWP_TASKS_PVT.Create_Task (
13167 p_api_version => p_api_version,
13168 p_init_msg_list => Fnd_Api.g_false,
13169 p_validation_level => p_validation_level,
13170 p_module_type => 'SR', --p_module_type,
13171 p_x_task_rec => p_x_task_Tbl(i),
13172 x_return_status => x_return_status,
13173 x_msg_count => x_msg_count,
13174 x_msg_data => x_msg_data);
13175
13176 IF (l_log_statement >= l_log_current_level) THEN
13177 fnd_log.string(l_log_statement,L_DEBUG_KEY,'After calling AHL_VWP_TASKS_PVT.Create_Task - x_return_status = '|| x_return_status);
13178 END IF;
13179 EXIT WHEN x_return_status <> 'S';
13180 i:= p_x_task_Tbl.NEXT(i);
13181 END LOOP;
13182 END IF;
13183
13184 IF x_return_status <> 'S' THEN
13185 RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
13186 END IF;
13187
13188 IF (p_x_task_Tbl.COUNT > 0) THEN
13189 i := p_x_task_Tbl.FIRST;
13190 -- yazhou 15Aug2005 starts
13191 -- Bug# 4552764 fix
13192 OPEN c_visit (p_x_task_Tbl(i).visit_id);
13193 FETCH c_visit INTO c_visit_rec;
13194 CLOSE c_visit;
13195
13196 IF (l_log_statement >= l_log_current_level) THEN
13197 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Before calling AHL_VWP_TIMES_PVT.adjust_task_times');
13198 END IF;
13199
13200 IF c_visit_rec.start_date_time < SYSDATE THEN
13201 WHILE i IS NOT NULL
13202 LOOP
13203 AHL_VWP_TIMES_PVT.adjust_task_times(
13204 p_api_version => 1.0,
13205 p_init_msg_list => Fnd_Api.G_FALSE,
13206 p_commit => Fnd_Api.G_FALSE,
13207 p_validation_level => Fnd_Api.G_VALID_LEVEL_FULL,
13208 x_return_status => l_return_status,
13209 x_msg_count => l_msg_count,
13210 x_msg_data => l_msg_data,
13211 p_task_id => p_x_task_Tbl(i).visit_task_id,
13212 p_reset_sysdate_flag => FND_API.G_TRUE);
13213
13214 i:= p_x_task_Tbl.NEXT(i);
13215 END LOOP;
13216 END IF;
13217 --The visit end date
13218 l_visit_end_time := AHL_VWP_TIMES_PVT.get_visit_end_time(c_visit_rec.visit_id);
13219
13220 IF (l_log_statement >= l_log_current_level) THEN
13221 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);
13222 END IF;
13223 -- yazhou 15Aug2005 ends
13224 END IF;
13225
13226 -- yazhou 06Oct2005 starts
13227 -- bug fix #4658861
13228 OPEN c_get_wo_details(c_visit_rec.visit_id);
13229 FETCH c_get_wo_details into c_get_wo_details_rec;
13230 CLOSE c_get_wo_details;
13231 -- yazhou 06Oct2005 ends
13232 -- Post 11.5.10
13233 -- RROY
13234
13235 -- Yazhou Note: since we are checking for derived visit end time here, if there are other task in planning
13236 -- status with end date exceeding visit planned end date, then non-routine cannot be created
13237 IF TRUNC(l_visit_end_time) > TRUNC(c_visit_rec.close_date_time) THEN
13238 --yazhou Jul-20-2005 start
13239 -- Set visit status to partially released
13240 -- UPDATE AHL_VISITS_B SET STATUS_CODE = 'PARTIALLY RELEASED',
13241 -- OBJECT_VERSION_NUMBER = c_visit_rec.object_version_number + 1
13242 -- WHERE VISIT_ID = c_visit_rec.visit_id;
13243 --yazhou Jul-20-2005 end
13244
13245 -- yazhou Sep-15-2005 starts
13246 -- bug fix 4613220
13247 IF (p_x_task_Tbl.COUNT > 0) THEN
13248 i := p_x_task_Tbl.FIRST;
13249 END IF;
13250 -- Error Message
13251 FND_MESSAGE.Set_Name('AHL','AHL_VWP_CRT_JOB_ERR');
13252 Fnd_Message.Set_Token('TASK_NUMBER', p_x_task_tbl(i).visit_task_number);
13253 Fnd_Message.Set_Token('END_DATE', TRUNC(l_visit_end_time));
13254 -- yazhou Sep-15-2005 ends
13255 FND_MSG_PUB.ADD;
13256 -- yazhou 06Oct2005 starts
13257 -- bug fix #4658861
13258 -- Note: since we are checking for derived end time here, if there are other task in planning
13259 -- status with end date exceeding visit master WO end date, then non-routine cannot be created
13260
13261 ELSIF TRUNC(l_visit_end_time) > TRUNC(c_get_wo_details_rec.scheduled_completion_date) THEN
13262 -- Error Message
13263 Fnd_Message.SET_NAME('AHL','AHL_VWP_DATE_EXCD_WO_DATE');
13264 Fnd_Message.Set_Token('VISIT_END_DATE', l_visit_end_time);
13265 FND_MSG_PUB.ADD;
13266 -- yazhou 06Oct2005 ends
13267 ELSE
13268 -- Start for 11.5.10 release
13269 -- By shbhanda 05-Jun-03
13270 -- For creating/updating Master Workorder in production for the visit in VWP
13271 idx := 1;
13272 /* Begin Changes by Shkalyan */
13273 l_prd_workorder_tbl(idx).MASTER_WORKORDER_FLAG := 'Y';
13274 l_prd_workorder_tbl(idx).BATCH_ID := c_visit_rec.visit_number;
13275 l_prd_workorder_tbl(idx).HEADER_ID := 0; -- Visit
13276
13277 OPEN c_visit_job (c_visit_rec.visit_id);
13278 FETCH c_visit_job INTO l_visit_wo_id, l_visit_wo_ovn;
13279 CLOSE c_visit_job;
13280
13281 IF l_visit_wo_id IS NOT NULL THEN
13282 l_prd_workorder_tbl(idx).DML_OPERATION := 'U';
13283 l_prd_workorder_tbl(idx).WORKORDER_ID := l_visit_wo_id;
13284 l_prd_workorder_tbl(idx).OBJECT_VERSION_NUMBER := l_visit_wo_ovn;
13285 ELSE
13286 l_prd_workorder_tbl(idx).DML_OPERATION := 'C';
13287 l_prd_workorder_tbl(idx).STATUS_CODE := '1';
13288 l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG := 1; -- Firm
13289 END IF;
13290 /* End Changes by Shkalyan */
13291
13292 l_prd_workorder_tbl(idx).VISIT_ID := c_visit_rec.visit_id;
13293 l_prd_workorder_tbl(idx).ORGANIZATION_ID := c_visit_rec.organization_id;
13294 l_prd_workorder_tbl(idx).PROJECT_ID := c_visit_rec.project_id;
13295 l_prd_workorder_tbl(idx).DEPARTMENT_ID := c_visit_rec.department_id ;
13296 l_prd_workorder_tbl(idx).INVENTORY_ITEM_ID := c_visit_rec.inventory_item_id ;
13297 l_prd_workorder_tbl(idx).ITEM_INSTANCE_ID := c_visit_rec.item_instance_id ;
13298 l_prd_workorder_tbl(idx).SCHEDULED_START_DATE := c_visit_rec.start_date_time;
13299 --l_prd_workorder_tbl(idx).SCHEDULED_END_DATE := l_visit_end_time;
13300 -- Changed by Shbhanda on 30th Jan 04
13301 l_prd_workorder_tbl(idx).SCHEDULED_END_DATE := c_visit_rec.close_date_time;
13302 l_prd_workorder_tbl(idx).JOB_DESCRIPTION := c_visit_rec.visit_name ;
13303
13304 idx := idx + 1;
13305
13306 IF (p_x_task_Tbl.COUNT > 0) THEN
13307 i := p_x_task_Tbl.FIRST;
13308 j := 0;
13309
13310 WHILE i IS NOT NULL LOOP
13311 -- Call create WIP Job API
13312 OPEN c_job(p_x_task_Tbl(i).visit_task_id);
13313 FETCH c_job INTO l_job_ct;
13314 CLOSE c_job;
13315
13316 IF (l_log_statement >= l_log_current_level) THEN
13317 fnd_log.string(l_log_statement,L_DEBUG_KEY,'For job count = ' || l_job_ct);
13318 END IF;
13319
13320 IF l_job_ct > 0 THEN
13321 i := i + 1;
13322 ELSE
13323 OPEN c_task(p_x_task_Tbl(i).visit_task_id);
13324 FETCH c_task INTO c_task_rec;
13325 CLOSE c_task;
13326
13327 /* Begin Changes by Shkalyan */
13328 -- Form the Workorder Relationship Parenting to the Visit
13329 l_prd_workorder_rel_tbl(idx-1).DML_OPERATION := 'C';
13330 l_prd_workorder_rel_tbl(idx-1).PARENT_HEADER_ID := 0; -- Visit
13331 l_prd_workorder_rel_tbl(idx-1).CHILD_HEADER_ID := c_task_rec.visit_task_number;
13332 l_prd_workorder_rel_tbl(idx-1).BATCH_ID := c_visit_rec.visit_number;
13333 l_prd_workorder_rel_tbl(idx-1).RELATIONSHIP_TYPE := 1;
13334
13335 -- Form the Workorder Record
13336 l_prd_workorder_tbl(idx).DML_OPERATION := 'C';
13337 l_prd_workorder_tbl(idx).MASTER_WORKORDER_FLAG := 'N';
13338 l_prd_workorder_tbl(idx).BATCH_ID := c_visit_rec.visit_number;
13339 l_prd_workorder_tbl(idx).HEADER_ID := c_task_rec.visit_task_number;
13340 /* End Changes by Shkalyan */
13341
13342 l_prd_workorder_tbl(idx).VISIT_ID := c_visit_rec.visit_id;
13343 l_prd_workorder_tbl(idx).ORGANIZATION_ID := c_visit_rec.organization_id;
13344 l_prd_workorder_tbl(idx).PROJECT_ID := c_visit_rec.project_id;
13345 l_prd_workorder_tbl(idx).STATUS_CODE := '1';
13346 l_prd_workorder_tbl(idx).INVENTORY_ITEM_ID := c_task_rec.inventory_item_id ;
13347 l_prd_workorder_tbl(idx).ITEM_INSTANCE_ID := c_task_rec.instance_id ;
13348 l_prd_workorder_tbl(idx).VISIT_TASK_ID := c_task_rec.visit_task_id ;
13349 l_prd_workorder_tbl(idx).VISIT_TASK_NUMBER := c_task_rec.visit_task_number ;
13350 l_prd_workorder_tbl(idx).PROJECT_TASK_ID := c_task_rec.project_task_id ;
13351 l_prd_workorder_tbl(idx).JOB_DESCRIPTION := c_task_rec.visit_task_name ;
13352
13353 IF c_task_rec.department_id IS NOT NULL AND c_task_rec.department_id <> FND_API.g_miss_num THEN
13354 l_prd_workorder_tbl(idx).DEPARTMENT_ID := c_task_rec.department_id ;
13355 ELSE
13356 l_prd_workorder_tbl(idx).DEPARTMENT_ID := c_visit_rec.department_id ;
13357 END IF;
13358
13359 IF c_task_rec.mr_route_id IS NOT NULL AND c_task_rec.mr_route_id <> FND_API.g_miss_num THEN
13360 OPEN c_route (c_task_rec.mr_route_id);
13361 FETCH c_route INTO l_route_id;
13362 CLOSE c_route;
13363 l_prd_workorder_tbl(idx).ROUTE_ID := l_route_id ;
13364 ELSE
13365 l_prd_workorder_tbl(idx).ROUTE_ID := Null;
13366 END IF;
13367
13368 --POST11510 cxcheng. If summary task, use the min,max for sub tasks
13369 IF (c_task_rec.task_type_code = 'SUMMARY') THEN
13370 OPEN get_summary_task_times_csr(c_task_rec.visit_task_id);
13371 FETCH get_summary_task_times_csr INTO l_prd_workorder_tbl(idx).SCHEDULED_START_DATE,
13372 l_prd_workorder_tbl(idx).SCHEDULED_END_DATE ;
13373 CLOSE get_summary_task_times_csr;
13374 ELSE
13375 l_prd_workorder_tbl(idx).SCHEDULED_START_DATE := c_task_rec.start_date_time;
13376 l_prd_workorder_tbl(idx).SCHEDULED_END_DATE := c_task_rec.end_date_time;
13377 END IF;
13378
13379 /* Begin Changes by Shkalyan */
13380 IF (l_firm_planned_flag IS NOT NULL AND
13381 -- SKPATHAK :: ER: 9147951 :: 11-JAN-2010
13382 -- For task with past task dates, WOs are always firm irrespective of the profile value
13383 c_task_rec.past_task_start_date IS NULL AND
13384 l_firm_planned_flag = '2') THEN
13385 l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG := 2; -- Planned
13386 ELSE
13387 l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG := 1; -- Firm
13388 END IF;
13389 /* End Changes by Shkalyan */
13390 idx := idx + 1;
13391 i := p_x_task_Tbl.NEXT(i);
13392 END IF;
13393 END LOOP;
13394 END IF;
13395
13396 IF l_prd_workorder_tbl.COUNT > 0 THEN
13397 IF (l_log_statement >= l_log_current_level) THEN
13398 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Before calling AHL_PRD_WORKORDER_PVT.Process_Jobs');
13399 END IF;
13400
13401 /* Begin Changes by Shkalyan */
13402 AHL_PRD_WORKORDER_PVT.Process_Jobs
13403 (p_api_version => p_api_version,
13404 p_init_msg_list => p_init_msg_list,
13405 p_commit => Fnd_Api.g_false,
13406 p_validation_level => p_validation_level,
13407 p_default => FND_API.G_TRUE,
13408 p_module_type => p_module_type,
13409 x_return_status => x_return_status,
13410 x_msg_count => x_msg_count,
13411 x_msg_data => x_msg_data,
13412 p_x_prd_workorder_tbl => l_prd_workorder_tbl,
13413 p_prd_workorder_rel_tbl => l_prd_workorder_rel_tbl
13414 );
13415 /* End Changes by Shkalyan */
13416 IF (l_log_statement >= l_log_current_level) THEN
13417 fnd_log.string(l_log_statement,L_DEBUG_KEY,'After calling AHL_PRD_WORKORDER_PVT.Process_Jobs - x_return_status = '||x_return_status);
13418 END IF;
13419
13420 IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
13421 RAISE Fnd_Api.G_EXC_ERROR;
13422 END IF;
13423 END IF; -- To find if the visit has any tasks
13424
13425 IF (p_x_task_Tbl.COUNT > 0) THEN
13426 i := p_x_task_Tbl.FIRST;
13427 WHILE i IS NOT NULL LOOP
13428 OPEN c_chk_job(p_x_task_Tbl(i).visit_task_id);
13429 FETCH c_chk_job INTO c_chk_job_rec;
13430 CLOSE c_chk_job;
13431
13432 p_x_task_Tbl(i).workorder_id := c_chk_job_rec.workorder_id;
13433
13434 --yazhou Jul-18-2005 start
13435 -- Fix for bug # 4078095
13436 UPDATE AHL_VISIT_TASKS_B
13437 SET STATUS_CODE = 'RELEASED',
13438 OBJECT_VERSION_NUMBER = OBJECT_VERSION_NUMBER + 1
13439 WHERE VISIT_TASK_ID = p_x_task_Tbl(i).visit_task_id
13440 AND STATUS_CODE = 'PLANNING';
13441 --yazhou Jul-18-2005 end
13442 i := p_x_task_Tbl.NEXT(i);
13443 END LOOP;
13444 END IF;
13445
13446 IF (l_log_statement >= l_log_current_level) THEN
13447 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Updated visit to Released..');
13448 END IF;
13449 --yazhou Jul-20-2005 start
13450
13451 OPEN c_visit_task_exists(c_visit_rec.visit_id);
13452 FETCH c_visit_task_exists INTO l_dummy;
13453
13454 OPEN c_get_wo_details(c_visit_rec.visit_id);
13455 FETCH c_get_wo_details into c_get_wo_details_rec;
13456 IF (c_visit_task_exists%NOTFOUND and
13457 c_visit_rec.start_date_time = c_get_wo_details_rec.scheduled_start_date and
13458 c_visit_rec.close_date_time = c_get_wo_details_rec.scheduled_completion_date) THEN
13459 UPDATE ahl_visits_b
13460 SET status_code = 'RELEASED',
13461 object_version_number = object_version_number + 1
13462 WHERE visit_id = c_visit_rec.visit_id;
13463
13464 IF (l_log_statement >= l_log_current_level) THEN
13465 fnd_log.string(l_log_statement,L_DEBUG_KEY,'Before updating the task flag');
13466 END IF;
13467
13468 IF c_visit_rec.any_task_chg_flag = 'Y' THEN
13469 AHL_VWP_RULES_PVT.Update_Visit_Task_Flag
13470 (p_visit_id => c_visit_rec.visit_id,
13471 p_flag => 'N',
13472 x_return_status => x_return_status);
13473 END IF;
13474 END IF;
13475 CLOSE c_visit_task_exists;
13476 CLOSE c_get_wo_details;
13477 END IF;
13478 -- yazhou Jul-20-2005 end
13479 -- RROY
13480 ---------------------------End of Body-------------------------------------
13481 -- END of API body.
13482 -- Standard check of p_commit.
13483
13484 IF Fnd_Api.To_Boolean (p_commit) THEN
13485 COMMIT WORK;
13486 END IF;
13487
13488 Fnd_Msg_Pub.count_and_get(
13489 p_encoded => Fnd_Api.g_false,
13490 p_count => x_msg_count,
13491 p_data => x_msg_data);
13492
13493 IF (l_log_procedure >= l_log_current_level) THEN
13494 fnd_log.string(l_log_procedure,L_DEBUG_KEY||'.end','At the end of the PLSQL procedure');
13495 END IF;
13496
13497 EXCEPTION
13498 WHEN Fnd_Api.g_exc_error THEN
13499 ROLLBACK TO Create_Job_Tasks;
13500 x_return_status := Fnd_Api.g_ret_sts_error;
13501 Fnd_Msg_Pub.count_and_get (
13502 p_encoded => Fnd_Api.g_false,
13503 p_count => x_msg_count,
13504 p_data => x_msg_data
13505 );
13506 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
13507 ROLLBACK TO Create_Job_Tasks;
13508 x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
13509 Fnd_Msg_Pub.count_and_get (
13510 p_encoded => Fnd_Api.g_false,
13511 p_count => x_msg_count,
13512 p_data => x_msg_data
13513 );
13514 WHEN OTHERS THEN
13515 ROLLBACK TO Create_Job_Tasks;
13516 x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
13517 IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_unexp_error)
13518 THEN
13519 Fnd_Msg_Pub.add_exc_msg (G_PKG_NAME, l_api_name);
13520 END IF;
13521 Fnd_Msg_Pub.count_and_get (
13522 p_encoded => Fnd_Api.g_false,
13523 p_count => x_msg_count,
13524 p_data => x_msg_data
13525 );
13526 END Create_Job_Tasks;
13527
13528 --PRAKKUM :: PIE :: 13-OCT-2010 :: START
13529 -------------------------------------------------------------------
13530 -- Procedure name : Add_Task_To_Project_Int
13531 -- Type : Private
13532 -- Function : New helper function to call from Add_MR_to_Project
13533 -- Parameters :
13534 -- Add_Task_To_Project_Int Parameters
13535 -- p_project_id IN NUMBER Required
13536 -- p_project_number IN VARCHAR2 Required
13537 -- p_task_number IN VARCHAR2 Required
13538 -- p_task_reference IN VARCHAR2 Required
13539 -- p_task_name IN VARCHAR2 Required
13540 -- p_task_description IN VARCHAR2 Required
13541 -- p_task_start_date IN DATE Required
13542 -- p_task_completion_date IN DATE Required
13543 -- p_parent_task_reference IN VARCHAR2 Required
13544 -- x_task_id OUT NOCOPY NUMBER Required
13545 --
13546 -- Standard OUT Parameters :
13547 -- x_return_status OUT VARCHAR2 Required
13548 -- x_msg_count OUT NUMBER Required
13549 -- x_msg_data OUT VARCHAR2 Required
13550 --
13551 -- Version :
13552 -------------------------------------------------------------------
13553 PROCEDURE Add_Task_To_Project_Int(
13554 p_project_id IN NUMBER,
13555 p_project_number IN VARCHAR2,
13556 p_task_number IN VARCHAR2,
13557 p_task_reference IN VARCHAR2,
13558 p_task_name IN VARCHAR2,
13559 p_long_task_name IN VARCHAR2,
13560 p_task_description IN VARCHAR2,
13561 p_task_start_date IN DATE,
13562 p_task_completion_date IN DATE,
13563 p_parent_task_reference IN VARCHAR2,
13564 p_service_type_code IN VARCHAR2,
13565 x_return_status OUT NOCOPY VARCHAR2,
13566 x_msg_count OUT NOCOPY NUMBER,
13567 x_msg_data OUT NOCOPY VARCHAR2,
13568 x_task_id OUT NOCOPY NUMBER
13569 )
13570 IS
13571 L_API_NAME CONSTANT VARCHAR2(30) := 'Add_Task_To_Project_Int';
13572 L_FULL_NAME CONSTANT VARCHAR2(60) := G_PKG_NAME || '.' || L_API_NAME;
13573 L_DEBUG_KEY CONSTANT VARCHAR2(100) := 'ahl.plsql.' || L_FULL_NAME;
13574
13575 l_msg_count NUMBER;
13576 l_msg_data VARCHAR2(2000);
13577 l_return_status VARCHAR2(1);
13578 l_project_tsk_flag VARCHAR2(1);
13579 l_proj_ref_flag VARCHAR2(1);
13580 l_pa_project_number_out VARCHAR2(25);
13581 l_pa_project_id_out NUMBER;
13582 l_task_id NUMBER;
13583 l_msg_index_out NUMBER;
13584
13585 BEGIN
13586
13587 IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level) THEN
13588 fnd_log.string(fnd_log.level_procedure,L_DEBUG_KEY||'.begin', 'At the start of plsql procedure.');
13589 END IF;
13590
13591 PA_PROJECT_PUB.Check_Unique_Task_Number(
13592 p_api_version_number => 1,
13593 p_init_msg_list => 'F',
13594 p_return_status => l_return_status,
13595 p_msg_count => l_msg_count,
13596 p_msg_data => l_msg_data,
13597 p_project_id => p_project_id,
13598 p_pm_project_reference => p_project_number,
13599 p_task_number => p_task_number,
13600 p_unique_task_number_flag => l_project_tsk_flag) ;
13601
13602 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
13603 fnd_log.string(fnd_log.level_statement, L_DEBUG_KEY, 'After calling PA_PROJECT_PUB.Check_Unique_Task_Number - l_project_tsk_flag : '|| l_project_tsk_flag);
13604 fnd_log.string(fnd_log.level_statement, L_DEBUG_KEY, 'Before calling PA_PROJECT_PUB.Check_Unique_Task_Reference');
13605 END IF;
13606
13607 PA_PROJECT_PUB.Check_Unique_Task_Reference(
13608 p_api_version_number => 1,
13609 p_init_msg_list => 'F',
13610 p_return_status => l_return_status,
13611 p_msg_count => l_msg_count,
13612 p_msg_data => l_msg_data,
13613 p_project_id => p_project_id,
13614 p_pm_project_reference => p_project_number,
13615 p_pm_task_reference => p_task_reference,
13616 p_unique_task_ref_flag => l_proj_ref_flag);
13617
13618 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
13619 fnd_log.string(fnd_log.level_statement, L_DEBUG_KEY, 'After calling PA_PROJECT_PUB.Check_Unique_Task_Reference - l_proj_ref_flag = ' || l_proj_ref_flag);
13620 END IF;
13621
13622 IF l_project_tsk_flag = 'Y' AND l_proj_ref_flag = 'Y' THEN
13623 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
13624 fnd_log.string(fnd_log.level_statement, L_DEBUG_KEY, 'Before calling PA_PROJECT_PUB.ADD_TASK:');
13625 fnd_log.string(fnd_log.level_statement, L_DEBUG_KEY, 'p_project_id: ' || p_project_id);
13626 fnd_log.string(fnd_log.level_statement, L_DEBUG_KEY, 'p_project_number :' || p_project_number);
13627 fnd_log.string(fnd_log.level_statement, L_DEBUG_KEY, 'p_task_number: ' || p_task_number);
13628 fnd_log.string(fnd_log.level_statement, L_DEBUG_KEY, 'p_task_name: ' || p_task_name);
13629 fnd_log.string(fnd_log.level_statement, L_DEBUG_KEY, 'p_task_description: ' || p_task_description);
13630 fnd_log.string(fnd_log.level_statement, L_DEBUG_KEY, 'p_parent_task_reference: ' || p_parent_task_reference);
13631 END IF;
13632
13633 PA_PROJECT_PUB.ADD_TASK(
13634 p_api_version_number => 1
13635 ,p_commit => 'F'
13636 ,p_init_msg_list => 'F'
13637 ,p_msg_count => l_msg_count
13638 ,p_msg_data => l_msg_data
13639 ,p_return_status => l_return_status
13640 ,p_pm_product_code => G_PM_PRODUCT_CODE
13641 ,p_pa_project_id => p_project_id
13642 ,p_pm_task_reference => p_task_reference
13643 ,p_pa_task_number => p_task_number
13644 ,p_task_name => p_task_name
13645 ,p_long_task_name => p_long_task_name
13646 ,p_task_description => p_task_description
13647 ,p_task_start_date => p_task_start_date
13648 ,p_task_completion_date => null--p_task_completion_date
13649 ,p_pm_parent_task_reference => p_parent_task_reference
13650 ,p_service_type_code => p_service_type_code
13651 ,p_pa_project_id_out => l_pa_project_id_out
13652 ,p_pa_project_number_out => l_pa_project_number_out
13653 ,p_task_id => l_task_id);
13654
13655 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
13656 fnd_log.string(fnd_log.level_statement, L_DEBUG_KEY, 'After calling PA_PROJECT_PUB.ADD_TASK, l_return_status: ' || l_return_status ||
13657 ', Returned Task Id: ' || l_task_id);
13658 END IF;
13659 x_return_status := l_return_status ;
13660
13661 IF (l_return_status = 'S') THEN
13662 x_task_id := l_task_id; -- Assign the OUT paramater
13663 END IF;
13664 ELSIF l_project_tsk_flag = 'N' AND l_proj_ref_flag = 'Y' THEN
13665 x_return_status := Fnd_Api.g_ret_sts_error;
13666 IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_error) THEN
13667 Fnd_Message.set_name ('AHL', 'AHL_VWP_PROJ_TSK_NUM_NOT_UNIQ');
13668 Fnd_Msg_Pub.ADD;
13669 END IF;
13670 ELSIF l_project_tsk_flag = 'Y' AND l_proj_ref_flag = 'N' THEN
13671 x_return_status := Fnd_Api.g_ret_sts_error;
13672 IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_error) THEN
13673 Fnd_Message.set_name ('AHL', 'AHL_VWP_PROJ_TSK_REF_NOT_UNIQ');
13674 Fnd_Msg_Pub.ADD;
13675 END IF;
13676 ELSE
13677 x_return_status := Fnd_Api.g_ret_sts_error;
13678 IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_error) THEN
13679 Fnd_Message.set_name ('AHL', 'AHL_VWP_PROJ_TASK_NOT_UNIQUE');
13680 Fnd_Msg_Pub.ADD;
13681 END IF;
13682 END IF;
13683 IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level) THEN
13684 fnd_log.string(fnd_log.level_procedure,L_DEBUG_KEY||'.end','At the end of plsql procedure');
13685 END IF;
13686
13687
13688 END Add_Task_To_Project_Int;
13689
13690
13691
13692 -------------------------------------------------------------------
13693 -- Procedure name : Update_Project_Task
13694 -- Type : Private
13695 -- Function : To update the project tasks hierarchy
13696 -- whenever visit task's cost parent is updated.
13697 -- Parameters :
13698 -- Update_Project_Task_Times Parameters
13699 -- p_task_id IN NUMBER Required
13700 --
13701 -- Standard OUT Parameters :
13702 -- x_return_status OUT VARCHAR2 Required
13703 -- x_msg_count OUT NUMBER Required
13704 -- x_msg_data OUT VARCHAR2 Required
13705 --
13706 -- Version :
13707 -------------------------------------------------------------------
13708 PROCEDURE Update_Project_Task(
13709 p_task_id IN NUMBER,
13710 x_return_status OUT NOCOPY VARCHAR2,
13711 x_msg_count OUT NOCOPY NUMBER,
13712 x_msg_data OUT NOCOPY VARCHAR2
13713 )
13714 IS
13715 L_API_NAME CONSTANT VARCHAR2(30) := 'Update_Project_Task';
13716 L_FULL_NAME CONSTANT VARCHAR2(60) := G_PKG_NAME || '.' || L_API_NAME;
13717 L_DEBUG_KEY CONSTANT VARCHAR2(100) := 'ahl.plsql.' || L_FULL_NAME;
13718
13719 l_msg_count NUMBER;
13720 l_msg_data VARCHAR2(2000);
13721 l_return_status VARCHAR2(1);
13722 l_project_id NUMBER;
13723 l_project_task_id NUMBER;
13724 l_pm_product_code VARCHAR2(3) := 'AHL';
13725 l_pm_parent_task_reference VARCHAR2(30);
13726 l_project_parent_task_id NUMBER;
13727 l_out_pa_task_id NUMBER;
13728 l_out_pm_task_reference VARCHAR2(30);
13729 l_update_task_structure VARCHAR2(1) := 'N';
13730 l_dummy VARCHAR2(1);
13731
13732
13733 --To validate visit task id
13734 Cursor validate_vst_tsk_id_csr (c_task_id IN NUMBER) IS
13735 SELECT 'X'
13736 FROM ahl_visit_tasks_b
13737 WHERE visit_task_id = c_task_id
13738 AND status_code <> 'DELETED';
13739
13740 --To find the project task details
13741 CURSOR get_prj_tsk_details_csr (c_task_id IN NUMBER) IS
13742 SELECT avt.project_task_id, avt.task_type_code,
13743 avt.cost_parent_id, pt.project_id, pt.top_task_id
13744 FROM ahl_visit_tasks_b avt, pa_tasks pt
13745 WHERE avt.project_task_id = pt.task_id
13746 AND avt.visit_task_id = c_task_id ;
13747 get_prj_tsk_details_csr_rec get_prj_tsk_details_csr%ROWTYPE;
13748
13749 --To find the project task id and visit task type of the cost parent
13750 CURSOR get_cost_parent_details_csr (cost_parent_task_id IN NUMBER) IS
13751 SELECT project_task_id, task_type_code
13752 FROM ahl_visit_tasks_b
13753 WHERE visit_task_id = cost_parent_task_id ;
13754 get_cost_parent_details_rec get_cost_parent_details_csr%ROWTYPE;
13755
13756
13757 --To find the project parent roll-up task of a project transaction task
13758 CURSOR get_prj_parent_tsk_csr (c_project_task_id IN NUMBER) IS
13759 SELECT parent_task_id
13760 FROM pa_tasks
13761 WHERE task_id = c_project_task_id;
13762
13763 BEGIN
13764
13765 SAVEPOINT Update_Project_Task;
13766
13767 IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level) THEN
13768 fnd_log.string(fnd_log.level_procedure,L_DEBUG_KEY||'.begin', 'At the start of plsql procedure.');
13769 END IF;
13770
13771 OPEN validate_vst_tsk_id_csr(p_task_id);
13772 FETCH validate_vst_tsk_id_csr INTO l_dummy;
13773 IF validate_vst_tsk_id_csr%NOTFOUND THEN
13774 Fnd_Message.SET_NAME('AHL', 'AHL_VWP_TASK_ID_INVALID');
13775 Fnd_Message.SET_TOKEN('VISIT_TASK_ID', p_task_id);
13776 Fnd_Msg_Pub.ADD;
13777 CLOSE validate_vst_tsk_id_csr;
13778 RAISE Fnd_Api.G_EXC_ERROR;
13779 END IF;
13780 CLOSE validate_vst_tsk_id_csr;
13781
13782 OPEN get_prj_tsk_details_csr(p_task_id);
13783 FETCH get_prj_tsk_details_csr INTO get_prj_tsk_details_csr_rec;
13784 l_project_id := get_prj_tsk_details_csr_rec.project_id;
13785 IF get_prj_tsk_details_csr_rec.task_type_code <> 'SUMMARY' THEN
13786 -- If the visit task is a non-summary task,
13787 -- change the parent of its roll-up task corresponding to this non-summary project task
13788 OPEN get_prj_parent_tsk_csr(get_prj_tsk_details_csr_rec.project_task_id);
13789 FETCH get_prj_parent_tsk_csr INTO l_project_task_id;
13790 CLOSE get_prj_parent_tsk_csr;
13791 ELSE --task_type_code <> 'SUMMARY'
13792 l_project_task_id := get_prj_tsk_details_csr_rec.project_task_id;
13793 END IF; --task_type_code <> 'SUMMARY'
13794 IF get_prj_tsk_details_csr_rec.cost_parent_id IS NULL THEN
13795 IF get_prj_tsk_details_csr_rec.top_task_id IS NULL THEN
13796 l_project_parent_task_id := NULL;
13797 ELSE
13798 l_project_parent_task_id := get_prj_tsk_details_csr_rec.top_task_id;
13799 END IF;
13800 ELSE --cost parent is null
13801 OPEN get_cost_parent_details_csr(get_prj_tsk_details_csr_rec.cost_parent_id);
13802 FETCH get_cost_parent_details_csr INTO get_cost_parent_details_rec;
13803 CLOSE get_cost_parent_details_csr;
13804 IF get_cost_parent_details_rec.task_type_code <> 'SUMMARY' THEN
13805 -- If the cost parent is a non-summary task,
13806 -- make the parent roll-up task corresponding to this task as the parent
13807 OPEN get_prj_parent_tsk_csr(get_cost_parent_details_rec.project_task_id);
13808 FETCH get_prj_parent_tsk_csr INTO l_project_parent_task_id;
13809 CLOSE get_prj_parent_tsk_csr;
13810 ELSE
13811 l_project_parent_task_id := get_cost_parent_details_rec.project_task_id;
13812 END IF;
13813 END IF; --cost parent is null
13814 CLOSE get_prj_tsk_details_csr;
13815
13816
13817 PA_PROJECT_PUB.UPDATE_TASK(
13818 p_api_version_number => 1,
13819 p_commit => 'F',
13820 p_init_msg_list => 'F',
13821 p_msg_count => l_msg_count,
13822 p_msg_data => l_msg_data,
13823 p_return_status => l_return_status,
13824 p_pa_project_id => l_project_id,
13825 p_pa_task_id => l_project_task_id,
13826 p_pm_product_code => l_pm_product_code,
13827 p_pa_parent_task_id => l_project_parent_task_id,
13828 p_out_pa_task_id => l_out_pa_task_id,
13829 p_out_pm_task_reference => l_out_pm_task_reference,
13830 p_update_task_structure => l_update_task_structure);
13831
13832
13833 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
13834 fnd_log.string(fnd_log.level_statement, L_DEBUG_KEY, 'After calling PA_PROJECT_PUB.ADD_TASK, l_return_status: ' || l_return_status ||
13835 ', Returned Task Id: ' || l_out_pa_task_id ||
13836 ', Returned Task Reference: ' || l_out_pm_task_reference);
13837 END IF;
13838 x_return_status := l_return_status ;
13839
13840 IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
13841 IF (l_log_statement >= l_log_current_level) THEN
13842 fnd_log.string(l_log_statement,
13843 L_DEBUG_KEY,
13844 'Errors from PA_PROJECT_PUB.update_project. Message count: ' ||
13845 l_msg_count || ', message data: ' || l_msg_data);
13846 END IF;
13847 IF l_return_status = FND_API.G_RET_STS_ERROR THEN
13848 RAISE FND_API.G_EXC_ERROR;
13849 ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
13850 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
13851 END IF;
13852 END IF; -- Return Status is not success
13853 IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level) THEN
13854 fnd_log.string(fnd_log.level_procedure,L_DEBUG_KEY||'.end','At the end of plsql procedure');
13855 END IF;
13856
13857
13858
13859 EXCEPTION
13860 WHEN FND_API.G_EXC_ERROR THEN
13861 x_return_status := FND_API.G_RET_STS_ERROR;
13862 ROLLBACK TO Update_Project_Task;
13863 FND_MSG_PUB.count_and_get(p_count => x_msg_count,
13864 p_data => x_msg_data,
13865 p_encoded => fnd_api.g_false);
13866
13867 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
13868 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
13869 ROLLBACK TO Update_Project_Task;
13870 FND_MSG_PUB.count_and_get(p_count => x_msg_count,
13871 p_data => x_msg_data,
13872 p_encoded => fnd_api.g_false);
13873
13874 WHEN OTHERS THEN
13875 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
13876 ROLLBACK TO Update_Project_Task;
13877 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
13878 fnd_msg_pub.add_exc_msg(p_pkg_name => G_PKG_NAME,
13879 p_procedure_name => 'Update_Project',
13880 p_error_text => SUBSTR(SQLERRM,1,500));
13881 END IF;
13882 FND_MSG_PUB.count_and_get(p_count => x_msg_count,
13883 p_data => x_msg_data,
13884 p_encoded => fnd_api.g_false);
13885
13886 END Update_Project_Task;
13887
13888
13889 -------------------------------------------------------------------
13890 -- Procedure name : Use_New_Task_Structure
13891 -- Type : Private
13892 -- Function : To determine whether the new structure should be used for
13893 -- the project tasks. It is a helper function that will be
13894 -- used by other APIs in this package.
13895 -- Parameters :
13896 -- Standard IN Parameters :
13897 -- p_commit IN VARCHAR2 Fnd_Api.G_FALSE
13898 --
13899 -- Update_Project_Task_Times Parameters :
13900 -- p_visit_id IN NUMBER Required
13901 --
13902 -- Standard OUT Parameters :
13903 -- x_return_status OUT VARCHAR2 Required
13904 -- x_msg_count OUT NUMBER Required
13905 -- x_msg_data OUT VARCHAR2 Required
13906 --
13907 -- Version :
13908 -------------------------------------------------------------------
13909 PROCEDURE Use_New_Task_Structure
13910 ( p_visit_id IN NUMBER,
13911 x_new_structure_flag OUT NOCOPY VARCHAR2
13912 )
13913 IS
13914 L_API_NAME CONSTANT VARCHAR2(30) := 'Use_New_Task_Structure';
13915 L_FULL_NAME CONSTANT VARCHAR2(60) := G_PKG_NAME || '.' || L_API_NAME;
13916 L_DEBUG_KEY CONSTANT VARCHAR2(100) := 'ahl.plsql.' || L_FULL_NAME;
13917
13918 l_msg_count NUMBER;
13919 l_msg_data VARCHAR2(2000);
13920 l_return_status VARCHAR2(1);
13921 l_project_parent_task_id NUMBER;
13922 l_is_comp_visit VARCHAR2(1);
13923
13924
13925 --To find the visit details
13926 CURSOR get_vst_prj_details_csr (c_visit_id IN NUMBER) IS
13927 SELECT project_id, project_template_id
13928 FROM ahl_visits_b
13929 WHERE visit_id = c_visit_id ;
13930 get_vst_prj_details_csr_rec get_vst_prj_details_csr%ROWTYPE;
13931
13932 -- PRAKKUM :: FPBug 16481709 for BaseBug 14828418 :: 07/11/2012 :: START
13933 -- Changed query to get count of visit tasks that have parent (discarding project tasks that not associated to visit task)
13934 --To find the parent task ids of the project tasks
13935 /*CURSOR get_parent_prj_tsk_id_csr (x_project_id IN NUMBER) IS
13936 SELECT parent_task_id
13937 FROM pa_tasks
13938 WHERE project_id = x_project_id ;*/
13939
13940 CURSOR get_parent_prj_tsk_id_csr (c_project_id IN NUMBER) IS
13941 SELECT count(PTSK.parent_task_id)
13942 FROM pa_tasks PTSK, AHL_VISIT_TASKS_B VTSK
13943 WHERE
13944 VTSK.PROJECT_TASK_ID = PTSK.TASK_ID
13945 AND VTSK.VISIT_ID = p_visit_id
13946 AND PTSK.project_id = c_project_id ;
13947
13948 l_tasks_with_parent NUMBER := 0;
13949 -- PRAKKUM :: FPBug 16481709 for BaseBug 14828418 :: 07/11/2012 :: END
13950
13951 -- SKPATHAK :: 07-OCT-2011 :: VWPE ER: 12856858
13952 --To find the count of the project tasks
13953 CURSOR get_project_task_count (x_project_id IN NUMBER) IS
13954 SELECT count(*)
13955 FROM pa_tasks
13956 WHERE project_id = x_project_id ;
13957 l_count NUMBER;
13958
13959 -- SKPATHAK :: Bug 14016007 :: 03-MAY-2012 ::
13960 -- To find if the visit has a STAGE task
13961 CURSOR get_stage_task_count (c_visit_id IN NUMBER) IS
13962 SELECT count(visit_task_id)
13963 FROM ahl_visit_tasks_b
13964 WHERE task_type_code = 'STAGE'
13965 AND status_code <> 'DELETED'
13966 AND visit_id = c_visit_id;
13967
13968 l_stage_task_count NUMBER;
13969
13970
13971 BEGIN
13972
13973 IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level) THEN
13974 fnd_log.string(fnd_log.level_procedure,L_DEBUG_KEY||'.begin', 'At the start of plsql procedure.');
13975 END IF;
13976
13977 -- SKPATHAK :: Bug 14016007 :: 03-MAY-2012 :: START
13978 -- Component Visits always have new structure and similarly visits with stage tasks will always have new structure
13979 l_is_comp_visit := AHL_CMP_UTIL_PKG.Is_Comp_Visit (p_visit_id);
13980 IF (l_log_statement >= l_log_current_level) THEN
13981 fnd_log.string(l_log_statement,L_DEBUG_KEY,'p_visit_id ** l_is_comp_visit--@> '||p_visit_id||' ** '||l_is_comp_visit);
13982 END IF;
13983
13984 OPEN get_stage_task_count(p_visit_id);
13985 FETCH get_stage_task_count INTO l_stage_task_count;
13986 CLOSE get_stage_task_count;
13987
13988 IF (l_log_statement >= l_log_current_level) THEN
13989 fnd_log.string(l_log_statement,L_DEBUG_KEY,'l_is_comp_visit ** l_stage_task_count--@> '||l_is_comp_visit||' ** '||l_stage_task_count);
13990 END IF;
13991 IF ((l_is_comp_visit = 'Y') OR (l_stage_task_count > 0)) THEN
13992 x_new_structure_flag := 'Y';
13993 RETURN;
13994 END IF;
13995 -- SKPATHAK :: Bug 14016007 :: 03-MAY-2012 :: END
13996
13997 OPEN get_vst_prj_details_csr(p_visit_id);
13998 FETCH get_vst_prj_details_csr INTO get_vst_prj_details_csr_rec;
13999 -- SKPATHAK :: 07-SEP-2011 :: VWPE ER: 12856858
14000 -- If there are no project tasks in the project, it necessarily is a new visit
14001 OPEN get_project_task_count(get_vst_prj_details_csr_rec.project_id);
14002 FETCH get_project_task_count INTO l_count;
14003 IF l_count = 0 THEN
14004 x_new_structure_flag := 'Y';
14005 CLOSE get_project_task_count;
14006 RETURN;
14007 END IF;
14008 CLOSE get_project_task_count;
14009
14010 IF ((get_vst_prj_details_csr_rec.project_id IS NOT NULL)
14011 AND (get_vst_prj_details_csr_rec.project_template_id IS NOT NULL))
14012 THEN
14013 x_new_structure_flag := 'N';
14014 -- PRAKKUM :: FPBug 16481709 for BaseBug 14828418 :: 07/11/2012 :: START
14015 /*OPEN get_parent_prj_tsk_id_csr(get_vst_prj_details_csr_rec.project_id);
14016 LOOP
14017 FETCH get_parent_prj_tsk_id_csr INTO l_project_parent_task_id;
14018 EXIT WHEN get_parent_prj_tsk_id_csr%NOTFOUND;
14019 IF l_project_parent_task_id IS NOT NULL THEN
14020 x_new_structure_flag := 'Y';
14021 END IF;
14022 END LOOP;
14023 CLOSE get_parent_prj_tsk_id_csr;*/
14024
14025 -- As we are not passing any project task details which are not associated to any visit task
14026 -- to Projects API while handling Update Project in Type 4 mode, set new structure flag to 'Y'
14027 -- only if any visit project task have parent relationship
14028 OPEN get_parent_prj_tsk_id_csr(get_vst_prj_details_csr_rec.project_id);
14029 FETCH get_parent_prj_tsk_id_csr INTO l_tasks_with_parent;
14030 CLOSE get_parent_prj_tsk_id_csr;
14031
14032 IF (l_log_statement >= l_log_current_level) THEN
14033 fnd_log.string(l_log_statement,L_DEBUG_KEY,'project_id ** l_tasks_with_parent--@> '||get_vst_prj_details_csr_rec.project_id||' ** '||l_tasks_with_parent);
14034 END IF;
14035
14036 IF l_tasks_with_parent >0 THEN
14037 x_new_structure_flag := 'Y';
14038 END IF;
14039 -- PRAKKUM :: FPBug 16481709 for BaseBug 14828418 :: 07/11/2012 :: END
14040
14041 ELSE
14042 x_new_structure_flag := 'Y';
14043 END IF;
14044 CLOSE get_vst_prj_details_csr;
14045
14046 IF (l_log_statement >= l_log_current_level) THEN
14047 fnd_log.string(l_log_statement,L_DEBUG_KEY,'x_new_structure_flag--@> '||x_new_structure_flag);
14048 END IF;
14049
14050 IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level) THEN
14051 fnd_log.string(fnd_log.level_procedure,L_DEBUG_KEY||'.end','At the end of plsql procedure');
14052 END IF;
14053
14054 END Use_New_Task_Structure;
14055
14056 -- To sort a table of Project Tasks by their display_sequence. Nulls are treated as 99999999.
14057 PROCEDURE Sort_Task_Table (p_x_task_tbl IN OUT NOCOPY PA_PROJECT_PUB.TASK_IN_TBL_TYPE) IS
14058 L_API_NAME CONSTANT VARCHAR2(30) := 'Sort_Task_Table';
14059 L_FULL_NAME CONSTANT VARCHAR2(60) := G_PKG_NAME || '.' || L_API_NAME;
14060 L_DEBUG CONSTANT VARCHAR2(100) := 'ahl.plsql.' || L_FULL_NAME;
14061 l_temp_rec PA_PROJECT_PUB.TASK_IN_REC_TYPE;
14062 BEGIN
14063 IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level) THEN
14064 fnd_log.string(fnd_log.level_procedure, L_DEBUG||'.begin', 'At the start of plsql procedure. p_x_task_tbl.COUNT = ' || p_x_task_tbl.COUNT);
14065 END IF;
14066 IF p_x_task_tbl.COUNT > 0 THEN
14067 FOR i in p_x_task_tbl.FIRST .. p_x_task_tbl.LAST LOOP
14068 FOR j in p_x_task_tbl.FIRST .. p_x_task_tbl.LAST - 1 LOOP
14069 IF NVL(p_x_task_tbl(j).display_sequence, 99999999) > NVL(p_x_task_tbl(j+1).display_sequence, 99999999) THEN
14070 -- Swap
14071 l_temp_rec := p_x_task_tbl(j+1);
14072 p_x_task_tbl(j+1) := p_x_task_tbl(j);
14073 p_x_task_tbl(j) := l_temp_rec;
14074 END IF;
14075 END LOOP; -- j loop
14076 END LOOP; -- i loop
14077 END IF;
14078
14079 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
14080 IF p_x_task_tbl.COUNT > 0 THEN
14081 fnd_log.string(fnd_log.level_statement, L_DEBUG, 'List of Project Tasks after sorting');
14082 FOR i in p_x_task_tbl.FIRST .. p_x_task_tbl.LAST LOOP
14083 fnd_log.string(fnd_log.level_statement, L_DEBUG, ' PA_TASK_ID --@>'||p_x_task_tbl(i).PA_TASK_ID ||
14084 ' PA_PARENT_TASK_ID --@>'||p_x_task_tbl(i).PA_PARENT_TASK_ID ||
14085 ' PM_TASK_REFERENCE --@>'||p_x_task_tbl(i).PM_TASK_REFERENCE ||
14086 ' PM_PARENT_TASK_REFERENCE --@>'||p_x_task_tbl(i).PM_PARENT_TASK_REFERENCE ||
14087 ' TASK_NAME --@>'||p_x_task_tbl(i).TASK_NAME ||
14088 ' LONG_TASK_NAME --@>'||p_x_task_tbl(i).LONG_TASK_NAME ||
14089 ' PA_TASK_NUMBER --@>'||p_x_task_tbl(i).PA_TASK_NUMBER ||
14090 ' TASK_START_DATE --@>'||p_x_task_tbl(i).TASK_START_DATE ||
14091 ' TASK_COMPLETION_DATE --@>'||p_x_task_tbl(i).TASK_COMPLETION_DATE ||
14092 ' DISPLAY_SEQUENCE --@>'||p_x_task_tbl(i).DISPLAY_SEQUENCE);
14093 END LOOP; -- i loop
14094 fnd_log.string(fnd_log.level_statement, L_DEBUG, 'End of Project Tasks');
14095 END IF;
14096 END IF;
14097
14098 IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level) THEN
14099 fnd_log.string(fnd_log.level_procedure, L_DEBUG||'.end', 'Exiting Procedure.');
14100 END IF;
14101 END Sort_Task_Table;
14102
14103 --PRAKKUM :: PIE :: 13-OCT-2010 :: END
14104
14105 -- salogan added for supplier warranty starts
14106 ------------------------------------------------------------------------------------
14107 -- Start of Comments
14108 -- Procedure name : Get_Entl_rec_for_Delete
14109 -- Type : Private
14110 -- Function : To delete the corresponding entitlement record of the Visit Task.
14111 -- If for an sr id in entitlement record, the corresponding visit task id is null,
14112 -- that means there was an MR attached to the NR.
14113 -- So we need to delete only such entitlement records
14114 -- Pre-reqs :
14115 -- Parameters : p_visit_id IN NUMBER
14116 -- : x_warranty_entl_tbl OUT AHL_WARRANTY_ENTL_PVT.Warranty_Entl_Tbl_Type
14117 --
14118 -- End of Comments
14119
14120 PROCEDURE Get_Entl_rec_for_delete(
14121 p_visit_id IN NUMBER,
14122 x_warranty_entl_tbl OUT NOCOPY AHL_WARRANTY_ENTL_PVT.Warranty_Entl_Tbl_Type
14123 ) IS
14124
14125 -- Standard variables
14126 L_API_NAME CONSTANT VARCHAR2(30) := 'Get_Entl_rec_for_Delete';
14127 L_DEBUG_KEY CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
14128 -- Local variables defined for the procedure
14129 l_warranty_entl_id NUMBER := null;
14130 l_task_id NUMBER := null;
14131 l_sr_incident_id NUMBER := null;
14132 i NUMBER :=0;
14133 l_entitlement_rec AHL_WARRANTY_ENTL_PVT.Warranty_Entl_Rec_Type;
14134
14135 --Cursors defined for the procedure
14136 --Cursor to fetch entitlement details based on Sr Incident Id
14137 CURSOR c_get_entl_details (c_sr_incident_id IN NUMBER) IS
14138 SELECT AWSE.WARRANTY_ENTITLEMENT_ID, AWSE.VISIT_TASK_ID
14139 FROM AHL_WARRANTY_ENTITLEMENTS AWSE
14140 WHERE AWSE.SR_INCIDENT_ID = c_sr_incident_id;
14141
14142 --Cursor to fetch SR Id's of Visit
14143 CURSOR get_sr_ids (c_visit_id IN NUMBER) IS
14144 SELECT DISTINCT service_request_id
14145 FROM ahl_visit_tasks_b
14146 WHERE visit_id = c_visit_id;
14147
14148
14149 BEGIN
14150 --------------------Start of API Body-----------------------------------
14151 IF(l_log_procedure >= l_log_current_level) THEN
14152 fnd_log.string(l_log_procedure,
14153 L_DEBUG_KEY ||'.begin',
14154 'At the start of PL SQL procedure.');
14155 END IF;
14156
14157 --------------------Get Entitlements Record For Update-------------------
14158 IF(p_visit_id is null) THEN
14159 IF(l_log_statement >= l_log_current_level) THEN
14160 fnd_log.string(l_log_statement,
14161 L_DEBUG_KEY,
14162 'Passed visit id is null');
14163 END IF;
14164 FND_MSG_PUB.add;
14165 END IF;
14166
14167 OPEN get_sr_ids(p_visit_id);
14168 LOOP
14169 FETCH get_sr_ids into l_sr_incident_id;
14170 EXIT WHEN get_sr_ids%NOTFOUND;
14171 OPEN c_get_entl_details(l_sr_incident_id);
14172 FETCH c_get_entl_details into l_warranty_entl_id, l_task_id;
14173 IF(c_get_entl_details%FOUND AND l_task_id IS NULL) THEN --warranty entitlement exists
14174 l_entitlement_rec.warranty_entitlement_id := l_warranty_entl_id;
14175 l_entitlement_rec.operation_flag := AHL_WARRANTY_ENTL_PVT.G_OP_DELETE;
14176 x_warranty_entl_tbl(i) := l_entitlement_rec;
14177 END IF;
14178 CLOSE c_get_entl_details;
14179 i := i+1;
14180 END LOOP;
14181 CLOSE get_sr_ids;
14182
14183 IF(l_log_procedure >= l_log_current_level) THEN
14184 fnd_log.string(l_log_procedure,
14185 L_DEBUG_KEY ||'.End',
14186 'End of API.');
14187 END IF;
14188
14189 END Get_Entl_rec_for_Delete;
14190 -- salogan added for supplier warranty ends
14191
14192 -- SKPATHAK :: 02-MAY-2011 :: VWPE: ER:12424063 :: STARTS
14193 -------------------------------------------------------------------
14194 -- Procedure name : Plan_visit
14195 -- Type : Private
14196 -- Function : Procedure to plan a visit i.e. to move the visit from draft to planning status
14197 -- and create draft WOs for all its tasks
14198 -- Parameters :
14199 --
14200 -- Standard IN Parameters :
14201 -- p_api_version IN NUMBER Required
14202 -- p_init_msg_list IN VARCHAR2 Default FND_API.G_FALSE
14203 -- p_validation_level IN NUMBER Default FND_API.G_VALID_LEVEL_FULL
14204 --
14205 -- Standard OUT Parameters :
14206 -- x_return_status OUT VARCHAR2 Required
14207 -- x_msg_count OUT NUMBER Required
14208 -- x_msg_data OUT VARCHAR2 Required
14209 --
14210 -- plan_visit Parameters:
14211 -- p_visit_id IN NUMBER Required
14212 -- p_caller IN VARCHAR2 Default Null
14213 -- P_caller can be either JAVA or FORMS depending on whether this API i called from JAVA layer orthrough forms
14214 --------------------------------------------------------------------------------------------------------------------
14215 PROCEDURE plan_visit (
14216 p_api_version IN NUMBER := 1.0,
14217 p_init_msg_list IN VARCHAR2 := FND_API.G_FALSE,
14218 p_commit IN VARCHAR2 := FND_API.G_FALSE,
14219 p_validation_level IN NUMBER := FND_API.G_VALID_LEVEL_FULL,
14220 p_caller IN VARCHAR2 := NULL,
14221 p_visit_id IN NUMBER,
14222 x_return_status OUT NOCOPY VARCHAR2,
14223 x_msg_count OUT NOCOPY NUMBER,
14224 x_msg_data OUT NOCOPY VARCHAR2)IS
14225
14226 -- Local Variables
14227
14228 -- Standard in/out parameters
14229 l_api_name VARCHAR2(30) := 'PLAN_VISIT';
14230 l_api_version NUMBER := 1.0;
14231 l_msg_count NUMBER;
14232 l_msg_data VARCHAR2(2000);
14233 l_return_status VARCHAR2(1);
14234 l_init_msg_list VARCHAR2(10):= p_init_msg_list;
14235
14236 l_release_visit_required VARCHAR2(1) :='N';
14237 l_status_code VARCHAR2(80);
14238 l_dummy VARCHAR2(1);
14239 l_visit_number NUMBER;
14240 l_release_flag VARCHAR2(1) :='N';
14241
14242 Cursor get_visit_status (x_visit_id IN NUMBER)
14243 IS
14244 SELECT status_code, visit_number
14245 FROM ahl_visits_b
14246 WHERE visit_id = x_visit_id;
14247
14248 BEGIN
14249
14250 IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level)THEN
14251 fnd_log.string
14252 (
14253 fnd_log.level_procedure,
14254 'ahl.plsql.AHL_VWP_PROJ_PROD_PVT.plan_visit.begin',
14255 'At the start of PLSQL procedure, Visit ID : ' || p_visit_id
14256 );
14257 END IF;
14258
14259 -- Standard start of API savepoint
14260 SAVEPOINT plan_visit_pvt;
14261
14262 -- Initialize message list if p_init_msg_list is set to TRUE
14263
14264 IF FND_API.To_Boolean( p_init_msg_list) THEN
14265 FND_MSG_PUB.Initialize;
14266 END IF;
14267
14268 -- Initialize API return status to success
14269 x_return_status := FND_API.G_RET_STS_SUCCESS;
14270
14271 -- Standard call to check for call compatibility.
14272 IF NOT Fnd_Api.COMPATIBLE_API_CALL(l_api_version,
14273 p_api_version,
14274 l_api_name,G_PKG_NAME)
14275 THEN
14276 RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
14277 END IF;
14278
14279 -- make sure that visit id is present in the input
14280 IF(p_visit_id IS NULL OR p_visit_id = FND_API.G_MISS_NUM) THEN
14281 FND_MESSAGE.Set_Name(G_PM_PRODUCT_CODE,'AHL_VWP_CST_INPUT_MISS');
14282 FND_MSG_PUB.ADD;
14283
14284 IF (fnd_log.level_exception >= fnd_log.g_current_runtime_level)THEN
14285 fnd_log.string
14286 (
14287 fnd_log.level_exception,
14288 'ahl.plsql.AHL_VWP_PROJ_PROD_PVT.plan_visit',
14289 'Visit id is mandatory but found null in input '
14290 );
14291 END IF;
14292 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
14293 END IF;
14294
14295 OPEN get_visit_status(p_visit_id);
14296 FETCH get_visit_status INTO l_status_code, l_visit_number;
14297 CLOSE get_visit_status;
14298
14299 IF(l_status_code IS NULL ) THEN
14300 FND_MESSAGE.Set_Name(G_PM_PRODUCT_CODE,'AHL_VISIT_ID_INVALID');
14301 FND_MSG_PUB.ADD;
14302
14303 IF (fnd_log.level_exception >= fnd_log.g_current_runtime_level)THEN
14304 fnd_log.string
14305 (
14306 fnd_log.level_exception,
14307 'ahl.plsql.AHL_VWP_PROJ_PROD_PVT.plan_visit',
14308 'Input Visit id is INVALID '
14309 );
14310 END IF;
14311 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
14312 END IF;
14313
14314 -- We need to call release_visit only if all the visit tasks already do NOT have corresponding WOs
14315 -- If they already have WOs, just updating the visit status is sufficient
14316 AHL_VWP_VISIT_CST_PR_PVT.check_for_release_visit
14317 (
14318 p_visit_id =>p_visit_id,
14319 x_release_visit_required =>l_release_visit_required
14320 );
14321
14322 -- If the caller is JAVA, this is called from bg_release_visit and validation has already been done
14323 -- So pass release flag as 'U' so as not to do the validation again in Release_visit
14324 IF p_caller = 'JAVA' THEN
14325 l_release_flag := 'U';
14326 END IF;
14327
14328 -- Release visit if required
14329 -- SKPATHAK :: 20-JUN-2011 :: VWPE: ER:12673125
14330 -- If caller is create stage task API, then necessarily call RELEASE_VISIT
14331 IF l_release_visit_required ='Y' OR p_caller IN ('STG','UNA') THEN
14332
14333 IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level) THEN
14334 fnd_log.string
14335 (
14336 fnd_log.level_procedure,
14337 'ahl.plsql.'||g_pkg_name||'.'||l_api_name||':',
14338 'Before calling ahl vwp proj prod pvt.release visit'
14339 );
14340 END IF;
14341
14342 AHL_VWP_PROJ_PROD_PVT.RELEASE_VISIT (
14343 p_api_version => l_api_version,
14344 p_init_msg_list => Fnd_Api.g_false,
14345 p_commit => Fnd_Api.g_false,
14346 p_validation_level => p_validation_level,
14347 p_module_type => 'CST',
14348 p_visit_id => p_visit_id,
14349 p_release_flag => l_release_flag,
14350 x_return_status => l_return_status,
14351 x_msg_count => l_msg_count,
14352 x_msg_data => l_msg_data);
14353
14354 IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level) THEN
14355 fnd_log.string
14356 (
14357 fnd_log.level_procedure,
14358 'ahl.plsql.'||g_pkg_name||'.'||l_api_name||': End API',
14359 'After calling ahl vwp proj prod pvt.Release Visit : '|| l_return_status
14360 );
14361 END IF;
14362
14363 END IF; -- released required flag
14364
14365 IF l_return_status = 'V' THEN
14366 x_return_status := l_return_status;
14367 -- Check Error Message stack.
14368 ELSIF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
14369 x_msg_count := l_msg_count;
14370 x_return_status := l_return_status;
14371 IF l_return_status = Fnd_Api.g_ret_sts_error THEN
14372 RAISE Fnd_Api.g_exc_error;
14373 ELSIF l_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
14374 RAISE Fnd_Api.g_exc_unexpected_error;
14375 END IF;
14376 ELSE
14377 IF l_status_code = 'DRAFT' THEN
14378 UPDATE AHL_VISITS_B
14379 SET STATUS_CODE = 'PLANNING',
14380 OBJECT_VERSION_NUMBER = OBJECT_VERSION_NUMBER + 1,
14381 LAST_UPDATE_DATE = SYSDATE,
14382 LAST_UPDATED_BY = Fnd_Global.USER_ID,
14383 LAST_UPDATE_LOGIN = Fnd_Global.LOGIN_ID
14384 WHERE VISIT_ID = p_visit_id;
14385 END IF;
14386
14387 END IF;
14388
14389 -- PRAKKUM :: 13-FEB-2011 :: Bug 13711800 :: START
14390 IF (l_log_statement >= l_log_current_level) THEN
14391 fnd_log.string(l_log_statement,'ahl.plsql.'||g_pkg_name||'.'||l_api_name||': End API','Before calling AHL_VWP_VISITS_STAGES_PVT.VALIDATE_STAGE_DATES ');
14392 END IF;
14393
14394 AHL_VWP_VISITS_STAGES_PVT.VALIDATE_STAGE_DATES( p_visit_id => p_visit_id,
14395 x_return_status => l_return_status,
14396 x_msg_count => l_msg_count,
14397 x_msg_data => l_msg_data);
14398
14399 IF (l_log_statement >= l_log_current_level) THEN
14400 fnd_log.string(l_log_statement,'ahl.plsql.'||g_pkg_name||'.'||l_api_name||': End API','After calling AHL_VWP_VISITS_STAGES_PVT.VALIDATE_STAGE_DATES - l_return_status : '||l_return_status);
14401 END IF;
14402
14403 IF l_msg_count > 0 OR NVL(l_return_status,'x') <> FND_API.G_RET_STS_SUCCESS THEN
14404 x_msg_count := l_msg_count;
14405 x_return_status := l_return_status;
14406 IF l_return_status = Fnd_Api.g_ret_sts_error THEN
14407 RAISE Fnd_Api.g_exc_error;
14408 ELSIF l_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
14409 RAISE Fnd_Api.g_exc_unexpected_error;
14410 END IF;
14411 END IF;
14412 -- PRAKKUM :: 13-FEB-2011 :: Bug 13711800 :: END
14413
14414 IF Fnd_Api.To_Boolean (p_commit) THEN
14415 COMMIT WORK;
14416 END IF;
14417
14418 Fnd_Msg_Pub.count_and_get(
14419 p_encoded => Fnd_Api.g_false,
14420 p_count => x_msg_count,
14421 p_data => x_msg_data
14422 );
14423
14424 IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level)THEN
14425 fnd_log.string
14426 (
14427 fnd_log.level_procedure,
14428 'ahl.plsql.AHL_VWP_PROJ_PROD_PVT.plan_visit.end',
14429 'At the end of PLSQL procedure'
14430 );
14431 END IF;
14432
14433 EXCEPTION
14434
14435 WHEN FND_API.G_EXC_ERROR THEN
14436
14437 x_return_status := FND_API.G_RET_STS_ERROR;
14438 ROLLBACK TO plan_visit_pvt;
14439 FND_MSG_PUB.count_and_get( p_count => x_msg_count,
14440 p_data => x_msg_data,
14441 p_encoded => fnd_api.g_false);
14442
14443 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
14444 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
14445 ROLLBACK TO plan_visit_pvt;
14446 FND_MSG_PUB.count_and_get( p_count => x_msg_count,
14447 p_data => x_msg_data,
14448 p_encoded => fnd_api.g_false);
14449
14450 WHEN OTHERS THEN
14451 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
14452 ROLLBACK TO plan_visit_pvt;
14453
14454 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
14455 fnd_msg_pub.add_exc_msg(p_pkg_name => G_PKG_NAME,
14456 p_procedure_name => 'plan_visit',
14457 p_error_text => SUBSTR(SQLERRM,1,500));
14458 END IF;
14459
14460 FND_MSG_PUB.count_and_get( p_count => x_msg_count,
14461 p_data => x_msg_data,
14462 p_encoded => fnd_api.g_false);
14463 END Plan_visit;
14464
14465 -------------------------------------------------------------------
14466 -- Procedure name : Push_stages_to_production
14467 -- Type : Private
14468 -- Function : Push the selected stages to production.
14469 -- Parameters :
14470 --
14471 -- Standard IN Parameters :
14472 -- p_api_version IN NUMBER Required
14473 -- p_init_msg_list IN VARCHAR2 Default FND_API.G_FALSE
14474 -- p_validation_level IN NUMBER Default FND_API.G_VALID_LEVEL_FULL
14475 -- p_module_type IN VARCHAR2 Default Null
14476 --
14477 -- Standard OUT Parameters :
14478 -- x_return_status OUT VARCHAR2 Required
14479 -- x_msg_count OUT NUMBER Required
14480 -- x_msg_data OUT VARCHAR2 Required
14481 --
14482 -- Push_stages_to_production Parameters:
14483 -- p_module_type IN VARCHAR2 Default = NULL
14484 -- p_visit_id IN NUMBER Required
14485 -- p_stages_tbl IN Visit_Stages_Tbl_Type Required
14486 -- p_release_flag IN VARCHAR2 Default = 'N'
14487 --
14488 -------------------------------------------------------------------
14489
14490 PROCEDURE Push_stages_to_production(
14491 p_api_version IN NUMBER,
14492 p_init_msg_list IN VARCHAR2 := Fnd_Api.g_false,
14493 p_commit IN VARCHAR2 := FND_API.G_FALSE,
14494 p_validation_level IN NUMBER := Fnd_Api.g_valid_level_full,
14495 p_module_type IN VARCHAR2 := Null,
14496 p_visit_id IN NUMBER,
14497 p_stages_tbl IN AHL_VWP_VISITS_STAGES_PVT.Visit_Stages_Tbl_Type,
14498 p_release_flag IN VARCHAR2 ,
14499 x_return_status OUT NOCOPY VARCHAR2,
14500 x_msg_count OUT NOCOPY NUMBER,
14501 x_msg_data OUT NOCOPY VARCHAR2
14502 ) IS
14503
14504 --fetch master work order for the visit
14505 CURSOR c_visit_master_wo (c_visit_id IN NUMBER) IS
14506 SELECT wo.workorder_id, wo.status_code, wip.scheduled_start_date,wip.scheduled_completion_date,wo.object_version_number
14507 FROM ahl_visits_b v, ahl_workorders wo, wip_discrete_jobs wip
14508 WHERE v.visit_id = c_visit_id
14509 AND v.visit_id = wo.visit_id
14510 AND wo.visit_task_id IS NULL
14511 AND wo.master_workorder_flag = 'Y'
14512 AND wip.wip_entity_id = wo.wip_entity_id
14513 AND wo.status_code not in ('22','7');
14514
14515 l_mst_wo_visit_rec c_visit_master_wo%ROWTYPE;
14516
14517 --fetch visit details
14518 CURSOR c_visit_dtl (c_visit_id IN NUMBER) IS
14519 SELECT * FROM ahl_visits_vl
14520 WHERE visit_id = c_visit_id;
14521
14522 l_visit_dtl_rec c_visit_dtl%ROWTYPE;
14523
14524 --fetch work order for the task
14525 CURSOR c_task_wo (c_visit_id IN NUMBER,c_visit_task_id IN NUMBER) IS
14526 SELECT wo.visit_task_id, wo.workorder_id, wo.status_code, wip.scheduled_start_date,wip.scheduled_completion_date,wo.object_version_number
14527 FROM ahl_workorders wo, wip_discrete_jobs wip
14528 WHERE wo.visit_id = c_visit_id
14529 AND wo.visit_task_id = c_visit_task_id
14530 AND wip.wip_entity_id = wo.wip_entity_id
14531 AND wo.status_code not in ('22','7');
14532 l_task_wo_rec c_task_wo%ROWTYPE;
14533
14534 --fetch summary task flag for the task
14535 CURSOR c_fet_sum_task_flg (c_visit_id IN NUMBER, c_visit_task_id IN NUMBER) IS
14536 SELECT summary_task_flag FROM ahl_visit_tasks_b
14537 WHERE visit_task_id = c_visit_task_id;
14538
14539 --get summary task start, end time
14540 CURSOR get_summary_task_times_csr(c_task_id IN NUMBER)IS
14541 SELECT min(start_date_time), max(end_date_time)
14542 FROM ahl_visit_tasks_b VST
14543 START WITH visit_task_id = c_task_id
14544 AND NVL(VST.status_code, 'Y') <> 'DELETED'
14545 CONNECT BY originating_task_id = PRIOR visit_task_id;
14546
14547 --find Route Id from MR Routes view
14548 CURSOR c_route (c_mr_route_id IN NUMBER) IS
14549 SELECT Route_Id FROM AHL_MR_ROUTES_V
14550 WHERE MR_ROUTE_ID = c_mr_route_id;
14551
14552 --Inventory item id and instance id to be defaulted when
14553 --the item and instance are not specified at the header level
14554 CURSOR default_task_inst_dtls(c_task_id IN NUMBER) IS
14555 SELECT inventory_item_id,instance_id
14556 FROM ahl_visit_tasks_b
14557 WHERE visit_task_id = c_task_id;
14558 def_task_inst_rec default_task_inst_dtls%ROWTYPE;
14559
14560 --Fetches the route information for updating workorder
14561 --description for tasks created from Routes
14562 CURSOR get_wo_dtls_for_mrtasks_cur (p_task_id IN NUMBER) IS
14563 SELECT ar.route_no||'.'||substrb(ar.title,1,(240 - (lengthb(ar.route_no) + 1))) workorder_description
14564 FROM ahl_routes_vl ar,ahl_visit_tasks_b avt, ahl_mr_routes mrr
14565 WHERE avt.visit_task_id = p_task_id
14566 and nvl(avt.status_code,'Y') = 'PLANNING'
14567 and avt.mr_route_id = mrr.mr_route_id
14568 and mrr.route_id = ar.route_id;
14569 l_wo_dtls_for_mrtasks_rec get_wo_dtls_for_mrtasks_cur%ROWTYPE;
14570
14571 --check if all the children of a summary task are in released/unreleased status
14572 CURSOR chk_summary_task_child(c_task_id IN NUMBER) IS
14573 SELECT 'PARTIALLY RELEASED' FROM ahl_visit_tasks_b
14574 WHERE task_type_code IN ('PLANNED','UNPLANNED')
14575 AND status_code = 'PLANNING'
14576 START WITH visit_task_id = c_task_id
14577 CONNECT BY PRIOR visit_task_id = originating_task_id;
14578 l_chk_status_code VARCHAR2(80);
14579
14580
14581 --check if visit has planned tasks
14582 CURSOR c_visit_has_planned_tasks(p_visit_id IN NUMBER) IS
14583 SELECT 1 FROM ahl_visit_tasks_b
14584 WHERE visit_id = p_visit_id
14585 AND status_code = 'PLANNING'
14586 -- SATRAJEN :: Bug 13930098 :: Visit stays at PARTIALLY IMPLEMENTED status :: Do NOT consider the default stage task :: July 2012
14587 AND (TASK_TYPE_CODE <> 'STAGE'
14588 OR (STAGE_ID IS NOT NULL AND TASK_TYPE_CODE = 'STAGE'));
14589
14590 CURSOR c_visit_time_matches_MWO_time(p_visit_id IN NUMBER) IS
14591 SELECT 1
14592 FROM ahl_visits_b vst, ahl_workorders wo, wip_discrete_jobs wdj
14593 WHERE vst.visit_id = p_visit_id
14594 AND wo.visit_id = vst.visit_id
14595 AND wo.MASTER_WORKORDER_FLAG = 'Y'
14596 AND wo.visit_task_id IS NULL
14597 AND wdj.wip_entity_id = wo.wip_entity_id
14598 AND vst.start_date_time = wdj.scheduled_start_date
14599 AND vst.close_date_time = wdj.scheduled_completion_date;
14600
14601 --get the non-summary tasks in the stage and all of their summary tasks as well
14602 CURSOR get_stage_tasks (c_stage_id IN NUMBER)
14603 IS
14604 SELECT * FROM
14605 --For non-summary tasks
14606 (SELECT * FROM ahl_visit_tasks_vl
14607 WHERE stage_id = c_stage_id
14608 AND task_type_code <> 'STAGE'
14609 UNION ALL
14610 --For summary tasks
14611 SELECT DISTINCT * FROM ahl_visit_tasks_vl
14612 WHERE task_type_code = 'SUMMARY'
14613 START WITH visit_task_id IN (SELECT originating_task_id
14614 FROM ahl_visit_tasks_b
14615 WHERE stage_id = c_stage_id )
14616 CONNECT BY PRIOR originating_task_id = visit_task_id)
14617 WHERE status_code NOT IN ('CANCELLED','DELETED')
14618 ORDER BY visit_task_number;
14619
14620 l_task_rec get_stage_tasks%ROWTYPE;
14621
14622 --SKPATHAK :: VWPE ER-12424063 :: 09-JUN-2011 :: Get the stage and duplicate tasks as well
14623 CURSOR get_non_summary_stage_tasks (c_stage_id IN NUMBER)
14624 IS
14625 --For non-summary tasks
14626 SELECT * FROM ahl_visit_tasks_b
14627 WHERE stage_id = c_stage_id
14628 AND status_code NOT IN ('CANCELLED','DELETED')
14629 ORDER BY visit_task_number;
14630
14631 l_non_summ_task_rec get_non_summary_stage_tasks%ROWTYPE;
14632
14633 --SKPATHAK :: VWPE ER-12424063 :: 13-JUN-2011 :: Get only the summary tasks
14634 CURSOR get_summary_stage_tasks (c_stage_id IN NUMBER)
14635 IS
14636 --For summary tasks
14637 SELECT DISTINCT * FROM ahl_visit_tasks_b
14638 WHERE task_type_code = 'SUMMARY'
14639 START WITH visit_task_id IN (SELECT originating_task_id
14640 FROM ahl_visit_tasks_b
14641 WHERE stage_id = c_stage_id )
14642 CONNECT BY PRIOR originating_task_id = visit_task_id
14643 ORDER BY visit_task_number;
14644
14645 l_summary_task_rec get_summary_stage_tasks%ROWTYPE;
14646
14647
14648 Cursor get_task_wo (c_task_id IN NUMBER) IS
14649 SELECT wo.workorder_id
14650 FROM ahl_workorders wo
14651 WHERE wo.visit_task_id = c_task_id;
14652
14653 l_temp_num1 NUMBER := NULL;
14654 l_temp_num2 NUMBER := NULL;
14655 l_wo_tbl_count NUMBER := 0;
14656 l_sch_start_date DATE;
14657 l_sch_end_date DATE;
14658 i NUMBER := 0;
14659 L_API_NAME CONSTANT VARCHAR2(30) := 'Push_stages_to_production';
14660 L_API_VERSION CONSTANT NUMBER := 1.0;
14661 L_DEBUG_KEY CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
14662 l_msg_data VARCHAR2(2000);
14663 l_return_status VARCHAR2(1);
14664 l_msg_count NUMBER;
14665 l_prd_workorder_tbl AHL_PRD_WORKORDER_PVT.PRD_WORKORDER_TBL;
14666 idx NUMBER := 0;
14667 l_prd_workorder_rel_tbl AHL_PRD_WORKORDER_PVT.prd_workorder_rel_tbl;
14668 l_manual_summ_task_flag VARCHAR2(1) ;
14669 l_firm_planned_flag VARCHAR2(1) := FND_PROFILE.value('AHL_PRD_FIRM_PLANNED_FLAG');
14670 l_workorder_id NUMBER;
14671 --SKPATHAK :: VWPE: ER:12424063 :: 26-MAY-2011
14672 l_count_val NUMBER := 0;
14673 l_task_tbl_in Task_Tbl_Type;
14674 l_task_tbl_out Task_Tbl_Type;
14675 l_is_task_already_added VARCHAR2(1) := 'N';
14676 l_val_task_tbl AHL_VWP_RULES_PVT.Task_Tbl_Type; --added by skpathak for VWPE
14677 l_planned_order_flag VARCHAR2(1); --added by skpathak for VWPE
14678 l_has_pre_in_planning VARCHAR2(1);
14679
14680 -- PRAKKUM :: VWPE: ER:12673125 :: 23-JUN-2011 :: Upgrade Changes - To find visit is old or new
14681 CURSOR c_is_old_visit(p_visit_id IN NUMBER) IS
14682 select AHL_VWP_VISITS_PVT.Is_Old_Visit(p_visit_id) IS_OLD_VISIT FROM DUAL;
14683
14684 l_is_old_visit_dets c_is_old_visit%RowType;
14685
14686 l_max_schedule_start_date DATE; --BUG 13373947 :: PRAKKUM :: 10/02/2012
14687
14688 BEGIN
14689 IF (l_log_procedure >= l_log_current_level) THEN
14690 fnd_log.string(l_log_procedure,
14691 L_DEBUG_KEY ||'.begin',
14692 'At the start of PL SQL procedure. Visit Id = ' ||
14693 p_visit_id || ', p_stages_tbl.COUNT = ' || p_stages_tbl.COUNT);
14694 END IF;
14695
14696 -- Standard start of API savepoint
14697 SAVEPOINT Push_stages_to_prodn_pvt;
14698
14699 -- Initialize message list if p_init_msg_list is set to TRUE
14700 IF FND_API.To_Boolean(p_init_msg_list) THEN
14701 FND_MSG_PUB.Initialize;
14702 END IF;
14703
14704 -- Initialize API return status to success
14705 x_return_status := FND_API.G_RET_STS_SUCCESS;
14706
14707 IF NOT FND_API.COMPATIBLE_API_CALL(l_api_version,
14708 p_api_version,
14709 l_api_name,G_PKG_NAME)
14710 THEN
14711 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
14712 END IF;
14713
14714 -- PRAKKUM :: VWPE: ER:12673125 :: 23-JUN-2011 :: Upgrade Changes
14715 OPEN c_is_old_visit(p_visit_id);
14716 FETCH c_is_old_visit INTO l_is_old_visit_dets;
14717 CLOSE c_is_old_visit;
14718
14719 IF l_is_old_visit_dets.IS_OLD_VISIT = 'Y' THEN
14720 Fnd_Message.SET_NAME('AHL','AHL_VWP_OVST_SP2P_INV');
14721 Fnd_Msg_Pub.ADD;
14722 RAISE Fnd_Api.G_EXC_ERROR;
14723 END IF;
14724
14725 -- SKPATHAK :: VWPE: ER:12424063 :: 26-MAY-2011 :: STARTS
14726 -- Validate all the Tasks in the stages being P2Ped
14727 FOR i in p_stages_tbl.FIRST..p_stages_tbl.LAST LOOP --for stages
14728 FOR l_task_rec IN get_stage_tasks( p_stages_tbl(i).stage_id ) LOOP --for all the tasks in this stage
14729 l_count_val := l_count_val + 1;
14730 l_task_tbl_in(l_count_val).visit_task_id := l_task_rec.visit_task_id;
14731 END LOOP;
14732 END LOOP;
14733 IF (l_log_statement >= l_log_current_level) THEN
14734 fnd_log.string(l_log_statement,
14735 L_DEBUG_KEY,
14736 'Before calling Validate_tasks_bef_production l_task_tbl_in.count '||l_task_tbl_in.count);
14737 END IF;
14738 IF l_count_val > 0 THEN
14739 --Validate tasks before push to production happens
14740 AHL_VWP_PROJ_PROD_PVT.Validate_tasks_bef_production(
14741 p_visit_id => p_visit_id,
14742 p_tasks_tbl => l_task_tbl_in,
14743 x_tasks_tbl => l_task_tbl_out,
14744 x_return_status => l_return_status,
14745 x_msg_count => l_msg_count,
14746 x_msg_data => x_msg_data);
14747 IF (l_log_statement >= l_log_current_level) THEN
14748 fnd_log.string(l_log_statement,
14749 L_DEBUG_KEY,
14750 'After calling Validate_tasks_bef_production l_return_status= '||l_return_status);
14751 END IF;
14752
14753 IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
14754 x_msg_count := FND_MSG_PUB.count_msg;
14755 IF (l_log_statement >= l_log_current_level) THEN
14756 fnd_log.string(l_log_statement,
14757 L_DEBUG_KEY,
14758 'Errors from PROCESS_JOBS. Message count: ' || x_msg_count);
14759 END IF;
14760 IF l_return_status = FND_API.G_RET_STS_ERROR THEN
14761 RAISE FND_API.G_EXC_ERROR;
14762 ELSE
14763 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
14764 END IF;
14765 END IF; -- Return Status is not Success
14766 -- SKPATHAK :: VWPE: ER:12424063 :: 26-MAY-2011 :: ENDS
14767
14768 -- SKPATHAK :: ER:12730539 :: 01-AUG-2011 :: START :: Validate Return to Supply Flags
14769 -- SKPATHAK:: Moved this API call from after AHL_PRD_WORKORDER_PVT.Process_Jobs call to before AHL_PRD_WORKORDER_PVT.Process_Jobs call
14770 FOR i IN l_task_tbl_in.FIRST..l_task_tbl_in.LAST LOOP
14771 l_val_task_tbl(i) := l_task_tbl_in(i);
14772 END LOOP;
14773
14774 IF (l_log_statement >= l_log_current_level) THEN
14775 fnd_log.string(l_log_statement,
14776 L_DEBUG_KEY,
14777 'Before Calling AHL_VWP_RULES_PVT.Validate_Return_To_Supply. l_task_tbl_in.count = ' || l_task_tbl_in.count );
14778 END IF;
14779
14780 IF (p_visit_id IS NOT NULL) THEN
14781 AHL_VWP_RULES_PVT.Validate_Return_To_Supply
14782 (
14783 p_api_version => 1.0,
14784 p_init_msg_list => FND_API.G_FALSE,
14785 p_commit => FND_API.G_FALSE,
14786 p_validation_level => FND_API.G_VALID_LEVEL_FULL,
14787 p_module_type => null,
14788 p_visit_id => null,
14789 p_tasks_tbl => l_val_task_tbl,
14790 x_return_status => l_return_status,
14791 x_msg_count => l_msg_count,
14792 x_msg_data => l_msg_data
14793 );
14794
14795 IF (l_log_statement >= l_log_current_level) THEN
14796 fnd_log.string(l_log_statement,
14797 L_DEBUG_KEY,
14798 'After Calling AHL_VWP_RULES_PVT.Validate_Return_To_Supply. Return Status = ' || l_return_status );
14799 END IF;
14800
14801 IF NVL(l_return_status,'x') <> FND_API.G_RET_STS_SUCCESS THEN
14802 x_msg_count := l_msg_count;
14803 x_return_status := l_return_status;
14804 IF l_return_status = Fnd_Api.g_ret_sts_error THEN
14805 RAISE Fnd_Api.g_exc_error;
14806 ELSIF l_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
14807 RAISE Fnd_Api.g_exc_unexpected_error;
14808 END IF;
14809 END IF;
14810 END IF;
14811 -- SKPATHAK :: ER:12730539 :: 01-AUG-2011 :: END
14812
14813 END IF; --l_count_val > 0 --SKPATHAK::13-OCT-2011::Bug 13043533::Shifted the END IF position
14814
14815 IF (l_log_statement >= l_log_current_level) THEN
14816 fnd_log.string(l_log_statement,
14817 L_DEBUG_KEY,
14818 'Before calling INTEGRATE_TO_PROJECTS for Visit Id ' || p_visit_id);
14819 END IF;
14820
14821 --update the project for the visit.
14822 AHL_VWP_PROJ_PROD_PVT.Integrate_to_Projects
14823 (p_api_version => l_api_version,
14824 p_init_msg_list => FND_API.G_FALSE,
14825 p_commit => FND_API.G_FALSE,
14826 p_validation_level => p_validation_level,
14827 p_module_type => p_module_type,
14828 p_visit_id => p_visit_id,
14829 x_return_status => l_return_status,
14830 x_msg_count => l_msg_count,
14831 x_msg_data => x_msg_data);
14832
14833 IF (l_log_statement >= l_log_current_level) THEN
14834 fnd_log.string(l_log_statement,
14835 L_DEBUG_KEY,
14836 'After calling Integrate_to_Projects. l_return_status = ' || l_return_status);
14837 END IF;
14838
14839 IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
14840 x_msg_count := FND_MSG_PUB.count_msg;
14841 IF (l_log_statement >= l_log_current_level) THEN
14842 fnd_log.string(l_log_statement,
14843 L_DEBUG_KEY,
14844 'Errors from Integrate_to_Projects. Message count: ' || x_msg_count);
14845 END IF;
14846 IF l_return_status = FND_API.G_RET_STS_ERROR THEN
14847 RAISE FND_API.G_EXC_ERROR;
14848 ELSE
14849 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
14850 END IF;
14851 END IF;
14852
14853 -- SKPATHAK :: ER:12730539 :: 01-AUG-2011 :: START
14854 -- Need to update materials for this visit on P2P
14855 IF (l_log_statement >= l_log_current_level) THEN
14856 fnd_log.string(l_log_statement,
14857 L_DEBUG_KEY,
14858 'Before Calling AHL_LTP_REQST_MATRL_PUB.Process_Planned_Materials. p_visit_id = ' || p_visit_id );
14859 END IF;
14860
14861 IF (p_visit_id IS NOT NULL) THEN
14862 AHL_LTP_REQST_MATRL_PUB.Process_Planned_Materials (
14863 p_api_version => 1.0,
14864 p_init_msg_list => FND_API.G_FALSE,
14865 p_commit => FND_API.G_FALSE,
14866 p_validation_level => FND_API.G_VALID_LEVEL_FULL,
14867 p_visit_id => p_visit_id,
14868 p_operation_flag => 'U',
14869 x_planned_order_flag => l_planned_order_flag,
14870 x_return_status => l_return_status,
14871 x_msg_count => l_msg_count,
14872 x_msg_data => x_msg_data);
14873
14874 IF (l_log_statement >= l_log_current_level) THEN
14875 fnd_log.string(l_log_statement,
14876 L_DEBUG_KEY,
14877 'After Calling AHL_LTP_REQST_MATRL_PUB.Process_Planned_Materials. Return Status = ' || l_return_status );
14878 END IF;
14879
14880 IF NVL(l_return_status,'x') <> FND_API.G_RET_STS_SUCCESS THEN
14881 x_msg_count := l_msg_count;
14882 x_return_status := l_return_status;
14883 IF l_return_status = Fnd_Api.g_ret_sts_error THEN
14884 RAISE Fnd_Api.g_exc_error;
14885 ELSIF l_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
14886 RAISE Fnd_Api.g_exc_unexpected_error;
14887 END IF;
14888 END IF;
14889 END IF;
14890 -- SKPATHAK :: ER:12730539 :: 01-AUG-2011 :: END
14891
14892 --fetch the MWO details
14893 OPEN c_visit_master_wo(p_visit_id);
14894 FETCH c_visit_master_wo INTO l_mst_wo_visit_rec;
14895 CLOSE c_visit_master_wo;
14896
14897 --fetch the visit details
14898 OPEN c_visit_dtl(p_visit_id);
14899 FETCH c_visit_dtl INTO l_visit_dtl_rec;
14900 CLOSE c_visit_dtl;
14901
14902 --If the value of the PAST_DATED_VISIT_FLAG is Y, create WOs as firm
14903 IF(l_visit_dtl_rec.PAST_DATED_VISIT_FLAG = 'Y') THEN
14904 l_firm_planned_flag := 1; --Firm
14905 END IF;
14906
14907 /**Visit Master Workorder Start**/
14908 idx := idx+1;
14909 l_prd_workorder_tbl(idx).SCHEDULED_START_DATE := l_visit_dtl_rec.start_date_time;
14910 l_prd_workorder_tbl(idx).SCHEDULED_END_DATE := l_visit_dtl_rec.close_date_time;
14911 l_prd_workorder_tbl(idx).BATCH_ID := l_visit_dtl_rec.VISIT_NUMBER;
14912 l_prd_workorder_tbl(idx).HEADER_ID := 0; -- Visit
14913 IF (l_mst_wo_visit_rec.workorder_id IS NOT NULL) THEN --Visit master wo already exists
14914 l_prd_workorder_tbl(idx).DML_OPERATION := 'U';
14915 l_prd_workorder_tbl(idx).WORKORDER_ID := l_mst_wo_visit_rec.workorder_id;
14916 l_prd_workorder_tbl(idx).OBJECT_VERSION_NUMBER := l_mst_wo_visit_rec.object_version_number;
14917 IF (l_mst_wo_visit_rec.status_code <> 3) THEN
14918 IF (p_release_flag = 'Y') THEN
14919 -- change status from UNRELEASED/DRAFT to RELEASED
14920 l_prd_workorder_tbl(idx).STATUS_CODE := '3'; -- Released
14921 -- Visit Master Work Order should ALWAYS be FIRM (not dependent on profile)
14922 l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG := 1; -- Firm
14923 ELSIF l_mst_wo_visit_rec.status_code = '17' THEN
14924 -- Master workorder was in Draft status, make it UNRELEASED now
14925 l_prd_workorder_tbl(idx).STATUS_CODE := '1'; -- Unreleased
14926 -- Visit Master Work Order should ALWAYS be FIRM (not dependent on profile)
14927 l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG := 1; -- Firm
14928 END IF;
14929 END IF; --master work order status is not 3
14930 ELSE -- visit master workorder does not exist, create a master wo
14931 --Going forward after VWP Enhancements, tasks/stages cannot be P2Ped if the visit is in draft status
14932 --And if the visit is in any other status then MWO must exist,
14933 --hence thow an error if this API is invoked and Master WO does not exist for this visit
14934 IF (l_log_statement >= l_log_current_level) THEN
14935 fnd_log.string(l_log_statement,
14936 L_DEBUG_KEY,
14937 'Error: a stage can only be P2Ped if the Visit Mater WO already exists');
14938 END IF;
14939 Fnd_Message.SET_NAME('AHL','AHL_VWP_NO_WO_CANOT_P2P');
14940 Fnd_Msg_Pub.ADD;
14941 RAISE Fnd_Api.G_EXC_ERROR;
14942 END IF; --visit master workorder exists or not
14943 /**Visit Master Workorder Ends**/
14944
14945 FOR i in p_stages_tbl.FIRST..p_stages_tbl.LAST LOOP --for stages
14946 IF (l_log_statement >= l_log_current_level) THEN
14947 fnd_log.string(l_log_statement,
14948 L_DEBUG_KEY,
14949 'Inside stage loop p_stages_tbl(i).stage_id= ' || p_stages_tbl(i).stage_id);
14950 END IF;
14951
14952 FOR l_task_rec IN get_stage_tasks( p_stages_tbl(i).stage_id ) LOOP --for all the tasks in this stage
14953 IF (l_log_statement >= l_log_current_level) THEN
14954 fnd_log.string(l_log_statement,
14955 L_DEBUG_KEY,
14956 'Inside tasks in a stage loop l_task_rec.visit_task_id= ' || l_task_rec.visit_task_id);
14957 END IF;
14958
14959 --fetch the workorder details for the task
14960 OPEN c_task_wo(p_visit_id , l_task_rec.visit_task_id);
14961 FETCH c_task_wo INTO l_task_wo_rec;
14962 CLOSE c_task_wo;
14963
14964 IF (l_task_rec.task_type_code = 'SUMMARY') THEN
14965 IF l_prd_workorder_tbl.count > 0 THEN
14966 For i IN l_prd_workorder_tbl.FIRST..l_prd_workorder_tbl.LAST LOOP
14967 IF l_prd_workorder_tbl(i).workorder_id = l_task_wo_rec.workorder_id THEN
14968 l_is_task_already_added := 'Y';
14969 END IF;
14970 END LOOP;
14971 END IF;
14972 END IF;
14973
14974 --Task wo for the visit already exists but has not been added to l_prd_workorder_tbl
14975 IF (l_task_wo_rec.workorder_id IS NOT NULL AND l_is_task_already_added = 'N') THEN
14976 IF (l_task_wo_rec.status_code = 17) THEN -- Status is Draft
14977 idx := idx+1;
14978 l_prd_workorder_tbl(idx).dml_operation := 'U';
14979 l_prd_workorder_tbl(idx).workorder_id := l_task_wo_rec.workorder_id;
14980 l_prd_workorder_tbl(idx).object_version_number := l_task_wo_rec.object_version_number;
14981 l_prd_workorder_tbl(idx).item_instance_id := l_task_rec.instance_id ;
14982 l_prd_workorder_tbl(idx).BATCH_ID := l_visit_dtl_rec.visit_number;
14983 l_prd_workorder_tbl(idx).HEADER_ID := l_task_rec.visit_task_number;
14984 IF (p_release_flag = 'Y') THEN
14985 l_prd_workorder_tbl(idx).status_code := '3'; -- Released
14986 ELSE
14987 l_prd_workorder_tbl(idx).status_code := '1'; -- UnReleased
14988 END IF;
14989 IF (-- For task with past task dates, WOs are always firm irrespective of the profile value
14990 l_task_rec.past_task_start_date IS NULL AND
14991 l_firm_planned_flag = '2') THEN
14992 l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG := 2; -- Planned
14993 ELSE
14994 l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG := 1; -- Firm
14995 END IF;
14996 -- If summary task, use the min,max of sub tasks
14997 IF (l_task_rec.task_type_code = 'SUMMARY') THEN
14998 OPEN get_summary_task_times_csr(l_task_rec.visit_task_id);
14999 FETCH get_summary_task_times_csr
15000 INTO l_prd_workorder_tbl(idx).SCHEDULED_START_DATE,
15001 l_prd_workorder_tbl(idx).SCHEDULED_END_DATE;
15002 CLOSE get_summary_task_times_csr;
15003 ELSE
15004 l_prd_workorder_tbl(idx).scheduled_start_date := l_task_rec.start_date_time;
15005 l_prd_workorder_tbl(idx).scheduled_end_date := l_task_rec.end_date_time;
15006 END IF;
15007 /*For summary tasks and unassociated tasks the task name is passed as the workorder description.
15008 And for the Route tasks, the route number concatenated with the route title is
15009 passed as workorder description.*/
15010 IF (l_task_rec.task_type_code IN ('SUMMARY','UNASSOCIATED')) THEN
15011 l_prd_workorder_tbl(idx).JOB_DESCRIPTION := l_task_rec.visit_task_name;
15012 ELSE
15013 OPEN get_wo_dtls_for_mrtasks_cur(l_task_rec.visit_task_id);
15014 FETCH get_wo_dtls_for_mrtasks_cur INTO l_wo_dtls_for_mrtasks_rec;
15015 IF get_wo_dtls_for_mrtasks_cur%NOTFOUND THEN
15016 l_wo_dtls_for_mrtasks_rec.workorder_description := NULL;
15017 END IF;
15018 CLOSE get_wo_dtls_for_mrtasks_cur;
15019 l_prd_workorder_tbl(idx).JOB_DESCRIPTION := l_wo_dtls_for_mrtasks_rec.workorder_description;
15020 END IF;
15021 END IF; -- WO Status is Draft
15022 ELSIF (l_task_wo_rec.workorder_id IS NULL) THEN --work order does not exist for this task
15023 IF (l_log_statement >= l_log_current_level) THEN
15024 fnd_log.string(l_log_statement,
15025 L_DEBUG_KEY,
15026 'Error: Stage cannot be P2Ped since WO does not exist for the task_id: '||l_task_rec.visit_task_id);
15027 END IF;
15028 Fnd_Message.SET_NAME('AHL','AHL_VWP_NO_WO_CANOT_P2P');
15029 Fnd_Msg_Pub.ADD;
15030 RAISE Fnd_Api.G_EXC_ERROR;
15031 END IF; --work order exists or not for this task
15032
15033 IF (l_log_statement >= l_log_current_level) THEN
15034 fnd_log.string(l_log_statement,
15035 L_DEBUG_KEY,
15036 'Before calling Get_Task_Relationships for task id: ' ||l_task_rec.visit_task_id);
15037 END IF;
15038
15039 AHL_VWP_PROJ_PROD_PVT.Get_Task_Relationships
15040 ( p_visit_id => p_visit_id,
15041 p_visit_number => l_visit_dtl_rec.visit_number,
15042 p_visit_task_id => l_task_rec.visit_task_id,
15043 p_x_relationship_tbl => l_prd_workorder_rel_tbl
15044 );
15045
15046 IF (l_log_statement >= l_log_current_level) THEN
15047 fnd_log.string(l_log_statement,
15048 L_DEBUG_KEY,
15049 'After calling Get_Task_Relationships');
15050 END IF;
15051 END LOOP; -- For all tasks in this stage
15052 END LOOP; -- For all stages in p_stages_tbl
15053
15054 -- Commented the below code by tchimira on 14-MAR-2012 as per the requirement stated in the bug 13695008
15055 --first get the task relationships for the tasks, then collect the dependencies.
15056 /*IF (l_log_statement >= l_log_current_level) THEN
15057 fnd_log.string(l_log_statement,
15058 L_DEBUG_KEY,
15059 'Before calling Get_Task_Dependencies for tasks');
15060 END IF;
15061
15062 FOR i in p_stages_tbl.FIRST..p_stages_tbl.LAST LOOP --for stages
15063 FOR l_task_rec IN get_stage_tasks( p_stages_tbl(i).stage_id ) LOOP
15064 AHL_VWP_PROJ_PROD_PVT.Get_Task_Dependencies
15065 (
15066 p_visit_number => l_visit_dtl_rec.visit_number,
15067 p_visit_task_id => l_task_rec.visit_task_id,
15068 p_visit_task_number => l_task_rec.visit_task_number,
15069 p_x_relationship_tbl => l_prd_workorder_rel_tbl
15070 );
15071
15072 IF (l_log_statement >= l_log_current_level) THEN
15073 fnd_log.string(l_log_statement,
15074 L_DEBUG_KEY,
15075 'After calling Get_Task_Dependencies for task id: ' ||l_task_rec.visit_task_id);
15076 END IF;
15077 END LOOP; -- For all tasks in a stage
15078 END LOOP;*/ -- For all stages in p_stages_tbl
15079
15080 --BUG 13373947 :: PRAKKUM :: 10/02/2012 :: START
15081 -- IF visit planned end date is in PAST and visit itself is not past dated then validate workorder shcedule start dates
15082 IF ( l_visit_dtl_rec.close_date_time IS NOT NULL AND l_visit_dtl_rec.close_date_time<SYSDATE ) AND NVL(l_visit_dtl_rec.PAST_DATED_VISIT_FLAG,'N')='N' THEN
15083
15084 l_max_schedule_start_date := l_visit_dtl_rec.close_date_time;
15085 For loopvar IN l_prd_workorder_tbl.FIRST..l_prd_workorder_tbl.LAST
15086 LOOP
15087
15088 IF (l_log_statement >= l_log_current_level) THEN
15089 fnd_log.string(l_log_statement, L_DEBUG_KEY, 'l_prd_workorder_tbl(idx).SCHEDULED_START_DATE --@>'
15090 || TO_CHAR(l_prd_workorder_tbl(idx).SCHEDULED_START_DATE,'DD-MON-YYYY HH24:MI:SS'));
15091 fnd_log.string(l_log_statement, L_DEBUG_KEY, 'get_vst_status_and_date_rec.close_date_time --@>'
15092 || TO_CHAR(l_visit_dtl_rec.close_date_time,'DD-MON-YYYY HH24:MI:SS'));
15093 END IF;
15094
15095 IF l_prd_workorder_tbl(idx).SCHEDULED_START_DATE IS NOT NULL AND l_visit_dtl_rec.close_date_time IS NOT NULL THEN
15096 IF l_prd_workorder_tbl(idx).SCHEDULED_START_DATE > l_visit_dtl_rec.close_date_time THEN
15097 -- Find max schedule start date
15098 IF l_prd_workorder_tbl(idx).SCHEDULED_START_DATE > l_max_schedule_start_date THEN
15099 l_max_schedule_start_date := l_prd_workorder_tbl(idx).SCHEDULED_START_DATE;
15100 END IF;
15101 END IF;
15102 END IF;
15103 END LOOP;
15104
15105
15106 IF (l_log_statement >= l_log_current_level) THEN
15107 fnd_log.string(l_log_statement, L_DEBUG_KEY, 'l_max_schedule_start_date --@>'
15108 || TO_CHAR(l_max_schedule_start_date,'DD-MON-YYYY HH24:MI:SS'));
15109 END IF;
15110
15111 IF l_max_schedule_start_date > l_visit_dtl_rec.close_date_time THEN -- Validation Error
15112 Fnd_Message.SET_NAME('AHL','AHL_VWP_NON_PS_PLAN_ED_DATE');
15113 Fnd_Msg_Pub.ADD;
15114 RAISE Fnd_Api.G_EXC_ERROR;
15115 END IF;
15116 END IF;
15117 --BUG 13373947 :: PRAKKUM :: 10/02/2012 :: END
15118
15119 IF (l_log_statement >= l_log_current_level) THEN
15120 fnd_log.string(l_log_statement,
15121 L_DEBUG_KEY,
15122 'Before calling PROCESS_JOBS for visit_id: ' || p_visit_id
15123 ||' ,l_prd_workorder_tbl.count: ' || l_prd_workorder_tbl.count || ' ,l_prd_workorder_rel_tbl.count: ' || l_prd_workorder_rel_tbl.count);
15124 END IF;
15125
15126 -- Call Production API to create work orders
15127 AHL_PRD_WORKORDER_PVT.Process_Jobs
15128 (p_api_version => l_api_version ,
15129 p_init_msg_list => FND_API.G_FALSE,
15130 p_commit => FND_API.G_FALSE,
15131 p_validation_level => p_validation_level,
15132 p_default => FND_API.G_TRUE,
15133 p_module_type => p_module_type,
15134 x_return_status => l_return_status,
15135 x_msg_count => l_msg_count,
15136 x_msg_data => l_msg_data,
15137 p_x_prd_workorder_tbl => l_prd_workorder_tbl,
15138 p_prd_workorder_rel_tbl => l_prd_workorder_rel_tbl
15139 );
15140
15141 IF (l_log_statement >= l_log_current_level) THEN
15142 fnd_log.string(l_log_statement,
15143 L_DEBUG_KEY,
15144 'After calling PROCESS_JOBS for visit_id ' ||
15145 p_visit_id||', l_return_status: '|| l_return_status);
15146 END IF;
15147
15148 IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
15149 x_msg_count := FND_MSG_PUB.count_msg;
15150 IF (l_log_statement >= l_log_current_level) THEN
15151 fnd_log.string(l_log_statement,
15152 L_DEBUG_KEY,
15153 'Errors from PROCESS_JOBS. Message count: ' || x_msg_count);
15154 END IF;
15155 IF l_return_status = FND_API.G_RET_STS_ERROR THEN
15156 RAISE FND_API.G_EXC_ERROR;
15157 ELSE
15158 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
15159 END IF;
15160 END IF; -- Return Status is not Success
15161
15162 IF (l_log_statement >= l_log_current_level) THEN
15163 For i IN l_prd_workorder_tbl.FIRST..l_prd_workorder_tbl.LAST LOOP
15164 fnd_log.string(l_log_statement,
15165 L_DEBUG_KEY,
15166 'WorkOrder Id('||i||'): '||l_prd_workorder_tbl(i).workorder_id);
15167 END LOOP;
15168 END IF;
15169
15170 --Now update the stage status to released
15171 FOR i in p_stages_tbl.FIRST..p_stages_tbl.LAST LOOP --for stages
15172
15173 UPDATE ahl_vwp_stages_b
15174 SET STAGE_STATUS_CODE = 'RELEASED',
15175 OBJECT_VERSION_NUMBER = OBJECT_VERSION_NUMBER + 1,
15176 LAST_UPDATE_DATE = SYSDATE,
15177 LAST_UPDATED_BY = Fnd_Global.USER_ID,
15178 LAST_UPDATE_LOGIN = Fnd_Global.LOGIN_ID
15179 WHERE STAGE_ID = p_stages_tbl(i).stage_id;
15180
15181 END LOOP;
15182
15183 IF (l_log_statement >= l_log_current_level) THEN
15184 fnd_log.string(l_log_statement,
15185 L_DEBUG_KEY,
15186 'Before calling Update_Project_Task_Times.');
15187 END IF;
15188
15189 /*The project start/end dates have to be updated with the workorder scheduled
15190 start/end dates.*/
15191 Update_Project_Task_Times(
15192 p_prd_workorder_tbl => l_prd_workorder_tbl,
15193 p_commit =>'F',
15194 x_return_status => l_return_status,
15195 x_msg_count => l_msg_count,
15196 x_msg_data => l_msg_data);
15197
15198 IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
15199 x_msg_count := FND_MSG_PUB.count_msg;
15200 IF (l_log_statement >= l_log_current_level) THEN
15201 fnd_log.string(l_log_statement,
15202 L_DEBUG_KEY,
15203 'Errors from Update_Project_Task_Times. Message count: ' || x_msg_count);
15204 END IF;
15205 IF l_return_status = FND_API.G_RET_STS_ERROR THEN
15206 RAISE FND_API.G_EXC_ERROR;
15207 ELSE
15208 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
15209 END IF;
15210 ELSE
15211 IF (l_log_statement >= l_log_current_level) THEN
15212 fnd_log.string(l_log_statement,
15213 L_DEBUG_KEY,
15214 'Returned Success from Update_Project_Task_Times');
15215 END IF;
15216 END IF; -- Return Status is Success or not
15217
15218 -- Now change all stage tasks'(non-summary) statuses
15219 FOR i in p_stages_tbl.FIRST..p_stages_tbl.LAST LOOP --for stages
15220 FOR l_non_summ_task_rec IN get_non_summary_stage_tasks( p_stages_tbl(i).stage_id ) LOOP --for all the tasks in this stage
15221 --SKPATHAK :: VWPE ER-12424063 :: 09-JUN-2011 :: Need not to update the status of stage and duplicate tasks to RELEASED
15222 IF l_non_summ_task_rec.task_type_code IN ('STAGE','DUPLICATE') THEN
15223
15224 OPEN get_task_wo (l_non_summ_task_rec.visit_task_id);
15225 FETCH get_task_wo INTO l_workorder_id;
15226 CLOSE get_task_wo;
15227
15228 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
15229 fnd_log.string(fnd_log.level_statement,L_DEBUG_KEY,'Before calling AHL_PRD_WORKORDER_PVT.cancel_visit_jobs l_workorder_id= '||l_workorder_id);
15230 END IF;
15231
15232 AHL_PRD_WORKORDER_PVT.cancel_visit_jobs
15233 (p_api_version => 1.0,
15234 p_init_msg_list => FND_API.G_FALSE,
15235 p_commit => FND_API.G_FALSE,
15236 p_validation_level => FND_API.G_VALID_LEVEL_FULL,
15237 p_default => FND_API.G_FALSE,
15238 p_module_type => NULL,
15239 x_return_status => l_return_status,
15240 x_msg_count => l_msg_count,
15241 x_msg_data => l_msg_data,
15242 p_visit_id => NULL,
15243 p_unit_effectivity_id => NULL,
15244 p_workorder_id => l_workorder_id);
15245
15246 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
15247 fnd_log.string(fnd_log.level_statement,L_DEBUG_KEY,'After calling AHL_PRD_WORKORDER_PVT.cancel_visit_jobs - l_return_status : '||l_return_status);
15248 END IF;
15249
15250 IF l_return_status <> 'S' THEN
15251 RAISE Fnd_Api.G_EXC_ERROR;
15252 END IF;
15253
15254 UPDATE ahl_visit_tasks_b
15255 SET status_code = 'CANCELLED',
15256 OBJECT_VERSION_NUMBER = OBJECT_VERSION_NUMBER + 1,
15257 LAST_UPDATE_DATE = SYSDATE,
15258 LAST_UPDATED_BY = Fnd_Global.USER_ID,
15259 LAST_UPDATE_LOGIN = Fnd_Global.LOGIN_ID
15260 WHERE visit_task_id = l_non_summ_task_rec.visit_task_id;
15261 ELSIF l_non_summ_task_rec.task_type_code <> 'SUMMARY' THEN
15262 UPDATE ahl_visit_tasks_b
15263 SET status_code = 'RELEASED',
15264 OBJECT_VERSION_NUMBER = OBJECT_VERSION_NUMBER + 1,
15265 LAST_UPDATE_DATE = SYSDATE,
15266 LAST_UPDATED_BY = Fnd_Global.USER_ID,
15267 LAST_UPDATE_LOGIN = Fnd_Global.LOGIN_ID
15268 WHERE visit_task_id = l_non_summ_task_rec.visit_task_id;
15269 END IF;
15270 END LOOP;
15271 END LOOP;
15272
15273 --SKPATHAK :: VWPE ER-12424063 :: 13-JUN-2011 :: Get only the summary tasks
15274 -- Now change all stage tasks'(summary) statuses
15275 -- Summary tasks' statuses can only be changed once the statuses for non-summary tasks have been changed
15276 FOR i in p_stages_tbl.FIRST..p_stages_tbl.LAST LOOP --for stages
15277 FOR l_summary_task_rec IN get_summary_stage_tasks( p_stages_tbl(i).stage_id ) LOOP --for all the tasks in this stage
15278 OPEN chk_summary_task_child (l_summary_task_rec.visit_task_id);
15279 FETCH chk_summary_task_child INTO l_chk_status_code;
15280 IF (chk_summary_task_child%NOTFOUND) THEN
15281 l_chk_status_code := 'RELEASED';
15282 END IF;
15283 CLOSE chk_summary_task_child;
15284 UPDATE ahl_visit_tasks_b
15285 SET status_code = l_chk_status_code,
15286 OBJECT_VERSION_NUMBER = OBJECT_VERSION_NUMBER + 1,
15287 LAST_UPDATE_DATE = SYSDATE,
15288 LAST_UPDATED_BY = Fnd_Global.USER_ID,
15289 LAST_UPDATE_LOGIN = Fnd_Global.LOGIN_ID
15290 WHERE visit_task_id = l_summary_task_rec.visit_task_id;
15291 END LOOP;
15292 END LOOP;
15293
15294 /*Check if the user had selected all the tasks otherwise
15295 update the visit as Partially released.*/
15296 OPEN c_visit_has_planned_tasks(p_visit_id);
15297 FETCH c_visit_has_planned_tasks into l_temp_num1;
15298 CLOSE c_visit_has_planned_tasks;
15299
15300 OPEN c_visit_time_matches_MWO_time(p_visit_id);
15301 FETCH c_visit_time_matches_MWO_time INTO l_temp_num2;
15302 CLOSE c_visit_time_matches_MWO_time;
15303
15304 IF l_temp_num1 IS NOT NULL OR l_temp_num2 is NULL THEN
15305 IF (l_log_statement >= l_log_current_level) THEN
15306 IF l_temp_num1 IS NOT NULL THEN
15307 fnd_log.string(l_log_statement,
15308 L_DEBUG_KEY,
15309 'Visit has some tasks in planning status. Setting Visit status to PARTIALLY RELEASED.');
15310 END IF;
15311 IF l_temp_num2 IS NULL THEN
15312 fnd_log.string(l_log_statement,
15313 L_DEBUG_KEY,
15314 'Visit times and Master Work order times do not match. Setting Visit status to PARTIALLY RELEASED.');
15315 END IF;
15316 END IF;
15317
15318 UPDATE ahl_visits_b
15319 SET status_code = 'PARTIALLY RELEASED',
15320 OBJECT_VERSION_NUMBER = OBJECT_VERSION_NUMBER + 1,
15321 LAST_UPDATE_DATE = SYSDATE,
15322 LAST_UPDATED_BY = Fnd_Global.USER_ID,
15323 LAST_UPDATE_LOGIN = Fnd_Global.LOGIN_ID
15324 WHERE visit_id = p_visit_id;
15325 ELSE
15326 IF (l_log_statement >= l_log_current_level) THEN
15327 fnd_log.string(l_log_statement,
15328 L_DEBUG_KEY,
15329 'Setting Visit status to RELEASED.');
15330 END IF;
15331
15332 UPDATE ahl_visits_b
15333 SET status_code = 'RELEASED',
15334 any_task_chg_flag ='N',
15335 OBJECT_VERSION_NUMBER = OBJECT_VERSION_NUMBER + 1,
15336 LAST_UPDATE_DATE = SYSDATE,
15337 LAST_UPDATED_BY = Fnd_Global.USER_ID,
15338 LAST_UPDATE_LOGIN = Fnd_Global.LOGIN_ID
15339 WHERE visit_id = p_visit_id;
15340 END IF;
15341
15342 -- SKPATHAK :: ER:12730539 :: 01-AUG-2011
15343 -- Validate if any of the stages being P2Ped has its predessor in planning status
15344 Validate_Stage_Predecessors (p_visit_id => p_visit_id,
15345 p_stages_tbl => p_stages_tbl,
15346 x_has_pre_in_planning => l_has_pre_in_planning);
15347 IF l_has_pre_in_planning = 'Y' THEN
15348 x_return_status := 'V';
15349 END IF;
15350
15351 ---------------------------End of Body-------------------------------------
15352 -- END of API body.
15353 -- Standard check of p_commit.
15354
15355 IF Fnd_Api.To_Boolean (p_commit) THEN
15356 COMMIT WORK;
15357 END IF;
15358
15359 Fnd_Msg_Pub.count_and_get(
15360 p_encoded => Fnd_Api.g_false,
15361 p_count => x_msg_count,
15362 p_data => x_msg_data
15363 );
15364
15365
15366 IF (l_log_procedure >= l_log_current_level) THEN
15367 fnd_log.string(l_log_procedure,
15368 L_DEBUG_KEY ||'.end',
15369 'At the end of PL SQL procedure. Return Status = ' || x_return_status);
15370 END IF;
15371
15372 EXCEPTION
15373 WHEN FND_API.G_EXC_ERROR THEN
15374 x_return_status := FND_API.G_RET_STS_ERROR;
15375 ROLLBACK TO Push_stages_to_prodn_pvt;
15376 FND_MSG_PUB.count_and_get(p_count => x_msg_count,
15377 p_data => x_msg_data,
15378 p_encoded => fnd_api.g_false);
15379
15380 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
15381 x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
15382 ROLLBACK TO Push_stages_to_prodn_pvt;
15383 Fnd_Msg_Pub.count_and_get (
15384 p_encoded => Fnd_Api.g_false,
15385 p_count => x_msg_count,
15386 p_data => x_msg_data);
15387
15388 WHEN OTHERS THEN
15389 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
15390 ROLLBACK TO Push_stages_to_prodn_pvt;
15391 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
15392 fnd_msg_pub.add_exc_msg(p_pkg_name => G_PKG_NAME,
15393 p_procedure_name => 'Push_stages_to_production',
15394 p_error_text => SUBSTR(SQLERRM,1,500));
15395 END IF;
15396 FND_MSG_PUB.count_and_get(p_count => x_msg_count,
15397 p_data => x_msg_data,
15398 p_encoded => fnd_api.g_false);
15399
15400 END Push_stages_to_production;
15401
15402 -- SKPATHAK :: 02-MAY-2011 :: VWPE: ER:12424063 :: ENDS
15403
15404 -- SKPATHAK :: ER:12730539 :: 01-AUG-2011 :: START
15405 -- API to validate whether any of the stages passed to it is in planning
15406 -- This API is not fool-proof as it does not consider parallel rules when
15407 -- in the hierarchy, the object_id of the parallel rule is treated as parent and subject_id as child
15408 -- Ideally, for parallel rules, object_id can be treated as child and subject_id as parent OR vice-versa
15409 PROCEDURE Validate_Stage_Predecessors ( p_visit_id IN NUMBER,
15410 p_stages_tbl IN AHL_VWP_VISITS_STAGES_PVT.Visit_Stages_Tbl_Type,
15411 x_has_pre_in_planning OUT NOCOPY VARCHAR2)
15412 IS
15413
15414 L_API_NAME CONSTANT VARCHAR2(30) := 'BG_Release_Visit';
15415 L_API_VERSION CONSTANT NUMBER := 1.0;
15416 L_DEBUG_KEY CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
15417
15418
15419 -- Get the passed stage child id and all its successive child stages
15420 CURSOR c_get_child_stages(p_subject_id IN NUMBER)
15421 IS
15422 SELECT 'X' FROM ahl_stage_links link
15423 WHERE EXISTS (SELECT 'X' FROM ahl_vwp_stages_b WHERE stage_id = link.object_id and stage_status_code = 'PLANNING')
15424 START WITH link.subject_id = p_subject_id
15425 CONNECT BY PRIOR link.object_id = link.subject_id;
15426 l_dummy VARCHAR2(1);
15427
15428 BEGIN
15429 IF (l_log_procedure >= l_log_current_level) THEN
15430 fnd_log.string(l_log_procedure,
15431 L_DEBUG_KEY ||'.begin',
15432 'At the start of PL SQL procedure. Visit Id = ' ||
15433 p_visit_id || ', p_stages_tbl.COUNT = ' || p_stages_tbl.COUNT);
15434 END IF;
15435
15436 IF p_stages_tbl.COUNT > 0 THEN
15437 FOR i in p_stages_tbl.FIRST..p_stages_tbl.LAST LOOP --for stages
15438 OPEN c_get_child_stages (p_stages_tbl(i).stage_id);
15439 FETCH c_get_child_stages INTO l_dummy;
15440 IF c_get_child_stages%FOUND THEN
15441 x_has_pre_in_planning := 'Y'; --stage has a predessor stage in planning status
15442 END IF;
15443 CLOSE c_get_child_stages; --SKPATHAK :: 13-OCT-2011 :: Bug 13043533
15444 END LOOP;
15445 END IF;
15446
15447 x_has_pre_in_planning := 'N';
15448
15449 END Validate_Stage_Predecessors;
15450
15451 -- SKPATHAK :: ER:12730539 :: 01-AUG-2011 :: END
15452
15453 --------------------------------------------------------------------
15454 -- Function name : Get_RB_Transaction_Task
15455 -- Type : Public
15456 -- Purpose : Fetches project transaction task id through given
15457 -- given repair batch task id and project id
15458 --
15459 -- Parameters :
15460 -- p_project_id
15461 -- p_repair_batch_task_id
15462 -- p_visit_id
15463 --
15464 -- Version :
15465 -- 12 June, 2012 PRAKKUM Initial Version - 1.0
15466 --
15467 -- Added for Bug 14068468
15468 --------------------------------------------------------------------
15469
15470 FUNCTION Get_RB_Transaction_Task(p_project_id IN NUMBER,p_repair_batch_task_id IN NUMBER,p_visit_id IN NUMBER)
15471 RETURN NUMBER
15472 IS
15473
15474 CURSOR c_get_trans_task_id (c_project_id IN NUMBER,c_repair_batch_task_id IN NUMBER, c_visit_id IN NUMBER, c_task_trail_name IN VARCHAR2)
15475 IS
15476 SELECT pt.task_id
15477 FROM PA_TASKS pt
15478 WHERE
15479 pt.task_name LIKE c_task_trail_name /* Filter only project tasks whose name ends with -G_TRANS_TSK_TRAIL_NAME */
15480 AND pt.project_id=c_project_id
15481 AND pt.parent_task_id=c_repair_batch_task_id
15482 AND NOT EXISTS (
15483 select 1 from AHL_VISIT_TASKS_B tsk where tsk.visit_id = c_visit_id AND tsk.project_task_id = pt.task_id
15484 );
15485
15486 l_transaction_tsk_id NUMBER :=NULL;
15487
15488 L_API_NAME CONSTANT VARCHAR2(30) := 'Get_RB_Transaction_Task';
15489 L_API_VERSION CONSTANT NUMBER := 1.0;
15490 L_DEBUG_KEY CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
15491
15492 BEGIN
15493
15494 IF (l_log_statement >= l_log_current_level) THEN
15495 fnd_log.string(l_log_statement, L_DEBUG_KEY ,'Params--@>p_project_id ** p_repair_batch_task_id ** p_visit_id--@> '||
15496 p_project_id || ' ** '|| p_repair_batch_task_id||' ** '||p_visit_id);
15497 END IF;
15498
15499 OPEN c_get_trans_task_id (p_project_id, p_repair_batch_task_id, p_visit_id, '%-'||G_TRANS_TSK_TRAIL_NAME );
15500 FETCH c_get_trans_task_id INTO l_transaction_tsk_id;
15501 CLOSE c_get_trans_task_id;
15502
15503 IF (l_log_statement >= l_log_current_level) THEN
15504 fnd_log.string(l_log_statement, L_DEBUG_KEY ,'Project transaction task id (repair batch child task)--@> '||l_transaction_tsk_id);
15505 END IF;
15506
15507 -- Return repair batch task id, if child task not found, this fix is to support old visits where trasnsactions done over repair batch task
15508 IF l_transaction_tsk_id IS NULL THEN
15509
15510 l_transaction_tsk_id := p_repair_batch_task_id;
15511
15512 IF (l_log_statement >= l_log_current_level) THEN
15513 fnd_log.string(l_log_statement, L_DEBUG_KEY ,'Project transaction task id (repair batch task)--@> '||l_transaction_tsk_id);
15514 END IF;
15515 END IF;
15516
15517 RETURN l_transaction_tsk_id;
15518
15519 END Get_RB_Transaction_Task;
15520
15521 END AHL_VWP_PROJ_PROD_PVT;