DBA Data[Home] [Help]

PACKAGE BODY: APPS.AHL_VWP_VISITS_STAGES_PVT

Source


1 PACKAGE BODY AHL_VWP_VISITS_STAGES_PVT AS
2 /* $Header: AHLVSTGB.pls 120.0 2005/05/26 01:54:14 appldev noship $ */
3 
4 -----------------------------------------------------------
5 -- PACKAGE
6 --    AHL_VWP_VISITS_STAGES_PVT
7 --
8 -- PURPOSE
9 --    This package specification is a Private API for managing
10 --    Planning --> Visit Work Package --> VISITS --> STAGES
11 --    related procedures in Complex Maintainance, Repair and Overhauling(CMRO).
12 --
13 --    It defines used pl/sql records and tables datatypes
14 --
15 --
16 -- NOTES
17 --
18 --
19 -- HISTORY
20 -- 04-FEB-2004    ADHARIA       POST 11.5.10 Created.
21 
22 -----------------------------------------------------------------
23 --   Define Global CONSTANTS                                   --
24 -----------------------------------------------------------------
25 G_PKG_NAME             CONSTANT VARCHAR2(30) := 'AHL_VWP_VISIT_STAGES_PVT';
26 G_DEBUG 		        VARCHAR2(1)  := AHL_DEBUG_PUB.is_log_enabled;
27 ---------------------------------------------------------------------
28 --   Define Record Types for record structures needed by the APIs  --
29 ---------------------------------------------------------------------
30 -- NO RECORD TYPES *************
31 
32 --------------------------------------------------------------------
33 -- Define Table Type for Records Structures                       --
34 --------------------------------------------------------------------
35 TYPE Dept_Tbl_Type IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
36 
37 --------------------------------------------------------------------
38 --  START: Defining local functions and procedures SIGNATURES     --
39 --------------------------------------------------------------------
40 FUNCTION  Get_Stage_Id
41 RETURN NUMBER;
42 
43 PROCEDURE VALIDATE_STAGES(
44    p_visit_id		     in number,
45    p_stages_rec              IN     Visit_Stages_Rec_Type,
46    x_return_status           OUT    NOCOPY VARCHAR2,
47    x_msg_count               OUT    NOCOPY NUMBER,
48    x_msg_data                OUT    NOCOPY VARCHAR2
49 );
50 
51 procedure default_missing_attributes(
52    p_x_stages_rec              IN OUT NOCOPY     Visit_Stages_Rec_Type
53 );
54 
55 --Added by amagrawa
56 PROCEDURE Validate_bef_Times_Derive
57  ( p_visit_id	      IN	NUMBER,
58    x_valid_flag       OUT NOCOPY VARCHAR2,
59    x_return_status    OUT NOCOPY VARCHAR2,
60    x_error_msg_code   OUT NOCOPY VARCHAR2
61    );
62 --End of changes by amagrawa
63 --------------------------------------------------------------------
64 --  END: Defining local functions and procedures SIGNATURES       --
65 --------------------------------------------------------------------
66 
67 -- ****************************************************************
68 
69 --------------------------------------------------------------------
70 -- START: Defining local functions and procedures BODY            --
71 --------------------------------------------------------------------
72 
73 --------------------------------------------------------------------
74 -- END: Defining local functions and procedures BODY              --
75 --------------------------------------------------------------------
76 
77 -- *************************************************************
78 
79 ----------------------------------------------------------------------
80 -- START: Defining procedures BODY, which are called from UI screen --
81 ----------------------------------------------------------------------
82 
83 --------------------------------------------------------------------
84 -- PROCEDURE
85 --    Get_Stages_Details
86 --
87 -- PURPOSE
88 --    Get a particular Stage Records with all details
89 --------------------------------------------------------------------
90 PROCEDURE Get_Stages_Details (
91    p_api_version             IN   NUMBER,
92    p_init_msg_list           IN   VARCHAR2  := Fnd_Api.g_false,
93    p_commit                  IN   VARCHAR2  := Fnd_Api.g_false,
94    p_validation_level        IN   NUMBER    := Fnd_Api.g_valid_level_full,
95    p_module_type             IN   VARCHAR2  := 'JSP',
96    p_visit_id                IN   NUMBER,
97    p_start_row               IN   NUMBER,
98    p_rows_per_page           IN	  NUMBER,
99 
100 
101    x_stages_tbl               OUT  NOCOPY Visit_stages_tbl_Type,
102    x_row_count               OUT  NOCOPY NUMBER,
103 
104    x_return_status           OUT  NOCOPY VARCHAR2,
105    x_msg_count               OUT  NOCOPY NUMBER,
106    x_msg_data                OUT  NOCOPY VARCHAR2
107 )
108 IS
109 
110    L_API_VERSION        CONSTANT NUMBER := 1.0;
111    L_API_NAME           CONSTANT VARCHAR2(30) := 'Get_Stages_Details';
112    L_FULL_NAME          CONSTANT VARCHAR2(60) := G_PKG_NAME || '.' || L_API_NAME;
113 
114    l_msg_data           VARCHAR2(2000);
115    l_return_status      VARCHAR2(1);
116    l_valid_flag         VARCHAR2(1) := 'N';
117    l_stages_tbl         Visit_stages_tbl_Type;
118    l_st_ind                  number := 0;
119    l_dept_id		     number;
120    l_visit_start_date    DATE;
121 
122    l_cum_duration        NUMBER :=0;
123 
124 
125 -- To find visit related information
126 CURSOR c_visit (x_id IN NUMBER)
127 IS
128       SELECT START_DATE_TIME , department_id FROM AHL_VISITS_VL
129       WHERE VISIT_ID = x_id;
130 --
131 CURSOR C_STAGE(C_VISIT_ID number)
132 is
133 	select s.stage_id, s.stage_num, s.stage_name,
134           s.object_version_number, s.duration
135     from ahl_vwp_stages_vl s
136 	where s.visit_id = c_visit_id
137     order by s.stage_num;
138 
139 l_stage_rec             C_STAGE%rowtype;
140 
141 CURSOR C_STAGE_DATE(C_STAGE_ID number)
142 is
143 	select vt.stage_id,
144 	--       sum(s.duration) over(order by s.stage_num) CUMUL_DURATION,
145 	--       min(vt.start_date_time) start_date_time,
146 	       max(vt.end_date_time) end_date_time
147 	from ahl_visit_tasks_b vt
148 	where vt.stage_id = C_STAGE_ID
149     AND nvl(vt.status_code,'X') <> 'DELETED'
150 	group by vt.stage_id;
151 
152 l_stage_date_rec             c_stage_date%rowtype;
153 
154 BEGIN
155   -- Standard start of API savepoint
156   SAVEPOINT Get_Stages_Details;
157 
158   -- Check if API is called in debug mode. If yes, enable debug.
159    IF G_DEBUG='Y' THEN
160       AHL_DEBUG_PUB.enable_debug;
161    END IF;
162 
163    -- Debug info.
164    IF Ahl_Debug_Pub.G_FILE_DEBUG THEN
165        IF G_DEBUG='Y' THEN
166 	  AHL_DEBUG_PUB.debug( l_full_name ||':*****Start*****');
167        END IF;
168     END IF;
169 
170    IF Fnd_Api.to_boolean (p_init_msg_list) THEN
171       Fnd_Msg_Pub.initialize;
172    END IF;
173 
174    --  Initialize API return status to success
175     x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
176 
177    -- Standard call to check for call compatibility.
178    IF NOT Fnd_Api.compatible_api_call(
179          l_api_version,
180          p_api_version,
181          l_api_name,
182          G_PKG_NAME
183    ) THEN
184       RAISE Fnd_Api.g_exc_unexpected_error;
185    END IF;
186 
187 
188 
189    ------------------------Start of API ----------------------
190 	x_row_count := 0;
191    -- Cursor to find visit start time
192      OPEN c_visit (p_visit_id);
193      FETCH c_visit INTO l_visit_start_date,l_dept_id;
194      CLOSE c_visit;
195 
196 --Added by amagrawa
197        Validate_bef_Times_Derive
198             (p_visit_id	      => p_visit_id,
199              x_valid_flag     => l_valid_flag,
200              x_return_status  => l_return_status,
201              x_error_msg_code => l_msg_data);
202 -- To check if
203  -- Modified by amagrawa as per review comments.
204        IF(l_valid_flag ='N') THEN
205 
206 		    	 FOR l_stage_rec IN C_STAGE(P_VISIT_ID)
207 		         LOOP
208 
209                      l_st_ind := l_stage_rec.stage_num -1;
210 
211          			 l_stages_tbl(l_st_ind).stage_id := l_stage_rec.stage_id;
212 			         l_stages_tbl(l_st_ind).stage_num := l_stage_rec.stage_num;
213 			         l_stages_tbl(l_st_ind).stage_name := l_stage_rec.stage_name;
214 			         l_stages_tbl(l_st_ind).object_version_number := l_stage_rec.object_version_number;
215 			         l_stages_tbl(l_st_ind).duration := l_stage_rec.duration;
216    	                 l_stages_tbl(l_st_ind).stage_planned_start_time :=null;
217 		             l_stages_tbl(l_st_ind).stage_planned_end_time := null;
218                      l_stages_tbl(l_st_ind).Stage_Actual_End_Time := null;
219 
220 	             END LOOP;
221        ELSE --Return Status = 'S'
222 -- End of changes by amagrawa
223 		 FOR l_stage_rec IN C_STAGE(P_VISIT_ID)
224 		 LOOP
225 
226             l_st_ind := l_stage_rec.stage_num -1;
227             l_cum_duration := l_cum_duration + l_stage_rec.duration;
228 
229          	l_stages_tbl(l_st_ind).stage_id := l_stage_rec.stage_id;
230 			l_stages_tbl(l_st_ind).stage_num := l_stage_rec.stage_num;
231 			l_stages_tbl(l_st_ind).stage_name := l_stage_rec.stage_name;
232 			l_stages_tbl(l_st_ind).object_version_number := l_stage_rec.object_version_number;
233 			l_stages_tbl(l_st_ind).duration := l_stage_rec.duration;
234    	        l_stages_tbl(l_st_ind).stage_planned_start_time :=
235             AHL_VWP_TIMES_PVT.compute_date(l_visit_start_date, l_dept_id, l_cum_duration - l_stage_rec.duration);
236 		    l_stages_tbl(l_st_ind).stage_planned_end_time :=
237   		    AHL_VWP_TIMES_PVT.compute_date(l_visit_start_date, l_dept_id, l_cum_duration );
238 
239             l_stage_date_rec := null;
240 
241             OPEN C_STAGE_DATE(l_stage_rec.stage_id);
242             FETCH C_STAGE_DATE INTO l_stage_date_rec;
243             CLOSE C_STAGE_DATE;
244 
245             l_stages_tbl(l_st_ind).Stage_Actual_End_Time := l_stage_date_rec.end_date_time;
246 
247            END LOOP;
248          END IF; --start and dept not null
249  -- Modified by amagrawa as per review comments.
250          		 x_row_count := l_stages_tbl.count;
251   --               x_return_status := FND_API.G_RET_STS_SUCCESS;
252 
253 	 --------------------------
254       x_stages_tbl := l_stages_tbl;
255 
256    ------------------------End of API Body------------------------------------
257     -- Standard call to get message count and if count is 1, get message info
258         Fnd_Msg_Pub.Count_And_Get
259         ( p_count => x_msg_count,
260           p_data  => x_msg_data,
261           p_encoded => Fnd_Api.g_false);
262 
263     -- Check if API is called in debug mode. If yes, enable debug.
264         IF G_DEBUG='Y' THEN
265 		     AHL_DEBUG_PUB.enable_debug;
266         END IF;
267 
268     -- Debug info.
269 -- Commented by amagrawa as per review comments.
270 --    IF Ahl_Debug_Pub.G_FILE_DEBUG THEN
271        IF G_DEBUG='Y' THEN
272 		 AHL_DEBUG_PUB.debug(L_FULL_NAME||'AHL_VWP_Tasks_PVT - End');
273 	   END IF;
274 --    END IF;
275 
276    -- Check if API is called in debug mode. If yes, disable debug.
277     IF G_DEBUG='Y' THEN
278        AHL_DEBUG_PUB.disable_debug;
279     END IF;
280     RETURN;
281 
282 EXCEPTION
283  WHEN Fnd_Api.G_EXC_ERROR THEN
284    x_return_status := Fnd_Api.G_RET_STS_ERROR;
285    ROLLBACK TO Get_Stages_Details;
286    Fnd_Msg_Pub.count_and_get( p_count => x_msg_count,
287                               p_data  => x_msg_data,
288                               p_encoded => Fnd_Api.g_false);
289  WHEN Fnd_Api.G_EXC_UNEXPECTED_ERROR THEN
290    x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
291    ROLLBACK TO Get_Stages_Details;
292    Fnd_Msg_Pub.count_and_get( p_count => x_msg_count,
293                               p_data  => x_msg_data,
294                                p_encoded => Fnd_Api.g_false);
295  WHEN OTHERS THEN
296       ROLLBACK TO Get_Stages_Details;
297       x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
298       IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_unexp_error)
299 		THEN
300          Fnd_Msg_Pub.add_exc_msg (G_PKG_NAME, l_api_name);
301       END IF;
302       Fnd_Msg_Pub.count_and_get (
303             p_encoded => Fnd_Api.g_false,
304             p_count   => x_msg_count,
305             p_data    => x_msg_data  );
306 
307 
308 END Get_Stages_Details;
309 
310 
311 --------------------------------------------------------------------
312 -- PROCEDURE
313 --    Create_Stages
314 --
315 -- PURPOSE
316 --    To create a Stage for visit based on the profile value set.
317 --    this procedure defaults the stage_num and stage_name to count and duration to 0.
318 --    will be called by create_visit and only the visit_id is passed.
319 --------------------------------------------------------------------
320 PROCEDURE Create_Stages (
321    p_api_version             IN     NUMBER,
322    p_init_msg_list           IN     VARCHAR2  := Fnd_Api.g_false,
323    p_commit                  IN     VARCHAR2  := Fnd_Api.g_false,
324    p_validation_level        IN     NUMBER    := Fnd_Api.g_valid_level_full,
325    p_module_type             IN     VARCHAR2  := 'JSP',
326 
327    p_visit_id                IN     NUMBER,
328    x_return_status           OUT    NOCOPY VARCHAR2,
329    x_msg_count               OUT    NOCOPY NUMBER,
330    x_msg_data                OUT    NOCOPY VARCHAR2
331 )
332 IS
333   -- Define local Variables
334    L_API_VERSION           CONSTANT NUMBER := 1.0;
335    L_API_NAME              CONSTANT VARCHAR2(30) := 'Create Stages';
336    L_FULL_NAME             CONSTANT VARCHAR2(60) := G_PKG_NAME || '.' || L_API_NAME;
337 
338    l_msg_data              VARCHAR2(2000);
339    l_msg_count             NUMBER;
340 
341    l_stage_count           NUMBER;
342    l_rowid                 ROWID;
343 
344 
345 BEGIN
346    --------------------- Initialize -----------------------
347    SAVEPOINT Create_Stage;
348 
349    -- Check if API is called in debug mode. If yes, enable debug.
350    IF G_DEBUG='Y' THEN
351    Ahl_Debug_Pub.enable_debug;
352    END IF;
353 
354    -- Debug info.
355    IF G_DEBUG='Y' THEN
356        AHL_DEBUG_PUB.Debug( l_full_name ||': Start');
357    END IF;
358 
359    -- Initialize message list if p_init_msg_list is set to TRUE.
360    IF Fnd_Api.to_boolean(p_init_msg_list)
361    THEN
362      Fnd_Msg_Pub.initialize;
363    END IF;
364 
365     --  Initialize API return status to success
366     x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
367 
368    -- Standard call to check for call compatibility.
369    IF NOT Fnd_Api.COMPATIBLE_API_CALL(l_api_version,
370                                       p_api_version,
371                                       l_api_name,G_PKG_NAME)
372    THEN
373        RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
374    END IF;
375 
376    ------------------------Start of API Body------------------------------------
377 
378    --------------------Value OR ID conversion---------------------------
379 /*  not reqd;
380    IF p_module_type = 'JSP'
381    THEN
382      -- do nothing;
383    END IF;
384 */
385 
386    -------------------------------- Validate -----------------------------------------
387 
388     IF G_DEBUG='Y' THEN
389 		 AHL_DEBUG_PUB.Debug( l_full_name ||':START VALIDATE');
390     END IF;
391 
392    --
393    -- Check for the ID.
394    --
395    IF (P_VISIT_ID = Fnd_Api.g_miss_num OR P_VISIT_ID IS Null)
396    THEN
397              Fnd_Message.SET_NAME('AHL','AHL_VWP_VISIT_INVALID');
398              Fnd_Msg_Pub.ADD;
399    END IF;
400 
401     --
402     -- Check profile
403     --
404     l_stage_count := FND_PROFILE.value('AHL_NUMBER_OF_STAGES');
405 -- Modified by amagrawa as per review comments.
406     If l_stage_count is null
407     then
408              Fnd_Message.SET_NAME('AHL','AHL_VWP_ST_PROFILE_NOT_DEF');
409              Fnd_Msg_Pub.ADD;
410              x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
411              RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
412     ELSIF l_stage_count <= 0
413 	then
414              Fnd_Message.SET_NAME('AHL','AHL_VWP_ST_PROFILE_GT_ZERO');
415              Fnd_Msg_Pub.ADD;
416              x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
417              RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
418     ELSIF l_stage_count <> floor(l_stage_count)
419     then
420              Fnd_Message.SET_NAME('AHL','AHL_VWP_ST_PROFILE_NOT_INT');
421              Fnd_Msg_Pub.ADD;
422              x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
423              RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
424 	END IF;
425 
426 
427 /*   --Standard check to count messages
428    l_msg_count := Fnd_Msg_Pub.count_msg;
429 
430    IF l_msg_count > 0 THEN
431       x_msg_count := l_msg_count;
432       x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
433       RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
434    END IF;
435 */
436    IF G_DEBUG='Y' THEN
437 		 AHL_DEBUG_PUB.Debug( l_full_name ||':END VALIDATE');
438    END IF;
439 
440    -------------------------- Insert --------------------------
441     IF G_DEBUG='Y' THEN
442        AHL_DEBUG_PUB.Debug( l_full_name ||':Insert');
443     END IF;
444 
445 
446     FOR I IN 1..L_STAGE_COUNT
447     LOOP
448 
449         -- Invoke the table handler to create a record
450         --
451 
452 	   Ahl_VWP_Stages_Pkg.Insert_Row (
453 	     X_ROWID                 => l_rowid,
454 	     X_VISIT_ID              => P_VISIT_ID,
455 	     X_STAGE_ID              => Get_Stage_Id,
456 	     X_STAGE_NUM             => i,
457 	     X_STAGE_NAME            => i,
458 	     X_DURATION              => 0,
459 	     X_OBJECT_VERSION_NUMBER => 1,
460 
461    	     X_ATTRIBUTE_CATEGORY      => NULL,
462 	     X_ATTRIBUTE1              => NULL ,
463 	     X_ATTRIBUTE2              => NULL ,
464 	     X_ATTRIBUTE3              => NULL ,
465 	     X_ATTRIBUTE4              => NULL ,
466 	     X_ATTRIBUTE5              => NULL ,
467 	     X_ATTRIBUTE6              => NULL ,
468 	     X_ATTRIBUTE7              => NULL ,
469 	     X_ATTRIBUTE8              => NULL ,
470 	     X_ATTRIBUTE9              => NULL ,
471 	     X_ATTRIBUTE10             => NULL ,
472 	     X_ATTRIBUTE11             => NULL ,
473 	     X_ATTRIBUTE12             => NULL ,
474 	     X_ATTRIBUTE13             => NULL ,
475 	     X_ATTRIBUTE14             => NULL ,
476 	     X_ATTRIBUTE15             => NULL ,
477 
478 	     X_CREATION_DATE         => SYSDATE,
479 	     X_CREATED_BY            => Fnd_Global.USER_ID,
480 	     X_LAST_UPDATE_DATE      => SYSDATE,
481 	     X_LAST_UPDATED_BY       => Fnd_Global.USER_ID,
482 	     X_LAST_UPDATE_LOGIN     => Fnd_Global.LOGIN_ID);
483 
484      IF G_DEBUG='Y' THEN
485        AHL_DEBUG_PUB.Debug( l_full_name ||': Visit ID =' || P_VISIT_ID);
486        AHL_DEBUG_PUB.Debug( l_full_name ||': STAGE Number =' ||  I);
487      END IF;
488    END LOOP;
489 
490   ---------------------------End of API Body---------------------------------------
491    --Standard check to count messages
492    l_msg_count := Fnd_Msg_Pub.count_msg;
493 
494    IF l_msg_count > 0 THEN
495       X_msg_count := l_msg_count;
496       X_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
497       RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
498    END IF;
499 
500    --Standard check for commit
501    IF Fnd_Api.TO_BOOLEAN(p_commit) THEN
502       COMMIT;
503    END IF;
504 
505    IF G_DEBUG='Y' THEN
506        AHL_DEBUG_PUB.Debug( l_full_name ||':End');
507    END IF;
508 
509    -- Check if API is called in debug mode. If yes, disable debug.
510    IF G_DEBUG='Y' THEN
511       Ahl_Debug_Pub.disable_debug;
512    END IF;
513 EXCEPTION
514    WHEN Fnd_Api.g_exc_error THEN
515       ROLLBACK TO Create_Stage;
516       x_return_status := Fnd_Api.g_ret_sts_error;
517       Fnd_Msg_Pub.count_and_get(
518             p_encoded => Fnd_Api.g_false,
519             p_count   => x_msg_count,
520             p_data    => x_msg_data
521       );
522    WHEN Fnd_Api.g_exc_unexpected_error THEN
523       ROLLBACK TO Create_Stage;
524       x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
525       Fnd_Msg_Pub.count_and_get (
526             p_encoded => Fnd_Api.g_false,
527             p_count   => x_msg_count,
528             p_data    => x_msg_data
529       );
530    WHEN OTHERS THEN
531       ROLLBACK TO Create_Stage;
532       x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
533       IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_unexp_error)
534 		THEN
535          Fnd_Msg_Pub.add_exc_msg (G_PKG_NAME, l_api_name);
536       END IF;
537       Fnd_Msg_Pub.count_and_get (
538             p_encoded => Fnd_Api.g_false,
539             p_count   => x_msg_count,
540             p_data    => x_msg_data
541       );
542 END Create_StageS;
543 
544 
545 --------------------------------------------------------------------
546 -- PROCEDURE
547 --    Update_Stages
548 --
549 -- PURPOSE
550 --    To create a Stage for visit based on the profile value set.
551 --    this procedure defaults the stage_num and stage_name to count and duration to 0.
552 --    will be called by create_visit and only the visit_id is passed.
553 --------------------------------------------------------------------
554 PROCEDURE Update_Stages (
555    p_api_version             IN     NUMBER,
556    p_init_msg_list           IN     VARCHAR2  := Fnd_Api.g_false,
557    p_commit                  IN     VARCHAR2  := Fnd_Api.g_false,
558    p_validation_level        IN     NUMBER    := Fnd_Api.g_valid_level_full,
559    p_module_type             IN     VARCHAR2  := 'JSP',
560 
561    p_visit_id                IN     NUMBER,
562    p_x_stages_tbl            IN  OUT NOCOPY Visit_Stages_Tbl_Type,
563 
564    x_return_status           OUT    NOCOPY VARCHAR2,
565    x_msg_count               OUT    NOCOPY NUMBER,
566    x_msg_data                OUT    NOCOPY VARCHAR2
567 )
568 IS
569   -- Define local Variables
570    L_API_VERSION           CONSTANT NUMBER := 1.0;
571    L_API_NAME              CONSTANT VARCHAR2(30) := 'Update Stages';
572    L_FULL_NAME             CONSTANT VARCHAR2(60) := G_PKG_NAME || '.' || L_API_NAME;
573 
574    l_msg_data              VARCHAR2(2000);
575    l_msg_count             NUMBER;
576    l_dummy                 varchar2(1);
577    l_visit_status          varchar2(30);
578    l_return_status         varchar2(1);
579    l_validate_status       varchar2(1);
580 
581    l_planned_order_flag VARCHAR2(1);
582 
583 CURSOR c_check_visit_status(C_VISIT_ID NUMBER) IS
584        SELECT status_code FROM AHL_VISITS_B
585                   WHERE VISIT_ID = C_VISIT_ID
586                   AND STATUS_CODE IN ('PLANNING', 'PARTIALLY RELEASED', 'RELEASED' );
587 
588 -- Commented based on review comments
589 /*CURSOR C_JOB(C_VISIT_ID NUMBER , C_STAGE_NUM NUMBER )
590 IS
591 	select 'x' from ahl_workorders_v
592 	where visit_task_id in
593 	   (select DISTINCT VISIT_TASK_ID from AHL_VISIT_TASKS_B
594 	    where visit_id = C_VISIT_ID
595 	    and STAGE_ID IN (SELECT STAGE_ID FROM AHL_VWP_STAGES_B WHERE stage_num > C_STAGE_NUM
596 	                     AND VISIT_ID = C_VISIT_ID))
597 	and ( job_status_code =3  or  firm_planned_flag = 1 );
598 */
599 
600    -- To find task related information
601 
602 l_visit_end_date DATE;
603 
604 BEGIN
605    --------------------- Initialize -----------------------
606    SAVEPOINT Update_Stages;
607 
608    -- Check if API is called in debug mode. If yes, enable debug.
609    IF G_DEBUG='Y' THEN
610      Ahl_Debug_Pub.enable_debug;
611    END IF;
612 
613    -- Debug info.
614    IF G_DEBUG='Y' THEN
615        AHL_DEBUG_PUB.Debug( l_full_name ||': Start');
616    END IF;
617 
618    -- Initialize message list if p_init_msg_list is set to TRUE.
619    IF Fnd_Api.to_boolean(p_init_msg_list)
620    THEN
621      Fnd_Msg_Pub.initialize;
622    END IF;
623 
624     --  Initialize API return status to success
625     x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
626 
627    -- Standard call to check for call compatibility.
628    IF NOT Fnd_Api.COMPATIBLE_API_CALL(l_api_version,
629                                       p_api_version,
630                                       l_api_name,G_PKG_NAME)
631    THEN
632        RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
633    END IF;
634 
635    ------------------------Start of API Body------------------------------------
636 
637    --
638    -- Check for the ID.
639    --
640    IF (P_VISIT_ID = Fnd_Api.g_miss_num OR P_VISIT_ID IS Null)
641    THEN
642              Fnd_Message.SET_NAME('AHL','AHL_VWP_VISIT_NOT_FOUND');
643              Fnd_Msg_Pub.ADD;
644              -- Added by amagrawa based on review commenst
645              RAISE Fnd_Api.G_EXC_ERROR;
646    END IF;
647 
648 
649    --verify if visit status is planning or released or partially_released
650    open c_check_visit_status(p_visit_id);
651    fetch c_check_visit_status into l_visit_status;
652    if c_check_visit_status%notfound
653    then
654              Fnd_Message.SET_NAME('AHL','AHL_VWP_VISIT_STATUS_INV');
655              Fnd_Msg_Pub.ADD;
656  -- Added by amagrawa based on review commenst
657              close c_check_visit_status;
658              RAISE Fnd_Api.G_EXC_ERROR;
659    end if;
660    close c_check_visit_status;
661 
662 -- Commented by amagrawa as per review commenst.
663 /*   --Standard check to count messages
664    l_msg_count := Fnd_Msg_Pub.count_msg;
665 
666    IF l_msg_count > 0 THEN
667       x_msg_count := l_msg_count;
668       x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
669       RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
670    END IF;
671 */
672    -------------------------- Update --------------------------
673     IF G_DEBUG='Y' THEN
674        AHL_DEBUG_PUB.Debug( l_full_name ||':Insert');
675     END IF;
676 
677 
678     FOR i IN p_x_stages_tbl.FIRST..p_x_stages_tbl.LAST
679     loop
680 
681        IF G_DEBUG='Y' THEN
682    		 AHL_DEBUG_PUB.Debug( l_full_name ||':START VALIDATE');
683        END IF;
684 
685    -------------------------------- Validate -----------------------------------------
686         l_validate_status := Fnd_Api.G_RET_STS_SUCCESS;
687 
688         default_missing_attributes(p_x_stages_tbl(i));
689 
690 
691 
692         VALIDATE_STAGES(
693 	   p_visit_id		=> p_visit_id,
694 	   p_stages_rec         => p_x_stages_tbl(i),
695 	   x_return_status      => l_validate_status,
696 	   x_msg_count          => x_msg_count,
697 	   x_msg_data           => x_msg_data
698         );
699       -- Added be amagrawa based on review comments
700         IF l_validate_status <> Fnd_Api.G_RET_STS_SUCCESS THEN
701               RAISE Fnd_Api.G_EXC_ERROR;
702         END IF;
703 
704         IF G_DEBUG='Y' THEN
705    		 AHL_DEBUG_PUB.Debug( l_full_name ||':END VALIDATE');
706         END IF;
707 
708 -- Commented by amagrawa based on review comments
709 /*	-- VALIDATE IF JOB IN SUBSEQUENT STAGE IS FIRMED OR RELEASED
710 	IF l_visit_status IN ('RELEASED' , 'PARTIALLY RELEASED')
711 	 THEN
712 	     OPEN C_JOB(P_VISIT_ID, p_x_stages_tbl(i).STAGE_NUM );
713 	     FETCH C_JOB INTO L_DUMMY;
714 	     IF C_JOB%FOUND
715 	     THEN
716 		     Fnd_Message.SET_NAME('AHL','AHL_VWP_STAGE_JOB_FIRM_REL');
717 		     Fnd_Message.SET_TOKEN('STAGE_NAME', p_x_stages_tbl(i).stage_name);
718 		     Fnd_Msg_Pub.ADD;
719 		     l_validate_status := Fnd_Api.G_RET_STS_ERROR;
720 	     END IF;
721 	     CLOSE C_JOB;
722 	 END IF;
723   /* Uncommented as per Stages test case STG14 : Removed by Senthil for TC */
724 
725 ----------------------------- IF NO ERRORS UPDATE-----------------------------------------
726 	      if l_validate_status = Fnd_Api.G_RET_STS_SUCCESS
727 	      then
728 		  -- Invoke the table handler to update the record
729 		  --
730 		   Ahl_VWP_stages_Pkg.Update_Row (
731 		     X_VISIT_ID                => P_VISIT_ID,
732 		     X_STAGE_ID                => p_x_stages_tbl(i).STAGE_ID,
733 		     X_STAGE_NUM               => p_x_stages_tbl(i).STAGE_NUM,
734 		     X_STAGE_NAME              => p_x_stages_tbl(i).STAGE_NAME,
735 		     X_DURATION                => p_x_stages_tbl(i).DURATION,
736 		     X_OBJECT_VERSION_NUMBER   => p_x_stages_tbl(i).OBJECT_VERSION_NUMBER+1,
737 		     X_ATTRIBUTE_CATEGORY      => p_x_stages_tbl(i).ATTRIBUTE_CATEGORY,
738 		     X_ATTRIBUTE1              => p_x_stages_tbl(i).ATTRIBUTE1,
739 		     X_ATTRIBUTE2              => p_x_stages_tbl(i).ATTRIBUTE2,
740 		     X_ATTRIBUTE3              => p_x_stages_tbl(i).ATTRIBUTE3,
741 		     X_ATTRIBUTE4              => p_x_stages_tbl(i).ATTRIBUTE4,
742 		     X_ATTRIBUTE5              => p_x_stages_tbl(i).ATTRIBUTE5,
743 		     X_ATTRIBUTE6              => p_x_stages_tbl(i).ATTRIBUTE6,
744 		     X_ATTRIBUTE7              => p_x_stages_tbl(i).ATTRIBUTE7,
745 		     X_ATTRIBUTE8              => p_x_stages_tbl(i).ATTRIBUTE8,
746 		     X_ATTRIBUTE9              => p_x_stages_tbl(i).ATTRIBUTE9,
747 		     X_ATTRIBUTE10             => p_x_stages_tbl(i).ATTRIBUTE10,
748 		     X_ATTRIBUTE11             => p_x_stages_tbl(i).ATTRIBUTE11,
749 		     X_ATTRIBUTE12             => p_x_stages_tbl(i).ATTRIBUTE12,
750 		     X_ATTRIBUTE13             => p_x_stages_tbl(i).ATTRIBUTE13,
751 		     X_ATTRIBUTE14             => p_x_stages_tbl(i).ATTRIBUTE14,
752 		     X_ATTRIBUTE15             => p_x_stages_tbl(i).ATTRIBUTE15,
753 		     X_LAST_UPDATE_DATE        => SYSDATE,
754 		     X_LAST_UPDATED_BY         => Fnd_Global.USER_ID,
755 		     X_LAST_UPDATE_LOGIN       => Fnd_Global.LOGIN_ID );
756 
757    			   IF G_DEBUG='Y' THEN
758 			       AHL_DEBUG_PUB.Debug( l_full_name ||': Visit ID =' || P_VISIT_ID);
759 			       AHL_DEBUG_PUB.Debug( l_full_name ||': STAGE Number =' ||  p_x_stages_tbl(i).stage_num);
760 			   END IF;
761 -- Added by amagrawa after review comments.
762 	    ELSE -- If validate_status is <> 'S'
763                   RAISE Fnd_Api.G_EXC_ERROR;
764         END IF; -- end check of validate_status
765 END LOOP;
766 
767     ---------------------------End of API Body---------------------------------------
768 
769  -- Added cxcheng POST11510--------------
770    --Now adjust the times derivation for task
771    AHL_VWP_TIMES_PVT.Calculate_Task_Times(p_api_version => 1.0,
772                                     p_init_msg_list => Fnd_Api.G_FALSE,
773                                     p_commit        => Fnd_Api.G_FALSE,
774                                     p_validation_level      => Fnd_Api.G_VALID_LEVEL_FULL,
775                                     x_return_status      => l_return_status,
776                                     x_msg_count          => l_msg_count,
777                                     x_msg_data           => l_msg_data,
778                                     p_visit_id            => p_visit_id);
779     -- Added by amagrawa based on review comments.
780 	    IF l_return_Status <>'S'
781         THEN
782             IF l_return_Status = FND_API.G_RET_STS_ERROR
783             THEN
784 					    RAISE FND_API.G_EXC_ERROR;
785             ELSIF l_return_Status = FND_API.G_RET_STS_UNEXP_ERROR
786             THEN
787 			           RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
788 			END IF;
789 
790      	END IF;
791 
792 
793           l_visit_end_date:= AHL_VWP_TIMES_PVT.get_visit_end_time(p_visit_id);
794 
795 	  IF l_visit_end_date IS NOT NULL THEN
796 
797 		AHL_LTP_REQST_MATRL_PVT.Process_Planned_Materials
798 		  (p_api_version            => p_api_version,
799 		   p_init_msg_list          => Fnd_Api.G_FALSE,
800 		   p_commit                 => Fnd_Api.G_FALSE,
801 		   p_visit_id               => p_visit_id,
802 		   p_visit_task_id          => NULL,
803 		   p_org_id                 => NULL,
804 		   p_start_date             => NULL,
805 		   p_operation_flag         => 'U',
806 
807 		   x_planned_order_flag     => l_planned_order_flag ,
808 		    x_return_status           => l_return_status,
809 		    x_msg_count               => l_msg_count,
810 		    x_msg_data                => l_msg_data);
811 
812 		IF l_msg_count > 0 OR NVL(l_return_status,'x') <> FND_API.G_RET_STS_SUCCESS THEN
813 			X_msg_count := l_msg_count;
814 			X_return_status := Fnd_Api.G_RET_STS_ERROR;
815 			RAISE Fnd_Api.G_EXC_ERROR;
816 		END IF;
817 
818 
819           END IF;
820 
821 
822      --Standard check to count messages
823    l_msg_count := Fnd_Msg_Pub.count_msg;
824 
825    IF l_msg_count > 0 THEN
826       X_msg_count := l_msg_count;
827       X_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
828       RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
829    END IF;
830 
831    --Standard check for commit
832    IF Fnd_Api.TO_BOOLEAN(p_commit) THEN
833       COMMIT;
834    END IF;
835 
836    IF G_DEBUG='Y' THEN
837        AHL_DEBUG_PUB.Debug( l_full_name ||':End');
838    END IF;
839 
840    -- Check if API is called in debug mode. If yes, disable debug.
841    IF G_DEBUG='Y' THEN
842       Ahl_Debug_Pub.disable_debug;
843    END IF;
844 EXCEPTION
845    WHEN Fnd_Api.g_exc_error THEN
846       ROLLBACK TO Update_Stages;
847       x_return_status := Fnd_Api.g_ret_sts_error;
848       Fnd_Msg_Pub.count_and_get(
849             p_encoded => Fnd_Api.g_false,
850             p_count   => x_msg_count,
851             p_data    => x_msg_data
852       );
853    WHEN Fnd_Api.g_exc_unexpected_error THEN
854       ROLLBACK TO Update_Stages;
855       x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
856       Fnd_Msg_Pub.count_and_get (
857             p_encoded => Fnd_Api.g_false,
858             p_count   => x_msg_count,
859             p_data    => x_msg_data
860       );
861    WHEN OTHERS THEN
862       ROLLBACK TO Update_Stages;
863       x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
864       IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_unexp_error)
865 		THEN
866          Fnd_Msg_Pub.add_exc_msg (G_PKG_NAME, l_api_name);
867       END IF;
868       Fnd_Msg_Pub.count_and_get (
869             p_encoded => Fnd_Api.g_false,
870             p_count   => x_msg_count,
871             p_data    => x_msg_data
872       );
873 END Update_Stages;
874 
875 --------------------------------------------------------------------
876 -- PROCEDURE
877 --    Delete_Stages
878 --
879 -- PURPOSE
880 --    To delete a Stage for visit.
881 --    will be called from delete visit and requires only visit_id
882 --------------------------------------------------------------------
883 PROCEDURE Delete_Stages (
884    p_api_version             IN     NUMBER,
885    p_init_msg_list           IN     VARCHAR2  := Fnd_Api.g_false,
886    p_commit                  IN     VARCHAR2  := Fnd_Api.g_false,
887    p_validation_level        IN     NUMBER    := Fnd_Api.g_valid_level_full,
888    p_module_type             IN     VARCHAR2  := 'JSP',
889 
890    p_visit_id                IN     NUMBER,
891 
892    x_return_status           OUT    NOCOPY VARCHAR2,
893    x_msg_count               OUT    NOCOPY NUMBER,
894    x_msg_data                OUT    NOCOPY VARCHAR2
895 )
896 is
897 
898   -- Define local Variables
899    L_API_VERSION           CONSTANT NUMBER := 1.0;
900    L_API_NAME              CONSTANT VARCHAR2(30) := 'Delete Stages';
901    L_FULL_NAME             CONSTANT VARCHAR2(60) := G_PKG_NAME || '.' || L_API_NAME;
902    l_msg_count             NUMBER;
903 
904 begin
905    --------------------- Initialize -----------------------
906    SAVEPOINT Delete_Stages;
907 
908    -- Check if API is called in debug mode. If yes, enable debug.
909    IF G_DEBUG='Y' THEN
910      Ahl_Debug_Pub.enable_debug;
911    END IF;
912 
913    -- Debug info.
914    IF G_DEBUG='Y' THEN
915        AHL_DEBUG_PUB.Debug( l_full_name ||': Start');
916    END IF;
917 
918    -- Initialize message list if p_init_msg_list is set to TRUE.
919    IF Fnd_Api.to_boolean(p_init_msg_list)
920    THEN
921      Fnd_Msg_Pub.initialize;
922    END IF;
923 
924     --  Initialize API return status to success
925     x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
926 
927    -- Standard call to check for call compatibility.
928    IF NOT Fnd_Api.COMPATIBLE_API_CALL(l_api_version,
929                                       p_api_version,
930                                       l_api_name,G_PKG_NAME)
931    THEN
932        RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
933    END IF;
934 
935    ------------------------Start of API Body------------------------------------
936    -- directly delete as we need to delete all stages for the visit
937 
938 	    delete from AHL_VWP_STAGES_TL
939 	    where stage_id
940 	          in (select stage_id from ahl_vwp_stages_b
941 	              where visit_id = p_visit_id);
942 
943 	    delete from AHL_VWP_STAGES_B
944 	    where visit_id = p_visit_id;
945 
946    -- directly delete as we need to delete all stages for the visit
947 
948    ---------------------------End of API Body---------------------------------------
949    --Standard check to count messages
950    l_msg_count := Fnd_Msg_Pub.count_msg;
951 
952    IF l_msg_count > 0 THEN
953       X_msg_count := l_msg_count;
954       X_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
955       RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
956    END IF;
957 
958    --Standard check for commit
959    IF Fnd_Api.TO_BOOLEAN(p_commit) THEN
960       COMMIT;
961    END IF;
962 
963    IF G_DEBUG='Y' THEN
964        AHL_DEBUG_PUB.Debug( l_full_name ||':End');
965    END IF;
966 
967    -- Check if API is called in debug mode. If yes, disable debug.
968    IF G_DEBUG='Y' THEN
969       Ahl_Debug_Pub.disable_debug;
970    END IF;
971 EXCEPTION
972    WHEN Fnd_Api.g_exc_error THEN
973       ROLLBACK TO Delete_Stages;
974       x_return_status := Fnd_Api.g_ret_sts_error;
975       Fnd_Msg_Pub.count_and_get(
976             p_encoded => Fnd_Api.g_false,
977             p_count   => x_msg_count,
978             p_data    => x_msg_data
979       );
980    WHEN Fnd_Api.g_exc_unexpected_error THEN
981       ROLLBACK TO Delete_Stages;
982       x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
983       Fnd_Msg_Pub.count_and_get (
984             p_encoded => Fnd_Api.g_false,
985             p_count   => x_msg_count,
986             p_data    => x_msg_data
987       );
988    WHEN OTHERS THEN
989       ROLLBACK TO Delete_Stages;
990       x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
991       IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_unexp_error)
992 		THEN
993          Fnd_Msg_Pub.add_exc_msg (G_PKG_NAME, l_api_name);
994       END IF;
995       Fnd_Msg_Pub.count_and_get (
996             p_encoded => Fnd_Api.g_false,
997             p_count   => x_msg_count,
998             p_data    => x_msg_data
999       );
1000 
1001 
1002 end delete_stages;
1003 
1004 
1005 
1006 ----------------------------------------------------------------------
1007 -- END: Defining procedures BODY, which are called from UI screen --
1008 ----------------------------------------------------------------------
1009 
1010 
1011 PROCEDURE VALIDATE_STAGES(
1012    p_visit_id		     in number,
1013    p_stages_rec              IN     Visit_Stages_Rec_Type,
1014    x_return_status           OUT    NOCOPY VARCHAR2,
1015    x_msg_count               OUT    NOCOPY NUMBER,
1016    x_msg_data                OUT    NOCOPY VARCHAR2
1017 )
1018 IS
1019   -- Define local Variables
1020    L_API_VERSION           CONSTANT NUMBER := 1.0;
1021    L_API_NAME              CONSTANT VARCHAR2(30) := 'Validate Stages';
1022    L_FULL_NAME             CONSTANT VARCHAR2(60) := G_PKG_NAME || '.' || L_API_NAME;
1023 
1024    l_msg_data              VARCHAR2(2000);
1025    l_stage_duration        NUMBER;
1026    l_dummy                 varchar2(1);
1027 
1028 cursor c_stage_name(C_VISIT_ID number, C_STAGE_NAME varchar2, C_STAGE_ID number)
1029   IS
1030        SELECT 'x' FROM AHL_VWP_STAGES_VL
1031                   WHERE VISIT_ID = C_VISIT_ID AND
1032                   STAGE_ID <> C_STAGE_ID AND
1033                   STAGE_NAME = C_STAGE_NAME;
1034 
1035 cursor c_stage_data(c_stage_id number)
1036   IS
1037        select stage_name, duration, object_version_number
1038        from AHL_VWP_STAGES_VL
1039        where stage_id = c_stage_id;
1040 
1041 l_stage_rec  c_stage_data%rowtype;
1042 
1043 cursor c_stage_task(c_stage_id number)
1044 IS
1045        select 'x' from ahl_visit_tasks_b
1046        where stage_id = c_stage_id
1047 	   and nvl(status_code,'X')<>'DELETED';
1048 
1049 
1050 BEGIN
1051 
1052 /*   --------------------- initialize -----------------------
1053    -- Check if API is called in debug mode. If yes, enable debug.
1054    IF G_DEBUG='Y' THEN
1055 		 AHL_DEBUG_PUB.enable_debug;
1056 	 END IF;
1057 
1058    -- Debug info.
1059     IF Ahl_Debug_Pub.G_FILE_DEBUG THEN
1060        IF G_DEBUG='Y' THEN
1061 		 AHL_DEBUG_PUB.debug( l_full_name ||'********************************START******************************* ');
1062 	 END IF;
1063     END IF;
1064 
1065    IF Fnd_Api.to_boolean (p_init_msg_list) THEN
1066       Fnd_Msg_Pub.initialize;
1067    END IF;
1068 
1069    IF NOT Fnd_Api.compatible_api_call (
1070          l_api_version,
1071          p_api_version,
1072          l_api_name,
1073          G_PKG_NAME
1074    ) THEN
1075       RAISE Fnd_Api.g_exc_unexpected_error;
1076    END IF;
1077 */
1078    x_return_status := Fnd_Api.g_ret_sts_success;
1079 
1080    open c_stage_data(p_stages_rec.stage_id);
1081    fetch c_stage_data into l_stage_rec;
1082    if c_stage_data%notfound
1083    then
1084              Fnd_Message.SET_NAME('AHL','AHL_VWP_STAGE_NOT_FOUND_NEW'||p_stages_rec.stage_id);
1085              Fnd_Msg_Pub.ADD;
1086              x_return_status := Fnd_Api.g_ret_sts_error;
1087              return;
1088    end if;
1089    close c_stage_data;
1090 
1091    -- obj version number validation
1092    IF l_stage_rec.OBJECT_VERSION_NUMBER <> p_stages_rec.OBJECT_VERSION_NUMBER
1093    THEN
1094              Fnd_Message.SET_NAME('AHL','AHL_COM_RECORD_MOD');
1095              Fnd_Msg_Pub.ADD;
1096              x_return_status := Fnd_Api.g_ret_sts_error;
1097              return;
1098    end if;
1099 
1100    IF p_stages_rec.STAGE_NUM IS NULL
1101    THEN
1102              Fnd_Message.SET_NAME('AHL','AHL_VWP_STAGE_NUM_NULL');
1103              Fnd_Msg_Pub.ADD;
1104              x_return_status := Fnd_Api.g_ret_sts_error;
1105              return;
1106    end if;
1107 
1108 
1109    IF p_stages_rec.stage_name is null or p_stages_rec.stage_name <> l_stage_rec.STAGE_NAME
1110    THEN
1111       -- stage name is mandatory
1112      if p_stages_rec.stage_name is null or p_stages_rec.stage_name = ''
1113      then
1114              Fnd_Message.SET_NAME('AHL','AHL_VWP_STAGE_NAME_NULL');
1115 			 FND_MESSAGE.SET_TOKEN('STAGE_NUM',p_stages_rec.STAGE_NUM);
1116              Fnd_Msg_Pub.ADD;
1117              x_return_status := Fnd_Api.g_ret_sts_error;
1118 			 return;
1119      else
1120      -- stage name is unique
1121 	       open c_stage_name(p_visit_id, p_stages_rec.stage_name, p_stages_rec.stage_id);
1122 	       fetch c_stage_name into l_dummy;
1123 	       if c_stage_name%found
1124 	       then
1125 		     Fnd_Message.SET_NAME('AHL','AHL_VWP_STAGE_NAME_UNIQUE');
1126 		     Fnd_Message.SET_TOKEN('STAGE_NAME', p_stages_rec.stage_name);
1127 		     Fnd_Msg_Pub.ADD;
1128              x_return_status := Fnd_Api.g_ret_sts_error;
1129              close c_stage_name;
1130         	 return;
1131 	       end if;
1132 	       close c_stage_name;
1133       END IF;
1134    END IF;
1135 
1136 				l_stage_duration := p_stages_rec.DURATION;
1137    IF p_stages_rec.DURATION is null or p_stages_rec.DURATION <> l_stage_rec.DURATION
1138    THEN
1139      -- STAGE DURATION is mandatory
1140      IF p_stages_rec.DURATION IS NULL
1141      then
1142              Fnd_Message.SET_NAME('AHL','AHL_VWP_STAGE_DUR_NULL');
1143              Fnd_Message.SET_TOKEN('STAGE_NAME', p_stages_rec.stage_name);
1144              Fnd_Msg_Pub.ADD;
1145              x_return_status := Fnd_Api.g_ret_sts_error;
1146      -- duration must be positive number
1147      elsif p_stages_rec.duration < 0
1148      then
1149              Fnd_Message.SET_NAME('AHL','AHL_VWP_STAGE_DURN_INV');
1150              Fnd_Message.SET_TOKEN('STAGE_NAME', p_stages_rec.stage_name);
1151              Fnd_Msg_Pub.ADD;
1152              x_return_status := Fnd_Api.g_ret_sts_error;
1153      elsif p_stages_rec.duration = 0
1154      then
1155              open c_stage_task( p_stages_rec.stage_id);
1156              fetch c_stage_task into l_dummy;
1157              if c_stage_task%found
1158              THEN
1159 		     Fnd_Message.SET_NAME('AHL','AHL_VWP_STAGE_HAS_TASKS');
1160 		     Fnd_Message.SET_TOKEN('STAGE_NAME', p_stages_rec.stage_name);
1161 		     Fnd_Msg_Pub.ADD;
1162                      x_return_status := Fnd_Api.g_ret_sts_error;
1163 	           end if;
1164 	           close c_stage_task;
1165 	 elsif p_stages_rec.DURATION > trunc(l_stage_duration,0)
1166 	 THEN
1167 			 Fnd_Message.SET_NAME('AHL','AHL_VWP_STAGE_DUR_NON_INT');
1168 		     Fnd_Msg_Pub.ADD;
1169 		     x_return_status := Fnd_Api.g_ret_sts_error;
1170 
1171 	end if;
1172 
1173    END IF;
1174 
1175 
1176 END VALIDATE_STAGES;
1177 
1178 
1179 --------------------------------------------------------------------
1180 -- FUNCTION
1181 --     Get_Stage_Id
1182 --
1183 --------------------------------------------------------------------
1184 FUNCTION  Get_Stage_Id
1185 RETURN NUMBER
1186 IS
1187 
1188  -- To find the next id value from visit sequence
1189    CURSOR c_seq IS
1190       SELECT Ahl_vwp_stages_B_S.NEXTVAL
1191       FROM   dual;
1192 
1193  -- To find whether id already exists
1194    CURSOR c_id_exists (x_id IN NUMBER) IS
1195    SELECT 1
1196    FROM   Ahl_vwp_stages_b
1197    WHERE  stage_id = x_id;
1198 
1199     x_stage_Id NUMBER;
1200     l_dummy NUMBER;
1201 BEGIN
1202   -- Modified by amagrawa according to review comments.
1203             -- If the ID is not passed into the API, then
1204             -- grab a value from the sequence.
1205              LOOP
1206                   OPEN c_seq;
1207                   FETCH c_seq INTO x_stage_Id;
1208                   CLOSE c_seq;
1209              --
1210              -- Check to be sure that the sequence does not exist.
1211                       OPEN c_id_exists (x_stage_Id);
1212                       FETCH c_id_exists INTO l_dummy;
1213               -- If Sequence does not exist exit from loop
1214                         IF c_id_exists%NOTFOUND
1215                         THEN
1216                              close c_id_exists;
1217                              EXIT;
1218                         END IF;
1219 		                CLOSE c_id_exists;
1220 			 END LOOP;
1221 
1222     RETURN x_stage_Id ;
1223 
1224 END Get_Stage_Id;
1225 
1226 
1227 PROCEDURE VALIDATE_STAGE_UPDATES(
1228     p_api_version           IN            NUMBER,
1229     p_init_msg_list         IN            VARCHAR2  := Fnd_Api.G_FALSE,
1230     p_commit                IN            VARCHAR2  := Fnd_Api.G_FALSE,
1231     p_validation_level      IN            NUMBER    := Fnd_Api.G_VALID_LEVEL_FULL,
1232     p_default               IN            VARCHAR2  := Fnd_Api.G_TRUE,
1233     p_module_type           IN            VARCHAR2  := NULL,
1234 
1235     p_visit_id              IN            NUMBER,
1236     p_visit_task_id         IN            NUMBER,
1237     p_stage_name            IN            VARCHAR2   := NULL, -- defaulted as u may pass id or num
1238 
1239     x_stage_id              OUT NOCOPY  NUMBER            ,
1240     x_return_status         OUT NOCOPY    VARCHAR2,
1241     x_msg_count             OUT NOCOPY    NUMBER,
1242     x_msg_data              OUT NOCOPY    VARCHAR2
1243 )
1244 is
1245 
1246    L_MAX_PARENT  NUMBER;
1247    L_MIN_CHILD   NUMBER;
1248    L_STAGE_NUM   NUMBER;
1249    L_STAGE_ID    NUMBER;
1250 
1251    l_max_stage_num number := FND_PROFILE.value('AHL_NUMBER_OF_STAGES');
1252 
1253    L_API_VERSION           CONSTANT NUMBER := 1.0;
1254    L_API_NAME              CONSTANT VARCHAR2(30) := 'Update Stages';
1255    L_FULL_NAME             CONSTANT VARCHAR2(60) := G_PKG_NAME || '.' || L_API_NAME;
1256 
1257 
1258 CURSOR C_valid_stage_num(P_VISIT_TASK_ID NUMBER)
1259 is
1260 	SELECT
1261 	  max_parent_stage_num,
1262 	  min_child_stage_num
1263 	FROM
1264 	  ( SELECT
1265 	  nvl(max(stage_num),1) max_parent_stage_num
1266 	FROM
1267 	  ahl_vwp_stages_b s,
1268 	  AHL_VISIT_TASKS_b t
1269 	WHERE
1270 	  s.stage_id = t.stage_id and
1271 	  t.VISIT_task_id IN
1272 	            ( SELECT  PARENT_TASK_ID FROM AHL_TASK_LINKS WHERE VISIT_TASK_ID =  P_VISIT_TASK_ID )) ,
1273 	  ( SELECT
1274 	  nvl(min(stage_num),l_max_stage_num) min_child_stage_num
1275 	FROM
1276 	  ahl_vwp_stages_b s,
1277 	  AHL_VISIT_TASKS_b t
1278 	WHERE
1279 	  s.stage_id = t.stage_id and
1280 	  t.VISIT_task_id IN
1281 	        ( SELECT  visit_TASK_ID FROM AHL_TASK_LINKS WHERE parent_TASK_ID = P_VISIT_TASK_ID ));
1282 
1283 
1284 CURSOR C_STAGE_NUM(P_VISIT_ID NUMBER, P_STAGE_NAME VARCHAR2)
1285 is
1286        SELECT STAGE_NUM, stage_id FROM AHL_VWP_STAGES_VL
1287        WHERE STAGE_NAME = P_STAGE_NAME AND VISIT_ID = P_VISIT_ID;
1288 
1289 begin
1290 
1291    --------------------- initialize -----------------------
1292    -- Check if API is called in debug mode. If yes, enable debug.
1293    IF G_DEBUG='Y' THEN
1294 		 AHL_DEBUG_PUB.enable_debug;
1295 	 END IF;
1296 
1297    -- Debug info.
1298     IF Ahl_Debug_Pub.G_FILE_DEBUG THEN
1299        IF G_DEBUG='Y' THEN
1300 		 AHL_DEBUG_PUB.debug( l_full_name ||'********************************START******************************* ');
1301 	 END IF;
1302     END IF;
1303 
1304    IF Fnd_Api.to_boolean (p_init_msg_list) THEN
1305       Fnd_Msg_Pub.initialize;
1306    END IF;
1307 
1308    IF NOT Fnd_Api.compatible_api_call (
1309          l_api_version,
1310          p_api_version,
1311          l_api_name,
1312          G_PKG_NAME
1313    ) THEN
1314       RAISE Fnd_Api.g_exc_unexpected_error;
1315    END IF;
1316 
1317    x_return_status := Fnd_Api.g_ret_sts_success;
1318 
1319 
1320 -------------------- basic check for stage num or id------------------------------------------
1321 -- test if passed stage num > max num for all its parents and less that min num for all children--
1322 
1323       open C_valid_stage_num(p_visit_task_id);
1324       fetch C_valid_stage_num into l_max_parent, l_min_child;
1325       CLOSE C_VALID_STAGE_NUM;
1326 
1327 
1328       IF (P_STAGE_NAME IS NOT NULL AND P_STAGE_NAME <> FND_API.G_MISS_CHAR)
1329       THEN
1330 
1331            OPEN C_STAGE_NUM(p_visit_id, p_stage_name);
1332            FETCH C_STAGE_NUM INTO L_STAGE_NUM, L_STAGE_ID;
1333              IF C_STAGE_NUM%NOTFOUND THEN
1334 		     Fnd_Message.SET_NAME('AHL','AHL_VWP_STAGE_NOT_FOUND');
1335 		     Fnd_Msg_Pub.ADD;
1336                      x_return_status := Fnd_Api.g_ret_sts_error;
1337              ELSE
1338 -- Stage number should be between Parent Stage Number - L_MAX_PARENT, and Child Stage Number - L_MIN_CHILD
1339 		   IF ( L_MAX_PARENT IS NOT NULL AND L_STAGE_NUM < L_MAX_PARENT)
1340 		    OR ( L_MIN_CHILD IS NOT NULL AND L_STAGE_NUM > L_MIN_CHILD)
1341 		   THEN
1342 			     Fnd_Message.SET_NAME('AHL','AHL_VWP_ST_NUM_INV');
1343 			     Fnd_Message.SET_TOKEN('STAGE_NUM', l_stage_NUM);
1344 			     Fnd_Msg_Pub.ADD;
1345 			     x_return_status := Fnd_Api.g_ret_sts_error;
1346 		   END IF;
1347                    -- SET OUT PARAM
1348                    X_STAGE_ID := L_STAGE_ID;
1349 
1350               END IF;
1351            CLOSE C_STAGE_NUM;
1352       END IF;
1353 -------------------- basic check for stage num or id------------------------------------------
1354 
1355 end VALIDATE_STAGE_UPDATES;
1356 
1357 
1358 procedure default_missing_attributes(
1359    p_x_stages_rec              IN OUT NOCOPY     Visit_Stages_Rec_Type
1360 )
1361 is
1362 cursor C_get_stage_data(c_stage_id number)
1363 is
1364 	select * from ahl_vwp_stages_vl where stage_id = c_stage_id;
1365 l_stage_REC   C_get_stage_data%rowtype;
1366 
1367 begin
1368    OPEN C_get_stage_data(p_x_stages_rec.STAGE_ID);
1369    FETCH C_get_stage_data INTO L_STAGE_REC;
1370    CLOSE C_get_stage_data;
1371 
1372 
1373    IF NVL(p_x_stages_rec.STAGE_NUM, 99) = FND_API.G_MISS_NUM
1374    THEN
1375         p_x_stages_rec.STAGE_NUM := L_stage_rec.STAGE_NUM;
1376    END IF;
1377 
1378    IF NVL(p_x_stages_rec.STAGE_NAME, 'A') = FND_API.G_MISS_CHAR
1379    THEN
1380         p_x_stages_rec.STAGE_NAME := L_stage_rec.STAGE_NAME;
1381    END IF;
1382 
1383    IF NVL(p_x_stages_rec.DURATION, 99) = FND_API.G_MISS_NUM
1384    THEN
1385         p_x_stages_rec.DURATION := L_stage_rec.DURATION;
1386    END IF;
1387 
1388 end default_missing_attributes;
1389 
1390 --------------------------------------------------------------------
1391 -- PROCEDURE
1392 --    Check_Stage_Name_Or_Id
1393 --
1394 -- PURPOSE
1395 --    Converts Stage Name to Stage ID
1396 --------------------------------------------------------------------
1397 PROCEDURE Check_Stage_Name_Or_Id
1398     (p_visit_id          IN NUMBER,
1399      p_Stage_Name         IN VARCHAR2,
1400      x_Stage_id          OUT NOCOPY NUMBER,
1401      x_return_status     OUT NOCOPY VARCHAR2,
1402      x_error_msg_code    OUT NOCOPY VARCHAR2
1403      )
1404 IS
1405   -- Define local variables
1406    L_API_NAME             CONSTANT VARCHAR2(30) := 'Check_Stage_Name_Or_Id';
1407    L_FULL_NAME            CONSTANT VARCHAR2(60) := G_PKG_NAME || '.' || L_API_NAME;
1408 BEGIN
1409     IF (p_Stage_Name IS NOT NULL) THEN
1410           SELECT Stage_Id INTO x_Stage_id
1411             FROM AHL_VWP_STAGES_VL
1412           WHERE Visit_Id  = p_visit_id AND Stage_Name = p_Stage_Name;
1413     ELSE
1414          x_Stage_id := null;
1415     END IF;
1416 
1417       x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
1418       -- Debug info.
1419 	   IF G_DEBUG='Y' THEN
1420     	  Ahl_Debug_Pub.debug( 'API Return Status = ' ||L_FULL_NAME||':'|| x_return_status);
1421 	   END IF;
1422 
1423 EXCEPTION
1424     WHEN NO_DATA_FOUND THEN
1425          x_return_status:= Fnd_Api.G_RET_STS_ERROR;
1426          x_error_msg_code:= 'AHL_VWP_STAGE_NOT_EXISTS';
1427     WHEN TOO_MANY_ROWS THEN
1428          x_return_status:= Fnd_Api.G_RET_STS_ERROR;
1429          x_error_msg_code:= 'AHL_VWP_STAGE_NOT_EXISTS';
1430     WHEN OTHERS THEN
1431          x_return_status:= Fnd_Api.G_RET_STS_UNEXP_ERROR;
1432 RAISE;
1433 END Check_Stage_Name_Or_Id;
1434 
1435 --------------------------------------------------------------------
1436 -- PROCEDURE
1437 --    Validate_bef_Times_Derive
1438 --
1439 -- PURPOSE
1440 --    To validate visit and tasks before deriving their start and end datetimes
1441 --------------------------------------------------------------------
1442 PROCEDURE Validate_bef_Times_Derive
1443  ( p_visit_id	      IN	NUMBER,
1444    x_valid_flag       OUT NOCOPY VARCHAR2,
1445    x_return_status    OUT NOCOPY VARCHAR2,
1446    x_error_msg_code   OUT NOCOPY VARCHAR2)
1447 IS
1448   -- Define local variables
1449    L_API_NAME             CONSTANT VARCHAR2(30) := 'Validate_bef_Times_Derive';
1450    L_FULL_NAME            CONSTANT VARCHAR2(60) := G_PKG_NAME || '.' || L_API_NAME;
1451 
1452    l_dept                 NUMBER;
1453    l_count                NUMBER:=0;
1454    l_dummy                NUMBER;
1455  --  i                      NUMBER;
1456 --   x                      NUMBER;
1457 
1458  -- Define local cursors
1459  -- To find out all visit/template details
1460     CURSOR c_visit(x_id IN NUMBER) IS
1461       SELECT * FROM AHL_VISITS_VL
1462       WHERE VISIT_ID = x_id;
1463     c_visit_rec  c_visit%ROWTYPE;
1464 
1465 -- To find whether dept shifts exist for the dept
1466    CURSOR c_dept (x_id IN NUMBER) IS
1467     SELECT COUNT(*) FROM AHL_DEPARTMENT_SHIFTS
1468     WHERE DEPARTMENT_ID = x_id;
1469 
1470 -- Commented by amagrawa based on review comments.
1471 -- To find all departments from a visit's tasks table
1472 /*   CURSOR c_task (x_id IN NUMBER) IS
1473     SELECT DEPARTMENT_ID FROM AHL_VISIT_TASKS_B WHERE VISIT_ID = x_id
1474     AND NVL(STATUS_CODE,'X') <> 'DELETED' AND DEPARTMENT_ID IS NOT NULL;
1475     c_task_rec c_task%ROWTYPE;
1476 */
1477 -- To find only those routes which are there in tasks table but not in route table for a visit
1478 -- Changed by amagrawa to improve performance.
1479    CURSOR c_route_chk(x_id IN NUMBER) IS
1480     SELECT DISTINCT(MR_Route_ID) "ROUTE_ID" FROM AHL_VISIT_TASKS_B TSK
1481     WHERE VISIT_ID = x_id AND MR_Route_ID IS NOT NULL
1482     AND NOT EXISTS
1483     (SELECT DISTINCT(MR_Route_ID) "ROUTE_ID" FROM AHL_MR_ROUTES_V MR
1484 	  where MR.mr_route_id =TSK.mr_route_id) and rownum=1;
1485 
1486     c_route_chk_rec c_route_chk%ROWTYPE;
1487 
1488 -- Added by amagrawa based on review comments
1489 -- To find if the all visit tasks dept has department shifts defined
1490    CURSOR c_task_dep_exist (x_visit_id IN NUMBER) IS
1491      SELECT 1 from dual WHERE exists(
1492 	    SELECT visit_task_id from ahl_visit_tasks_b
1493 	    Where department_id is not null
1494 		and visit_id =  x_visit_id
1495 		and nvl(status_code,'X')<>'DELETED'
1496 		and department_id not in (select department_id from ahl_department_shifts)
1497 		);
1498 
1499 
1500 
1501 BEGIN
1502    --  Initialize API return status to success
1503     x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
1504     x_valid_flag := 'Y';
1505    OPEN c_Visit(p_visit_id);
1506    FETCH c_visit INTO c_visit_rec;
1507    CLOSE c_Visit;
1508 
1509    IF(c_visit_rec.START_DATE_TIME IS NULL OR c_visit_rec.START_DATE_TIME = Fnd_Api.g_miss_date)
1510     THEN
1511        Fnd_Message.SET_NAME('AHL','AHL_VWP_VST_NO_ST_DATE');
1512        Fnd_Msg_Pub.ADD;
1513        x_valid_flag := 'N';
1514     END IF;
1515 
1516     IF(c_visit_rec.DEPARTMENT_ID IS NULL OR c_visit_rec.DEPARTMENT_ID = Fnd_Api.g_miss_num)
1517     THEN
1518        Fnd_Message.SET_NAME('AHL','AHL_VWP_VST_NO_DEP');
1519        Fnd_Msg_Pub.ADD;
1520        x_valid_flag := 'N';
1521     ELSE
1522 -- Modified by amagrawa based on review comments
1523      -- To find if the visit dept has department shifts defined
1524       OPEN c_dept (c_visit_rec.department_id);
1525       FETCH c_dept INTO l_count;
1526       CLOSE c_dept;
1527       	IF l_count=0
1528 	      THEN
1529     		   Fnd_Message.SET_NAME('AHL','AHL_VWP_VNO_DEP_SFT');
1530 		       Fnd_Msg_Pub.ADD;
1531 		       x_valid_flag := 'N';
1532 	     END IF;
1533     END IF;
1534 
1535 -- Added by amagrawa based on review comments
1536     open c_task_dep_exist(p_visit_id);
1537     FETCH c_task_dep_exist into l_dummy;
1538     IF(c_task_dep_exist%FOUND)
1539     THEN
1540        Fnd_Message.SET_NAME('AHL','AHL_VWP_TNO_DEP_SFT');
1541        Fnd_Msg_Pub.ADD;
1542        x_valid_flag := 'N';
1543     END IF;
1544 	CLOSE c_task_dep_exist;
1545 
1546 -- To check routes present in visits exists in MRRoutes table
1547 -- Modified by amagrawa based on review comments
1548     OPEN c_route_chk (p_visit_id);
1549     FETCH c_route_chk INTO c_route_chk_rec;
1550     IF c_route_chk%FOUND THEN
1551       Fnd_Message.SET_NAME('AHL','AHL_VWP_TSK_MR_NOT_VAL');
1552        Fnd_Msg_Pub.ADD;
1553        x_valid_flag := 'N';
1554     END IF;
1555     CLOSE c_route_chk;
1556 
1557 END Validate_bef_Times_Derive;
1558 
1559 
1560 
1561 END AHL_VWP_VISITS_STAGES_PVT;