DBA Data[Home] [Help]

PACKAGE BODY: APPS.AHL_VWP_VISITS_PVT

Source


1 PACKAGE BODY AHL_VWP_VISITS_PVT AS
2 /* $Header: AHLVVSTB.pls 120.38.12020000.3 2013/03/20 09:31:49 prakkum ship $ */
3 
4 G_PKG_NAME     CONSTANT VARCHAR2(30) := 'AHL_VWP_VISITS_PVT';
5 G_APP_NAME     CONSTANT VARCHAR2(3)  := 'AHL';
6 G_DEBUG        VARCHAR2(1)  := AHL_DEBUG_PUB.is_log_enabled;
7 
8 ------------------------------------
9 -- Common constants and variables --
10 ------------------------------------
11 l_log_current_level     NUMBER      := fnd_log.g_current_runtime_level;
12 l_log_statement         NUMBER      := fnd_log.level_statement;
13 l_log_procedure         NUMBER      := fnd_log.level_procedure;
14 l_log_error             NUMBER      := fnd_log.level_error;
15 l_log_unexpected        NUMBER      := fnd_log.level_unexpected;
16 
17 -- Added by jaramana on 04-NOV-2009 for bug 9087120
18 -- Job Statuses
19 G_JOB_STATUS_UNRELEASED VARCHAR2(1) := '1'; --Unreleased
20 
21 -- SKPATHAK :: Bug 9115894 :: 23-NOV-2009
22 G_VALIDATION_EXCEPTION EXCEPTION;
23 G_VALIDATION_ERROR_STATUS VARCHAR2(1) := 'V';
24 TYPE G_MESSAGE_STACK_TBL IS TABLE OF VARCHAR2(2000) INDEX BY BINARY_INTEGER;
25 
26 
27 -----------------------------------------------------------------
28 
29 ---------------------------------------------------------------------
30 --   Define Record Types for record structures needed by the APIs  --
31 ---------------------------------------------------------------------
32 -- NO RECORD TYPES *************
33 
34 --------------------------------------------------------------------
35 -- Define Table Type for Records Structures                       --
36 --------------------------------------------------------------------
37 -- NO TABLE TYPES **************
38 
39 --------------------------------------------------------------------
40 --  START: Defining local functions and procedures SIGNATURES     --
41 --------------------------------------------------------------------
42 --  To find out the Visit_Id for the AHL_Visits_B and TL tables
43 FUNCTION Get_Visit_Id
44 RETURN NUMBER;
45 
46 --  To find out the Visit_Number for the AHL_Visits_B table
47 FUNCTION Get_Visit_Number
48 RETURN NUMBER;
49 
50 --  To find out the Visit_Task_Number for the AHL_Visit_Tasks_B table
51 FUNCTION Get_Visit_Task_Number (p_visit_id IN NUMBER)
52 RETURN NUMBER;
53 
54 -- PRAKKUM :: VWPE: ER:12424063  :: 01-FEB-2011
55 -- Changed procedure to function to make a call from sql and increased scope to public
56 /*
57 --  To find out Due_by_Date for the visit update screen.
58 PROCEDURE Get_Due_by_Date(
59    p_visit_id         IN    NUMBER,
60    x_Due_by_Date      OUT   NOCOPY DATE
61 );*/
62 
63 --  To assign Null to missing attributes of visit while creation/updation.
64 PROCEDURE Default_Missing_Attribs(
65    p_x_visit_rec         IN OUT NOCOPY Visit_Rec_Type
66 );
67 
68 --  To validate visit for creation/updation of visit
69 PROCEDURE Validate_Visit (
70    p_api_version       IN  NUMBER,
71    p_init_msg_list     IN  VARCHAR2  := Fnd_Api.g_false,
72    p_commit            IN  VARCHAR2  := Fnd_Api.g_false,
73    p_validation_level  IN  NUMBER    := Fnd_Api.g_valid_level_full,
74    p_Visit_rec         IN  visit_rec_type,
75    x_return_status     OUT NOCOPY VARCHAR2,
76    x_msg_count         OUT NOCOPY NUMBER,
77    x_msg_data          OUT NOCOPY VARCHAR2
78 );
79 
80 --   To Check all Visit's Items
81 PROCEDURE Check_Visit_Items (
82    p_Visit_rec       IN  visit_rec_type,
83    p_validation_mode IN  VARCHAR2 := Jtf_Plsql_Api.g_create,
84    x_return_status   OUT NOCOPY VARCHAR2
85 );
86 
87 --   To Check all Visit's Required Items
88 PROCEDURE Check_Visit_Req_Items (
89    p_Visit_rec        IN    Visit_Rec_Type,
90    x_return_status    OUT   NOCOPY VARCHAR2
91 );
92 
93 --   To Check all Visit's Unique items
94 PROCEDURE Check_Visit_UK_Items (
95    p_Visit_rec        IN    Visit_Rec_Type,
96    p_validation_mode  IN    VARCHAR2 := Jtf_Plsql_Api.g_create,
97    x_return_status    OUT   NOCOPY VARCHAR2
98 );
99 
100 -- SKPATHAK :: AVF ER: 13416865 :: 25-NOV-2011
101 -- Comment out the below two signatures as these have been moved to
102 --  To Create a Maintenance Visit
103 /*PROCEDURE Create_Visit (
104    p_api_version          IN  NUMBER,
105    p_init_msg_list        IN  VARCHAR2  := Fnd_Api.g_false,
106    p_commit               IN  VARCHAR2  := Fnd_Api.g_false,
107    p_validation_level     IN  NUMBER    := Fnd_Api.g_valid_level_full,
108    p_module_type          IN  VARCHAR2  := 'JSP',
109    p_x_visit_rec          IN OUT NOCOPY visit_rec_type,
110    x_return_status        OUT NOCOPY VARCHAR2,
111    x_msg_count            OUT NOCOPY NUMBER,
112    x_msg_data             OUT NOCOPY VARCHAR2
113   );
114 
115 --  To Update a Maintenance Visit
116 PROCEDURE Update_Visit (
117    p_api_version          IN  NUMBER,
118    p_init_msg_list        IN  VARCHAR2  := Fnd_Api.g_false,
119    p_commit               IN  VARCHAR2  := Fnd_Api.g_false,
120    p_validation_level     IN  NUMBER    := Fnd_Api.g_valid_level_full,
121    p_module_type          IN  VARCHAR2  := 'JSP',
122    p_x_Visit_Rec          IN OUT NOCOPY visit_rec_type,
123    x_return_status        OUT NOCOPY VARCHAR2,
124    x_msg_count            OUT NOCOPY NUMBER,
125    x_msg_data             OUT NOCOPY VARCHAR2
126    );*/
127 
128 --  To Delete a Maintenance Visit
129 -- TCHIMIRA :: AVF ER: 13416865 :: 14-DEC-2011 :: Comment out the below signature as it is moved to spec
130 /*PROCEDURE Delete_Visit (
131    p_api_version          IN  NUMBER,
132    p_init_msg_list        IN  VARCHAR2  := Fnd_Api.g_false,
133    p_commit               IN  VARCHAR2  := Fnd_Api.g_false,
134    p_validation_level     IN  NUMBER    := Fnd_Api.g_valid_level_full,
135    p_visit_id             IN  NUMBER,
136    x_return_status        OUT NOCOPY VARCHAR2,
137    x_msg_count            OUT NOCOPY NUMBER,
138    x_msg_data             OUT NOCOPY VARCHAR2
139 ); */
140 
141 
142 -- Transit Check Visit Change
143 -- yazhou start
144 
145 PROCEDURE Synchronize_Visit (
146    p_api_version          IN  NUMBER,
147    p_init_msg_list        IN  VARCHAR2  := Fnd_Api.g_false,
148    p_commit               IN  VARCHAR2  := Fnd_Api.g_false,
149    p_validation_level     IN  NUMBER    := Fnd_Api.g_valid_level_full,
150    p_module_type          IN  VARCHAR2  := NULL,
151    p_x_Visit_Rec          IN OUT NOCOPY visit_rec_type,
152    x_return_status        OUT NOCOPY VARCHAR2,
153    x_msg_count            OUT NOCOPY NUMBER,
154    x_msg_data             OUT NOCOPY VARCHAR2
155    );
156 
157 -- yazhou end
158 
159 -- AnRaj added for ACL changes in VWP
160 -- Bug number 4297066
161 -------------------------------------------------------------------
162 --  Procedure name      : check_unit_quarantined
163 --  Type                : Private
164 --  Function            : To check whether the Unit is quarantined
165 --  Parameters          : p_visit_id
166 --  Parameters          : item_instance_id
167 ----------------------------------------------------------------------
168 PROCEDURE check_unit_quarantined(
169       p_visit_id           IN  NUMBER,
170       item_instance_id     IN  NUMBER
171   );
172 
173 -- SKPATHAK :: Bug 9115894 :: 23-NOV-2009 :: START
174 -- Added this procedure to get the messages from message stack
175 PROCEDURE Get_Message_Stack (
176     x_message_stack_tbl OUT NOCOPY G_MESSAGE_STACK_TBL
177  );
178 
179 -- To put the messages back to message stack
180 PROCEDURE Set_Message_Stack (
181     p_message_stack_tbl IN G_MESSAGE_STACK_TBL
182  );
183 -- SKPATHAK :: Bug 9115894 :: 23-NOV-2009 :: END
184 
185 -- New Procedure added by surrkuma on 15-JUL-2010 for bug 9901811
186 -- Unschedule ATP Materials when a visit undergoes an org Change
187 PROCEDURE Handle_Visit_Org_Change(p_visit_id IN NUMBER);
188 
189 --------------------------------------------------------------------
190 --  END: Defining local functions and procedures SIGNATURES       --
191 --------------------------------------------------------------------
192 
193 -- ****************************************************************
194 
195 --------------------------------------------------------------------
196 -- START: Defining local functions and procedures BODY            --
197 --------------------------------------------------------------------
198 
199 -------------------------------------------------------------------
200 -- FUNCTION
201 --    Get_Due_by_Date
202 -- Type             : Public
203 -- PURPOSE
204 --    To find out least due by date among all tasks of a visit
205 --------------------------------------------------------------------
206 -- PRAKKUM :: VWPE: ER:12424063  :: 01-FEB-2011
207 -- Changed procedure to function to make a call from sql
208 /*
209 PROCEDURE Get_Due_by_Date(
210    p_visit_id         IN    NUMBER,
211    x_due_by_date      OUT  NOCOPY  DATE)
212 */
213 FUNCTION Get_Due_by_Date(
214    p_visit_id         IN    NUMBER
215    ) RETURN DATE
216 IS
217    -- Define local variables
218    l_count1 NUMBER;
219    l_count2 NUMBER;
220    l_date  DATE;
221    l_due_by_date DATE;
222 
223    -- Define local Cursors
224    -- To find whether a visit exists
225    CURSOR c_visit (x_id IN NUMBER) IS
226       SELECT COUNT(*)
227       FROM Ahl_Visit_Tasks_B
228       WHERE VISIT_ID = x_id
229       AND NVL(STATUS_CODE,'X') <> 'DELETED';
230 
231    -- To find the total number of tasks for a visit
232    CURSOR c_visit_task (x_id IN NUMBER) IS
233       SELECT COUNT(*)
234       FROM Ahl_Visit_Tasks_B
235       WHERE VISIT_ID = x_id
236       AND UNIT_EFFECTIVITY_ID IS NOT NULL
237       AND NVL(STATUS_CODE,'X') <> 'DELETED';
238 
239   -- To find due date for a visit related with tasks
240    CURSOR c_due_date (x_id IN NUMBER) IS
241      SELECT MIN(T1.due_date)
242      FROM ahl_unit_effectivities_vl T1, ahl_visit_tasks_b T2
243      WHERE T1.unit_effectivity_id = T2.unit_effectivity_id
244      AND T1.due_date IS NOT NULL AND T2.visit_id = x_id;
245 
246    L_API_NAME         CONSTANT VARCHAR2(30)  := 'Get_Due_by_Date';
247    L_FULL_NAME        CONSTANT VARCHAR2(60) := G_PKG_NAME || '.' || L_API_NAME;
248    L_DEBUG            CONSTANT VARCHAR2(90) := 'ahl.plsql.'||L_FULL_NAME;
249 
250 BEGIN
251   IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level) THEN
252     fnd_log.string(fnd_log.level_procedure,L_DEBUG||'.begin','At the start of PLSQL procedure');
253   END IF;
254 
255   OPEN c_visit(p_visit_id);
256   FETCH c_visit INTO l_count1;
257   IF c_visit%FOUND THEN         --Tasks found for visit
258     CLOSE c_visit;
259     OPEN c_visit_task(p_visit_id);
260     FETCH c_visit_task INTO l_count2;
261     IF c_visit_task%FOUND THEN  --Tasks found for visit checking for unit_effectivity_id
262       CLOSE c_visit_task;
263       OPEN c_due_date(p_visit_id);
264       FETCH c_due_date INTO l_due_by_date;
265       IF c_due_date%FOUND THEN     --Tasks found for visit
266         CLOSE c_due_date;
267       END IF;
268     ELSE
269       CLOSE c_visit_task;
270     END IF;
271   ELSE
272     CLOSE c_visit;
273   END IF;
274 
275   IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level) THEN
276     fnd_log.string(fnd_log.level_procedure,L_DEBUG,'l_due_by_date - '||l_due_by_date);
277     fnd_log.string(fnd_log.level_procedure,L_DEBUG||'.end','At the end of PLSQL procedure');
278   END IF;
279 
280   RETURN l_due_by_date;
281 END Get_Due_by_Date;
282 
283 --------------------------------------------------------------------
284 -- PROCEDURE
285 --    Default_Missing_Attribs
286 --
287 -- PURPOSE
288 --    For all optional fields check if its g_miss_num/g_miss_char/
289 --    g_miss_date then Null else the value
290 
291 --------------------------------------------------------------------
292 PROCEDURE Default_Missing_Attribs
293 ( p_x_visit_rec         IN OUT NOCOPY Visit_Rec_Type)
294 AS
295 BEGIN
296   -- Post 11.5.10 Enhancements
297   -- Removing defaulting of Visit Name since it is a mandatory field
298   /*-- VISIT NAME
299   IF  p_x_visit_rec.visit_name = Fnd_Api.G_MISS_char THEN
300     p_x_visit_rec.visit_name := NULL;
301   ELSE
302     p_x_visit_rec.visit_name := p_x_visit_rec.visit_name;
303   END IF;
304   */
305 
306   -- ORGANIZATION ID
307   IF  p_x_visit_rec.organization_id = Fnd_Api.G_MISS_NUM THEN
308     p_x_visit_rec.organization_id := NULL;
309   ELSE
310     p_x_visit_rec.organization_id := p_x_visit_rec.organization_id;
311   END IF;
312 
313   -- DEPARTMENT ID
314   IF  p_x_visit_rec.department_id = Fnd_Api.G_MISS_NUM THEN
315     p_x_visit_rec.department_id := NULL;
316   ELSE
317     p_x_visit_rec.department_id := p_x_visit_rec.department_id;
318   END IF;
319 
320   -- START DATE
321   IF  p_x_visit_rec.start_date = Fnd_Api.G_MISS_DATE THEN
322     p_x_visit_rec.start_date := NULL;
323   ELSE
324     p_x_visit_rec.start_date := p_x_visit_rec.start_date;
325   END IF;
326 
327   -- PLAN END DATE
328   IF  p_x_visit_rec.plan_end_date = Fnd_Api.G_MISS_DATE THEN
329     p_x_visit_rec.plan_end_date := NULL;
330   ELSE
331     p_x_visit_rec.plan_end_date := p_x_visit_rec.plan_end_date;
332   END IF;
333 
334   -- SIMULATION_PLAN_ID
335   IF  p_x_visit_rec.SIMULATION_PLAN_ID = Fnd_Api.G_MISS_NUM THEN
336     p_x_visit_rec.SIMULATION_PLAN_ID := NULL;
337   ELSE
338     p_x_visit_rec.SIMULATION_PLAN_ID := p_x_visit_rec.SIMULATION_PLAN_ID;
339   END IF;
340 
341   -- ITEM_INSTANCE_ID
342   IF p_x_visit_rec.ITEM_INSTANCE_ID = Fnd_Api.G_MISS_NUM THEN
343         p_x_visit_rec.ITEM_INSTANCE_ID := NULL;
344   ELSE
345         p_x_visit_rec.ITEM_INSTANCE_ID := p_x_visit_rec.ITEM_INSTANCE_ID;
346   END IF;
347 
348   -- ASSO_PRIMARY_VISIT_ID
349   IF  p_x_visit_rec.ASSO_PRIMARY_VISIT_ID = Fnd_Api.G_MISS_NUM THEN
350     p_x_visit_rec.ASSO_PRIMARY_VISIT_ID := NULL;
351   ELSE
352     p_x_visit_rec.ASSO_PRIMARY_VISIT_ID := p_x_visit_rec.ASSO_PRIMARY_VISIT_ID;
353   END IF;
354 
355   -- SIMULATION_DELETE_FLAG
356   IF  p_x_visit_rec.SIMULATION_DELETE_FLAG  = Fnd_Api.G_MISS_CHAR THEN
357     p_x_visit_rec.SIMULATION_DELETE_FLAG  := NULL;
358   ELSE
359     p_x_visit_rec.SIMULATION_DELETE_FLAG  := p_x_visit_rec.SIMULATION_DELETE_FLAG;
360   END IF;
361 
362   -- OUT_OF_SYNC_FLAG
363   IF  p_x_visit_rec.OUT_OF_SYNC_FLAG  = Fnd_Api.G_MISS_CHAR THEN
364     p_x_visit_rec.OUT_OF_SYNC_FLAG  := NULL;
365   ELSE
366     p_x_visit_rec.OUT_OF_SYNC_FLAG  := p_x_visit_rec.OUT_OF_SYNC_FLAG;
367   END IF;
368 
369   -- PROJECT_ID
370   IF  p_x_visit_rec.PROJECT_ID = Fnd_Api.G_MISS_NUM THEN
371     p_x_visit_rec.PROJECT_ID := NULL;
372   ELSE
373     p_x_visit_rec.PROJECT_ID := p_x_visit_rec.PROJECT_ID;
374   END IF;
375 
376   -- space_category_code
377   IF  p_x_visit_rec.space_category_code = Fnd_Api.G_MISS_CHAR THEN
378     p_x_visit_rec.space_category_code := NULL;
379   ELSE
380     p_x_visit_rec.space_category_code := p_x_visit_rec.space_category_code;
381   END IF;
382 
383   -- description
384   IF  p_x_visit_rec.description = Fnd_Api.G_MISS_CHAR THEN
385     p_x_visit_rec.description := NULL;
386   ELSE
387     p_x_visit_rec.description := p_x_visit_rec.description;
388   END IF;
389 
390   -- Post 11.5.10 Enhancements
391   -- Adding priority and project template
392   IF  p_x_visit_rec.priority_code = Fnd_Api.G_MISS_CHAR THEN
393     p_x_visit_rec.priority_code := NULL;
394   ELSE
395     p_x_visit_rec.priority_code := p_x_visit_rec.priority_code;
396   END IF;
397 
398   IF  p_x_visit_rec.proj_template_id = Fnd_Api.G_MISS_NUM THEN
399     p_x_visit_rec.proj_template_id := NULL;
400   ELSE
401     p_x_visit_rec.proj_template_id := p_x_visit_rec.proj_template_id;
402   END IF;
403 
404   -- Post 11.5.10 Enhancements
405   -- Adding item id and visit type code.
406   -- since these fields are not mandatory in Post 11.5.10
407   -- serial number check already exists (item_instance_id)
408   -- ITEM ID
409   IF  p_x_visit_rec.inventory_item_id = Fnd_Api.G_MISS_NUM THEN
410     p_x_visit_rec.inventory_item_id := NULL;
411   ELSE
412     p_x_visit_rec.inventory_item_id := p_x_visit_rec.inventory_item_id;
413   END IF;
414 
415   -- VISIT TYPE CODE
416   IF  p_x_visit_rec.visit_type_code = Fnd_Api.G_MISS_CHAR THEN
417     p_x_visit_rec.visit_type_code := NULL;
418   ELSE
419     p_x_visit_rec.visit_type_code := p_x_visit_rec.visit_type_code;
420   END IF;
421 
422   -- MANESING::Component Maintenance Planning Project, 02-Nov-2011, default sub-inventories and locators
423   -- Inventory Locator id
424   IF (p_x_visit_rec.inv_locator_id = FND_API.G_MISS_NUM) THEN
425       p_x_visit_rec.inv_locator_id := NULL;
426   END IF;
427 
428   -- Planning Locator id
429   IF (p_x_visit_rec.comp_planning_loc_id = FND_API.G_MISS_NUM) THEN
430       p_x_visit_rec.comp_planning_loc_id := NULL;
431   END IF;
432 
433   -- In-Repair Locator id
434   IF (p_x_visit_rec.comp_inrepair_loc_id = FND_API.G_MISS_NUM) THEN
435       p_x_visit_rec.comp_inrepair_loc_id := NULL;
436   END IF;
437 
438   IF  p_x_visit_rec.attribute_category = Fnd_Api.G_MISS_CHAR THEN
439     p_x_visit_rec.attribute_category := NULL;
440   ELSE
441     p_x_visit_rec.attribute_category := p_x_visit_rec.attribute_category;
442   END IF;
443 
444   IF  p_x_visit_rec.attribute1 = Fnd_Api.G_MISS_CHAR THEN
445     p_x_visit_rec.attribute1 := NULL;
446   ELSE
447     p_x_visit_rec.attribute1 := p_x_visit_rec.attribute1;
448   END IF;
449 
450   IF  p_x_visit_rec.attribute2 = Fnd_Api.G_MISS_CHAR THEN
451     p_x_visit_rec.attribute2 := NULL;
452   ELSE
453     p_x_visit_rec.attribute2 := p_x_visit_rec.attribute2;
454   END IF;
455 
456   IF  p_x_visit_rec.attribute3 = Fnd_Api.G_MISS_CHAR THEN
457     p_x_visit_rec.attribute3 := NULL;
458   ELSE
459     p_x_visit_rec.attribute3 := p_x_visit_rec.attribute3;
460   END IF;
461 
462   IF  p_x_visit_rec.attribute4 = Fnd_Api.G_MISS_CHAR THEN
463     p_x_visit_rec.attribute4 := NULL;
464   ELSE
465     p_x_visit_rec.attribute4 := p_x_visit_rec.attribute4;
466   END IF;
467 
468   IF  p_x_visit_rec.attribute5 = Fnd_Api.G_MISS_CHAR THEN
469     p_x_visit_rec.attribute5 := NULL;
470   ELSE
471     p_x_visit_rec.attribute5 := p_x_visit_rec.attribute5;
472   END IF;
473 
474   IF  p_x_visit_rec.attribute6 = Fnd_Api.G_MISS_CHAR THEN
475     p_x_visit_rec.attribute6 := NULL;
476   ELSE
477     p_x_visit_rec.attribute6 := p_x_visit_rec.attribute6;
478   END IF;
479 
480   IF  p_x_visit_rec.attribute7 = Fnd_Api.G_MISS_CHAR THEN
481     p_x_visit_rec.attribute7 := NULL;
482   ELSE
483     p_x_visit_rec.attribute7 := p_x_visit_rec.attribute7;
484   END IF;
485 
486   IF  p_x_visit_rec.attribute8 = Fnd_Api.G_MISS_CHAR THEN
487     p_x_visit_rec.attribute8 := NULL;
488   ELSE
489     p_x_visit_rec.attribute8 := p_x_visit_rec.attribute8;
490   END IF;
491 
492   IF  p_x_visit_rec.attribute9 = Fnd_Api.G_MISS_CHAR THEN
493     p_x_visit_rec.attribute9 := NULL;
494   ELSE
495     p_x_visit_rec.attribute9 := p_x_visit_rec.attribute9;
496   END IF;
497 
498   IF  p_x_visit_rec.attribute10 = Fnd_Api.G_MISS_CHAR THEN
499     p_x_visit_rec.attribute10 := NULL;
500   ELSE
501     p_x_visit_rec.attribute10 := p_x_visit_rec.attribute10;
502   END IF;
503 
504   IF  p_x_visit_rec.attribute11 = Fnd_Api.G_MISS_CHAR THEN
505     p_x_visit_rec.attribute11 := NULL;
506   ELSE
507     p_x_visit_rec.attribute11 := p_x_visit_rec.attribute11;
508   END IF;
509 
510   IF  p_x_visit_rec.attribute12 = Fnd_Api.G_MISS_CHAR THEN
511     p_x_visit_rec.attribute12 := NULL;
512   ELSE
513     p_x_visit_rec.attribute12 := p_x_visit_rec.attribute12;
514   END IF;
515 
516   IF  p_x_visit_rec.attribute13 = Fnd_Api.G_MISS_CHAR THEN
517     p_x_visit_rec.attribute13 := NULL;
518   ELSE
519     p_x_visit_rec.attribute13 := p_x_visit_rec.attribute13;
520   END IF;
521 
522   IF  p_x_visit_rec.attribute14 = Fnd_Api.G_MISS_CHAR THEN
523     p_x_visit_rec.attribute14 := NULL;
524   ELSE
525     p_x_visit_rec.attribute14 := p_x_visit_rec.attribute14;
526   END IF;
527 
528   IF  p_x_visit_rec.attribute15 = Fnd_Api.G_MISS_CHAR THEN
529     p_x_visit_rec.attribute15 := NULL;
530   ELSE
531     p_x_visit_rec.attribute15 := p_x_visit_rec.attribute15;
532   END IF;
533 
534 END Default_Missing_Attribs;
535 
536 --------------------------------------------------------------------
537 -- FUNCTION
538 --     Get_Visit_Id
539 --
540 --------------------------------------------------------------------
541 FUNCTION  Get_Visit_Id RETURN NUMBER IS
542 
543  -- To find the next id value from visit sequence
544  CURSOR c_seq IS
545  SELECT Ahl_Visits_B_S.NEXTVAL
546  FROM   dual;
547 
548  -- To find whether id already exists
549  CURSOR c_id_exists (x_id IN NUMBER) IS
550  SELECT 1 FROM   Ahl_Visits_VL
551  WHERE  Visit_id = x_id;
552 
553  L_API_NAME         CONSTANT VARCHAR2(30)   := 'Get_Visit_Id';
554  L_FULL_NAME        CONSTANT VARCHAR2(60)   := G_PKG_NAME || '.' || L_API_NAME;
555  L_DEBUG            CONSTANT VARCHAR2(90)   := 'ahl.plsql.'||L_FULL_NAME;
556 
557  x_Visit_Id NUMBER;
558  l_dummy NUMBER;
559 BEGIN
560   IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level) THEN
561     fnd_log.string(fnd_log.level_procedure,L_DEBUG||'.begin','At the start of function');
562   END IF;
563 
564   LOOP
565       -- If the ID is not passed into the API, then
566       -- grab a value from the sequence.
567       OPEN c_seq;
568       FETCH c_seq INTO x_Visit_Id;
569       CLOSE c_seq;
570       -- Check to be sure that the sequence does not exist.
571       OPEN c_id_exists (x_Visit_Id);
572       FETCH c_id_exists INTO l_dummy;
573       CLOSE c_id_exists;
574       -- If the value for the ID already exists, then
575       -- l_dummy would be populated with '1', otherwise, it receives NULL.
576       EXIT WHEN l_dummy = null ;
577   END LOOP;
578 
579   IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level) THEN
580     fnd_log.string(fnd_log.level_procedure,L_DEBUG,'New visit id : ' || x_Visit_Id);
581     fnd_log.string(fnd_log.level_procedure,L_DEBUG||'.end','At the end of function');
582   END IF;
583 
584   RETURN x_Visit_Id;
585 
586 END Get_Visit_Id;
587 
588 --------------------------------------------------------------------
589 -- FUNCTION
590 --    Get_Visit_Number
591 --
592 --------------------------------------------------------------------
593 FUNCTION Get_Visit_Number RETURN NUMBER IS
594   x_visit_number NUMBER;
595 
596   -- To find maximum visit number among all visits
597   CURSOR c_visit_number IS
598   SELECT MAX(visit_number)
599   FROM Ahl_Visits_B;
600 
601   L_API_NAME         CONSTANT VARCHAR2(30)    := 'Get_Visit_Number';
602   L_FULL_NAME        CONSTANT VARCHAR2(60)    := G_PKG_NAME || '.' || L_API_NAME;
603   L_DEBUG            CONSTANT VARCHAR2(90)    := 'ahl.plsql.'||L_FULL_NAME;
604 BEGIN
605 
606   IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level) THEN
607     fnd_log.string(fnd_log.level_procedure,L_DEBUG||'.begin','At the start of function');
608   END IF;
609 
610   -- Check for Visit Number
611   OPEN c_visit_number;
612   FETCH c_visit_number INTO x_visit_number;
613   CLOSE c_visit_number;
614 
615   IF x_visit_number IS NOT NULL THEN
616     x_visit_number := x_visit_number + 1;
617   ELSE
618     x_visit_number := 1;
619   END IF;
620 
621   IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level) THEN
622     fnd_log.string(fnd_log.level_procedure,L_DEBUG,'New visit number : ' || x_visit_number);
623     fnd_log.string(fnd_log.level_procedure,L_DEBUG||'.end','At the end of function');
624   END IF;
625 
626   RETURN x_visit_number;
627 
628 END Get_Visit_Number;
629 --------------------------------------------------------------------
630 -- FUNCTION
631 --    Get_Visit_Task_Number
632 --
633 --------------------------------------------------------------------
634 FUNCTION Get_Visit_Task_Number(p_visit_id IN NUMBER)
635 RETURN NUMBER IS
636     x_Visit_Task_Number NUMBER ;
637 
638       -- To find maximum visit task nubmer among all tasks for a particular visit
639     CURSOR c_task_number IS
640       SELECT MAX(visit_task_number)
641       FROM Ahl_Visit_Tasks_B
642       WHERE Visit_Id = p_visit_id;
643 
644    L_API_NAME         CONSTANT VARCHAR2(30)   := 'Get_Visit_Task_Number';
645    L_FULL_NAME        CONSTANT VARCHAR2(60)   := G_PKG_NAME || '.' || L_API_NAME;
646    L_DEBUG            CONSTANT VARCHAR2(90)   := 'ahl.plsql.'||L_FULL_NAME;
647 
648 BEGIN
649   IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level) THEN
650     fnd_log.string(fnd_log.level_procedure,L_DEBUG||'.begin','At the start of function');
651   END IF;
652 
653   -- Check for Visit Number
654   OPEN c_Task_Number;
655   FETCH c_Task_Number INTO x_Visit_Task_Number;
656   CLOSE c_Task_Number;
657 
658   IF x_Visit_Task_Number IS NOT NULL THEN
659     x_Visit_Task_Number := x_Visit_Task_Number + 1;
660   ELSE
661     x_Visit_Task_Number := 1;
662   END IF;
663 
664   IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level) THEN
665     fnd_log.string(fnd_log.level_procedure,L_DEBUG,'Visit Task Number - ' || x_Visit_Task_Number);
666     fnd_log.string(fnd_log.level_procedure,L_DEBUG||'.end','At the end of function');
667   END IF;
668 
669   RETURN x_Visit_Task_Number;
670 END Get_Visit_Task_Number;
671 --------------------------------------------------------------------
672 -- END: Defining local functions and procedures BODY              --
673 --------------------------------------------------------------------
674 
675 ----------------------------------------------------------------------
676 -- START: Defining procedures BODY, which are called from UI screen --
677 ----------------------------------------------------------------------
678 
679 --------------------------------------------------------------------
680 -- PROCEDURE
681 --    Process_Visit
682 --
683 -- PURPOSE
684 --    Process Visit Records from front end screen intermediate step
685 --    between API's and frontend.
686 --------------------------------------------------------------------
687 PROCEDURE Process_Visit (
688    p_api_version            IN      NUMBER,
689    p_init_msg_list          IN      VARCHAR2  := FND_API.g_false,
690    p_commit                 IN      VARCHAR2  := FND_API.g_false,
691    p_validation_level       IN      NUMBER    := FND_API.g_valid_level_full,
692    p_module_type            IN      VARCHAR2  := 'JSP',
693    p_x_Visit_tbl            IN OUT  NOCOPY Visit_Tbl_Type,
694    x_return_status          OUT     NOCOPY VARCHAR2,
695    x_msg_count              OUT     NOCOPY NUMBER,
696    x_msg_data               OUT     NOCOPY VARCHAR2
697 )
698 IS
699  -- Define local variables
700  l_api_name         CONSTANT VARCHAR2(30) := 'Process_Visit';
701  l_api_version      CONSTANT NUMBER       := 1.0;
702  L_FULL_NAME        CONSTANT VARCHAR2(60) := G_PKG_NAME || '.' || L_API_NAME;
703  L_DEBUG            CONSTANT VARCHAR2(90) := 'ahl.plsql.'||L_FULL_NAME;
704 
705  l_msg_count                NUMBER;
706  l_visit_id                 NUMBER;
707  p_visit_id                 NUMBER;
708 
709  l_return_status            VARCHAR2(1);
710  l_msg_data                 VARCHAR2(2000);
711  -- Transit Visit Change
712  -- yazhou start
713  -- SKPATHAK :: Bug 9115894 :: 23-NOV-2009
714  l_status_flag   VARCHAR2(1)  := 'S';
715  l_init_msg_list VARCHAR2(1)  := FND_API.g_false;
716  l_message_stack_tbl G_MESSAGE_STACK_TBL;
717 
718  l_visit_status             VARCHAR2(30);
719  l_ue_ids                   VARCHAR2(4000);
720  l_item_key                 VARCHAR2(100);
721 
722  -- To find out visit status
723  CURSOR c_visit_status (x_visit_id IN NUMBER) IS
724  SELECT STATUS_CODE FROM AHL_VISITS_B
725  WHERE VISIT_ID = x_visit_id;
726 
727  -- Cursor to get planned UEs for the given visit
728  CURSOR get_visit_planned_ues (c_visit_id NUMBER) IS
729      SELECT distinct unit_effectivity_id
730      FROM   AHL_VISIT_TASKS_B
731      WHERE  visit_id       = c_visit_id
732      AND    task_type_code = 'PLANNED';
733 
734  -- yazhou end
735  --
736 BEGIN
737   -- Standard Start of API savepoint
738   SAVEPOINT Process_Visit;
739 
740   IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level) THEN
741     fnd_log.string(fnd_log.level_procedure,L_DEBUG||'.begin','At the start of PLSQL procedure');
742   END IF;
743 
744   --  Initialize API return status to success
745   -- Initialize message list if p_init_msg_list is set to TRUE.
746   IF FND_API.to_boolean(p_init_msg_list) THEN
747     FND_MSG_PUB.initialize;
748   END IF;
749 
750   x_return_status := FND_API.G_RET_STS_SUCCESS;
751 
752   -- Standard call to check for call compatibility.
753   IF NOT FND_API.COMPATIBLE_API_CALL(l_api_version,
754                                       p_api_version,
755                                       l_api_name,G_PKG_NAME) THEN
756        RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
757   END IF;
758 
759   --------------------Start of API Body-----------------------------------
760   IF p_x_Visit_tbl.COUNT > 0 THEN
761    FOR i IN p_x_Visit_tbl.first..p_x_Visit_tbl.LAST
762    LOOP
763     -- For Create
764     IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
765       fnd_log.string(fnd_log.level_statement,L_DEBUG,'p_x_Visit_tbl(i).operation_flag : '||p_x_Visit_tbl(i).operation_flag);
766     END IF;
767 
768     IF p_x_Visit_tbl(i).operation_flag = 'I' or p_x_Visit_tbl(i).operation_flag = 'i' THEN
769 
770       IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
771         fnd_log.string(fnd_log.level_statement,L_DEBUG,'Before calling Create_Visit');
772       END IF;
773 
774       Create_Visit
775            (
776             p_api_version             => l_api_version,
777             -- Changed by jaramana on 18-NOV-2009 for bug 9115894
778             p_init_msg_list           => FND_API.g_false,
779             p_commit                  => Fnd_Api.g_false,
780             p_validation_level        => p_validation_level,
781             p_module_type             => p_module_type,
782             p_x_visit_rec             => p_x_Visit_tbl(i),
783             x_return_status           => l_return_status,
784             x_msg_count               => l_msg_count,
785             x_msg_data                => l_msg_data
786             );
787 
788       IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
789         fnd_log.string(fnd_log.level_statement,L_DEBUG,'After calling Create_Visit - l_return_status : '||l_return_status);
790       END IF;
791 
792    --For Update
793    ELSIF p_x_Visit_tbl(i).operation_flag = 'U' or p_x_Visit_tbl(i).operation_flag = 'u' THEN
794 
795       IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
796         fnd_log.string(fnd_log.level_statement,L_DEBUG,'Before calling Update_Visit');
797       END IF;
798 
799       Update_Visit
800            (
801             p_api_version             => l_api_version,
802             -- Changed by jaramana on 18-NOV-2009 for bug 9115894
803             p_init_msg_list           => FND_API.g_false,
804             p_commit                  => Fnd_Api.g_false,
805             p_validation_level        => p_validation_level,
806             p_module_type             => p_module_type,
807             p_x_Visit_rec             => p_x_Visit_tbl(i),
808             x_return_status           => l_return_status,
809             x_msg_count               => l_msg_count,
810             x_msg_data                => l_msg_data
811           );
812 
813       IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
814         fnd_log.string(fnd_log.level_statement,L_DEBUG,'After calling Update_Visit - l_return_status : '||l_return_status);
815       END IF;
816 
817     --For Delete
818    ELSIF p_x_Visit_tbl(i).operation_flag = 'D' or p_x_Visit_tbl(i).operation_flag = 'd' THEN
819 
820       IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
821         fnd_log.string(fnd_log.level_statement,L_DEBUG,'Before calling Delete_Visit');
822       END IF;
823 
824       Delete_Visit
825            (
826             p_api_version             => l_api_version,
827             -- Changed by jaramana on 18-NOV-2009 for bug 9115894
828             p_init_msg_list           => FND_API.g_false,
829             p_commit                  => Fnd_Api.g_false,
830             p_validation_level        => p_validation_level,
831             p_Visit_id                => p_x_visit_tbl(i).visit_id,
832             x_return_status           => l_return_status,
833             x_msg_count               => l_msg_count,
834             x_msg_data                => l_msg_data
835           );
836 
837       IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
838         fnd_log.string(fnd_log.level_statement,L_DEBUG,'After calling Delete_Visit - l_return_status : '||l_return_status);
839       END IF;
840 
841    -- Transit Visit Change
842    -- yazhou start
843    -- Will be called from UA
844    -- To Synchronize visit with flight schedule change
845    -- TCHIMIRA :: ER 13416865 :: Added the condition p_module_type = 'JSP'
846    ELSIF ((p_x_Visit_tbl(i).operation_flag = 'S' or p_x_Visit_tbl(i).operation_flag = 's')
847           AND (p_module_type <> 'JSP')) THEN
848 
849       IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
850         fnd_log.string(fnd_log.level_statement,L_DEBUG,'Before calling Synchronize_Visit');
851       END IF;
852 
853       Synchronize_Visit
854            (
855             p_api_version             => l_api_version,
856             -- Changed by jaramana on 18-NOV-2009 for bug 9115894
857             p_init_msg_list           => FND_API.g_false,
858             p_commit                  => Fnd_Api.g_false,
859             p_validation_level        => p_validation_level,
860             p_x_Visit_rec             => p_x_visit_tbl(i),
861             x_return_status           => l_return_status,
862             x_msg_count               => l_msg_count,
863             x_msg_data                => l_msg_data
864           );
865 
866       IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
867         fnd_log.string(fnd_log.level_statement,L_DEBUG,'After calling Synchronize_Visit - l_return_status : '||l_return_status);
868       END IF;
869 
870    -- Will be called from UA
871    -- Delete the visit if visit is in Draft or Planning status
872    -- Cancel the visit if visit is in Released or Partially Released status
873    ELSIF p_x_Visit_tbl(i).operation_flag = 'X' or p_x_Visit_tbl(i).operation_flag = 'x' THEN
874 
875        OPEN c_visit_status(p_x_Visit_tbl(i).visit_id);
876        FETCH c_visit_status INTO l_visit_status;
877        IF c_visit_status%NOTFOUND THEN
878         CLOSE c_visit_status;
879         IF Fnd_Msg_Pub.check_msg_level(Fnd_Msg_Pub.g_msg_lvl_error) THEN
880             Fnd_Message.set_name('AHL', 'AHL_API_RECORD_NOT_FOUND');
881             Fnd_Msg_Pub.ADD;
882             IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
883               fnd_log.string(fnd_log.level_statement,L_DEBUG,'Visit status not found for visit : ' ||p_x_Visit_tbl(i).visit_id );
884             END IF;
885          END IF;
886          RAISE Fnd_Api.g_exc_error;
887        ELSE
888         CLOSE c_visit_status;
889        END IF;
890 
891        -- SKPATHAK :: Bug 9115894 :: 23-NOV-2009
892        -- If status flag is V, then initialize the message list
893        -- and store all the message in the message stack in l_message_stack_tbl
894        IF l_status_flag = 'V' THEN
895           Get_Message_Stack (x_message_stack_tbl => l_message_stack_tbl);
896           l_init_msg_list := FND_API.g_true;
897        ELSE
898           l_init_msg_list := FND_API.g_false;
899        END IF;
900 
901        -- SKPATHAK :: 02-MAY-2011 :: VWPE: ER:12424063
902 
903        -- MANESING::Bug 13799364, 29-Mar-2012, get planned UEs, will be used later for launching notification
904        l_ue_ids := null;
905        FOR planned_ue_rec IN get_visit_planned_ues (p_x_visit_tbl(i).visit_id) LOOP
906            l_ue_ids := l_ue_ids || ',' || to_char(planned_ue_rec.unit_effectivity_id);
907        END LOOP;
908 
909        -- Even the visits in DRAFT status can be deleted
910        IF l_visit_status IN ('PLANNING', 'DRAFT') THEN
911           IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
912             fnd_log.string(fnd_log.level_statement,L_DEBUG,'l_visit_status : '||l_visit_status);
913             fnd_log.string(fnd_log.level_statement,L_DEBUG,'Before calling Delete_Visit');
914           END IF;
915 
916           Delete_Visit
917            (
918             p_api_version             => l_api_version,
919             -- Changed by jaramana on 18-NOV-2009 for bug 9115894
920             p_init_msg_list           => l_init_msg_list,
921             p_commit                  => Fnd_Api.g_false,
922             p_validation_level        => p_validation_level,
923             p_Visit_id                => p_x_visit_tbl(i).visit_id,
924             x_return_status           => l_return_status,
925             x_msg_count               => l_msg_count,
926             x_msg_data                => l_msg_data
927           );
928 
929           IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
930             fnd_log.string(fnd_log.level_statement,L_DEBUG,'After calling Delete_Visit - l_return_status : '|| l_return_status);
931           END IF;
932        ELSIF l_visit_status = 'RELEASED' OR l_visit_status = 'PARTIALLY RELEASED' THEN
933           IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
934             fnd_log.string(fnd_log.level_statement,L_DEBUG,'l_visit_status : '||l_visit_status);
935             fnd_log.string(fnd_log.level_statement,L_DEBUG,'Before calling Cancel_Visit');
936           END IF;
937 
938           Cancel_Visit (
939             p_api_version             => l_api_version,
940             -- Changed by jaramana on 18-NOV-2009 for bug 9115894
941             p_init_msg_list           => l_init_msg_list,
942             p_commit                  => Fnd_Api.g_false,
943             p_validation_level        => p_validation_level,
944             p_module_type             => p_module_type,
945             p_visit_id                => p_x_visit_tbl(i).visit_id,
946             p_obj_ver_num             => p_x_visit_tbl(i).object_version_number,
947             x_return_status           => l_return_status,
948             x_msg_count               => l_msg_count,
949             x_msg_data                => l_msg_data    );
950 
951           IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
952             fnd_log.string(fnd_log.level_statement,L_DEBUG,'After calling Cancel_Visit - l_return_status : '|| l_return_status);
953           END IF;
954        END IF;
955     -- yazhou end
956 
957        /* MANESING::Bug 13799364, 29-Mar-2012, For Auto-Visits, if a Visit has planned UEs,
958         * then launch Visit Cancel notification when the associated Flight Schedule is deleted.
959         */
960        -- if Visit is Deleted or Cancelled
961        IF (l_visit_status IN ('DRAFT', 'PLANNING', 'RELEASED', 'PARTIALLY RELEASED')) THEN
962 
963            -- if Visit has planned UEs
964            IF (l_ue_ids IS NOT NULL) THEN
965                -- remove an extra "," in the beginning of this string
966                l_ue_ids := substr(l_ue_ids, 2);
967 
968                -- launch visit cancel notification
969                IF (l_log_statement >= l_log_current_level) THEN
970                    FND_LOG.string(l_log_statement, l_debug, 'Invoking AHL_AVF_OPER_VSTS_PVT.Launch_Visit_Can_Notification API for visit id=' || p_x_visit_tbl(i).visit_id ||
971                                                             ' and ue_ids=' || l_ue_ids);
972                END IF;
973 
974                AHL_AVF_OPER_VSTS_PVT.Launch_Visit_Can_Notification (
975                    p_visit_id       => p_x_visit_tbl(i).visit_id,
976                    p_ue_ids         => l_ue_ids,
977                    p_commit         => FND_API.G_FALSE,
978                    x_item_key       => l_item_key,
979                    x_return_status  => l_return_status
980                );
981 
982                IF (l_log_statement >= l_log_current_level) THEN
983                    FND_LOG.string(l_log_statement, l_debug, 'After call to AHL_AVF_OPER_VSTS_PVT.Launch_Visit_Can_Notification API, Return Status: ' || l_return_status);
984                END IF;
985 
986                IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
987 
988                    IF (l_return_status = FND_API.G_RET_STS_ERROR) THEN
989                        RAISE FND_API.G_EXC_ERROR;
990                    ELSIF (l_return_status = FND_API.G_RET_STS_UNEXP_ERROR) THEN
991                        RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
992                    END IF;
993 
994                END IF;
995            END IF; -- IF l_ue_ids IS NOT NULL
996 
997        END IF; -- IF visit is Deleted or Cancelled
998 
999        -- SKPATHAK :: Bug 9115894 :: 23-NOV-2009
1000        -- If status flag is V, put the stored messages back to the message stack
1001        IF l_status_flag = 'V' THEN
1002           Set_Message_Stack (p_message_stack_tbl => l_message_stack_tbl);
1003        END IF;
1004     END IF;
1005 
1006     -- SKPATHAK :: Bug 9115894 :: 19-NOV-2009
1007     -- Populate the return status in l_status_flag. Make sure that the status
1008     -- priority remains U, then E, then V and then S (which is default)
1009     -- That is, U should not get overwritten by E or V, and E should not get overwritten by V
1010     IF l_return_status = 'U' OR l_status_flag = 'U' THEN
1011        l_status_flag  := 'U';
1012     ELSIF l_return_status = 'E' OR l_status_flag = 'E' THEN
1013        l_status_flag  := 'E';
1014     ELSIF l_return_status = 'V' THEN
1015        l_status_flag  := 'V';
1016     END IF;
1017 
1018   END LOOP;
1019  END IF;
1020 
1021  -- SKPATHAK :: Bug 9115894 :: 19-NOV-2009
1022  IF (l_status_flag = 'E') THEN
1023    RAISE Fnd_Api.G_EXC_ERROR;
1024  ELSIF (l_status_flag = 'U') THEN
1025    RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
1026  END IF;
1027 
1028 
1029  ------------------------End of API Body---------------------------------------
1030  --Standard check to count messages
1031  l_msg_count := Fnd_Msg_Pub.count_msg;
1032 
1033  IF l_msg_count > 0 THEN
1034    x_msg_count := l_msg_count;
1035    IF l_status_flag <> 'V' THEN
1036       -- Unknown messages
1037     x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
1038       RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
1039    END IF;
1040  END IF;
1041 
1042  -- Proceed to commit if status is 'S' or if there were only validation errors
1043  --Standard check for commit
1044  IF Fnd_Api.TO_BOOLEAN(p_commit) THEN
1045   COMMIT;
1046  END IF;
1047 
1048  -- Added by jaramana on 18-NOV-2009 for bug 9115894
1049  -- If validation had failed for any of the visits, return 'V' to the caller
1050  -- Otherwise X_return_status will already be 'S'
1051  IF l_status_flag = 'V' THEN
1052    X_return_status := G_VALIDATION_ERROR_STATUS;
1053    FND_MSG_PUB.count_and_get( p_encoded => FND_API.G_FALSE,
1054                               p_count => x_msg_count,
1055                               p_data  => x_msg_data);
1056  END IF;
1057 
1058  IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level) THEN
1059     fnd_log.string(fnd_log.level_procedure, L_DEBUG||'.end', 'At the end of PLSQL procedure. x_return_status = ' || x_return_status);
1060  END IF;
1061 
1062 EXCEPTION
1063 
1064 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
1065     ROLLBACK TO Process_Visit;
1066     X_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1067     FND_MSG_PUB.count_and_get( p_encoded => FND_API.G_FALSE,
1068                                p_count => x_msg_count,
1069                                p_data  => x_msg_data);
1070 
1071 WHEN FND_API.G_EXC_ERROR THEN
1072     ROLLBACK TO Process_Visit;
1073     X_return_status := FND_API.G_RET_STS_ERROR;
1074     FND_MSG_PUB.count_and_get( p_encoded => FND_API.G_FALSE,
1075                                p_count => x_msg_count,
1076                                p_data  => X_msg_data);
1077 
1078 WHEN OTHERS THEN
1079     ROLLBACK TO Process_Visit;
1080     X_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1081     IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
1082     THEN
1083     fnd_msg_pub.add_exc_msg(p_pkg_name        =>  'AHL_VWP_VISITS_PVT',
1084                             p_procedure_name  =>  'Process_Visit',
1085                             p_error_text      => SUBSTR(SQLERRM,1,240));
1086     END IF;
1087     FND_MSG_PUB.count_and_get( p_encoded => FND_API.G_FALSE,
1088                                p_count => x_msg_count,
1089                                p_data  => x_msg_data);
1090 END Process_Visit;
1091 
1092 --------------------------------------------------------------------
1093 -- PROCEDURE
1094 --    Get_Visit_Details
1095 --
1096 -- PURPOSE
1097 --    Get a particular Visit Records with all details
1098 --------------------------------------------------------------------
1099 PROCEDURE Get_Visit_Details (
1100    p_api_version             IN   NUMBER,
1101    p_init_msg_list           IN   VARCHAR2  := Fnd_Api.g_false,
1102    p_commit                  IN   VARCHAR2  := Fnd_Api.g_false,
1103    p_validation_level        IN   NUMBER    := Fnd_Api.g_valid_level_full,
1104    p_module_type             IN   VARCHAR2  := 'JSP',
1105    p_visit_id                IN   NUMBER,
1106    x_Visit_rec               OUT  NOCOPY Visit_Rec_Type,
1107    x_return_status           OUT  NOCOPY VARCHAR2,
1108    x_msg_count               OUT  NOCOPY NUMBER,
1109    x_msg_data                OUT  NOCOPY VARCHAR2
1110    )
1111 IS
1112   -- Define local Variables
1113    L_API_VERSION          CONSTANT NUMBER := 1.0;
1114    L_API_NAME             CONSTANT VARCHAR2(30) := 'Get_Visit_Details';
1115    L_FULL_NAME            CONSTANT VARCHAR2(60) := G_PKG_NAME || '.' || L_API_NAME;
1116    L_DEBUG                CONSTANT VARCHAR2(90) := G_PKG_NAME || '.' || L_API_NAME;
1117 
1118    l_msg_data             VARCHAR2(2000);
1119    l_project_flag         VARCHAR2(80);
1120    l_simulation_plan_name VARCHAR2(80);
1121    l_unit_name            VARCHAR2(80);
1122    l_unit_header_id       NUMBER;
1123    l_hour                 VARCHAR2(30);
1124    l_hour_close           VARCHAR2(30);
1125    l_default              VARCHAR2(30);
1126    l_proj_temp_name       VARCHAR2(30);
1127    l_return_status        VARCHAR2(1);
1128    l_valid_flag           VARCHAR2(1);
1129    --PRAKKUM ::FP PIE :: 13-OCT-2010
1130    l_project_name         VARCHAR2(30);
1131 
1132    l_visit_id             NUMBER:= p_visit_id;
1133    l_count                NUMBER;
1134    l_duration             NUMBER;
1135    l_visit_end_hour       NUMBER;
1136    l_proj_temp_id         NUMBER;
1137    l_workorder_id         NUMBER;
1138    i                      NUMBER;
1139    x                      NUMBER;
1140 
1141    l_due_date             DATE;
1142    x_due_by_date          DATE;
1143    l_visit_end_date       DATE;
1144    l_minute  NUMBER(2);
1145    l_minute_close  NUMBER(2);
1146 
1147    l_workorder_name       VARCHAR2(80); -- Added in 11.5.10
1148 
1149    ---Arvind changes for FlightNumber
1150    l_flight_number        VARCHAR2(30);
1151    ---End
1152 
1153    -- Define local record datatypes
1154    l_visit_rec          Visit_Rec_Type;
1155 
1156    -- Define local cursors
1157    --Arvind changes for FlightNumber
1158    -- To retreive FlightNumber based on UnitScheduleID
1159    CURSOR c_flight_number (x_id IN NUMBER) IS
1160    select flight_number
1161    from ahl_unit_schedules
1162    where unit_schedule_id=x_id;
1163    --end
1164 
1165    -- To find out required search visit details
1166    -- Fix for ADS bug# 4357001.
1167    -- Modified query so that Visits retrieved are not OU stripped.
1168    -- 'View Visit' should show visit details accross OU.
1169    -- Following query is copied from ahl_search_visits_v without the CLIENT_INFO.
1170    CURSOR c_visit (x_id IN NUMBER) IS
1171    --SELECT * FROM AHL_SEARCH_VISITS_V
1172    --WHERE VISIT_ID = x_id;
1173    --AnRaj:Changed query, Perf Bug:4919502
1174 /* SELECT AVTS.VISIT_ID , AVTS.VISIT_NUMBER, AVTS.VISIT_NAME,
1175    AVTS.ORGANIZATION_ID , HROU.NAME ORGANIZATION_NAME, AVTS.DEPARTMENT_ID ,
1176    BDPT.DESCRIPTION DEPARTMENT_NAME , AVTS.OBJECT_VERSION_NUMBER,
1177    AVTS.START_DATE_TIME,
1178    AVTS.STATUS_CODE, FLVT1.MEANING STATUS_MEAN, AVTS.TEMPLATE_FLAG,
1179    AVTS.ITEM_INSTANCE_ID , CSIS.SERIAL_NUMBER , AVTS.INVENTORY_ITEM_ID ,
1180    AVTS.ITEM_ORGANIZATION_ID , MTSB.CONCATENATED_SEGMENTS ITEM_DESCRIPTION,
1181    AVTS.VISIT_TYPE_CODE , FLVT.MEANING VISIT_TYPE_MEAN, AVTS.SIMULATION_PLAN_ID,
1182    ASPV.SIMULATION_PLAN_NAME, NVL(ASPV.PRIMARY_PLAN_FLAG,'Y') ,
1183    AVTS.SPACE_CATEGORY_CODE, FLVT2.MEANING SPACE_CATEGORY_MEAN,
1184    AVTS.SERVICE_REQUEST_ID,
1185    AVTS.CLOSE_DATE_TIME, CSAB.INCIDENT_NUMBER, UC.NAME UNIT_NAME,
1186    AVTS.PRIORITY_CODE,
1187    FLVT3.MEANING PRIORITY_MEAN, AVTS.PROJECT_TEMPLATE_ID,
1188    PA.NAME PROJECT_TEMPLATE_NAME ,
1189    AVTS.UNIT_SCHEDULE_ID, AVTS.ASSO_PRIMARY_VISIT_ID
1190    FROM AHL_VISITS_VL AVTS, AHL_SIMULATION_PLANS_VL ASPV,
1191    CSI_ITEM_INSTANCES CSIS, HR_ALL_ORGANIZATION_UNITS HROU,
1192    BOM_DEPARTMENTS BDPT, MTL_SYSTEM_ITEMS_B_KFV MTSB,
1193    FND_LOOKUP_VALUES_VL FLVT, FND_LOOKUP_VALUES_VL FLVT1,
1194    FND_LOOKUP_VALUES_VL FLVT2, FND_LOOKUP_VALUES_VL FLVT3,
1195    PA_PROJECTS_ALL PA, AHL_UNIT_CONFIG_HEADERS UC, CS_INCIDENTS_ALL_B CSAB
1196    WHERE AVTS.ITEM_INSTANCE_ID = UC.CSI_ITEM_INSTANCE_ID(+)
1197    AND AVTS.ITEM_INSTANCE_ID = CSIS.INSTANCE_ID(+)
1198    AND AVTS.ORGANIZATION_ID = HROU.ORGANIZATION_ID(+)
1199    AND AVTS.DEPARTMENT_ID = BDPT.DEPARTMENT_ID(+)
1200    AND AVTS.SIMULATION_PLAN_ID = ASPV.SIMULATION_PLAN_ID(+)
1201    AND AVTS. INVENTORY_ITEM_ID = MTSB.INVENTORY_ITEM_ID(+)
1202    AND AVTS. ITEM_ORGANIZATION_ID = MTSB.ORGANIZATION_ID(+)
1203    AND FLVT.LOOKUP_TYPE(+) ='AHL_PLANNING_VISIT_TYPE'
1204    AND FLVT.LOOKUP_CODE(+) = AVTS.VISIT_TYPE_CODE
1205    AND FLVT1.LOOKUP_TYPE(+) = 'AHL_VWP_VISIT_STATUS'
1206    AND FLVT1.LOOKUP_CODE(+) = AVTS.STATUS_CODE
1207    AND FLVT2.LOOKUP_TYPE(+) = 'AHL_LTP_SPACE_CATEGORY'
1208    AND FLVT2.LOOKUP_CODE(+) = AVTS.SPACE_CATEGORY_CODE
1209    AND FLVT3.LOOKUP_TYPE(+) = 'AHL_VWP_VISIT_PRIORITY'
1210    AND FLVT3.LOOKUP_CODE(+) = AVTS.PRIORITY_CODE
1211    AND PA.PROJECT_ID(+) = AVTS.PROJECT_TEMPLATE_ID
1212    AND AVTS.SERVICE_REQUEST_ID = CSAB.INCIDENT_ID(+)
1213    AND AVTS.TEMPLATE_FLAG = 'N' AND AVTS.STATUS_CODE <> 'DELETED'
1214    AND UC.active_end_date is null
1215    AND VISIT_ID = x_id;*/
1216    -- AnRaj: Replaced HR_ALL_ORGANIZATION_UNITS with HR_ALL_ORGANIZATION_UNITS_TL, Fix for Bug# 5367598
1217    SELECT  AVTS.VISIT_ID , AVTS.VISIT_NUMBER,
1218         AVTSTL.VISIT_NAME,AVTS.ORGANIZATION_ID ,
1219         AVTS.START_DATE_TIME, AVTS.CLOSE_DATE_TIME,AVTS.VISIT_TYPE_CODE ,
1220         AVTS.DEPARTMENT_ID ,AVTS.STATUS_CODE,AVTS.OBJECT_VERSION_NUMBER,
1221         HROU.NAME ORGANIZATION_NAME,
1222         BDPT.DESCRIPTION DEPARTMENT_NAME ,
1223         FLVT1.MEANING STATUS_MEAN,
1224         AVTS.TEMPLATE_FLAG,AVTS.ITEM_INSTANCE_ID ,
1225         AVTS.INVENTORY_ITEM_ID,AVTS.ITEM_ORGANIZATION_ID,
1226         AVTS.SIMULATION_PLAN_ID,AVTS.SERVICE_REQUEST_ID,
1227         AVTS.PRIORITY_CODE,AVTS.SPACE_CATEGORY_CODE,
1228         AVTS.PROJECT_TEMPLATE_ID,AVTS.UNIT_SCHEDULE_ID,AVTS.ASSO_PRIMARY_VISIT_ID,
1229         CSIS.SERIAL_NUMBER ,
1230         MTSB.CONCATENATED_SEGMENTS ITEM_DESCRIPTION,
1231         FLVT.MEANING VISIT_TYPE_MEAN,FLVT3.MEANING
1232         PRIORITY_MEAN,FLVT2.MEANING SPACE_CATEGORY_MEAN,
1233         ASPVTL.SIMULATION_PLAN_NAME, NVL(ASPV.PRIMARY_PLAN_FLAG,'Y') ,
1234         CSAB.INCIDENT_NUMBER, UC.NAME UNIT_NAME,
1235         -- SKPATHAK :: Bug #8983097 :: 20-OCT-2009
1236         -- Removed project template from the SELECT, FROM, and WHERE clauses of this cursor
1237         --PA.NAME PROJECT_TEMPLATE_NAME,
1238                 AVTS.TOP_PROJECT_TASK_ID, --PRAKKUM ::FP PIE :: 13-OCT-2010
1239        AVTS.INV_LOCATOR_ID -- Added by sowsubra
1240   FROM    AHL_VISITS_B AVTS,AHL_VISITS_TL AVTSTL,
1241         AHL_SIMULATION_PLANS_B ASPV,AHL_SIMULATION_PLANS_TL ASPVTL,
1242         CSI_ITEM_INSTANCES CSIS, HR_ALL_ORGANIZATION_UNITS_TL HROU,
1243         BOM_DEPARTMENTS BDPT, MTL_SYSTEM_ITEMS_B_KFV MTSB,
1244         FND_LOOKUP_VALUES FLVT, FND_LOOKUP_VALUES FLVT1,
1245         FND_LOOKUP_VALUES FLVT2, FND_LOOKUP_VALUES FLVT3,
1246         -- SKPATHAK :: Bug #8983097 :: 20-OCT-2009
1247         --PA_PROJECTS_ALL PA,
1248         AHL_UNIT_CONFIG_HEADERS UC, CS_INCIDENTS_ALL_B CSAB
1249   WHERE   AVTS.VISIT_ID = AVTSTL.VISIT_ID
1250   AND     AVTSTL.LANGUAGE = USERENV('LANG')
1251   AND     ASPV.SIMULATION_PLAN_ID = ASPVTL.SIMULATION_PLAN_ID(+)
1252   AND     ASPVTL.LANGUAGE(+) = USERENV('LANG')
1253   AND     AVTS.ITEM_INSTANCE_ID = UC.CSI_ITEM_INSTANCE_ID(+)
1254   AND     AVTS.ITEM_INSTANCE_ID = CSIS.INSTANCE_ID(+)
1255   AND     AVTS.ORGANIZATION_ID = HROU.ORGANIZATION_ID(+)
1256   AND     HROU.LANGUAGE(+) = USERENV('LANG')
1257   AND     AVTS.DEPARTMENT_ID = BDPT.DEPARTMENT_ID(+)
1258   AND     AVTS.SIMULATION_PLAN_ID = ASPV.SIMULATION_PLAN_ID(+)
1259   AND     AVTS. INVENTORY_ITEM_ID = MTSB.INVENTORY_ITEM_ID(+)
1260   AND     AVTS. ITEM_ORGANIZATION_ID = MTSB.ORGANIZATION_ID(+)
1261   AND     FLVT.LOOKUP_TYPE(+) ='AHL_PLANNING_VISIT_TYPE'
1262   AND     FLVT.LOOKUP_CODE(+) = AVTS.VISIT_TYPE_CODE
1263   AND     FLVT.LANGUAGE(+) = userenv('LANG')
1264   AND     FLVT1.LOOKUP_TYPE(+) = 'AHL_VWP_VISIT_STATUS'
1265   AND     FLVT1.LOOKUP_CODE(+) = AVTS.STATUS_CODE
1266   AND     FLVT1.LANGUAGE(+) = userenv('LANG')
1267   AND     FLVT2.LOOKUP_TYPE(+) = 'AHL_LTP_SPACE_CATEGORY'
1268   AND     FLVT2.LOOKUP_CODE(+) = AVTS.SPACE_CATEGORY_CODE
1269   AND     FLVT2.LANGUAGE(+) = userenv('LANG')
1270   AND     FLVT3.LOOKUP_TYPE(+) = 'AHL_VWP_VISIT_PRIORITY'
1271   AND     FLVT3.LOOKUP_CODE(+) = AVTS.PRIORITY_CODE
1272   AND     FLVT3.LANGUAGE(+) = userenv('LANG')
1273   -- SKPATHAK :: Bug #8983097 :: 20-OCT-2009
1274   --AND     PA.PROJECT_ID = AVTS.PROJECT_TEMPLATE_ID
1275   AND     AVTS.SERVICE_REQUEST_ID = CSAB.INCIDENT_ID(+)
1276   AND     AVTS.TEMPLATE_FLAG = 'N'
1277   AND     AVTS.STATUS_CODE <> 'DELETED'
1278   AND     UC.active_end_date is null
1279   AND     AVTS.VISIT_ID = x_id;
1280 
1281   c_visit_rec c_visit%ROWTYPE;
1282 
1283   -- To find out all visit/template details
1284   CURSOR c_visit_details (x_id IN NUMBER) IS
1285   SELECT * FROM AHL_VISITS_VL
1286   WHERE VISIT_ID = x_id;
1287 
1288   visit_rec  c_visit_details%ROWTYPE;
1289 
1290   --TCHIMIRA::P2P CP ER 9151144::02-DEC-2009
1291   --Cursor to fetch CP related details
1292   CURSOR c_conc_req_details(x_cp_req_id IN NUMBER) IS
1293   SELECT FLS.MEANING CP_STATUS_CODE, FLP.MEANING CP_PHASE_CODE, FCR.REQUEST_DATE CP_REQUEST_DATE
1294   FROM FND_CONCURRENT_REQUESTS FCR, FND_LOOKUPS FLS, FND_LOOKUPS FLP
1295   WHERE FCR.REQUEST_ID = x_cp_req_id
1296   AND ((FCR.STATUS_CODE = FLS.LOOKUP_CODE
1297   AND FLS.LOOKUP_TYPE = 'CP_STATUS_CODE')
1298   AND  (FCR.PHASE_CODE = FLP.LOOKUP_CODE
1299   AND  FLP.LOOKUP_TYPE = 'CP_PHASE_CODE'))  ;
1300 
1301   conc_req_rec c_conc_req_details%ROWTYPE;
1302 
1303   -- Cursor to find master workorder name for the given visit
1304   CURSOR c_workorder_csr (x_id IN NUMBER) IS
1305   SELECT WORKORDER_NAME, WORKORDER_ID FROM AHL_WORKORDERS
1306   WHERE MASTER_WORKORDER_FLAG = 'Y' AND VISIT_ID = x_id
1307   /*B6512777 - sowsubra - there is no task associated with visit master wo, hence included the check below to get the visit master wo name*/
1308    AND VISIT_TASK_ID IS NULL;
1309 
1310   -- CURSOR added to get the Project Template Name
1311   -- Post 11.5.10
1312   -- Fix for ADS bug# 4357001. Changed to use PA_PROJECTS_ALL table.
1313   CURSOR c_proj_template(p_proj_temp_id IN NUMBER) IS
1314   SELECT name FROM PA_PROJECTS_ALL
1315   WHERE project_id = p_proj_temp_id;
1316 
1317   CURSOR c_uc_header(x_instance_id IN NUMBER) IS
1318   SELECT name, UNIT_CONFIG_HEADER_ID FROM ahl_unit_config_headers
1319   WHERE CSI_ITEM_INSTANCE_ID = x_instance_id
1320   AND active_end_date is null;
1321 
1322   --PRAKKUM ::FP PIE :: 13-OCT-2010
1323   CURSOR get_project_name_csr(c_project_id IN NUMBER) IS
1324   SELECT name FROM PA_PROJECTS_ALL
1325   WHERE project_id = c_project_id;
1326 
1327   /*Added by sowsubra*/
1328   CURSOR c_get_subinv_loc_dtls(p_inv_locator_id IN NUMBER, p_org_id IN NUMBER) IS
1329     SELECT SUBINVENTORY_CODE, CONCATENATED_SEGMENTS
1330     FROM mtl_item_locations_kfv
1331     WHERE inventory_location_id = p_inv_locator_id;
1332 
1333   l_sub_code         VARCHAR2(10) := NULL;
1334   l_locator_code     VARCHAR2(240) := NULL;
1335 
1336  BEGIN
1337   -- Standard start of API savepoint
1338   SAVEPOINT Get_Visit_Details;
1339 
1340   IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level) THEN
1341     fnd_log.string(fnd_log.level_procedure,L_DEBUG||'.begin','At the start of PLSQL procedure, p_visit_id -  '||p_visit_id);
1342   END IF;
1343 
1344   -- Initialize message list if p_init_msg_list is set to TRUE.
1345   IF Fnd_Api.to_boolean(p_init_msg_list) THEN
1346     Fnd_Msg_Pub.initialize;
1347   END IF;
1348 
1349   --  Initialize API return status to success
1350   x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
1351 
1352   -- Standard call to check for call compatibility.
1353   IF NOT Fnd_Api.COMPATIBLE_API_CALL(l_api_version,
1354                                       p_api_version,
1355                                       l_api_name,G_PKG_NAME) THEN
1356        RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
1357   END IF;
1358   ------------------------------Start of API Body------------------------------------
1359 
1360   ----------------------------------------- Cursor ----------------------------------
1361   OPEN c_visit_details(p_visit_id);
1362   FETCH c_visit_details INTO visit_rec;
1363   CLOSE c_visit_details;
1364 
1365   OPEN c_Visit(p_visit_id);
1366   FETCH c_visit INTO c_visit_rec;
1367   CLOSE c_Visit;
1368 
1369   --TCHIMIRA::P2P CP ER 9151144::02-DEC-2009
1370   OPEN c_conc_req_details(visit_rec.request_id);
1371   FETCH c_conc_req_details INTO conc_req_rec;
1372   CLOSE c_conc_req_details;
1373   ------------------------------------------ Start -----------------------------------
1374   -- get workorder name and Id added in 11.5.10
1375   OPEN c_workorder_csr(p_visit_id);
1376   FETCH c_workorder_csr INTO l_workorder_name, l_workorder_id;
1377   IF c_workorder_csr%FOUND THEN
1378     l_visit_rec.job_number := l_workorder_name;
1379     --l_visit_rec.workorder_id := l_workorder_id;
1380   END IF;
1381   CLOSE c_workorder_csr;
1382 
1383   -- To find meaning for fnd_lookups code
1384   IF (visit_rec.project_flag IS NOT NULL) THEN
1385       SELECT MEANING INTO l_project_flag
1386       FROM FND_LOOKUP_VALUES_VL
1387       WHERE LOOKUP_CODE = visit_rec.project_flag
1388       AND LOOKUP_TYPE = 'AHL_YES_NO_TYPE';
1389   END IF;
1390   ----------------------------------- FOR VISITS --------------------------------------
1391   IF UPPER(c_visit_rec.template_flag) = 'N' THEN
1392     -- To find Unit Name on basis of Instance Id
1393     IF visit_rec.item_instance_id IS NOT NULL THEN
1394       OPEN c_uc_header(visit_rec.item_instance_id);
1395       FETCH c_uc_header INTO l_unit_name, l_unit_header_id;
1396       CLOSE c_uc_header;
1397 
1398       IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
1399         fnd_log.string(fnd_log.level_statement,L_DEBUG,'item instance : '|| visit_rec.item_instance_id);
1400         fnd_log.string(fnd_log.level_statement,L_DEBUG,'l_unit_name : '|| l_unit_name);
1401         fnd_log.string(fnd_log.level_statement,L_DEBUG,'l_unit_header_id : '|| l_unit_header_id);
1402       END IF;
1403     END IF;
1404 
1405     -- To find simulation plan name for the simulation id from LTP view
1406     IF (visit_rec.simulation_plan_id IS NOT NULL) THEN
1407       SELECT SIMULATION_PLAN_NAME INTO l_simulation_plan_name
1408       FROM AHL_SIMULATION_PLANS_VL
1409       WHERE SIMULATION_PLAN_ID = visit_rec.simulation_plan_id;
1410     ELSE
1411       l_simulation_plan_name := NULL;
1412     END IF;
1413 
1414     -- Post 11.5.10
1415     -- Reema Start
1416     -- To check if visit starttime is not null then store time in HH4 format
1417     IF (c_visit_rec.START_DATE_TIME IS NOT NULL AND c_visit_rec.START_DATE_TIME <> Fnd_Api.G_MISS_DATE) THEN
1418       l_hour := TO_NUMBER(TO_CHAR(c_visit_rec.START_DATE_TIME , 'HH24'));
1419       l_minute := TO_NUMBER(TO_CHAR(c_visit_rec.START_DATE_TIME , 'MI'));
1420     ELSE
1421       l_hour := NULL;
1422       c_visit_rec.START_DATE_TIME := NULL;
1423     END IF;
1424 
1425     -- To check if visit closetime is not null then store time in HH4 format
1426     IF (visit_rec.CLOSE_DATE_TIME IS NOT NULL AND visit_rec.CLOSE_DATE_TIME <> Fnd_Api.G_MISS_DATE) THEN
1427       l_hour_close := TO_NUMBER(TO_CHAR(visit_rec.CLOSE_DATE_TIME , 'HH24'));
1428       l_minute_close := TO_NUMBER(TO_CHAR(c_visit_rec.CLOSE_DATE_TIME , 'MI'));
1429     ELSE
1430       l_hour_close := NULL;
1431       visit_rec.CLOSE_DATE_TIME := Null;
1432     END IF;
1433 
1434     -- Call local procedure to retrieve Due by Date of the visit
1435     l_due_date := Get_Due_by_Date(p_visit_id => l_visit_id); -- PRAKKUM :: VWPE: ER:12424063  :: 01-FEB-2011
1436     /*
1437     Get_Due_by_Date(p_visit_id => l_visit_id, x_due_by_date  => l_due_date);
1438     */
1439 
1440     IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
1441         fnd_log.string(fnd_log.level_statement,L_DEBUG,'Due by date : '|| l_due_date);
1442     END IF;
1443 
1444     -- Derive the visit end date
1445     IF (c_visit_rec.START_DATE_TIME IS NOT NULL
1446       AND c_visit_rec.START_DATE_TIME <> Fnd_Api.G_MISS_DATE
1447       AND c_visit_rec.DEPARTMENT_ID IS NOT NULL
1448       AND c_visit_rec.DEPARTMENT_ID <> FND_API.G_MISS_NUM) THEN
1449         l_visit_end_date:= AHL_VWP_TIMES_PVT.get_visit_end_time(p_visit_id);
1450     END IF;
1451 
1452 
1453     -- PRAKKUM ::FP PIE :: 13-OCT-2010
1454     -- Get the project for the given project id
1455     IF visit_rec.project_id IS NOT NULL THEN
1456       OPEN get_project_name_csr (visit_rec.project_id);
1457       FETCH get_project_name_csr INTO l_project_name;
1458       CLOSE get_project_name_csr;
1459     END IF;
1460 
1461     -- Post 11.5.10
1462     -- get the project template name from cursor
1463     IF visit_rec.project_template_id IS NOT NULL THEN
1464       OPEN c_proj_template(visit_rec.project_template_id);
1465       FETCH c_proj_template INTO l_visit_rec.proj_template_name;
1466       IF c_proj_template%NOTFOUND THEN
1467         IF Fnd_Msg_Pub.check_msg_level(Fnd_Msg_Pub.g_msg_lvl_error) THEN
1468           Fnd_Message.SET_NAME('AHL','AHL_VWP_INVALID_PROTEM');
1469           Fnd_Msg_Pub.ADD;
1470           RAISE Fnd_Api.G_EXC_ERROR;
1471         END IF;
1472       END IF;
1473       CLOSE c_proj_template;
1474     END IF;
1475 
1476     /*Added by sowsubra*/
1477     IF (c_visit_rec.inv_locator_id IS NOT NULL) THEN
1478       OPEN c_get_subinv_loc_dtls(c_visit_rec.inv_locator_id,c_visit_rec.organization_id);
1479       FETCH c_get_subinv_loc_dtls into l_sub_code, l_locator_code;
1480       CLOSE c_get_subinv_loc_dtls;
1481     END IF;
1482 
1483     -- SKPATHAK :: 19-MAY-2010 :: Enigma Job Card Changes :: START
1484     IF FND_PROFILE.VALUE('AHL_ENIGMA_3C_URL') IS NOT NULL THEN
1485       l_visit_rec.jc_exist          := AHL_PRD_PRINT_PVT.Generated_JobCard_Exists('VST',c_visit_rec.visit_id);
1486       l_visit_rec.view_jc_url       := AHL_PRD_PRINT_PVT.Get_JC_File_Location('VST',c_visit_rec.visit_id);
1487       l_visit_rec.jc_gen_status     := AHL_PRD_PRINT_PVT.Get_Latest_JCG_Status('VST',c_visit_rec.visit_id);
1488       l_visit_rec.jc_gen_error_text := AHL_PRD_PRINT_PVT.Get_JCG_Error_Msg('VST',c_visit_rec.visit_id);
1489 
1490       IF LENGTH(l_visit_rec.jc_gen_error_text) > 500 THEN
1491         l_visit_rec.jc_gen_error_text := SUBSTR(l_visit_rec.jc_gen_error_text, 1, 500) || '...';
1492       END IF;
1493     END IF;
1494     -- SKPATHAK :: 19-MAY-2010 :: Enigma Job Card Changes :: END
1495 
1496     -- Assigning all visits field to visit record attributes meant for display
1497     l_visit_rec.visit_id              :=  c_visit_rec.visit_id ;
1498     l_visit_rec.visit_name            :=  c_visit_rec.visit_name ;
1499     l_visit_rec.visit_number          :=  c_visit_rec.visit_number ;
1500     l_visit_rec.status_code           :=  c_visit_rec.status_code;
1501     l_visit_rec.status_name           :=  c_visit_rec.status_mean;
1502     l_visit_rec.visit_type_code       :=  c_visit_rec.visit_type_code ;
1503     l_visit_rec.visit_type_name       :=  c_visit_rec.VISIT_TYPE_MEAN ;
1504     l_visit_rec.object_version_number :=  c_visit_rec.object_version_number ;
1505     l_visit_rec.inventory_item_id     :=  c_visit_rec.inventory_item_id ;
1506     l_visit_rec.item_organization_id  :=  c_visit_rec.item_organization_id ;
1507     l_visit_rec.item_name             :=  c_visit_rec.ITEM_DESCRIPTION ;
1508     l_visit_rec.unit_name             :=  l_unit_name ;
1509     l_visit_rec.unit_header_id        :=  l_unit_header_id;
1510     l_visit_rec.item_instance_id      :=  c_visit_rec.item_instance_id ;
1511     l_visit_rec.serial_number         :=  c_visit_rec.serial_number ;
1512     l_visit_rec.service_request_id    :=  c_visit_rec.service_request_id;
1513     l_visit_rec.service_request_number:=  c_visit_rec.incident_number;
1514     l_visit_rec.space_category_code   :=  c_visit_rec.space_category_code;
1515     l_visit_rec.space_category_name   :=  c_visit_rec.space_category_mean;
1516     l_visit_rec.organization_id       :=  c_visit_rec.organization_id ;
1517     l_visit_rec.org_name              :=  c_visit_rec.ORGANIZATION_NAME ;
1518     l_visit_rec.department_id         :=  c_visit_rec.department_id  ;
1519     l_visit_rec.dept_name             :=  c_visit_rec.DEPARTMENT_NAME ;
1520     l_visit_rec.start_date            :=  c_visit_rec.START_DATE_TIME;
1521     l_visit_rec.start_hour            :=  l_hour;
1522     l_visit_rec.START_MIN             :=  l_minute;
1523     l_visit_rec.PLAN_END_DATE         :=  visit_rec.CLOSE_DATE_TIME;
1524     l_visit_rec.PLAN_END_HOUR         :=  l_hour_close;
1525     l_visit_rec.PLAN_END_MIN         :=  l_minute_close;
1526     l_visit_rec.project_flag          :=  l_project_flag;
1527     l_visit_rec.project_flag_code     :=  visit_rec.project_flag;
1528     l_visit_rec.end_date              :=  l_visit_end_date ;
1529     l_visit_rec.due_by_date           :=  TRUNC(l_due_date);
1530     l_visit_rec.duration              :=  NULL ;
1531     l_visit_rec.simulation_plan_id    :=  visit_rec.simulation_plan_id  ;
1532     l_visit_rec.simulation_plan_name  :=  l_simulation_plan_name ;
1533     l_visit_rec.template_flag         :=  c_visit_rec.template_flag ;
1534     l_visit_rec.description           :=  visit_rec.description ;
1535     l_visit_rec.last_update_date      :=  visit_rec.last_update_date;
1536     l_visit_rec.project_id            :=  visit_rec.project_id;
1537     l_visit_rec.project_number        :=  visit_rec.visit_number;
1538     l_visit_rec.outside_party_flag    :=  visit_rec.outside_party_flag;
1539     -- Post 11.5.10
1540     -- Reema Start
1541     l_visit_rec.priority_code         := visit_rec.priority_code;
1542     l_visit_rec.proj_template_id      := visit_rec.project_template_id;
1543     l_visit_rec.priority_value        := c_visit_rec.priority_mean;
1544     --PRAKKUM ::FP PIE :: 13-OCT-2010
1545     l_visit_rec.top_project_task_id   := c_visit_rec.top_project_task_id;
1546     IF l_visit_rec.proj_template_id IS NULL THEN
1547       l_visit_rec.project_name          := l_project_name;
1548     END IF;
1549     -- Reema End
1550     l_visit_rec.unit_schedule_id      := visit_rec.unit_schedule_id;
1551 
1552     /*Added by sowsubra*/
1553     l_visit_rec.subinventory          := l_sub_code;
1554     l_visit_rec.LOCATOR_SEGMENT       := l_locator_code;
1555 
1556     -- manisaga for DFF Enablement on 09-Feb-2010   Start
1557     l_visit_rec.attribute_category    := visit_rec.attribute_category;
1558     l_visit_rec.attribute1            := visit_rec.attribute1;
1559     l_visit_rec.attribute2            := visit_rec.attribute2;
1560     l_visit_rec.attribute3            := visit_rec.attribute3;
1561     l_visit_rec.attribute4            := visit_rec.attribute4;
1562     l_visit_rec.attribute5            := visit_rec.attribute5;
1563     l_visit_rec.attribute6            := visit_rec.attribute6;
1564     l_visit_rec.attribute7            := visit_rec.attribute7;
1565     l_visit_rec.attribute8            := visit_rec.attribute8;
1566     l_visit_rec.attribute9            := visit_rec.attribute9;
1567     l_visit_rec.attribute10           := visit_rec.attribute10;
1568     l_visit_rec.attribute11           := visit_rec.attribute11;
1569     l_visit_rec.attribute12           := visit_rec.attribute12;
1570     l_visit_rec.attribute13           := visit_rec.attribute13;
1571     l_visit_rec.attribute14           := visit_rec.attribute14;
1572     l_visit_rec.attribute15           := visit_rec.attribute15;
1573     -- manisaga for DFF Enablement on 09-Feb-2010   End
1574 
1575 
1576     --TCHIMIRA::P2P CP ER 9151144::02-DEC-2009
1577     --Assigning all concurrent program fields to visit record attributes meant for display on the update visit UI.
1578     l_visit_rec.cp_request_id         := visit_rec.request_id;
1579     l_visit_rec.cp_phase_code         := conc_req_rec.cp_phase_code;
1580     l_visit_rec.cp_status_code        := conc_req_rec.cp_status_code;
1581     l_visit_rec.cp_request_date       := conc_req_rec.cp_request_date;
1582 
1583     --Arvind Rupakula -Flight Number changes
1584     IF (visit_rec.unit_schedule_id IS NOT NULL) THEN
1585       OPEN c_flight_number(visit_rec.unit_schedule_id);
1586       FETCH c_flight_number INTO l_flight_number;
1587       CLOSE c_flight_number;
1588       l_visit_rec.flight_number         := l_flight_number;
1589     END IF;
1590     --End Changes
1591     x_visit_rec := l_visit_rec;
1592   END IF;
1593   ------------------------End of API Body------------------------------------
1594   -- Standard call to get message count and if count is 1, get message info
1595   Fnd_Msg_Pub.Count_And_Get
1596         ( p_count => x_msg_count,
1597         p_data  => x_msg_data,
1598         p_encoded => Fnd_Api.g_false);
1599 
1600   IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level) THEN
1601     fnd_log.string(fnd_log.level_procedure,L_DEBUG||'.end','At the end of PLSQL procedure');
1602   END IF;
1603 
1604   RETURN;
1605 EXCEPTION
1606  WHEN Fnd_Api.G_EXC_ERROR THEN
1607    x_return_status := Fnd_Api.G_RET_STS_ERROR;
1608    ROLLBACK TO Get_Visit_Details;
1609    Fnd_Msg_Pub.count_and_get( p_count   => x_msg_count,
1610                               p_data    => x_msg_data,
1611                               p_encoded => Fnd_Api.g_false);
1612 
1613  WHEN Fnd_Api.G_EXC_UNEXPECTED_ERROR THEN
1614    x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
1615    ROLLBACK TO Get_Visit_Details;
1616    Fnd_Msg_Pub.count_and_get( p_count   => x_msg_count,
1617                               p_data    => x_msg_data,
1618                               p_encoded => Fnd_Api.g_false);
1619 
1620  WHEN OTHERS THEN
1621     x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
1622     ROLLBACK TO Get_Visit_Details;
1623     Fnd_Msg_Pub.add_exc_msg( p_pkg_name       => G_PKG_NAME,
1624                              p_procedure_name => 'Get_Visit_Details',
1625                              p_error_text     => SQLERRM);
1626     Fnd_Msg_Pub.count_and_get( p_count   => x_msg_count,
1627                                p_data    => x_msg_data,
1628                                p_encoded => Fnd_Api.g_false);
1629 END Get_Visit_Details;
1630 
1631 --------------------------------------------------------------------
1632 -- PROCEDURE
1633 --
1634 --
1635 -- PURPOSE
1636 --    To create a Maintainance Visit
1637 --------------------------------------------------------------------
1638 PROCEDURE Create_Visit (
1639    p_api_version             IN     NUMBER,
1640    p_init_msg_list           IN     VARCHAR2  := Fnd_Api.g_false,
1641    p_commit                  IN     VARCHAR2  := Fnd_Api.g_false,
1642    p_validation_level        IN     NUMBER    := Fnd_Api.g_valid_level_full,
1643    p_module_type             IN     VARCHAR2  := 'JSP',
1644    p_x_visit_rec             IN OUT NOCOPY Visit_Rec_Type,
1645    x_return_status           OUT    NOCOPY VARCHAR2,
1646    x_msg_count               OUT    NOCOPY NUMBER,
1647    x_msg_data                OUT    NOCOPY VARCHAR2
1648 )
1649 IS
1650   -- Define local Variables
1651    L_API_VERSION           CONSTANT NUMBER := 1.0;
1652    L_API_NAME              CONSTANT VARCHAR2(30) := 'Create Visit';
1653    L_FULL_NAME             CONSTANT VARCHAR2(60) := G_PKG_NAME || '.' || L_API_NAME;
1654    L_DEBUG                 CONSTANT VARCHAR2(90) := 'ahl.plsql.'||L_FULL_NAME;
1655 
1656    l_msg_data              VARCHAR2(2000);
1657    l_unit_name             VARCHAR2(80);
1658    l_item_name             VARCHAR2(40);
1659    l_rowid                 VARCHAR2(30);
1660    l_date                  VARCHAR2(30);
1661    l_return_status         VARCHAR2(1);
1662 
1663    l_proj_temp_Id          NUMBER;
1664    l_msg_count             NUMBER;
1665    l_count                 NUMBER;
1666    l_dummy                 NUMBER;
1667    l_organization_id       NUMBER;
1668    l_department_id         NUMBER;
1669    l_item_id               NUMBER;
1670    l_serial_id             NUMBER;
1671    l_visit_number          NUMBER;
1672    l_org_id                NUMBER;
1673    l_simulation_plan_id    NUMBER;
1674    l_service_id            NUMBER;
1675    l_date_time             DATE;
1676 
1677    l_time  VARCHAR2(30);
1678    --TC Changes
1679    l_release_flag         VARCHAR2(1) := NULL;
1680    -- Post 11.5.10 Enhancements
1681    l_priority_code         VARCHAR2(30);
1682    l_proj_template_id      NUMBER;
1683    -- Define local record datatypes
1684    l_Visit_rec             Visit_Rec_Type := p_x_Visit_rec;
1685    -- PRAKKUM ::FP PIE :: 13-OCT-2010
1686    l_dummy_char            VARCHAR2(1);
1687    l_is_comp_visit         VARCHAR2(1);
1688 
1689    -- Define local Cursors
1690    -- To find the next id value from visit sequence
1691    CURSOR c_seq IS
1692    SELECT Ahl_Visits_B_S.NEXTVAL
1693    FROM   dual;
1694 
1695    -- To find whether id already exists
1696    CURSOR c_id_exists (x_id IN NUMBER) IS
1697    SELECT 1 FROM   Ahl_Visits_VL
1698    WHERE  Visit_id = x_id;
1699 
1700    -- To find the maximum visit number among all visits
1701    CURSOR c_visit_number IS
1702    SELECT MAX(visit_number) FROM Ahl_Visits_B;
1703 
1704    -- Fix for ADS bug# 4357001.
1705    -- Changed cursor to not use ahl_mtl_items_ou_v and replaced with mtl_system_items_kfv
1706    -- and added OU stripping so that Master Org does not belong to the current user's OU.
1707    CURSOR c_unit_det (p_unit_name IN VARCHAR2) IS
1708 /*  SELECT uc.name ,
1709            csis.serial_number ,
1710            csis.instance_id,
1711            mtl.inventory_item_id ,
1712            mtl.inventory_org_id
1713     FROM   ahl_mtl_items_ou_v mtl,
1714            ahl_unit_config_headers uc,
1715            csi_item_instances csis
1716     WHERE  uc.name = p_unit_name
1717     AND uc.csi_item_instance_id=csis.instance_id
1718     AND AHL_UTIL_UC_PKG.GET_UC_STATUS_CODE(uc.UNIT_CONFIG_HEADER_ID) in ('COMPLETE','INCOMPLETE','DEACTIVATE_QUARANTINE','QUARANTINE')
1719     AND (uc.active_end_date IS NULL OR uc.active_end_date > SYSDATE)
1720     AND csis.inventory_item_id = mtl.inventory_item_id
1721     AND csis.inv_master_organization_id = mtl.inventory_org_id
1722     AND csis.serial_number IS NOT NULL
1723     AND csis.ACTIVE_START_DATE <= sysdate AND (csis.ACTIVE_END_DATE >= sysdate OR csis.ACTIVE_END_DATE IS NULL); */
1724 
1725     /*   SELECT uc.name ,
1726                csis.serial_number ,
1727            csis.instance_id,
1728                mtl.inventory_item_id ,
1729                --mtl.inventory_org_id
1730                csis.inv_master_organization_id
1731         FROM   mtl_system_items_kfv mtl,
1732                ahl_unit_config_headers uc,
1733                csi_item_instances csis
1734         WHERE  uc.name = p_unit_name
1735         AND uc.csi_item_instance_id=csis.instance_id
1736     AND upper(AHL_UTIL_UC_PKG.GET_UC_STATUS_CODE(uc.UNIT_CONFIG_HEADER_ID))in ('COMPLETE','INCOMPLETE','DEACTIVATE_QUARANTINE','QUARANTINE')
1737         AND (uc.active_end_date IS NULL OR uc.active_end_date > SYSDATE)
1738         AND csis.inventory_item_id = mtl.inventory_item_id
1739         AND csis.inv_master_organization_id = mtl.organization_id
1740         AND csis.serial_number IS NOT NULL
1741     AND csis.ACTIVE_START_DATE <= sysdate AND (csis.ACTIVE_END_DATE >= sysdate OR csis.ACTIVE_END_DATE
1742 IS NULL)
1743     AND csis.inv_master_organization_id IN ( SELECT mp.master_organization_id FROM org_organization_definitions org
1744         , mtl_parameters mp WHERE org.organization_id = mp.organization_id
1745     AND NVL(operating_unit, mo_global.get_current_org_id())
1746     = mo_global.get_current_org_id()); */
1747 
1748    -- AnRaj: Changed for fixing the perf bug 4919502
1749    SELECT uc.name ,
1750           csis.serial_number ,
1751           csis.instance_id,
1752           mtl.inventory_item_id ,
1753           csis.inv_master_organization_id
1754    FROM   mtl_system_items mtl,
1755           ahl_unit_config_headers uc,
1756           csi_item_instances csis
1757    WHERE  uc.name = p_unit_name
1758    AND    uc.csi_item_instance_id=csis.instance_id
1759    -- Fix by jaramana on June 27, 2006 for Bug 5360066
1760    -- AND      upper(AHL_UTIL_UC_PKG.GET_UC_STATUS(uc.UNIT_CONFIG_HEADER_ID))in ('COMPLETE','INCOMPLETE','DEACTIVATE_QUARANTINE','QUARANTINE')
1761    AND      AHL_UTIL_UC_PKG.GET_UC_STATUS_CODE(uc.UNIT_CONFIG_HEADER_ID)in ('COMPLETE','INCOMPLETE','DEACTIVATE_QUARANTINE','QUARANTINE')
1762    AND      (uc.active_end_date IS NULL OR uc.active_end_date > SYSDATE)
1763    AND      csis.inventory_item_id = mtl.inventory_item_id
1764    AND      csis.inv_master_organization_id = mtl.organization_id
1765    AND      csis.serial_number IS NOT NULL
1766    AND      csis.ACTIVE_START_DATE <= sysdate
1767    AND      (csis.ACTIVE_END_DATE >= sysdate OR csis.ACTIVE_END_DATE IS NULL)
1768    AND      csis.inv_master_organization_id IN
1769              (   SELECT mp.master_organization_id
1770                  FROM   inv_organization_info_v org, mtl_parameters mp
1771                  WHERE  org.organization_id = mp.organization_id
1772                  AND    NVL(operating_unit, mo_global.get_current_org_id()) = mo_global.get_current_org_id()
1773               );
1774    --PRAKKUM ::FP PIE :: 13-OCT-2010
1775    --To get project id given the project name
1776    CURSOR get_project_id_csr (c_project_name IN VARCHAR2)
1777    IS
1778      SELECT project_id
1779      FROM PA_PROJECTS_ALL
1780      WHERE name = c_project_name;
1781 
1782    --PRAKKUM ::FP PIE :: 13-OCT-2010
1783    --To validate that the project completion is in future
1784    Cursor validate_proj_date_csr ( c_project_id IN NUMBER)
1785    IS
1786      SELECT 'X' from PA_PROJECTS_EXPEND_V
1787      WHERE project_id = c_project_id
1788      AND NVL(completion_date,SYSDATE+1)>=SYSDATE;
1789   /*Added by sowsubra*/
1790   CURSOR c_subinv_validate (p_subinv_code IN VARCHAR2, p_org_id IN VARCHAR2) IS
1791       SELECT status_id
1792       FROM mtl_secondary_inventories
1793       WHERE secondary_inventory_name = p_subinv_code
1794       AND organization_id = p_org_id;
1795 
1796   /*Added by sowsubra*/
1797   CURSOR c_loc_validate (p_org_id IN NUMBER, p_subinv_code IN VARCHAR2, p_loc_seg IN VARCHAR2) IS
1798      -- jaramana on Feb 14, 2008 for bug 6819370
1799      -- Made segment19 and segment20 refer to base table
1800      SELECT mil.inventory_location_id
1801      from mtl_item_locations mil, mtl_item_locations_kfv milk
1802      where mil.organization_id = p_org_id
1803      and mil.subinventory_code = p_subinv_code
1804      and milk.concatenated_segments = p_loc_seg
1805      and mil.segment19 is NULL
1806      and mil.segment20 is NULL
1807      and mil.inventory_location_id = milk.inventory_location_id;
1808 
1809    l_inv_loc_id     NUMBER := 0;
1810    l_status_id      NUMBER;
1811 
1812 
1813 BEGIN
1814   --------------------- Initialize -----------------------
1815   SAVEPOINT Create_Visit;
1816 
1817   IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level) THEN
1818     fnd_log.string(fnd_log.level_procedure,L_DEBUG||'.begin','At the start of PLSQL procedure');
1819   END IF;
1820 
1821   -- Initialize message list if p_init_msg_list is set to TRUE.
1822   IF Fnd_Api.to_boolean(p_init_msg_list) THEN
1823     Fnd_Msg_Pub.initialize;
1824   END IF;
1825 
1826   --  Initialize API return status to success
1827   x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
1828 
1829   -- Standard call to check for call compatibility.
1830   IF NOT Fnd_Api.COMPATIBLE_API_CALL(l_api_version,
1831                                       p_api_version,
1832                                       l_api_name,G_PKG_NAME) THEN
1833        RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
1834   END IF;
1835   ------------------------Start of API Body------------------------------------
1836 
1837   --------------------Value OR ID conversion---------------------------
1838   IF p_module_type = 'JSP' THEN
1839       l_Visit_rec.organization_id       := NULL;
1840       l_Visit_rec.department_id         := NULL;
1841       l_Visit_rec.item_instance_id      := NULL;
1842       l_Visit_rec.service_request_id    := NULL;
1843   END IF;
1844 
1845   -- For VISIT STATUS
1846   -- To check visit status by default is Draft if not entered as input
1847   IF  l_visit_rec.status_code IS NULL OR l_visit_rec.status_code = Fnd_Api.G_MISS_CHAR THEN
1848     -- VWPE ER-12424063  :: tchimira :: 15-FEB -2011
1849     --As a part of VWP enhancement, going forward Visits will be created with status 'DRAFT'.Commenting below statement for the same.
1850     --l_Visit_rec.status_code := 'PLANNING';
1851     l_Visit_rec.status_code := 'DRAFT';
1852   END IF;
1853 
1854   IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
1855     fnd_log.string(fnd_log.level_statement,L_DEBUG,'Status Code = ' || l_Visit_rec.status_code);
1856   END IF;
1857 
1858   ----------- Starts defining all Dropdowns on Create Visit UI Screen-------------
1859   -- For SPACE CATEGORY CODE
1860   IF l_Visit_rec.space_category_code = Fnd_Api.G_MISS_CHAR THEN
1861     l_Visit_rec.space_category_code := Null;
1862   END IF;
1863 
1864   IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
1865     fnd_log.string(fnd_log.level_statement,L_DEBUG,'Space Category Code = ' || l_Visit_rec.space_category_code);
1866   END IF;
1867   ----------- End defining all Dropdowns on Create Visit UI Screen-------------
1868   ----------- Start defining and validate all LOVs on Create Visit UI Screen---
1869   -- For VISIT TYPE
1870   -- To find Visit Type Code when Visit Type Name has input values
1871   IF l_Visit_rec.visit_type_name IS NOT NULL AND
1872     l_Visit_rec.visit_type_name <> Fnd_Api.G_MISS_CHAR THEN
1873 
1874     AHL_VWP_RULES_PVT.Check_Lookup_Name_Or_Id (
1875           p_lookup_type   => 'AHL_PLANNING_VISIT_TYPE',
1876           p_lookup_code   => NULL,
1877           p_meaning       => l_Visit_rec.visit_type_name,
1878           p_check_id_flag => 'Y',
1879           x_lookup_code   => l_Visit_rec.visit_type_code,
1880           x_return_status => l_return_status);
1881 
1882     IF NVL(l_return_status, 'X') <> 'S' THEN
1883       Fnd_Message.SET_NAME('AHL','AHL_VWP_TYPE_CODE_NOT_EXISTS');
1884       Fnd_Msg_Pub.ADD;
1885       RAISE Fnd_Api.G_EXC_ERROR;
1886     END IF;
1887 
1888   END IF;
1889 
1890   IF l_Visit_rec.unit_name IS NOT NULL AND l_Visit_rec.unit_name <> Fnd_Api.G_MISS_CHAR THEN
1891       OPEN c_unit_det(l_Visit_rec.unit_name);
1892       FETCH c_unit_det INTO l_Visit_rec.unit_name,l_Visit_rec.serial_number,l_Visit_rec.item_instance_id,
1893                             l_Visit_rec.inventory_item_id,l_Visit_rec.item_organization_id;
1894       IF c_unit_det%NOTFOUND THEN
1895           IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
1896             fnd_log.string(fnd_log.level_statement,L_DEBUG,'Unit does not exists..');
1897           END IF;
1898           Fnd_Message.SET_NAME('AHL','AHL_VWP_UNIT_NOT_EXISTS');
1899           Fnd_Msg_Pub.ADD;
1900           CLOSE c_unit_det;
1901           RAISE Fnd_Api.G_EXC_ERROR;
1902       END IF;
1903       CLOSE c_unit_det;
1904 
1905       IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
1906         fnd_log.string(fnd_log.level_statement,L_DEBUG,'Serial Id found ' || l_Visit_rec.item_instance_id);
1907       END IF;
1908   ELSE
1909       l_Visit_rec.item_instance_id := NULL;
1910       l_Visit_rec.inventory_item_id := NULL;
1911       l_Visit_rec.item_organization_id := NULL;
1912       l_Visit_rec.serial_number := NULL;
1913   END IF;
1914 
1915   -- For ORGANIZATION
1916   -- To Convert Organization Name to Organization Id
1917   IF (l_Visit_rec.org_name IS NOT NULL AND
1918       l_Visit_rec.org_name <> Fnd_Api.G_MISS_CHAR) THEN
1919 
1920       AHL_VWP_RULES_PVT.Check_Org_Name_Or_Id
1921                (p_organization_id  => l_Visit_rec.organization_id,
1922                 p_org_name         => l_Visit_rec.org_name,
1923                 x_organization_id  => l_organization_id,
1924                 x_return_status    => l_return_status,
1925                 x_error_msg_code   => l_msg_data);
1926 
1927       IF NVL(l_return_status,'x') <> 'S' THEN
1928           Fnd_Message.SET_NAME('AHL','AHL_VWP_ORG_NOT_EXISTS');
1929           Fnd_Msg_Pub.ADD;
1930           RAISE Fnd_Api.G_EXC_ERROR;
1931       END IF;
1932   END IF;
1933 
1934   IF (l_Visit_rec.org_name IS NOT NULL AND
1935       l_Visit_rec.org_name <> Fnd_Api.G_MISS_CHAR ) THEN
1936       --Assign the returned value
1937       l_Visit_rec.organization_id := l_organization_id;
1938       /* ELSE
1939       l_Visit_rec.organization_id := NULL;*/
1940   END IF;
1941 
1942   IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
1943     fnd_log.string(fnd_log.level_statement,L_DEBUG,'Org Name/ID' || l_Visit_rec.org_name || '-' || l_Visit_rec.organization_id );
1944   END IF;
1945 
1946   -- For DEPARTMENT
1947   -- To convert Department Name to Department Id
1948   IF (l_Visit_rec.dept_name IS NOT NULL AND
1949      l_Visit_rec.dept_name <> Fnd_Api.G_MISS_CHAR ) OR
1950      (l_Visit_rec.department_id IS NOT NULL AND
1951      l_Visit_rec.department_id <> Fnd_Api.G_MISS_NUM) THEN
1952 
1953       AHL_VWP_RULES_PVT.Check_Dept_Desc_Or_Id
1954                (p_organization_id  => l_Visit_rec.organization_id,
1955                 p_dept_name        => l_Visit_rec.dept_name,
1956                 p_department_id    => l_Visit_rec.department_id,
1957                 x_department_id    => l_department_id,
1958                 x_return_status    => l_return_status,
1959                 x_error_msg_code   => l_msg_data);
1960 
1961       IF NVL(l_return_status,'x') <> 'S' THEN
1962           Fnd_Message.SET_NAME('AHL','AHL_VWP_DEPT_NOT_EXISTS');
1963           Fnd_Msg_Pub.ADD;
1964           RAISE Fnd_Api.G_EXC_ERROR;
1965       END IF;
1966 
1967       AHL_VWP_RULES_PVT.CHECK_DEPARTMENT_SHIFT
1968                (p_dept_id          => l_department_id,
1969                 x_return_status    => l_return_status);
1970 
1971       IF NVL(l_return_status,'x') <> 'S' THEN
1972         Fnd_Message.SET_NAME('AHL','AHL_VWP_NO_DEPT_SHIFT');
1973         Fnd_Msg_Pub.ADD;
1974         RAISE Fnd_Api.G_EXC_ERROR;
1975       END IF;
1976   END IF;
1977 
1978   IF (l_Visit_rec.dept_name IS NOT NULL AND l_Visit_rec.dept_name <> Fnd_Api.G_MISS_CHAR ) THEN
1979     --Assign the returned value
1980     l_Visit_rec.department_id := l_department_id;
1981     /* ELSE
1982     l_Visit_rec.department_id := NULL;*/
1983   END IF;
1984 
1985   IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
1986     fnd_log.string(fnd_log.level_statement,L_DEBUG,'Dept Id/Name = ' || l_Visit_rec.department_id || ' - ' || l_Visit_rec.dept_name);
1987   END IF;
1988 
1989   -- For SERVICE REQUEST
1990   -- To Convert Service Request Number to Service Request Id
1991   IF (l_Visit_rec.service_request_number IS NOT NULL AND l_Visit_rec.service_request_number <> Fnd_Api.G_MISS_CHAR ) THEN
1992       AHL_VWP_RULES_PVT.Check_SR_Request_Number_Or_Id
1993            (p_service_id       => l_Visit_rec.service_request_id,
1994             p_service_number   => l_Visit_rec.service_request_number,
1995             x_service_id       => l_service_id,
1996             x_return_status    => l_return_status,
1997             x_error_msg_code   => l_msg_data);
1998 
1999       IF NVL(l_return_status,'x') <> 'S' THEN
2000            Fnd_Message.SET_NAME('AHL','AHL_VWP_SERVICE_REQ_NOT_EXISTS');
2001            Fnd_Msg_Pub.ADD;
2002            RAISE Fnd_Api.g_exc_error;
2003       END IF;
2004 
2005       --Assign the returned value
2006       l_Visit_rec.service_request_id := l_service_id;
2007 
2008       IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
2009         fnd_log.string(fnd_log.level_statement,L_DEBUG,'SR Id/Number = ' || l_Visit_rec.service_request_id || '-' || l_Visit_rec.service_request_number );
2010       END IF;
2011    END IF;
2012 
2013    ----------- End defining and validate all LOVs on Create Visit UI Screen---
2014    -- For VISIT START DATE TIME
2015    -- Convert time stamp for start date time
2016    IF l_Visit_rec.START_DATE IS NOT NULL AND l_Visit_rec.START_DATE <> fnd_api.g_miss_date THEN
2017      IF (l_Visit_rec.START_HOUR IS NOT NULL AND l_visit_rec.START_MIN IS NOT NULL)THEN
2018         l_date   :=  TO_CHAR(l_Visit_rec.START_DATE, 'DD-MM-YYYY ') || l_Visit_rec.start_hour ||':'|| l_visit_rec.start_min;
2019         l_Visit_rec.START_DATE :=  TO_DATE(l_date, 'DD-MM-YYYY HH24:MI');
2020      ELSIF l_Visit_rec.START_HOUR IS NOT NULL THEN
2021         l_date   :=  TO_CHAR(l_Visit_rec.START_DATE, 'DD-MM-YYYY ') || l_Visit_rec.start_hour || ':00';
2022         l_Visit_rec.START_DATE :=  TO_DATE(l_date, 'DD-MM-YYYY HH24:MI');
2023      ELSE
2024         l_date   :=  TO_CHAR(l_Visit_rec.START_DATE, 'DD-MM-YYYY ') || '00' || ':00';
2025         l_Visit_rec.START_DATE :=  TO_DATE(l_date, 'DD-MM-YYYY HH24:MI');
2026      END IF;
2027    END IF;
2028 
2029    IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
2030     fnd_log.string(fnd_log.level_statement,L_DEBUG,'Start Date' || l_Visit_rec.START_DATE);
2031    END IF;
2032 
2033    --Added by amagrawa for Transit Visit
2034    -- For VISIT PLANNED END DATE TIME
2035    -- Convert time stamp for planned end date time
2036    IF l_Visit_rec.plan_end_date IS NOT NULL AND l_Visit_rec.plan_end_date <> fnd_api.g_miss_date THEN
2037      IF (l_Visit_rec.plan_end_HOUR IS NOT NULL AND l_visit_rec.plan_end_MIN IS NOT NULL)THEN
2038         l_date   :=  TO_CHAR(l_Visit_rec.plan_end_date, 'DD-MM-YYYY ') || l_Visit_rec.plan_end_hour || ':'||l_visit_rec.plan_end_min;
2039         l_Visit_rec.plan_end_date :=  TO_DATE(l_date, 'DD-MM-YYYY HH24:MI');
2040      ELSIF l_Visit_rec.plan_end_hour IS NOT NULL THEN
2041         l_date   :=  TO_CHAR(l_Visit_rec.plan_end_date, 'DD-MM-YYYY ') || l_Visit_rec.plan_end_hour || ':00';
2042         l_Visit_rec.plan_end_date :=  TO_DATE(l_date, 'DD-MM-YYYY HH24:MI');
2043      ELSE
2044         l_date   :=  TO_CHAR(l_Visit_rec.plan_end_date, 'DD-MM-YYYY ') || '00' || ':00';
2045         l_Visit_rec.plan_end_date :=  TO_DATE(l_date, 'DD-MM-YYYY HH24:MI');
2046      END IF;
2047    END IF;
2048 
2049    IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
2050     fnd_log.string(fnd_log.level_statement,L_DEBUG,'End Date' || l_Visit_rec.plan_end_date);
2051    END IF;
2052 
2053    -- To validate visit start date should be less than plan end date
2054    IF l_Visit_rec.START_DATE IS NOT NULL  AND l_Visit_rec.plan_end_date IS NOT NULL THEN
2055       IF (l_Visit_rec.START_DATE > l_Visit_rec.plan_end_date) THEN
2056          Fnd_Message.SET_NAME('AHL','AHL_VWP_START_DT_GTR_CLOSE_DT');
2057          Fnd_Msg_Pub.ADD;
2058          RAISE Fnd_Api.G_EXC_ERROR;
2059       END IF;
2060    END IF;
2061    -- End of changes by amagrawa
2062    -- For SIMULATION PLAN
2063    -- To check whether any primary plan exists in LTP
2064    IF l_visit_rec.SIMULATION_PLAN_ID = Fnd_Api.G_MISS_NUM THEN
2065       l_visit_rec.SIMULATION_PLAN_ID := NULL;
2066    END IF;
2067 
2068    IF (l_Visit_rec.SIMULATION_PLAN_ID IS NULL) THEN
2069       -- SKPATHAK :: Bug #12856492 :: 10-Aug-2012 :: Since new simulation type (UMP) has been added recently,
2070       -- need to check for primary plans only in existing LTP siulation plans for which simulation_type is null
2071       SELECT SIMULATION_PLAN_ID INTO l_simulation_plan_id
2072       FROM AHL_SIMULATION_PLANS_VL WHERE primary_plan_flag = 'Y' AND simulation_type IS NULL;
2073 
2074       l_Visit_rec.SIMULATION_PLAN_ID := l_simulation_plan_id;
2075 
2076       IF l_simulation_plan_id IS NULL THEN
2077           Fnd_Message.SET_NAME('AHL','AHL_VWP_PRI_PLN_NOT_EXIST');
2078           Fnd_Msg_Pub.ADD;
2079           RAISE Fnd_Api.G_EXC_ERROR;
2080       END IF;
2081    END IF;
2082 
2083    IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
2084     fnd_log.string(fnd_log.level_statement,L_DEBUG,'Simulation Id' || l_Visit_rec.SIMULATION_PLAN_ID);
2085    END IF;
2086 
2087    -- Post 11.5.10 Enhancements
2088    -- For PRIORITY
2089    IF l_Visit_rec.priority_value IS NOT NULL AND l_Visit_rec.priority_value <> Fnd_Api.G_MISS_CHAR THEN
2090       AHL_VWP_RULES_PVT.Check_Lookup_Name_Or_Id
2091             (p_lookup_type  => 'AHL_VWP_VISIT_PRIORITY',
2092              p_lookup_code  => l_Visit_rec.priority_code,
2093              p_meaning      => l_Visit_rec.priority_value,
2094              p_check_id_flag => 'Y',
2095              x_lookup_code   => l_priority_code,
2096              x_return_status => l_return_status);
2097 
2098       IF NVL(l_return_status, 'X') <> 'S' THEN
2099         Fnd_Message.SET_NAME('AHL','AHL_VWP_PRI_NOT_EXISTS');
2100         Fnd_Msg_Pub.ADD;
2101         RAISE Fnd_Api.G_EXC_ERROR;
2102       END IF;
2103       l_visit_rec.priority_code := l_priority_code;
2104    END IF;
2105 
2106    -- Post 11.5.10 Enhancements
2107    -- For PROJECT TEMPLATE
2108    --PRAKKUM ::FP PIE :: 13-OCT-2010:: BEGIN
2109    IF l_visit_rec.proj_template_name IS NOT NULL THEN
2110       IF l_visit_rec.project_name IS NOT NULL THEN
2111          Fnd_Message.SET_NAME('AHL', 'AHL_VWP_INV_PROJ_AND_TEMP');
2112          Fnd_Msg_Pub.ADD;
2113          RAISE Fnd_Api.G_EXC_ERROR;
2114       ELSE  --i.e. name is null but template is not null
2115         AHL_VWP_RULES_PVT.Check_Project_Template_Or_Id
2116             ( p_proj_temp_name => l_visit_rec.proj_template_name,
2117               x_project_id => l_proj_template_id,
2118               x_return_status => l_return_status,
2119               x_error_msg_code => l_msg_data);
2120 
2121         IF NVL(l_return_status, 'X') <> 'S' THEN
2122           Fnd_Message.SET_NAME('AHL','AHL_VWP_INVALID_PROTEM');
2123           Fnd_Msg_Pub.ADD;
2124           RAISE Fnd_Api.G_EXC_ERROR;
2125         END IF;
2126         l_visit_rec.proj_template_id := l_proj_template_id;
2127       END IF; --project name not null
2128    ELSE
2129       -- If Project Template Name is null
2130       IF l_visit_rec.project_name IS NULL THEN
2131         l_visit_rec.proj_template_id := FND_PROFILE.VALUE('AHL_DEFAULT_PA_TEMPLATE_ID');
2132       ELSE --project template name is null but project name is not null
2133         OPEN get_project_id_csr (l_visit_rec.project_name);
2134         FETCH get_project_id_csr INTO l_visit_rec.project_id;
2135         IF get_project_id_csr%NOTFOUND THEN
2136            Fnd_Message.SET_NAME('AHL', 'AHL_VWP_INV_PROJ_NAME');
2137            Fnd_Message.Set_Token('PROJ_NAME', l_visit_rec.project_name);
2138            Fnd_Msg_Pub.ADD;
2139            CLOSE get_project_id_csr;
2140            RAISE Fnd_Api.G_EXC_ERROR;
2141         END IF;
2142         CLOSE get_project_id_csr;
2143       END IF;
2144    END IF;
2145    IF l_visit_rec.project_id IS NOT NULL THEN
2146      OPEN validate_proj_date_csr (l_visit_rec.project_id);
2147      FETCH validate_proj_date_csr INTO l_dummy_char;
2148      IF validate_proj_date_csr%NOTFOUND THEN
2149        Fnd_Message.SET_NAME('AHL', 'AHL_VWP_INV_PROJECT');
2150        Fnd_Message.Set_Token('PROJ_NAME', l_visit_rec.project_name);
2151        Fnd_Message.Set_Token('PROJ_ID', l_visit_rec.project_id);
2152        Fnd_Msg_Pub.ADD;
2153        CLOSE validate_proj_date_csr;
2154        RAISE Fnd_Api.G_EXC_ERROR;
2155      END IF;
2156      CLOSE validate_proj_date_csr;
2157    END IF;
2158    --PRAKKUM ::FP PIE :: 13-OCT-2009 :: END
2159 
2160 
2161   /*Added by sowsubra - starts - Issue#86 changes*/
2162   l_dummy := NULL;
2163 
2164   IF ((l_visit_rec.subinventory IS NOT NULL) AND (l_visit_rec.locator_segment IS NULL)) THEN
2165            Fnd_Message.SET_NAME('AHL','AHL_VWP_LOCATOR_NULL');
2166            Fnd_Msg_Pub.ADD;
2167            RAISE Fnd_Api.G_EXC_ERROR;
2168   ELSIF ((l_visit_rec.subinventory IS NULL) AND (l_visit_rec.locator_segment IS NOT NULL))THEN
2169            Fnd_Message.SET_NAME('AHL','AHL_VWP_SUBINVENTORY_NULL');
2170            Fnd_Msg_Pub.ADD;
2171            RAISE Fnd_Api.G_EXC_ERROR;
2172   ELSIF ((l_visit_rec.subinventory IS NOT NULL) AND (l_visit_rec.locator_segment IS NOT NULL)) THEN
2173 
2174          OPEN c_subinv_validate (l_visit_rec.subinventory, l_visit_rec.organization_id);
2175          FETCH c_subinv_validate INTO l_status_id;
2176          IF (c_subinv_validate%NOTFOUND) THEN
2177              CLOSE c_subinv_validate;
2178              Fnd_Message.SET_NAME('AHL','AHL_VWP_SUBINV_NOT_EXISTS');
2179              Fnd_Msg_Pub.ADD;
2180              RAISE Fnd_Api.G_EXC_ERROR;
2181          ELSE
2182            IF l_status_id in (NVL(fnd_profile.value('AHL_MTL_MAT_STATUS_UNSERVICABLE'), -1), NVL(fnd_profile.value('AHL_MTL_MAT_STATUS_MRB'), -1)) THEN
2183              CLOSE c_subinv_validate;
2184              FND_MESSAGE.SET_NAME('AHL', 'AHL_SUBINVENTORY_NOT_SVC');
2185              FND_MESSAGE.Set_Token('INV', l_visit_rec.subinventory);
2186              FND_MSG_PUB.ADD;
2187              RAISE Fnd_Api.G_EXC_ERROR;
2188            END IF;
2189          END IF;
2190          CLOSE c_subinv_validate;
2191 
2192          l_dummy := NULL;
2193 
2194          OPEN c_loc_validate (l_visit_rec.organization_id, l_visit_rec.subinventory,l_visit_rec.locator_segment );
2195          FETCH c_loc_validate INTO l_inv_loc_id;
2196           IF c_loc_validate%NOTFOUND THEN
2197              Fnd_Message.SET_NAME('AHL','AHL_VWP_PHY_LOCATOR_NOT_EXISTS');
2198              Fnd_Msg_Pub.ADD;
2199              CLOSE c_loc_validate;
2200              RAISE Fnd_Api.G_EXC_ERROR;
2201           END IF;
2202          CLOSE c_loc_validate;
2203 
2204          l_visit_rec.inv_locator_id := l_inv_loc_id;
2205   ELSE
2206     l_visit_rec.inv_locator_id := NULL;
2207   END IF;
2208   /*Added by sowsubra - end - FP Issue#86 changes*/
2209 
2210   -- SATHAPLI::Component Maintenance Planning Project, 02-Nov-2011, start
2211   -- set the Planning and In-Repair locators in the record, before Validate_Visit call
2212   -- Planning
2213   IF (l_visit_rec.comp_planning_subinv IS NOT NULL AND l_visit_rec.comp_planning_loc_seg IS NOT NULL) THEN
2214     l_status_id := NULL;
2215     OPEN c_subinv_validate (l_visit_rec.comp_planning_subinv, l_visit_rec.organization_id);
2216     FETCH c_subinv_validate INTO l_status_id;
2217     CLOSE c_subinv_validate;
2218 
2219     IF (l_status_id <> NVL(FND_PROFILE.VALUE('AHL_MTL_MAT_STATUS_UNSERVICABLE'), l_status_id)) THEN
2220       -- Planning and In-Repair Sub Inventory should be Unserviceable.
2221       FND_MESSAGE.SET_NAME('AHL', 'AHL_CMP_SUBINV_NOT_UNSVC');
2222       FND_MSG_PUB.ADD;
2223       RAISE FND_API.G_EXC_ERROR;
2224     END IF;
2225 
2226     l_inv_loc_id := NULL;
2227     OPEN c_loc_validate (l_visit_rec.organization_id, l_visit_rec.comp_planning_subinv, l_visit_rec.comp_planning_loc_seg);
2228     FETCH c_loc_validate INTO l_inv_loc_id;
2229     CLOSE c_loc_validate;
2230 
2231     l_visit_rec.comp_planning_loc_id := l_inv_loc_id;
2232   ELSE
2233     l_visit_rec.comp_planning_loc_id := NULL;
2234   END IF;
2235 
2236   -- In-Repair
2237   IF (l_visit_rec.comp_inrepair_subinv IS NOT NULL AND l_visit_rec.comp_inrepair_loc_seg IS NOT NULL) THEN
2238     l_status_id := NULL;
2239     OPEN c_subinv_validate (l_visit_rec.comp_inrepair_subinv, l_visit_rec.organization_id);
2240     FETCH c_subinv_validate INTO l_status_id;
2241     CLOSE c_subinv_validate;
2242 
2243     IF (l_status_id <> NVL(FND_PROFILE.VALUE('AHL_MTL_MAT_STATUS_UNSERVICABLE'), l_status_id)) THEN
2244       -- Planning and In-Repair Sub Inventory should be Unserviceable.
2245       FND_MESSAGE.SET_NAME('AHL', 'AHL_CMP_SUBINV_NOT_UNSVC');
2246       FND_MSG_PUB.ADD;
2247       RAISE FND_API.G_EXC_ERROR;
2248     END IF;
2249 
2250     l_inv_loc_id := NULL;
2251     OPEN c_loc_validate (l_visit_rec.organization_id, l_visit_rec.comp_inrepair_subinv, l_visit_rec.comp_inrepair_loc_seg);
2252     FETCH c_loc_validate INTO l_inv_loc_id;
2253     CLOSE c_loc_validate;
2254 
2255     l_visit_rec.comp_inrepair_loc_id := l_inv_loc_id;
2256   ELSE
2257     l_visit_rec.comp_inrepair_loc_id := NULL;
2258   END IF;
2259 
2260   -- Physical, Planning and In-Repair locators should be different
2261   -- NOTE: 1) no need to check for NULL explicitly
2262   --       2) ideally, physical sub inventory would be serviceable, whereas other two would be unserviceable
2263   IF (l_visit_rec.inv_locator_id       = l_visit_rec.comp_planning_loc_id OR
2264       l_visit_rec.inv_locator_id       = l_visit_rec.comp_inrepair_loc_id OR
2265       l_visit_rec.comp_planning_loc_id = l_visit_rec.comp_inrepair_loc_id) THEN
2266     -- Please set different locators for Physical, Planning and In-Repair Sub Inventories.
2267     FND_MESSAGE.SET_NAME('AHL', 'AHL_CMP_DIFF_LOCATORS');
2268     FND_MSG_PUB.ADD;
2269     RAISE FND_API.G_EXC_ERROR;
2270   END IF;
2271   -- SATHAPLI::Component Maintenance Planning Project, 02-Nov-2011, end
2272 
2273    -------------------------------- Validate -----------------------------------------
2274    IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
2275     fnd_log.string(fnd_log.level_statement,L_DEBUG,'Before calling Validate_Visit');
2276    END IF;
2277 
2278    Validate_Visit (
2279       p_api_version        => l_api_version,
2280       p_init_msg_list      => p_init_msg_list,
2281       p_commit             => Fnd_Api.g_false,
2282       p_validation_level   => p_validation_level,
2283       p_Visit_rec          => l_Visit_rec,
2284       x_return_status      => l_return_status,
2285       x_msg_count          => x_msg_count,
2286       x_msg_data           => x_msg_data
2287     );
2288 
2289    IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
2290     fnd_log.string(fnd_log.level_statement,L_DEBUG,'After calling Validate_Visit - l_return_status : '||l_return_status);
2291    END IF;
2292 
2293    -- Check for the ID.
2294    IF (l_Visit_rec.VISIT_ID = Fnd_Api.g_miss_num OR l_Visit_rec.VISIT_ID IS Null) THEN
2295      -- If the ID is not passed into the API, then
2296      -- grab a value from the sequence.
2297      OPEN c_seq;
2298      FETCH c_seq INTO l_Visit_rec.VISIT_ID;
2299      CLOSE c_seq;
2300 
2301      -- Check to be sure that the sequence does not exist.
2302      OPEN c_id_exists (l_Visit_rec.VISIT_ID);
2303      FETCH c_id_exists INTO l_dummy;
2304      CLOSE c_id_exists;
2305 
2306      -- If the value for the ID already exists, then
2307      -- l_dummy would be populated with '1', otherwise, it receives NULL.
2308      IF l_dummy IS NOT NULL THEN
2309        Fnd_Message.SET_NAME('AHL','AHL_VWP_SEQUENCE_NOT_EXISTS');
2310        Fnd_Msg_Pub.ADD;
2311      END IF;
2312 
2313      -- For all optional fields check if its g_miss_num/g_miss_char/g_miss_date
2314      -- then Null else the value call Default_Missing_Attribs procedure
2315      Default_Missing_Attribs
2316                ( p_x_visit_rec             => l_Visit_rec );
2317 
2318     IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
2319       fnd_log.string(fnd_log.level_statement,L_DEBUG,'Visit ID : '||l_Visit_rec.VISIT_ID);
2320     END IF;
2321    END IF;
2322 
2323    --Standard check to count messages
2324    l_msg_count := Fnd_Msg_Pub.count_msg;
2325 
2326    IF l_msg_count > 0 THEN
2327       x_msg_count := l_msg_count;
2328       x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
2329       RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
2330    END IF;
2331 
2332    -- Check for Visit Number
2333    OPEN c_visit_number;
2334    FETCH c_visit_number INTO l_visit_number;
2335    CLOSE c_visit_number;
2336 
2337    IF l_visit_number IS NOT NULL THEN
2338       l_visit_number := l_visit_number + 1;
2339    ELSE
2340       l_visit_number := 1;
2341    END IF;
2342 
2343    l_Visit_rec.VISIT_NUMBER := l_visit_number;
2344 
2345    IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
2346       fnd_log.string(fnd_log.level_statement,L_DEBUG,'Visit ID =' || l_Visit_rec.VISIT_ID);
2347       fnd_log.string(fnd_log.level_statement,L_DEBUG,'Visit Number =' || l_Visit_rec.VISIT_NUMBER);
2348       fnd_log.string(fnd_log.level_statement,L_DEBUG,'Visit Name =' || l_Visit_rec.VISIT_Name);
2349    END IF;
2350 
2351    -- Transit Check Changes Senthil.
2352    IF l_Visit_rec.unit_schedule_id IS NOT NULL
2353       AND  l_Visit_rec.unit_schedule_id <> FND_API.G_MISS_NUM THEN
2354 
2355       IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
2356         fnd_log.string(fnd_log.level_statement,L_DEBUG,'Before calling AHL_UA_FLIGHT_SCHEDULES_PVT.Validate_Flight_Schedule');
2357       END IF;
2358 
2359       -- Validate with UMP API
2360       AHL_UA_FLIGHT_SCHEDULES_PVT.Validate_Flight_Schedule
2361         (
2362         P_API_VERSION        => 1.0,
2363         X_RETURN_STATUS      => l_return_status,
2364         X_MSG_COUNT          => l_msg_count,
2365         X_MSG_DATA           => l_msg_data,
2366         P_UNIT_CONFIG_ID     => l_Visit_rec.unit_header_id,
2367         P_UNIT_SCHEDULE_ID   => l_Visit_rec.unit_schedule_id
2368         );
2369 
2370       IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
2371         fnd_log.string(fnd_log.level_statement,L_DEBUG,'After calling AHL_UA_FLIGHT_SCHEDULES_PVT.Validate_Flight_Schedule - l_return_status : '||l_return_status);
2372       END IF;
2373 
2374       IF l_msg_count > 0 THEN
2375         X_msg_count := l_msg_count;
2376         X_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
2377         RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
2378       END IF;
2379 
2380       -- Instance ID is madatory for transit visit
2381       IF  l_Visit_rec.item_instance_id IS NULL
2382         OR  l_Visit_rec.item_instance_id = FND_API.G_MISS_NUM THEN
2383          Fnd_Message.SET_NAME('AHL','AHL_VWP_TC_UNIT_REQ');
2384          Fnd_Msg_Pub.ADD;
2385       END IF;
2386 
2387       -- Planned Start Date is madatory for transit visit
2388       IF  l_visit_rec.START_DATE IS NULL OR  l_visit_rec.START_DATE = FND_API.g_miss_date THEN
2389          Fnd_Message.SET_NAME('AHL','AHL_VWP_TC_ST_DT_REQ');
2390          Fnd_Msg_Pub.ADD;
2391       END IF;
2392 
2393       -- Planned End Date is madatory for transit visit
2394       /*
2395       IF p_module_type = 'JSP' AND ( l_visit_rec.PLAN_END_DATE IS NULL
2396         OR  l_visit_rec.PLAN_END_DATE = FND_API.g_miss_date) THEN
2397           l_visit_rec.PLAN_END_DATE:= l_visit_rec.START_DATE + (FND_PROFILE.VALUE('AHL_TRANSIT_VISIT_DEFAULT_DURATION')/1440);
2398       END IF;
2399       */
2400    ELSE
2401       l_Visit_rec.unit_schedule_id := NULL;
2402    END IF;
2403 
2404    --Standard check to count messages
2405    l_msg_count := Fnd_Msg_Pub.count_msg;
2406 
2407    IF l_msg_count > 0 THEN
2408       x_msg_count := l_msg_count;
2409       x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
2410       RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
2411    END IF;
2412 
2413    --VWPE ER-12424063 :: tchimira :: 15-FEB -2011 :: start
2414    -- If the start date of the visit is not null and less than sysdate, the it is past dated visit. So pass the flag value accordingly
2415    IF  (l_visit_rec.START_DATE IS NOT NULL) THEN
2416       IF (l_visit_rec.START_DATE < SYSDATE ) THEN
2417         l_Visit_rec.PAST_DATED_VISIT_FLAG := 'Y';
2418       ELSE
2419         l_Visit_rec.PAST_DATED_VISIT_FLAG := 'N';
2420       END IF;
2421    END IF;
2422    IF (l_log_statement >= l_log_current_level) THEN
2423            fnd_log.string(l_log_statement,
2424                           L_DEBUG,
2425                           'Past date visit flag is: '||l_Visit_rec.PAST_DATED_VISIT_FLAG);
2426    END IF;
2427    --VWPE ER-12424063 :: tchimira :: 15-FEB -2011 :: end
2428 
2429    -------------------------- Insert --------------------------
2430    IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
2431       fnd_log.string(fnd_log.level_statement,L_DEBUG,'Before calling Ahl_Visits_Pkg.Insert_Row');
2432    END IF;
2433    -- Invoke the table handler to create a record
2434    -- Post 11.5.10 Enhancements
2435    -- Added Priority and Project Template Id
2436    -- Added Unit Schedule Id.
2437 
2438    -- SKPATHAK :: AVF ER: 13416865 :: 25-NOV-2011
2439    IF (l_Visit_rec.VISIT_NAME = 'Auto-Visit') THEN
2440      l_Visit_rec.VISIT_NAME := l_Visit_rec.VISIT_NAME || '-' || to_char(l_visit_number);
2441    END IF;
2442 
2443    Ahl_Visits_Pkg.Insert_Row (
2444      X_ROWID                 => l_rowid,
2445      X_VISIT_ID              => l_Visit_rec.VISIT_ID,
2446      X_VISIT_NUMBER          => l_visit_number,
2447      X_VISIT_TYPE_CODE       => l_Visit_rec.VISIT_TYPE_CODE,
2448      X_SIMULATION_PLAN_ID    => l_Visit_rec.SIMULATION_PLAN_ID,
2449      X_ITEM_INSTANCE_ID      => l_Visit_rec.ITEM_INSTANCE_ID,
2450      X_INVENTORY_ITEM_ID     => l_Visit_rec.INVENTORY_ITEM_ID,
2451      X_ITEM_ORGANIZATION_ID  => l_Visit_rec.ITEM_ORGANIZATION_ID,
2452      X_ASSO_PRIMARY_VISIT_ID => l_Visit_rec.ASSO_PRIMARY_VISIT_ID,
2453      X_SIMULATION_DELETE_FLAG => 'N',
2454      X_TEMPLATE_FLAG         => 'N',
2455      X_OUT_OF_SYNC_FLAG      => l_Visit_rec.OUT_OF_SYNC_FLAG,
2456      X_PROJECT_FLAG          => 'Y',
2457      X_PROJECT_ID            => l_Visit_rec.PROJECT_ID,
2458      X_SERVICE_REQUEST_ID    => l_Visit_rec.SERVICE_REQUEST_ID,
2459      X_SPACE_CATEGORY_CODE   => l_Visit_rec.SPACE_CATEGORY_CODE,
2460      X_SCHEDULE_DESIGNATOR   => NULL,
2461      X_ATTRIBUTE_CATEGORY    => l_Visit_rec.ATTRIBUTE_CATEGORY,
2462      X_ATTRIBUTE1            => l_Visit_rec.ATTRIBUTE1,
2463      X_ATTRIBUTE2            => l_Visit_rec.ATTRIBUTE2,
2464      X_ATTRIBUTE3            => l_Visit_rec.ATTRIBUTE3,
2465      X_ATTRIBUTE4            => l_Visit_rec.ATTRIBUTE4,
2466      X_ATTRIBUTE5            => l_Visit_rec.ATTRIBUTE5,
2467      X_ATTRIBUTE6            => l_Visit_rec.ATTRIBUTE6,
2468      X_ATTRIBUTE7            => l_Visit_rec.ATTRIBUTE7,
2469      X_ATTRIBUTE8            => l_Visit_rec.ATTRIBUTE8,
2470      X_ATTRIBUTE9            => l_Visit_rec.ATTRIBUTE9,
2471      X_ATTRIBUTE10           => l_Visit_rec.ATTRIBUTE10,
2472      X_ATTRIBUTE11           => l_Visit_rec.ATTRIBUTE11,
2473      X_ATTRIBUTE12           => l_Visit_rec.ATTRIBUTE12,
2474      X_ATTRIBUTE13           => l_Visit_rec.ATTRIBUTE13,
2475      X_ATTRIBUTE14           => l_Visit_rec.ATTRIBUTE14,
2476      X_ATTRIBUTE15           => l_Visit_rec.ATTRIBUTE15,
2477      X_OBJECT_VERSION_NUMBER => 1,
2478      X_ORGANIZATION_ID       => l_Visit_rec.ORGANIZATION_ID,
2479      X_DEPARTMENT_ID         => l_Visit_rec.DEPARTMENT_ID,
2480      X_STATUS_CODE           => l_Visit_rec.STATUS_CODE,
2481      X_START_DATE_TIME       => l_visit_rec.START_DATE,
2482      X_CLOSE_DATE_TIME       => l_visit_rec.PLAN_END_DATE,
2483      X_PRICE_LIST_ID         => NULL,
2484      X_ESTIMATED_PRICE       => NULL,
2485      X_ACTUAL_PRICE          => NULL,
2486      X_OUTSIDE_PARTY_FLAG    => 'N',
2487      X_ANY_TASK_CHG_FLAG     => 'N',
2488      X_VISIT_NAME            => l_Visit_rec.VISIT_NAME,
2489      X_DESCRIPTION           => l_Visit_rec.DESCRIPTION,
2490      X_CREATION_DATE         => SYSDATE,
2491      X_CREATED_BY            => Fnd_Global.USER_ID,
2492      X_LAST_UPDATE_DATE      => SYSDATE,
2493      X_LAST_UPDATED_BY       => Fnd_Global.USER_ID,
2494      X_LAST_UPDATE_LOGIN     => Fnd_Global.LOGIN_ID,
2495      X_PRIORITY_CODE         => l_visit_rec.priority_code,
2496      X_PROJECT_TEMPLATE_ID   => l_visit_rec.proj_template_id,
2497      X_UNIT_SCHEDULE_ID      => l_Visit_rec.unit_schedule_id,
2498      --PRAKKUM ::FP PIE :: 13-OCT-2010
2499      X_TOP_PROJECT_TASK_ID   => NULL,
2500      X_INV_LOCATOR_ID        => l_Visit_rec.inv_locator_id, /*Added by sowsubra*/
2501      -- SATHAPLI::Component Maintenance Planning Project, 02-Nov-2011
2502      -- set the Planning and In-Repair locators
2503      X_COMP_PLANNING_LOC_ID  => l_visit_rec.comp_planning_loc_id,
2504      X_COMP_INREPAIR_LOC_ID  => l_visit_rec.comp_inrepair_loc_id,
2505      --VWPE ER-12424063 :: tchimira :: 15-FEB -2011 :: start
2506      X_PAST_DATED_VISIT_FLAG    => l_Visit_rec.PAST_DATED_VISIT_FLAG,
2507      X_FIRMED_FLAG           => 'N',
2508      X_LOCKED_FLAG           => 'N',
2509      --VWPE ER-12424063 :: tchimira :: 15-FEB -2011 :: end
2510      --TCHIMIRA :: 14-Jun-2012 :: ER 14015560 ::added below flag
2511      X_AUTO_VISIT_TYPE_FLAG      =>l_Visit_rec.AUTO_VISIT_TYPE_FLAG
2512 );
2513 
2514    IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
2515       fnd_log.string(fnd_log.level_statement,L_DEBUG,'After calling Ahl_Visits_Pkg.Insert_Row');
2516    END IF;
2517 
2518    -- set OUT value
2519    p_x_visit_rec.VISIT_ID := l_Visit_rec.VISIT_ID;
2520 
2521    /* MANESING::Component Maintenance Planning Project, 05-Jul-2011
2522     * There is no need to create any Stage tasks for Component Visits
2523     * as there won't be any Stage associated with them.
2524     */
2525    l_is_comp_visit := AHL_CMP_UTIL_PKG.Is_Comp_Visit (l_visit_rec.visit_id);
2526    IF (l_is_comp_visit = 'N') THEN
2527 
2528      IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
2529         fnd_log.string(fnd_log.level_statement,L_DEBUG,'Before calling AHL_VWP_VISITS_STAGES_PVT.CREATE_STAGES');
2530      END IF;
2531 
2532      -- SKPATHAK :: 02-MAY-2011 :: VWPE: ER:12424063
2533      -- The below call is no more needed since going forward default stages need not be created during visit creation
2534      -----CREATE STAGES IF VISIT HAS BEEN CREATED SUCESSFULLY--------
2535      /*AHL_VWP_VISITS_STAGES_PVT.CREATE_STAGES
2536                 ( p_api_version           => p_api_version,
2537                   p_init_msg_list         => p_init_msg_list,
2538                   p_commit                => Fnd_Api.g_false,
2539                   p_validation_level      => p_validation_level,
2540                   p_module_type           => p_module_type,
2541                   p_visit_id              => l_Visit_rec.VISIT_ID,
2542                   x_return_status         => x_return_status,
2543                   x_msg_count             => x_msg_count,
2544                   x_msg_data              => x_msg_data
2545                 );
2546 
2547      IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
2548         fnd_log.string(fnd_log.level_statement,L_DEBUG,'After calling AHL_VWP_VISITS_STAGES_PVT.CREATE_STAGES - x_return_status : '||x_return_status);
2549      END IF;
2550      */
2551 
2552      -- SKPATHAK :: 20-JUN-2011 :: VWPE: ER:12673125 :: START
2553      -- Create the default stage task
2554      AHL_VWP_TASKS_PVT.Create_Stage_Tasks (
2555         p_api_version       => p_api_version,
2556         p_init_msg_list     => Fnd_Api.G_FALSE,
2557         p_commit            => Fnd_Api.G_FALSE,
2558         p_validation_level  => p_validation_level,
2559         p_module_type       => p_module_type,
2560         p_stage_id          => null,
2561         p_visit_id          => l_Visit_rec.VISIT_ID,
2562         x_return_status     => l_return_status,
2563         x_msg_count         => l_msg_count,
2564         x_msg_data          => l_msg_data
2565      );
2566 
2567      IF (l_log_statement >= l_log_current_level) THEN
2568           fnd_log.string(l_log_statement,
2569                          L_DEBUG,
2570                          'After Calling AHL_VWP_PROJ_PROD_PVT.plan_visit. Return Status = ' || l_return_status );
2571      END IF;
2572 
2573      IF NVL(l_return_status,'x') <> FND_API.G_RET_STS_SUCCESS THEN
2574        x_msg_count := l_msg_count;
2575        x_return_status := l_return_status;
2576        IF l_return_status = Fnd_Api.g_ret_sts_error THEN
2577          RAISE Fnd_Api.g_exc_error;
2578        ELSIF l_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
2579          RAISE Fnd_Api.g_exc_unexpected_error;
2580        END IF;
2581      END IF;
2582      -- SKPATHAK :: 20-JUN-2011 :: VWPE: ER:12673125 :: END
2583    END IF;  -- if l_is_comp_visit = 'N'
2584 
2585    -- TCHIMIRA :: Changes for Component Maintenance Planning :: 10-JAN-2012 :: START
2586    -- if the visit is component type then do not flag the visit as past dated irrespective of the start date
2587    IF (l_is_comp_visit = 'Y') THEN
2588     --Update the visit table and set past dated visit flag to 'N'
2589     UPDATE AHL_VISITS_B
2590     set PAST_DATED_VISIT_FLAG = 'N',
2591       OBJECT_VERSION_NUMBER = object_version_number + 1,
2592       LAST_UPDATE_DATE      = SYSDATE,
2593       LAST_UPDATED_BY       = Fnd_Global.USER_ID,
2594       LAST_UPDATE_LOGIN     = Fnd_Global.LOGIN_ID
2595     WHERE VISIT_ID    = l_visit_rec.visit_id;
2596    END IF;
2597    -- TCHIMIRA :: Changes for Component Maintenance Planning :: 10-JAN-2012 :: END
2598    IF l_Visit_rec.visit_type_code IS NOT NULL
2599       AND l_Visit_rec.visit_type_code <> FND_API.G_MISS_CHAR THEN
2600 
2601       -- TCHIMIRA :: BUG 13991270 :: 26-Apr-2012
2602       -- Swapped the below two calls AHL_VWP_VISITS_STAGES_PVT.Assoc_VisitType_to_Visit and AHL_VWP_TASKS_PVT.ASSOCIATE_DEFAULT_MRS
2603       -- First we need to create stages and then associate default MRs to the visit during visit creation.
2604 
2605       /* MANESING::Component Maintenance Planning Project, 05-Jul-2011
2606        * There is no need for handling anything related to Stages for Component Visits
2607        * as there won't be any Stage associated with them.
2608        */
2609       IF (l_is_comp_visit = 'N') THEN
2610 
2611         --VWPE ER-12424063:: tchimira :: 15-FEB -2011 :: start
2612         -- since the visit type code is not null during creation of a visit, call the associate visit type to visit procedure
2613         -- This procedure creates stages, stage tasks, stage rules and stage-stage type association in a visit
2614         IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
2615           fnd_log.string(fnd_log.level_statement,L_DEBUG,'Before calling AHL_VWP_VISITS_STAGES_PVT.Assoc_VisitType_to_Visit');
2616         END IF;
2617 
2618         AHL_VWP_VISITS_STAGES_PVT.Assoc_VisitType_to_Visit (
2619                                 p_api_version             =>   1.0,
2620                                 p_init_msg_list           =>   fnd_api.g_false,
2621                                 p_commit                  =>   fnd_api.g_false,
2622                                 p_validation_level        =>   p_validation_level,
2623                                 p_visit_id                =>   l_Visit_rec.VISIT_ID,
2624                                 p_visit_type_code         =>   l_Visit_rec.VISIT_TYPE_CODE,
2625                                 x_return_status           =>   l_return_status,
2626                                 x_msg_count               =>   x_msg_count,
2627                                 x_msg_data                =>   x_msg_data
2628                                 );
2629         IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
2630             fnd_log.string(fnd_log.level_statement,L_DEBUG,'After calling AHL_VWP_VISITS_STAGES_PVT.Assoc_VisitType_to_Visit - l_return_status : '||l_return_status);
2631         END IF;
2632 
2633 
2634        IF l_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
2635           RAISE Fnd_Api.g_exc_unexpected_error;
2636        ELSIF l_return_status = Fnd_Api.g_ret_sts_error THEN
2637           RAISE Fnd_Api.g_exc_error;
2638        END IF;
2639         --VWPE ER-12424063:: tchimira :: 15-FEB -2011 :: start
2640 
2641       END IF;  -- if l_is_comp_visit = 'N'
2642 
2643       IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
2644         fnd_log.string(fnd_log.level_statement,L_DEBUG,'Before calling AHL_VWP_TASKS_PVT.ASSOCIATE_DEFAULT_MRS');
2645       END IF;
2646 
2647       AHL_VWP_TASKS_PVT.ASSOCIATE_DEFAULT_MRS
2648       (
2649         p_api_version           => 1.0,
2650         -- PRAKKUM :: FP:PIE :: 13-OCT-2010 :: passing the module type to avoid erroneous defaulting
2651         p_module_type           => p_module_type,
2652         x_return_status         => x_return_status,
2653         x_msg_count             => x_msg_count,
2654         x_msg_data              => x_msg_data,
2655         p_visit_rec             => l_Visit_rec
2656       );
2657 
2658       IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
2659         fnd_log.string(fnd_log.level_statement,L_DEBUG,'After calling AHL_VWP_TASKS_PVT.ASSOCIATE_DEFAULT_MRS - x_return_status : '||x_return_status);
2660       END IF;
2661 
2662       --Standard check to count messages
2663       l_msg_count := Fnd_Msg_Pub.count_msg;
2664 
2665       IF l_msg_count > 0 THEN
2666         X_msg_count := l_msg_count;
2667         X_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
2668         RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
2669       END IF;
2670    END IF;--if l_Visit_rec.visit_type_code IS NOT NULL
2671 
2672      IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
2673         fnd_log.string(fnd_log.level_statement,L_DEBUG,'Before calling AHL_VWP_TIMES_PVT.Calculate_Task_Times');
2674      END IF;
2675 
2676      --Now adjust the times derivation for task
2677    AHL_VWP_TIMES_PVT.Calculate_Task_Times(p_api_version => 1.0,
2678                                     p_init_msg_list     => Fnd_Api.G_FALSE,
2679                                     p_commit            => Fnd_Api.G_FALSE,
2680                                     p_validation_level  => Fnd_Api.G_VALID_LEVEL_FULL,
2681                                     x_return_status     => l_return_status,
2682                                     x_msg_count         => l_msg_count,
2683                                     x_msg_data          => l_msg_data,
2684                                     p_visit_id          => l_visit_rec.visit_id);
2685 
2686    IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
2687       fnd_log.string(fnd_log.level_statement,L_DEBUG,'After calling AHL_VWP_TIMES_PVT.Calculate_Task_Times - l_return_status : '||l_return_status);
2688    END IF;
2689 
2690    --Standard check to count messages
2691    l_msg_count := Fnd_Msg_Pub.count_msg;
2692 
2693    IF l_msg_count > 0 THEN
2694       X_msg_count := l_msg_count;
2695       X_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
2696       RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
2697    END IF;
2698 
2699    -- Added by sjayacha as per Shailaja mail
2700    IF l_Visit_rec.unit_schedule_id IS NOT NULL
2701       AND  l_Visit_rec.unit_schedule_id <> FND_API.G_MISS_NUM THEN
2702         l_date_time := NVL(NVL(l_visit_rec.PLAN_END_DATE,
2703                                AHL_VWP_TIMES_PVT.get_visit_end_time(l_Visit_rec.visit_id)),
2704                                l_visit_rec.START_DATE + (FND_PROFILE.VALUE('AHL_TRANSIT_VISIT_DEFAULT_DURATION')/1440));
2705 
2706         IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
2707           fnd_log.string(fnd_log.level_statement,L_DEBUG,'l_date_time - '||l_date_time);
2708         END IF;
2709 
2710         UPDATE ahl_visits_b
2711         SET   close_date_time = l_date_time
2712         WHERE  visit_id = l_Visit_rec.visit_id ;
2713    END IF;
2714 
2715    IF l_Visit_rec.visit_create_type IS NOT NULL
2716    AND l_Visit_rec.visit_create_type <> FND_API.G_MISS_CHAR THEN
2717       IF l_Visit_rec.visit_create_type = 'PRODUCTION_RELEASED' THEN
2718           l_release_flag := 'Y';
2719       ELSIF l_Visit_rec.visit_create_type = 'PRODUCTION_UNRELEASED' THEN
2720           l_release_flag := 'N';
2721       END IF;
2722 
2723       IF l_release_flag IS NOT NULL THEN
2724         IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
2725           fnd_log.string(fnd_log.level_statement,L_DEBUG,'Before calling AHL_VWP_PROJ_PROD_PVT.Release_Visit');
2726         END IF;
2727 
2728         AHL_VWP_PROJ_PROD_PVT.Release_Visit (
2729             p_api_version         => 1.0,
2730            /*p_init_msg_list          IN            VARCHAR2  := Fnd_Api.G_FALSE,
2731             p_commit                 IN            VARCHAR2  := Fnd_Api.G_FALSE,
2732             p_validation_level       IN            NUMBER    := Fnd_Api.G_VALID_LEVEL_FU */
2733             p_module_type         => 'VWP',
2734             p_visit_id            => l_Visit_rec.VISIT_ID,
2735             p_release_flag        => l_release_flag,
2736             x_return_status       => x_return_status,
2737             x_msg_count           => x_msg_count,
2738             x_msg_data            => x_msg_data);
2739 
2740         IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
2741           fnd_log.string(fnd_log.level_statement,L_DEBUG,'After calling AHL_VWP_PROJ_PROD_PVT.Release_Visit - x_return_status : '||x_return_status);
2742         END IF;
2743       -- SKPATHAK :: 02-MAY-2011 :: VWPE: ER:12424063  :: STARTS
2744       -- If visit is created in planning status, draft WOs should be automatically created for the visit tasks
2745       ELSIF l_Visit_rec.visit_create_type = 'PLANNING' THEN
2746           AHL_VWP_PROJ_PROD_PVT.plan_visit(
2747           p_api_version           => l_api_version,
2748           p_init_msg_list         => p_init_msg_list,
2749           p_commit                => Fnd_Api.g_false,
2750           p_validation_level      => p_validation_level,
2751           p_visit_id              => l_Visit_rec.VISIT_ID,
2752           x_return_status         => x_return_status,
2753           x_msg_count             => x_msg_count,
2754           x_msg_data              => x_msg_data);
2755 
2756         IF (l_log_statement >= l_log_current_level) THEN
2757            fnd_log.string(l_log_statement,
2758                           L_DEBUG,
2759                           'After Calling AHL_VWP_PROJ_PROD_PVT.plan_visit. Return Status = ' || x_return_status );
2760         END IF;
2761 
2762       END IF;
2763       -- SKPATHAK :: 02-MAY-2011 :: VWPE: ER:12424063  :: END
2764    END IF;   -- l_Visit_rec.visit_create_type IS NOT NULL
2765 
2766    ---------------------------End of API Body---------------------------------------
2767    --Standard check to count messages
2768    l_msg_count := Fnd_Msg_Pub.count_msg;
2769 
2770    IF l_msg_count > 0 THEN
2771       X_msg_count := l_msg_count;
2772       X_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
2773       RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
2774    END IF;
2775 
2776    --Standard check for commit
2777    IF Fnd_Api.TO_BOOLEAN(p_commit) THEN
2778       COMMIT;
2779    END IF;
2780 
2781   IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level) THEN
2782     fnd_log.string(fnd_log.level_procedure,L_DEBUG||'.end','At the end of PLSQL procedure');
2783   END IF;
2784 EXCEPTION
2785    WHEN Fnd_Api.g_exc_error THEN
2786       ROLLBACK TO Create_Visit;
2787       x_return_status := Fnd_Api.g_ret_sts_error;
2788       Fnd_Msg_Pub.count_and_get(
2789             p_encoded => Fnd_Api.g_false,
2790             p_count   => x_msg_count,
2791             p_data    => x_msg_data
2792       );
2793    WHEN Fnd_Api.g_exc_unexpected_error THEN
2794       ROLLBACK TO Create_Visit;
2795       x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
2796       Fnd_Msg_Pub.count_and_get (
2797             p_encoded => Fnd_Api.g_false,
2798             p_count   => x_msg_count,
2799             p_data    => x_msg_data
2800       );
2801    WHEN OTHERS THEN
2802       ROLLBACK TO Create_Visit;
2803       x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
2804       IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_unexp_error)
2805         THEN
2806          Fnd_Msg_Pub.add_exc_msg (G_PKG_NAME, l_api_name);
2807       END IF;
2808       Fnd_Msg_Pub.count_and_get (
2809             p_encoded => Fnd_Api.g_false,
2810             p_count   => x_msg_count,
2811             p_data    => x_msg_data
2812       );
2813 END Create_Visit;
2814 
2815 --------------------------------------------------------------------
2816 -- PROCEDURE
2817 --
2818 --
2819 -- PURPOSE
2820 --    To copy to Visit/Template from a Visit/Template
2821 --------------------------------------------------------------------
2822 PROCEDURE Copy_Visit (
2823    p_api_version       IN  NUMBER,
2824    p_init_msg_list     IN  VARCHAR2  := Fnd_Api.g_false,
2825    p_commit            IN  VARCHAR2  := Fnd_Api.g_false,
2826    p_validation_level  IN  NUMBER    := Fnd_Api.g_valid_level_full,
2827    p_module_type       IN  VARCHAR2  := 'JSP',
2828    p_visit_id          IN  NUMBER,
2829    p_x_visit_rec       IN  OUT NOCOPY Visit_Rec_Type,
2830    x_return_status     OUT NOCOPY VARCHAR2,
2831    x_msg_count         OUT NOCOPY NUMBER,
2832    x_msg_data          OUT NOCOPY VARCHAR2
2833 )
2834 IS
2835  -- Define local Variables
2836    L_API_VERSION          CONSTANT NUMBER := 1.0;
2837    L_API_NAME             CONSTANT VARCHAR2(30) := 'Copy_Visit';
2838    L_FULL_NAME            CONSTANT VARCHAR2(60) := G_PKG_NAME || '.' || L_API_NAME;
2839    L_DEBUG                CONSTANT VARCHAR2(90) := 'ahl.plsql.'||L_FULL_NAME;
2840 
2841    l_msg_data              VARCHAR2(2000);
2842    l_return_status         VARCHAR2(1);
2843    l_msg_count             NUMBER;
2844 
2845    l_rowid                 VARCHAR2(30);
2846 
2847    l_planned_order_flag    VARCHAR2(1);
2848 
2849    l_visit_id              NUMBER;
2850    l_visit_number          NUMBER;
2851 
2852    l_price_changed         VARCHAR2(1) := 'N';
2853    l_actual_price          NUMBER;
2854    l_estimate_price        NUMBER;
2855 
2856    l_task_department_id    NUMBER;
2857    l_visit_task_id         NUMBER;
2858    l_parent_task_id        NUMBER;
2859    l_new_parent_task_id    NUMBER;
2860    l_new_task_id           NUMBER;
2861 
2862 
2863  -- Define local record datatypes
2864     l_visit_rec             Visit_Rec_Type := p_x_visit_rec;
2865 
2866  -- Define local Cursors
2867    -- To find visit related information
2868    CURSOR c_visit (x_visit_id IN NUMBER) IS
2869       SELECT * FROM AHL_VISITS_VL
2870       WHERE VISIT_ID = x_visit_id;
2871    c_visit_rec c_visit%ROWTYPE;
2872 
2873      -- To find task related information for a visit
2874      -- Dont copy deleted tasks to new visit.
2875    CURSOR c_task (x_visit_id IN NUMBER) IS
2876       SELECT * FROM AHL_VISIT_TASKS_VL
2877       WHERE VISIT_ID = x_visit_id AND NVL(STATUS_CODE,'X') <> 'DELETED';
2878    c_task_rec c_task%ROWTYPE;
2879 
2880     -- To find task link related information for a visit
2881    CURSOR c_visit_task_links(x_visit_id IN NUMBER) IS
2882      SELECT VISIT_TASK_ID,
2883             PARENT_TASK_ID,
2884             --SECURITY_GROUP_ID,
2885             ATTRIBUTE_CATEGORY,
2886             ATTRIBUTE1,
2887             ATTRIBUTE2,
2888             ATTRIBUTE3,
2889             ATTRIBUTE4,
2890             ATTRIBUTE5,
2891             ATTRIBUTE6,
2892             ATTRIBUTE7,
2893             ATTRIBUTE8,
2894             ATTRIBUTE9,
2895             ATTRIBUTE10,
2896             ATTRIBUTE11,
2897             ATTRIBUTE12,
2898             ATTRIBUTE13,
2899             ATTRIBUTE14,
2900             ATTRIBUTE15
2901      FROM AHL_TASK_LINKS
2902      WHERE visit_task_id in (  SELECT VISIT_TASK_ID
2903                     FROM AHL_VISIT_TASKS_B
2904                     WHERE visit_id = x_visit_id);
2905 
2906     l_task_link_rec c_visit_task_links%ROWTYPE;
2907 
2908     -- To find the coresponding task id in the new visit
2909    CURSOR c_new_task_ID(x_visit_task_id IN NUMBER, x_new_visit_id IN NUMBER) IS
2910      SELECT b.VISIT_TASK_ID
2911      FROM AHL_VISIT_TASKS_B a, AHL_VISIT_TASKS_B b
2912      WHERE a.visit_task_id = x_visit_task_id
2913           AND a.visit_task_number = b.visit_task_number
2914           AND b.visit_id = x_new_visit_id;
2915 
2916 BEGIN
2917   --------------------- Initialize -----------------------
2918   SAVEPOINT Copy_Visit;
2919 
2920   IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level) THEN
2921     fnd_log.string(fnd_log.level_procedure,L_DEBUG||'.begin','At the start of PLSQL procedure');
2922   END IF;
2923 
2924   -- Initialize message list if p_init_msg_list is set to TRUE.
2925   IF Fnd_Api.to_boolean(p_init_msg_list) THEN
2926     Fnd_Msg_Pub.initialize;
2927   END IF;
2928 
2929   --  Initialize API return status to success
2930   x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
2931 
2932   -- Standard call to check for call compatibility.
2933   IF NOT Fnd_Api.COMPATIBLE_API_CALL(l_api_version,
2934                                       p_api_version,
2935                                       l_api_name,G_PKG_NAME) THEN
2936        RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
2937   END IF;
2938   ------------------------Start of API Body------------------------------------
2939   -----------------------Value/Id conversions ----------------------
2940   IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
2941     fnd_log.string(fnd_log.level_statement,L_DEBUG,'Visit Id - '||p_visit_id);
2942   END IF;
2943 
2944   OPEN c_visit(p_visit_id);
2945   FETCH c_visit INTO c_visit_rec;
2946   IF c_Visit%NOTFOUND THEN
2947       CLOSE c_Visit;
2948       IF Fnd_Msg_Pub.check_msg_level(Fnd_Msg_Pub.g_msg_lvl_error) THEN
2949           Fnd_Message.set_name('AHL', 'AHL_API_RECORD_NOT_FOUND');
2950           Fnd_Msg_Pub.ADD;
2951           IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
2952             fnd_log.string(fnd_log.level_statement,L_DEBUG,'Visit not found for' ||l_visit_rec.visit_id );
2953           END IF;
2954       END IF;
2955       RAISE Fnd_Api.g_exc_error;
2956   ELSE
2957     CLOSE c_Visit;
2958   END IF;
2959 
2960   -- Check if the visit status is deleted.display error message if so. Added in 11.5.10
2961   IF UPPER(c_visit_rec.status_code) = 'DELETED' THEN
2962       Fnd_Message.SET_NAME('AHL','AHL_VWP_INVALID_STATUS');
2963       Fnd_Msg_Pub.ADD;
2964       RAISE Fnd_Api.G_EXC_ERROR;
2965   END IF;
2966 
2967   -- org/dept/start date/end date are passed from UA
2968   -- Null check and org/dept/dates validation is already done from calling API Synchronize_Visit
2969   -- If organization/Department/Start Date changed then clear up price
2970   IF l_visit_rec.organization_id <> c_Visit_rec.organization_id
2971      OR l_visit_rec.department_id <> c_Visit_rec.department_id
2972      OR l_visit_rec.START_DATE <> c_Visit_rec.START_DATE_TIME THEN
2973       l_price_changed  := 'Y';
2974       l_actual_price   := NULL;
2975       l_estimate_price := NULL;
2976   ELSE
2977       l_actual_price   := c_Visit_rec.ACTUAL_PRICE;
2978       l_estimate_price := c_Visit_rec.ESTIMATED_PRICE;
2979   END IF;
2980 
2981   -- Get ID and Number for the new visit
2982   l_visit_id := Get_Visit_Id();
2983   l_visit_number := Get_Visit_Number();
2984 
2985   -- Create New Visit
2986   Ahl_Visits_Pkg.Insert_Row (
2987        X_ROWID                 => l_rowid,
2988        X_VISIT_ID              => l_Visit_ID,
2989        X_VISIT_NUMBER          => l_visit_number,
2990        X_VISIT_TYPE_CODE       => c_Visit_rec.VISIT_TYPE_CODE,
2991        X_SIMULATION_PLAN_ID    => c_Visit_rec.simulation_plan_id,
2992        X_ITEM_INSTANCE_ID      => c_Visit_rec.item_instance_id,
2993        X_INVENTORY_ITEM_ID     => c_visit_rec.INVENTORY_ITEM_ID,
2994        X_ITEM_ORGANIZATION_ID  => c_Visit_rec.ITEM_ORGANIZATION_ID,
2995        X_ASSO_PRIMARY_VISIT_ID => c_Visit_rec.asso_primary_visit_id,
2996        X_SIMULATION_DELETE_FLAG=> 'N',
2997        X_TEMPLATE_FLAG         => c_Visit_rec.TEMPLATE_FLAG,
2998        X_OUT_OF_SYNC_FLAG      => NULL,
2999        X_PROJECT_FLAG          => c_Visit_rec.PROJECT_FLAG,
3000        X_PROJECT_ID            => NULL,
3001        X_SERVICE_REQUEST_ID    => c_Visit_rec.SERVICE_REQUEST_ID,
3002        X_SCHEDULE_DESIGNATOR   => c_Visit_rec.SCHEDULE_DESIGNATOR,
3003        X_SPACE_CATEGORY_CODE   => c_Visit_rec.SPACE_CATEGORY_CODE,
3004        X_ATTRIBUTE_CATEGORY    => c_visit_rec.ATTRIBUTE_CATEGORY,
3005        X_ATTRIBUTE1            => c_visit_rec.ATTRIBUTE1,
3006        X_ATTRIBUTE2            => c_visit_rec.ATTRIBUTE2,
3007        X_ATTRIBUTE3            => c_Visit_rec.ATTRIBUTE3,
3008        X_ATTRIBUTE4            => c_Visit_rec.ATTRIBUTE4,
3009        X_ATTRIBUTE5            => c_Visit_rec.ATTRIBUTE5,
3010        X_ATTRIBUTE6            => c_Visit_rec.ATTRIBUTE6,
3011        X_ATTRIBUTE7            => c_Visit_rec.ATTRIBUTE7,
3012        X_ATTRIBUTE8            => c_Visit_rec.ATTRIBUTE8,
3013        X_ATTRIBUTE9            => c_Visit_rec.ATTRIBUTE9,
3014        X_ATTRIBUTE10           => c_Visit_rec.ATTRIBUTE10,
3015        X_ATTRIBUTE11           => c_Visit_rec.ATTRIBUTE11,
3016        X_ATTRIBUTE12           => c_Visit_rec.ATTRIBUTE12,
3017        X_ATTRIBUTE13           => c_Visit_rec.ATTRIBUTE13,
3018        X_ATTRIBUTE14           => c_Visit_rec.ATTRIBUTE14,
3019        X_ATTRIBUTE15           => c_Visit_rec.ATTRIBUTE15,
3020        X_OBJECT_VERSION_NUMBER => 1,
3021        X_ORGANIZATION_ID       => l_Visit_rec.ORGANIZATION_ID,
3022        X_DEPARTMENT_ID         => l_Visit_rec.DEPARTMENT_ID,
3023        X_STATUS_CODE           => 'PLANNING',
3024        X_START_DATE_TIME       => l_Visit_rec.START_DATE,
3025        X_CLOSE_DATE_TIME       => l_Visit_rec.PLAN_END_DATE,
3026        X_PRICE_LIST_ID         => c_Visit_rec.PRICE_LIST_ID,
3027        X_ESTIMATED_PRICE       => l_estimate_price,
3028        X_ACTUAL_PRICE          => l_actual_price,
3029        X_OUTSIDE_PARTY_FLAG    => c_Visit_rec.OUTSIDE_PARTY_FLAG,
3030        X_ANY_TASK_CHG_FLAG     => 'N',
3031        X_VISIT_NAME            => c_Visit_rec.VISIT_NAME,
3032        X_DESCRIPTION           => c_Visit_rec.DESCRIPTION,
3033        X_CREATION_DATE         => SYSDATE,
3034        X_CREATED_BY            => Fnd_Global.USER_ID,
3035        X_LAST_UPDATE_DATE      => SYSDATE,
3036        X_LAST_UPDATED_BY       => Fnd_Global.USER_ID,
3037        X_LAST_UPDATE_LOGIN     => Fnd_Global.LOGIN_ID,
3038        X_PRIORITY_CODE         => c_Visit_rec.PRIORITY_CODE,
3039        X_PROJECT_TEMPLATE_ID   => c_Visit_rec.PROJECT_TEMPLATE_ID,
3040        X_UNIT_SCHEDULE_ID      => c_Visit_rec.UNIT_SCHEDULE_ID,
3041        --PRAKKUM ::FP PIE :: 13-OCT-2010
3042        X_TOP_PROJECT_TASK_ID   => c_Visit_rec.TOP_PROJECT_TASK_ID,
3043        X_INV_LOCATOR_ID        => l_Visit_rec.inv_locator_id, --Added by sowsubra
3044        -- SATHAPLI::Component Maintenance Planning Project, 02-Nov-2011
3045        -- set the Planning and In-Repair locators
3046        X_COMP_PLANNING_LOC_ID  => c_visit_rec.comp_planning_loc_id,
3047        X_COMP_INREPAIR_LOC_ID  => c_visit_rec.comp_inrepair_loc_id,
3048        --VWPE ER-12424063 :: tchimira :: 15-FEB -2011 :: start
3049        X_PAST_DATED_VISIT_FLAG    => l_Visit_rec.PAST_DATED_VISIT_FLAG,
3050        X_FIRMED_FLAG         => 'N',
3051        X_LOCKED_FLAG         => 'N',
3052        --VWPE ER-12424063 :: tchimira :: 15-FEB -2011 :: end
3053        --TCHIMIRA :: 14-Jun-2012 :: ER 14015560 ::added below flag
3054        X_AUTO_VISIT_TYPE_FLAG      =>l_Visit_rec.AUTO_VISIT_TYPE_FLAG
3055        );
3056 
3057   -- Copy Tasks from originating visit
3058   OPEN c_task(p_visit_id);
3059   LOOP
3060     FETCH c_task INTO c_task_rec;
3061     EXIT WHEN c_task%NOTFOUND;
3062 
3063     c_task_rec.visit_task_id := AHL_VWP_RULES_PVT.Get_Visit_Task_Id();
3064 
3065     -- if visit org/dept/dates are changed, then clear up task price
3066     IF l_price_changed  = 'Y' THEN
3067        l_actual_price   := NULL;
3068        l_estimate_price := NULL;
3069     ELSE
3070        l_actual_price   := c_task_rec.ACTUAL_PRICE;
3071        l_estimate_price := c_task_rec.ESTIMATED_PRICE;
3072     END IF;
3073 
3074     -- if visit organization changed, then clear up task department
3075     IF l_visit_rec.organization_id <> c_Visit_rec.organization_id THEN
3076       l_task_department_id := NULL;
3077     ELSE
3078       l_task_department_id := c_task_rec.department_id;
3079     END IF;
3080 
3081     IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
3082       fnd_log.string(fnd_log.level_statement,L_DEBUG,'Before AHL_VISIT_TASKS_PKG.INSERT_ROW');
3083     END IF;
3084 
3085     -- Create task in new visit
3086     AHL_VISIT_TASKS_PKG.INSERT_ROW
3087         ( X_ROWID                 => l_rowid,
3088           X_VISIT_TASK_ID         => c_task_rec.visit_task_id,
3089           X_VISIT_TASK_NUMBER     => c_task_rec.visit_task_number,
3090           X_OBJECT_VERSION_NUMBER => 1,
3091           X_VISIT_ID              => l_visit_id,
3092           X_PROJECT_TASK_ID       => NULL,
3093           X_COST_PARENT_ID        => c_task_rec.cost_parent_id,
3094           X_MR_ROUTE_ID           => c_task_rec.MR_ID,
3095           X_MR_ID                 => c_task_rec.MR_ROUTE_ID,
3096           X_DURATION              => c_task_rec.duration,
3097           X_UNIT_EFFECTIVITY_ID   => c_task_rec.UNIT_EFFECTIVITY_ID,
3098           X_START_FROM_HOUR       => c_task_rec.start_from_hour,
3099           X_INVENTORY_ITEM_ID     => c_task_rec.inventory_item_id,
3100           X_ITEM_ORGANIZATION_ID  => c_task_rec.item_organization_id,
3101           X_INSTANCE_ID           => c_task_rec.instance_id,
3102           X_PRIMARY_VISIT_TASK_ID => c_task_rec.primary_visit_task_id,
3103           X_ORIGINATING_TASK_ID   => c_task_rec.originating_task_id,
3104           X_SERVICE_REQUEST_ID    => c_task_rec.service_request_id,
3105           X_TASK_TYPE_CODE        => c_task_rec.task_type_code,
3106           -- PRAKKUM :: FP:PIE :: 13-OCT-2010 :: Service Type code added
3107           X_SERVICE_TYPE_CODE     => c_task_rec.SERVICE_TYPE_CODE,
3108           X_DEPARTMENT_ID         => l_task_department_id,
3109           X_SUMMARY_TASK_FLAG     => c_task_rec.SUMMARY_TASK_FLAG,
3110           X_PRICE_LIST_ID         => c_task_rec.PRICE_LIST_ID,
3111           X_STATUS_CODE           => 'PLANNING',
3112           X_ESTIMATED_PRICE       => l_estimate_price,
3113           X_ACTUAL_PRICE          => l_actual_price,
3114           X_ACTUAL_COST           => c_task_rec.ACTUAL_COST,
3115           X_STAGE_ID              => c_task_rec.STAGE_ID,
3116           -- SKPATHAK :: ER: 9147951 :: 11-JAN-2010
3117           -- Pass past dates too, and if it is null, pass null for all the 4 columns below
3118           X_START_DATE_TIME       => c_task_rec.PAST_TASK_START_DATE,
3119           X_END_DATE_TIME         => c_task_rec.PAST_TASK_END_DATE,
3120           X_PAST_TASK_START_DATE  => c_task_rec.PAST_TASK_START_DATE,
3121           X_PAST_TASK_END_DATE    => c_task_rec.PAST_TASK_END_DATE,
3122           --MANESING::Component Maintenance Planning Project, 07-Aug-2011, added target quantity
3123           X_TARGET_QTY            => c_task_rec.target_qty,
3124           X_ATTRIBUTE_CATEGORY    => c_task_rec.ATTRIBUTE_CATEGORY,
3125           X_ATTRIBUTE1            => c_task_rec.ATTRIBUTE1,
3126           X_ATTRIBUTE2            => c_task_rec.ATTRIBUTE2,
3127           X_ATTRIBUTE3            => c_task_rec.ATTRIBUTE3,
3128           X_ATTRIBUTE4            => c_task_rec.ATTRIBUTE4,
3129           X_ATTRIBUTE5            => c_task_rec.ATTRIBUTE5,
3130           X_ATTRIBUTE6            => c_task_rec.ATTRIBUTE6,
3131           X_ATTRIBUTE7            => c_task_rec.ATTRIBUTE7,
3132           X_ATTRIBUTE8            => c_task_rec.ATTRIBUTE8,
3133           X_ATTRIBUTE9            => c_task_rec.ATTRIBUTE9,
3134           X_ATTRIBUTE10           => c_task_rec.ATTRIBUTE10,
3135           X_ATTRIBUTE11           => c_task_rec.ATTRIBUTE11,
3136           X_ATTRIBUTE12           => c_task_rec.ATTRIBUTE12,
3137           X_ATTRIBUTE13           => c_task_rec.ATTRIBUTE13,
3138           X_ATTRIBUTE14           => c_task_rec.ATTRIBUTE14,
3139           X_ATTRIBUTE15           => c_task_rec.ATTRIBUTE15,
3140           X_VISIT_TASK_NAME       => c_task_rec.visit_task_name,
3141           X_DESCRIPTION           => c_task_rec.description,
3142           X_QUANTITY              => c_task_rec.quantity, -- Added by rnahata for Issue 105
3143           X_CREATION_DATE         => SYSDATE,
3144           X_CREATED_BY            => Fnd_Global.USER_ID,
3145           X_LAST_UPDATE_DATE      => SYSDATE,
3146           X_LAST_UPDATED_BY       => Fnd_Global.USER_ID,
3147           X_LAST_UPDATE_LOGIN     => Fnd_Global.LOGIN_ID );
3148 
3149     IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
3150       fnd_log.string(fnd_log.level_statement,L_DEBUG,'After calling AHL_VISIT_TASKS_PKG.INSERT_ROW ');
3151     END IF;
3152 
3153     -- Create Planned Material if task type is planned or unplanned
3154     IF c_task_rec.task_type_code in ('PLANNED','UNPLANNED') THEN
3155       IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
3156         fnd_log.string(fnd_log.level_statement,L_DEBUG,'Before calling  AHL_LTP_REQST_MATRL_PVT.Process_Planned_Materials');
3157         fnd_log.string(fnd_log.level_statement,L_DEBUG,'Value of Visit Task ID : ' || c_task_rec.visit_task_id);
3158         fnd_log.string(fnd_log.level_statement,L_DEBUG,'Value of Visit ID : ' || l_visit_id);
3159       END IF;
3160 
3161       -- To call LTP Process Materials API for APS Integration
3162       AHL_LTP_REQST_MATRL_PVT.Process_Planned_Materials
3163             ( p_api_version             => 1.0,
3164               p_init_msg_list           => FND_API.g_false,
3165               p_commit                  => FND_API.g_false,
3166               p_validation_level        => FND_API.g_valid_level_full,
3167               p_visit_id                => l_Visit_Id,
3168               p_visit_task_id           => c_task_rec.visit_task_id,
3169               p_org_id                  => NULL,
3170               p_start_date              => NULL,
3171               p_operation_flag          => 'C',
3172               x_planned_order_flag      => l_planned_order_flag ,
3173               x_return_status           => l_return_status,
3174               x_msg_count               => l_msg_count,
3175               x_msg_data                => l_msg_data );
3176 
3177       IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
3178         fnd_log.string(fnd_log.level_statement,L_DEBUG,'After calling AHL_LTP_REQST_MATRL_PVT.Process_Planned_Materials : l_return_status - '||l_return_status);
3179         fnd_log.string(fnd_log.level_statement,L_DEBUG,'Planned Order Flag : ' || l_planned_order_flag);
3180       END IF;
3181 
3182       IF l_return_status <> 'S' THEN
3183         RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
3184       END IF;
3185     END IF;
3186   END LOOP;
3187   CLOSE c_task;
3188 
3189   -- Copy task links from originating visit
3190   OPEN c_visit_task_links(p_visit_id);
3191   LOOP
3192     --FETCH c_visit_task_links INTO l_visit_task_id, l_parent_task_id;
3193     FETCH c_visit_task_links INTO l_task_link_rec;
3194     EXIT WHEN c_visit_task_links%NOTFOUND;
3195 
3196     -- Find coresponding task id in new visit
3197     --OPEN c_new_task_ID(l_visit_task_id,l_visit_id);
3198     OPEN c_new_task_ID(l_task_link_rec.visit_task_id,l_visit_id);
3199     FETCH c_new_task_ID INTO l_new_task_id;
3200     CLOSE c_new_task_ID;
3201 
3202     --OPEN c_new_task_ID(l_parent_task_id,l_visit_id);
3203     OPEN c_new_task_ID(l_task_link_rec.parent_task_id,l_visit_id);
3204     FETCH c_new_task_ID INTO l_new_parent_task_id;
3205     CLOSE c_new_task_ID;
3206 
3207     IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
3208       fnd_log.string(fnd_log.level_statement,L_DEBUG,'Before inserting into AHL_TASK_LINKS');
3209     END IF;
3210 
3211     -- Create task link
3212     INSERT INTO AHL_TASK_LINKS
3213             (   TASK_LINK_ID,
3214                 OBJECT_VERSION_NUMBER,
3215                 LAST_UPDATE_DATE,
3216                 LAST_UPDATED_BY,
3217                 CREATION_DATE,
3218                 CREATED_BY,
3219                 LAST_UPDATE_LOGIN,
3220                 VISIT_TASK_ID,
3221                 PARENT_TASK_ID,
3222                 --SECURITY_GROUP_ID,
3223                 ATTRIBUTE_CATEGORY,
3224                 ATTRIBUTE1,
3225                 ATTRIBUTE2,
3226                 ATTRIBUTE3,
3227                 ATTRIBUTE4,
3228                 ATTRIBUTE5,
3229                 ATTRIBUTE6,
3230                 ATTRIBUTE7,
3231                 ATTRIBUTE8,
3232                 ATTRIBUTE9,
3233                 ATTRIBUTE10,
3234                 ATTRIBUTE11,
3235                 ATTRIBUTE12,
3236                 ATTRIBUTE13,
3237                 ATTRIBUTE14,
3238                 ATTRIBUTE15
3239             )
3240     VALUES
3241             (
3242                 ahl_task_links_s.nextval,
3243                 1,
3244                 SYSDATE,
3245                 Fnd_Global.USER_ID,
3246                 SYSDATE,
3247                 Fnd_Global.USER_ID,
3248                 Fnd_Global.USER_ID,
3249                 l_new_task_id ,
3250                 l_new_parent_task_id,
3251                 --l_task_link_rec.SECURITY_GROUP_ID,
3252                 l_task_link_rec.ATTRIBUTE_CATEGORY,
3253                 l_task_link_rec.ATTRIBUTE1,
3254                 l_task_link_rec.ATTRIBUTE2,
3255                 l_task_link_rec.ATTRIBUTE3,
3256                 l_task_link_rec.ATTRIBUTE4,
3257                 l_task_link_rec.ATTRIBUTE5,
3258                 l_task_link_rec.ATTRIBUTE6,
3259                 l_task_link_rec.ATTRIBUTE7,
3260                 l_task_link_rec.ATTRIBUTE8,
3261                 l_task_link_rec.ATTRIBUTE9,
3262                 l_task_link_rec.ATTRIBUTE10,
3263                 l_task_link_rec.ATTRIBUTE11,
3264                 l_task_link_rec.ATTRIBUTE12,
3265                 l_task_link_rec.ATTRIBUTE13,
3266                 l_task_link_rec.ATTRIBUTE14,
3267                 l_task_link_rec.ATTRIBUTE15
3268            );
3269 
3270     IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
3271       fnd_log.string(fnd_log.level_statement,L_DEBUG,'After inserting into AHL_TASK_LINKS');
3272     END IF;
3273 
3274   END LOOP;
3275   CLOSE c_visit_task_links;
3276 
3277   IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
3278     fnd_log.string(fnd_log.level_statement,L_DEBUG,'Before calling AHL_VWP_TIMES_PVT.Calculate_Task_Times');
3279   END IF;
3280 
3281   --Now adjust the times derivation for visit.
3282   AHL_VWP_TIMES_PVT.Calculate_Task_Times
3283           (p_api_version      => 1.0,
3284            p_init_msg_list    => Fnd_Api.G_FALSE,
3285            p_commit           => Fnd_Api.G_FALSE,
3286            p_validation_level => Fnd_Api.G_VALID_LEVEL_FULL,
3287            x_return_status    => l_return_status,
3288            x_msg_count        => l_msg_count,
3289            x_msg_data         => l_msg_data,
3290            p_visit_id         => l_visit_id);
3291 
3292   IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
3293     fnd_log.string(fnd_log.level_statement,L_DEBUG,'After calling AHL_VWP_TIMES_PVT.Calculate_Task_Times - l_return_status : '||l_return_status);
3294   END IF;
3295 
3296   -- Return ID of the new visit
3297   p_x_Visit_rec.visit_id := l_visit_id;
3298 
3299   ---------------------------End of API Body---------------------------------------
3300   --Standard check to count messages
3301   l_msg_count := Fnd_Msg_Pub.count_msg;
3302 
3303   IF l_msg_count > 0 THEN
3304      X_msg_count := l_msg_count;
3305      X_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
3306      RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
3307   END IF;
3308 
3309   --Standard check for commit
3310   IF Fnd_Api.TO_BOOLEAN(p_commit) THEN
3311     COMMIT;
3312   END IF;
3313 
3314   IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level) THEN
3315     fnd_log.string(fnd_log.level_procedure,L_DEBUG||'.end','At the end of PLSQL procedure');
3316   END IF;
3317 EXCEPTION
3318    WHEN Fnd_Api.g_exc_error THEN
3319       ROLLBACK TO Copy_Visit;
3320       x_return_status := Fnd_Api.g_ret_sts_error;
3321       Fnd_Msg_Pub.count_and_get (
3322             p_encoded => Fnd_Api.g_false,
3323             p_count   => x_msg_count,
3324             p_data    => x_msg_data
3325       );
3326    WHEN Fnd_Api.g_exc_unexpected_error THEN
3327       ROLLBACK TO Copy_Visit;
3328       x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
3329       Fnd_Msg_Pub.count_and_get (
3330             p_encoded => Fnd_Api.g_false,
3331             p_count   => x_msg_count,
3332             p_data    => x_msg_data
3333       );
3334    WHEN OTHERS THEN
3335       ROLLBACK TO Copy_Visit;
3336       x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
3337       IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_unexp_error)
3338         THEN
3339          Fnd_Msg_Pub.add_exc_msg (G_PKG_NAME, l_api_name);
3340       END IF;
3341       Fnd_Msg_Pub.count_and_get (
3342             p_encoded => Fnd_Api.g_false,
3343             p_count   => x_msg_count,
3344             p_data    => x_msg_data
3345       );
3346 END Copy_Visit;
3347 
3348 --------------------------------------------------------------------
3349 -- PROCEDURE
3350 --    Update_Visit
3351 --
3352 -- PURPOSE
3353 --    To update a Maintainance Visit.
3354 --------------------------------------------------------------------
3355 PROCEDURE Update_Visit (
3356    p_api_version       IN  NUMBER,
3357    p_init_msg_list     IN  VARCHAR2  := Fnd_Api.g_false,
3358    p_commit            IN  VARCHAR2  := Fnd_Api.g_false,
3359    p_validation_level  IN  NUMBER    := Fnd_Api.g_valid_level_full,
3360    p_module_type       IN  VARCHAR2  := 'JSP',
3361    p_x_visit_rec       IN  OUT NOCOPY Visit_Rec_Type,
3362    x_return_status     OUT NOCOPY VARCHAR2,
3363    x_msg_count         OUT NOCOPY NUMBER,
3364    x_msg_data          OUT NOCOPY VARCHAR2
3365 )
3366 IS
3367    -- Define local Variables
3368    L_API_VERSION          CONSTANT NUMBER := 1.0;
3369    L_API_NAME             CONSTANT VARCHAR2(30) := 'Update_Visit';
3370    L_FULL_NAME            CONSTANT VARCHAR2(60) := G_PKG_NAME || '.' || L_API_NAME;
3371    L_DEBUG                CONSTANT VARCHAR2(90) := 'ahl.plsql.'||L_FULL_NAME;
3372 
3373    l_msg_data             VARCHAR2(2000);
3374    l_return_status        VARCHAR2(1);
3375    l_msg_count            NUMBER;
3376 
3377    l_planned_order_flag   VARCHAR2(1);
3378 
3379 
3380    l_count                NUMBER;
3381    l_service_id           NUMBER;
3382    l_organization_id           NUMBER;
3383    l_department_id           NUMBER;
3384 
3385    l_visit_end_date       DATE; --The visit end date
3386 
3387    l_date_time_end        DATE;
3388    l_date_time_start      DATE;
3389 
3390    space_changed_flag     VARCHAR2(1):= 'N';
3391 
3392    -- Post 11.5.10 Enhancements
3393    l_priority_code         VARCHAR2(30);
3394    l_proj_template_id      NUMBER;
3395     --PRAKKUM ::FP PIE :: 13-OCT-2010
3396    l_project_id            NUMBER;
3397    l_dummy_char            VARCHAR2(1);
3398 
3399    --PRAKKUM :: VWPE: ER:12424063  :: 11-APR-2011
3400    l_is_start_date_changed BOOLEAN default false;
3401    l_is_close_date_changed BOOLEAN default false; -- VWPE 12730539:: PRAKKUM :: 02-AUG-2011
3402    l_is_dept_changed BOOLEAN default false;
3403 
3404    -- Define local record datatypes
3405    l_visit_rec            Visit_Rec_Type := p_x_visit_rec;
3406    l_workorder_rec         AHL_PRD_WORKORDER_PVT.PRD_WORKORDER_REC;
3407    l_workoper_tbl          AHL_PRD_WORKORDER_PVT.PRD_WORKOPER_TBL;
3408    l_Space_Assignment_Rec  ahl_ltp_space_assign_pub.Space_Assignment_Rec;
3409    --TCHIMIRA::P2P CP ER 9151144::09-DEC-2009
3410    l_is_comp_visit         VARCHAR2(1) := AHL_CMP_UTIL_PKG.Is_Comp_Visit (l_visit_rec.visit_id);
3411    l_auto_visit_type_flag  VARCHAR2(1);--TCHIMIRA :: 14-Jun-2012 :: ER 14015560
3412 
3413    -- Define local Cursors
3414    -- To find visit related information
3415    -- TCHIMIRA :: Bug 8594339 :: 19-NOV-2009
3416    -- Modified Cursor to acquire a lock on the visit record without waiting
3417    CURSOR c_Visit(x_id IN NUMBER) IS
3418    SELECT * FROM   Ahl_Visits_VL
3419    WHERE  VISIT_ID = x_id
3420    FOR UPDATE OF OBJECT_VERSION_NUMBER NOWAIT;
3421 
3422    c_Visit_rec    c_Visit%ROWTYPE;
3423 
3424    -- To find all tasks under this current visit related information
3425    CURSOR c_Task (x_id IN NUMBER) IS
3426    SELECT * FROM Ahl_Visit_Tasks_VL
3427    WHERE VISIT_ID = x_id
3428    and NVL(status_code, 'X') not in('DELETED', 'CANCELLED');
3429 
3430    c_Task_rec    c_Task%ROWTYPE;
3431 
3432    -- To find if WIP job in Draft Status is created for the Visit
3433    CURSOR c_job(x_id IN NUMBER) IS
3434    SELECT count(*) FROM AHL_WORKORDERS
3435    WHERE VISIT_ID = x_id
3436    AND MASTER_WORKORDER_FLAG = 'Y'
3437    AND STATUS_CODE = 17;
3438 
3439    CURSOR c_Visit_WO(x_id IN NUMBER) IS
3440    SELECT * FROM AHL_WORKORDERS
3441    WHERE VISIT_ID = x_id
3442    AND MASTER_WORKORDER_FLAG = 'Y'
3443    AND STATUS_CODE = 17;
3444 
3445    l_workrec c_Visit_WO%ROWTYPE;
3446 
3447    CURSOR c_Task_WO(x_task_id IN NUMBER) IS
3448    SELECT * FROM AHL_WORKORDERS
3449    WHERE VISIT_TASK_ID = x_task_id
3450    AND STATUS_CODE = 17;
3451 
3452    l_task_workrec c_Task_WO%ROWTYPE;
3453 
3454    --PRAKKUM ::FP PIE :: 13-OCT-2010
3455    --To get project id given the project name
3456    CURSOR get_project_id_csr (c_project_name IN VARCHAR2)
3457    IS
3458      SELECT project_id
3459      FROM PA_PROJECTS_ALL
3460      WHERE name = c_project_name;
3461 
3462 
3463    --PRAKKUM ::FP PIE :: 13-OCT-2010
3464    --To validate that the project completion is in future
3465    Cursor validate_proj_date_csr ( c_project_id IN NUMBER)
3466    IS
3467      SELECT 'X' from PA_PROJECTS_EXPEND_V
3468      WHERE project_id = c_project_id
3469      AND NVL(completion_date,SYSDATE+1)>=SYSDATE;
3470 
3471   /*Added by sowsubra*/
3472   CURSOR c_subinv_validate (p_subinv_code IN VARCHAR2, p_org_id IN VARCHAR2) IS
3473       SELECT status_id
3474       FROM mtl_secondary_inventories
3475       WHERE secondary_inventory_name = p_subinv_code
3476       AND organization_id = p_org_id;
3477 
3478   /*Added by sowsubra*/
3479   CURSOR c_loc_validate (p_org_id IN NUMBER, p_subinv_code IN VARCHAR2, p_loc_seg IN VARCHAR2) IS
3480      -- jaramana on Feb 14, 2008 for bug 6819370
3481      -- Made segment19 and segment20 refer to base table
3482      SELECT mil.inventory_location_id
3483      from mtl_item_locations mil, mtl_item_locations_kfv milk
3484      where mil.organization_id = p_org_id
3485      and mil.subinventory_code = p_subinv_code
3486      and milk.concatenated_segments = p_loc_seg
3487      and mil.segment19 is NULL
3488      and mil.segment20 is NULL
3489      and mil.inventory_location_id = milk.inventory_location_id;
3490 
3491     l_inv_loc_id      NUMBER := 0;
3492     l_dummy           NUMBER := 0;
3493     l_status_id       NUMBER;
3494 
3495    --TCHIMIRA::P2P CP ER 9151144::09-DEC-2009
3496    --salogan::Modified the cursor to handle both request id from P2P and Cost Estimation CP ER 9299910::01-JUN-2009::BEGIN
3497    --Cursor to fetch phase
3498    CURSOR c_conc_req_phase(c_id IN NUMBER) IS
3499      SELECT 'X'
3500       FROM FND_CONCURRENT_REQUESTS FCR, AHL_VISITS_B AVB
3501       WHERE FCR.REQUEST_ID IN ( AVB.CST_EST_REQUEST_ID, AVB.REQUEST_ID )
3502       AND FCR.PHASE_CODE IN ('P', 'R')
3503       AND AVB.VISIT_ID = c_id;
3504       l_dummy_val c_conc_req_phase%ROWTYPE;
3505    --salogan::Modified the cursor to handle both request id from P2P and Cost Estimation CP ER 9299910::01-JUN-2009::END
3506    -- SKPATHAK :: ER: 9147951 :: 11-JAN-2010
3507    -- Added this cursor to fetch visit task past dates for non-summary tasks
3508    Cursor get_visit_task_past_dates (c_visit_id IN NUMBER)
3509    IS
3510      SELECT MIN(past_task_start_date) past_task_start_date, MAX(past_task_end_date) past_task_end_date
3511      FROM ahl_visit_tasks_b
3512      WHERE visit_id = c_visit_id
3513      AND task_type_code <> 'SUMMARY'
3514      AND PAST_TASK_START_DATE IS NOT NULL
3515      AND STATUS_CODE NOT IN ('DELETED','CANCELLED');
3516      visit_task_past_dates_rec get_visit_task_past_dates%ROWTYPE;
3517 
3518    --VWPE :: PRAKKUM :: 26-APR-2011 :: To count tasks ovn :: START
3519 
3520    --Fetch to find whether task updation is going to happend or not
3521    CURSOR get_visit_data_csr(p_visit_id IN NUMBER) IS
3522      SELECT v.department_id , v.start_date_time
3523 FROM AHL_VISITS_B v, AHL_DEPARTMENT_SHIFTS shifts
3524      WHERE v.department_id = shifts.department_id
3525      AND v.visit_id = p_visit_id;
3526 
3527    l_visit_dept_id NUMBER := NULL;
3528    l_visit_start_date DATE := NULL;
3529    l_tasks_ovn_updated_count NUMBER := 0;
3530    l_stages_ovn_updated_count NUMBER := 0;--PRAKKUM :: 06-JUL-2011 :: VWPE 12730539
3531 
3532    --VWPE :: PRAKKUM :: 26-APR-2011 :: To count tasks ovn :: END
3533 
3534    -- SKPATHAK :: 20-JUN-2011 :: VWPE: ER:12673125
3535    -- Get the end date of the latest WO in this visit
3536    -- TCHIMIRA :: 17-DEC-2011 :: bug# 13000673 :: commenting the below cursor
3537    /*CURSOR get_latest_wo_end_date (c_visit_id IN NUMBER)
3538    IS
3539    SELECT max (wip.scheduled_completion_date)
3540    FROM wip_discrete_jobs wip, ahl_workorders wo
3541    WHERE wo.visit_id = c_visit_id
3542    AND wo.wip_entity_id = wip.wip_entity_id;
3543    l_latest_wo_end_date DATE;  */
3544 
3545    -- PRAKKUM :: 28-JUN-2011 :: VWPE :: ER 12730539 :: To find visit is old or new
3546    CURSOR c_is_old_visit(p_visit_id IN NUMBER) IS
3547      select AHL_VWP_VISITS_PVT.Is_Old_Visit(p_visit_id) IS_OLD_VISIT FROM DUAL;
3548 
3549    l_is_old_visit_dets   c_is_old_visit%RowType;
3550 
3551    -- TCHIMIRA ::28-JUN-2011 :: VWP: ER:12673125 :: START
3552    -- Cursor to fetch mr_id of a task
3553    CURSOR get_sum_task_det(c_visit_id IN NUMBER ) IS
3554      SELECT mr_id, unit_effectivity_id,instance_id
3555        FROM ahl_visit_tasks_b task
3556       WHERE visit_id = c_visit_id
3557       AND status_code = 'PLANNING'
3558       AND task_type_code = 'SUMMARY'
3559       AND mr_id IS NOT NULL;
3560 
3561 
3562 BEGIN
3563 
3564   --------------------- Initialize -----------------------
3565   SAVEPOINT Update_Visit;
3566 
3567   IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level) THEN
3568     fnd_log.string(fnd_log.level_procedure,L_DEBUG||'.begin','At the start of PLSQL procedure - Visit Id - '||l_visit_rec.visit_id ||'p_module_tyoe - '|| p_module_type);
3569   END IF;
3570 
3571   -- Initialize message list if p_init_msg_list is set to TRUE.
3572   IF Fnd_Api.to_boolean(p_init_msg_list) THEN
3573      Fnd_Msg_Pub.initialize;
3574   END IF;
3575 
3576   --  Initialize API return status to success
3577   x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
3578 
3579   -- Standard call to check for call compatibility.
3580   IF NOT Fnd_Api.COMPATIBLE_API_CALL(l_api_version,
3581                                       p_api_version,
3582                                       l_api_name,G_PKG_NAME)
3583   THEN
3584        RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
3585   END IF;
3586 
3587   ------------------------Start of API Body------------------------------------
3588   OPEN c_Visit(l_Visit_rec.visit_id);
3589   FETCH c_Visit INTO c_Visit_rec;
3590   IF c_Visit%NOTFOUND THEN
3591      CLOSE c_Visit;
3592      IF Fnd_Msg_Pub.check_msg_level(Fnd_Msg_Pub.g_msg_lvl_error) THEN
3593         Fnd_Message.set_name('AHL', 'AHL_API_RECORD_NOT_FOUND');
3594         Fnd_Msg_Pub.ADD;
3595         IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
3596           fnd_log.string(fnd_log.level_statement,L_DEBUG,'Visit not found for' ||l_visit_rec.visit_id );
3597         END IF;
3598      END IF;
3599      RAISE Fnd_Api.g_exc_error;
3600   ELSE
3601      CLOSE c_Visit;
3602   END IF;
3603 
3604   --TCHIMIRA::P2P CP ER 9151144::09-DEC-2009::BEGIN
3605   --salogan::Modified the cursor fetch to handle both request id from P2P and Cost Estimation CP ER 9299910::01-JUN-2009::BEGIN
3606   OPEN c_conc_req_phase(l_visit_rec.Visit_id);
3607     FETCH c_conc_req_phase INTO l_dummy_val;
3608     IF(c_conc_req_phase%FOUND) THEN
3609       FND_MESSAGE.Set_Name('AHL','AHL_VWP_CP_P2P_IN_PROGS');
3610       FND_MSG_PUB.ADD;
3611       RAISE FND_API.G_EXC_ERROR;
3612     END IF;
3613     CLOSE c_conc_req_phase;
3614   --salogan::Modified the cursor fetch to handle both request id from P2P and Cost Estimation CP ER 9299910::01-JUN-2009::END
3615   --TCHIMIRA::P2P CP ER 9151144::09-DEC-2009::END
3616 
3617 
3618   -- To validate Object version number.
3619   IF (c_visit_rec.object_version_number <> l_visit_rec.object_version_number) THEN
3620      Fnd_Message.Set_Name('AHL','AHL_COM_RECORD_CHANGED');
3621      Fnd_Msg_Pub.ADD;
3622      RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
3623   END IF;
3624   --------------------Value OR ID conversion---------------------------
3625   -- Commented for TC changes by Senthil
3626   -- Uncommented by yazhou
3627   IF p_module_type = 'JSP' THEN
3628     l_Visit_rec.organization_id    := NULL;
3629     l_Visit_rec.department_id      := NULL;
3630     l_Visit_rec.item_instance_id   := NULL;
3631     l_Visit_rec.service_request_id := NULL;
3632     l_visit_rec.proj_template_id   := NULL;
3633     l_visit_rec.project_id         := NULL; --PRAKKUM ::FP PIE :: 13-OCT-2010
3634 
3635     IF l_Visit_rec.START_DATE IS NOT NULL AND l_Visit_rec.START_DATE <> fnd_api.g_miss_date THEN
3636        l_date_time_start := TO_DATE(TO_CHAR(l_visit_rec.START_DATE, 'DD-MM-YYYY ') ||
3637                             TO_CHAR(NVL(l_visit_rec.START_HOUR,'00')) || ':'||TO_CHAR(NVL(l_visit_rec.START_MIN,'00')),'DD-MM-YYYY HH24:MI');
3638     ELSE
3639        l_Visit_rec.START_DATE:= null;
3640        l_visit_rec.START_HOUR:= null;
3641        l_date_time_start := null;
3642     END IF;
3643 
3644     IF l_Visit_rec.PLAN_END_DATE IS NOT NULL AND l_Visit_rec.PLAN_END_DATE <> fnd_api.g_miss_date THEN
3645        l_date_time_end := TO_DATE(TO_CHAR(l_visit_rec.PLAN_END_DATE, 'DD-MM-YYYY ') ||
3646                             TO_CHAR(NVL(l_visit_rec.PLAN_END_HOUR,'00')) || ':'|| TO_CHAR(NVL(l_visit_rec.PLAN_END_MIN,'00')) ,'DD-MM-YYYY HH24:MI');
3647     ELSE
3648        l_Visit_rec.PLAN_END_DATE:= null;
3649        l_visit_rec.PLAN_END_HOUR:= null;
3650        l_date_time_end :=null;
3651     END IF;
3652   ELSE
3653     IF l_Visit_rec.START_DATE IS NOT NULL AND l_Visit_rec.START_DATE <> fnd_api.g_miss_date THEN
3654         l_date_time_start := l_visit_rec.START_DATE;
3655     ELSE
3656         l_Visit_rec.START_DATE:= null;
3657         l_date_time_start := null;
3658     END IF;
3659 
3660     IF l_Visit_rec.PLAN_END_DATE IS NOT NULL AND l_Visit_rec.PLAN_END_DATE <> fnd_api.g_miss_date THEN
3661         l_date_time_end := l_visit_rec.PLAN_END_DATE;
3662     ELSE
3663         l_Visit_rec.START_DATE:= null;
3664         l_date_time_end := null;
3665     END IF;
3666   END IF;
3667 
3668   -- SKPATHAK :: ER: 9147951 :: 11-JAN-2010 :: STARTS
3669   -- Validate that the visit past task start and end dates are withing the visit start and planned end date
3670   OPEN get_visit_task_past_dates(l_Visit_rec.visit_id);
3671   FETCH get_visit_task_past_dates INTO visit_task_past_dates_rec;
3672   CLOSE get_visit_task_past_dates;
3673 
3674   IF l_date_time_start IS NOT NULL THEN
3675     IF visit_task_past_dates_rec.past_task_start_date < l_date_time_start THEN
3676       Fnd_Message.SET_NAME('AHL','AHL_VWP_VISIT_START_DATE_INVLD');
3677       Fnd_Msg_Pub.ADD;
3678       RAISE FND_API.G_EXC_ERROR;
3679     END IF;
3680   END IF;
3681   IF l_date_time_end IS NOT NULL THEN
3682     IF visit_task_past_dates_rec.past_task_end_date > l_date_time_end THEN
3683       Fnd_Message.SET_NAME('AHL','AHL_VWP_VISIT_END_DATE_INVLD');
3684       Fnd_Msg_Pub.ADD;
3685       RAISE FND_API.G_EXC_ERROR;
3686     END IF;
3687   END IF;
3688   -- SKPATHAK :: ER: 9147951 :: 11-JAN-2010 :: END
3689 
3690   -------------------- UPDATE FOR VISIT ----------------
3691   -- Transit Visit change
3692   -- yazhou start
3693   IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
3694     fnd_log.string(fnd_log.level_statement,L_DEBUG,'Status Code = ' || l_Visit_rec.status_code);
3695   END IF;
3696 
3697   -- not allowed to update if status code is not planning, released or partially released.
3698   -- SKPATHAK :: 02-MAY-2011 :: VWPE: ER:12424063
3699   -- Even the visits in DRAFT status can be updated
3700   IF c_visit_rec.status_code NOT IN ('DRAFT','PLANNING','RELEASED', 'PARTIALLY RELEASED') THEN
3701     Fnd_Message.SET_NAME('AHL','AHL_VWP_INVALID_STATUS_NO_EDIT');
3702     Fnd_Msg_Pub.ADD;
3703     RAISE Fnd_Api.G_EXC_ERROR;
3704   END IF;
3705 
3706   -- PRAKKUM :: 28-JUN-2011 :: VWPE :: ER 12730539
3707   OPEN c_is_old_visit(l_Visit_rec.visit_id);
3708   FETCH c_is_old_visit INTO l_is_old_visit_dets;
3709   CLOSE c_is_old_visit;
3710 
3711   -- Process fields that are only updateable when visit is in Planning status
3712   -- SKPATHAK :: 02-MAY-2011 :: VWPE: ER:12424063
3713   -- Add the new DRAFT status to the below list
3714   IF c_visit_rec.status_code IN ('PLANNING','DRAFT') THEN
3715     ----- Dropdowns on Update Visit UI Screen-------------
3716     -- For SPACE CATEGORY CODE
3717     IF l_Visit_rec.space_category_code = Fnd_Api.G_MISS_CHAR THEN
3718         l_Visit_rec.space_category_code := Null;
3719     END IF;
3720 
3721     IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
3722       fnd_log.string(fnd_log.level_statement,L_DEBUG,'Space Category Code = ' || l_Visit_rec.space_category_code);
3723     END IF;
3724 
3725     ----------- LOVs on Update Visit UI Screen---
3726     -- For VISIT TYPE
3727     -- To find Visit Type Code when Visit Type Name has input values
3728     IF  l_Visit_rec.visit_type_name IS NOT NULL AND l_Visit_rec.visit_type_name <> Fnd_Api.G_MISS_CHAR THEN
3729         AHL_VWP_RULES_PVT.Check_Lookup_Name_Or_Id
3730             ( p_lookup_type  => 'AHL_PLANNING_VISIT_TYPE',
3731               p_lookup_code  => NULL,
3732               p_meaning      => l_Visit_rec.visit_type_name,
3733               p_check_id_flag => 'Y',
3734               x_lookup_code   => l_Visit_rec.visit_type_code,
3735               x_return_status => l_return_status
3736             );
3737 
3738         IF NVL(l_return_status, 'X') <> 'S' THEN
3739             Fnd_Message.SET_NAME('AHL','AHL_VWP_TYPE_CODE_NOT_EXISTS');
3740             Fnd_Msg_Pub.ADD;
3741             RAISE Fnd_Api.G_EXC_ERROR;
3742         END IF;
3743     END IF;
3744 
3745     -- SKPATHAK :: 02-MAY-2011 :: VWPE: ER:12424063
3746     IF ((c_Visit_rec.VISIT_TYPE_CODE IS NOT NULL) AND (NVL(l_Visit_rec.VISIT_TYPE_CODE,'X') <> c_Visit_rec.visit_type_code))
3747 THEN
3748        Fnd_Message.SET_NAME('AHL','AHL_VWP_TYPE_NOT_EDIT');
3749        Fnd_Msg_Pub.ADD;
3750        RAISE Fnd_Api.G_EXC_ERROR;
3751     END IF;
3752 
3753     IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
3754       fnd_log.string(fnd_log.level_statement,L_DEBUG,'Visit Type' || l_Visit_rec.visit_type_name || '-' || l_Visit_rec.visit_type_code);
3755     END IF;
3756 
3757     -- For SERVICE REQUEST
3758     -- To Convert Service Request Number to Service Request Id
3759     IF (l_Visit_rec.service_request_number IS NOT NULL AND
3760         l_Visit_rec.service_request_number <> Fnd_Api.G_MISS_CHAR ) THEN
3761 
3762         AHL_VWP_RULES_PVT.Check_SR_Request_Number_Or_Id
3763             (   p_service_id       => l_Visit_rec.service_request_id,
3764                 p_service_number   => l_Visit_rec.service_request_number,
3765                 x_service_id       => l_service_id,
3766                 x_return_status    => l_return_status,
3767                 x_error_msg_code   => l_msg_data);
3768 
3769         IF NVL(l_return_status,'x') <> 'S' THEN
3770             Fnd_Message.SET_NAME('AHL','AHL_VWP_SERVICE_REQ_NOT_EXISTS');
3771             Fnd_Msg_Pub.ADD;
3772             RAISE Fnd_Api.g_exc_error;
3773         END IF;
3774 
3775         --Assign the returned value
3776         l_Visit_rec.service_request_id := l_service_id;
3777 
3778         IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
3779           fnd_log.string(fnd_log.level_statement,L_DEBUG,'SR Id/Number = ' || l_Visit_rec.service_request_id || '-' || l_Visit_rec.service_request_number );
3780         END IF;
3781     END IF;
3782     ----------- End defining and validate all LOVs on Update Visit UI Screen---
3783     -- For Priority
3784     -- To Convert Priority Value to Code
3785     IF l_Visit_rec.priority_value IS NOT NULL AND l_Visit_rec.priority_value <> Fnd_Api.G_MISS_CHAR       THEN
3786        AHL_VWP_RULES_PVT.Check_Lookup_Name_Or_Id
3787               (p_lookup_type  => 'AHL_VWP_VISIT_PRIORITY',
3788                p_lookup_code  => l_Visit_rec.priority_code,
3789                p_meaning      => l_Visit_rec.priority_value,
3790                p_check_id_flag => 'Y',
3791                x_lookup_code   => l_priority_code,
3792                x_return_status => l_return_status);
3793 
3794        IF NVL(l_return_status, 'X') <> 'S' THEN
3795           Fnd_Message.SET_NAME('AHL','AHL_VWP_PRI_NOT_EXISTS');
3796           Fnd_Msg_Pub.ADD;
3797           RAISE Fnd_Api.G_EXC_ERROR;
3798        END IF;
3799        l_visit_rec.priority_code := l_priority_code;
3800     END IF;
3801 
3802     -- For Organization
3803     -- To Convert Organization Name to ID
3804     IF (l_visit_rec.ORG_NAME IS NOT NULL AND l_visit_rec.ORG_NAME <> Fnd_Api.G_MISS_CHAR ) OR
3805        (l_visit_rec.organization_id IS NOT NULL AND l_visit_rec.organization_id <> Fnd_Api.G_MISS_NUM )
3806         THEN
3807             AHL_VWP_RULES_PVT.Check_Org_Name_Or_Id
3808                   (p_organization_id  => l_visit_rec.organization_id,
3809                    p_org_name         => l_visit_rec.ORG_NAME,
3810                    x_organization_id  => l_organization_id,
3811                    x_return_status    => l_return_status,
3812                    x_error_msg_code   => l_msg_data);
3813 
3814             IF NVL(l_return_status,'x') <> 'S' THEN
3815                 Fnd_Message.SET_NAME('AHL','AHL_VWP_ORG_NOT_EXISTS');
3816                 Fnd_Msg_Pub.ADD;
3817                 RAISE Fnd_Api.G_EXC_ERROR;
3818             END IF;
3819 
3820             l_visit_rec.organization_id := l_organization_id;
3821 
3822             IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
3823               fnd_log.string(fnd_log.level_statement,L_DEBUG,'Organization ID' || l_visit_rec.organization_id);
3824             END IF;
3825     END IF;
3826 
3827     IF l_visit_rec.organization_id IS NULL OR l_visit_rec.organization_id = Fnd_Api.G_MISS_NUM THEN
3828       --Assign the department to Null if organization id is null
3829       l_visit_rec.department_id := NULL;
3830       l_visit_rec.organization_id:= NULL;
3831     ELSE
3832       IF (l_visit_rec.DEPT_NAME IS NOT NULL AND l_visit_rec.DEPT_NAME <> Fnd_Api.G_MISS_CHAR )OR
3833          (l_visit_rec.department_id IS NOT NULL AND l_visit_rec.department_id <> Fnd_Api.G_MISS_NUM )
3834          THEN
3835             IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
3836               fnd_log.string(fnd_log.level_statement,L_DEBUG,'Inside Dept Name/ID - '||l_visit_rec.DEPT_NAME ||' - '||l_visit_rec.department_id );
3837             END IF;
3838 
3839             AHL_VWP_RULES_PVT.Check_Dept_Desc_Or_Id
3840                     (   p_organization_id  => l_visit_rec.organization_id,
3841                         p_dept_name        => l_visit_rec.DEPT_NAME,
3842                         p_department_id    => l_visit_rec.department_id,
3843                         x_department_id    => l_department_id,
3844                         x_return_status    => l_return_status,
3845                         x_error_msg_code   => l_msg_data);
3846 
3847             IF NVL(l_return_status,'x') <> 'S' THEN
3848               Fnd_Message.SET_NAME('AHL','AHL_VWP_DEPT_NOT_EXISTS');
3849               Fnd_Msg_Pub.ADD;
3850               RAISE Fnd_Api.G_EXC_ERROR;
3851             END IF;
3852 
3853             l_visit_rec.department_id := l_department_id;
3854             AHL_VWP_RULES_PVT.CHECK_DEPARTMENT_SHIFT
3855                    (p_dept_id          => l_visit_rec.department_id,
3856                     x_return_status    => l_return_status);
3857 
3858             IF NVL(l_return_status,'x') <> 'S' THEN
3859                 Fnd_Message.SET_NAME('AHL','AHL_VWP_NO_DEPT_SHIFT');
3860                 Fnd_Msg_Pub.ADD;
3861                 RAISE Fnd_Api.G_EXC_ERROR;
3862             END IF;
3863 
3864             IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
3865               fnd_log.string(fnd_log.level_statement,L_DEBUG,'Department ID' || l_visit_rec.department_id);
3866             END IF;
3867       ELSE
3868           l_visit_rec.department_id := NULL;
3869       END IF ;  --Dept Not Null
3870     END IF ;  --Org Not Null
3871 
3872     -- For Project Template and Project Name
3873    --PRAKKUM ::FP PIE :: 13-OCT-2010 :: BEGIN
3874    IF l_visit_rec.proj_template_name IS NOT NULL THEN
3875       IF l_visit_rec.project_name IS NOT NULL THEN
3876          Fnd_Message.SET_NAME('AHL', 'AHL_VWP_INV_PROJ_AND_TEMP');
3877          Fnd_Msg_Pub.ADD;
3878          RAISE Fnd_Api.G_EXC_ERROR;
3879       ELSE  --i.e. name is null but template is not null
3880         AHL_VWP_RULES_PVT.Check_Project_Template_Or_Id
3881                 ( p_proj_temp_name => l_visit_rec.proj_template_name,
3882                   x_project_id => l_proj_template_id,
3883                   x_return_status => l_return_status,
3884                   x_error_msg_code => l_msg_data);
3885 
3886         IF NVL(l_return_status, 'X') <> 'S' THEN
3887           Fnd_Message.SET_NAME('AHL','AHL_VWP_INVALID_PROTEM');
3888           Fnd_Msg_Pub.ADD;
3889           RAISE Fnd_Api.G_EXC_ERROR;
3890         END IF;
3891       END IF; --project name not null
3892    ELSE
3893       -- If Project Template Name is null
3894       IF l_visit_rec.project_name IS NULL THEN
3895         IF (l_visit_rec.project_id IS NOT NULL) OR (l_visit_rec.proj_template_id IS NOT NULL) THEN
3896           l_proj_template_id :=  l_visit_rec.proj_template_id;
3897           l_project_id       :=  l_visit_rec.project_id;
3898         ELSE
3899           l_proj_template_id := FND_PROFILE.VALUE('AHL_DEFAULT_PA_TEMPLATE_ID');
3900         END IF;
3901       ELSE --project template name is null but project name is not null
3902         OPEN get_project_id_csr (l_visit_rec.project_name);
3903         FETCH get_project_id_csr INTO l_project_id;
3904         IF get_project_id_csr%NOTFOUND THEN
3905            Fnd_Message.SET_NAME('AHL', 'AHL_VWP_INV_PROJ_NAME');
3906            Fnd_Message.Set_Token('PROJ_NAME', l_visit_rec.project_name);
3907            Fnd_Msg_Pub.ADD;
3908            CLOSE get_project_id_csr;
3909            RAISE Fnd_Api.G_EXC_ERROR;
3910         END IF;
3911         CLOSE get_project_id_csr;
3912       END IF;
3913    END IF;
3914 
3915    -- If project has been created using project template, project name has been nullified
3916    -- Hence in this case if l_project_id is null, populate it with the value from the DB
3917    IF ((c_visit_rec.project_id IS NOT NULL)
3918         AND ((c_visit_rec.project_template_id IS NOT NULL) OR (c_visit_rec.top_project_task_id IS NOT NULL))
3919         AND (l_project_id IS NULL)) THEN
3920      l_project_id := c_visit_rec.project_id;
3921    END IF;
3922 
3923    IF ((NVL(l_proj_template_id,10) <> NVL(c_visit_rec.project_template_id, 10)) OR (NVL(l_project_id,10) <> NVL(c_visit_rec.project_id,10)))
3924        AND (((c_visit_rec.project_id IS NOT NULL) AND (c_visit_rec.project_template_id IS NOT NULL))
3925        OR ((c_visit_rec.project_id IS NOT NULL) AND (c_visit_rec.top_project_task_id IS NOT NULL))) THEN
3926         -- Project Template or Project Name cannot be updated if Project has been created for the Visit
3927         Fnd_Message.SET_NAME('AHL','AHL_VWP_PROJ_CRTD');
3928         Fnd_Msg_Pub.ADD;
3929         RAISE Fnd_Api.G_EXC_ERROR;
3930     ELSE
3931         l_visit_rec.proj_template_id := l_proj_template_id;
3932         c_visit_rec.project_id       := l_project_id;
3933    END IF;
3934    IF l_visit_rec.project_id IS NOT NULL THEN
3935       OPEN validate_proj_date_csr (l_visit_rec.project_id);
3936       FETCH validate_proj_date_csr INTO l_dummy_char;
3937       IF validate_proj_date_csr%NOTFOUND THEN
3938         Fnd_Message.SET_NAME('AHL', 'AHL_VWP_INV_PROJECT');
3939         Fnd_Message.Set_Token('PROJ_NAME', l_visit_rec.project_name);
3940         Fnd_Message.Set_Token('PROJ_ID', l_visit_rec.project_id);
3941         Fnd_Msg_Pub.ADD;
3942         CLOSE validate_proj_date_csr;
3943         RAISE Fnd_Api.G_EXC_ERROR;
3944       END IF;
3945       CLOSE validate_proj_date_csr;
3946    END IF;
3947    --PRAKKUM ::FP PIE :: 13-OCT-2010 :: END
3948 
3949   /*BB5854712 - sowsubra - starts*/
3950   l_dummy := NULL;
3951 
3952   IF ((l_visit_rec.subinventory IS NOT NULL) AND (l_visit_rec.locator_segment IS NULL)) THEN
3953            Fnd_Message.SET_NAME('AHL','AHL_VWP_LOCATOR_NULL');
3954            Fnd_Msg_Pub.ADD;
3955            RAISE Fnd_Api.G_EXC_ERROR;
3956   ELSIF ((l_visit_rec.subinventory IS NULL) AND (l_visit_rec.locator_segment IS NOT NULL))THEN
3957            Fnd_Message.SET_NAME('AHL','AHL_VWP_SUBINVENTORY_NULL');
3958            Fnd_Msg_Pub.ADD;
3959            RAISE Fnd_Api.G_EXC_ERROR;
3960   ELSIF ((l_visit_rec.subinventory IS NOT NULL) AND (l_visit_rec.locator_segment IS NOT NULL)) THEN
3961 
3962          OPEN c_subinv_validate (l_visit_rec.subinventory, l_visit_rec.organization_id);
3963          FETCH c_subinv_validate INTO l_status_id;
3964          IF c_subinv_validate%NOTFOUND THEN
3965              CLOSE c_subinv_validate;
3966              Fnd_Message.SET_NAME('AHL','AHL_VWP_SUBINV_NOT_EXISTS');
3967              Fnd_Msg_Pub.ADD;
3968              RAISE Fnd_Api.G_EXC_ERROR;
3969          ELSE
3970            IF l_status_id in (NVL(fnd_profile.value('AHL_MTL_MAT_STATUS_UNSERVICABLE'), -1), NVL(fnd_profile.value('AHL_MTL_MAT_STATUS_MRB'), -1)) THEN
3971              CLOSE c_subinv_validate;
3972              FND_MESSAGE.SET_NAME('AHL', 'AHL_SUBINVENTORY_NOT_SVC');
3973              FND_MESSAGE.Set_Token('INV', l_visit_rec.subinventory);
3974              FND_MSG_PUB.ADD;
3975              RAISE Fnd_Api.G_EXC_ERROR;
3976            END IF;
3977          END IF;
3978          CLOSE c_subinv_validate;
3979 
3980          l_dummy := NULL;
3981 
3982          OPEN c_loc_validate (l_visit_rec.organization_id, l_visit_rec.subinventory,l_visit_rec.locator_segment );
3983          FETCH c_loc_validate INTO l_inv_loc_id;
3984           IF c_loc_validate%NOTFOUND THEN
3985              Fnd_Message.SET_NAME('AHL','AHL_VWP_PHY_LOCATOR_NOT_EXISTS');
3986              Fnd_Msg_Pub.ADD;
3987              CLOSE c_loc_validate;
3988              RAISE Fnd_Api.G_EXC_ERROR;
3989           END IF;
3990          CLOSE c_loc_validate;
3991 
3992          l_visit_rec.inv_locator_id := l_inv_loc_id;
3993 
3994   ELSE
3995     l_visit_rec.inv_locator_id := null;
3996   END IF;
3997   /*BB5854712 - sowsubra - ends*/
3998 
3999   ELSE  -- Visit in Released or Partially Released Status
4000     l_visit_rec.proj_template_id := c_visit_rec.project_template_id;
4001     l_visit_rec.priority_code := c_visit_rec.priority_code;
4002     l_Visit_rec.VISIT_TYPE_CODE :=c_Visit_rec.VISIT_TYPE_CODE;
4003     l_Visit_rec.SERVICE_REQUEST_ID := c_Visit_rec.SERVICE_REQUEST_ID;
4004     l_Visit_rec.VISIT_NAME := c_Visit_rec.VISIT_NAME;
4005     l_Visit_rec.DESCRIPTION  :=   c_Visit_rec.DESCRIPTION;
4006     l_Visit_rec.ORGANIZATION_ID := c_Visit_rec.ORGANIZATION_ID;
4007     --Added by tchimira for Bug# 9526695 on 30-MAR-2010
4008     l_Visit_rec.INV_LOCATOR_ID := c_Visit_rec.INV_LOCATOR_ID;
4009     -------- R12 changes For Serial Number Reservations Start------------
4010     -------- AnRaj added condition on 17th June 2005 ------------
4011     IF p_module_type = 'JSP' THEN
4012         l_Visit_rec.DEPARTMENT_ID  :=   c_Visit_rec.DEPARTMENT_ID;
4013     END IF;
4014     -------- R12 changes For Serial Number Reservations End---------------
4015   END IF; -- Visit in Planning Status
4016 
4017   -- For Planned Start/End Date
4018   --- Planned start/end dates are madatory for transit visit
4019   --- AnRaj added
4020   --- Planned Start/End Dates are mandatory for visits which are in status Released/Partially Released
4021   --- as per the updates by Jay and Yan in the CMRO Forum, issue number 169
4022   IF c_visit_rec.status_code  IN ('RELEASED', 'PARTIALLY RELEASED') THEN
4023     IF  l_date_time_start IS NULL THEN
4024       Fnd_Message.SET_NAME('AHL','AHL_VWP_ST_DT_REQ');
4025       Fnd_Msg_Pub.ADD;
4026       RAISE FND_Api.G_EXC_ERROR;
4027     END IF;
4028 
4029     IF  l_date_time_end IS NULL THEN
4030       Fnd_Message.SET_NAME('AHL','AHL_VWP_END_DT_REQ');
4031       Fnd_Msg_Pub.ADD;
4032       RAISE FND_Api.G_EXC_ERROR;
4033     END IF;
4034   END IF;
4035 
4036   IF c_Visit_rec.unit_schedule_id IS NOT NULL AND  c_Visit_rec.unit_schedule_id <> FND_API.G_MISS_NUM
4037   THEN
4038     -- Planned Start Date is madatory for transit visit
4039     IF l_date_time_start IS NULL THEN
4040        Fnd_Message.SET_NAME('AHL','AHL_VWP_TC_ST_DT_REQ');
4041        Fnd_Msg_Pub.ADD;
4042        RAISE FND_Api.G_EXC_ERROR;
4043     END IF;
4044 
4045     -- Planned End Date is madatory for transit visit
4046     IF l_date_time_end IS NULL THEN
4047         Fnd_Message.SET_NAME('AHL','AHL_VWP_TC_END_DT_REQ');
4048         Fnd_Msg_Pub.ADD;
4049         RAISE FND_Api.G_EXC_ERROR;
4050     END IF;
4051   END IF;
4052 
4053   -- To validate visit start date should be less than plan end date
4054   IF l_date_time_end IS NOT NULL  AND l_date_time_start IS NOT NULL THEN
4055     IF (l_date_time_start > l_date_time_end) THEN
4056         Fnd_Message.SET_NAME('AHL','AHL_VWP_START_DT_GTR_CLOSE_DT');
4057         Fnd_Msg_Pub.ADD;
4058         RAISE Fnd_Api.G_EXC_ERROR;
4059     END IF;
4060   END IF;
4061   l_visit_rec.STATUS_CODE :=  c_Visit_rec.STATUS_CODE;
4062 
4063   -- If Visit dates are changed for a visit in released status
4064   -- then visit status needs to be changed to Partially Released
4065   IF NVL(TO_CHAR(l_date_time_start,'DD-MM-YYYY HH24:MI'),'XXX') <>    NVL(TO_CHAR(c_Visit_rec.START_DATE_TIME,'DD-MM-YYYY HH24:MI'),'XXX')
4066   OR NVL(TO_CHAR(l_date_time_end,'DD-MM-YYYY HH24:MI'),'XXX') <> NVL(TO_CHAR(c_Visit_rec.CLOSE_DATE_TIME,'DD-MM-YYYY HH24:MI'),'XXX') THEN
4067     IF c_Visit_rec.STATUS_CODE = 'RELEASED' THEN
4068         l_visit_rec.STATUS_CODE := 'PARTIALLY RELEASED';
4069     END IF;
4070   END IF;
4071 
4072   -- For all optional fields check if its g_miss_num/g_miss_char/g_miss_date
4073   -- then Null else the value call Default_Missing_Attribs procedure
4074   Default_Missing_Attribs
4075         (
4076           p_x_visit_rec             => l_Visit_rec
4077         );
4078 
4079 
4080   /* MANESING::Component Maintenance Planning Project, 05-Jul-2011, commented out
4081    * following check as it's already present in Validate_Visit API.
4082   ----------------------- Validate ----------------------
4083   IF p_validation_level >= Jtf_Plsql_Api.g_valid_level_item THEN
4084       IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
4085         fnd_log.string(fnd_log.level_statement,L_DEBUG,'Before calling Check_Visit_Items');
4086       END IF;
4087 
4088       Check_Visit_Items (
4089              p_Visit_rec          => l_visit_rec,
4090              p_validation_mode    => Jtf_Plsql_Api.g_update,
4091              x_return_status      => l_return_status
4092           );
4093 
4094       IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
4095         fnd_log.string(fnd_log.level_statement,L_DEBUG,'After calling Check_Visit_Items : l_return_status - '|| l_return_status);
4096       END IF;
4097   END IF;
4098   */
4099 
4100   -- SATHAPLI::Component Maintenance Planning Project, 02-Nov-2011, start
4101   -- set the Planning and In-Repair locators in the record, before Validate_Visit call
4102   -- Planning
4103   IF (l_visit_rec.comp_planning_subinv IS NOT NULL AND l_visit_rec.comp_planning_loc_seg IS NOT NULL) THEN
4104     l_status_id := NULL;
4105     OPEN c_subinv_validate (l_visit_rec.comp_planning_subinv, l_visit_rec.organization_id);
4106     FETCH c_subinv_validate INTO l_status_id;
4107     CLOSE c_subinv_validate;
4108 
4109     IF (l_status_id <> NVL(FND_PROFILE.VALUE('AHL_MTL_MAT_STATUS_UNSERVICABLE'), l_status_id)) THEN
4110       -- Planning and In-Repair Sub Inventory should be Unserviceable.
4111       FND_MESSAGE.SET_NAME('AHL', 'AHL_CMP_SUBINV_NOT_UNSVC');
4112       FND_MSG_PUB.ADD;
4113       RAISE FND_API.G_EXC_ERROR;
4114     END IF;
4115 
4116     l_inv_loc_id := NULL;
4117     OPEN c_loc_validate (l_visit_rec.organization_id, l_visit_rec.comp_planning_subinv, l_visit_rec.comp_planning_loc_seg);
4118     FETCH c_loc_validate INTO l_inv_loc_id;
4119     CLOSE c_loc_validate;
4120 
4121     l_visit_rec.comp_planning_loc_id := l_inv_loc_id;
4122   ELSE
4123     l_visit_rec.comp_planning_loc_id := NULL;
4124   END IF;
4125 
4126   -- In-Repair
4127   IF (l_visit_rec.comp_inrepair_subinv IS NOT NULL AND l_visit_rec.comp_inrepair_loc_seg IS NOT NULL) THEN
4128     l_status_id := NULL;
4129     OPEN c_subinv_validate (l_visit_rec.comp_inrepair_subinv, l_visit_rec.organization_id);
4130     FETCH c_subinv_validate INTO l_status_id;
4131     CLOSE c_subinv_validate;
4132 
4133     IF (l_status_id <> NVL(FND_PROFILE.VALUE('AHL_MTL_MAT_STATUS_UNSERVICABLE'), l_status_id)) THEN
4134       -- Planning and In-Repair Sub Inventory should be Unserviceable.
4135       FND_MESSAGE.SET_NAME('AHL', 'AHL_CMP_SUBINV_NOT_UNSVC');
4136       FND_MSG_PUB.ADD;
4137       RAISE FND_API.G_EXC_ERROR;
4138     END IF;
4139 
4140     l_inv_loc_id := NULL;
4141     OPEN c_loc_validate (l_visit_rec.organization_id, l_visit_rec.comp_inrepair_subinv, l_visit_rec.comp_inrepair_loc_seg);
4142     FETCH c_loc_validate INTO l_inv_loc_id;
4143     CLOSE c_loc_validate;
4144 
4145     l_visit_rec.comp_inrepair_loc_id := l_inv_loc_id;
4146   ELSE
4147     l_visit_rec.comp_inrepair_loc_id := NULL;
4148   END IF;
4149 
4150   -- Physical, Planning and In-Repair locators should be different
4151   -- NOTE: 1) no need to check for NULL explicitly
4152   --       2) ideally, physical sub inventory would be serviceable, whereas other two would be unserviceable
4153   IF (l_visit_rec.inv_locator_id       = l_visit_rec.comp_planning_loc_id OR
4154       l_visit_rec.inv_locator_id       = l_visit_rec.comp_inrepair_loc_id OR
4155       l_visit_rec.comp_planning_loc_id = l_visit_rec.comp_inrepair_loc_id) THEN
4156     -- Please set different locators for Physical, Planning and In-Repair Sub Inventories.
4157     FND_MESSAGE.SET_NAME('AHL', 'AHL_CMP_DIFF_LOCATORS');
4158     FND_MSG_PUB.ADD;
4159     RAISE FND_API.G_EXC_ERROR;
4160   END IF;
4161   -- SATHAPLI::Component Maintenance Planning Project, 02-Nov-2011, end
4162 
4163   /* MANESING::Component Maintenance Planning Project, 05-Jul-2011, added call to Validate_Visit API
4164    * similar to what happens in Create_Visit API for common validations.
4165    */
4166   IF (l_log_statement >= l_log_current_level) THEN
4167     FND_LOG.string(l_log_statement, l_debug, ' Invoking Validate_Visit API');
4168   END IF;
4169 
4170   Validate_Visit
4171   (
4172     p_api_version      => l_api_version,
4173     p_init_msg_list    => p_init_msg_list,
4174     p_commit           => FND_API.g_false,
4175     p_validation_level => p_validation_level,
4176     p_Visit_rec        => l_Visit_rec,
4177     x_return_status    => l_return_status,
4178     x_msg_count        => l_msg_count,
4179     x_msg_data         => l_msg_data
4180   );
4181 
4182   IF (l_log_statement >= l_log_current_level) THEN
4183     FND_LOG.string(l_log_statement, l_debug, ' After call to Validate_Visit API, Return Status = ' || l_return_status);
4184   END IF;
4185 
4186   IF ( l_return_status <> FND_API.G_RET_STS_SUCCESS ) THEN
4187     x_return_status := l_return_status;
4188     x_msg_count := l_msg_count;
4189     x_msg_data  := l_msg_data;
4190 
4191     IF ( l_return_status = FND_API.G_RET_STS_ERROR ) THEN
4192       RAISE FND_API.G_EXC_ERROR;
4193     ELSIF ( l_return_status = FND_API.G_RET_STS_UNEXP_ERROR ) THEN
4194       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4195     END IF;
4196   END IF;
4197 
4198   -- MANESING::Component Maintenance Planning Project, 02-Nov-2011
4199   -- Once a Component Visit is Planned, none of the sub-inventories or locators can be updated.
4200   IF (l_is_comp_visit = 'Y'   AND
4201       c_visit_rec.status_code <> 'DRAFT') THEN
4202 
4203       IF (NVL(l_visit_rec.inv_locator_id, -777) <> NVL(c_visit_rec.inv_locator_id, -777) OR
4204           l_visit_rec.comp_planning_loc_id      <> c_visit_rec.comp_planning_loc_id      OR
4205           l_visit_rec.comp_inrepair_loc_id      <> c_visit_rec.comp_inrepair_loc_id) THEN
4206           -- Cannot update Physical, Planning or In-Repair Sub Inventory or Locator when the Component Visit is not in Draft status.
4207           FND_MESSAGE.set_name('AHL', 'AHL_CMP_LOCATORS_NOUPDATE');
4208           FND_MSG_PUB.add;
4209           RAISE FND_API.G_EXC_ERROR;
4210       END IF;
4211   END IF;
4212 
4213   -- if organization is changed, then reset all the task department and space changed flag
4214   -- and cancel all the workorders in production
4215   IF (NVL(l_visit_rec.organization_id,-777) <> NVL(c_visit_rec.organization_id,-777)) THEN
4216     -- To set department_id to NULL in case if the visit's organization is changed
4217     OPEN c_task(l_visit_rec.visit_id);
4218     LOOP
4219       FETCH c_task INTO c_task_rec;
4220       EXIT WHEN c_task%NOTFOUND;
4221       -- Tasks found for visit
4222       -- To update department_id to NULL when visit's organization is changed
4223       UPDATE AHL_VISIT_TASKS_B
4224       SET DEPARTMENT_ID = NULL,
4225           OBJECT_VERSION_NUMBER = c_task_rec.object_version_number + 1
4226       WHERE VISIT_TASK_ID = c_task_rec.visit_task_id
4227       AND DEPARTMENT_ID IS NOT NULL;
4228 
4229       l_tasks_ovn_updated_count := l_tasks_ovn_updated_count +1; -- VWPE :: PRAKKUM :: 26-APR-2011
4230 
4231     END LOOP;
4232     CLOSE c_task;
4233 
4234     SPACE_CHANGED_FLAG := 'Y';
4235     l_is_dept_changed :=  true; --PRAKKUM :: VWPE: ER:12424063  :: 12-APR-2011 :: flag
4236 
4237     -- To find out if visit has workorder in production store this info in rec type
4238     OPEN c_Visit_WO (l_visit_rec.visit_id);
4239     FETCH c_visit_WO INTO l_workrec;
4240     IF c_visit_WO%FOUND THEN
4241       CLOSE c_visit_WO;
4242 
4243       IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
4244         fnd_log.string(fnd_log.level_statement,L_DEBUG,'Before calling AHL_PRD_WORKORDER_PVT.cancel_visit_jobs');
4245       END IF;
4246 
4247       AHL_PRD_WORKORDER_PVT.cancel_visit_jobs
4248                    (p_api_version      => 1.0,
4249                     p_init_msg_list    => FND_API.G_TRUE,
4250                     p_commit           => FND_API.G_FALSE,
4251                     p_validation_level => FND_API.G_VALID_LEVEL_FULL,
4252                     p_default          => FND_API.G_FALSE,
4253                     p_module_type      => NULL,
4254                     x_return_status    => l_return_status,
4255                     x_msg_count        => l_msg_count,
4256                     x_msg_data         => l_msg_data,
4257                     p_visit_id         => l_Visit_rec.visit_id,
4258                     p_unit_effectivity_id => NULL,
4259                     p_workorder_id        => NULL);
4260 
4261       IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
4262         fnd_log.string(fnd_log.level_statement,L_DEBUG,'After calling AHL_PRD_WORKORDER_PVT.cancel_visit_jobs - l_return_status : '||l_return_status);
4263       END IF;
4264 
4265       IF l_return_status <> 'S' THEN
4266         RAISE Fnd_Api.G_EXC_ERROR;
4267       END IF;
4268     ELSE
4269       CLOSE c_visit_WO;
4270     END IF;
4271   END IF;
4272 
4273   IF (NVL(l_visit_rec.department_id,-777) <> NVL(c_visit_rec.department_id,-777)) THEN
4274        l_is_dept_changed :=  true; --PRAKKUM :: VWPE: ER:12424063  :: 12-APR-2011 :: flag
4275   END IF;
4276 
4277   -- if department is changed, then set space changed flag
4278   --All the wip jobs for this visit to be updated with new department and start/end time;
4279   IF space_changed_flag <> 'Y' THEN
4280     IF (NVL(l_visit_rec.department_id,-777) <> NVL(c_visit_rec.department_id,-777)) THEN
4281         space_changed_flag := 'Y';
4282         -- cancel all the workorders for the visit if visit department is cleared up.
4283         IF l_visit_rec.department_id is null and c_visit_rec.department_id is not null THEN
4284             OPEN c_Visit_WO (l_visit_rec.visit_id);
4285             FETCH c_visit_WO INTO l_workrec;
4286             IF c_visit_WO%found THEN
4287                 close c_visit_WO;
4288 
4289                 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
4290                   fnd_log.string(fnd_log.level_statement,L_DEBUG,'Before calling AHL_PRD_WORKORDER_PVT.cancel_visit_jobs');
4291                 END IF;
4292 
4293                 AHL_PRD_WORKORDER_PVT.cancel_visit_jobs
4294                                  (p_api_version      => 1.0,
4295                                   p_init_msg_list    => FND_API.G_TRUE,
4296                                   p_commit           => FND_API.G_FALSE,
4297                                   p_validation_level => FND_API.G_VALID_LEVEL_FULL,
4298                                   p_default          => FND_API.G_FALSE,
4299                                   p_module_type      => NULL,
4300                                   x_return_status    => l_return_status,
4301                                   x_msg_count        => l_msg_count,
4302                                   x_msg_data         => l_msg_data,
4303                                   p_visit_id         => l_Visit_rec.visit_id,
4304                                   p_unit_effectivity_id => NULL,
4305                                   p_workorder_id        => NULL);
4306 
4307                 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
4308                   fnd_log.string(fnd_log.level_statement,L_DEBUG,'After calling AHL_PRD_WORKORDER_PVT.cancel_visit_jobs - l_return_status : '||l_return_status);
4309                 END IF;
4310 
4311                 IF l_return_status <> 'S' THEN
4312                   RAISE Fnd_Api.G_EXC_ERROR;
4313                 END IF;
4314             ELSE
4315               close c_visit_WO;
4316             END IF;
4317         ELSIF l_visit_rec.department_id is not null
4318         and c_visit_rec.department_id is not null
4319         and l_visit_rec.department_id <>c_visit_rec.department_id THEN
4320 
4321             l_visit_end_date:= AHL_VWP_TIMES_PVT.get_visit_end_time(l_visit_rec.visit_id);
4322             -- To find out if visit has workorder in production store this info in rec type
4323             OPEN c_Visit_WO (l_visit_rec.visit_id);
4324             FETCH c_visit_WO INTO l_workrec;
4325 
4326             IF c_visit_WO%found THEN
4327               l_workorder_rec.WORKORDER_ID              := l_workrec.workorder_id;
4328               l_workorder_rec.OBJECT_VERSION_NUMBER     := l_workrec.object_version_number;
4329               l_workorder_rec.DEPARTMENT_ID             := l_visit_rec.department_id;
4330 --            l_workorder_rec.SCHEDULED_START_DATE      := l_date_time_start;
4331 --            l_workorder_rec.SCHEDULED_END_DATE        := l_visit_end_date;
4332 
4333               IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
4334                 fnd_log.string(fnd_log.level_statement,L_DEBUG,'VISIT - Before calling AHL_PRD_WORKORDER_PVT.update_job API');
4335               END IF;
4336 
4337               AHL_PRD_WORKORDER_PVT.update_job
4338                      (  p_api_version          =>1.0,
4339                         p_init_msg_list        =>fnd_api.g_false,
4340                         p_commit               =>fnd_api.g_false,
4341                         p_validation_level     =>p_validation_level,
4342                         p_default              =>fnd_api.g_false,
4343                         p_module_type          =>'API',
4344                         x_return_status        =>l_return_status,
4345                         x_msg_count            =>x_msg_count,
4346                         x_msg_data             =>x_msg_data,
4347                         p_wip_load_flag        =>'Y',
4348                         p_x_prd_workorder_rec  =>l_workorder_rec,
4349                         P_X_PRD_WORKOPER_TBL   =>l_workoper_tbl
4350                         );
4351 
4352               IF l_return_status <> 'S' THEN
4353                 CLOSE c_visit_WO;
4354                 RAISE Fnd_Api.G_EXC_ERROR;
4355               END IF;
4356 
4357               IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
4358                 fnd_log.string(fnd_log.level_statement,L_DEBUG,'VISIT - After calling AHL_PRD_WORKORDER_PVT.update_job API - l_return_status : '||l_return_status);
4359               END IF;
4360             END IF; -- End of visit workorder found
4361             CLOSE c_visit_WO;
4362 
4363             -- To find all tasks for the visit so as to update task start and end datetime
4364             IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
4365                 fnd_log.string(fnd_log.level_statement,L_DEBUG,'TASK - To update task start and end date time');
4366             END IF;
4367 
4368             OPEN c_task(l_visit_rec.visit_id);
4369             LOOP
4370               FETCH c_task INTO c_task_rec;
4371               IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
4372                   fnd_log.string(fnd_log.level_statement,L_DEBUG,'TASK - ID = ' || c_task_rec.visit_task_id);
4373               END IF;
4374 
4375               -- Update workorder for the task only if task is using visit department
4376               IF c_task_rec.department_id is null OR c_task_rec.department_id = FND_API.g_miss_num THEN
4377                 OPEN  c_Task_WO(c_task_rec.visit_task_id);
4378                 FETCH c_Task_WO into l_task_workrec;
4379 
4380                 IF c_Task_WO%found THEN
4381                   IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
4382                       fnd_log.string(fnd_log.level_statement,L_DEBUG,'TASK - Workorder found ');
4383                   END IF;
4384                   --Update with new times from table
4385                   --l_workorder_rec.SCHEDULED_START_DATE  := c_task_rec.START_DATE_TIME;
4386                   --l_workorder_rec.SCHEDULED_END_DATE    := c_task_rec.END_DATE_TIME;
4387                   l_workorder_rec.DEPARTMENT_ID             := l_visit_rec.department_id;
4388                   l_workorder_rec.WORKORDER_ID              := l_task_workrec.workorder_id;
4389                   l_workorder_rec.OBJECT_VERSION_NUMBER     := l_task_workrec.object_version_number;
4390 
4391                   IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
4392                       fnd_log.string(fnd_log.level_statement,L_DEBUG,'TASK - Workorder Id = ' || l_workorder_rec.WORKORDER_ID);
4393                       fnd_log.string(fnd_log.level_statement,L_DEBUG,'TASK - Before calling AHL_PRD_WORKORDER_PVT.update_job');
4394                   END IF;
4395 
4396                   AHL_PRD_WORKORDER_PVT.update_job
4397                           (   p_api_version          =>1.0,
4398                               p_init_msg_list        =>fnd_api.g_false,
4399                               p_commit               =>fnd_api.g_false,
4400                               p_validation_level     =>p_validation_level,
4401                               p_default              =>fnd_api.g_false,
4402                               p_module_type          =>'API',
4403                               x_return_status        =>l_return_status,
4404                               x_msg_count            =>x_msg_count,
4405                               x_msg_data             =>x_msg_data,
4406                               p_wip_load_flag        =>'Y',
4407                               p_x_prd_workorder_rec  =>l_workorder_rec,
4408                               P_X_PRD_WORKOPER_TBL   =>l_workoper_tbl
4409                           );
4410 
4411                   IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
4412                       fnd_log.string(fnd_log.level_statement,L_DEBUG,'TASK - After calling AHL_PRD_WORKORDER_PVT.update_job - l_return_status : '||l_return_status);
4413                   END IF;
4414 
4415                   IF l_return_status <> 'S' THEN
4416                      CLOSE c_Task_WO;
4417                      CLOSE c_task;
4418                      RAISE Fnd_Api.G_EXC_ERROR;
4419                   END IF;
4420                 END IF;
4421                 CLOSE c_Task_WO;
4422               END IF;
4423               EXIT WHEN c_task%NOTFOUND;
4424             END LOOP;
4425             CLOSE c_task;
4426           END IF;
4427        END IF;
4428     END IF;
4429 
4430     -- if start date (hour change is not considered) is changed, then set space changed flag
4431     IF space_changed_flag <> 'Y' THEN
4432        IF NVL(TO_CHAR(l_date_time_start,'DD-MM-YYYY'),'XXX') <> NVL(TO_CHAR(c_Visit_rec.START_DATE_TIME,'DD-MM-YYYY'),'XXX') THEN
4433              space_changed_flag := 'Y';
4434        ELSIF NVL(TO_CHAR(l_date_time_end,'DD-MM-YYYY'),'XXX') <> NVL(TO_CHAR(c_Visit_rec.close_date_time,'DD-MM-YYYY'),'XXX') THEN
4435              space_changed_flag := 'Y';
4436        END IF;
4437     END IF;
4438 
4439     --VWPE ER-12424063 :: tchimira :: 15-FEB -2011 :: start
4440     -- If the visit status is 'DRAFT', pass the Past dated visit flag value accordingly
4441     -- For NON-DRAFT statused visits, user cannot update the start date from past to future or vice-versa
4442     IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
4443         fnd_log.string(fnd_log.level_statement,L_DEBUG,'status of the visit is:  '||c_visit_rec.status_code||' ,and start date is - '||l_date_time_start);
4444     END IF;
4445     IF c_visit_rec.status_code = 'DRAFT' THEN
4446        IF  l_date_time_start IS NOT NULL THEN
4447           -- Added below condition by tchimira for CMP ER changes
4448           -- if the visit is component type then do not flag the visit as past dated irrespective of the start date
4449           IF (l_date_time_start < SYSDATE AND l_is_comp_visit <> 'Y')  THEN
4450              l_Visit_rec.PAST_DATED_VISIT_FLAG := 'Y';
4451           ELSE
4452              l_Visit_rec.PAST_DATED_VISIT_FLAG := 'N';
4453           END IF;
4454        END IF;
4455 
4456     ELSE
4457         l_Visit_rec.PAST_DATED_VISIT_FLAG := c_visit_rec.PAST_DATED_VISIT_FLAG;
4458         -- SKPATHAK :: 07-SEP-2011 :: VWPE ER: 12856858
4459         -- Removed the below validation
4460         /*IF (c_visit_rec.PAST_DATED_VISIT_FLAG = 'N') AND (l_date_time_start < SYSDATE) THEN
4461         Fnd_Message.SET_NAME('AHL','AHL_VWP_CANNOT_CHNG_ST');
4462         Fnd_Msg_Pub.ADD;
4463         RAISE FND_API.G_EXC_ERROR;
4464         END IF;*/
4465 
4466         IF (c_visit_rec.PAST_DATED_VISIT_FLAG = 'Y') AND (l_date_time_start > SYSDATE) THEN
4467         Fnd_Message.SET_NAME('AHL','AHL_VWP_CANNOT_CHNG_ST');
4468         Fnd_Msg_Pub.ADD;
4469         RAISE FND_API.G_EXC_ERROR;
4470         END IF;
4471     END IF;
4472 
4473     --VWPE ER-12424063:: tchimira :: 15-FEB -2011 :: end
4474 
4475     --TCHIMIRA :: 14-Jun-2012 :: ER 14015560 ::added below flag
4476     -- From UI, if this API is called and the passed flag is null, do NOT change the auto visit type flag
4477     IF ((p_module_type = 'OAF')AND(l_auto_visit_type_flag is null)) THEN
4478       l_auto_visit_type_flag := c_visit_rec.auto_visit_type_flag;
4479     ELSE
4480       l_auto_visit_type_flag := l_Visit_rec.auto_visit_type_flag;
4481     END IF;
4482 
4483     -------------------------- Update --------------------
4484     IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
4485         fnd_log.string(fnd_log.level_statement,L_DEBUG,'Before calling Ahl_Visits_Pkg.UPDATE_ROW');
4486     END IF;
4487 
4488     Ahl_Visits_Pkg.UPDATE_ROW (
4489              X_VISIT_ID              => l_Visit_rec.VISIT_ID,
4490              X_VISIT_NUMBER          => c_visit_rec.VISIT_NUMBER,
4491              X_VISIT_TYPE_CODE       => l_Visit_rec.VISIT_TYPE_CODE,
4492              X_SIMULATION_PLAN_ID    => c_Visit_rec.SIMULATION_PLAN_ID,
4493              X_ITEM_INSTANCE_ID      => c_Visit_rec.ITEM_INSTANCE_ID,
4494              X_ITEM_ORGANIZATION_ID  => c_Visit_rec.ITEM_ORGANIZATION_ID,
4495              X_INVENTORY_ITEM_ID     => c_Visit_rec.INVENTORY_ITEM_ID,
4496              X_ASSO_PRIMARY_VISIT_ID => c_Visit_rec.ASSO_PRIMARY_VISIT_ID,
4497              X_SIMULATION_DELETE_FLAG => c_Visit_rec.SIMULATION_DELETE_FLAG,
4498              X_TEMPLATE_FLAG         => c_Visit_rec.TEMPLATE_FLAG,
4499              X_OUT_OF_SYNC_FLAG      => c_Visit_rec.OUT_OF_SYNC_FLAG,
4500              X_PROJECT_FLAG          => 'Y',
4501              X_PROJECT_ID            => c_Visit_rec.PROJECT_ID,
4502              X_SERVICE_REQUEST_ID    => l_Visit_rec.SERVICE_REQUEST_ID,
4503              X_SPACE_CATEGORY_CODE   => l_Visit_rec.SPACE_CATEGORY_CODE,
4504              X_SCHEDULE_DESIGNATOR   => c_Visit_rec.SCHEDULE_DESIGNATOR,
4505           -- manisaga chnaged the record from c_Visit_rec to l_Visit_rec
4506           -- for dff implementation on 22-Feb-2010  -- Start
4507              X_ATTRIBUTE_CATEGORY    => l_Visit_rec.ATTRIBUTE_CATEGORY,
4508              X_ATTRIBUTE1            => l_Visit_rec.ATTRIBUTE1,
4509              X_ATTRIBUTE2            => l_Visit_rec.ATTRIBUTE2,
4510              X_ATTRIBUTE3            => l_Visit_rec.ATTRIBUTE3,
4511              X_ATTRIBUTE4            => l_Visit_rec.ATTRIBUTE4,
4512              X_ATTRIBUTE5            => l_Visit_rec.ATTRIBUTE5,
4513              X_ATTRIBUTE6            => l_Visit_rec.ATTRIBUTE6,
4514              X_ATTRIBUTE7            => l_Visit_rec.ATTRIBUTE7,
4515              X_ATTRIBUTE8            => l_Visit_rec.ATTRIBUTE8,
4516              X_ATTRIBUTE9            => l_Visit_rec.ATTRIBUTE9,
4517              X_ATTRIBUTE10           => l_Visit_rec.ATTRIBUTE10,
4518              X_ATTRIBUTE11           => l_Visit_rec.ATTRIBUTE11,
4519              X_ATTRIBUTE12           => l_Visit_rec.ATTRIBUTE12,
4520              X_ATTRIBUTE13           => l_Visit_rec.ATTRIBUTE13,
4521              X_ATTRIBUTE14           => l_Visit_rec.ATTRIBUTE14,
4522              X_ATTRIBUTE15           => l_Visit_rec.ATTRIBUTE15,
4523           -- manisaga chnaged the record from c_Visit_rec to l_Visit_rec
4524           -- for dff implementation on 22-Feb-2010  -- End
4525              X_OBJECT_VERSION_NUMBER => l_Visit_rec.OBJECT_VERSION_NUMBER + 1,
4526              X_ORGANIZATION_ID       => l_Visit_rec.ORGANIZATION_ID,
4527              X_DEPARTMENT_ID         => l_Visit_rec.DEPARTMENT_ID,
4528              X_STATUS_CODE           => l_Visit_rec.STATUS_CODE,
4529              X_START_DATE_TIME       => l_date_time_start,
4530              X_CLOSE_DATE_TIME       => l_date_time_end,
4531              X_PRICE_LIST_ID         => c_Visit_rec.PRICE_LIST_ID,
4532              X_ESTIMATED_PRICE       => c_Visit_rec.ESTIMATED_PRICE,
4533              X_ACTUAL_PRICE          => c_Visit_rec.ACTUAL_PRICE,
4534              X_OUTSIDE_PARTY_FLAG    => c_Visit_rec.OUTSIDE_PARTY_FLAG,
4535              X_ANY_TASK_CHG_FLAG     => c_Visit_rec.ANY_TASK_CHG_FLAG,
4536              X_VISIT_NAME            => l_Visit_rec.VISIT_NAME,
4537              X_DESCRIPTION           => l_Visit_rec.DESCRIPTION,
4538              X_PRIORITY_CODE         => l_visit_rec.PRIORITY_CODE,
4539              X_PROJECT_TEMPLATE_ID   => l_visit_rec.PROJ_TEMPLATE_ID,
4540              X_LAST_UPDATE_DATE      => SYSDATE,
4541              X_LAST_UPDATED_BY       => Fnd_Global.USER_ID,
4542              X_LAST_UPDATE_LOGIN     => Fnd_Global.LOGIN_ID,
4543              X_UNIT_SCHEDULE_ID      => c_Visit_rec.unit_schedule_id,
4544              X_INV_LOCATOR_ID        => l_visit_rec.INV_LOCATOR_ID, --Added by sowsubra
4545              -- SATHAPLI::Component Maintenance Planning Project, 02-Nov-2011
4546              -- set the Planning and In-Repair locators
4547              X_COMP_PLANNING_LOC_ID  => l_visit_rec.comp_planning_loc_id,
4548              X_COMP_INREPAIR_LOC_ID  => l_visit_rec.comp_inrepair_loc_id,
4549              X_TOP_PROJECT_TASK_ID   => c_Visit_rec.top_project_task_id,   -- PRAKKUM ::FP PIE :: 13-OCT-2010
4550              --VWPE ER-12424063 :: tchimira :: 15-FEB -2011 :: start
4551              X_PAST_DATED_VISIT_FLAG    => l_Visit_rec.PAST_DATED_VISIT_FLAG,
4552              X_FIRMED_FLAG           => l_Visit_rec.FIRMED_FLAG,
4553              X_LOCKED_FLAG           => l_Visit_rec.LOCKED_FLAG,
4554              --VWPE ER-12424063 :: tchimira :: 15-FEB -2011 :: end
4555              X_ITEM_OWNER_FLAG      => L_VISIT_REC.ITEM_OWNER_FLAG, --ARUNJK added for Marshalling
4556              --TCHIMIRA :: 14-Jun-2012 :: ER 14015560 ::added below flag
4557              X_AUTO_VISIT_TYPE_FLAG      => l_AUTO_VISIT_TYPE_FLAG
4558              );
4559 
4560 
4561     IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
4562         fnd_log.string(fnd_log.level_statement,L_DEBUG,'After calling Ahl_Visits_Pkg.UPDATE_ROW');
4563     END IF;
4564 
4565     -- SKPATHAK :: 20-JUN-2011 :: VWPE: ER:12673125 :: START :: START
4566     IF c_visit_rec.status_code <> 'DRAFT' THEN
4567       -- If visit start or end dates changed then reschedule the jobs
4568       IF (c_Visit_rec.start_date_time <> l_date_time_start
4569           OR c_Visit_rec.close_date_time <> l_date_time_end) THEN
4570 
4571          IF (l_log_statement >= l_log_current_level) THEN
4572             fnd_log.string(l_log_statement,
4573              L_DEBUG,
4574              'Before calling AHL_PRD_WORKORDER_PVT.reschedule_visit_jobs');
4575          END IF;
4576 
4577          AHL_PRD_WORKORDER_PVT.reschedule_visit_jobs(
4578               P_API_VERSION                  => 1.0,
4579               x_return_status                => l_return_status,
4580               x_msg_count                    => l_msg_count,
4581               x_msg_data                     => l_msg_data,
4582               P_VISIT_ID                     => l_Visit_rec.VISIT_ID,
4583               p_x_scheduled_start_date       => l_date_time_start,
4584               p_x_scheduled_end_date         => l_date_time_end);
4585 
4586          IF (l_log_statement >= l_log_current_level) THEN
4587             fnd_log.string(l_log_statement,
4588                            L_DEBUG,
4589                            'After calling AHL_PRD_WORKORDER_PVT.reschedule_visit_jobs. Return Status = ' || l_return_status);
4590          END IF;
4591 
4592          IF (l_return_status <> Fnd_Api.G_RET_STS_SUCCESS) THEN
4593             IF (l_log_statement >= l_log_current_level) THEN
4594                fnd_log.string(l_log_statement,
4595                               L_DEBUG,
4596                               'Errors from AHL_PRD_WORKORDER_PVT.reschedule_visit_jobs. Message count: ' ||
4597                               l_msg_count || ', message data: ' || l_msg_data);
4598             END IF;
4599             IF l_return_status = FND_API.G_RET_STS_ERROR THEN
4600                RAISE FND_API.G_EXC_ERROR;
4601             ELSE
4602                RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4603             END IF;
4604          END IF;
4605       END IF;
4606     END IF; --reschedule visit jobs
4607 
4608     -- Now due to the call to reschedule_visit_jobs, EAM has rescheduled all the visit jobs
4609     -- Check if any of the visit's job is later than the Visit Planned end date and if so, throw an error
4610     -- TCHIMIRA :: 17-DEC-2011 :: bug# 13000673 :: commenting the below validation
4611     /*OPEN get_latest_wo_end_date (l_Visit_rec.VISIT_ID);
4612     FETCH get_latest_wo_end_date INTO l_latest_wo_end_date;
4613     CLOSE get_latest_wo_end_date;
4614     IF l_latest_wo_end_date > l_date_time_end THEN
4615        Fnd_Message.SET_NAME('AHL','AHL_VWP_PUSH_END_DATE');
4616        Fnd_Message.SET_TOKEN('END_DATE',to_char(l_latest_wo_end_date, 'DD-Mon-YYYY HH24:MI:SS'));
4617        Fnd_Msg_Pub.ADD;
4618        RAISE Fnd_Api.G_EXC_ERROR;
4619     END IF; */
4620     -- SKPATHAK :: 20-JUN-2011 :: VWPE: ER:12673125 ::  END
4621 
4622     /* MANESING::Component Maintenance Planning Project, 05-Jul-2011
4623      * There is no need for handling anything related to Stages for Component Visits
4624      * as there won't be any Stage associated with them.
4625      */
4626     IF (l_is_comp_visit = 'N') THEN
4627 
4628      --VWPE ER-12424063:: tchimira :: 15-FEB -2011 :: start
4629       -- If the visit status is 'DRAFT' and visit type code is not null then call the associate visit type to visit
4630       -- This procedure creates stages, stage tasks, stage rules and stage-stage type association in a visit
4631       IF c_visit_rec.status_code = 'DRAFT' THEN
4632           IF l_Visit_rec.VISIT_TYPE_CODE IS NOT NULL AND c_Visit_rec.visit_type_code IS NULL THEN
4633             IF l_is_old_visit_dets.IS_OLD_VISIT  <> 'Y' THEN -- PRAKKUM :: 28-JUN-2011 :: VWPE :: ER 12730539 :: IF not an old visit
4634               AHL_VWP_VISITS_STAGES_PVT.Assoc_VisitType_to_Visit (
4635                                       p_api_version             =>   1.0,
4636                                       p_init_msg_list           =>   fnd_api.g_false,
4637                                       p_commit                  =>   fnd_api.g_false,
4638                                       p_validation_level        =>   p_validation_level,
4639                                       p_visit_id                =>   l_Visit_rec.VISIT_ID,
4640                                       p_visit_type_code         =>   l_Visit_rec.VISIT_TYPE_CODE,
4641                                       x_return_status           =>   l_return_status,
4642                                       x_msg_count               =>   x_msg_count,
4643                                       x_msg_data                =>   x_msg_data
4644                                       );
4645               IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
4646                 fnd_log.string(fnd_log.level_statement,L_DEBUG,'TASK - After calling AHL_VWP_VISITS_STAGES_PVT.Assoc_VisitType_to_Visit - l_return_status : '||l_return_status);
4647               END IF;
4648 
4649               IF l_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
4650                  RAISE Fnd_Api.g_exc_unexpected_error;
4651               ELSIF l_return_status = Fnd_Api.g_ret_sts_error THEN
4652                  RAISE Fnd_Api.g_exc_error;
4653               END IF;
4654             END IF;
4655           END IF;
4656       END IF;
4657      --VWPE ER-12424063:: tchimira :: 15-FEB -2011 :: end
4658     END IF; -- if l_is_comp_visit = 'N'
4659 
4660     --PRAKKUM :: VWPE: ER:12424063  :: 11-APR-2011 :: Space dates validation :: START
4661     IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
4662         fnd_log.string(fnd_log.level_statement,L_DEBUG,'c_Visit_rec.START_DATE_TIME = ' || c_Visit_rec.START_DATE_TIME);
4663         fnd_log.string(fnd_log.level_statement,L_DEBUG,'l_date_time_start = ' ||l_date_time_start);
4664         fnd_log.string(fnd_log.level_statement,L_DEBUG,'c_Visit_rec.START_DATE_TIME = ' || c_Visit_rec.close_date_time);
4665         fnd_log.string(fnd_log.level_statement,L_DEBUG,'l_date_time_start = ' ||l_date_time_end);
4666     END IF;
4667 
4668     l_is_start_date_changed := false;
4669     l_is_close_date_changed := false;-- VWPE 12730539:: PRAKKUM :: 02-AUG-2011
4670     IF c_Visit_rec.START_DATE_TIME IS NOT NULL OR l_date_time_start IS NOT NULL THEN
4671      IF c_Visit_rec.START_DATE_TIME IS NOT NULL AND l_date_time_start IS NOT NULL THEN
4672          IF l_date_time_start <> c_Visit_rec.START_DATE_TIME THEN -- Dates changed, so need to validate
4673               l_is_start_date_changed := true;
4674          END IF;
4675      ELSE -- If one is null and other is not null, then consider it as updated
4676           l_is_start_date_changed := true;
4677      END IF;
4678     END IF;
4679 
4680     -- VWPE 12730539:: PRAKKUM :: 02-AUG-2011 :: START
4681     IF c_Visit_rec.close_date_time IS NOT NULL OR l_date_time_end IS NOT NULL THEN
4682        IF c_Visit_rec.close_date_time IS NOT NULL AND l_date_time_end IS NOT NULL THEN
4683            IF l_date_time_end <> c_Visit_rec.close_date_time THEN -- Dates changed, so need to validate
4684                 l_is_close_date_changed := true;
4685            END IF;
4686        ELSE -- If one is null and other is not null, then consider it as updated
4687             l_is_close_date_changed := true;
4688        END IF;
4689     END IF;
4690     -- VWPE 12730539:: PRAKKUM :: 02-AUG-2011 :: END
4691 
4692     IF l_is_start_date_changed OR l_is_close_date_changed THEN
4693 
4694           AHL_LTP_SPACE_ASSIGN_PVT.VALIDATE_SPACES_WITH_VISIT(
4695                    p_api_version       => p_api_version,
4696                    p_init_msg_list     => Fnd_Api.g_false,
4697                    p_commit            => Fnd_Api.g_false,
4698                    p_validation_level  => p_validation_level,
4699                    p_module_type       => p_module_type,
4700                    p_visit_id          => l_Visit_rec.visit_id,
4701                    x_return_status     => x_return_status,
4702                    x_msg_count         => x_msg_count,
4703                    x_msg_data          => x_msg_data
4704           );
4705 
4706     END IF;
4707 
4708     /* MANESING::Component Maintenance Planning Project, 05-Jul-2011
4709      * There is no need to update Stage hierarchy for Component Visits
4710      * as there won't be any Stage associated with them.
4711      */
4712     IF (l_is_comp_visit = 'N') THEN
4713       IF l_is_start_date_changed OR l_is_dept_changed THEN -- If start date or department changed, then need to update all stage dates
4714 
4715             l_stages_ovn_updated_count := l_stages_ovn_updated_count+1;--prakkum :: 06-JUL-2011 :: VWPE 12730539 :: All stages are updated to new dates
4716 
4717             AHL_VWP_VISITS_STAGES_PVT.UPDATE_STAGES_HIERARICHY (
4718                      p_api_version       => p_api_version,
4719                      p_init_msg_list     => Fnd_Api.g_false,
4720                      p_commit            => Fnd_Api.g_false,
4721                      p_validation_level  => p_validation_level,
4722                      p_module_type       => p_module_type,
4723                      p_visit_id          => l_Visit_rec.visit_id,
4724                      x_return_status     => x_return_status,
4725                      x_msg_count         => x_msg_count,
4726                      x_msg_data          => x_msg_data
4727             );
4728 
4729       ELSIF l_is_close_date_changed THEN -- On visit end change, validate stage dates against visit end date
4730 
4731              -- PRAKKUM :: 13-FEB-2011 :: Bug 13711800 :: START
4732              IF (l_log_statement >= l_log_current_level) THEN
4733                   fnd_log.string(l_log_statement,L_DEBUG,'Before calling AHL_VWP_VISITS_STAGES_PVT.VALIDATE_STAGE_DATES ');
4734              END IF;
4735 
4736              AHL_VWP_VISITS_STAGES_PVT.VALIDATE_STAGE_DATES( p_visit_id          => l_Visit_rec.visit_id,
4737                                                              x_return_status     => l_return_status,
4738                                                              x_msg_count         => l_msg_count,
4739                                                              x_msg_data          => l_msg_data);
4740 
4741              IF (l_log_statement >= l_log_current_level) THEN
4742                   fnd_log.string(l_log_statement,L_DEBUG,'After calling AHL_VWP_VISITS_STAGES_PVT.VALIDATE_STAGE_DATES - l_return_status : '||l_return_status);
4743              END IF;
4744 
4745              IF l_msg_count > 0 OR NVL(l_return_status,'x') <> FND_API.G_RET_STS_SUCCESS THEN
4746                   x_msg_count := l_msg_count;
4747                   x_return_status := l_return_status;
4748                   IF l_return_status = Fnd_Api.g_ret_sts_error THEN
4749                      RAISE Fnd_Api.g_exc_error;
4750                   ELSIF l_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
4751                      RAISE Fnd_Api.g_exc_unexpected_error;
4752                   END IF;
4753              END IF;
4754              -- PRAKKUM :: 13-FEB-2011 :: Bug 13711800 :: END
4755 
4756       END IF;
4757       --PRAKKUM :: VWPE: ER:12424063  :: 11-APR-2011 :: Space dates validation :: END
4758 
4759       -- PRAKKUM :: VWPE: ER:12424063  :: 11-APR-2011 :: Validation before calling this API to get tasks update count :: START
4760       -- 1. Fetch the Visit's deparment id and visit start date
4761       OPEN get_visit_data_csr(l_Visit_rec.visit_id);
4762       FETCH get_visit_data_csr INTO l_visit_dept_id, l_visit_start_date;
4763       --As per code in Calculate_Task_Times if not found, reset start dates of task to null, so it updating tasks ovn
4764       IF (get_visit_data_csr%NOTFOUND) THEN
4765           l_tasks_ovn_updated_count := l_tasks_ovn_updated_count +1;
4766       END IF;
4767       CLOSE get_visit_data_csr;
4768 
4769       --Clear up previous calculated task start/end date if visit start date or dept is missing
4770       IF (l_visit_start_date IS NULL) OR (l_visit_dept_id IS NULL) THEN
4771           l_tasks_ovn_updated_count := l_tasks_ovn_updated_count +1;
4772       END IF;
4773       -- PRAKKUM :: VWPE: ER:12424063  :: 11-APR-2011 :: Validation before calling this API to get tasks update count :: END
4774     END IF; -- if l_is_comp_visit = 'N'
4775 
4776     IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
4777         fnd_log.string(fnd_log.level_statement,L_DEBUG,'Before calling AHL_VWP_TIMES_PVT.Calculate_Task_Times');
4778     END IF;
4779 
4780     -- Added cxcheng POST11510--------------
4781     AHL_VWP_TIMES_PVT.Calculate_Task_Times
4782         ( p_api_version     => 1.0,
4783           p_init_msg_list   => Fnd_Api.G_FALSE,
4784           p_commit          => Fnd_Api.G_FALSE,
4785           p_validation_level=> Fnd_Api.G_VALID_LEVEL_FULL,
4786           x_return_status   => l_return_status,
4787           x_msg_count       => l_msg_count,
4788           x_msg_data        => l_msg_data,
4789           p_visit_id        => l_visit_rec.visit_id);
4790 
4791     IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
4792         fnd_log.string(fnd_log.level_statement,L_DEBUG,'After calling AHL_VWP_TIMES_PVT.Calculate_Task_Times - l_return_status : '||l_return_status);
4793     END IF;
4794 
4795     IF l_return_status <> 'S' THEN
4796       RAISE Fnd_Api.G_EXC_ERROR;
4797     END IF;
4798 
4799     -- To call LTP process to delete or adjust space assignments if space changed flag is set to "Y"
4800     IF space_changed_flag = 'Y' THEN
4801         IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
4802             fnd_log.string(fnd_log.level_statement,L_DEBUG,'Before calling AHL_LTP_SPACE_ASSIGN_PVT.Delete_Space_assignment');
4803         END IF;
4804 
4805         l_Space_Assignment_Rec.VISIT_ID := l_Visit_rec.VISIT_ID;
4806         AHL_LTP_SPACE_ASSIGN_PVT.Delete_Space_assignment
4807             (   p_api_version             => 1.0,
4808                 p_init_msg_list           => FND_API.g_false,
4809                 p_commit                  => FND_API.g_false,
4810                 p_validation_level        => FND_API.g_valid_level_full,
4811                 p_space_assign_rec        => l_Space_Assignment_Rec,
4812                 x_return_status           => l_return_status,
4813                 x_msg_count               => x_msg_count,
4814                 x_msg_data                => x_msg_data
4815             );
4816 
4817         IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
4818             fnd_log.string(fnd_log.level_statement,L_DEBUG,'After calling AHL_LTP_SPACE_ASSIGN_PVT.Delete_Space_assignment - l_return_status : '||l_return_status);
4819         END IF;
4820 
4821         IF l_return_status <> 'S' THEN
4822             RAISE Fnd_Api.G_EXC_ERROR;
4823         END IF;
4824     END IF;
4825 
4826     -- If Visit DEPARTMENT or ORGANIZATION or Start Date is changed after price/cost is estimated,
4827     -- the prices associated to Visit and all the Tasks in the visit will be cleared up
4828     If space_changed_flag = 'Y' THEN
4829       OPEN c_job(l_Visit_rec.visit_id);
4830       FETCH c_job INTO l_count;
4831       CLOSE c_job;
4832 
4833       IF l_count <> 0 THEN
4834         -- To update visit's prices
4835         UPDATE AHL_VISITS_B
4836         SET ACTUAL_PRICE = NULL,
4837             ESTIMATED_PRICE = NULL,
4838             OBJECT_VERSION_NUMBER = OBJECT_VERSION_NUMBER + 1
4839         WHERE VISIT_ID = l_Visit_rec.visit_id;
4840 
4841         IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
4842             fnd_log.string(fnd_log.level_statement,L_DEBUG,'After updating actual and estimated price for the visit');
4843         END IF;
4844 
4845         -- To update all tasks prices of tasks under this visit
4846         OPEN c_task(l_visit_rec.visit_id);
4847         LOOP
4848             FETCH c_task INTO c_task_rec;
4849             EXIT WHEN c_task%NOTFOUND;
4850             -- Tasks found for visit
4851             -- To set prices to NULL in case if the visit's department is changed
4852             UPDATE AHL_VISIT_TASKS_B
4853             SET ACTUAL_PRICE = NULL,
4854                 ESTIMATED_PRICE = NULL,
4855                 OBJECT_VERSION_NUMBER = c_task_rec.object_version_number + 1
4856             WHERE VISIT_TASK_ID = c_task_rec.visit_task_id;
4857 
4858             l_tasks_ovn_updated_count := l_tasks_ovn_updated_count +1; -- VWPE :: PRAKKUM :: 26-APR-2011
4859         END LOOP;
4860         CLOSE c_task;
4861 
4862         IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
4863             fnd_log.string(fnd_log.level_statement,L_DEBUG,'After updating actual and estimated price for all the tasks in the visit');
4864         END IF;
4865       END IF;
4866     END IF;
4867 
4868     -- To call LTP Process Materials API for APS Integration by Shbhanda 04-Dec-03
4869     -- changed the condition for fixing the issue 144 , in the CMRO Forum
4870     -- if any of start date,organization, or department is not
4871     -- is invoked with operation flag 'D'
4872     -- else if any of them is updated then AHL_LTP_REQST_MATRL_PVT.Process_Planned_Materials is invoked with operation flag 'U' as earlier.
4873 
4874     IF (( c_visit_rec.organization_id IS NOT NULL AND c_visit_rec.department_id IS NOT NULL AND
4875            c_Visit_rec.START_DATE_TIME IS NOT NULL )
4876            AND ( l_date_time_start IS NULL OR l_date_time_start = Fnd_Api.G_MISS_DATE OR
4877            l_visit_rec.organization_id IS NULL OR l_visit_rec.organization_id = Fnd_Api.G_MISS_NUM OR
4878            l_visit_rec.department_id IS NULL OR l_visit_rec.department_id = Fnd_Api.G_MISS_NUM ))
4879     THEN
4880         IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
4881             fnd_log.string(fnd_log.level_statement,L_DEBUG,'Before calling AHL_LTP_REQST_MATRL_PVT.Process_Planned_Materials');
4882         END IF;
4883 
4884         AHL_LTP_REQST_MATRL_PVT.Process_Planned_Materials (
4885                 p_api_version             => 1.0,
4886                 p_init_msg_list           => FND_API.g_false,
4887                 p_commit                  => FND_API.g_false,
4888                 p_validation_level        => FND_API.g_valid_level_full,
4889                 p_visit_id                => l_visit_rec.Visit_Id,
4890                 p_visit_task_id           => NULL,
4891                 p_org_id                  => l_visit_rec.organization_id,
4892                 p_start_date              => l_date_time_start,
4893                 p_operation_flag          => 'D',
4894                 x_planned_order_flag      => l_planned_order_flag ,
4895                 x_return_status           => l_return_status,
4896                 x_msg_count               => x_msg_count,
4897                 x_msg_data                => x_msg_data );
4898 
4899         IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
4900             fnd_log.string(fnd_log.level_statement,L_DEBUG,'After calling AHL_LTP_REQST_MATRL_PVT.Process_Planned_Materials - l_return_status : '||l_return_status);
4901         END IF;
4902 
4903         IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
4904             RAISE FND_API.G_EXC_ERROR;
4905         END IF;
4906     ELSIF ( NVL(l_date_time_start,TO_DATE('01-01-1947','DD-MM-YYYY')) <>  NVL(c_Visit_rec.START_DATE_TIME,TO_DATE('01-01-1947','DD-MM-YYYY'))
4907     OR NVL(l_visit_rec.organization_id,-777) <> NVL(c_visit_rec.organization_id,-777)
4908     OR NVL(l_visit_rec.department_id,-777) <> NVL(c_visit_rec.department_id,-777))
4909     AND ( l_date_time_start IS NOT NULL AND l_date_time_start <> Fnd_Api.G_MISS_DATE
4910     AND l_visit_rec.organization_id IS NOT NULL AND l_visit_rec.organization_id <> Fnd_Api.G_MISS_NUM
4911     AND l_visit_rec.department_id IS NOT NULL AND l_visit_rec.department_id <> Fnd_Api.G_MISS_NUM )
4912     THEN
4913         /*AHL_DEBUG_PUB.Debug( l_full_name ||': VISIT UPDATED - Before calling AHL_LTP_REQST_MATRL_PVT.Process_Planned_Materials');
4914         ELSIF (
4915         ( l_date_time_start <> c_Visit_rec.START_DATE_TIME)
4916            OR (l_visit_rec.organization_id <> c_visit_rec.organization_id)
4917            OR (l_visit_rec.department_id   <> c_visit_rec.department_id)
4918                       )*/
4919         -- Begin Changes by surrkuma on 15-JUL-2010 for Bug 9901811
4920         -- Unschedule the ATP materials when there is an Org Change
4921         IF (l_visit_rec.organization_id IS NOT NULL AND l_visit_rec.organization_id <> Fnd_Api.G_MISS_NUM AND
4922             c_visit_rec.organization_id IS NOT NULL AND c_visit_rec.organization_id <> Fnd_Api.G_MISS_NUM AND
4923             l_visit_rec.organization_id <> c_visit_rec.organization_id) THEN
4924           Handle_Visit_Org_Change(p_visit_id => l_visit_rec.Visit_Id);
4925         END IF;
4926         -- End Changes by surrkuma on 15-JUL-2010 for Bug 9901811
4927         IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
4928             fnd_log.string(fnd_log.level_statement,L_DEBUG,'Before calling AHL_LTP_REQST_MATRL_PVT.Process_Planned_Materials');
4929         END IF;
4930 
4931         /* MANESING::Component Maintenance Planning Project, 05-Jul-2011
4932          * There is no need to consider Stage materials for Component Visits
4933          * as there won't be any Stage associated with them.
4934          */
4935          -- SURRKUMA :: 13914410 :: 03-APR-2012 :: If visit start date has been made as non-null, then associate mtls
4936         IF (l_is_comp_visit = 'N' AND l_date_time_start IS NOT NULL) THEN
4937 
4938           -- TCHIMIRA :: 16-JUL-2011 :: VWPE: ER:12730539 :: START
4939           -- For every MR of the visit, associate the materials based on the MR Profile to the stage tasks
4940           FOR l_task_detl_rec IN get_sum_task_det (l_visit_rec.Visit_Id) LOOP
4941               IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
4942                 fnd_log.string(fnd_log.level_statement, L_DEBUG,
4943                                'Before calling Associate_Stage_Materials and mr_id is : '||l_task_detl_rec.mr_id||'l_unit_eff_id: '||l_task_detl_rec.unit_effectivity_id
4944                                ||'p_visit_id: '||l_visit_rec.Visit_Id||'l_instance_id: '||l_task_detl_rec.instance_id);
4945               END IF;
4946                AHL_LTP_REQST_MATRL_PVT.Associate_Stage_Materials (
4947                p_api_version           => 1.0,
4948                p_init_msg_list         => Fnd_Api.G_FALSE,
4949                p_commit                => Fnd_Api.G_FALSE,
4950                p_validation_level      => Fnd_Api.G_VALID_LEVEL_FULL,
4951                p_module_type           => 'VST',
4952                p_visit_id              => l_visit_rec.Visit_Id,
4953                p_mr_header_id          => l_task_detl_rec.mr_id,
4954                p_instance_id           => l_task_detl_rec.instance_id,
4955                p_ue_id                 => l_task_detl_rec.unit_effectivity_id,
4956                x_return_status         => l_return_status,
4957                x_msg_count             => l_msg_count,
4958                x_msg_data              => l_msg_data);
4959 
4960               IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
4961                 fnd_log.string(fnd_log.level_statement, L_DEBUG,
4962                                'After calling Associate_Stage_Materials, Return Status: ' || l_return_status);
4963               END IF;
4964 
4965               -- Check Error Message stack.
4966               IF NVL(l_return_status,'x') <> FND_API.G_RET_STS_SUCCESS THEN
4967                 x_msg_count := l_msg_count;
4968                 x_return_status := l_return_status;
4969                 IF l_return_status = Fnd_Api.g_ret_sts_error THEN
4970                   RAISE Fnd_Api.g_exc_error;
4971                 ELSIF l_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
4972                   RAISE Fnd_Api.g_exc_unexpected_error;
4973                 END IF;
4974               END IF;
4975           END LOOP;
4976           -- TCHIMIRA :: 16-JUL-2011 :: VWPE: ER:12730539 :: END
4977         END IF; -- if l_is_comp_visit = 'N'
4978 
4979         AHL_LTP_REQST_MATRL_PVT.Process_Planned_Materials (
4980                 p_api_version             => 1.0,
4981                 p_init_msg_list           => FND_API.g_false,
4982                 p_commit                  => FND_API.g_false,
4983                 p_validation_level        => FND_API.g_valid_level_full,
4984                 p_visit_id                => l_visit_rec.Visit_Id,
4985                 p_visit_task_id           => NULL,
4986                 p_org_id                  => l_visit_rec.organization_id,
4987                 p_start_date              => l_date_time_start,
4988                 p_operation_flag          => 'U',
4989                 x_planned_order_flag      => l_planned_order_flag ,
4990                 x_return_status           => l_return_status,
4991                 x_msg_count               => x_msg_count,
4992                 x_msg_data                => x_msg_data );
4993 
4994         IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
4995             fnd_log.string(fnd_log.level_statement,L_DEBUG,'After calling AHL_LTP_REQST_MATRL_PVT.Process_Planned_Materials - l_return_status : '||l_return_status);
4996         END IF;
4997 
4998         IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
4999           RAISE FND_API.G_EXC_ERROR;
5000         END IF;
5001     END IF;
5002 
5003     -- Set any task changed flag to "Y" if start/end date changed
5004     IF NVL(TO_CHAR(l_date_time_start,'DD-MM-YYYY HH24:MI'),'XXX') <> NVL(TO_CHAR(c_Visit_rec.START_DATE_TIME,'DD-MM-YYYY HH24:MI'),'XXX')
5005     OR NVL(TO_CHAR(l_date_time_end,'DD-MM-YYYY HH24:MI'),'XXX') <> NVL(TO_CHAR(c_Visit_rec.CLOSE_DATE_TIME,'DD-MM-YYYY HH24:MI'),'XXX') THEN
5006       AHL_VWP_RULES_PVT.Update_Visit_Task_Flag
5007             (
5008               p_visit_id      => l_Visit_rec.visit_id,
5009               p_flag          => 'Y',
5010               x_return_status => l_return_status);
5011 
5012       IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
5013         RAISE FND_API.G_EXC_ERROR;
5014       END IF;
5015     END IF;
5016 
5017     -- PRAKKUM :: VWPE: ER:12424063  :: 11-APR-2011 :: START
5018     IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
5019         fnd_log.string(fnd_log.level_statement,L_DEBUG,'l_tasks_ovn_updated_count : '||l_tasks_ovn_updated_count);
5020     END IF;
5021     --Return ovn updated count to caller
5022     p_x_visit_rec.TASKS_OVN_UPDATED_COUNT := l_tasks_ovn_updated_count;
5023     -- PRAKKUM :: VWPE: ER:12424063  :: 11-APR-2011 :: END
5024 
5025      -- PRAKKUM :: VWPE: ER:12730539   :: 06-JUL-2011 :: START
5026     IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
5027         fnd_log.string(fnd_log.level_statement,L_DEBUG,'l_stages_ovn_updated_count : '||l_stages_ovn_updated_count);
5028     END IF;
5029     --Return ovn updated count to caller
5030     p_x_visit_rec.STAGES_OVN_UPDATED_COUNT := l_stages_ovn_updated_count;
5031     -- PRAKKUM :: VWPE: ER:12730539  :: 06-JUL-2011 :: END
5032 
5033     l_msg_count := Fnd_Msg_Pub.count_msg;
5034     IF l_msg_count > 0 THEN
5035       X_msg_count := l_msg_count;
5036       X_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
5037       RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
5038     END IF;
5039 
5040     --Standard check for commit
5041     IF Fnd_Api.TO_BOOLEAN(p_commit) THEN
5042       COMMIT;
5043     END IF;
5044 
5045     IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level) THEN
5046       fnd_log.string(fnd_log.level_procedure,L_DEBUG||'.end','At the end of PLSQL procedure');
5047     END IF;
5048 EXCEPTION
5049    WHEN Fnd_Api.g_exc_error THEN
5050       ROLLBACK TO Update_Visit;
5051       x_return_status := Fnd_Api.g_ret_sts_error;
5052       Fnd_Msg_Pub.count_and_get (
5053             p_encoded => Fnd_Api.g_false,
5054             p_count   => x_msg_count,
5055             p_data    => x_msg_data
5056       );
5057    WHEN Fnd_Api.g_exc_unexpected_error THEN
5058       ROLLBACK TO Update_Visit;
5059       x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
5060       Fnd_Msg_Pub.count_and_get (
5061             p_encoded => Fnd_Api.g_false,
5062             p_count   => x_msg_count,
5063             p_data    => x_msg_data
5064       );
5065    WHEN OTHERS THEN
5066       ROLLBACK TO Update_Visit;
5067       x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
5068       IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_unexp_error)
5069         THEN
5070          Fnd_Msg_Pub.add_exc_msg (G_PKG_NAME, l_api_name);
5071       END IF;
5072       Fnd_Msg_Pub.count_and_get (
5073             p_encoded => Fnd_Api.g_false,
5074             p_count   => x_msg_count,
5075             p_data    => x_msg_data
5076       );
5077 END Update_Visit;
5078 /*--------------------------------------------------------------------
5079 -- PROCEDURE
5080 --  Delete Task
5081 --  Internal procedure for deleting links for the task to be deleted.
5082 
5083 --------------------------------------------------------------------
5084 
5085 PROCEDURE Delete_Task (
5086     p_api_version       IN  NUMBER,
5087     p_init_msg_list     IN  VARCHAR2  := Fnd_Api.g_false,
5088     p_commit            IN  VARCHAR2  := Fnd_Api.g_false,
5089     p_validation_level  IN  NUMBER    := Fnd_Api.g_valid_level_full,
5090     p_module_type       IN  VARCHAR2  := Null,
5091         p_Visit_Task_Id     IN  NUMBER,
5092     x_return_status     OUT NOCOPY VARCHAR2,
5093     x_msg_count         OUT NOCOPY NUMBER,
5094     x_msg_data          OUT NOCOPY VARCHAR2
5095 )
5096 IS
5097    l_api_version    CONSTANT NUMBER       := 1.0;
5098    l_api_name       CONSTANT VARCHAR2(30) := 'Delete_Task';
5099    l_full_name      CONSTANT VARCHAR2(60) := G_PKG_NAME || '.' || l_Api_name;
5100    l_task_id        NUMBER;
5101    l_count          NUMBER;
5102 
5103 BEGIN
5104      IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level)THEN
5105         fnd_log.string
5106         (
5107             fnd_log.level_procedure,
5108             'ahl.plsql.'||G_PKG_NAME||'.'||L_API_NAME||'.begin',
5109             'At the start of Delete_Visit -> Delete Task'
5110         );
5111      END IF;
5112 
5113      IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level)THEN
5114         fnd_log.string
5115         (
5116             fnd_log.level_statement,
5117             'ahl.plsql.'||G_PKG_NAME||'.'||L_API_NAME,
5118             'p_visit_task_id : '||p_Visit_Task_Id
5119         );
5120 
5121      END IF;
5122 
5123        -- Remove the originating task association of the deleted task
5124        UPDATE
5125      AHL_VISIT_TASKS_B
5126        SET
5127      ORIGINATING_TASK_ID=NULL,
5128      OBJECT_VERSION_NUMBER = object_version_number + 1
5129        WHERE
5130      ORIGINATING_TASK_ID = p_Visit_Task_Id and NVL(STATUS_CODE,'X') <> 'DELETED';
5131 
5132 
5133        -- Remove Cost parent associations for this task
5134        UPDATE
5135     AHL_VISIT_TASKS_B
5136        SET
5137     COST_PARENT_ID = NULL,
5138     OBJECT_VERSION_NUMBER = object_version_number + 1
5139        WHERE
5140     COST_PARENT_ID = p_Visit_Task_Id AND NVL(STATUS_CODE,'X') <> 'DELETED';
5141 
5142 
5143     -- Remove Primary Task Associations in simulation visit for the deleted Task
5144     UPDATE
5145        AHL_VISIT_TASKS_B
5146     SET
5147        PRIMARY_VISIT_TASK_ID = NULL,
5148        OBJECT_VERSION_NUMBER = object_version_number + 1
5149     WHERE
5150        PRIMARY_VISIT_TASK_ID = p_Visit_Task_Id AND NVL(STATUS_CODE,'X') <> 'DELETED';
5151 
5152 
5153     -- Remove task links of the deleted task
5154     DELETE
5155        AHL_TASK_LINKS
5156     WHERE
5157        VISIT_TASK_ID = p_Visit_Task_Id
5158        OR
5159        PARENT_TASK_ID = p_Visit_Task_Id;
5160 
5161     AHL_VWP_PROJ_PROD_PVT.Delete_Task_To_project(
5162         p_api_version       => p_api_version,
5163         p_init_msg_list     => p_init_msg_list,
5164         p_commit        => Fnd_Api.g_false,
5165         p_validation_level  => p_validation_level,
5166         p_module_type       => p_module_type,
5167         p_visit_task_id     => p_Visit_Task_Id,
5168         x_return_status     => x_return_status,
5169         x_msg_count     => x_msg_count,
5170         x_msg_data      => x_msg_data);
5171 
5172     IF NVL(x_return_status, 'X') <> Fnd_Api.G_RET_STS_SUCCESS
5173     THEN
5174       -- Method call was not successful, raise error
5175       Fnd_Message.SET_NAME('AHL','AHL_VWP_PRJ_TASK_FAILED');
5176       Fnd_Msg_Pub.ADD;
5177           IF (fnd_log.level_error >= fnd_log.g_current_runtime_level)THEN
5178          fnd_log.string
5179          (
5180             fnd_log.level_error,
5181             'ahl.plsql.'||G_PKG_NAME||'.'||L_API_NAME,
5182             'Failed to delete project task association for task '||p_visit_task_id
5183          );
5184           END IF;
5185       RAISE Fnd_Api.G_EXC_ERROR;
5186     END IF;
5187 
5188     IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level)THEN
5189         fnd_log.string
5190         (
5191             fnd_log.level_procedure,
5192             'ahl.plsql.'||G_PKG_NAME||'.'||L_API_NAME||'.end',
5193             'At the end of Delete_Visit -> Delete Task'
5194         );
5195     END IF;
5196 
5197 
5198 END Delete_Task;*/
5199 --------------------------------------------------------------------
5200 -- PROCEDURE
5201 --    Delete_Visit
5202 --
5203 -- PURPOSE
5204 --    To delete a Maintainanace Visit.
5205 --------------------------------------------------------------------
5206 
5207 PROCEDURE Delete_Visit (
5208    p_api_version       IN  NUMBER,
5209    p_init_msg_list     IN  VARCHAR2  := Fnd_Api.g_false,
5210    p_commit            IN  VARCHAR2  := Fnd_Api.g_false,
5211    p_validation_level  IN  NUMBER    := Fnd_Api.g_valid_level_full,
5212    p_visit_id          IN  NUMBER,
5213    x_return_status     OUT NOCOPY VARCHAR2,
5214    x_msg_count         OUT NOCOPY NUMBER,
5215    x_msg_data          OUT NOCOPY VARCHAR2
5216 )
5217 IS
5218  -- Define local Variables
5219    l_api_version    CONSTANT NUMBER       := 1.0;
5220    l_api_name       CONSTANT VARCHAR2(30) := 'Delete_Visit';
5221    l_full_name      CONSTANT VARCHAR2(60) := G_PKG_NAME || '.' || l_Api_name;
5222    L_DEBUG            CONSTANT VARCHAR2(90) := 'ahl.plsql.'||L_FULL_NAME;
5223 
5224    l_msg_data        VARCHAR2(2000);
5225    l_return_status   VARCHAR2(1);
5226    l_msg_count       NUMBER;
5227 
5228    l_default         VARCHAR2(30);
5229    l_visit_id        NUMBER;
5230    l_commit          VARCHAR2(1) := 'F';
5231    l_init_msg_list   VARCHAR2(1) := 'F';
5232 
5233    l_soft_delete_flag   VARCHAR2(1) := 'N';
5234    l_planned_order_flag VARCHAR2(1);
5235    l_is_comp_visit      VARCHAR2(1);
5236 
5237    -- Define local Cursors
5238    -- To find visit related information
5239    CURSOR c_Visit(x_id IN NUMBER) IS
5240    SELECT * FROM  Ahl_Visits_VL
5241    WHERE VISIT_ID = x_id;
5242 
5243    l_visit_rec      c_Visit%ROWTYPE;
5244 
5245    -- To find whether the visit has any materials
5246    CURSOR c_Material(x_visit_id IN NUMBER) IS
5247 /* SELECT 'X' FROM DUAL
5248    WHERE exists (select 'X' from AHL_SCHEDULE_MATERIALS_V where VISIT_ID = x_visit_id);*/
5249 
5250    -- AnRaj: Changed for fixing the perf bug 4919502
5251    SELECT 'x' FROM   ahl_schedule_materials
5252    WHERE  status <> 'DELETED'
5253    AND    visit_id = x_visit_id;
5254 
5255    c_Material_rec   c_Material%ROWTYPE;
5256 
5257    -- To find Master Workorder associated with the given Visit in production
5258    CURSOR c_workorder_csr(x_visit_id IN NUMBER) IS
5259    SELECT workorder_id, object_version_number, status_code
5260    FROM AHL_WORKORDERS
5261    WHERE VISIT_ID = x_visit_id
5262    AND MASTER_WORKORDER_FLAG = 'Y'
5263    AND VISIT_TASK_ID IS NULL;
5264 
5265    l_workorder_rec c_workorder_csr%ROWTYPE;
5266 
5267    -- To find active Master Workorder associated with the given Visit in production
5268    CURSOR c_active_workorder(x_visit_id IN NUMBER) IS
5269    SELECT workorder_id, object_version_number, status_code
5270    FROM AHL_WORKORDERS
5271    WHERE VISIT_ID = x_visit_id
5272    AND MASTER_WORKORDER_FLAG = 'Y'
5273    AND VISIT_TASK_ID IS NULL
5274    AND STATUS_CODE not in ('22','7');  -- deleted, cancelled
5275 
5276    l_active_workorder_rec c_active_workorder%ROWTYPE;
5277 
5278    -- cursor for finding all information about the tasks
5279    CURSOR c_Tasks_csr(x_id IN NUMBER) IS
5280    -- Merge process for 11.5.10 Bug fix
5281    SELECT visit_task_id,object_version_number,visit_task_number
5282    FROM  Ahl_Visit_Tasks_VL
5283    WHERE VISIT_ID = x_id AND NVL(STATUS_CODE,'X') <> 'DELETED'
5284    AND ((TASK_TYPE_CODE = 'SUMMARY' AND ORIGINATING_TASK_ID IS NULL)
5285    OR TASK_TYPE_CODE = 'UNASSOCIATED'
5286    -- SKPATHAK :: 18-Oct-2011 :: Bug 12955463 :: Need to delete the stage tasks also
5287    OR TASK_TYPE_CODE = 'STAGE'
5288    OR (TASK_TYPE_CODE = 'SUMMARY' AND MR_ID IS NULL));
5289 
5290    l_tasks_rec c_tasks_csr%ROWTYPE;
5291 
5292    -- Local record of Workorder used while calling update job method.
5293    l_prd_workorder_rec AHL_PRD_WORKORDER_PVT.PRD_WORKORDER_REC;
5294    l_workorder_tbl AHL_PRD_WORKORDER_PVT.PRD_WORKOPER_TBL;
5295 
5296 BEGIN
5297     --------------------- Initialize -----------------------
5298     SAVEPOINT Delete_Visit;
5299 
5300     IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level) THEN
5301       fnd_log.string(fnd_log.level_procedure,L_DEBUG||'.begin','At the start of PLSQL procedure');
5302     END IF;
5303 
5304     -- Initialize message list if p_init_msg_list is set to TRUE.
5305     IF Fnd_Api.to_boolean(p_init_msg_list) THEN
5306       Fnd_Msg_Pub.initialize;
5307     END IF;
5308 
5309     --Initialize API return status to success
5310     x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
5311 
5312     -- Standard call to check for call compatibility.
5313     IF NOT Fnd_Api.COMPATIBLE_API_CALL(l_api_version,
5314                                       p_api_version,
5315                                       l_api_name,G_PKG_NAME) THEN
5316        RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
5317     END IF;
5318     ------------------------Start of API Body------------------------------------
5319     ------------------------ Delete ------------------------
5320     IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
5321       fnd_log.string(fnd_log.level_statement,L_DEBUG,'Visit ID - ' ||p_visit_id );
5322     END IF;
5323 
5324     OPEN c_Visit(p_visit_id);
5325     FETCH c_Visit INTO l_Visit_rec;
5326     IF c_Visit%NOTFOUND THEN
5327       CLOSE c_Visit;
5328       IF Fnd_Msg_Pub.check_msg_level(Fnd_Msg_Pub.g_msg_lvl_error) THEN
5329         Fnd_Message.set_name('AHL', 'AHL_API_RECORD_NOT_FOUND');
5330         Fnd_Msg_Pub.ADD;
5331         IF(fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
5332           fnd_log.string(fnd_log.level_statement,L_DEBUG,'Record not found for the visit with ID'||p_visit_id);
5333         END IF;
5334       END IF;
5335       RAISE Fnd_Api.g_exc_error;
5336     END IF;
5337     CLOSE c_Visit;
5338 
5339     -- Check the status of visit, if 'planning' then only delete
5340     IF UPPER(l_visit_rec.status_code) NOT IN ('PLANNING','DRAFT') THEN
5341       Fnd_Message.SET_NAME('AHL','AHL_VWP_STATUS_NOT_DELETE');
5342       Fnd_Msg_Pub.ADD;
5343       IF(fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
5344         fnd_log.string(fnd_log.level_statement,L_DEBUG,'Visit is in invalid status for deletion. Visit ID:  '||p_visit_id);
5345       END IF;
5346       RAISE Fnd_Api.G_EXC_ERROR;
5347     END IF;
5348 
5349     -- To Check if any materials are schedueled for the visit
5350     OPEN  c_Material(p_visit_id);
5351     FETCH c_Material INTO c_Material_rec;
5352     IF c_Material%FOUND THEN
5353       l_soft_delete_flag := 'Y';
5354 
5355       IF(fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
5356         fnd_log.string(fnd_log.level_statement,L_DEBUG,'Before calling AHL_LTP_REQST_MATRL_PVT.Process_Planned_Materials');
5357       END IF;
5358 
5359       -- Removing planned materials for the visit
5360       AHL_LTP_REQST_MATRL_PVT.Process_Planned_Materials
5361                               (p_api_version            => p_api_version,
5362                                p_init_msg_list          => Fnd_Api.G_FALSE,
5363                                p_commit                 => Fnd_Api.G_FALSE,
5364                                p_visit_id               => p_visit_id,
5365                                p_visit_task_id          => NULL,
5366                                p_org_id                 => NULL,
5367                                p_start_date             => NULL,
5368                                p_operation_flag         => 'R',
5369                                x_planned_order_flag     => l_planned_order_flag ,
5370                                x_return_status          => l_return_status,
5371                                x_msg_count              => x_msg_count,
5372                                x_msg_data               => x_msg_data);
5373 
5374       IF(fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
5375         fnd_log.string(fnd_log.level_statement,L_DEBUG,'After calling AHL_LTP_REQST_MATRL_PVT.Process_Planned_Materials - l_return_status : '||l_return_status);
5376       END IF;
5377 
5378       IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
5379         CLOSE c_Material;
5380         RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
5381       END IF;
5382     END IF;
5383     CLOSE c_Material;
5384 
5385     IF(fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
5386       fnd_log.string(fnd_log.level_statement,L_DEBUG,'Before calling AHL_LTP_SIMUL_PLAN_PVT.delete_simul_visits');
5387     END IF;
5388     -- Delete all associated simulated visits if the visit to be deleted is a primary visit
5389     AHL_LTP_SIMUL_PLAN_PVT.delete_simul_visits
5390              (p_api_version        => l_api_version,
5391               p_init_msg_list      => l_init_msg_list,
5392               p_commit             => l_commit,
5393               p_validation_level   => p_validation_level,
5394               p_visit_id           => p_visit_id,
5395               x_return_status      => l_return_status,
5396               x_msg_count          => l_msg_count,
5397               x_msg_data           => l_msg_data);
5398 
5399     IF(fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
5400       fnd_log.string(fnd_log.level_statement,L_DEBUG,'After calling AHL_LTP_SIMUL_PLAN_PVT.delete_simul_visits  - l_return_status : '||l_return_status);
5401     END IF;
5402 
5403     IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
5404       -- Check Error Message stack.
5405       x_msg_count := FND_MSG_PUB.count_msg;
5406       IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level)THEN
5407           fnd_log.string (fnd_log.level_statement,L_DEBUG,'Errors from delete_simul_visits: ' || x_msg_count );
5408       END IF;
5409       RAISE Fnd_Api.g_exc_error;
5410     END IF;
5411 
5412     -- Check for to delete the visit's tasks
5413     OPEN c_Tasks_csr(p_visit_id);
5414     LOOP
5415       FETCH c_Tasks_csr INTO l_tasks_rec;
5416       EXIT WHEN c_Tasks_csr%NOTFOUND;
5417 
5418       IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level)THEN
5419           fnd_log.string (fnd_log.level_statement,L_DEBUG,'Before calling AHL_VWP_TASKS_PVT.Delete_Task - visit_task_id : '||l_tasks_rec.visit_task_id);
5420       END IF;
5421 
5422       l_soft_delete_flag := 'Y';  -- If tasks are set only soft delete needs to be done.
5423 
5424       -- Call Delete_Task to remove all the task associations for the deleted task
5425       AHL_VWP_TASKS_PVT.Delete_Task
5426             (   p_api_version           => p_api_version,
5427                 p_init_msg_list         => l_init_msg_list,
5428                 p_commit                => l_commit,
5429                 p_validation_level      => p_validation_level,
5430                 p_module_type           => NULL,
5431                 p_visit_task_id         => l_tasks_rec.visit_task_id,
5432                 x_return_status         => l_return_status,
5433                 x_msg_count             => x_msg_count,
5434                 x_msg_data              => x_msg_data);
5435 
5436       IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level)THEN
5437           fnd_log.string (fnd_log.level_statement,L_DEBUG,'After calling Delete_Task - l_return_status : '||l_return_status);
5438       END IF;
5439 
5440       IF NVL(l_return_status, 'X') <> Fnd_Api.G_RET_STS_SUCCESS THEN
5441           CLOSE c_Tasks_csr;
5442           Fnd_Message.SET_NAME('AHL','AHL_VWP_TASK_DEL_FAILED');
5443           Fnd_Message.SET_TOKEN('TASK_NAME',l_tasks_rec.visit_task_number);
5444           Fnd_Msg_Pub.ADD;
5445           RAISE Fnd_Api.G_EXC_ERROR;
5446       END IF;
5447     END LOOP;
5448     CLOSE c_Tasks_csr;
5449 
5450     -- 11.5.10 Change starts here
5451     -- Check if the Visit to be deleted has Master Workorder in production
5452     OPEN c_workorder_csr(p_visit_id);
5453     FETCH c_workorder_csr INTO l_workorder_rec;
5454     -- Master workorder not found
5455     IF c_workorder_csr%FOUND THEN
5456       l_soft_delete_flag := 'Y';
5457       IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level)THEN
5458           fnd_log.string (fnd_log.level_statement,L_DEBUG,'Visit Has workorder associated with status code '||l_workorder_rec.STATUS_CODE);
5459       END IF;
5460 
5461       OPEN c_active_workorder(p_visit_id);
5462       FETCH c_active_workorder INTO l_active_workorder_rec;
5463       -- Found Active Master workorder, then cancel all visit jobs.
5464       IF c_active_workorder%FOUND THEN
5465         -- delete visit master workorder
5466         l_prd_workorder_rec.workorder_id := l_active_workorder_rec.workorder_id;
5467         l_prd_workorder_rec.object_version_number := l_active_workorder_rec.object_version_number;
5468         l_prd_workorder_rec.STATUS_CODE:='22'; --Deleted Status Refer DLD to Verify.
5469 
5470         IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level)THEN
5471           fnd_log.string (fnd_log.level_statement,L_DEBUG,'before calling AHL_PRD_WORKORDER_PVT.update_job - Workorder Id : '||l_prd_workorder_rec.workorder_id);
5472         END IF;
5473 
5474         AHL_PRD_WORKORDER_PVT.update_job
5475                    (  p_api_version          =>1.0,
5476                       p_init_msg_list        =>fnd_api.g_false,
5477                       p_commit               =>fnd_api.g_false,
5478                       p_validation_level     =>p_validation_level,
5479                       p_default              =>fnd_api.g_false,
5480                       p_module_type          =>NULL,
5481                       x_return_status        =>l_return_status,
5482                       x_msg_count            =>x_msg_count,
5483                       x_msg_data             =>x_msg_data,
5484                       p_wip_load_flag        =>'Y',
5485                       p_x_prd_workorder_rec  =>l_prd_workorder_rec,
5486                       p_x_prd_workoper_tbl   =>l_workorder_tbl
5487                    );
5488 
5489         IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level)THEN
5490           fnd_log.string (fnd_log.level_statement,L_DEBUG,'after calling AHL_PRD_WORKORDER_PVT.update_job - l_return_status : '||l_return_status);
5491         END IF;
5492 
5493         IF NVL(l_return_status, 'X') <> Fnd_Api.G_RET_STS_SUCCESS THEN
5494            CLOSE c_active_workorder;
5495            CLOSE c_workorder_csr;
5496            RAISE Fnd_Api.G_EXC_ERROR;
5497         END IF;
5498       END IF;
5499       CLOSE c_active_workorder;
5500     END IF;
5501     CLOSE c_workorder_csr;
5502 
5503     IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level)THEN
5504       fnd_log.string (fnd_log.level_statement,L_DEBUG,'PROJECT_ID : '||l_visit_rec.PROJECT_ID);
5505     END IF;
5506 
5507     -- Delete or cancel project and project tasks
5508     IF l_visit_rec.PROJECT_ID IS NOT NULL THEN
5509       IF l_soft_delete_flag = 'Y' THEN
5510           -- Update the project status to 'Rejected'
5511         IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level)THEN
5512           fnd_log.string (fnd_log.level_statement,L_DEBUG,'before calling AHL_VWP_PROJ_PROD_PVT.Update_project');
5513         END IF;
5514 
5515         AHL_VWP_PROJ_PROD_PVT.Update_project
5516               ( p_api_version           => p_api_version,
5517                 p_init_msg_list         => l_init_msg_list,
5518                 p_commit                => l_commit,
5519                 p_validation_level      => p_validation_level,
5520                 p_module_type           => 'DEL',
5521                 p_visit_id              => p_visit_id,
5522                 x_return_status         => l_return_status,
5523                 x_msg_count             => x_msg_count,
5524                 x_msg_data              => x_msg_data
5525               );
5526 
5527         IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level)THEN
5528           fnd_log.string (fnd_log.level_statement,L_DEBUG,'after calling AHL_VWP_PROJ_PROD_PVT.Update_project - l_return_status : '||l_return_status);
5529         END IF;
5530 
5531         IF NVL(l_return_status, 'X') <> Fnd_Api.G_RET_STS_SUCCESS THEN
5532           Fnd_Message.SET_NAME('AHL','AHL_VWP_PRJ_UPDATE_FAILED'); -- Failed to update job
5533           Fnd_Msg_Pub.ADD;
5534           RAISE Fnd_Api.G_EXC_ERROR;
5535         END IF;
5536       ELSE
5537         -- When a visit is hard deleted than the related projects is also deleted
5538         -- Call Delete_Project local procedure to delete project and its tasks
5539         IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level)THEN
5540           fnd_log.string (fnd_log.level_statement,L_DEBUG,'before calling AHL_VWP_PROJ_PROD_PVT.Delete_Project ');
5541         END IF;
5542 
5543         AHL_VWP_PROJ_PROD_PVT.Delete_Project
5544             (   p_api_version           => p_api_version,
5545                 p_init_msg_list         => l_init_msg_list,
5546                 p_commit                => l_commit,
5547                 p_validation_level      => p_validation_level,
5548                 p_module_type           => NULL,
5549                 p_visit_id              => p_visit_id,
5550                 x_return_status         => l_return_status,
5551                 x_msg_count             => x_msg_count,
5552                 x_msg_data              => x_msg_data);
5553 
5554         IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level)THEN
5555           fnd_log.string (fnd_log.level_statement,L_DEBUG,'after calling AHL_VWP_PROJ_PROD_PVT.Delete_Project - l_return_status : '||l_return_status);
5556         END IF;
5557 
5558         IF NVL(l_return_status, 'X') <> Fnd_Api.G_RET_STS_SUCCESS THEN
5559           -- Method call was not successful, raise error
5560           Fnd_Message.SET_NAME('AHL','AHL_VWP_PRJ_DEL_FAILED');
5561           Fnd_Msg_Pub.ADD;
5562           RAISE Fnd_Api.G_EXC_ERROR;
5563         END IF;
5564       END IF;  -- soft delete flag
5565     END IF; -- project id not null
5566 
5567     -- delete stages in the case of physical delete
5568     IF l_soft_delete_flag = 'N' THEN
5569 
5570         /* MANESING::Component Maintenance Planning Project, 05-Jul-2011
5571          * There is no need to delete Stages for Component Visits as there won't be any Stage associated with them.
5572          */
5573         l_is_comp_visit := AHL_CMP_UTIL_PKG.Is_Comp_Visit (l_visit_rec.visit_id);
5574         IF (l_is_comp_visit = 'N') THEN
5575 
5576           -- SKPATHAK :: 02-MAY-2011 :: VWPE: ER:12424063  :: changed the API name from DELETE_STAGES to DELETE_ALL_STAGES
5577           IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level)THEN
5578             fnd_log.string (fnd_log.level_statement,L_DEBUG,'before calling AHL_VWP_VISITS_STAGES_PVT.DELETE_ALL_STAGES ');
5579           END IF;
5580 
5581           AHL_VWP_VISITS_STAGES_PVT.DELETE_ALL_STAGES
5582                 ( p_api_version           => p_api_version,
5583                   p_init_msg_list         => l_init_msg_list,
5584                   p_commit                => l_commit,
5585                   p_validation_level      => p_validation_level,
5586                   p_module_type           => NULL,
5587                   p_visit_id              => l_visit_rec.visit_id,
5588                   x_return_status         => l_return_status,
5589                   x_msg_count             => x_msg_count,
5590                   x_msg_data              => x_msg_data
5591                 );
5592 
5593           IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level)THEN
5594             fnd_log.string (fnd_log.level_statement,L_DEBUG,'after calling AHL_VWP_VISITS_STAGES_PVT.DELETE_ALL_STAGES - l_return_status : '||l_return_status );
5595           END IF;
5596 
5597           IF NVL(l_return_status, 'X') <> Fnd_Api.G_RET_STS_SUCCESS THEN
5598             RAISE Fnd_Api.G_EXC_ERROR;
5599           END IF;
5600 
5601         END IF; -- if l_is_comp_visit = 'N'
5602 
5603         DELETE FROM ahl_visit_tasks_b
5604         WHERE  visit_id = p_visit_id;
5605 
5606         --Delete the visit
5607         AHL_VISITS_PKG.Delete_Row( x_visit_id => p_visit_id);
5608     ELSE
5609        -- Soft Delete
5610         UPDATE AHL_VISITS_B
5611         SET STATUS_CODE = 'DELETED',
5612             SIMULATION_PLAN_ID = NULL,
5613             OBJECT_VERSION_NUMBER =OBJECT_VERSION_NUMBER + 1,
5614             --TCHIMIRA::FP BUG 12668460 for BUG 12607498 ::14-JUN-2011::UPDATE WHO COLUMNS
5615             LAST_UPDATE_DATE      = SYSDATE,
5616             LAST_UPDATED_BY       = Fnd_Global.USER_ID,
5617             LAST_UPDATE_LOGIN     = Fnd_Global.LOGIN_ID
5618         WHERE VISIT_ID =  l_visit_rec.visit_id;
5619     END IF; -- soft delete flag
5620     --------------------------End of API Body---------------------------------------
5621     --Standard check to count messages
5622     l_msg_count := Fnd_Msg_Pub.count_msg;
5623 
5624     IF l_msg_count > 0 THEN
5625       X_msg_count := l_msg_count;
5626       X_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
5627       RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
5628     END IF;
5629 
5630     --Standard check for commit
5631     IF Fnd_Api.TO_BOOLEAN(p_commit) THEN
5632       COMMIT;
5633     END IF;
5634 
5635     IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level) THEN
5636       fnd_log.string(fnd_log.level_procedure,L_DEBUG||'.end','At the end of PLSQL procedure');
5637     END IF;
5638 EXCEPTION
5639    WHEN Fnd_Api.g_exc_error THEN
5640       ROLLBACK TO Delete_Visit;
5641       x_return_status := Fnd_Api.g_ret_sts_error;
5642       Fnd_Msg_Pub.count_and_get (
5643             p_encoded => Fnd_Api.g_false,
5644             p_count   => x_msg_count,
5645             p_data    => x_msg_data
5646       );
5647    WHEN Fnd_Api.g_exc_unexpected_error THEN
5648       ROLLBACK TO Delete_Visit;
5649       x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
5650       Fnd_Msg_Pub.count_and_get (
5651             p_encoded => Fnd_Api.g_false,
5652             p_count   => x_msg_count,
5653             p_data    => x_msg_data
5654       );
5655    WHEN OTHERS THEN
5656       ROLLBACK TO Delete_Visit;
5657       x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
5658       IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_unexp_error)
5659         THEN
5660          Fnd_Msg_Pub.add_exc_msg (G_PKG_NAME, l_api_name);
5661       END IF;
5662       Fnd_Msg_Pub.count_and_get (
5663             p_encoded => Fnd_Api.g_false,
5664             p_count   => x_msg_count,
5665             p_data    => x_msg_data
5666       );
5667 END Delete_Visit;
5668 --------------------------------------------------------------------
5669 -- PROCEDURE
5670 --   Validate_Visit
5671 --
5672 --------------------------------------------------------------------
5673 PROCEDURE Validate_Visit (
5674    p_api_version       IN  NUMBER,
5675    p_init_msg_list     IN  VARCHAR2  := Fnd_Api.g_false,
5676    p_commit            IN  VARCHAR2  := Fnd_Api.g_false,
5677    p_validation_level  IN  NUMBER    := Fnd_Api.g_valid_level_full,
5678    p_Visit_rec         IN  Visit_Rec_Type,
5679    x_return_status     OUT NOCOPY VARCHAR2,
5680    x_msg_count         OUT NOCOPY NUMBER,
5681    x_msg_data          OUT NOCOPY VARCHAR2
5682 )
5683 IS
5684 
5685 /* MANESING::Component Maintenance Planning Project, 05-Jul-2011, added following cursor
5686  * Cursor to check whether it's a Component Visit given the visit type code.
5687  */
5688 CURSOR chk_comp_visit_csr (c_visit_type_code VARCHAR2) IS
5689     SELECT 'Y'
5690     FROM   AHL_VISIT_TYPES_B
5691     WHERE  visit_type_code      = c_visit_type_code
5692     AND    status_code          = 'COMPLETE'
5693     AND    component_visit_flag = 'Y';
5694 
5695 /* MANESING::Component Maintenance Planning Project, 20-Dec-2011, added following cursor
5696  * Cursor to find all unlocked Component Visits for the given organization other than current visit.
5697  */
5698 CURSOR get_unlocked_comp_visits_csr (c_org_id NUMBER, c_visit_id NUMBER) IS
5699     SELECT AVB.visit_id,
5700            AVB.visit_number,
5701            AVB.start_date_time,
5702            AVB.close_date_time
5703 
5704     FROM   AHL_VISITS_B      AVB,
5705            AHL_VISIT_TYPES_B AVTB
5706 
5707     WHERE  AVB.organization_id        = c_org_id
5708     AND    AVB.visit_type_code        = AVTB.visit_type_code
5709     AND    AVTB.status_code           = 'COMPLETE'
5710     AND    AVTB.component_visit_flag  = 'Y'
5711     AND    NVL(AVB.locked_flag, 'N')  = 'N'
5712     AND    AVB.visit_id               <> NVL(c_visit_id, 0)
5713     AND    AVB.status_code NOT IN ('CANCELLED','CLOSED','DELETED');-- PRAKKUM :: BUG 14542057 :: 31/08/2012
5714 
5715  -- Define local Variables
5716    L_API_VERSION CONSTANT NUMBER := 1.0;
5717    L_API_NAME    CONSTANT VARCHAR2(30) := 'Validate_Visit';
5718    L_FULL_NAME   CONSTANT VARCHAR2(60) := G_PKG_NAME || '.' || L_API_NAME;
5719    L_DEBUG       CONSTANT VARCHAR2(90) := 'ahl.plsql.'||L_FULL_NAME;
5720 
5721    l_return_status        VARCHAR2(1);
5722    l_msg_count            NUMBER;
5723    l_msg_data             VARCHAR2(2000);
5724 
5725    l_validation_mode      VARCHAR2(30);
5726    l_is_comp_visit        VARCHAR2(1);
5727    l_overlap_comp_visits  VARCHAR2(2000);
5728 
5729 BEGIN
5730     --------------------- Initialize -----------------------
5731     IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level) THEN
5732       fnd_log.string(fnd_log.level_procedure,L_DEBUG||'.begin','At the start of PLSQL procedure');
5733     END IF;
5734 
5735     IF Fnd_Api.to_boolean (p_init_msg_list) THEN
5736       Fnd_Msg_Pub.initialize;
5737     END IF;
5738 
5739     IF NOT Fnd_Api.compatible_api_call (
5740          l_api_version,
5741          p_api_version,
5742          l_api_name,
5743          G_PKG_NAME
5744     ) THEN
5745       RAISE Fnd_Api.g_exc_unexpected_error;
5746     END IF;
5747     x_return_status := Fnd_Api.g_ret_sts_success;
5748 
5749     ---------------------- validate ------------------------
5750     IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
5751       fnd_log.string(fnd_log.level_statement,L_DEBUG,'Calling Check_Visit_Items');
5752     END IF;
5753 
5754     IF p_validation_level >= Jtf_Plsql_Api.g_valid_level_item THEN
5755 
5756       /* MANESING::Component Maintenance Planning Project, 05-Jul-2011
5757        * Assign validation mode according to the operation flag.
5758        * This change is required as this API is now called from update_visit API too for common validations.
5759        */
5760       IF (UPPER(p_Visit_rec.operation_flag) = 'C') THEN
5761         l_validation_mode := JTF_PLSQL_API.g_create;
5762       ELSIF (UPPER(p_Visit_rec.operation_flag) = 'U') THEN
5763         l_validation_mode := JTF_PLSQL_API.g_update;
5764       END IF;
5765 
5766       Check_Visit_Items (
5767          p_Visit_rec          => p_Visit_rec,
5768          p_validation_mode    => l_validation_mode, -- Jtf_Plsql_Api.g_create,
5769          x_return_status      => l_return_status
5770       );
5771 
5772       IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
5773         fnd_log.string(fnd_log.level_statement,L_DEBUG,'After calling Check_Visit_Items - l_return_status : '||l_return_status);
5774       END IF;
5775 
5776       IF l_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
5777          RAISE Fnd_Api.g_exc_unexpected_error;
5778       ELSIF l_return_status = Fnd_Api.g_ret_sts_error THEN
5779          RAISE Fnd_Api.g_exc_error;
5780       END IF;
5781     END IF;
5782 
5783     /* MANESING::Component Maintenance Planning Project, 05-Jul-2011
5784      * Check whether it's a Component Visit (two step process).
5785      */
5786     -- Step 1
5787     OPEN chk_comp_visit_csr (p_visit_rec.visit_type_code);
5788     FETCH chk_comp_visit_csr INTO l_is_comp_visit;
5789     CLOSE chk_comp_visit_csr;
5790 
5791     -- Step 2
5792     IF (l_is_comp_visit = 'Y' AND
5793         AHL_VWP_VISITS_PVT.Is_Old_Visit (p_visit_rec.visit_id) = 'Y') THEN
5794         l_is_comp_visit := 'N';
5795     END IF;
5796 
5797     /* MANESING::Component Maintenance Planning Project, 05-Jul-2011
5798      * Do necessary validations for creating/updating a visit.
5799      */
5800     IF (l_is_comp_visit = 'Y') THEN
5801 
5802       -- 1. Validate Component Visit if it's in Draft or Planning status.
5803       IF (p_visit_rec.status_code IN ('DRAFT', 'PLANNING')) THEN
5804 
5805         IF (l_log_statement >= l_log_current_level) THEN
5806           FND_LOG.string(l_log_statement, l_debug, ' Invoking Validate_Component_Visit API for visit_id = ' || p_visit_rec.visit_id);
5807         END IF;
5808 
5809         Validate_Component_Visit
5810         (
5811           p_api_version      => 1.0,
5812           p_init_msg_list    => FND_API.G_FALSE,
5813           p_commit           => FND_API.G_FALSE,
5814           p_validation_level => FND_API.G_VALID_LEVEL_FULL,
5815           p_module_type      => null,
5816           p_visit_rec        => p_visit_rec,
5817           x_return_status    => l_return_status,
5818           x_msg_count        => l_msg_count,
5819           x_msg_data         => l_msg_data
5820         );
5821 
5822         IF (l_log_statement >= l_log_current_level) THEN
5823           FND_LOG.string(l_log_statement, l_debug, ' After call to Validate_Component_Visit API, Return Status = ' || l_return_status);
5824         END IF;
5825 
5826         IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
5827           x_return_status := l_return_status;
5828           x_msg_count := l_msg_count;
5829           x_msg_data  := l_msg_data;
5830 
5831           IF (l_return_status = FND_API.G_RET_STS_ERROR) THEN
5832             RAISE FND_API.G_EXC_ERROR;
5833           ELSIF (l_return_status = FND_API.G_RET_STS_UNEXP_ERROR) THEN
5834             RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5835           END IF;
5836         END IF;
5837 
5838       END IF; -- if p_visit_rec.status_code IN ('DRAFT', 'PLANNING')
5839 
5840       -- 2. Only one unlocked Component Visit per Organization can exists during any duration.
5841       IF (NVL(p_visit_rec.locked_flag, 'N') = 'N') THEN
5842 
5843         -- Ensure that the current visit does not have overlapping duration with any other
5844         -- unlocked Component Visit for this organization
5845         FOR comp_visit_rec IN get_unlocked_comp_visits_csr (p_visit_rec.organization_id, p_visit_rec.visit_id) LOOP
5846 
5847           -- Added the last condition below as a fix for the bug 13707528 by TCHIMIRA on 15- FEB-2012
5848           IF ((p_visit_rec.start_date    BETWEEN comp_visit_rec.start_date_time AND comp_visit_rec.close_date_time) OR
5849               (p_visit_rec.plan_end_date BETWEEN comp_visit_rec.start_date_time AND comp_visit_rec.close_date_time) OR
5850               ((comp_visit_rec.start_date_time BETWEEN p_visit_rec.start_date AND p_visit_rec.plan_end_date) AND
5851               (comp_visit_rec.close_date_time BETWEEN p_visit_rec.start_date AND p_visit_rec.plan_end_date))) THEN
5852 
5853             l_return_status := FND_API.G_RET_STS_ERROR;
5854             --TCHIMIRA :: 10-JAN-2012 :: Include the visit start and end dates also in the error message
5855             IF (l_overlap_comp_visits IS NULL) THEN
5856               l_overlap_comp_visits := 'visit number ' || comp_visit_rec.visit_number || ' having start date '
5857               ||comp_visit_rec.start_date_time ||' and planned end date ' ||comp_visit_rec.close_date_time;
5858             ELSE
5859               l_overlap_comp_visits := l_overlap_comp_visits || ', visit number ' || comp_visit_rec.visit_number||
5860               ' having start date '||comp_visit_rec.start_date_time|| ' and planned end date '
5861               ||comp_visit_rec.close_date_time;
5862             END IF;
5863 
5864           END IF;
5865         END LOOP;
5866 
5867         IF (l_return_status = FND_API.G_RET_STS_ERROR) THEN
5868           FND_MESSAGE.set_name(G_APP_NAME, 'AHL_VWP_COMP_VST_EXISTS');
5869           FND_MESSAGE.set_token('VISIT_NUM', l_overlap_comp_visits);
5870           FND_MSG_PUB.add;
5871           RAISE FND_API.G_EXC_ERROR;
5872         END IF;
5873       END IF; -- if NVL(p_visit_rec.locked_flag, 'N') = 'N'
5874 
5875     ELSE
5876       -- Unit is mandatory for Non Component Visits
5877       IF (p_visit_rec.unit_name IS NULL ) THEN
5878         FND_MESSAGE.set_name(G_APP_NAME, 'AHL_VWP_NON_COMP_UC_NULL');
5879         FND_MSG_PUB.add;
5880       END IF;
5881 
5882     END IF;
5883 
5884     -------------------- finish --------------------------
5885     Fnd_Msg_Pub.count_and_get (
5886          p_encoded => Fnd_Api.g_false,
5887          p_count   => x_msg_count,
5888          p_data    => x_msg_data
5889     );
5890 
5891     IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level) THEN
5892       fnd_log.string(fnd_log.level_procedure,L_DEBUG||'.end','At the end of PLSQL procedure');
5893     END IF;
5894 
5895 EXCEPTION
5896    WHEN Fnd_Api.g_exc_error THEN
5897       x_return_status := Fnd_Api.g_ret_sts_error;
5898       Fnd_Msg_Pub.count_and_get (
5899             p_encoded => Fnd_Api.g_false,
5900             p_count   => x_msg_count,
5901             p_data    => x_msg_data
5902       );
5903    WHEN Fnd_Api.g_exc_unexpected_error THEN
5904       x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
5905       Fnd_Msg_Pub.count_and_get (
5906             p_encoded => Fnd_Api.g_false,
5907             p_count   => x_msg_count,
5908             p_data    => x_msg_data
5909       );
5910    WHEN OTHERS THEN
5911       x_return_status := Fnd_Api.g_ret_sts_unexp_error;
5912       IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_unexp_error) THEN
5913          Fnd_Msg_Pub.add_exc_msg (G_PKG_NAME, l_api_name);
5914       END IF;
5915       Fnd_Msg_Pub.count_and_get (
5916             p_encoded => Fnd_Api.g_false,
5917             p_count   => x_msg_count,
5918             p_data    => x_msg_data
5919       );
5920 END Validate_Visit;
5921 
5922 ------------------------------------------------------------------------------------
5923 -- MANESING::Component Maintenance Planning Project, 05-Jul-2011, added following procedure
5924 -- Start of Comments
5925 --  Procedure name    : Validate_Component_Visit
5926 --  Type              : Public
5927 --  Function          : Procedure to validate a Component Visit. Basically it checks for all the
5928 --                      mandatory attributes required for a Component Visit.
5929 --
5930 --  Pre-reqs          :
5931 --  Parameters        :
5932 --
5933 --  Validate_Component_Visit Parameters:
5934 --      p_visit_rec     IN              Given Component Visit record.   Required
5935 --
5936 --  End of Comments
5937 
5938 PROCEDURE Validate_Component_Visit
5939 (
5940     p_api_version         IN            NUMBER    := 1.0,
5941     p_init_msg_list       IN            VARCHAR2  := FND_API.G_TRUE,
5942     p_commit              IN            VARCHAR2  := FND_API.G_FALSE,
5943     p_validation_level    IN            NUMBER    := FND_API.G_VALID_LEVEL_FULL,
5944     p_module_type         IN            VARCHAR2,
5945     p_visit_rec           IN            VISIT_REC_TYPE,
5946     x_return_status       OUT NOCOPY    VARCHAR2,
5947     x_msg_count           OUT NOCOPY    NUMBER,
5948     x_msg_data            OUT NOCOPY    VARCHAR2
5949 ) IS
5950 
5951 --
5952 l_api_version    CONSTANT NUMBER        := 1.0;
5953 l_api_name       CONSTANT VARCHAR2(30)  := 'Validate_Component_Visit';
5954 l_full_name      CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || l_api_name;
5955 
5956 l_msg_count               NUMBER;
5957 --
5958 
5959 BEGIN
5960     IF (l_log_procedure >= l_log_current_level) THEN
5961         FND_LOG.string(l_log_procedure, l_full_name || '.begin', 'At the start of the API');
5962     END IF;
5963 
5964     -- Standard call to check for call compatibility
5965     IF NOT FND_API.compatible_api_call(l_api_version, p_api_version,
5966                                        l_api_name, G_PKG_NAME) THEN
5967         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5968     END IF;
5969 
5970     -- Initialize message list if p_init_msg_list is set to TRUE
5971     IF FND_API.to_boolean(p_init_msg_list) THEN
5972         FND_MSG_PUB.initialize;
5973     END IF;
5974 
5975     -- Initialize Procedure return status to success
5976     x_return_status := FND_API.G_RET_STS_SUCCESS;
5977     l_msg_count := FND_MSG_PUB.count_msg;
5978 
5979     IF (l_log_statement >= l_log_current_level) THEN
5980         FND_LOG.string(l_log_statement, l_full_name, ' visit_id = ' || p_visit_rec.visit_id);
5981     END IF;
5982 
5983     -- Check the mandatory attributes that are required for a Component Visit
5984     -- 1. Organization
5985     IF (p_visit_rec.organization_id IS NULL) THEN
5986         IF (l_log_statement >= l_log_current_level) THEN
5987             FND_LOG.string(l_log_statement, l_full_name, ' 1. Organization failed.');
5988         END IF;
5989         FND_MESSAGE.set_name(G_APP_NAME, 'AHL_VWP_COMP_VST_ORG_NULL');
5990         FND_MSG_PUB.add;
5991     END IF;
5992 
5993     -- 2. Department
5994     IF (p_visit_rec.department_id IS NULL) THEN
5995         IF (l_log_statement >= l_log_current_level) THEN
5996             FND_LOG.string(l_log_statement, l_full_name, ' 2. Department failed.');
5997         END IF;
5998         FND_MESSAGE.set_name(G_APP_NAME, 'AHL_VWP_COMP_VST_DEPT_NULL');
5999         FND_MSG_PUB.add;
6000     END IF;
6001 
6002     -- 3. Start Date
6003     IF (p_visit_rec.start_date IS NULL) THEN
6004         IF (l_log_statement >= l_log_current_level) THEN
6005             FND_LOG.string(l_log_statement, l_full_name, ' 3. Start Date.');
6006         END IF;
6007         FND_MESSAGE.set_name(G_APP_NAME, 'AHL_VWP_COMP_VST_ST_DT_NULL');
6008         FND_MSG_PUB.add;
6009     END IF;
6010 
6011     -- 4. Planned End Date
6012     IF (p_visit_rec.plan_end_date IS NULL) THEN
6013         IF (l_log_statement >= l_log_current_level) THEN
6014             FND_LOG.string(l_log_statement, l_full_name, ' 4. Planned End Date.');
6015         END IF;
6016         FND_MESSAGE.set_name(G_APP_NAME, 'AHL_VWP_COMP_VST_END_DT_NULL');
6017         FND_MSG_PUB.add;
6018     END IF;
6019 
6020     -- 5. Planning and In-Repair Sub Inventory and Locator
6021     IF (p_visit_rec.comp_planning_loc_id IS NULL OR p_visit_rec.comp_inrepair_loc_id IS NULL) THEN
6022         IF (l_log_statement >= l_log_current_level) THEN
6023             FND_LOG.string(l_log_statement, l_full_name, ' 5. Planning and In-Repair Sub Inventory and Locator.');
6024         END IF;
6025         FND_MESSAGE.set_name(G_APP_NAME, 'AHL_VWP_COMP_VST_SUBINV_NULL');
6026         FND_MSG_PUB.add;
6027     END IF;
6028 
6029     -- Firm Visit Flag must be NO
6030     IF (p_visit_rec.firmed_flag = 'Y') THEN
6031         IF (l_log_statement >= l_log_current_level) THEN
6032             FND_LOG.string(l_log_statement, l_full_name, ' 6.Firm Visit Flag must be NO.');
6033         END IF;
6034         FND_MESSAGE.set_name(G_APP_NAME, 'AHL_VWP_COMP_VST_NO_FIRM');
6035         FND_MSG_PUB.add;
6036     END IF;
6037 
6038     -- If any errors occured, then raise them.
6039     IF (FND_MSG_PUB.count_msg > l_msg_count) THEN
6040         IF (l_log_statement >= l_log_current_level) THEN
6041             FND_LOG.string(l_log_statement, l_full_name, ' Some validations in Validate_Component_Visit API failed.');
6042         END IF;
6043         RAISE FND_API.G_EXC_ERROR;
6044     END IF;
6045 
6046     IF (l_log_procedure >= l_log_current_level) THEN
6047         FND_LOG.string(l_log_procedure, l_full_name || '.end', 'At the end of the API');
6048     END IF;
6049 
6050 EXCEPTION
6051     WHEN FND_API.G_EXC_ERROR THEN
6052         x_return_status := FND_API.G_RET_STS_ERROR;
6053         FND_MSG_PUB.count_and_get(p_encoded => FND_API.G_FALSE,
6054                                   p_count   => x_msg_count,
6055                                   p_data    => x_msg_data);
6056 
6057         IF (l_log_statement >= l_log_current_level) THEN
6058             FND_LOG.string(l_log_statement, l_full_name, ' Expected Exception: ' || x_msg_data);
6059         END IF;
6060 
6061     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
6062         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6063         FND_MSG_PUB.count_and_get(p_encoded => FND_API.G_FALSE,
6064                                   p_count   => x_msg_count,
6065                                   p_data    => x_msg_data);
6066 
6067         IF (l_log_statement >= l_log_current_level) THEN
6068             FND_LOG.string(l_log_statement, l_full_name, ' Unexpected Exception: ' || x_msg_data);
6069         END IF;
6070 
6071     WHEN OTHERS THEN
6072         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6073 
6074         IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
6075             FND_MSG_PUB.add_exc_msg(p_pkg_name       => G_PKG_NAME,
6076                                     p_procedure_name => l_api_name,
6077                                     p_error_text     => SUBSTRB(SQLERRM, 1, 240));
6078         END IF;
6079         FND_MSG_PUB.count_and_get(p_encoded => FND_API.G_FALSE,
6080                                   p_count   => x_msg_count,
6081                                   p_data    => x_msg_data);
6082 
6083         IF (l_log_statement >= l_log_current_level) THEN
6084             FND_LOG.string(l_log_statement, l_full_name, ' Other Exception: ' || x_msg_data);
6085         END IF;
6086 
6087 END Validate_Component_Visit;
6088 ------------------------------------------------------------------------------------
6089 
6090 ---------------------------------------------------------------------
6091 -- PROCEDURE
6092 --    Check_Visit_Items
6093 --
6094 ---------------------------------------------------------------------
6095 PROCEDURE Check_Visit_Items (
6096    p_Visit_rec       IN  Visit_Rec_Type,
6097    p_validation_mode IN  VARCHAR2 := Jtf_Plsql_Api.g_create,
6098    x_return_status   OUT NOCOPY VARCHAR2
6099 )
6100 IS
6101 BEGIN
6102    -- Validate required items.
6103    Check_Visit_Req_Items (
6104       p_Visit_rec       => p_Visit_rec,
6105       x_return_status   => x_return_status
6106    );
6107 
6108    IF x_return_status <> Fnd_Api.g_ret_sts_success THEN
6109       RETURN;
6110    END IF;
6111 
6112    -- Validate uniqueness.
6113    Check_Visit_UK_Items (
6114       p_Visit_rec          => p_Visit_rec,
6115       p_validation_mode    => p_validation_mode,
6116       x_return_status      => x_return_status
6117    );
6118 
6119    IF x_return_status <> Fnd_Api.g_ret_sts_success THEN
6120       RETURN;
6121    END IF;
6122 
6123 END Check_Visit_Items;
6124 
6125 ---------------------------------------------------------------------
6126 -- PROCEDURE
6127 --       Check_Visit_Req_Items
6128 ---------------------------------------------------------------------
6129 PROCEDURE Check_Visit_Req_Items (
6130    p_Visit_rec       IN    Visit_Rec_Type,
6131    x_return_status   OUT   NOCOPY VARCHAR2
6132 )
6133 IS
6134 BEGIN
6135 -- Post 11.5.10 Enhancements
6136 -- Only visit name is mandatory on create/update visit pages
6137      -- VISIT NAME
6138    IF (p_Visit_rec.visit_name IS NULL OR p_Visit_rec.visit_name = Fnd_Api.G_MISS_CHAR) THEN
6139       IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_error) THEN
6140          Fnd_Message.set_name ('AHL', 'AHL_VWP_VST_NAME_MISSING');
6141          Fnd_Msg_Pub.ADD;
6142       END IF;
6143       x_return_status := Fnd_Api.g_ret_sts_error;
6144       RETURN;
6145    END IF;
6146 
6147 /*     -- VISIT TYPE ==== VISIT_TYPE_CODE
6148    IF (p_Visit_rec.visit_type_code IS NULL OR p_Visit_rec.visit_type_code = Fnd_Api.G_MISS_CHAR)THEN
6149       IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_error) THEN
6150          Fnd_Message.set_name ('AHL', 'AHL_VWP_TYPE_MISSING');
6151          Fnd_Msg_Pub.ADD;
6152       END IF;
6153       x_return_status := Fnd_Api.g_ret_sts_error;
6154       RETURN;
6155    END IF;
6156 */
6157 /*   IF p_Visit_rec.VISIT_ID IS NULL THEN
6158      -- ITEM ==== INVENTORY_ITEM_ID
6159       IF (p_Visit_rec.ITEM_NAME IS NULL OR p_Visit_rec.ITEM_NAME = Fnd_Api.G_MISS_CHAR) THEN
6160           IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_error) THEN
6161              Fnd_Message.set_name ('AHL', 'AHL_VWP_ITEM_MISSING');
6162              Fnd_Msg_Pub.ADD;
6163           END IF;
6164           x_return_status := Fnd_Api.g_ret_sts_error;
6165           RETURN;
6166        END IF;
6167 */
6168 /*     -- SERIAL NUMBER ==== ITEM_INSTANCE_ID
6169        IF (p_Visit_rec.SERIAL_NUMBER IS NULL OR p_Visit_rec.SERIAL_NUMBER = Fnd_Api.G_MISS_CHAR) THEN
6170 
6171           IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_error) THEN
6172              Fnd_Message.set_name ('AHL', 'AHL_VWP_SERIAL_MISSING');
6173              Fnd_Msg_Pub.ADD;
6174           END IF;
6175           x_return_status := Fnd_Api.g_ret_sts_error;
6176           RETURN;
6177        END IF;
6178 
6179     END IF;
6180 */
6181 
6182 END Check_Visit_Req_Items;
6183 
6184 ---------------------------------------------------------------------
6185 -- PROCEDURE
6186 --       Check_Visit_UK_Items
6187 ---------------------------------------------------------------------
6188 PROCEDURE Check_Visit_UK_Items (
6189    p_Visit_rec       IN    Visit_Rec_Type,
6190    p_validation_mode IN    VARCHAR2 := Jtf_Plsql_Api.g_create,
6191    x_return_status   OUT   NOCOPY VARCHAR2
6192 )
6193 IS
6194    l_valid_flag   VARCHAR2(1);
6195 BEGIN
6196    x_return_status := Fnd_Api.g_ret_sts_success;
6197    --
6198    -- For Create_Visit, when ID is passed in, we need to
6199    -- check if this ID is unique.
6200  IF UPPER(p_Visit_rec.operation_flag) <> 'C' THEN
6201 
6202    IF p_validation_mode = Jtf_Plsql_Api.g_create AND p_Visit_rec.VISIT_ID IS NOT NULL
6203    THEN
6204 
6205       IF Ahl_Utility_Pvt.check_uniqueness(
6206               'Ahl_Visits_VL',
6207                 'VISIT_ID = ' || p_Visit_rec.VISIT_ID
6208             ) = Fnd_Api.g_false THEN
6209 
6210          IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_error) THEN
6211             Fnd_Message.set_name ('AHL', 'AHL_VWP_DUPLICATE_VISIT_ID');
6212             Fnd_Msg_Pub.ADD;
6213          END IF;
6214          x_return_status := Fnd_Api.g_ret_sts_error;
6215          RETURN;
6216 
6217       END IF;
6218    END IF;
6219 END IF;
6220 
6221    -- check if VISIT NUMBER is UNIQUE
6222    IF p_validation_mode = Jtf_Plsql_Api.g_create THEN
6223      IF (p_Visit_rec.VISIT_NUMBER IS NOT NULL) THEN
6224        l_valid_flag := Ahl_Utility_Pvt.Check_Uniqueness (
6225          'Ahl_Visits_VL',
6226          'VISIT_NUMBER = ''' || p_Visit_rec.VISIT_NUMBER || ''''
6227       );
6228      END IF;
6229   ELSE
6230       IF (p_Visit_rec.VISIT_NUMBER IS NOT NULL) THEN
6231        l_valid_flag := Ahl_Utility_Pvt.Check_Uniqueness (
6232          'Ahl_Visits_VL',
6233          'VISIT_NUMBER = ''' || p_Visit_rec.VISIT_NUMBER ||
6234          ''' AND VISIT_ID <> ' || p_Visit_rec.VISIT_ID
6235        );
6236      END IF;
6237   END IF;
6238 
6239    IF l_valid_flag = Fnd_Api.g_false THEN
6240       IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_error) THEN
6241          Fnd_Message.set_name ('AHL', 'AHL_VWP_DUPLI_VISIT_NUMBER');
6242          Fnd_Msg_Pub.ADD;
6243       END IF;
6244         x_return_status := Fnd_Api.g_ret_sts_error;
6245       RETURN;
6246    END IF;
6247 END Check_Visit_UK_Items;
6248 
6249 
6250 --------------------------------------------------------------------
6251 -- PROCEDURE
6252 --    Close_Visit
6253 --
6254 -- PURPOSE
6255 --    To check all validations before changing status of a Visit to Close
6256 --------------------------------------------------------------------
6257 PROCEDURE Close_Visit(
6258    p_api_version       IN  NUMBER,
6259    p_init_msg_list     IN  VARCHAR2  := Fnd_Api.g_false,
6260    p_commit            IN  VARCHAR2  := Fnd_Api.g_false,
6261    p_validation_level  IN  NUMBER    := Fnd_Api.g_valid_level_full,
6262    p_module_type       IN  VARCHAR2  := Null,
6263    p_visit_id          IN  NUMBER,
6264    p_x_cost_session_id IN OUT NOCOPY NUMBER,
6265    p_x_mr_session_id   IN OUT NOCOPY NUMBER,
6266    x_return_status     OUT NOCOPY VARCHAR2,
6267    x_msg_count         OUT NOCOPY NUMBER,
6268    x_msg_data          OUT NOCOPY VARCHAR2
6269   )
6270 IS
6271  -- Define local Variables
6272    L_API_VERSION     CONSTANT NUMBER := 1.0;
6273    L_API_NAME        CONSTANT VARCHAR2(30) := 'Close Visit';
6274    L_FULL_NAME       CONSTANT VARCHAR2(60) := G_PKG_NAME || '.' || L_API_NAME;
6275    L_DEBUG           CONSTANT VARCHAR2(90) := 'ahl.plsql.'||L_FULL_NAME;
6276 
6277    l_msg_data        VARCHAR2(2000);
6278    l_status_name     VARCHAR2(80);
6279    l_status_code     VARCHAR2(30);
6280    l_chr_date        VARCHAR2(30);
6281    l_chk_flag        VARCHAR2(1);
6282    l_return_status   VARCHAR2(1);
6283 
6284    l_min             NUMBER;
6285    l_hour            NUMBER;
6286    l_msg_count       NUMBER;
6287    l_count           NUMBER;
6288    i                 NUMBER;
6289 
6290    l_Date            DATE;
6291    l_planned_order_flag VARCHAR2(1);
6292    G_EXC_ERROR          EXCEPTION;
6293 
6294    l_cost_price_rec   AHL_VWP_VISIT_CST_PR_PVT.Cost_price_rec_type;
6295    -- Define local Cursors
6296    -- To find visit related information
6297    CURSOR c_visit (x_id IN NUMBER) IS
6298    SELECT * FROM AHL_VISITS_VL
6299    WHERE VISIT_ID = x_id;
6300    c_visit_rec c_visit%ROWTYPE;
6301 
6302    -- To find task related information
6303    CURSOR c_task (x_id IN NUMBER) IS
6304    SELECT * FROM AHL_VISIT_TASKS_VL
6305    WHERE VISIT_ID = x_id
6306    AND NVL(STATUS_CODE,'X') <> 'DELETED';
6307    c_task_rec c_task%ROWTYPE;
6308 
6309    --yazhou 08Sep2005 starts
6310   -- 1) To find task id which has its corresponding job in shop floor
6311   -- and the job is not in complete, cancelled, closed and deferred status
6312   -- 4--->Complete; 7--->Cancelled; 12 --> Closed; 18 --> Deferred
6313   -- Filter out all Summary tasks, because Master WO will not have statuses updated
6314   --If found, then can not close job.
6315   CURSOR get_open_job_task_csr (p_visit_id IN NUMBER) IS
6316   SELECT A.VISIT_TASK_ID
6317   FROM AHL_VISIT_TASKS_VL A, AHL_WORKORDERS B
6318   WHERE A.VISIT_TASK_ID = B.VISIT_TASK_ID
6319   AND A.VISIT_ID = p_visit_id
6320   AND NVL(A.STATUS_CODE,'X') <> 'DELETED'
6321   -- Balaji added statuses complete_no_charge and deleted to the list of statuses to be
6322   -- checked for.
6323   -- COMPELTE_NO_CHARGE - 5, DELETED - 22
6324   --('4','7','12','18')
6325   AND B.STATUS_CODE NOT IN ('4','5','7','12','18','22')
6326   AND A.TASK_TYPE_CODE <> 'SUMMARY';
6327   --yazhou 08Sep2005 ends
6328 
6329   --yazhou 29Sep2005 starts
6330   -- bug fix #4614587
6331   -- 2) Cursor to check that the unit effectivities are updated properly
6332   -- If there are any which is in wrong status, can not close visit
6333   -- PLANNED tasks can not be canncelled. UMP enforcing that rule
6334   CURSOR get_ue_tasks_csr (p_visit_id IN NUMBER) IS
6335   SELECT UE.unit_effectivity_id
6336   FROM   ahl_unit_effectivities_b UE, ahl_visit_tasks_b VT
6337   WHERE  UE.unit_effectivity_id = VT.unit_effectivity_id
6338   AND  nvl(UE.status_code,'x') NOT IN
6339   -- Change by jaramana on 09-MAR-2011
6340   -- Included 'MR-TERMINATE' for bug 11848364
6341     ('ACCOMPLISHED','DEFERRED','TERMINATED','CANCELLED','MR-TERMINATE')
6342   AND  (VT.task_type_code = 'UNPLANNED' OR VT.task_type_code = 'PLANNED')
6343   AND  VT.visit_id = p_visit_id
6344   AND NVL(VT.STATUS_CODE,'X') <> 'DELETED';
6345   --yazhou 29Sep2005 ends
6346 
6347   --Added by Srini
6348   CURSOR c_wip_entity(c_visit_id IN NUMBER) IS
6349   SELECT A.visit_task_id,workorder_id,wip_entity_id,a.object_version_number
6350   FROM ahl_visit_tasks_vl a, ahl_workorders b
6351   WHERE a.visit_task_id = b.visit_task_id
6352   AND a.visit_id = C_VISIT_ID
6353   AND NVL(A.STATUS_CODE,'X') <> 'DELETED'
6354   AND B.STATUS_CODE <> '7';
6355 
6356   -- Get summary task without mr
6357   CURSOR c_summ_task (c_visit_id IN NUMBER) IS
6358   SELECT visit_task_id,object_version_number
6359   FROM ahl_visit_tasks_vl
6360   WHERE visit_id = c_visit_id
6361   AND mr_id IS NULL
6362   AND task_type_code = 'SUMMARY'
6363   AND NVL(STATUS_CODE,'X') <> 'DELETED';
6364 
6365   -- SKPATHAK :: 20-JUN-2011 :: VWPE: ER:12673125
6366   CURSOR get_default_stage_wo (c_visit_id IN NUMBER)
6367   IS
6368   SELECT wo.workorder_id
6369   FROM ahl_workorders wo, ahl_visit_tasks_b task
6370   WHERE task.visit_task_id = wo.visit_task_id
6371   AND task.visit_id = c_visit_id
6372   AND task.task_type_code = 'STAGE'
6373   AND task.stage_id IS NULL;
6374   l_workorder_id NUMBER;
6375 
6376   l_wip_entity_rec  c_wip_entity%ROWTYPE;
6377   l_summ_task_rec   c_summ_task%ROWTYPE;
6378   l_actual_cost     NUMBER;
6379   l_estimated_cost  NUMBER;
6380   l_task_id         NUMBER;
6381   l_ue_id           NUMBER;
6382 
6383 BEGIN
6384    --------------------- initialize -----------------------
6385     SAVEPOINT Close_Visit;
6386 
6387     IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level) THEN
6388       fnd_log.string(fnd_log.level_procedure,L_DEBUG||'.begin','At the start of PLSQL procedure : Visit Id = ' || p_visit_id);
6389     END IF;
6390 
6391     -- Initialize message list if p_init_msg_list is set to TRUE.
6392     IF Fnd_Api.to_boolean(p_init_msg_list) THEN
6393      Fnd_Msg_Pub.initialize;
6394     END IF;
6395 
6396     --  Initialize API return status to success
6397     x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
6398 
6399     -- Standard call to check for call compatibility.
6400     IF NOT Fnd_Api.COMPATIBLE_API_CALL(l_api_version,
6401                                       p_api_version,
6402                                       l_api_name,G_PKG_NAME) THEN
6403        RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
6404     END IF;
6405 
6406     ------------------------Start of API Body------------------------------------
6407     OPEN c_visit (p_visit_id);
6408     FETCH c_visit INTO c_visit_rec;
6409     CLOSE c_visit;
6410 
6411     -- To check if the unit is quarantined
6412     -- AnRaj added for R 12.0 ACL changes in VWP, Start
6413     CHECK_UNIT_QUARANTINED( p_visit_id   => p_visit_id,
6414                            item_instance_id  => c_visit_rec.Item_Instance_Id);
6415     -- Check Error Message stack.
6416     l_msg_count := FND_MSG_PUB.count_msg;
6417     IF l_msg_count > 0 THEN
6418       x_return_status := FND_API.G_RET_STS_ERROR;
6419       RAISE  FND_API.G_EXC_ERROR;
6420     END IF;
6421 
6422     /* MANESING::Component Maintenance Planning Project, 05-Jul-2011
6423      * Default Stage task and hence workorder won't exist for the Component Visit.
6424      */
6425     IF (AHL_CMP_UTIL_PKG.Is_Comp_Visit (p_visit_id) = 'N') THEN
6426 
6427       -- SKPATHAK :: 20-JUN-2011 :: VWPE: ER:12673125 :: START
6428       -- Cancel the default stage WO
6429       OPEN get_default_stage_wo (p_visit_id);
6430       FETCH get_default_stage_wo INTO l_workorder_id;
6431       CLOSE get_default_stage_wo;
6432 
6433       IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
6434           fnd_log.string(fnd_log.level_statement,L_DEBUG,'Before calling AHL_PRD_WORKORDER_PVT.cancel_visit_jobs l_workorder_id= '||l_workorder_id);
6435       END IF;
6436 
6437       AHL_PRD_WORKORDER_PVT.cancel_visit_jobs
6438                        (p_api_version      => 1.0,
6439                         p_init_msg_list    => FND_API.G_FALSE,
6440                         p_commit           => FND_API.G_FALSE,
6441                         p_validation_level => FND_API.G_VALID_LEVEL_FULL,
6442                         p_default          => FND_API.G_FALSE,
6443                         p_module_type      => NULL,
6444                         x_return_status    => l_return_status,
6445                         x_msg_count        => l_msg_count,
6446                         x_msg_data         => l_msg_data,
6447                         p_visit_id         => NULL,
6448                         p_unit_effectivity_id => NULL,
6449                         p_workorder_id        => l_workorder_id);
6450 
6451       IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
6452         fnd_log.string(fnd_log.level_statement,L_DEBUG,'After calling AHL_PRD_WORKORDER_PVT.cancel_visit_jobs - l_return_status : '||l_return_status);
6453       END IF;
6454 
6455       IF NVL(l_return_status,'x') <> FND_API.G_RET_STS_SUCCESS THEN
6456         x_msg_count := l_msg_count;
6457         x_return_status := l_return_status;
6458         IF l_return_status = Fnd_Api.g_ret_sts_error THEN
6459           RAISE Fnd_Api.g_exc_error;
6460         ELSIF l_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
6461           RAISE Fnd_Api.g_exc_unexpected_error;
6462         END IF;
6463       END IF;
6464       -- SKPATHAK :: 20-JUN-2011 :: VWPE: ER:12673125 :: END
6465     END IF; -- if AHL_CMP_UTIL_PKG.Is_Comp_Visit (p_visit_id) = 'N'
6466 
6467     -- AnRaj added for R 12.0 ACL changes in VWP, End
6468     IF c_visit_rec.status_code = 'RELEASED' THEN
6469       l_chk_flag := 'Y';
6470       --Step 1) Check if there are any workorders which has not been completed/cancelled
6471       OPEN get_open_job_task_csr(p_visit_id);
6472       FETCH get_open_job_task_csr INTO l_task_id;
6473       IF get_open_job_task_csr%FOUND THEN
6474         l_chk_flag := 'N';
6475         Fnd_Message.SET_NAME('AHL','AHL_VWP_INVALID_JOB_STATUS');
6476         Fnd_Msg_Pub.ADD;
6477         CLOSE get_open_job_task_csr;
6478         RAISE Fnd_Api.g_exc_error;
6479       END IF;
6480       CLOSE get_open_job_task_csr;
6481 
6482       --2) Check that the corresponding UE records are in
6483       -- 'ACCOMPLISHED','DEFERRED','TERMINATED','CANCELLED'
6484       OPEN get_ue_tasks_csr(p_visit_id);
6485       FETCH get_ue_tasks_csr INTO l_ue_id;
6486       IF get_ue_tasks_csr%FOUND THEN
6487         l_chk_flag :='N';
6488         Fnd_Message.SET_NAME('AHL','AHL_VWP_UE_CLOSE_INV');
6489         Fnd_Msg_Pub.ADD;
6490         CLOSE get_ue_tasks_csr;
6491         RAISE Fnd_Api.g_exc_error;
6492       END IF;
6493       CLOSE get_ue_tasks_csr;
6494 
6495       --Modified by srini Sep 24/2003
6496       l_cost_price_rec.visit_id        := c_visit_rec.visit_id;
6497       l_cost_price_rec.cost_session_id := p_x_cost_session_id;
6498       l_cost_price_rec.mr_session_id   := p_x_mr_session_id;
6499 
6500       IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
6501         fnd_log.string(fnd_log.level_statement,L_DEBUG,'Cost visit ID:' || l_cost_price_rec.VISIT_ID);
6502         fnd_log.string(fnd_log.level_statement,L_DEBUG,'Cost Session ID: ' || l_cost_price_rec.COST_SESSION_ID);
6503         fnd_log.string(fnd_log.level_statement,L_DEBUG,'Mr Session ID:' || l_cost_price_rec.MR_SESSION_ID);
6504         fnd_log.string(fnd_log.level_statement,L_DEBUG,'Before Calling AHL_VWP_COST_PVT.Calculate_WO_Cost');
6505       END IF;
6506 
6507       --Call ahl_vwp_cost_pvt.calculate_wo_cost
6508       AHL_VWP_COST_PVT.Calculate_WO_Cost(
6509              p_api_version           => p_api_version,
6510              p_init_msg_list         => p_init_msg_list,
6511              p_commit                => Fnd_Api.g_false,
6512              p_validation_level      => p_validation_level,
6513              p_x_cost_price_rec      => l_cost_price_rec,
6514              x_return_status         => l_return_status);
6515 
6516       IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
6517         fnd_log.string(fnd_log.level_statement,L_DEBUG,'After Calling AHL_VWP_COST_PVT.Calculate_WO_Cost :  l_return_status - '||l_return_status);
6518       END IF;
6519 
6520       -- Check Error Message stack.
6521       l_msg_count := FND_MSG_PUB.count_msg;
6522       IF l_msg_count > 0 THEN
6523         x_return_status := FND_API.G_RET_STS_ERROR;
6524         RAISE  FND_API.G_EXC_ERROR;
6525       END IF;
6526 
6527       --Assign to out paramenter if null
6528       p_x_cost_session_id := l_cost_price_rec.cost_session_id;
6529       p_x_mr_session_id   := l_cost_price_rec.mr_session_id;
6530 
6531       OPEN c_wip_entity(c_visit_rec.visit_id);
6532       LOOP
6533         FETCH c_wip_entity INTO l_wip_entity_rec;
6534         EXIT WHEN c_wip_entity%NOTFOUND;
6535 
6536         -- Call ahl_vwp_cost_pvt.get_wo_cost
6537         IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
6538           fnd_log.string(fnd_log.level_statement,L_DEBUG,'wip_entity_id - '||l_wip_entity_rec.wip_entity_id||' - '||'Visit task Id - '||l_wip_entity_rec.visit_task_id);
6539         END IF;
6540 
6541         IF l_wip_entity_rec.wip_entity_id IS NOT NULL THEN
6542 
6543           IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
6544             fnd_log.string(fnd_log.level_statement,L_DEBUG,'Before Calling AHL_VWP_COST_PVT.Get_WO_Cost for all workorers');
6545           END IF;
6546 
6547           AHL_VWP_COST_PVT.Get_WO_Cost(
6548               p_Session_Id     => l_cost_price_rec.mr_session_id,
6549               p_Id             => l_wip_entity_rec.wip_entity_id,
6550               p_program_id     => fnd_global.PROG_APPL_ID,
6551               x_actual_cost    => l_actual_cost,
6552               x_estimated_cost => l_estimated_cost,
6553               x_return_status  => l_return_status);
6554 
6555           IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
6556             fnd_log.string(fnd_log.level_statement,L_DEBUG,'After Calling AHL_VWP_COST_PVT.Get_WO_Cost :  l_return_status - '||l_return_status);
6557             fnd_log.string(fnd_log.level_statement,L_DEBUG,'Updating the actual cost of WO to - '||l_actual_cost);
6558           END IF;
6559 
6560           -- Update with actual cost
6561           UPDATE ahl_visit_tasks_b
6562           SET actual_cost = l_actual_cost,
6563               object_version_number = l_wip_entity_rec.object_version_number + 1
6564           WHERE visit_task_id = l_wip_entity_rec.visit_task_id;
6565 
6566         END IF;
6567       END LOOP;
6568       CLOSE c_wip_entity;
6569 
6570       -- Check Error Message stack.
6571       l_msg_count := FND_MSG_PUB.count_msg;
6572       IF l_msg_count > 0 THEN
6573         x_return_status := FND_API.G_RET_STS_ERROR;
6574         RAISE  FND_API.G_EXC_ERROR;
6575       END IF;
6576 
6577       --Check for summary tasks without mr
6578       OPEN c_summ_task(c_visit_rec.visit_id);
6579       LOOP
6580         FETCH c_summ_task INTO l_summ_task_rec;
6581         EXIT WHEN c_summ_task%NOTFOUND;
6582         IF l_summ_task_rec.visit_task_id IS NOT NULL THEN
6583 
6584           IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
6585             fnd_log.string(fnd_log.level_statement,L_DEBUG,'Before Calling AHL_VWP_COST_PVT.Get_WO_Cost for summary tasks without mr - l_summ_task_rec.visit_task_id : '||l_summ_task_rec.visit_task_id);
6586           END IF;
6587 
6588           AHL_VWP_COST_PVT.Get_WO_Cost(
6589               p_Session_Id     => l_cost_price_rec.mr_session_id,
6590               p_Id             => l_summ_task_rec.visit_task_id,
6591               p_program_id     => fnd_global.PROG_APPL_ID,
6592               x_actual_cost    => l_actual_cost,
6593               x_estimated_cost => l_estimated_cost,
6594               x_return_status  => l_return_status);
6595 
6596           IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
6597             fnd_log.string(fnd_log.level_statement,L_DEBUG,'After Calling AHL_VWP_COST_PVT.Get_WO_Cost :  l_return_status - '||l_return_status||' : l_actual_cost - '||l_actual_cost);
6598           END IF;
6599 
6600           --Update task record with actual cost
6601           UPDATE ahl_visit_tasks_b
6602           SET actual_cost = l_actual_cost,
6603               object_version_number = l_summ_task_rec.object_version_number + 1
6604           WHERE visit_task_id = l_summ_task_rec.visit_task_id;
6605 
6606       END IF;
6607      END LOOP;
6608      CLOSE c_summ_task;
6609 
6610      IF l_chk_flag = 'Y' THEN
6611       -- yazhou 28Sept2005 starts
6612       -- bug fix #4626717
6613       /* Call Update_Project procedure to update project status to CLOSED
6614       AHL_VWP_PROJ_PROD_PVT.Update_Project (
6615                 p_api_version           => p_api_version,
6616                 p_init_msg_list         => p_init_msg_list,
6617                 p_commit                => Fnd_Api.g_false,
6618                 p_validation_level      => p_validation_level,
6619                 p_module_type           => p_module_type,
6620                 p_visit_id              => p_visit_id,
6621                 x_return_status         => x_return_status,
6622                 x_msg_count             => x_msg_count,
6623                 x_msg_data              => x_msg_data);*/
6624 
6625       IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
6626         fnd_log.string(fnd_log.level_statement,L_DEBUG,'Before Calling AHL_COMPLETIONS_PVT.complete_master_wo');
6627       END IF;
6628 
6629       x_return_status := AHL_COMPLETIONS_PVT.complete_master_wo
6630                               (
6631                                 p_visit_id              => p_visit_id,
6632                                 p_workorder_id          => null,
6633                                 p_ue_id                 => null
6634                               );
6635 
6636       IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
6637         fnd_log.string(fnd_log.level_statement,L_DEBUG,'After Calling AHL_COMPLETIONS_PVT.complete_master_wo');
6638       END IF;
6639 
6640       IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
6641         -- Check Error Message stack.
6642         x_msg_count := FND_MSG_PUB.count_msg;
6643         RAISE Fnd_Api.g_exc_error;
6644       END IF;
6645       -- yazhou 28Sept2005 ends
6646 
6647       IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
6648         fnd_log.string(fnd_log.level_statement,L_DEBUG,'Updating Visit Status to CLOSED..');
6649       END IF;
6650 
6651       -- To update visit to CLOSED status
6652       UPDATE AHL_VISITS_B
6653       SET STATUS_CODE = 'CLOSED',
6654           SIMULATION_PLAN_ID = NULL,
6655           OBJECT_VERSION_NUMBER = c_visit_rec.object_version_number + 1,
6656           --TCHIMIRA::FP BUG 12668460 for BUG 12607498 ::14-JUN-2011::UPDATE WHO COLUMNS
6657           LAST_UPDATE_DATE      = SYSDATE,
6658           LAST_UPDATED_BY       = Fnd_Global.USER_ID,
6659           LAST_UPDATE_LOGIN     = Fnd_Global.LOGIN_ID
6660       WHERE VISIT_ID = p_visit_id;
6661 
6662       -- To update all tasks to CLOSED status
6663       OPEN c_task(p_visit_id);
6664       LOOP
6665         FETCH c_task INTO c_task_rec;
6666         EXIT WHEN c_task%NOTFOUND;
6667 
6668         UPDATE AHL_VISIT_TASKS_B
6669         SET STATUS_CODE = 'CLOSED',
6670             OBJECT_VERSION_NUMBER = c_task_rec.object_version_number + 1,
6671             --TCHIMIRA::FP BUG 12668460 for BUG 12607498 ::14-JUN-2011::UPDATE WHO COLUMNS
6672             LAST_UPDATE_DATE      = SYSDATE,
6673             LAST_UPDATED_BY       = Fnd_Global.USER_ID,
6674             LAST_UPDATE_LOGIN     = Fnd_Global.LOGIN_ID
6675         WHERE VISIT_TASK_ID = c_task_rec.visit_task_id;
6676       END LOOP;
6677       CLOSE c_task;
6678 
6679       -- Call Process_Planned_Materials API for APS Integration
6680       -- Start Code on 17th Feb 2004 by shbhanda
6681       OPEN c_visit (p_visit_id);
6682       FETCH c_visit INTO c_visit_rec;
6683       CLOSE c_visit;
6684 
6685       IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
6686         fnd_log.string(fnd_log.level_statement,L_DEBUG,'VISIT STATUS - ' || c_visit_rec.status_code);
6687         fnd_log.string(fnd_log.level_statement,L_DEBUG,'Before calling AHL_LTP_REQST_MATRL_PVT.Process_Planned_Materials');
6688       END IF;
6689 
6690       AHL_LTP_REQST_MATRL_PVT.Process_Planned_Materials (
6691                 p_api_version             => 1.0,
6692                 p_init_msg_list           => FND_API.g_false,
6693                 p_commit                  => FND_API.g_false,
6694                 p_validation_level        => FND_API.g_valid_level_full,
6695                 p_visit_id                => p_visit_id,
6696                 p_visit_task_id           => NULL,
6697                 p_org_id                  => NULL,
6698                 p_start_date              => NULL,
6699                 p_visit_status            => c_visit_rec.status_code,
6700                 p_operation_flag          => NULL,
6701                 x_planned_order_flag      => l_planned_order_flag ,
6702                 x_return_status           => x_return_status,
6703                 x_msg_count               => x_msg_count,
6704                 x_msg_data                => x_msg_data );
6705 
6706       IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
6707         fnd_log.string(fnd_log.level_statement,L_DEBUG,'After calling AHL_LTP_REQST_MATRL_PVT.Process_Planned_Materials : x_return_status - '||x_return_status);
6708       END IF;
6709 
6710       l_msg_count := FND_MSG_PUB.count_msg;
6711       IF l_msg_count > 0 THEN
6712            X_msg_count := l_msg_count;
6713            X_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6714            RAISE FND_API.G_EXC_ERROR;
6715       END IF;
6716 
6717       IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
6718         fnd_log.string(fnd_log.level_statement,L_DEBUG,'l_planned_order_flag - '||l_planned_order_flag);
6719       END IF;
6720      -- End Code on 17th Feb 2004 by shbhanda
6721      END IF;
6722     ELSE
6723         Fnd_Message.SET_NAME('AHL','AHL_VWP_STATUS_NOT_RELEASED');
6724         Fnd_Msg_Pub.ADD;
6725         RAISE Fnd_Api.g_exc_error;
6726     END IF;
6727 
6728     IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
6729       fnd_log.string(fnd_log.level_statement,L_DEBUG,'Cost Session ID: ' || p_x_cost_session_id);
6730       fnd_log.string(fnd_log.level_statement,L_DEBUG,'Mr Session ID:' || p_x_mr_session_id);
6731     END IF;
6732     ---------------------------End of API Body-------------------------------------
6733 
6734     -- Standard check of p_commit.
6735     IF Fnd_Api.To_Boolean ( p_commit ) THEN
6736       COMMIT WORK;
6737     END IF;
6738 
6739     Fnd_Msg_Pub.count_and_get(
6740          p_encoded => Fnd_Api.g_false,
6741          p_count   => x_msg_count,
6742          p_data    => x_msg_data);
6743 
6744     IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level) THEN
6745       fnd_log.string(fnd_log.level_procedure,L_DEBUG||'.end','At the end of PLSQL procedure');
6746     END IF;
6747 EXCEPTION
6748    WHEN Fnd_Api.g_exc_error THEN
6749       ROLLBACK TO Close_Visit;
6750       x_return_status := Fnd_Api.g_ret_sts_error;
6751       Fnd_Msg_Pub.count_and_get (
6752             p_encoded => Fnd_Api.g_false,
6753             p_count   => x_msg_count,
6754             p_data    => x_msg_data
6755       );
6756    WHEN Fnd_Api.g_exc_unexpected_error THEN
6757       ROLLBACK TO Close_Visit;
6758       x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
6759       Fnd_Msg_Pub.count_and_get (
6760             p_encoded => Fnd_Api.g_false,
6761             p_count   => x_msg_count,
6762             p_data    => x_msg_data
6763       );
6764    WHEN OTHERS THEN
6765       ROLLBACK TO Close_Visit;
6766       x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
6767       IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_unexp_error)
6768       THEN
6769          Fnd_Msg_Pub.add_exc_msg (G_PKG_NAME, l_api_name);
6770       END IF;
6771       Fnd_Msg_Pub.count_and_get (
6772             p_encoded => Fnd_Api.g_false,
6773             p_count   => x_msg_count,
6774             p_data    => x_msg_data
6775       );
6776 END Close_Visit;
6777 
6778 --------------------------------------------------------------------
6779 -- PROCEDURE
6780 --    Cancel_Visit
6781 --
6782 -- Post 11.5.10 Reema
6783 -- Transit check changes by shbhanda on Jun 25rd 2004
6784 -- Transit Check chagnes by yazhou Aug-06-2004
6785 --
6786 -- PURPOSE
6787 --    To check all validations before changing status of a Visit to Cancel
6788 --------------------------------------------------------------------
6789 PROCEDURE Cancel_Visit(
6790    p_api_version       IN  NUMBER    := 1.0,
6791    p_init_msg_list     IN  VARCHAR2  := Fnd_Api.g_false,
6792    p_commit            IN  VARCHAR2  := Fnd_Api.g_false,
6793    p_validation_level  IN  NUMBER    := Fnd_Api.g_valid_level_full,
6794    p_module_type       IN  VARCHAR2  := Null,
6795    p_visit_id          IN  NUMBER,
6796    p_obj_ver_num       IN  NUMBER,
6797    x_return_status     OUT NOCOPY VARCHAR2,
6798    x_msg_count         OUT NOCOPY NUMBER,
6799    x_msg_data          OUT NOCOPY VARCHAR2)
6800 IS
6801  -- Define local Variables
6802    L_API_VERSION     CONSTANT NUMBER := 1.0;
6803    L_API_NAME        CONSTANT VARCHAR2(30) := 'Cancel_Visit';
6804    L_FULL_NAME       CONSTANT VARCHAR2(60) := G_PKG_NAME || '.' || L_API_NAME;
6805    L_DEBUG            CONSTANT VARCHAR2(90) := 'ahl.plsql.'||L_FULL_NAME;
6806 
6807    l_chk_project     VARCHAR2(1);
6808    l_error_flag      VARCHAR2(1) := 'N';
6809 
6810    l_return_status VARCHAR2(1);
6811    l_msg_count NUMBER;
6812    l_msg_data  VARCHAR2(2000);
6813 
6814    l_planned_order_flag VARCHAR2(1);
6815    l_service_request_id   NUMBER;
6816    l_interaction_id    NUMBER;
6817 
6818    l_dummy             VARCHAR2(1);
6819 
6820    -- SKPATHAK :: Bug 9096318 :: 09-NOV-2009
6821    -- Added a table type and then an instance of it
6822    TYPE t_ue_id_tbl       IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
6823    l_ue_id_inst_tbl            t_ue_id_tbl;
6824 
6825   -- Define local Cursors
6826   -- To find visit related information
6827    CURSOR c_visit (x_visit_id IN NUMBER) IS
6828    SELECT * FROM AHL_VISITS_VL
6829    WHERE VISIT_ID = x_visit_id;
6830    c_visit_rec c_visit%ROWTYPE;
6831 
6832    -- To find task related information for a visit
6833    CURSOR c_task (x_visit_id IN NUMBER) IS
6834    SELECT * FROM AHL_VISIT_TASKS_VL
6835    WHERE VISIT_ID = x_visit_id
6836    AND NVL(STATUS_CODE,'X') <> 'DELETED';
6837    c_task_rec c_task%ROWTYPE;
6838 
6839    -- transit check change
6840    -- yazhou start
6841    -- To find all the SRs associated to a visit
6842    -- Modified by Sjayacha to check if its not null.
6843    CURSOR c_service_request (x_visit_id IN NUMBER) IS
6844    SELECT distinct service_request_id FROM AHL_VISIT_TASKS_B
6845    WHERE VISIT_ID = x_visit_id
6846    AND service_request_id IS NOT NULL
6847    AND NVL(STATUS_CODE,'X') <> 'DELETED';
6848 
6849    -- To check if any other active visits have this SR associated
6850    CURSOR c_check_SR (x_visit_id IN NUMBER, x_sr_id IN NUMBER) IS
6851    SELECT 'X' FROM DUAL
6852    WHERE exists ( select a.visit_id
6853                   from ahl_visits_b a, ahl_visit_tasks_b b
6854                   where a.visit_id <> x_visit_id
6855                   and a.visit_id = b.visit_id
6856                   and b.visit_id <> x_visit_id
6857                   AND NVL(a.STATUS_CODE,'X') not in ('DELETED','CLOSED')
6858                   AND b.service_request_id = x_sr_id);
6859 
6860    CURSOR c_sr_ovn(x_sr_id IN NUMBER) IS
6861    SELECT object_version_number, incident_number
6862    FROM cs_incidents_all_b
6863    WHERE INCIDENT_ID = x_sr_id;
6864    c_sr_ovn_rec c_sr_ovn%ROWTYPE;
6865    -- yazhou end
6866 
6867    -- Added by jaramana and skpathak on 05-NOV-2009 for Bug 9095324
6868    -- Get only the top level UEs for all manually planned unit effectivities
6869    CURSOR c_unplanned_task_UEs(p_visit_id IN NUMBER) IS
6870    SELECT TSK.UNIT_EFFECTIVITY_ID
6871     FROM AHL_VISIT_TASKS_B TSK, AHL_UNIT_EFFECTIVITIES_B UE
6872     WHERE TSK.VISIT_ID            = p_visit_id
6873      AND TSK.STATUS_CODE         <> 'DELETED'
6874      AND TSK.TASK_TYPE_CODE      = 'SUMMARY'
6875      AND TSK.ORIGINATING_TASK_ID IS NULL
6876      -- Added by jaramana on 08-NOV-2009 for bug 9096318
6877      -- Delete UEs only with null, INIT-DUE and EXCEPTION status
6878      AND UE.UNIT_EFFECTIVITY_ID = TSK.UNIT_EFFECTIVITY_ID
6879      AND NVL(UE.STATUS_CODE, 'OPEN') IN ('OPEN', 'INIT-DUE', 'EXCEPTION')
6880      AND EXISTS (SELECT 'X'
6881                  FROM AHL_VISIT_TASKS_B TSKI
6882                  WHERE TSKI.VISIT_ID            = p_visit_id
6883                    AND TSKI.STATUS_CODE         <> 'DELETED'
6884                    AND TSKI.TASK_TYPE_CODE      = 'UNPLANNED'
6885                    -- SKPATHAK :: Bug 10376643  :: 21-DEC-2010
6886                    -- Compare UE ID and not MR ID since same MR can be added twice to a visit
6887                    AND TSKI.UNIT_EFFECTIVITY_ID               = TSK.UNIT_EFFECTIVITY_ID);
6888 
6889    -- SKPATHAK :: Bug 9096318 :: 09-NOV-2009
6890    -- Cursor to fetch the UE ID of all unplanned tasks
6891    -- For planned tasks, fetch the UE ID only if the status is null, INIT-DUE or EXCEPTION
6892    CURSOR c_get_ue_id (c_visit_id IN NUMBER) IS
6893    SELECT AUE.UNIT_EFFECTIVITY_ID
6894     FROM AHL_UNIT_EFFECTIVITIES_B AUE, AHL_VISIT_TASKS_B AVT
6895     WHERE AVT.VISIT_ID = c_visit_id
6896      AND AUE.UNIT_EFFECTIVITY_ID = AVT.UNIT_EFFECTIVITY_ID
6897      AND (NVL(AUE.STATUS_CODE, 'OPEN') IN ('OPEN', 'INIT-DUE', 'EXCEPTION')
6898      OR AVT.TASK_TYPE_CODE = 'UNPLANNED');
6899    get_ue_id_rec c_get_ue_id%ROWTYPE;
6900 
6901    l_ue_id NUMBER;
6902 
6903 BEGIN
6904     --------------------- initialize -----------------------
6905     SAVEPOINT Cancel_Visit;
6906 
6907     IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level) THEN
6908       fnd_log.string(fnd_log.level_procedure,L_DEBUG||'.begin','At the start of PLSQL procedure : Visit Id = ' || p_visit_id);
6909     END IF;
6910 
6911     -- Initialize message list if p_init_msg_list is set to TRUE.
6912     IF Fnd_Api.to_boolean(p_init_msg_list) THEN
6913       Fnd_Msg_Pub.initialize;
6914     END IF;
6915 
6916     --  Initialize API return status to success
6917     x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
6918 
6919     -- Standard call to check for call compatibility.
6920     IF NOT Fnd_Api.COMPATIBLE_API_CALL( l_api_version,
6921                                         p_api_version,
6922                                         l_api_name,G_PKG_NAME) THEN
6923        RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
6924     END IF;
6925 
6926     ---------------------------Start of API Body-------------------------------------
6927     OPEN c_visit(p_visit_id);
6928     FETCH c_visit INTO c_visit_rec;
6929     CLOSE c_visit;
6930 
6931     IF c_visit_rec.OBJECT_VERSION_NUMBER <> p_obj_ver_num THEN
6932       Fnd_Message.Set_Name('AHL','AHL_COM_RECORD_CHANGED');
6933       Fnd_Msg_Pub.ADD;
6934       RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
6935     END IF;
6936 
6937     -- Changed by jaramana on 05-NOV-2009
6938     -- Removed the validations added for the bug 9087120
6939     -- All work order status validation will now be done by AHL_PRD_WORKORDER_PVT.cancel_visit_jobs
6940 
6941     IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
6942       fnd_log.string(fnd_log.level_statement,L_DEBUG,'Before calling AHL_PRD_WORKORDER_PVT.cancel_visit_jobs');
6943     END IF;
6944     -- Added by shbhanda for Transit check changes on 06/25/2004
6945     -- Code Start
6946     -- Call Cancel_Visit_Jobs API
6947     AHL_PRD_WORKORDER_PVT.cancel_visit_jobs
6948              (p_api_version   => 1.0,
6949               -- SKPATHAK :: Bug 9115894 :: 20-NOV-2009 :: pass p_init_msg_list as false not true
6950               p_init_msg_list => FND_API.G_FALSE,
6951               p_commit        => FND_API.G_FALSE,
6952               p_validation_level => FND_API.G_VALID_LEVEL_FULL,
6953               -- SKPATHAK :: Bug 9115894 :: 20-NOV-2009 ::  pass p_default as true not false
6954               p_default       => FND_API.G_TRUE,
6955               p_module_type   => NULL,
6956               x_return_status => l_return_status,
6957               x_msg_count     => l_msg_count,
6958               x_msg_data      => l_msg_data,
6959               p_visit_id      => p_visit_id,
6960               p_unit_effectivity_id => NULL,
6961               p_workorder_id        => NULL);
6962 
6963     IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
6964       fnd_log.string(fnd_log.level_statement,L_DEBUG,'After calling AHL_PRD_WORKORDER_PVT.cancel_visit_jobs - l_return_status : '||l_return_status);
6965     END IF;
6966     -- SKPATHAK :: Bug 9115894 :: 13-NOV-2009
6967     -- If return status is V, same should be carried over to the caller
6968     IF l_return_status = G_VALIDATION_ERROR_STATUS THEN
6969       RAISE G_VALIDATION_EXCEPTION;
6970     END IF;
6971 
6972     -- Check return status.
6973     IF l_return_status = FND_API.G_RET_STS_ERROR THEN
6974       RAISE FND_API.G_EXC_ERROR;
6975     ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
6976       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
6977     END IF;
6978 
6979     -- SKPATHAK :: Bug 9096318 :: 09-NOV-2009
6980     -- Store all the fetched UE IDs in the table l_ue_id_inst_tbl
6981     OPEN c_get_ue_id(p_visit_id);
6982     FETCH c_get_ue_id BULK COLLECT INTO l_ue_id_inst_tbl;
6983     CLOSE c_get_ue_id;
6984 
6985     -- Added by jaramana on 05-NOV-2009 for Bug 9095324
6986     -- For Unplanned Tasks, do a delete of Unit Effectivities when canceling a visit
6987     OPEN c_unplanned_task_UEs(p_visit_id);
6988     LOOP
6989       FETCH c_unplanned_task_UEs INTO l_ue_id;
6990       EXIT WHEN c_unplanned_task_UEs%NOTFOUND;
6991       IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
6992         fnd_log.string(fnd_log.level_statement, L_DEBUG, 'About to call AHL_UMP_UNPLANNED_PVT.DELETE_UNIT_EFFECTIVITY with p_unit_effectivity_id = ' || l_ue_id);
6993       END IF;
6994       AHL_UMP_UNPLANNED_PVT.DELETE_UNIT_EFFECTIVITY
6995         (
6996           p_api_version         => 1.0,
6997           p_init_msg_list       => FND_API.G_FALSE,
6998           p_commit              => FND_API.G_FALSE,
6999           x_return_status       => l_return_status,
7000           x_msg_count           => l_msg_count,
7001           x_msg_data            => x_msg_data,
7002           p_unit_effectivity_id => l_ue_id
7003         );
7004       IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
7005         fnd_log.string(fnd_log.level_statement, L_DEBUG, 'Returned from AHL_UMP_UNPLANNED_PVT.DELETE_UNIT_EFFECTIVITY, l_return_status = ' || l_return_status);
7006       END IF;
7007       IF ((l_msg_count > 0) OR NVL(l_return_status,'x') <> FND_API.G_RET_STS_SUCCESS) THEN
7008         CLOSE c_unplanned_task_UEs;
7009         RAISE FND_API.G_EXC_ERROR;
7010       END IF;
7011     END LOOP;
7012     CLOSE c_unplanned_task_UEs;
7013 
7014     -- SKPATHAK :: Bug 9096318 :: 09-NOV-2009
7015     -- Modified this update statement
7016     -- For all UNPLANNED tasks, nullify the unit effectivity id
7017     -- For PLANNED tasks, nullify the ue_id only if the status is null, INIT-DUE or EXCEPTION
7018     IF (l_ue_id_inst_tbl.COUNT > 0) THEN
7019       FOR i IN l_ue_id_inst_tbl.FIRST..l_ue_id_inst_tbl.LAST LOOP
7020         UPDATE AHL_VISIT_TASKS_B
7021         SET UNIT_EFFECTIVITY_ID = NULL,
7022         OBJECT_VERSION_NUMBER = object_version_number + 1,
7023         LAST_UPDATE_DATE      = SYSDATE,
7024         LAST_UPDATED_BY       = Fnd_Global.USER_ID,
7025         LAST_UPDATE_LOGIN     = Fnd_Global.LOGIN_ID
7026          WHERE VISIT_ID       = p_visit_id
7027            AND NVL(UNIT_EFFECTIVITY_ID, -1) = l_ue_id_inst_tbl(i);
7028        END LOOP;
7029      END IF;
7030 
7031 
7032     IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
7033       fnd_log.string(fnd_log.level_statement,L_DEBUG,'Before calling AHL_LTP_REQST_MATRL_PVT.Process_Planned_Materials');
7034     END IF;
7035 
7036     -- Call AHL_LTP_REQST_MATRL_PVT.Process_Planned_Material
7037     AHL_LTP_REQST_MATRL_PVT.Process_Planned_Materials
7038                 (p_api_version      => 1.0,
7039                  p_init_msg_list    => FND_API.g_false,
7040                  p_commit           => FND_API.g_false,
7041                  p_validation_level => FND_API.g_valid_level_full,
7042                  p_visit_id         => p_visit_id,
7043                  p_visit_task_id    => NULL,
7044                  p_org_id           => NULL,
7045                  p_start_date       => NULL,
7046                  p_visit_status     => 'CANCELLED',
7047                  p_operation_flag   => NULL,
7048                  x_planned_order_flag => l_planned_order_flag,
7049                  x_return_status    => l_return_status,
7050                  x_msg_count        => l_msg_count,
7051                  x_msg_data         => l_msg_data);
7052 
7053     IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
7054       fnd_log.string(fnd_log.level_statement,L_DEBUG,'After calling AHL_LTP_REQST_MATRL_PVT.Process_Planned_Materials - l_return_status : '||l_return_status);
7055     END IF;
7056 
7057     -- Check return status.
7058     IF l_return_status = FND_API.G_RET_STS_ERROR THEN
7059       RAISE FND_API.G_EXC_ERROR;
7060     ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
7061       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
7062     END IF;
7063 
7064     -- update task status
7065     OPEN c_task(p_visit_id);
7066     LOOP
7067       FETCH c_task INTO c_task_rec;
7068       EXIT WHEN c_task%NOTFOUND;
7069       -- update the task status to cancelled
7070 
7071       IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
7072         fnd_log.string(fnd_log.level_statement,L_DEBUG,'Updating the task status to CANCELLED for task ID - c_task_rec.visit_task_id : '||c_task_rec.visit_task_id);
7073       END IF;
7074 
7075       UPDATE AHL_VISIT_TASKS_B
7076       SET STATUS_CODE = 'CANCELLED',
7077           OBJECT_VERSION_NUMBER = c_task_rec.object_version_number + 1,
7078           --TCHIMIRA::FP BUG 12668460 for BUG 12607498 ::14-JUN-2011::UPDATE WHO COLUMNS
7079           LAST_UPDATE_DATE      = SYSDATE,
7080           LAST_UPDATED_BY       = Fnd_Global.USER_ID,
7081           LAST_UPDATE_LOGIN     = Fnd_Global.LOGIN_ID
7082       WHERE VISIT_TASK_ID = c_task_rec.visit_task_id;
7083     END LOOP;
7084     CLOSE c_task;
7085 
7086     IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
7087       fnd_log.string(fnd_log.level_statement,L_DEBUG,'Updating the visit status to CANCELLED..');
7088     END IF;
7089     -- update visit status
7090     UPDATE AHL_VISITS_B
7091     SET STATUS_CODE = 'CANCELLED',
7092         OBJECT_VERSION_NUMBER = c_visit_rec.object_version_number + 1,
7093         --TCHIMIRA::FP BUG 12668460 for BUG 12607498 ::14-JUN-2011::UPDATE WHO COLUMNS
7094         LAST_UPDATE_DATE      = SYSDATE,
7095         LAST_UPDATED_BY       = Fnd_Global.USER_ID,
7096         LAST_UPDATE_LOGIN     = Fnd_Global.LOGIN_ID
7097     WHERE VISIT_ID = p_visit_id;
7098 
7099     -- ****** cancelled check has to be added to production api
7100     -- Check if visit project id is null
7101     -- if not null then update PA_PROJECTS_ALL and set the
7102     -- project status code to 'CLOSED'
7103     IF c_visit_rec.PROJECT_ID IS NOT NULL THEN
7104         IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
7105           fnd_log.string(fnd_log.level_statement,L_DEBUG,'Before calling AHL_VWP_PROJ_PROD_PVT.Update_Project');
7106         END IF;
7107 
7108         AHL_VWP_PROJ_PROD_PVT.Update_Project(
7109                 p_api_version           => p_api_version,
7110                 p_init_msg_list         => p_init_msg_list,
7111                 p_commit                => Fnd_Api.g_false,
7112                 p_validation_level      => p_validation_level,
7113                 p_module_type           => p_module_type,
7114                 p_visit_id              => p_visit_id,
7115                 x_return_status         => x_return_status,
7116                 x_msg_count             => x_msg_count,
7117                 x_msg_data              => x_msg_data);
7118         --The following END IF was commented out by jeli on 07/27/04, otherwise it couldn't pass the compilation.
7119 
7120         IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
7121           fnd_log.string(fnd_log.level_statement,L_DEBUG,'After calling AHL_VWP_PROJ_PROD_PVT.Update_Project - x_return_status : '||x_return_status);
7122         END IF;
7123 
7124         IF NVL(x_return_status, 'X') <> Fnd_Api.G_RET_STS_SUCCESS THEN
7125           -- Method call was not successful, raise error
7126           Fnd_Message.SET_NAME('AHL','AHL_VWP_PRJ_UPDATE_FAILED'); -- Failed to update job
7127           Fnd_Msg_Pub.ADD;
7128           IF (fnd_log.level_error >= fnd_log.g_current_runtime_level)THEN
7129             fnd_log.string( fnd_log.level_error,'ahl.plsql.'||G_PKG_NAME||'.'||L_API_NAME,
7130                             'Cant update the project to Rejected status');
7131           END IF;
7132           RAISE Fnd_Api.G_EXC_ERROR;
7133         END IF;
7134     END IF;
7135 
7136     -- transit check change
7137     -- yazhou start
7138     -- Set SR status back to OPEN if no other active visit has reference to it
7139     OPEN c_service_request(p_visit_id);
7140     LOOP
7141       FETCH c_service_request INTO l_service_request_id;
7142       EXIT WHEN c_service_request%NOTFOUND;
7143       -- Check if any other active visits have reference to this SR
7144       OPEN c_check_SR(p_visit_id,l_service_request_id);
7145       FETCH c_check_SR into l_dummy;
7146       IF c_check_SR %NOTFOUND THEN
7147         -- Set SR status back to OPEN
7148         OPEN c_sr_ovn(l_service_request_id);
7149         FETCH c_sr_ovn into c_sr_ovn_rec;
7150         CLOSE c_sr_ovn;
7151 
7152         IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
7153           fnd_log.string(fnd_log.level_statement,L_DEBUG,'Before calling CS_ServiceRequest_PUB.Update_Status - SR Id : '||l_service_request_id);
7154         END IF;
7155         -- yazhou 29-Jun-2006 starts
7156         -- bug#5359943
7157         -- Pass p_status_id as 1 (OPEN)
7158         CS_ServiceRequest_PUB.Update_Status
7159            (    p_api_version => 2.0,
7160                 p_init_msg_list => p_init_msg_list,
7161                 p_commit => FND_API.G_FALSE,
7162                 p_resp_appl_id => NULL,
7163                 p_resp_id => NULL,
7164                 p_user_id => NULL,
7165                 p_login_id => NULL,
7166                 p_status_id => 1,
7167                 p_closed_date => NULL,
7168                 p_audit_comments => NULL,
7169                 p_called_by_workflow => FND_API.G_FALSE,
7170                 p_workflow_process_id => NULL,
7171                 p_comments => NULL,
7172                 p_public_comment_flag => FND_API.G_FALSE,
7173                 p_validate_sr_closure => 'N',
7174                 p_auto_close_child_entities => 'N',
7175                 p_request_id => NULL,
7176                 p_request_number => c_sr_ovn_rec.incident_number,
7177                 x_return_status => l_return_status,
7178                 x_msg_count => l_msg_count,
7179                 x_msg_data => l_msg_data,
7180                 p_object_version_number => c_sr_ovn_rec.object_version_number,
7181 --              p_status => 'OPEN',
7182                 x_interaction_id => l_interaction_id
7183            );
7184 
7185         IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
7186           fnd_log.string(fnd_log.level_statement,L_DEBUG,'After calling CS_ServiceRequest_PUB.Update_Status - l_return_status : '||l_return_status);
7187         END IF;
7188         -- yazhou 29-Jun-2006 ends
7189         -- Check return status.
7190         IF l_return_status = FND_API.G_RET_STS_ERROR THEN
7191           CLOSE c_check_SR;
7192           CLOSE c_service_request;
7193           RAISE FND_API.G_EXC_ERROR;
7194         ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
7195           CLOSE c_check_SR;
7196           CLOSE c_service_request;
7197           RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
7198         END IF;
7199       END IF;
7200       CLOSE c_check_SR;
7201     END LOOP;
7202     CLOSE c_service_request;
7203 
7204 
7205     ---------------------------End of API Body-------------------------------------
7206     -- Standard check of p_commit.
7207 
7208     IF Fnd_Api.To_Boolean ( p_commit ) THEN
7209       COMMIT WORK;
7210     END IF;
7211 
7212     Fnd_Msg_Pub.count_and_get(
7213          p_encoded => Fnd_Api.g_false,
7214          p_count   => x_msg_count,
7215          p_data    => x_msg_data);
7216 
7217     IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level) THEN
7218       fnd_log.string(fnd_log.level_procedure,L_DEBUG||'.end','At the end of PLSQL procedure');
7219     END IF;
7220 EXCEPTION
7221    -- SKPATHAK :: Bug 9115894 :: 13-NOV-2009
7222    WHEN G_VALIDATION_EXCEPTION THEN
7223       ROLLBACK TO Cancel_Visit;
7224       x_return_status := G_VALIDATION_ERROR_STATUS ;
7225       Fnd_Msg_Pub.count_and_get (
7226             p_encoded => Fnd_Api.g_false,
7227             p_count   => x_msg_count,
7228             p_data    => x_msg_data
7229       );
7230 
7231    WHEN Fnd_Api.g_exc_error THEN
7232       ROLLBACK TO Cancel_Visit;
7233       x_return_status := Fnd_Api.g_ret_sts_error;
7234       Fnd_Msg_Pub.count_and_get (
7235             p_encoded => Fnd_Api.g_false,
7236             p_count   => x_msg_count,
7237             p_data    => x_msg_data
7238       );
7239 
7240    WHEN Fnd_Api.g_exc_unexpected_error THEN
7241       ROLLBACK TO Cancel_Visit;
7242       x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
7243       Fnd_Msg_Pub.count_and_get (
7244             p_encoded => Fnd_Api.g_false,
7245             p_count   => x_msg_count,
7246             p_data    => x_msg_data
7247       );
7248 
7249    WHEN OTHERS THEN
7250       ROLLBACK TO Cancel_Visit;
7251       x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
7252       IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_unexp_error)
7253       THEN
7254          Fnd_Msg_Pub.add_exc_msg (G_PKG_NAME, l_api_name);
7255       END IF;
7256       Fnd_Msg_Pub.count_and_get (
7257             p_encoded => Fnd_Api.g_false,
7258             p_count   => x_msg_count,
7259             p_data    => x_msg_data
7260       );
7261 
7262 END Cancel_Visit;
7263 
7264 ----------------------------------------------------------------------
7265 -- END: Defining procedures BODY, which are called from UI screen --
7266 ----------------------------------------------------------------------
7267 
7268 -- Transit Visit Change
7269 -- yazhou start
7270 
7271 --------------------------------------------------------------------
7272 -- PROCEDURE
7273 --    Synchronize_Visit
7274 --
7275 -- PURPOSE
7276 -- Will be called from UA
7277 -- To Synchronize visit with flight schedule change
7278 --------------------------------------------------------------------
7279 PROCEDURE Synchronize_Visit (
7280    p_api_version       IN  NUMBER,
7281    p_init_msg_list     IN  VARCHAR2  := Fnd_Api.g_false,
7282    p_commit            IN  VARCHAR2  := Fnd_Api.g_false,
7283    p_validation_level  IN  NUMBER    := Fnd_Api.g_valid_level_full,
7284    p_module_type       IN  VARCHAR2  := NULL,
7285    p_x_visit_rec       IN  OUT NOCOPY Visit_Rec_Type,
7286    x_return_status     OUT NOCOPY VARCHAR2,
7287    x_msg_count         OUT NOCOPY NUMBER,
7288    x_msg_data          OUT NOCOPY VARCHAR2
7289 )
7290 IS
7291   -- Define local Variables
7292   L_API_VERSION          CONSTANT NUMBER := 1.0;
7293   L_API_NAME             CONSTANT VARCHAR2(30) := 'Synchronize_Visit';
7294   L_FULL_NAME            CONSTANT VARCHAR2(60) := G_PKG_NAME || '.' || L_API_NAME;
7295   L_DEBUG            CONSTANT VARCHAR2(90) := 'ahl.plsql.'||L_FULL_NAME;
7296 
7297   l_msg_data             VARCHAR2(2000);
7298   l_return_status        VARCHAR2(1);
7299   l_msg_count            NUMBER;
7300 
7301   l_visit_rec            Visit_Rec_Type := p_x_visit_rec;
7302 
7303   -- Define local Cursors
7304 
7305   -- To find visit related information
7306   CURSOR c_Visit(x_visit_id IN NUMBER) IS
7307   SELECT * FROM   Ahl_Visits_VL
7308   WHERE  VISIT_ID = x_visit_id;
7309 
7310   c_Visit_rec    c_Visit%ROWTYPE;
7311   l_org_id NUMBER;
7312 
7313 BEGIN
7314     --------------------- Initialize -----------------------
7315     SAVEPOINT Synchronize_Visit;
7316 
7317     -- Check if API is called in debug mode. If yes, enable debug.
7318     IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level) THEN
7319       fnd_log.string(fnd_log.level_procedure,L_DEBUG||'.begin','At the start of PLSQL procedure : Visit Id - '||l_visit_rec.visit_id);
7320     END IF;
7321 
7322     -- Initialize message list if p_init_msg_list is set to TRUE.
7323     IF Fnd_Api.to_boolean(p_init_msg_list) THEN
7324         Fnd_Msg_Pub.initialize;
7325     END IF;
7326 
7327     --  Initialize API return status to success
7328     x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
7329 
7330     -- Standard call to check for call compatibility.
7331     IF NOT Fnd_Api.COMPATIBLE_API_CALL(l_api_version,
7332                                       p_api_version,
7333                                       l_api_name,G_PKG_NAME)
7334     THEN
7335         RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
7336     END IF;
7337 
7338     ------------------------Start of API Body------------------------------------
7339     OPEN c_Visit(l_visit_rec.visit_id);
7340     FETCH c_Visit INTO c_Visit_rec;
7341     IF c_Visit%NOTFOUND THEN
7342         CLOSE c_Visit;
7343         IF Fnd_Msg_Pub.check_msg_level(Fnd_Msg_Pub.g_msg_lvl_error) THEN
7344             Fnd_Message.set_name('AHL', 'AHL_API_RECORD_NOT_FOUND');
7345             Fnd_Msg_Pub.ADD;
7346             IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
7347               fnd_log.string(fnd_log.level_statement,L_DEBUG,'Visit not found for - ' ||l_visit_rec.visit_id );
7348             END IF;
7349         END IF;
7350         RAISE Fnd_Api.g_exc_error;
7351     ELSE
7352         CLOSE c_Visit;
7353     END IF;
7354 
7355     -- Complete Visit Record
7356     p_x_visit_rec.VISIT_TYPE_CODE       := c_Visit_rec.VISIT_TYPE_CODE;
7357     p_x_visit_rec.SERVICE_REQUEST_ID    := c_Visit_rec.SERVICE_REQUEST_ID;
7358     p_x_visit_rec.SPACE_CATEGORY_CODE   := c_Visit_rec.SPACE_CATEGORY_CODE;
7359     p_x_visit_rec.OBJECT_VERSION_NUMBER := c_Visit_rec.OBJECT_VERSION_NUMBER;
7360     p_x_visit_rec.VISIT_NAME            := c_Visit_rec.VISIT_NAME;
7361     p_x_visit_rec.DESCRIPTION           := c_Visit_rec.DESCRIPTION;
7362     p_x_visit_rec.PRIORITY_CODE         := c_Visit_rec.PRIORITY_CODE;
7363     p_x_visit_rec.PROJ_TEMPLATE_ID      := c_Visit_rec.PROJECT_TEMPLATE_ID;
7364 
7365     IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
7366       fnd_log.string(fnd_log.level_statement,L_DEBUG,'Visit Status : '||c_Visit_rec.status_code);
7367     END IF;
7368 
7369     IF c_Visit_rec.status_code IN ('PLANNING','DRAFT') THEN
7370         IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
7371           fnd_log.string(fnd_log.level_statement,L_DEBUG,'Before calling Update_Visit');
7372         END IF;
7373 
7374         Update_Visit
7375         (
7376             p_api_version             => l_api_version,
7377             p_init_msg_list           => p_init_msg_list,
7378             p_commit                  => Fnd_Api.g_false,
7379             p_validation_level        => p_validation_level,
7380             p_module_type             => p_module_type,
7381             p_x_Visit_rec             => p_x_visit_rec,
7382             x_return_status           => l_return_status,
7383             x_msg_count               => l_msg_count,
7384             x_msg_data                => l_msg_data
7385         );
7386 
7387         IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
7388           fnd_log.string(fnd_log.level_statement,L_DEBUG,'After calling Update_Visit - l_return_status : '||l_return_status);
7389         END IF;
7390 
7391         IF l_return_status <> 'S' THEN
7392             RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
7393         END IF;
7394     ELSIF c_Visit_rec.status_code = 'RELEASED' OR c_Visit_rec.status_code = 'PARTIALLY RELEASED' THEN
7395         -------------- R12 changes For Serial Number Reservations Start-------------------
7396         ---------------AnRaj added on 19th June 2005-------------------
7397         -- R12: Department is made mandatory
7398         IF  l_visit_rec.department_id IS NULL OR l_visit_rec.department_id = Fnd_Api.G_MISS_NUM THEN
7399             Fnd_Message.SET_NAME('AHL','AHL_VWP_RELSD_DEPT_MAND');
7400             Fnd_Msg_Pub.ADD;
7401             RAISE Fnd_Api.G_EXC_ERROR;
7402         END IF;
7403 
7404         -- R12: Department change does not require to cancel current visit and Create a new visit
7405         -- R12: Removed the Department change check here
7406         -- If orgnization changed, then cancel the visit and create a new one.
7407         IF  l_visit_rec.organization_id IS NOT NULL
7408             AND l_visit_rec.organization_id <> Fnd_Api.G_MISS_NUM
7409             AND l_visit_rec.organization_id <> c_Visit_rec.organization_id
7410         THEN
7411             -- Validate org/dept/dates
7412             -- Planned Start Date is madatory for transit visit
7413             IF  l_visit_rec.START_DATE IS NULL
7414                 OR l_visit_rec.START_DATE = FND_API.g_miss_date
7415             THEN
7416                 Fnd_Message.SET_NAME('AHL','AHL_VWP_TC_ST_DT_REQ');
7417                 Fnd_Msg_Pub.ADD;
7418                 RAISE Fnd_Api.G_EXC_ERROR;
7419             END IF;
7420 
7421             -- Planned End Date is madatory for transit visit
7422             IF  l_visit_rec.PLAN_END_DATE IS NULL
7423                 OR  l_visit_rec.PLAN_END_DATE = FND_API.g_miss_date
7424             THEN
7425                 Fnd_Message.SET_NAME('AHL','AHL_VWP_TC_END_DT_REQ');
7426                 Fnd_Msg_Pub.ADD;
7427                 RAISE Fnd_Api.G_EXC_ERROR;
7428             END IF;
7429 
7430             -- Planned End Date must be greater than or equal to Planned Start Date
7431             IF (l_visit_rec.START_DATE > l_visit_rec.PLAN_END_DATE) THEN
7432                 Fnd_Message.SET_NAME('AHL','AHL_VWP_START_DT_GTR_CLOSE_DT');
7433                 Fnd_Msg_Pub.ADD;
7434                 RAISE Fnd_Api.G_EXC_ERROR;
7435             END IF;
7436 
7437             -- If visit start date is earlier than SYSDATE then use sysdate to create new visit
7438             IF (l_visit_rec.START_DATE < SYSDATE ) THEN
7439                l_visit_rec.START_DATE := SYSDATE;
7440             END IF;
7441 
7442             -- Organization belongs to user's operating unit
7443             AHL_VWP_RULES_PVT.Check_Org_Name_Or_Id
7444               (   p_organization_id  => l_visit_rec.organization_id,
7445                   p_org_name         => null,
7446                   x_organization_id  => l_org_id,
7447                   x_return_status    => l_return_status,
7448                   x_error_msg_code   => l_msg_data);
7449 
7450             l_visit_rec.organization_id := l_org_id;
7451 
7452             IF NVL(l_return_status,'x') <> 'S' THEN
7453                Fnd_Message.SET_NAME('AHL','AHL_VWP_ORG_NOT_EXISTS');
7454                Fnd_Msg_Pub.ADD;
7455                RAISE Fnd_Api.G_EXC_ERROR;
7456             END IF;
7457 
7458             -- Department must have shift defined
7459             AHL_VWP_RULES_PVT.CHECK_DEPARTMENT_SHIFT
7460                (p_dept_id          => l_visit_rec.department_id,
7461                 x_return_status    => l_return_status);
7462 
7463             IF NVL(l_return_status,'x') <> 'S' THEN
7464                Fnd_Message.SET_NAME('AHL','AHL_VWP_NO_DEPT_SHIFT');
7465                Fnd_Msg_Pub.ADD;
7466                RAISE Fnd_Api.G_EXC_ERROR;
7467             END IF;
7468 
7469             IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
7470               fnd_log.string(fnd_log.level_statement,L_DEBUG,'Before calling COPY_VISIT');
7471             END IF;
7472 
7473             COPY_VISIT(
7474                 p_api_version             => l_api_version,
7475                 p_init_msg_list           => p_init_msg_list,
7476                 p_commit                  => Fnd_Api.g_false,
7477                 p_validation_level        => p_validation_level,
7478                 p_module_type             => p_module_type,
7479                 P_VISIT_ID                => c_visit_rec.visit_id,
7480                 p_x_Visit_rec             => l_visit_rec,
7481                 x_return_status           => l_return_status,
7482                 x_msg_count               => l_msg_count,
7483                 x_msg_data                => l_msg_data
7484                 );
7485 
7486             IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
7487               fnd_log.string(fnd_log.level_statement,L_DEBUG,'After calling COPY_VISIT l_return_status - '||l_return_status);
7488             END IF;
7489 
7490             IF l_return_status <> 'S' THEN
7491                 RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
7492             END IF;
7493 
7494             IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
7495               fnd_log.string(fnd_log.level_statement,L_DEBUG,'Before calling AHL_VWP_PROJ_PROD_PVT.Release_Visit');
7496             END IF;
7497 
7498             AHL_VWP_PROJ_PROD_PVT.Release_Visit (
7499                 p_api_version          => l_api_version,
7500                 p_visit_id             => l_visit_rec.visit_id,
7501                 p_module_type          => 'VWP',
7502                 p_release_flag         =>  NUll,
7503                 p_orig_visit_id        => c_visit_rec.visit_id,
7504                 X_RETURN_STATUS        => l_return_status,
7505                 X_MSG_COUNT            => l_msg_count,
7506                 X_MSG_DATA             => l_msg_data
7507             );
7508 
7509             IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
7510               fnd_log.string(fnd_log.level_statement,L_DEBUG,'After calling AHL_VWP_PROJ_PROD_PVT.Release_Visit : l_return_status - '||l_return_status);
7511             END IF;
7512 
7513             IF l_return_status <> 'S' THEN
7514                 RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
7515             END IF;
7516 
7517             IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
7518               fnd_log.string(fnd_log.level_statement,L_DEBUG,'Before calling Cancel_Visit');
7519             END IF;
7520 
7521             Cancel_Visit
7522             (
7523                   p_Visit_id                => c_visit_rec.visit_id,
7524                   p_obj_ver_num             => c_visit_rec.object_version_number,
7525                   x_return_status           => l_return_status,
7526                   x_msg_count               => l_msg_count,
7527                   x_msg_data                => l_msg_data
7528             );
7529 
7530             IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
7531               fnd_log.string(fnd_log.level_statement,L_DEBUG,'After calling Cancel_Visit : l_return_status - '||l_return_status);
7532             END IF;
7533 
7534             IF l_return_status <> 'S' THEN
7535                 RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
7536             END IF;
7537        -- The Organization did not change
7538        -- Only there is change in the date and time of the visit
7539        -- R12 OR the department has changed., added the condition
7540        -- R12 AnRaj
7541         ELSIF       l_visit_rec.START_DATE IS NOT NULL
7542                 AND l_visit_rec.START_DATE <> FND_API.g_miss_date
7543                 AND l_visit_rec.PLAN_END_DATE IS NOT NULL
7544                 AND l_visit_rec.PLAN_END_DATE <> FND_API.g_miss_date
7545                 AND (   l_visit_rec.START_DATE <> c_Visit_rec.START_DATE_TIME
7546                         OR l_visit_rec.PLAN_END_DATE <> c_Visit_rec.CLOSE_DATE_TIME
7547                         OR l_visit_rec.department_id <> c_Visit_rec.department_id
7548                     )
7549         THEN
7550         ------------ R12 changes For Serial Number Reservations End-----------------
7551 
7552             IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
7553               fnd_log.string(fnd_log.level_statement,L_DEBUG,'Before calling Update_Visit');
7554             END IF;
7555 
7556             Update_Visit
7557             (
7558                 p_api_version             => l_api_version,
7559                 p_init_msg_list           => p_init_msg_list,
7560                 p_commit                  => Fnd_Api.g_false,
7561                 p_validation_level        => p_validation_level,
7562                 p_module_type             => p_module_type,
7563                 p_x_Visit_rec             => p_x_visit_rec,
7564                 x_return_status           => l_return_status,
7565                 x_msg_count               => l_msg_count,
7566                 x_msg_data                => l_msg_data
7567             );
7568 
7569             IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
7570               fnd_log.string(fnd_log.level_statement,L_DEBUG,'After calling Update_Visit - l_return_status : '||l_return_status);
7571             END IF;
7572 
7573             IF l_return_status <> 'S' THEN
7574                 RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
7575             END IF;
7576 
7577             IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
7578               fnd_log.string(fnd_log.level_statement,L_DEBUG,'Before calling AHL_PRD_WORKORDER_PVT.RESCHEDULE_VISIT_JOBS');
7579             END IF;
7580 
7581             AHL_PRD_WORKORDER_PVT.RESCHEDULE_VISIT_JOBS(
7582                 P_API_VERSION                  => l_api_version,
7583                 X_RETURN_STATUS                => l_return_status,
7584                 X_MSG_COUNT                    => l_msg_count,
7585                 X_MSG_DATA                     => l_msg_data,
7586                 P_VISIT_ID                     => c_visit_rec.visit_id,
7587                 p_x_scheduled_start_date       => l_visit_rec.START_DATE,
7588                 p_x_scheduled_end_date         => l_visit_rec.PLAN_END_DATE);
7589 
7590             IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
7591               fnd_log.string(fnd_log.level_statement,L_DEBUG,'After calling AHL_PRD_WORKORDER_PVT.RESCHEDULE_VISIT_JOBS - l_return_status : '||l_return_status);
7592             END IF;
7593 
7594             IF l_return_status <> 'S' THEN
7595                 RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
7596             END IF;
7597         END IF;
7598     END IF;
7599 
7600     l_msg_count := Fnd_Msg_Pub.count_msg;
7601 
7602     IF l_msg_count > 0 THEN
7603         X_msg_count := l_msg_count;
7604         X_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
7605         RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
7606     END IF;
7607     --Standard check for commit
7608     IF Fnd_Api.TO_BOOLEAN(p_commit) THEN
7609         COMMIT;
7610     END IF;
7611 
7612     IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level) THEN
7613       fnd_log.string(fnd_log.level_procedure,L_DEBUG||'.end','At the end of PLSQL procedure');
7614     END IF;
7615 EXCEPTION
7616    WHEN Fnd_Api.g_exc_error THEN
7617       ROLLBACK TO Synchronize_Visit;
7618       x_return_status := Fnd_Api.g_ret_sts_error;
7619       Fnd_Msg_Pub.count_and_get (
7620             p_encoded => Fnd_Api.g_false,
7621             p_count   => x_msg_count,
7622             p_data    => x_msg_data
7623       );
7624    WHEN Fnd_Api.g_exc_unexpected_error THEN
7625       ROLLBACK TO Synchronize_Visit;
7626       x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
7627       Fnd_Msg_Pub.count_and_get (
7628             p_encoded => Fnd_Api.g_false,
7629             p_count   => x_msg_count,
7630             p_data    => x_msg_data
7631       );
7632    WHEN OTHERS THEN
7633       ROLLBACK TO Synchronize_Visit;
7634       x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
7635       IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_unexp_error)
7636         THEN
7637          Fnd_Msg_Pub.add_exc_msg (G_PKG_NAME, l_api_name);
7638       END IF;
7639       Fnd_Msg_Pub.count_and_get (
7640             p_encoded => Fnd_Api.g_false,
7641             p_count   => x_msg_count,
7642             p_data    => x_msg_data
7643       );
7644 END Synchronize_Visit;
7645 
7646 -- yazhou end
7647 
7648 ---------------------------------------------------------------------
7649 -- pbarman begin
7650 -- procedure to delete the Unit Schedule Id from Visits records
7651 --when the Flight schedule is deleted.
7652 ---------------------------------------------------------------------
7653 PROCEDURE DELETE_FLIGHT_ASSOC(
7654  p_unit_schedule_id      IN NUMBER,
7655  x_return_status     OUT NOCOPY VARCHAR2
7656 )
7657 IS
7658 BEGIN
7659     SAVEPOINT delete_flight_assoc;
7660 
7661     -- Initialize return status to success initially
7662     x_return_status:=FND_API.G_RET_STS_SUCCESS;
7663 
7664     UPDATE AHL_VISITS_B
7665     SET UNIT_SCHEDULE_ID = NULL
7666     WHERE UNIT_SCHEDULE_ID =  p_unit_schedule_id ;
7667 
7668  EXCEPTION
7669      WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
7670         ROLLBACK TO delete_flight_assoc;
7671         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
7672      WHEN FND_API.G_EXC_ERROR THEN
7673         ROLLBACK TO delete_flight_assoc;
7674         x_return_status := FND_API.G_RET_STS_ERROR;
7675      WHEN OTHERS THEN
7676         ROLLBACK TO delete_flight_assoc;
7677         x_return_status := FND_API.G_RET_STS_ERROR;
7678 END DELETE_FLIGHT_ASSOC;
7679 
7680 -- AnRaj added for R 12.0 ACL changes in VWP
7681 -- Bug number 4297066
7682 -------------------------------------------------------------------
7683 --  Procedure name      : check_unit_quarantined
7684 --  Type                : Private
7685 --  Function            : To check whether the Unit is quarantined
7686 --  Parameters          : item_instance_id
7687 ----------------------------------------------------------------------
7688 PROCEDURE check_unit_quarantined(
7689       p_visit_id           IN  NUMBER,
7690       item_instance_id     IN  NUMBER
7691       )
7692 IS
7693   l_api_name    CONSTANT     VARCHAR2(30)   := 'check_unit_quarantined';
7694   L_FULL_NAME   CONSTANT VARCHAR2(60) := G_PKG_NAME || '.' || L_API_NAME;
7695   L_DEBUG       CONSTANT VARCHAR2(90) := 'ahl.plsql.'||L_FULL_NAME;
7696 
7697   l_unit_name                VARCHAR2(80);
7698   l_task_number              NUMBER(15);
7699   l_instance_id              NUMBER;
7700   l_quarantined              VARCHAR2(1);
7701 
7702   CURSOR c_get_tasknumbers (x_visit_id IN NUMBER) IS
7703   SELECT   visit_task_number,instance_id
7704   FROM  ahl_visit_tasks_vl
7705   WHERE visit_id = x_visit_id
7706   AND   NVL(STATUS_CODE,'X') NOT IN ('DELETED','RELEASED')
7707   AND   TASK_TYPE_CODE <> 'SUMMARY';
7708 
7709 BEGIN
7710     -- log at the begining of the procedure
7711     IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level) THEN
7712       fnd_log.string(fnd_log.level_procedure,L_DEBUG||'.begin','At the start of PLSQL procedure - Visit Id : '||p_visit_id||' - '||'item_instance_id : '||item_instance_id);
7713     END IF;
7714 
7715    IF item_instance_id IS NOT NULL THEN
7716    -- If the Visit header has an instance id, check for the corresponding Unit
7717       l_quarantined := ahl_util_uc_pkg.is_unit_quarantined(null,item_instance_id);
7718       IF l_quarantined = FND_API.G_TRUE THEN
7719          l_unit_name := ahl_util_uc_pkg.get_unit_name(item_instance_id);
7720          Fnd_Message.SET_NAME('AHL','AHL_VWP_CLOSE_HDR_UNIT_QRNT');
7721          -- The Unit for this Visit (UNIT_NAME-1) is quarantined.
7722          Fnd_Message.Set_Token('UNIT_NAME',l_unit_name);
7723          Fnd_Msg_Pub.ADD;
7724          -- log message
7725          IF (l_log_statement >= l_log_current_level)THEN
7726             fnd_log.string(fnd_log.level_statement,L_DEBUG,l_unit_name || 'Unit is quarantined, Error message added');
7727          END IF;  -- log
7728       END IF;  -- l_quarantined not true
7729    ELSE -- instance id is null
7730    -- If the visit does not have a unit at the header , then check for the units of all tasks
7731       OPEN c_get_tasknumbers (p_visit_id);
7732       LOOP
7733          FETCH c_get_tasknumbers INTO l_task_number,l_instance_id;
7734          EXIT WHEN c_get_tasknumbers%NOTFOUND;
7735          l_quarantined := ahl_util_uc_pkg.is_unit_quarantined(null,l_instance_id);
7736          IF l_quarantined = FND_API.G_TRUE THEN
7737             Fnd_Message.SET_NAME('AHL','AHL_VWP_CLOSE_TSK_UNIT_QRNT');
7738             -- The Unit for the Task (UNIT_NAME-1) is quarantined.
7739             Fnd_Message.Set_Token('TASK_NUMBER',l_task_number);
7740             Fnd_Msg_Pub.ADD;
7741             -- log message
7742             IF (l_log_statement >= l_log_current_level)THEN
7743               fnd_log.string(fnd_log.level_statement,L_DEBUG,l_task_number || 'Unit for this task is quarantined.');
7744             END IF;  -- log
7745          END IF;  -- l_quarantined not true
7746       END LOOP;   --  c_get_tasknumbers
7747    END IF;
7748 
7749    -- log at the end of the procedure
7750    IF (l_log_procedure >= l_log_current_level) THEN
7751     fnd_log.string(fnd_log.level_procedure,L_DEBUG||'.end','At the end of PL SQL procedure');
7752    END IF;
7753 END check_unit_quarantined;
7754 
7755 -- SKPATHAK :: Bug 9115894 :: 23-NOV-2009 :: START
7756 -- Added this procedure to get the messages from message stack and store it in a table
7757 PROCEDURE Get_Message_Stack (
7758     x_message_stack_tbl OUT NOCOPY G_MESSAGE_STACK_TBL
7759    )
7760 IS
7761     l_msg_count NUMBER;
7762     l_msg_data  VARCHAR2(2000);
7763     l_msg_index_out NUMBER;
7764 
7765 BEGIN
7766 
7767     l_msg_count := Fnd_Msg_Pub.count_msg;
7768      IF (l_msg_count > 0 ) THEN
7769         FOR i IN 1..l_msg_count
7770         LOOP
7771           fnd_msg_pub.get( p_msg_index => i,
7772                            p_encoded   => FND_API.G_FALSE,
7773                            p_data      => l_msg_data,
7774                            p_msg_index_out => l_msg_index_out);
7775 
7776           x_message_stack_tbl(i)  :=  l_msg_data;
7777           IF (l_log_statement >= l_log_current_level) THEN
7778               fnd_log.string(l_log_statement,'ahl.plsql.AHL_VWP_VISITS_PVT.Get_Message_Stack',
7779                              'Error - '||l_msg_data);
7780           END IF;
7781         END LOOP;
7782       END IF;
7783 
7784 END Get_Message_Stack;
7785 
7786 -- Added this procedure to put the messages stored above back to the message stack
7787 PROCEDURE Set_Message_Stack (
7788     p_message_stack_tbl IN G_MESSAGE_STACK_TBL
7789    )
7790 IS
7791 l_token VARCHAR2(2000);
7792 
7793 BEGIN
7794 
7795     IF (p_message_stack_tbl.COUNT > 0) THEN
7796       FOR i IN p_message_stack_tbl.FIRST..p_message_stack_tbl.LAST LOOP
7797           FND_MESSAGE.SET_NAME('AHL','AHL_LTP_ATP_ERROR');
7798           FND_MESSAGE.SET_TOKEN('ERROR',p_message_stack_tbl(i));
7799           FND_MSG_PUB.Add;
7800       END LOOP;
7801     END IF;
7802 
7803 END Set_Message_Stack;
7804 -- SKPATHAK :: Bug 9115894 :: 23-NOV-2009 :: END
7805 
7806 
7807 -- New Procedure added by surrkuma on 15-JUL-2010 for bug 9901811
7808 -- Unschedule ATP Materials when a visit undergoes an org Change
7809 PROCEDURE Handle_Visit_Org_Change(p_visit_id IN NUMBER)
7810 IS
7811   L_API_NAME  CONSTANT VARCHAR2(30) := 'Handle_Visit_Org_Change';
7812   L_FULL_NAME CONSTANT VARCHAR2(60) := G_PKG_NAME || '.' || L_API_NAME;
7813   L_DEBUG_KEY CONSTANT VARCHAR2(99) := 'ahl.plsql.'||L_FULL_NAME;
7814 
7815   CURSOR visit_mtrls_cur IS
7816     SELECT vtm.visit_id,
7817            vtm.visit_task_id,
7818            vtm.schedule_material_id,
7819            vtm.object_version_number,
7820            vtm.inventory_item_id,
7821            vtm.scheduled_date,
7822            vtm.scheduled_quantity,
7823            vtm.item_number,
7824            asm.organization_id,
7825            asm.requested_quantity,
7826            asm.uom,
7827            asm.requested_date,
7828            asm.scheduled_date asm_scheduled_date
7829       FROM ahl_visit_task_matrl_v vtm,
7830            ahl_schedule_materials asm
7831      WHERE vtm.visit_id = p_visit_id
7832        AND asm.scheduled_material_id = vtm.schedule_material_id;
7833 
7834   l_visit_mtrls_rec   visit_mtrls_cur%ROWTYPE;
7835   l_unsched_mtl_tbl   AHL_LTP_MATRL_AVAL_PUB.Planned_Matrl_Tbl;
7836   l_unsched_mtl_index NUMBER := 1;
7837   l_return_status     VARCHAR2(1);
7838   l_msg_count         NUMBER;
7839   l_msg_data          VARCHAR2(2000);
7840 
7841 BEGIN
7842   IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level) THEN
7843     fnd_log.string(fnd_log.level_procedure, L_DEBUG_KEY||'.begin', 'At the start of PLSQL procedure. p_visit_id: '|| p_visit_id);
7844   END IF;
7845   -- Retrieve the materials for all tasks in the visit
7846   OPEN visit_mtrls_cur;
7847   LOOP
7848     FETCH visit_mtrls_cur INTO l_visit_mtrls_rec;
7849     EXIT WHEN visit_mtrls_cur%NOTFOUND;
7850     IF l_visit_mtrls_rec.schedule_material_id IS NOT NULL THEN
7851       -- Add this requirement to l_unsched_mtl_tbl for ATP unscheduling
7852       IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
7853         fnd_log.string(fnd_log.level_statement, L_DEBUG_KEY,
7854                        'l_unsched_mtl_index = ' || l_unsched_mtl_index ||
7855                        ', Adding Requirement with id ' || l_visit_mtrls_rec.schedule_material_id || ' to l_unsched_mtl_tbl for Unscheduling.');
7856       END IF;
7857       l_unsched_mtl_tbl(l_unsched_mtl_index).visit_id             := l_visit_mtrls_rec.visit_id;
7858       l_unsched_mtl_tbl(l_unsched_mtl_index).visit_task_id        := l_visit_mtrls_rec.visit_task_id;
7859       l_unsched_mtl_tbl(l_unsched_mtl_index).inventory_item_id    := l_visit_mtrls_rec.inventory_item_id;
7860       l_unsched_mtl_tbl(l_unsched_mtl_index).item_description     := l_visit_mtrls_rec.item_number;
7861       l_unsched_mtl_tbl(l_unsched_mtl_index).organization_id      := l_visit_mtrls_rec.organization_id;
7862       l_unsched_mtl_tbl(l_unsched_mtl_index).schedule_material_id := l_visit_mtrls_rec.schedule_material_id;
7863       l_unsched_mtl_tbl(l_unsched_mtl_index).required_quantity    := l_visit_mtrls_rec.requested_quantity;
7864       l_unsched_mtl_tbl(l_unsched_mtl_index).primary_uom_code     := l_visit_mtrls_rec.uom;
7865       l_unsched_mtl_tbl(l_unsched_mtl_index).requested_date       := l_visit_mtrls_rec.requested_date;
7866       l_unsched_mtl_index := l_unsched_mtl_index + 1;
7867     END IF; --Schedule material not null
7868   END LOOP;
7869   CLOSE visit_mtrls_cur;
7870   IF (l_unsched_mtl_tbl.COUNT > 0) THEN
7871     -- Call ATP to unschedule the soft Deleted requirements
7872     IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
7873       fnd_log.string(fnd_log.level_statement, L_DEBUG_KEY,
7874                      'Before calling AHL_LTP_MATRL_AVAL_PVT.Unschedule_deleted_materials. l_unsched_mtl_tbl.COUNT = ' || l_unsched_mtl_tbl.COUNT);
7875     END IF;
7876     AHL_LTP_MATRL_AVAL_PVT.Unschedule_deleted_materials(p_api_version       => 1.0,
7877                                                         p_deleted_matrl_tbl => l_unsched_mtl_tbl,
7878                                                         x_return_status     => l_return_status,
7879                                                         x_msg_count         => l_msg_count,
7880                                                         x_msg_data          => l_msg_data);
7881     IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
7882       fnd_log.string(fnd_log.level_statement, L_DEBUG_KEY,
7883                      'After returning from AHL_LTP_MATRL_AVAL_PVT.Unschedule_deleted_materials, l_return_status = ' || l_return_status);
7884     END IF;
7885   END IF;
7886   IF (l_log_procedure >= l_log_current_level) THEN
7887    fnd_log.string(fnd_log.level_procedure, L_DEBUG_KEY||'.end', 'At the end of PL SQL procedure');
7888   END IF;
7889 
7890 END Handle_Visit_Org_Change;
7891 
7892 -- PRAKKUM :: VWPE: ER:12730539  :: 23-JUN-2011 :: START
7893 
7894 ---------------------------------------------------------------------------------------
7895 -- FUNCTION
7896 --    Is_Old_Visit
7897 -- Type             : Public
7898 -- PURPOSE
7899 --    To find out whether visit got created earlier to enhancements (ER:12730539) or not
7900 ----------------------------------------------------------------------------------------
7901 
7902 FUNCTION Is_Old_Visit(p_visit_id IN NUMBER)
7903 RETURN VARCHAR2
7904 IS
7905  -- To find out the maximum task number value in the visit
7906   CURSOR c_is_old_visit IS
7907   select sum(1) from AHL_VISITS_B VST,
7908   ahl_vwp_stages_b STG
7909   WHERE VST.visit_id = STG.VISIT_ID AND VST.VISIT_ID = p_visit_id
7910   AND nvl2(STG.stage_status_code,'Y','N') = 'N';
7911 
7912   l_is_old_visit       VARCHAR2(1) := 'N';
7913   l_new_vst_count      NUMBER := NULL;
7914   L_API_NAME           CONSTANT VARCHAR2(30) := 'Is_Old_Visit';
7915   L_DEBUG_KEY          CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
7916 
7917 BEGIN
7918 
7919    IF (l_log_procedure >= l_log_current_level) THEN
7920       fnd_log.string(l_log_procedure,
7921                      L_DEBUG_KEY ||'.begin',
7922                      'At the start of PL SQL function.');
7923    END IF;
7924 
7925    IF (l_log_statement >= l_log_current_level) THEN
7926       fnd_log.string(l_log_statement,L_DEBUG_KEY, ' Visit Id = ' || p_visit_id);
7927    END IF;
7928 
7929    -- Check for Stage Number
7930    OPEN c_is_old_visit;
7931    FETCH c_is_old_visit INTO l_new_vst_count;
7932    CLOSE c_is_old_visit;
7933 
7934    -- A visit is considered as old visit only if visit is holding stages with status code as null.
7935    IF l_new_vst_count is NOT NULL THEN
7936       l_is_old_visit := 'Y';
7937    ELSE
7938       l_is_old_visit := 'N';
7939    END IF;
7940 
7941    IF (l_log_statement >= l_log_current_level) THEN
7942       fnd_log.string(l_log_statement,L_DEBUG_KEY, ' l_is_old_visit = ' || l_is_old_visit);
7943    END IF;
7944 
7945    IF (l_log_procedure >= l_log_current_level) THEN
7946       fnd_log.string(l_log_procedure,
7947                      L_DEBUG_KEY ||'.end',
7948                      'At the end of PL SQL function.');
7949    END IF;
7950    RETURN l_is_old_visit;
7951 
7952 END Is_Old_Visit;
7953 
7954 -- PRAKKUM :: VWPE: ER:12730539  :: 23-JUN-2011 :: END
7955 
7956 END AHL_VWP_VISITS_PVT;