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.2.12020000.2 2012/12/07 14:50:55 sareepar ship $ */
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 -- Common constants and variables --
29 ------------------------------------
30 l_log_current_level   NUMBER   := fnd_log.g_current_runtime_level;
31 l_log_statement       NUMBER   := fnd_log.level_statement;
32 l_log_procedure       NUMBER   := fnd_log.level_procedure;
33 l_log_error           NUMBER   := fnd_log.level_error;
34 l_log_unexpected      NUMBER   := fnd_log.level_unexpected;
35 ---------------------------------------------------------------------
36 --   Define Record Types for record structures needed by the APIs  --
37 ---------------------------------------------------------------------
38 TYPE Stage_Record IS RECORD ( INDEX_ID INTEGER, STAGE_ID NUMBER, DURATION NUMBER, PLANNED_START_DATE DATE, CALCULATED_START_TIME DATE,DEPARTMENT_ID NUMBER); -- PRAKKUM :: 28/03/2011 :: VWPE :: ER 12424063 :: Record to store stage details
39 TYPE Relation_Record IS RECORD ( SUBJECT_ID NUMBER, OBJECT_ID NUMBER, RELATION_TYPE VARCHAR2(30)); -- PRAKKUM :: 28/03/2011 :: VWPE :: ER 12424063 :: Record to store stage link details
40 
41 --------------------------------------------------------------------
42 -- Define Table Type for Records Structures                       --
43 --------------------------------------------------------------------
44 TYPE Dept_Tbl_Type IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
45 
46 TYPE Stage_Details IS TABLE OF Stage_Record INDEX BY PLS_INTEGER; --Indexed By Stage ID -- PRAKKUM :: 28/03/2011 :: VWPE :: ER 12424063 :: Table to store stage records
47 TYPE Relation_Details IS TABLE OF Relation_Record INDEX BY PLS_INTEGER; -- PRAKKUM :: 28/03/2011 :: VWPE :: ER 12424063  :: Table to store stage link records
48 TYPE Stage_Relations IS TABLE OF VARCHAR2(30) INDEX BY VARCHAR2(60); -- PRAKKUM :: 28/03/2011 :: VWPE :: ER 12424063 :: Table index by object_id:subject_id that stores relation type
49 TYPE PARALLEL_STAGE_ID_DETS IS TABLE OF BOOLEAN INDEX BY PLS_INTEGER; -- PRAKKUM :: 06/03/2011 :: VWPE :: ER 12424063 :: Fixed issue in getting parallel stage ids for a stage
50 
51 --------------------------------------------------------------------
52 --  START: Defining local functions and procedures SIGNATURES     --
53 --------------------------------------------------------------------
54 FUNCTION  Get_Stage_Id
55 RETURN NUMBER;
56 
57 PROCEDURE VALIDATE_STAGES(
58    p_visit_id                in number,
59    p_stages_rec              IN     Visit_Stages_Rec_Type,
60    x_return_status           OUT    NOCOPY VARCHAR2,
61    x_msg_count               OUT    NOCOPY NUMBER,
62    x_msg_data                OUT    NOCOPY VARCHAR2
63 );
64 
65 procedure default_missing_attributes(
66    p_x_stages_rec              IN OUT NOCOPY     Visit_Stages_Rec_Type
67 );
68 
69 --Added by amagrawa
70 PROCEDURE Validate_bef_Times_Derive
71  ( p_visit_id         IN        NUMBER,
72    x_valid_flag       OUT NOCOPY VARCHAR2,
73    x_return_status    OUT NOCOPY VARCHAR2,
74    x_error_msg_code   OUT NOCOPY VARCHAR2
75    );
76 --End of changes by amagrawa
77 
78 -- PRAKKUM :: 28/03/2011 :: VWPE :: ER 12424063 :: START
79 
80 FUNCTION Get_Stage_Parallel_Stages(p_parallel_stage_ids IN PARALLEL_STAGE_ID_DETS, p_visit_id IN NUMBER)
81 RETURN PARALLEL_STAGE_ID_DETS;
82 
83 PROCEDURE PROCESS_STAGE_DATES (
84    p_visit_id                IN NUMBER,
85    p_subject_id              IN NUMBER,
86    p_object_id               IN NUMBER,
87    p_relation_type           IN VARCHAR2,
88    p_operation_flag          IN VARCHAR2,
89    p_x_stages_ovn_tbl        IN  OUT NOCOPY Visit_Stages_OVN_Tbl_Type,--VWPE 12730539:: PRAKKUM :: 08-JUL-2011
90    x_return_status           OUT    NOCOPY VARCHAR2,
91    x_msg_count               OUT    NOCOPY NUMBER,
92    x_msg_data                OUT    NOCOPY VARCHAR2
93 );
94 PROCEDURE GET_VALID_STAGES_LIST (
95    p_stage_id             IN NUMBER,
96    p_all_stage_details    IN Stage_Details,
97    p_stage_relations      IN Stage_Relations,
98    p_x_valid_stages       IN OUT NOCOPY Stage_Details,
99 
100    x_return_status           OUT    NOCOPY VARCHAR2,
101    x_msg_count               OUT    NOCOPY NUMBER,
102    x_msg_data                OUT    NOCOPY VARCHAR2
103 );
104 PROCEDURE CALC_STAGE_START_DURATIONS (
105    p_visit_id             IN     NUMBER,-- PRAKKUM :: 13-FEB-2011 :: Bug 13711800
106    p_relations            IN     Relation_Details,
107    p_x_stages             IN OUT NOCOPY Stage_Details,
108 
109    x_return_status           OUT    NOCOPY VARCHAR2,
110    x_msg_count               OUT    NOCOPY NUMBER,
111    x_msg_data                OUT    NOCOPY VARCHAR2
112 );
113 PROCEDURE UPDATE_STAGE_DATES (
114    p_visit_id                IN NUMBER,-- PRAKKUM :: 13-FEB-2011 :: Bug 13711800
115    p_base_stage_id           IN NUMBER,
116    p_visit_start_date        IN DATE,
117    p_dept_id                 IN NUMBER,
118    p_valid_stages            IN Stage_Details ,
119    p_x_stages_ovn_tbl        IN  OUT NOCOPY Visit_Stages_OVN_Tbl_Type,--VWPE 12730539:: PRAKKUM :: 08-JUL-2011
120    x_return_status           OUT    NOCOPY VARCHAR2,
121    x_msg_count               OUT    NOCOPY NUMBER,
122    x_msg_data                OUT    NOCOPY VARCHAR2
123 );
124 PROCEDURE UPDATE_SUCC_STG_START_DATES(
125    p_stage_id                IN NUMBER,
126    p_visit_id                IN NUMBER,
127    p_planned_end_date        IN DATE,
128    p_x_stages_ovn_tbl        IN  OUT NOCOPY Visit_Stages_OVN_Tbl_Type,--VWPE 12730539:: PRAKKUM :: 08-JUL-2011
129    p_caller_id               IN VARCHAR2,
130    x_return_status           OUT NOCOPY VARCHAR2,
131    x_msg_count               OUT NOCOPY NUMBER,
132    x_msg_data                OUT NOCOPY VARCHAR2
133 );
134 PROCEDURE UPDATE_STAGE_DEPENDENCY_RULES (
135    p_stage_id                IN     NUMBER,
136    p_visit_id                IN     NUMBER,
137    p_x_stages_ovn_tbl        IN  OUT NOCOPY Visit_Stages_OVN_Tbl_Type,--VWPE 12730539:: PRAKKUM :: 08-JUL-2011
138    x_return_status           OUT    NOCOPY VARCHAR2,
139    x_msg_count               OUT    NOCOPY NUMBER,
140    x_msg_data                OUT    NOCOPY VARCHAR2
141 );
142 -- PRAKKUM :: 28/03/2011 :: VWPE :: ER 12424063 :: END
143 
144 -- PRAKKUM :: 08-JUL-2011 :: VWPE 12730539 :: start
145 PROCEDURE UPDATE_STAGES_OVN_COUNT(
146    p_stage_id                IN NUMBER,
147    p_updated_stage_id        IN NUMBER,
148    p_x_stages_ovn_tbl        IN  OUT NOCOPY Visit_Stages_OVN_Tbl_Type,
149    x_return_status           OUT NOCOPY VARCHAR2,
150    x_msg_count               OUT NOCOPY NUMBER,
151    x_msg_data                OUT NOCOPY VARCHAR2
152 );
153 -- PRAKKUM :: 08-JUL-2011 :: VWPE 12730539 :: END
154 
155 --------------------------------------------------------------------
156 --  END: Defining local functions and procedures SIGNATURES       --
157 --------------------------------------------------------------------
158 
159 -- ****************************************************************
160 
161 --------------------------------------------------------------------
162 -- START: Defining local functions and procedures BODY            --
163 --------------------------------------------------------------------
164 
165 --------------------------------------------------------------------
166 -- END: Defining local functions and procedures BODY              --
167 --------------------------------------------------------------------
168 
169 -- *************************************************************
170 
171 ----------------------------------------------------------------------
172 -- START: Defining procedures BODY, which are called from UI screen --
173 ----------------------------------------------------------------------
174 
175 --------------------------------------------------------------------
176 -- PROCEDURE
177 --    Get_Stages_Details
178 --
179 -- PURPOSE
180 --    Get a particular Stage Records with all details
181 --------------------------------------------------------------------
182 PROCEDURE Get_Stages_Details (
183    p_api_version             IN   NUMBER,
184    p_init_msg_list           IN   VARCHAR2  := Fnd_Api.g_false,
185    p_commit                  IN   VARCHAR2  := Fnd_Api.g_false,
186    p_validation_level        IN   NUMBER    := Fnd_Api.g_valid_level_full,
187    p_module_type             IN   VARCHAR2  := 'JSP',
188    p_visit_id                IN   NUMBER,
189    p_start_row               IN   NUMBER,
190    p_rows_per_page           IN   NUMBER,
191 
192 
193    x_stages_tbl               OUT  NOCOPY Visit_stages_tbl_Type,
194    x_row_count               OUT  NOCOPY NUMBER,
195 
196    x_return_status           OUT  NOCOPY VARCHAR2,
197    x_msg_count               OUT  NOCOPY NUMBER,
198    x_msg_data                OUT  NOCOPY VARCHAR2
199 )
200 IS
201 
202    L_API_VERSION        CONSTANT NUMBER := 1.0;
203    L_API_NAME           CONSTANT VARCHAR2(30) := 'Get_Stages_Details';
204    L_FULL_NAME          CONSTANT VARCHAR2(60) := G_PKG_NAME || '.' || L_API_NAME;
205 
206    l_msg_data           VARCHAR2(2000);
207    l_return_status      VARCHAR2(1);
208    l_valid_flag         VARCHAR2(1) := 'N';
209    l_stages_tbl         Visit_stages_tbl_Type;
210    l_st_ind                  number := 0;
211    l_dept_id                 number;
212    l_visit_start_date    DATE;
213 
214    l_cum_duration        NUMBER :=0;
215 
216 
217 -- To find visit related information
218 CURSOR c_visit (x_id IN NUMBER)
219 IS
220       SELECT START_DATE_TIME , department_id FROM AHL_VISITS_VL
221       WHERE VISIT_ID = x_id;
222 --
223 -- SATHAPLI::DFF Project, 05-Jan-2010, fetch the DFF data as well
224 /*
225 CURSOR C_STAGE(C_VISIT_ID number)
226 is
227         select s.stage_id, s.stage_num, s.stage_name,
228           s.object_version_number, s.duration
229     from ahl_vwp_stages_vl s
230         where s.visit_id = c_visit_id
231     order by s.stage_num;
232 */
233 CURSOR C_STAGE(c_visit_id IN NUMBER)
234 IS
235   SELECT S.stage_id
236         ,S.stage_num
237         ,S.stage_name
238         ,S.object_version_number
239         ,S.duration
240         ,S.attribute_category
241         ,S.attribute1
242         ,S.attribute2
243         ,S.attribute3
244         ,S.attribute4
245         ,S.attribute5
246         ,S.attribute6
247         ,S.attribute7
248         ,S.attribute8
249         ,S.attribute9
250         ,S.attribute10
251         ,S.attribute11
252         ,S.attribute12
253         ,S.attribute13
254         ,S.attribute14
255         ,S.attribute15
256   FROM   ahl_vwp_stages_vl s
257   WHERE  s.visit_id = c_visit_id
258   ORDER BY s.stage_num;
259 
260 l_stage_rec             C_STAGE%rowtype;
261 
262 CURSOR C_STAGE_DATE(C_STAGE_ID number)
263 is
264     select vt.stage_id,
265     --sum(s.duration) over(order by s.stage_num) CUMUL_DURATION,
266     --min(vt.start_date_time) start_date_time,
267     max(vt.end_date_time) end_date_time
268     from ahl_visit_tasks_b vt
269     where vt.stage_id = C_STAGE_ID
270     AND nvl(vt.status_code,'X') <> 'DELETED'
271     group by vt.stage_id;
272 
273 l_stage_date_rec             c_stage_date%rowtype;
274 
275 BEGIN
276   -- Standard start of API savepoint
277   SAVEPOINT Get_Stages_Details;
278 
279   -- Check if API is called in debug mode. If yes, enable debug.
280    IF G_DEBUG='Y' THEN
281       AHL_DEBUG_PUB.enable_debug;
282    END IF;
283 
284    -- Debug info.
285    IF Ahl_Debug_Pub.G_FILE_DEBUG THEN
286        IF G_DEBUG='Y' THEN
287           AHL_DEBUG_PUB.debug( l_full_name ||':*****Start*****');
288        END IF;
289     END IF;
290 
291    IF Fnd_Api.to_boolean (p_init_msg_list) THEN
292       Fnd_Msg_Pub.initialize;
293    END IF;
294 
295    --  Initialize API return status to success
296     x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
297 
298    -- Standard call to check for call compatibility.
299    IF NOT Fnd_Api.compatible_api_call(
300          l_api_version,
301          p_api_version,
302          l_api_name,
303          G_PKG_NAME
304    ) THEN
305       RAISE Fnd_Api.g_exc_unexpected_error;
306    END IF;
307 
308 
309 
310    ------------------------Start of API ----------------------
311      x_row_count := 0;
312    -- Cursor to find visit start time
313      OPEN c_visit (p_visit_id);
314      FETCH c_visit INTO l_visit_start_date,l_dept_id;
315      CLOSE c_visit;
316 
317 --Added by amagrawa
318        Validate_bef_Times_Derive
319             (p_visit_id       => p_visit_id,
320              x_valid_flag     => l_valid_flag,
321              x_return_status  => l_return_status,
322              x_error_msg_code => l_msg_data);
323 -- To check if
324  -- Modified by amagrawa as per review comments.
325        IF(l_valid_flag ='N') THEN
326 
327                  FOR l_stage_rec IN C_STAGE(P_VISIT_ID)
328                  LOOP
329 
330                      l_st_ind := l_stage_rec.stage_num -1;
331 
332                      l_stages_tbl(l_st_ind).stage_id := l_stage_rec.stage_id;
333                      l_stages_tbl(l_st_ind).stage_num := l_stage_rec.stage_num;
334                      l_stages_tbl(l_st_ind).stage_name := l_stage_rec.stage_name;
335                      l_stages_tbl(l_st_ind).object_version_number := l_stage_rec.object_version_number;
336                      l_stages_tbl(l_st_ind).duration := l_stage_rec.duration;
337                      l_stages_tbl(l_st_ind).stage_planned_start_time :=null;
338                      l_stages_tbl(l_st_ind).stage_planned_end_time := null;
339                      l_stages_tbl(l_st_ind).Stage_Actual_End_Time := null;
340 
341                      -- SATHAPLI::DFF Project, 05-Jan-2010, set the DFF data too, in the OUT parameter
342                      l_stages_tbl(l_st_ind).attribute_category := l_stage_rec.attribute_category;
343                      l_stages_tbl(l_st_ind).attribute1         := l_stage_rec.attribute1;
344                      l_stages_tbl(l_st_ind).attribute2         := l_stage_rec.attribute2;
345                      l_stages_tbl(l_st_ind).attribute3         := l_stage_rec.attribute3;
346                      l_stages_tbl(l_st_ind).attribute4         := l_stage_rec.attribute4;
347                      l_stages_tbl(l_st_ind).attribute5         := l_stage_rec.attribute5;
348                      l_stages_tbl(l_st_ind).attribute6         := l_stage_rec.attribute6;
349                      l_stages_tbl(l_st_ind).attribute7         := l_stage_rec.attribute7;
350                      l_stages_tbl(l_st_ind).attribute8         := l_stage_rec.attribute8;
351                      l_stages_tbl(l_st_ind).attribute9         := l_stage_rec.attribute9;
352                      l_stages_tbl(l_st_ind).attribute10        := l_stage_rec.attribute10;
353                      l_stages_tbl(l_st_ind).attribute11        := l_stage_rec.attribute11;
354                      l_stages_tbl(l_st_ind).attribute12        := l_stage_rec.attribute12;
355                      l_stages_tbl(l_st_ind).attribute13        := l_stage_rec.attribute13;
356                      l_stages_tbl(l_st_ind).attribute14        := l_stage_rec.attribute14;
357                      l_stages_tbl(l_st_ind).attribute15        := l_stage_rec.attribute15;
358 
359                  END LOOP;
360        ELSE --Return Status = 'S'
361 -- End of changes by amagrawa
362                  FOR l_stage_rec IN C_STAGE(P_VISIT_ID)
363                  LOOP
364 
365             l_st_ind := l_stage_rec.stage_num -1;
366             l_cum_duration := l_cum_duration + l_stage_rec.duration;
367 
368                 l_stages_tbl(l_st_ind).stage_id := l_stage_rec.stage_id;
369                 l_stages_tbl(l_st_ind).stage_num := l_stage_rec.stage_num;
370                 l_stages_tbl(l_st_ind).stage_name := l_stage_rec.stage_name;
371                 l_stages_tbl(l_st_ind).object_version_number := l_stage_rec.object_version_number;
372                 l_stages_tbl(l_st_ind).duration := l_stage_rec.duration;
373                 -- PRAKKUM :: 23-FEB-2011 :: Bug 13711800 :: Fix for Operational Visits
374                 l_stages_tbl(l_st_ind).stage_planned_start_time :=
375                     Compute_Stage_End_Date(P_VISIT_ID, null, l_visit_start_date, l_dept_id, l_cum_duration - l_stage_rec.duration);
376                 -- PRAKKUM :: 23-FEB-2011 :: Bug 13711800 :: Fix for Operational Visits
377                 l_stages_tbl(l_st_ind).stage_planned_end_time :=
378                     Compute_Stage_End_Date(P_VISIT_ID, null, l_visit_start_date, l_dept_id, l_cum_duration );
379 
380              -- SATHAPLI::DFF Project, 05-Jan-2010, set the DFF data too, in the OUT parameter
381              l_stages_tbl(l_st_ind).attribute_category := l_stage_rec.attribute_category;
382              l_stages_tbl(l_st_ind).attribute1         := l_stage_rec.attribute1;
383              l_stages_tbl(l_st_ind).attribute2         := l_stage_rec.attribute2;
384              l_stages_tbl(l_st_ind).attribute3         := l_stage_rec.attribute3;
385              l_stages_tbl(l_st_ind).attribute4         := l_stage_rec.attribute4;
386              l_stages_tbl(l_st_ind).attribute5         := l_stage_rec.attribute5;
387              l_stages_tbl(l_st_ind).attribute6         := l_stage_rec.attribute6;
388              l_stages_tbl(l_st_ind).attribute7         := l_stage_rec.attribute7;
389              l_stages_tbl(l_st_ind).attribute8         := l_stage_rec.attribute8;
390              l_stages_tbl(l_st_ind).attribute9         := l_stage_rec.attribute9;
391              l_stages_tbl(l_st_ind).attribute10        := l_stage_rec.attribute10;
392              l_stages_tbl(l_st_ind).attribute11        := l_stage_rec.attribute11;
393              l_stages_tbl(l_st_ind).attribute12        := l_stage_rec.attribute12;
394              l_stages_tbl(l_st_ind).attribute13        := l_stage_rec.attribute13;
395              l_stages_tbl(l_st_ind).attribute14        := l_stage_rec.attribute14;
396              l_stages_tbl(l_st_ind).attribute15        := l_stage_rec.attribute15;
397 
398             l_stage_date_rec := null;
399 
400             OPEN C_STAGE_DATE(l_stage_rec.stage_id);
401             FETCH C_STAGE_DATE INTO l_stage_date_rec;
402             CLOSE C_STAGE_DATE;
403 
404             l_stages_tbl(l_st_ind).Stage_Actual_End_Time := l_stage_date_rec.end_date_time;
405 
406            END LOOP;
407          END IF; --start and dept not null
408  -- Modified by amagrawa as per review comments.
409        x_row_count := l_stages_tbl.count;
410   --x_return_status := FND_API.G_RET_STS_SUCCESS;
411 
412          --------------------------
413       x_stages_tbl := l_stages_tbl;
414 
415    ------------------------End of API Body------------------------------------
416     -- Standard call to get message count and if count is 1, get message info
417         Fnd_Msg_Pub.Count_And_Get
418         ( p_count => x_msg_count,
419           p_data  => x_msg_data,
420           p_encoded => Fnd_Api.g_false);
421 
422     -- Check if API is called in debug mode. If yes, enable debug.
423         IF G_DEBUG='Y' THEN
424                      AHL_DEBUG_PUB.enable_debug;
425         END IF;
426 
427     -- Debug info.
428 -- Commented by amagrawa as per review comments.
429 --    IF Ahl_Debug_Pub.G_FILE_DEBUG THEN
430        IF G_DEBUG='Y' THEN
431            AHL_DEBUG_PUB.debug(L_FULL_NAME||'AHL_VWP_Tasks_PVT - End');
432        END IF;
433 --    END IF;
434 
435    -- Check if API is called in debug mode. If yes, disable debug.
436     IF G_DEBUG='Y' THEN
437        AHL_DEBUG_PUB.disable_debug;
438     END IF;
439     RETURN;
440 
441 EXCEPTION
442  WHEN Fnd_Api.G_EXC_ERROR THEN
443    x_return_status := Fnd_Api.G_RET_STS_ERROR;
444    ROLLBACK TO Get_Stages_Details;
445    Fnd_Msg_Pub.count_and_get( p_count => x_msg_count,
446                               p_data  => x_msg_data,
447                               p_encoded => Fnd_Api.g_false);
448  WHEN Fnd_Api.G_EXC_UNEXPECTED_ERROR THEN
449    x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
450    ROLLBACK TO Get_Stages_Details;
451    Fnd_Msg_Pub.count_and_get( p_count => x_msg_count,
452                               p_data  => x_msg_data,
453                                p_encoded => Fnd_Api.g_false);
454  WHEN OTHERS THEN
455       ROLLBACK TO Get_Stages_Details;
456       x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
457       IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_unexp_error)
458                 THEN
459          Fnd_Msg_Pub.add_exc_msg (G_PKG_NAME, l_api_name);
460       END IF;
461       Fnd_Msg_Pub.count_and_get (
462             p_encoded => Fnd_Api.g_false,
463             p_count   => x_msg_count,
464             p_data    => x_msg_data  );
465 
466 
467 END Get_Stages_Details;
468 
469 -- prakkum :: 15/03/2011 :: VWPE :: ER 12424063 :: Following API was changed as part of VWP enhancements :: API changed fully without considering old visits,
470 -- since for old visits already default stages will already be created,
471 --------------------------------------------------------------------
472 -- PROCEDURE
473 --    Create_Stages
474 --
475 -- PURPOSE
476 --    To create a Stage for visit based on the profile value set.
477 --    this procedure defaults the stage_num and stage_name to count and duration to 0.
478 --    will be called by create_visit and only the visit_id is passed.
479 --------------------------------------------------------------------
480 PROCEDURE Create_Stages (
481    p_api_version             IN     NUMBER,
482    p_init_msg_list           IN     VARCHAR2  := Fnd_Api.g_false,
483    p_commit                  IN     VARCHAR2  := Fnd_Api.g_false,
484    p_validation_level        IN     NUMBER    := Fnd_Api.g_valid_level_full,
485    p_module_type             IN     VARCHAR2  := 'JSP',
486 
487    p_visit_id                IN     NUMBER,
488    p_x_stages_tbl            IN OUT NOCOPY Visit_Stages_Tbl_Type, -- PRAKKUM :: 15/03/2011 :: VWPE :: ER 12424063
489    x_return_status           OUT    NOCOPY VARCHAR2,
490    x_msg_count               OUT    NOCOPY NUMBER,
491    x_msg_data                OUT    NOCOPY VARCHAR2
492 )
493 IS
494   -- Define local Variables
495    L_API_VERSION           CONSTANT NUMBER := 1.0;
496    L_API_NAME              CONSTANT VARCHAR2(30) := 'Create Stages';
497    L_FULL_NAME             CONSTANT VARCHAR2(60) := G_PKG_NAME || '.' || L_API_NAME;
498 
499    l_msg_data              VARCHAR2(2000);
500    l_msg_count             NUMBER;
501 
502    --PRAKKUM :: 23/03/2011 :: VWPE :: ER 12424063 :: No need to create stages default stages anymore
503    --l_stage_count           NUMBER;
504    l_rowid                 ROWID;
505 
506    l_dummy                 NUMBER;
507 
508    l_dept_id               NUMBER;
509    l_visit_start_date      DATE;
510    l_visit_type_code       VARCHAR2(30);
511 
512    -- Define local record datatypes
513    l_stages_tbl            Visit_Stages_Tbl_Type := p_x_stages_tbl;
514 
515    l_isValidationFailed    BOOLEAN DEFAULT false;
516 
517    CURSOR c_seq IS
518       SELECT Ahl_vwp_stages_B_S.NEXTVAL
519       FROM   dual;
520 
521  -- To find whether id already exists
522    CURSOR c_id_exists (x_id IN NUMBER) IS
523    SELECT 1
524    FROM   Ahl_vwp_stages_b
525    WHERE  stage_id = x_id;
526 
527    -- To find whether id already exists
528    CURSOR c_visit (vst_id IN NUMBER) IS
529    SELECT START_DATE_TIME , department_id, visit_type_code, AHL_VWP_VISITS_PVT.Is_Old_Visit(VISIT_ID) IS_OLD_VISIT
530    FROM AHL_VISITS_VL
531    WHERE VISIT_ID = vst_id;
532 
533    l_visit_dets  c_visit%RowType;
534 
535    l_is_old_visit VARCHAR2(1) := 'N';-- PRAKKUM :: 28-JUN-2011 :: VWPE :: ER 12424063
536 
537    --
538    CURSOR c_stagenum_exists(V_ID IN NUMBER, STG_NO IN NUMBER) IS
539    SELECT 1
540    FROM AHL_VWP_STAGES_B
541    WHERE Visit_Id = V_ID AND stage_num = STG_NO;
542 
543    l_return_status          VARCHAR2(1);-- PRAKKUM :: 12/05/2011 :: VWPE :: ER 12424063
544 
545 BEGIN
546    --------------------- Initialize -----------------------
547    SAVEPOINT Create_Stage;
548 
549    -- Check if API is called in debug mode. If yes, enable debug.
550    IF G_DEBUG='Y' THEN
551    Ahl_Debug_Pub.enable_debug;
552    END IF;
553 
554    -- Debug info.
555    IF G_DEBUG='Y' THEN
556        AHL_DEBUG_PUB.Debug( l_full_name ||': Start');
557    END IF;
558 
559    -- Initialize message list if p_init_msg_list is set to TRUE.
560    IF Fnd_Api.to_boolean(p_init_msg_list)
561    THEN
562      Fnd_Msg_Pub.initialize;
563    END IF;
564 
565     --  Initialize API return status to success
566     x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
567     l_return_status := x_return_status;
568 
569    -- Standard call to check for call compatibility.
570    IF NOT Fnd_Api.COMPATIBLE_API_CALL(l_api_version,
571                                       p_api_version,
572                                       l_api_name,G_PKG_NAME)
573    THEN
574        RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
575    END IF;
576 
577    ------------------------Start of API Body------------------------------------
578 
579    --------------------Value OR ID conversion---------------------------
580 /*  not reqd;
581    IF p_module_type = 'JSP'
582    THEN
583      -- do nothing;
584    END IF;
585 */
586 
587    -------------------------------- Validate -----------------------------------------
588 
589     IF G_DEBUG='Y' THEN
590          AHL_DEBUG_PUB.Debug( l_full_name ||':START VALIDATE');
591     END IF;
592 
593    --
594    -- Check for the ID.
595    --
596    IF (P_VISIT_ID = Fnd_Api.g_miss_num OR P_VISIT_ID IS Null)
597    THEN
598         Fnd_Message.SET_NAME('AHL','AHL_VWP_VISIT_INVALID');
599         Fnd_Msg_Pub.ADD;
600    END IF;
601 
602    IF G_DEBUG='Y' THEN
603         AHL_DEBUG_PUB.Debug( l_full_name ||':END VALIDATE');
604    END IF;
605 
606     -- Cursor to find visit start time
607     OPEN c_visit (p_visit_id);
608     FETCH c_visit INTO l_visit_dets;
609     CLOSE c_visit;
610     -- PRAKKUM :: 08-JUL-2011 :: VWPE 12730539
611     l_visit_start_date := l_visit_dets.START_DATE_TIME;
612     l_dept_id := l_visit_dets.department_id;
613     l_visit_type_code := l_visit_dets.visit_type_code;
614     l_is_old_visit := l_visit_dets.IS_OLD_VISIT;
615 
616 
617    -------------------------- Insert --------------------------
618     IF G_DEBUG='Y' THEN
619        AHL_DEBUG_PUB.Debug( l_full_name ||':Insert');
620     END IF;
621 
622     IF l_is_old_visit = 'Y' THEN
623        Fnd_Message.SET_NAME('AHL','AHL_VWP_OVST_CRT_VST_INV');
624        Fnd_Msg_Pub.ADD;
625        RAISE Fnd_Api.G_EXC_ERROR;
626     END IF;
627 
628     l_isValidationFailed := false;
629 
630     FOR I IN 1..l_stages_tbl.count
631     LOOP
632 
633         -- Invoke the table handler to create a record
634 
635         -- Check for the ID.
636         IF (l_stages_tbl(i).STAGE_ID = Fnd_Api.g_miss_num OR l_stages_tbl(i).STAGE_ID IS Null) THEN
637              -- If the ID is not passed into the API, then
638              -- grab a value from the sequence.
639              l_stages_tbl(i).STAGE_ID := Get_Stage_Id;
640 
641         ELSE -- If passed into API, do validation
642 
643              -- Check to be sure that the sequence does not exist.
644              OPEN c_id_exists (l_stages_tbl(i).STAGE_ID);
645              FETCH c_id_exists INTO l_dummy;
646              CLOSE c_id_exists;
647 
648              -- If the value for the ID already exists, then
649              -- l_dummy would be populated with '1', otherwise, it receives NULL.
650              IF l_dummy IS NOT NULL THEN
651                Fnd_Message.SET_NAME('AHL','AHL_VWP_SEQUENCE_NOT_EXISTS');
652                Fnd_Msg_Pub.ADD;
653              END IF;
654 
655         END IF;
656 
657         IF G_DEBUG='Y' THEN
658             AHL_DEBUG_PUB.Debug( l_full_name ||': Stage ID choosen =' ||  l_stages_tbl(i).STAGE_ID);
659         END IF;
660 
661          -- Check for the Num.
662         IF (l_stages_tbl(i).STAGE_NUM = Fnd_Api.g_miss_num OR l_stages_tbl(i).STAGE_NUM IS Null) THEN
663             l_stages_tbl(i).STAGE_NUM := Get_Visit_Stage_Number(P_VISIT_ID);
664         ELSE
665              -- Check to be sure that the stage number does not exist.
666              OPEN c_stagenum_exists (P_VISIT_ID, l_stages_tbl(i).STAGE_NUM);
667              FETCH c_stagenum_exists INTO l_dummy;
668              CLOSE c_stagenum_exists;
669 
670              IF G_DEBUG='Y' THEN
671                AHL_DEBUG_PUB.Debug( l_full_name ||':l_dummy =' || l_dummy);
672              END IF;
673 
674              -- If the value for the ID already exists, then
675              -- l_dummy would be populated with '1', otherwise, it receives NULL.
676              IF l_dummy IS NOT NULL THEN
677                Fnd_Message.SET_NAME('AHL','AHL_VWP_STAGE_NUM_EXISTS');
678                Fnd_Msg_Pub.ADD;
679              END IF;
680         END IF;
681 
682         IF (l_stages_tbl(i).Duration = Fnd_Api.g_miss_num OR l_stages_tbl(i).Duration IS Null) THEN
683 
684            l_stages_tbl(i).Duration := 0;
685 
686         END IF;
687 
688         --Check for negative
689         IF l_stages_tbl(i).Duration <= 0 THEN
690            Fnd_Message.SET_NAME('AHL','AHL_VWP_STAGE_DURN_INV');
691            Fnd_Message.SET_TOKEN('STAGE_NAME', l_stages_tbl(i).stage_name);
692            Fnd_Msg_Pub.ADD;
693         END IF;
694         IF l_stages_tbl(i).Stage_Num <= 0 THEN
695            Fnd_Message.SET_NAME('AHL','AHL_VWP_STAGE_NUM_INV');
696            Fnd_Message.SET_TOKEN('STAGE_NAME', l_stages_tbl(i).stage_name);
697            Fnd_Msg_Pub.ADD;
698         END IF;
699 
700         IF l_dept_id is null OR l_visit_start_date is NULL or l_visit_type_code is NULL THEN -- Set dates to null . Since this calculations need all this values to calculate
701 
702            l_stages_tbl(i).Stage_Planned_Start_Time := NULL;
703 
704            l_stages_tbl(i).Stage_Planned_End_Time := NULL;
705 
706         ELSE
707 
708            l_stages_tbl(i).Stage_Planned_Start_Time := l_visit_start_date;
709 
710            -- PRAKKUM :: 23-FEB-2011 :: Bug 13711800 :: Fix for Operational Visits
711            l_stages_tbl(i).Stage_Planned_End_Time := Compute_Stage_End_Date(p_visit_id, null, l_stages_tbl(i).Stage_Planned_Start_Time, l_dept_id, l_stages_tbl(i).Duration );
712         END IF;
713 
714         l_stages_tbl(i).STAGE_STATUS_CODE:= 'PLANNING'; -- STAGE INITIAL STATUS :: prakkum :: 15/03/2011 :: VWPE :: ER 12424063
715 
716            Ahl_VWP_Stages_Pkg.Insert_Row (
717              X_ROWID                 => l_rowid,
718              X_VISIT_ID              => P_VISIT_ID,
719              X_STAGE_ID              => l_stages_tbl(i).STAGE_ID,
720              X_STAGE_NUM             => l_stages_tbl(i).Stage_Num,
721              X_STAGE_NAME            => l_stages_tbl(i).Stage_Name,
722              X_DURATION              => l_stages_tbl(i).Duration,
723              X_OBJECT_VERSION_NUMBER => l_stages_tbl(i).OBJECT_VERSION_NUMBER,
724 
725              X_ATTRIBUTE_CATEGORY      => l_stages_tbl(i).ATTRIBUTE_CATEGORY,
726              X_ATTRIBUTE1              => l_stages_tbl(i).ATTRIBUTE1 ,
727              X_ATTRIBUTE2              => l_stages_tbl(i).ATTRIBUTE2 ,
728              X_ATTRIBUTE3              => l_stages_tbl(i).ATTRIBUTE3 ,
729              X_ATTRIBUTE4              => l_stages_tbl(i).ATTRIBUTE4 ,
730              X_ATTRIBUTE5              => l_stages_tbl(i).ATTRIBUTE5 ,
731              X_ATTRIBUTE6              => l_stages_tbl(i).ATTRIBUTE6 ,
732              X_ATTRIBUTE7              => l_stages_tbl(i).ATTRIBUTE7 ,
733              X_ATTRIBUTE8              => l_stages_tbl(i).ATTRIBUTE8 ,
734              X_ATTRIBUTE9              => l_stages_tbl(i).ATTRIBUTE9 ,
735              X_ATTRIBUTE10             => l_stages_tbl(i).ATTRIBUTE10 ,
736              X_ATTRIBUTE11             => l_stages_tbl(i).ATTRIBUTE11 ,
737              X_ATTRIBUTE12             => l_stages_tbl(i).ATTRIBUTE12 ,
738              X_ATTRIBUTE13             => l_stages_tbl(i).ATTRIBUTE13 ,
739              X_ATTRIBUTE14             => l_stages_tbl(i).ATTRIBUTE14 ,
740              X_ATTRIBUTE15             => l_stages_tbl(i).ATTRIBUTE15 ,
741 
742              X_CREATION_DATE         => SYSDATE,
743              X_CREATED_BY            => Fnd_Global.USER_ID,
744              X_LAST_UPDATE_DATE      => SYSDATE,
745              X_LAST_UPDATED_BY       => Fnd_Global.USER_ID,
746              X_LAST_UPDATE_LOGIN     => Fnd_Global.LOGIN_ID,
747              X_STAGE_STATUS_CODE     => l_stages_tbl(i).STAGE_STATUS_CODE,--PRAKKUM :: 15/03/2011 :: VWPE :: ER 12424063
748              X_PLANNED_START_DATE      => l_stages_tbl(i).Stage_Planned_Start_Time, --PRAKKUM :: 15/03/2011 :: VWPE :: ER 12424063
749              X_PLANNED_END_DATE        => l_stages_tbl(i).Stage_Planned_End_Time,--PRAKKUM :: 15/03/2011 :: VWPE :: ER 12424063
750              X_PREV_STAGE_NUM          => l_stages_tbl(i).PREV_STAGE_NUM,--PRAKKUM :: 15/03/2011 :: VWPE :: ER 12424063
751              X_EARLIEST_START_DATE     => l_stages_tbl(i).EARLIEST_START_DATE );--PRAKKUM :: 15/03/2011 :: VWPE :: ER 12424063
752 
753              -- CREATE A STAGE TASK
754              AHL_VWP_TASKS_PVT.Create_Stage_Tasks (
755                    p_api_version       => p_api_version,
756                    p_init_msg_list     => Fnd_Api.G_FALSE,
757                    p_commit            => Fnd_Api.G_FALSE,
758                    p_validation_level  => p_validation_level,
759                    p_module_type       => p_module_type,
760                    p_stage_id          => l_stages_tbl(i).STAGE_ID,
761                    p_visit_id          => P_VISIT_ID,
762                    x_return_status     => l_return_status,
763                    x_msg_count         => l_msg_count,
764                    x_msg_data          => l_msg_data
765              );
766 
767             IF l_msg_count > 0 OR NVL(l_return_status,'x') <> FND_API.G_RET_STS_SUCCESS THEN
768                 x_msg_count := l_msg_count;
769                 x_return_status := l_return_status;
770                 IF l_return_status = Fnd_Api.g_ret_sts_error THEN
771                     RAISE Fnd_Api.g_exc_error;
772                 ELSIF l_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
773                     RAISE Fnd_Api.g_exc_unexpected_error;
774                 END IF;
775             END IF;
776 
777      IF G_DEBUG='Y' THEN
778        AHL_DEBUG_PUB.Debug( l_full_name ||': Visit ID =' || P_VISIT_ID);
779        AHL_DEBUG_PUB.Debug( l_full_name ||': Stage Number =' ||  l_stages_tbl(i).Stage_Num);
780      END IF;
781    END LOOP;
782 
783    IF l_isValidationFailed THEN
784       RAISE Fnd_Api.G_EXC_ERROR;
785    END IF;
786 
787   ---------------------------End of API Body---------------------------------------
788    --Standard check to count messages
789    l_msg_count := Fnd_Msg_Pub.count_msg;
790    IF l_msg_count > 0 THEN
791       X_msg_count := l_msg_count;
792       X_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
793       RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
794    END IF;
795 
796    --Standard check for commit
797    IF Fnd_Api.TO_BOOLEAN(p_commit) THEN
798       COMMIT;
799    END IF;
800 
801    IF G_DEBUG='Y' THEN
802        AHL_DEBUG_PUB.Debug( l_full_name ||':End');
803    END IF;
804 
805    -- Check if API is called in debug mode. If yes, disable debug.
806    IF G_DEBUG='Y' THEN
807       Ahl_Debug_Pub.disable_debug;
808    END IF;
809 EXCEPTION
810    WHEN Fnd_Api.g_exc_error THEN
811       ROLLBACK TO Create_Stage;
812       x_return_status := Fnd_Api.g_ret_sts_error;
813       Fnd_Msg_Pub.count_and_get(
814             p_encoded => Fnd_Api.g_false,
815             p_count   => x_msg_count,
816             p_data    => x_msg_data
817       );
818    WHEN Fnd_Api.g_exc_unexpected_error THEN
819       ROLLBACK TO Create_Stage;
820       x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
821       Fnd_Msg_Pub.count_and_get (
822             p_encoded => Fnd_Api.g_false,
823             p_count   => x_msg_count,
824             p_data    => x_msg_data
825       );
826    WHEN OTHERS THEN
827       ROLLBACK TO Create_Stage;
828       x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
829       IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_unexp_error)
830                 THEN
831          Fnd_Msg_Pub.add_exc_msg (G_PKG_NAME, l_api_name);
832       END IF;
833       Fnd_Msg_Pub.count_and_get (
834             p_encoded => Fnd_Api.g_false,
835             p_count   => x_msg_count,
836             p_data    => x_msg_data
837       );
838 END Create_StageS;
839 
840 
841 --------------------------------------------------------------------
842 -- PROCEDURE
843 --    Update_Stages
844 --
845 -- PURPOSE
846 --    To create a Stage for visit based on the profile value set.
847 --    this procedure defaults the stage_num and stage_name to count and duration to 0.
848 --    will be called by create_visit and only the visit_id is passed.
849 --------------------------------------------------------------------
850 PROCEDURE Update_Stages (
851    p_api_version             IN     NUMBER,
852    p_init_msg_list           IN     VARCHAR2  := Fnd_Api.g_false,
853    p_commit                  IN     VARCHAR2  := Fnd_Api.g_false,
854    p_validation_level        IN     NUMBER    := Fnd_Api.g_valid_level_full,
855    p_module_type             IN     VARCHAR2  := 'JSP',
856 
857    p_visit_id                IN     NUMBER,
858    p_x_stages_tbl            IN  OUT NOCOPY Visit_Stages_Tbl_Type,
859 
860    p_x_stages_ovn_tbl        IN  OUT NOCOPY Visit_Stages_OVN_Tbl_Type,--VWPE 12730539:: PRAKKUM :: 08-JUL-2011
861 
862    x_return_status           OUT    NOCOPY VARCHAR2,
863    x_msg_count               OUT    NOCOPY NUMBER,
864    x_msg_data                OUT    NOCOPY VARCHAR2
865 )
866 IS
867   -- Define local Variables
868    L_API_VERSION           CONSTANT NUMBER := 1.0;
869    L_API_NAME              CONSTANT VARCHAR2(30) := 'Update Stages';
870    L_FULL_NAME             CONSTANT VARCHAR2(60) := G_PKG_NAME || '.' || L_API_NAME;
871    L_DEBUG            CONSTANT VARCHAR2(90) := 'ahl.plsql.'||L_FULL_NAME;
872 
873    l_msg_data              VARCHAR2(2000);
874    l_msg_count             NUMBER;
875    l_dummy                 varchar2(1);
876    l_visit_status          varchar2(30);
877    l_return_status         varchar2(1);
878    l_validate_status       varchar2(1);
879 
880    l_planned_order_flag VARCHAR2(1);
881    l_is_old_visit VARCHAR2(1) := 'N';--VWPE 12730539:: PRAKKUM :: 08-JUL-2011
882 
883 CURSOR c_check_visit_status(C_VISIT_ID NUMBER) IS
884 SELECT status_code FROM AHL_VISITS_B
885 WHERE VISIT_ID = C_VISIT_ID
886 AND STATUS_CODE IN ('DRAFT','PLANNING', 'PARTIALLY RELEASED', 'RELEASED' );
887 
888 -- Commented based on review comments
889 /*CURSOR C_JOB(C_VISIT_ID NUMBER , C_STAGE_NUM NUMBER )
890 IS
891         select 'x' from ahl_workorders_v
892         where visit_task_id in
893            (select DISTINCT VISIT_TASK_ID from AHL_VISIT_TASKS_B
894             where visit_id = C_VISIT_ID
895             and STAGE_ID IN (SELECT STAGE_ID FROM AHL_VWP_STAGES_B WHERE stage_num > C_STAGE_NUM
896                              AND VISIT_ID = C_VISIT_ID))
897         and ( job_status_code =3  or  firm_planned_flag = 1 );
898 */
899 
900 -- SKPATHAK :: Bug #9402556 :: 24-FEB-2010 :: START
901 -- Cursor to find out the cumulative duration of all the stages before this stage
902 CURSOR c_sum_stage_duration (c_stage_id NUMBER,
903                              c_visit_id NUMBER)
904 IS
905 SELECT sum(duration)
906 FROM AHL_VWP_STAGES_VL
907 WHERE visit_id = c_visit_id
908 AND stage_num < (select stage_num
909                     from AHL_VWP_STAGES_VL
910                     WHERE stage_id = c_stage_id
911                     AND visit_id = c_visit_id);
912 
913 -- To find visit related information
914 CURSOR c_visit (c_visit_id IN NUMBER)
915 IS
916       SELECT START_DATE_TIME , department_id, AHL_VWP_VISITS_PVT.Is_Old_Visit(VISIT_ID) IS_OLD_VISIT
917       FROM AHL_VISITS_B
918       WHERE VISIT_ID = c_visit_id;--VWPE 12730539:: PRAKKUM :: 08-JUL-2011
919 
920 l_visit_dets  c_visit%RowType;
921 
922 CURSOR get_past_task_details (c_visit_id NUMBER)
923 IS
924 SELECT past_task_start_date, stage_id FROM AHL_VISIT_TASKS_B
925 WHERE visit_id = c_visit_id
926 AND past_task_start_date IS NOT NULL;
927 
928 l_past_task_start_date DATE;
929 l_stage_id NUMBER;
930 l_stage_planned_start_time DATE;
931 l_cum_duration NUMBER;
932 l_visit_start_date DATE;
933 l_dept_id NUMBER;
934 -- SKPATHAK :: Bug #9402556 :: 24-FEB-2010 :: END
935 
936    -- To find task related information
937 
938 l_visit_end_date DATE;
939 
940 l_stages_count NUMBER;
941 
942 cursor C_get_stage_data(c_stage_id number)
943 is
944 select * from ahl_vwp_stages_vl where stage_id = c_stage_id;
945 l_stage_REC   C_get_stage_data%rowtype;
946 
947 l_is_planned_end_date_updated BOOLEAN default false;
948 
949 l_is_earliest_date_updated BOOLEAN default false;
950 
951 l_isValidationFailed BOOLEAN DEFAULT FALSE;
952 
953 BEGIN
954    --------------------- Initialize -----------------------
955    SAVEPOINT Update_Stages;
956 
957    -- Check if API is called in debug mode. If yes, enable debug.
958    IF G_DEBUG='Y' THEN
959      Ahl_Debug_Pub.enable_debug;
960    END IF;
961 
962    -- Debug info.
963    IF G_DEBUG='Y' THEN
964        AHL_DEBUG_PUB.Debug( l_full_name ||': Start');
965    END IF;
966 
967    -- Initialize message list if p_init_msg_list is set to TRUE.
968    IF Fnd_Api.to_boolean(p_init_msg_list)
969    THEN
970      Fnd_Msg_Pub.initialize;
971    END IF;
972 
973     --  Initialize API return status to success
974     x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
975     l_return_status := x_return_status;
976 
977    -- Standard call to check for call compatibility.
978    IF NOT Fnd_Api.COMPATIBLE_API_CALL(l_api_version,
979                                       p_api_version,
980                                       l_api_name,G_PKG_NAME)
981    THEN
982        RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
983    END IF;
984 
985    ------------------------Start of API Body------------------------------------
986 
987    --
988    -- Check for the ID.
989    --
990    IF (P_VISIT_ID = Fnd_Api.g_miss_num OR P_VISIT_ID IS Null)
991    THEN
992              Fnd_Message.SET_NAME('AHL','AHL_VWP_VISIT_NOT_FOUND');
993              Fnd_Msg_Pub.ADD;
994              -- Added by amagrawa based on review commenst
995              RAISE Fnd_Api.G_EXC_ERROR;
996    END IF;
997 
998 
999    --verify if visit status is planning or released or partially_released
1000    open c_check_visit_status(p_visit_id);
1001    fetch c_check_visit_status into l_visit_status;
1002    if c_check_visit_status%notfound
1003    then
1004              Fnd_Message.SET_NAME('AHL','AHL_VWP_VISIT_STATUS_INV');
1005              Fnd_Msg_Pub.ADD;
1006  -- Added by amagrawa based on review commenst
1007              close c_check_visit_status;
1008              RAISE Fnd_Api.G_EXC_ERROR;
1009    end if;
1010    close c_check_visit_status;
1011 
1012 -- Commented by amagrawa as per review commenst.
1013 /*   --Standard check to count messages
1014    l_msg_count := Fnd_Msg_Pub.count_msg;
1015 
1016    IF l_msg_count > 0 THEN
1017       x_msg_count := l_msg_count;
1018       x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
1019       RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
1020    END IF;
1021 */
1022    -------------------------- Update --------------------------
1023     IF G_DEBUG='Y' THEN
1024        AHL_DEBUG_PUB.Debug( l_full_name ||':Insert');
1025     END IF;
1026 
1027     --VWPE 12730539:: PRAKKUM :: 08-JUL-2011
1028     OPEN c_visit (p_visit_id);
1029     FETCH c_visit INTO l_visit_dets;
1030     CLOSE c_visit;
1031     l_is_old_visit := l_visit_dets.IS_OLD_VISIT;
1032 
1033     l_stages_count := p_x_stages_tbl.count;
1034 
1035     l_isValidationFailed := false;
1036 
1037     FOR i IN 1..l_stages_count
1038     loop
1039 
1040        IF G_DEBUG='Y' THEN
1041                  AHL_DEBUG_PUB.Debug( l_full_name ||':START VALIDATE');
1042        END IF;
1043 
1044        l_is_planned_end_date_updated := false;--PRAKKUM :: 15/03/2011 :: VWPE :: ER 12424063
1045        l_is_earliest_date_updated := false;--PRAKKUM :: 15/03/2011 :: VWPE :: ER 12424063
1046 
1047    -------------------------------- Validate -----------------------------------------
1048        l_validate_status := Fnd_Api.G_RET_STS_SUCCESS;
1049 
1050        default_missing_attributes(p_x_stages_tbl(i));
1051 
1052         VALIDATE_STAGES(
1053            p_visit_id           => p_visit_id,
1054            p_stages_rec         => p_x_stages_tbl(i),
1055            x_return_status      => l_validate_status,
1056            x_msg_count          => x_msg_count,
1057            x_msg_data           => x_msg_data
1058         );
1059       -- Added be amagrawa based on review comments
1060         IF l_validate_status <> Fnd_Api.G_RET_STS_SUCCESS THEN
1061               RAISE Fnd_Api.G_EXC_ERROR;
1062         END IF;
1063 
1064         IF G_DEBUG='Y' THEN
1065                  AHL_DEBUG_PUB.Debug( l_full_name ||':END VALIDATE');
1066         END IF;
1067 
1068         -- PRAKKUM :: 15/03/2011 :: VWPE :: ER 12424063 :: START
1069         OPEN C_get_stage_data(p_x_stages_tbl(i).STAGE_ID);
1070         FETCH C_get_stage_data INTO L_STAGE_REC;
1071         CLOSE C_get_stage_data;
1072 
1073         IF ( NOT ( L_STAGE_REC.PLANNED_END_DATE is NULL and p_x_stages_tbl(i).Stage_Planned_End_Time IS NULL ) ) AND
1074            nvl(L_STAGE_REC.PLANNED_END_DATE,sysdate) <> nvl(p_x_stages_tbl(i).Stage_Planned_End_Time,sysdate+1) THEN
1075                 l_is_planned_end_date_updated := true;
1076         END IF;
1077 
1078         IF ( NOT ( L_STAGE_REC.EARLIEST_START_DATE is NULL and p_x_stages_tbl(i).EARLIEST_START_DATE IS NULL ) ) AND
1079            nvl(L_STAGE_REC.EARLIEST_START_DATE,sysdate) <> nvl(p_x_stages_tbl(i).EARLIEST_START_DATE,sysdate+1) THEN
1080                 l_is_earliest_date_updated := true;
1081         END IF;
1082 
1083         -- PRAKKUM :: 15/03/2011 :: VWPE :: ER 12424063 :: END
1084 
1085 -- Commented by amagrawa based on review comments
1086 /*      -- VALIDATE IF JOB IN SUBSEQUENT STAGE IS FIRMED OR RELEASED
1087         IF l_visit_status IN ('RELEASED' , 'PARTIALLY RELEASED')
1088          THEN
1089              OPEN C_JOB(P_VISIT_ID, p_x_stages_tbl(i).STAGE_NUM );
1090              FETCH C_JOB INTO L_DUMMY;
1091              IF C_JOB%FOUND
1092              THEN
1093                      Fnd_Message.SET_NAME('AHL','AHL_VWP_STAGE_JOB_FIRM_REL');
1094                      Fnd_Message.SET_TOKEN('STAGE_NAME', p_x_stages_tbl(i).stage_name);
1095                      Fnd_Msg_Pub.ADD;
1096                      l_validate_status := Fnd_Api.G_RET_STS_ERROR;
1097              END IF;
1098              CLOSE C_JOB;
1099          END IF;
1100   /* Uncommented as per Stages test case STG14 : Removed by Senthil for TC */
1101 
1102 ----------------------------- IF NO ERRORS UPDATE-----------------------------------------
1103               if l_validate_status = Fnd_Api.G_RET_STS_SUCCESS
1104               then
1105                   -- Invoke the table handler to update the record
1106                   --
1107                    Ahl_VWP_stages_Pkg.Update_Row (
1108                      X_VISIT_ID                => P_VISIT_ID,
1109                      X_STAGE_ID                => p_x_stages_tbl(i).STAGE_ID,
1110                      X_STAGE_NUM               => p_x_stages_tbl(i).STAGE_NUM,
1111                      X_STAGE_NAME              => p_x_stages_tbl(i).STAGE_NAME,
1112                      X_DURATION                => p_x_stages_tbl(i).DURATION,
1113                      X_OBJECT_VERSION_NUMBER   => p_x_stages_tbl(i).OBJECT_VERSION_NUMBER+1,
1114                      X_ATTRIBUTE_CATEGORY      => p_x_stages_tbl(i).ATTRIBUTE_CATEGORY,
1115                      X_ATTRIBUTE1              => p_x_stages_tbl(i).ATTRIBUTE1,
1116                      X_ATTRIBUTE2              => p_x_stages_tbl(i).ATTRIBUTE2,
1117                      X_ATTRIBUTE3              => p_x_stages_tbl(i).ATTRIBUTE3,
1118                      X_ATTRIBUTE4              => p_x_stages_tbl(i).ATTRIBUTE4,
1119                      X_ATTRIBUTE5              => p_x_stages_tbl(i).ATTRIBUTE5,
1120                      X_ATTRIBUTE6              => p_x_stages_tbl(i).ATTRIBUTE6,
1121                      X_ATTRIBUTE7              => p_x_stages_tbl(i).ATTRIBUTE7,
1122                      X_ATTRIBUTE8              => p_x_stages_tbl(i).ATTRIBUTE8,
1123                      X_ATTRIBUTE9              => p_x_stages_tbl(i).ATTRIBUTE9,
1124                      X_ATTRIBUTE10             => p_x_stages_tbl(i).ATTRIBUTE10,
1125                      X_ATTRIBUTE11             => p_x_stages_tbl(i).ATTRIBUTE11,
1126                      X_ATTRIBUTE12             => p_x_stages_tbl(i).ATTRIBUTE12,
1127                      X_ATTRIBUTE13             => p_x_stages_tbl(i).ATTRIBUTE13,
1128                      X_ATTRIBUTE14             => p_x_stages_tbl(i).ATTRIBUTE14,
1129                      X_ATTRIBUTE15             => p_x_stages_tbl(i).ATTRIBUTE15,
1130                      X_LAST_UPDATE_DATE        => SYSDATE,
1131                      X_LAST_UPDATED_BY         => Fnd_Global.USER_ID,
1132                      X_LAST_UPDATE_LOGIN       => Fnd_Global.LOGIN_ID,
1133                      X_STAGE_STATUS_CODE       => p_x_stages_tbl(i).STAGE_STATUS_CODE,   -- PRAKKUM :: 15/03/2011 :: VWPE :: ER 12424063
1134                      X_PLANNED_START_DATE      => p_x_stages_tbl(i).Stage_Planned_Start_Time,-- PRAKKUM :: 15/03/2011 :: VWPE :: ER 12424063
1135                      X_PLANNED_END_DATE        => p_x_stages_tbl(i).Stage_Planned_End_Time,-- PRAKKUM :: 15/03/2011 :: VWPE :: ER 12424063
1136                      X_PREV_STAGE_NUM          => p_x_stages_tbl(i).PREV_STAGE_NUM,-- PRAKKUM :: 15/03/2011 :: VWPE :: ER 12424063
1137                      X_EARLIEST_START_DATE     => p_x_stages_tbl(i).EARLIEST_START_DATE -- PRAKKUM :: 15/03/2011 :: VWPE :: ER 12424063
1138                      );
1139 
1140                      -- PRAKKUM :: 15/03/2011 :: VWPE :: ER 12424063 :: START
1141 
1142                      IF l_is_planned_end_date_updated THEN
1143 
1144                            UPDATE_SUCC_STG_START_DATES(
1145                               p_stage_id => p_x_stages_tbl(i).STAGE_ID,
1146                               p_visit_id => P_VISIT_ID,
1147                               p_planned_end_date => p_x_stages_tbl(i).Stage_Planned_End_Time,
1148                               p_x_stages_ovn_tbl => p_x_stages_ovn_tbl,--VWPE 12730539:: PRAKKUM :: 08-JUL-2011
1149                               p_caller_id         => 'P',
1150                               x_return_status     => l_return_status,
1151                               x_msg_count         => l_msg_count,
1152                               x_msg_data          => l_msg_data);
1153 
1154                           IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
1155                            fnd_log.string(fnd_log.level_statement,L_DEBUG,'After calling AHL_VWP_VISITS_STAGES_PVT.UPDATE_SUCC_STG_START_DATES - l_return_status : '||l_return_status);
1156                           END IF;
1157 
1158                           IF l_msg_count > 0 OR NVL(l_return_status,'x') <> FND_API.G_RET_STS_SUCCESS THEN
1159                              x_msg_count := l_msg_count;
1160                              x_return_status := l_return_status;
1161                              IF l_return_status = Fnd_Api.g_ret_sts_error THEN
1162                                RAISE Fnd_Api.g_exc_error;
1163                              ELSIF l_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
1164                                RAISE Fnd_Api.g_exc_unexpected_error;
1165                              END IF;
1166                           END IF;
1167 
1168                      END IF;
1169 
1170                      IF l_is_earliest_date_updated THEN
1171 
1172                           UPDATE_STAGE_DEPENDENCY_RULES (
1173                               p_stage_id => p_x_stages_tbl(i).STAGE_ID,
1174                               p_visit_id => P_VISIT_ID,
1175                               p_x_stages_ovn_tbl => p_x_stages_ovn_tbl,--VWPE 12730539:: PRAKKUM :: 08-JUL-2011
1176                               x_return_status     => l_return_status,
1177                               x_msg_count         => l_msg_count,
1178                               x_msg_data          => l_msg_data);
1179 
1180                           IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
1181                            fnd_log.string(fnd_log.level_statement,L_DEBUG,'After calling AHL_VWP_VISITS_STAGES_PVT.UPDATE_STAGE_DEPENDENCY_RULES - l_return_status : '||l_return_status||' :p_x_stages_ovn_tbl cnt is '||p_x_stages_ovn_tbl.count);
1182                           END IF;
1183 
1184                           IF l_msg_count > 0 OR NVL(l_return_status,'x') <> FND_API.G_RET_STS_SUCCESS THEN
1185                              x_msg_count := l_msg_count;
1186                              x_return_status := l_return_status;
1187                              IF l_return_status = Fnd_Api.g_ret_sts_error THEN
1188                                RAISE Fnd_Api.g_exc_error;
1189                              ELSIF l_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
1190                                RAISE Fnd_Api.g_exc_unexpected_error;
1191                              END IF;
1192                           END IF;
1193 
1194                      END IF;
1195 
1196                      -- PRAKKUM :: 15/03/2011 :: VWPE :: ER 12424063 :: END
1197 
1198                      IF G_DEBUG='Y' THEN
1199                          AHL_DEBUG_PUB.Debug( l_full_name ||': Visit ID =' || P_VISIT_ID);
1200                          AHL_DEBUG_PUB.Debug( l_full_name ||': STAGE Number =' ||  p_x_stages_tbl(i).stage_num);
1201                      END IF;
1202                    -- Added by amagrawa after review comments.
1203                    ELSE -- If validate_status is <> 'S'
1204                      RAISE Fnd_Api.G_EXC_ERROR;
1205                    END IF; -- end check of validate_status
1206          END LOOP;
1207 
1208     ---------------------------End of API Body---------------------------------------
1209 
1210  -- Added cxcheng POST11510--------------
1211    --Now adjust the times derivation for task
1212    AHL_VWP_TIMES_PVT.Calculate_Task_Times(p_api_version => 1.0,
1213                                     p_init_msg_list => Fnd_Api.G_FALSE,
1214                                     p_commit        => Fnd_Api.G_FALSE,
1215                                     p_validation_level      => Fnd_Api.G_VALID_LEVEL_FULL,
1216                                     x_return_status      => l_return_status,
1217                                     x_msg_count          => l_msg_count,
1218                                     x_msg_data           => l_msg_data,
1219                                     p_visit_id            => p_visit_id);
1220     -- Added by amagrawa based on review comments.
1221     IF l_return_Status <>'S'
1222     THEN
1223       IF l_return_Status = FND_API.G_RET_STS_ERROR
1224       THEN
1225           RAISE FND_API.G_EXC_ERROR;
1226       ELSIF l_return_Status = FND_API.G_RET_STS_UNEXP_ERROR
1227       THEN
1228           RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1229       END IF;
1230 
1231     END IF;
1232 
1233         -- SKPATHAK :: Bug #9402556 :: 24-FEB-2010 :: START
1234         OPEN get_past_task_details (p_visit_id);
1235         LOOP
1236           FETCH get_past_task_details INTO l_past_task_start_date, l_stage_id;
1237           EXIT WHEN get_past_task_details%NOTFOUND;
1238             OPEN c_sum_stage_duration (l_stage_id,p_visit_id);
1239             FETCH c_sum_stage_duration INTO l_cum_duration;
1240             CLOSE c_sum_stage_duration;
1241 
1242             -- Cursor to find visit start time
1243             OPEN c_visit (p_visit_id);
1244             FETCH c_visit INTO l_visit_dets;
1245             CLOSE c_visit;
1246             l_visit_start_date := l_visit_dets.START_DATE_TIME;
1247             l_dept_id := l_visit_dets.department_id;
1248 
1249             -- Find the planned start time of the stage in which this task falls
1250             -- PRAKKUM :: 23-FEB-2011 :: Bug 13711800 :: Fix for Operational Visits
1251             l_stage_planned_start_time := Compute_Stage_End_Date(p_visit_id, null, l_visit_start_date, l_dept_id, l_cum_duration);
1252             -- Validate that the any of the tasks does not start before the stage starts
1253             IF l_past_task_start_date < l_stage_planned_start_time THEN
1254               Fnd_Message.SET_NAME('AHL','AHL_VWP_STAGE_DURN_INVLD');
1255               Fnd_Msg_Pub.ADD;
1256               RAISE Fnd_Api.G_EXC_ERROR;
1257             END IF;
1258         END LOOP;
1259         CLOSE get_past_task_details;
1260         -- SKPATHAK :: Bug #9402556 :: 24-FEB-2010 :: END
1261 
1262 
1263           l_visit_end_date:= AHL_VWP_TIMES_PVT.get_visit_end_time(p_visit_id);
1264 
1265           IF l_visit_end_date IS NOT NULL THEN
1266 
1267                 AHL_LTP_REQST_MATRL_PVT.Process_Planned_Materials
1268                   (p_api_version            => p_api_version,
1269                    p_init_msg_list          => Fnd_Api.G_FALSE,
1270                    p_commit                 => Fnd_Api.G_FALSE,
1271                    p_visit_id               => p_visit_id,
1272                    p_visit_task_id          => NULL,
1273                    p_org_id                 => NULL,
1274                    p_start_date             => NULL,
1275                    p_operation_flag         => 'U',
1276 
1277                    x_planned_order_flag     => l_planned_order_flag ,
1278                     x_return_status           => l_return_status,
1279                     x_msg_count               => l_msg_count,
1280                     x_msg_data                => l_msg_data);
1281 
1282                 IF l_msg_count > 0 OR NVL(l_return_status,'x') <> FND_API.G_RET_STS_SUCCESS THEN
1283                         X_msg_count := l_msg_count;
1284                         X_return_status := Fnd_Api.G_RET_STS_ERROR;
1285                         RAISE Fnd_Api.G_EXC_ERROR;
1286                 END IF;
1287 
1288 
1289           END IF;
1290 
1291 
1292      --Standard check to count messages
1293    l_msg_count := Fnd_Msg_Pub.count_msg;
1294 
1295    IF l_msg_count > 0 THEN
1296       X_msg_count := l_msg_count;
1297       X_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
1298       RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
1299    END IF;
1300 
1301    --Standard check for commit
1302    IF Fnd_Api.TO_BOOLEAN(p_commit) THEN
1303       COMMIT;
1304    END IF;
1305 
1306    IF G_DEBUG='Y' THEN
1307        AHL_DEBUG_PUB.Debug( l_full_name ||':End');
1308    END IF;
1309 
1310    -- Check if API is called in debug mode. If yes, disable debug.
1311    IF G_DEBUG='Y' THEN
1312       Ahl_Debug_Pub.disable_debug;
1313    END IF;
1314 EXCEPTION
1315    WHEN Fnd_Api.g_exc_error THEN
1316       ROLLBACK TO Update_Stages;
1317       x_return_status := Fnd_Api.g_ret_sts_error;
1318       Fnd_Msg_Pub.count_and_get(
1319             p_encoded => Fnd_Api.g_false,
1320             p_count   => x_msg_count,
1321             p_data    => x_msg_data
1322       );
1323    WHEN Fnd_Api.g_exc_unexpected_error THEN
1324       ROLLBACK TO Update_Stages;
1325       x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
1326       Fnd_Msg_Pub.count_and_get (
1327             p_encoded => Fnd_Api.g_false,
1328             p_count   => x_msg_count,
1329             p_data    => x_msg_data
1330       );
1331    WHEN OTHERS THEN
1332       ROLLBACK TO Update_Stages;
1333       x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
1334       IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_unexp_error)
1335                 THEN
1336          Fnd_Msg_Pub.add_exc_msg (G_PKG_NAME, l_api_name);
1337       END IF;
1338       Fnd_Msg_Pub.count_and_get (
1339             p_encoded => Fnd_Api.g_false,
1340             p_count   => x_msg_count,
1341             p_data    => x_msg_data
1342       );
1343 END Update_Stages;
1344 
1345 -- PRAKKUM :: 15/03/2011 :: VWPE :: ER 12424063 :: START :: New PROCEDURE
1346 --------------------------------------------------------------------
1347 -- PROCEDURE
1348 --    Delete_Stages
1349 --
1350 -- PURPOSE
1351 --    To delete selected stages from a visit.
1352 --------------------------------------------------------------------
1353 PROCEDURE Delete_Stages (
1354    p_api_version             IN     NUMBER,
1355    p_init_msg_list           IN     VARCHAR2  := Fnd_Api.g_false,
1356    p_commit                  IN     VARCHAR2  := Fnd_Api.g_false,
1357    p_validation_level        IN     NUMBER    := Fnd_Api.g_valid_level_full,
1358    p_module_type             IN     VARCHAR2  := 'JSP',
1359    p_visit_id                IN     NUMBER,
1360    p_x_stages_tbl            IN OUT NOCOPY Visit_Stages_Tbl_Type, -- PRAKKUM :: 15/03/2011 :: VWPE :: ER 12424063
1361    x_return_status           OUT    NOCOPY VARCHAR2,
1362    x_msg_count               OUT    NOCOPY NUMBER,
1363    x_msg_data                OUT    NOCOPY VARCHAR2
1364 )
1365 is
1366 
1367    Cursor c_stage_links(x_id IN NUMBER) IS
1368    SELECT distinct STG_LK.STAGE_LINK_ID, STG_LK.OBJECT_ID, STG_LK.SUBJECT_ID, STG_LK.RELATION_TYPE
1369    FROM
1370    AHL_STAGE_LINKS STG_LK
1371    WHERE ( STG_LK.OBJECT_ID = x_id OR STG_LK.SUBJECT_ID = x_id );
1372 
1373    l_stagelinks_rec c_stage_links%ROWTYPE;
1374 
1375    cursor c_stage_data(c_stage_id number)
1376    IS
1377        select stage_name, duration, object_version_number
1378        from AHL_VWP_STAGES_VL
1379        where stage_id = c_stage_id;
1380 
1381    l_stage_rec  c_stage_data%rowtype;
1382 
1383    -- To find visit related information
1384    CURSOR c_visit (c_visit_id IN NUMBER)
1385    IS
1386         SELECT AHL_VWP_VISITS_PVT.Is_Old_Visit(VISIT_ID) IS_OLD_VISIT
1387         FROM AHL_VISITS_B
1388         WHERE VISIT_ID = c_visit_id;
1389 
1390    l_visit_dets  c_visit%RowType;
1391 
1392    --VWPE 12730539:: PRAKKUM :: 20-JUL-2011 :: start
1393 
1394    CURSOR c_stage_tasks_count (c_visit_id IN NUMBER, c_stage_id IN NUMBER)
1395    IS
1396         select count(1) as TASK_COUNT
1397         from AHL_VISIT_TASKS_VL
1398         where VISIT_ID = c_visit_id
1399         AND TASK_TYPE_CODE <> 'STAGE'
1400         AND STAGE_ID = c_stage_id;
1401 
1402    l_stage_tasks_count NUMBER :=0;
1403 
1404    CURSOR c_stage_task_dets (c_visit_id IN NUMBER, c_stage_id IN NUMBER)
1405    IS
1406         select *
1407         from AHL_VISIT_TASKS_VL
1408         where VISIT_ID = c_visit_id
1409         AND TASK_TYPE_CODE = 'STAGE'
1410         AND STAGE_ID = c_stage_id;
1411 
1412    l_stage_task_dets c_stage_task_dets%RowType;
1413 
1414    --VWPE 12730539:: PRAKKUM :: 20-JUL-2011 :: end
1415 
1416     -- Define local Variables
1417    L_API_VERSION           CONSTANT NUMBER := 1.0;
1418    L_API_NAME              CONSTANT VARCHAR2(30) := 'Delete Stage';
1419    L_FULL_NAME             CONSTANT VARCHAR2(60) := G_PKG_NAME || '.' || L_API_NAME;
1420    L_DEBUG                 CONSTANT VARCHAR2(90) := 'ahl.plsql.'||L_FULL_NAME;
1421 
1422    l_msg_data           VARCHAR2(2000);
1423    l_msg_count          NUMBER;
1424    l_return_status      VARCHAR2(1);
1425 
1426    l_stages_count          NUMBER;
1427 begin
1428 
1429    --------------------- Initialize -----------------------
1430    SAVEPOINT Delete_Stages;
1431 
1432    IF (l_log_procedure >= l_log_current_level) THEN
1433      fnd_log.string(l_log_procedure,L_DEBUG||'.begin','At the start of the PLSQL procedure');
1434    END IF;
1435 
1436    -- Initialize message list if p_init_msg_list is set to TRUE.
1437    IF Fnd_Api.to_boolean(p_init_msg_list)
1438    THEN
1439      Fnd_Msg_Pub.initialize;
1440    END IF;
1441 
1442     --  Initialize API return status to success
1443     x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
1444     l_return_status := x_return_status;
1445 
1446    -- Standard call to check for call compatibility.
1447    IF NOT Fnd_Api.COMPATIBLE_API_CALL(l_api_version,
1448                                       p_api_version,
1449                                       l_api_name,G_PKG_NAME)
1450    THEN
1451        RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
1452    END IF;
1453 
1454    OPEN c_visit (p_visit_id);
1455    FETCH c_visit INTO l_visit_dets;
1456    CLOSE c_visit;
1457 
1458    IF l_visit_dets.IS_OLD_VISIT = 'Y' THEN
1459          Fnd_Message.SET_NAME('AHL','AHL_VWP_OVST_STG_DEL_INV');
1460          Fnd_Msg_Pub.ADD;
1461          RAISE Fnd_Api.G_EXC_ERROR;
1462    END IF;
1463 
1464    l_stages_count := p_x_stages_tbl.count;
1465 
1466    FOR i IN 1..l_stages_count
1467    LOOP
1468 
1469            open c_stage_data(p_x_stages_tbl(i).STAGE_ID);
1470            fetch c_stage_data into l_stage_rec;
1471            if c_stage_data%notfound
1472            then
1473                Fnd_Message.SET_NAME('AHL','AHL_VWP_STAGE_NOT_FOUND_NEW'||p_x_stages_tbl(i).stage_id);
1474                Fnd_Msg_Pub.ADD;
1475                RAISE FND_API.G_EXC_ERROR;
1476            end if;
1477            close c_stage_data;
1478 
1479            -- obj version number validation
1480            IF l_stage_rec.OBJECT_VERSION_NUMBER <> p_x_stages_tbl(i).OBJECT_VERSION_NUMBER
1481            THEN
1482                Fnd_Message.SET_NAME('AHL','AHL_COM_RECORD_MOD');
1483                Fnd_Msg_Pub.ADD;
1484                RAISE FND_API.G_EXC_ERROR;
1485            end if;
1486 
1487            --Set duration to zero, calling UPDATE_AS_STAGE_RULE_DEL next to this statement will not consider duration into account
1488            IF (l_log_statement >= l_log_current_level) THEN
1489               fnd_log.string(l_log_statement,L_DEBUG,p_x_stages_tbl(i).STAGE_ID||' stage id updated');
1490            END IF;
1491            update AHL_VWP_STAGES_B set OBJECT_VERSION_NUMBER=OBJECT_VERSION_NUMBER+1,
1492                                        DURATION = 0,
1493                                        LAST_UPDATE_DATE      = SYSDATE,
1494                                        LAST_UPDATED_BY       = Fnd_Global.USER_ID,
1495                                        LAST_UPDATE_LOGIN     = Fnd_Global.LOGIN_ID
1496                                         where STAGE_ID = p_x_stages_tbl(i).STAGE_ID;
1497 
1498            FOR l_stagelinks_rec IN c_stage_links(p_x_stages_tbl(i).STAGE_ID)
1499            LOOP
1500 
1501                 --Delete stage rule
1502                 delete from AHL_STAGE_LINKS where STAGE_LINK_ID = l_stagelinks_rec.STAGE_LINK_ID;
1503 
1504                 UPDATE_AS_STAGE_RULE_DEL (
1505                                   p_api_version             => p_api_version,
1506                                   p_init_msg_list           => Fnd_Api.g_false,
1507                                   p_commit                  => Fnd_Api.g_false,
1508                                   p_validation_level        => p_validation_level,
1509                                   p_module_type             => p_module_type,
1510 
1511                                   p_object_id               => l_stagelinks_rec.OBJECT_ID,
1512                                   p_subject_id              => l_stagelinks_rec.SUBJECT_ID,
1513                                   p_relation_type           => l_stagelinks_rec.RELATION_TYPE,
1514 
1515                                   p_visit_id                => p_visit_id,
1516 
1517                                   x_return_status           => l_return_status,
1518                                   x_msg_count               => l_msg_count,
1519                                   x_msg_data                => l_msg_data );
1520 
1521                   IF l_msg_count > 0 OR NVL(l_return_status,'x') <> FND_API.G_RET_STS_SUCCESS THEN
1522                      x_msg_count := l_msg_count;
1523                      x_return_status := l_return_status;
1524                      IF l_return_status = Fnd_Api.g_ret_sts_error THEN
1525                        RAISE Fnd_Api.g_exc_error;
1526                      ELSIF l_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
1527                        RAISE Fnd_Api.g_exc_unexpected_error;
1528                      END IF;
1529                   END IF;
1530 
1531            END LOOP;
1532 
1533            -- VWPE 12730539:: PRAKKUM :: 20-JUL-2011 :: start
1534 
1535           OPEN c_stage_tasks_count (p_visit_id, p_x_stages_tbl(i).STAGE_ID);
1536           FETCH c_stage_tasks_count INTO l_stage_tasks_count;
1537           CLOSE c_stage_tasks_count;
1538 
1539           IF (l_log_statement >= l_log_current_level) THEN
1540               fnd_log.string(l_log_statement,L_DEBUG,'l_stage_tasks_count :'||l_stage_tasks_count);
1541           END IF;
1542 
1543           IF l_stage_tasks_count>0 THEN
1544               Fnd_Message.SET_NAME('AHL','AHL_VWP_STG_NO_DEL_HAV_TASKS');
1545               Fnd_Msg_Pub.ADD;
1546               RAISE FND_API.G_EXC_ERROR;
1547           ELSE
1548 
1549               OPEN c_stage_task_dets (p_visit_id, p_x_stages_tbl(i).STAGE_ID);
1550               FETCH c_stage_task_dets INTO l_stage_task_dets;
1551               CLOSE c_stage_task_dets;
1552 
1553               --Remove stage task
1554               /*IF l_stage_task_dets.VISIT_TASK_ID <> NULL THEN
1555                   DELETE FROM AHL_VISIT_TASKS_TL WHERE VISIT_TASK_ID = l_stage_task_dets.VISIT_TASK_ID;
1556                   DELETE FROM AHL_VISIT_TASKS_B WHERE VISIT_TASK_ID = l_stage_task_dets.VISIT_TASK_ID;
1557               END IF;*/
1558               IF (l_log_statement >= l_log_current_level) THEN
1559                  fnd_log.string(l_log_statement,L_DEBUG,'l_stage_task_dets.VISIT_TASK_ID :'||l_stage_task_dets.VISIT_TASK_ID);
1560               END IF;
1561               IF l_stage_task_dets.VISIT_TASK_ID IS NOT NULL THEN
1562 
1563                  IF (l_log_statement >= l_log_current_level) THEN
1564                    fnd_log.string(l_log_statement,L_DEBUG,'Before call to Delete_Task');
1565                  END IF;
1566 
1567                  AHL_VWP_TASKS_PVT.Delete_Task (
1568                    p_api_version             => p_api_version,
1569                    p_init_msg_list           => Fnd_Api.g_false,
1570                    p_commit                  => Fnd_Api.g_false,
1571                    p_module_type             => p_module_type,
1572                    p_Visit_Task_Id           => l_stage_task_dets.VISIT_TASK_ID,
1573                    x_return_status           => l_return_status,
1574                    x_msg_count               => l_msg_count,
1575                    x_msg_data                => l_msg_data );
1576 
1577                  IF (l_log_statement >= l_log_current_level) THEN
1578                     fnd_log.string(l_log_statement,L_DEBUG,'After call to Delete_Task: l_return_status:'||l_return_status||' l_msg_count:'||l_msg_count);
1579                  END IF;
1580 
1581                  IF l_msg_count > 0 OR NVL(l_return_status,'x') <> FND_API.G_RET_STS_SUCCESS THEN
1582                    x_msg_count := l_msg_count;
1583                    x_return_status := l_return_status;
1584                    IF l_return_status = Fnd_Api.g_ret_sts_error THEN
1585                      RAISE Fnd_Api.g_exc_error;
1586                    ELSIF l_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
1587                      RAISE Fnd_Api.g_exc_unexpected_error;
1588                    END IF;
1589                  END IF;
1590               END IF; --l_stage_task_dets.VISIT_TASK_ID
1591 
1592           END IF;
1593 
1594           -- VWPE 12730539:: PRAKKUM :: 20-JUL-2011 :: end
1595 
1596            Ahl_VWP_stages_Pkg.DELETE_ROW ( X_STAGE_ID       => p_x_stages_tbl(i).STAGE_ID);
1597 
1598            -- Remove all stage assciations on tasks
1599            IF (l_log_statement >= l_log_current_level) THEN
1600               fnd_log.string(l_log_statement,L_DEBUG,p_x_stages_tbl(i).STAGE_ID||' stage id updated');
1601            END IF;
1602            update AHL_VISIT_TASKS_B set OBJECT_VERSION_NUMBER=OBJECT_VERSION_NUMBER+1,
1603                                         STAGE_ID = null,
1604                                         LAST_UPDATE_DATE      = SYSDATE,
1605                                         LAST_UPDATED_BY       = Fnd_Global.USER_ID,
1606                                         LAST_UPDATE_LOGIN     = Fnd_Global.LOGIN_ID
1607                                        where STAGE_ID = p_x_stages_tbl(i).STAGE_ID;
1608 
1609           -- Since stage deletion ios allowed only if no tasks associated to it
1610    END LOOP;
1611 
1612      --Standard check to count messages
1613    l_msg_count := Fnd_Msg_Pub.count_msg;
1614    IF l_msg_count > 0 THEN
1615       X_msg_count := l_msg_count;
1616       X_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
1617       RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
1618    END IF;
1619 
1620    --Standard check for commit
1621    IF Fnd_Api.TO_BOOLEAN(p_commit) THEN
1622       COMMIT;
1623    END IF;
1624 
1625    IF (l_log_procedure >= l_log_current_level) THEN
1626      fnd_log.string(l_log_procedure,L_DEBUG||'.end','At the end of the PLSQL procedure');
1627    END IF;
1628 
1629 EXCEPTION
1630    WHEN Fnd_Api.g_exc_error THEN
1631       ROLLBACK TO Delete_Stages;
1632       x_return_status := Fnd_Api.g_ret_sts_error;
1633       Fnd_Msg_Pub.count_and_get(
1634             p_encoded => Fnd_Api.g_false,
1635             p_count   => x_msg_count,
1636             p_data    => x_msg_data
1637       );
1638    WHEN Fnd_Api.g_exc_unexpected_error THEN
1639       ROLLBACK TO Delete_Stages;
1640       x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
1641       Fnd_Msg_Pub.count_and_get (
1642             p_encoded => Fnd_Api.g_false,
1643             p_count   => x_msg_count,
1644             p_data    => x_msg_data
1645       );
1646    WHEN OTHERS THEN
1647       ROLLBACK TO Delete_Stages;
1648       x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
1649       IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_unexp_error)
1650       THEN
1651          Fnd_Msg_Pub.add_exc_msg (G_PKG_NAME, l_api_name);
1652       END IF;
1653       Fnd_Msg_Pub.count_and_get (
1654             p_encoded => Fnd_Api.g_false,
1655             p_count   => x_msg_count,
1656             p_data    => x_msg_data
1657       );
1658 
1659 
1660 end Delete_Stages;
1661 -- PRAKKUM :: 15/03/2011 :: VWPE :: ER 12424063 :: END :: New PROCEDURE
1662 
1663 --------------------------------------------------------------------
1664 -- PROCEDURE
1665 --    Delete_All_Stages
1666 --
1667 -- PURPOSE
1668 --    To delete all stages from a visit.
1669 --    will be called from delete visit and requires only visit_id
1670 --------------------------------------------------------------------
1671 -- PRAKKUM :: 05-MAY-2011 :: VWPE :: This function is earlier Delete_Stages method which was
1672 -- renamed to Delete_All_Stages. Used in case of hard deletion of stages while deletion of a visit.
1673 PROCEDURE Delete_All_Stages (
1674    p_api_version             IN     NUMBER,
1675    p_init_msg_list           IN     VARCHAR2  := Fnd_Api.g_false,
1676    p_commit                  IN     VARCHAR2  := Fnd_Api.g_false,
1677    p_validation_level        IN     NUMBER    := Fnd_Api.g_valid_level_full,
1678    p_module_type             IN     VARCHAR2  := 'JSP',
1679 
1680    p_visit_id                IN     NUMBER,
1681    x_return_status           OUT    NOCOPY VARCHAR2,
1682    x_msg_count               OUT    NOCOPY NUMBER,
1683    x_msg_data                OUT    NOCOPY VARCHAR2
1684 )
1685 is
1686 
1687   -- Define local Variables
1688    L_API_VERSION           CONSTANT NUMBER := 1.0;
1689    L_API_NAME              CONSTANT VARCHAR2(30) := 'Delete Stages';
1690    L_FULL_NAME             CONSTANT VARCHAR2(60) := G_PKG_NAME || '.' || L_API_NAME;
1691    l_msg_count             NUMBER;
1692    l_return_status         VARCHAR2(1);
1693 
1694 begin
1695    --------------------- Initialize -----------------------
1696    SAVEPOINT Delete_All_Stages;
1697 
1698    -- Check if API is called in debug mode. If yes, enable debug.
1699    IF G_DEBUG='Y' THEN
1700      Ahl_Debug_Pub.enable_debug;
1701    END IF;
1702 
1703    -- Debug info.
1704    IF G_DEBUG='Y' THEN
1705        AHL_DEBUG_PUB.Debug( l_full_name ||': Start');
1706    END IF;
1707 
1708    --Initialize API return status to success
1709    x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
1710    l_return_status := x_return_status;
1711 
1712    -- Initialize message list if p_init_msg_list is set to TRUE.
1713    IF Fnd_Api.to_boolean(p_init_msg_list)
1714    THEN
1715      Fnd_Msg_Pub.initialize;
1716    END IF;
1717 
1718     --  Initialize API return status to success
1719     x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
1720 
1721    -- Standard call to check for call compatibility.
1722    IF NOT Fnd_Api.COMPATIBLE_API_CALL(l_api_version,
1723                                       p_api_version,
1724                                       l_api_name,G_PKG_NAME)
1725    THEN
1726        RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
1727    END IF;
1728 
1729    ------------------------Start of API Body------------------------------------
1730    -- directly delete as we need to delete all stages for the visit
1731 
1732             -- VWPE :: ER 12424063 :: PRAKKUM :: 05-MAY-2011 :: START
1733 
1734             DELETE FROM AHL_STAGE_LINKS
1735             WHERE SUBJECT_ID IN (SELECT STAGE_ID FROM AHL_VWP_STAGES_B
1736                       WHERE VISIT_ID = p_visit_id);
1737 
1738             DELETE FROM AHL_STAGE_LINKS
1739             WHERE OBJECT_ID IN (SELECT STAGE_ID FROM AHL_VWP_STAGES_B
1740                       WHERE VISIT_ID = p_visit_id);
1741 
1742             -- VWPE :: ER 12424063 :: PRAKKUM :: 05-MAY-2011 :: END
1743 
1744             delete from AHL_VWP_STAGES_TL
1745             where stage_id
1746                   in (select stage_id from ahl_vwp_stages_b
1747                       where visit_id = p_visit_id);
1748 
1749             delete from AHL_VWP_STAGES_B
1750             where visit_id = p_visit_id;
1751 
1752    -- directly delete as we need to delete all stages for the visit
1753 
1754    ---------------------------End of API Body---------------------------------------
1755      --Standard check to count messages
1756    l_msg_count := Fnd_Msg_Pub.count_msg;
1757    IF l_msg_count > 0 THEN
1758       X_msg_count := l_msg_count;
1759       X_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
1760       RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
1761    END IF;
1762 
1763    --Standard check for commit
1764    IF Fnd_Api.TO_BOOLEAN(p_commit) THEN
1765       COMMIT;
1766    END IF;
1767 
1768    IF G_DEBUG='Y' THEN
1769        AHL_DEBUG_PUB.Debug( l_full_name ||':End');
1770    END IF;
1771 
1772    -- Check if API is called in debug mode. If yes, disable debug.
1773    IF G_DEBUG='Y' THEN
1774       Ahl_Debug_Pub.disable_debug;
1775    END IF;
1776 EXCEPTION
1777    WHEN Fnd_Api.g_exc_error THEN
1778       ROLLBACK TO Delete_All_Stages;
1779       x_return_status := Fnd_Api.g_ret_sts_error;
1780       Fnd_Msg_Pub.count_and_get(
1781             p_encoded => Fnd_Api.g_false,
1782             p_count   => x_msg_count,
1783             p_data    => x_msg_data
1784       );
1785    WHEN Fnd_Api.g_exc_unexpected_error THEN
1786       ROLLBACK TO Delete_All_Stages;
1787       x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
1788       Fnd_Msg_Pub.count_and_get (
1789             p_encoded => Fnd_Api.g_false,
1790             p_count   => x_msg_count,
1791             p_data    => x_msg_data
1792       );
1793    WHEN OTHERS THEN
1794       ROLLBACK TO Delete_All_Stages;
1795       x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
1796       IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_unexp_error)
1797                 THEN
1798          Fnd_Msg_Pub.add_exc_msg (G_PKG_NAME, l_api_name);
1799       END IF;
1800       Fnd_Msg_Pub.count_and_get (
1801             p_encoded => Fnd_Api.g_false,
1802             p_count   => x_msg_count,
1803             p_data    => x_msg_data
1804       );
1805 
1806 
1807 end Delete_All_Stages;
1808 
1809 
1810 
1811 ----------------------------------------------------------------------
1812 -- END: Defining procedures BODY, which are called from UI screen --
1813 ----------------------------------------------------------------------
1814 
1815 
1816 PROCEDURE VALIDATE_STAGES(
1817    p_visit_id                in number,
1818    p_stages_rec              IN     Visit_Stages_Rec_Type,
1819    x_return_status           OUT    NOCOPY VARCHAR2,
1820    x_msg_count               OUT    NOCOPY NUMBER,
1821    x_msg_data                OUT    NOCOPY VARCHAR2
1822 )
1823 IS
1824   -- Define local Variables
1825    L_API_VERSION           CONSTANT NUMBER := 1.0;
1826    L_API_NAME              CONSTANT VARCHAR2(30) := 'Validate Stages';
1827    L_FULL_NAME             CONSTANT VARCHAR2(60) := G_PKG_NAME || '.' || L_API_NAME;
1828 
1829    l_msg_data              VARCHAR2(2000);
1830    l_stage_duration        NUMBER;
1831    l_dummy                 varchar2(1);
1832 
1833 cursor c_stage_name(C_VISIT_ID number, C_STAGE_NAME varchar2, C_STAGE_ID number)
1834   IS
1835        SELECT 'x' FROM AHL_VWP_STAGES_VL
1836                   WHERE VISIT_ID = C_VISIT_ID AND
1837                   STAGE_ID <> C_STAGE_ID AND
1838                   STAGE_NAME = C_STAGE_NAME;
1839 
1840 cursor c_stage_data(c_stage_id number)
1841   IS
1842        select stage_name, duration, object_version_number
1843        from AHL_VWP_STAGES_VL
1844        where stage_id = c_stage_id;
1845 
1846 l_stage_rec  c_stage_data%rowtype;
1847 
1848 cursor c_stage_task(c_stage_id number)
1849 IS
1850        select 'x' from ahl_visit_tasks_b
1851        where stage_id = c_stage_id
1852            and nvl(status_code,'X')<>'DELETED';
1853 
1854 
1855 BEGIN
1856 
1857 /*   --------------------- initialize -----------------------
1858    -- Check if API is called in debug mode. If yes, enable debug.
1859    IF G_DEBUG='Y' THEN
1860                  AHL_DEBUG_PUB.enable_debug;
1861          END IF;
1862 
1863    -- Debug info.
1864     IF Ahl_Debug_Pub.G_FILE_DEBUG THEN
1865        IF G_DEBUG='Y' THEN
1866                  AHL_DEBUG_PUB.debug( l_full_name ||'********************************START******************************* ');
1867          END IF;
1868     END IF;
1869 
1870    IF Fnd_Api.to_boolean (p_init_msg_list) THEN
1871       Fnd_Msg_Pub.initialize;
1872    END IF;
1873 
1874    IF NOT Fnd_Api.compatible_api_call (
1875          l_api_version,
1876          p_api_version,
1877          l_api_name,
1878          G_PKG_NAME
1879    ) THEN
1880       RAISE Fnd_Api.g_exc_unexpected_error;
1881    END IF;
1882 */
1883    x_return_status := Fnd_Api.g_ret_sts_success;
1884 
1885    open c_stage_data(p_stages_rec.stage_id);
1886    fetch c_stage_data into l_stage_rec;
1887    if c_stage_data%notfound
1888    then
1889              Fnd_Message.SET_NAME('AHL','AHL_VWP_STAGE_NOT_FOUND_NEW'||p_stages_rec.stage_id);
1890              Fnd_Msg_Pub.ADD;
1891              x_return_status := Fnd_Api.g_ret_sts_error;
1892              return;
1893    end if;
1894    close c_stage_data;
1895 
1896 
1897    IF (l_log_statement >= l_log_current_level) THEN
1898        fnd_log.string(l_log_statement,
1899                       L_FULL_NAME,
1900                       ' l_stage_rec.OBJECT_VERSION_NUMBER: '||l_stage_rec.OBJECT_VERSION_NUMBER||
1901                       ' p_stages_rec.OBJECT_VERSION_NUMBER: '||p_stages_rec.OBJECT_VERSION_NUMBER);
1902    END IF;
1903    -- obj version number validation
1904    IF l_stage_rec.OBJECT_VERSION_NUMBER <> p_stages_rec.OBJECT_VERSION_NUMBER
1905    THEN
1906              Fnd_Message.SET_NAME('AHL','AHL_COM_RECORD_MOD');
1907              Fnd_Msg_Pub.ADD;
1908              x_return_status := Fnd_Api.g_ret_sts_error;
1909              return;
1910    end if;
1911 
1912    IF p_stages_rec.STAGE_NUM IS NULL
1913    THEN
1914              Fnd_Message.SET_NAME('AHL','AHL_VWP_STAGE_NUM_NULL');
1915              Fnd_Msg_Pub.ADD;
1916              x_return_status := Fnd_Api.g_ret_sts_error;
1917              return;
1918    end if;
1919 
1920 
1921    IF p_stages_rec.stage_name is null or p_stages_rec.stage_name <> l_stage_rec.STAGE_NAME
1922    THEN
1923       -- stage name is mandatory
1924      if p_stages_rec.stage_name is null or p_stages_rec.stage_name = ''
1925      then
1926              Fnd_Message.SET_NAME('AHL','AHL_VWP_STAGE_NAME_NULL');
1927                          FND_MESSAGE.SET_TOKEN('STAGE_NUM',p_stages_rec.STAGE_NUM);
1928              Fnd_Msg_Pub.ADD;
1929              x_return_status := Fnd_Api.g_ret_sts_error;
1930                          return;
1931      else
1932      -- stage name is unique
1933                open c_stage_name(p_visit_id, p_stages_rec.stage_name, p_stages_rec.stage_id);
1934                fetch c_stage_name into l_dummy;
1935                if c_stage_name%found
1936                then
1937                      Fnd_Message.SET_NAME('AHL','AHL_VWP_STAGE_NAME_UNIQUE');
1938                      Fnd_Message.SET_TOKEN('STAGE_NAME', p_stages_rec.stage_name);
1939                      Fnd_Msg_Pub.ADD;
1940                      x_return_status := Fnd_Api.g_ret_sts_error;
1941                     close c_stage_name;
1942                  return;
1943                end if;
1944                close c_stage_name;
1945       END IF;
1946    END IF;
1947 
1948    l_stage_duration := p_stages_rec.DURATION;
1949    IF p_stages_rec.DURATION is null or p_stages_rec.DURATION <> l_stage_rec.DURATION
1950    THEN
1951      -- STAGE DURATION is mandatory
1952      IF p_stages_rec.DURATION IS NULL
1953      then
1954              Fnd_Message.SET_NAME('AHL','AHL_VWP_STAGE_DUR_NULL');
1955              Fnd_Message.SET_TOKEN('STAGE_NAME', p_stages_rec.stage_name);
1956              Fnd_Msg_Pub.ADD;
1957              x_return_status := Fnd_Api.g_ret_sts_error;
1958      -- duration must be positive number
1959      elsif p_stages_rec.duration < 0
1960      then
1961              Fnd_Message.SET_NAME('AHL','AHL_VWP_STAGE_DURN_INV');
1962              Fnd_Message.SET_TOKEN('STAGE_NAME', p_stages_rec.stage_name);
1963              Fnd_Msg_Pub.ADD;
1964              x_return_status := Fnd_Api.g_ret_sts_error;
1965      elsif p_stages_rec.duration = 0
1966      then
1967              open c_stage_task( p_stages_rec.stage_id);
1968              fetch c_stage_task into l_dummy;
1969              if c_stage_task%found
1970              THEN
1971                      Fnd_Message.SET_NAME('AHL','AHL_VWP_STAGE_HAS_TASKS');
1972                      Fnd_Message.SET_TOKEN('STAGE_NAME', p_stages_rec.stage_name);
1973                      Fnd_Msg_Pub.ADD;
1974                      x_return_status := Fnd_Api.g_ret_sts_error;
1975              end if;
1976              close c_stage_task;
1977     elsif p_stages_rec.DURATION > trunc(l_stage_duration,0)
1978     THEN
1979              Fnd_Message.SET_NAME('AHL','AHL_VWP_STAGE_DUR_NON_INT');
1980              Fnd_Msg_Pub.ADD;
1981              x_return_status := Fnd_Api.g_ret_sts_error;
1982 
1983     end if;
1984 
1985    END IF;
1986 
1987 
1988 END VALIDATE_STAGES;
1989 
1990 
1991 --------------------------------------------------------------------
1992 -- FUNCTION
1993 --     Get_Stage_Id
1994 --
1995 --------------------------------------------------------------------
1996 FUNCTION  Get_Stage_Id
1997 RETURN NUMBER
1998 IS
1999 
2000  -- To find the next id value from visit sequence
2001    CURSOR c_seq IS
2002       SELECT Ahl_vwp_stages_B_S.NEXTVAL
2003       FROM   dual;
2004 
2005  -- To find whether id already exists
2006    CURSOR c_id_exists (x_id IN NUMBER) IS
2007    SELECT 1
2008    FROM   Ahl_vwp_stages_b
2009    WHERE  stage_id = x_id;
2010 
2011     x_stage_Id NUMBER;
2012     l_dummy NUMBER;
2013 BEGIN
2014   -- Modified by amagrawa according to review comments.
2015             -- If the ID is not passed into the API, then
2016             -- grab a value from the sequence.
2017              LOOP
2018                   OPEN c_seq;
2019                   FETCH c_seq INTO x_stage_Id;
2020                   CLOSE c_seq;
2021              --
2022              -- Check to be sure that the sequence does not exist.
2023                       OPEN c_id_exists (x_stage_Id);
2024                       FETCH c_id_exists INTO l_dummy;
2025               -- If Sequence does not exist exit from loop
2026                         IF c_id_exists%NOTFOUND
2027                         THEN
2028                              close c_id_exists;
2029                              EXIT;
2030                         END IF;
2031                                 CLOSE c_id_exists;
2032                          END LOOP;
2033 
2034     RETURN x_stage_Id ;
2035 
2036 END Get_Stage_Id;
2037 
2038 
2039 --VWP ER-12424063:: tchimira :: 15-APR-2011 ::- The logic of this API is being changed completely
2040 -- Prior to VWPE, validation of stage updates is done based on stage number.
2041 -- Since now, stage numbers has no constriants, instead of stage number,
2042 -- consider stage rules for validation
2043 
2044 PROCEDURE VALIDATE_STAGE_UPDATES(
2045     p_api_version           IN            NUMBER,
2046     p_init_msg_list         IN            VARCHAR2  := Fnd_Api.G_FALSE,
2047     p_commit                IN            VARCHAR2  := Fnd_Api.G_FALSE,
2048     p_validation_level      IN            NUMBER    := Fnd_Api.G_VALID_LEVEL_FULL,
2049     p_default               IN            VARCHAR2  := Fnd_Api.G_TRUE,
2050     p_module_type           IN            VARCHAR2  := NULL,
2051 
2052     p_visit_id              IN            NUMBER,
2053     p_visit_task_id         IN            NUMBER,
2054     p_stage_name            IN            VARCHAR2   := NULL, -- defaulted as u may pass id or num
2055 
2056     x_stage_id              OUT NOCOPY  NUMBER            ,
2057     x_return_status         OUT NOCOPY    VARCHAR2,
2058     x_msg_count             OUT NOCOPY    NUMBER,
2059     x_msg_data              OUT NOCOPY    VARCHAR2
2060 )
2061 is
2062 
2063    L_STAGE_ID      NUMBER;
2064    L_STAGE_NUM      NUMBER;
2065 
2066    l_task_stage_id NUMBER;
2067    L_API_VERSION           CONSTANT NUMBER := 1.0;
2068    L_API_NAME              CONSTANT VARCHAR2(30) := 'VALIDATE_STAGE_UPDATES';
2069    L_DEBUG_KEY   CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
2070    L_FULL_NAME             CONSTANT VARCHAR2(60) := G_PKG_NAME || '.' || L_API_NAME;
2071 
2072 
2073 -- VWP ER-12424063:: tchimira :: 1-JUN-2011:: start
2074 -- For the passed task id, get all its successive parent tasks
2075 CURSOR  c_get_parent_tasks(c_task_id IN NUMBER)
2076 IS
2077 select link.parent_task_id from ahl_task_links link
2078 start with link.visit_task_id = c_task_id
2079 connect by prior link.parent_task_id = link.visit_task_id;
2080 
2081 -- For the passed task id, get all its successive child tasks
2082 CURSOR  c_get_child_tasks(c_task_id IN NUMBER)
2083 IS
2084 select link.visit_task_id from ahl_task_links link
2085 start with link.parent_task_id = c_task_id
2086 connect by prior link.visit_task_id = link.parent_task_id;
2087 
2088 --Get stage id for a given task
2089 CURSOR  c_get_task_stage_id(c_task_id IN NUMBER)
2090 IS
2091 SELECT stage_id FROM ahl_visit_tasks_b
2092 WHERE visit_task_id = c_task_id;
2093 
2094 
2095 -- For the passed stage id, get all its successive parent stages
2096 CURSOR  c_get_parent_stages(c_stage_id IN NUMBER)
2097 IS
2098 select link.subject_id from ahl_stage_links link
2099 start with link.object_id = c_stage_id
2100 connect by prior link.subject_id = link.object_id;
2101 
2102 -- For the passed stage id, get all its successive child stages
2103 CURSOR  c_get_child_stages(c_stage_id IN NUMBER)
2104 IS
2105 select link.object_id from ahl_stage_links link
2106 start with link.subject_id = c_stage_id
2107 connect by prior link.object_id = link.subject_id;
2108 
2109 --Get stage id for a given task
2110 CURSOR  c_get_stage_id(c_stage_name IN VARCHAR2, c_visit_id IN NUMBER)
2111 IS
2112 SELECT stage_id,stage_num FROM ahl_vwp_stages_vl
2113 WHERE stage_name = c_stage_name
2114 AND visit_id = c_visit_id;
2115 -- VWP ER-12424063:: tchimira :: 1-JUN-2011:: end
2116 
2117 begin
2118 
2119    --------------------- initialize -----------------------
2120    -- Check if API is called in debug mode. If yes, enable debug.
2121    IF G_DEBUG='Y' THEN
2122                  AHL_DEBUG_PUB.enable_debug;
2123    END IF;
2124 
2125    -- Debug info.
2126    IF Ahl_Debug_Pub.G_FILE_DEBUG THEN
2127       IF G_DEBUG='Y' THEN
2128          AHL_DEBUG_PUB.debug( l_full_name ||'********************************START******************************* ');
2129       END IF;
2130    END IF;
2131 
2132    -- Initialize message list if p_init_msg_list is set to TRUE.
2133    IF Fnd_Api.to_boolean (p_init_msg_list) THEN
2134       Fnd_Msg_Pub.initialize;
2135    END IF;
2136 
2137    -- Standard call to check for call compatibility.
2138    IF NOT Fnd_Api.compatible_api_call (
2139          l_api_version,
2140          p_api_version,
2141          l_api_name,
2142          G_PKG_NAME
2143    ) THEN
2144       RAISE Fnd_Api.g_exc_unexpected_error;
2145    END IF;
2146 
2147    --  Initialize API return status to success
2148    x_return_status := Fnd_Api.g_ret_sts_success;
2149 
2150 
2151  -- VWP ER-12424063:: tchimira :: 1-JUN-2011:: start
2152  OPEN c_get_stage_id(p_stage_name, p_visit_id);
2153  FETCH c_get_stage_id INTO l_stage_id, l_stage_num;
2154  IF c_get_stage_id%NOTFOUND THEN
2155    Fnd_Message.SET_NAME('AHL','AHL_VWP_STAGE_NOT_FOUND');
2156    Fnd_Msg_Pub.ADD;
2157    x_return_status := Fnd_Api.g_ret_sts_error;
2158  END IF;
2159  CLOSE c_get_stage_id;
2160 
2161  -- For the passed visit task id, loop through all of its successive parents
2162  FOR parent_task_rec IN c_get_parent_tasks(p_visit_task_id) LOOP
2163    OPEN c_get_task_stage_id(parent_task_rec.parent_task_id);
2164    FETCH c_get_task_stage_id INTO l_task_stage_id;
2165    CLOSE c_get_task_stage_id;
2166    IF (l_log_statement >= l_log_current_level) THEN
2167        fnd_log.string(l_log_statement,
2168                       L_DEBUG_KEY,
2169                       'In the for loop of c_get_parent_tasks and l_task_stage_id is: '||l_task_stage_id);
2170    END IF;
2171    -- For the passed stage id, loop through all of its successive children
2172    FOR child_stage_rec IN c_get_child_stages(l_stage_id) LOOP
2173     IF (l_log_statement >= l_log_current_level) THEN
2174            fnd_log.string(l_log_statement,
2175                           L_DEBUG_KEY,
2176                            'In the for loop of c_get_child_stages and child_stage_rec.object_id is: '||child_stage_rec.object_id);
2177     END IF;
2178     -- If any of the successive parents of passed task id falls in any of the successive children
2179     -- of the passed stage id, then throw an error
2180     IF l_task_stage_id = child_stage_rec.object_id THEN
2181       -- throw error
2182       Fnd_Message.SET_NAME('AHL','AHL_VWP_ST_NUM_INV');
2183       --Fnd_Message.SET_TOKEN('STAGE_NUM', l_stage_NUM);
2184       Fnd_Msg_Pub.ADD;
2185       x_return_status := Fnd_Api.g_ret_sts_error;
2186     END IF;
2187    END LOOP;
2188    l_task_stage_id := null;
2189  END LOOP;
2190 
2191  -- For the passed visit task id, loop through all of its successive children
2192  FOR child_task_rec IN c_get_child_tasks(p_visit_task_id) LOOP
2193    OPEN c_get_task_stage_id(child_task_rec.visit_task_id);
2194    FETCH c_get_task_stage_id INTO l_task_stage_id;
2195    CLOSE c_get_task_stage_id;
2196    IF (l_log_statement >= l_log_current_level) THEN
2197           fnd_log.string(l_log_statement,
2198                          L_DEBUG_KEY,
2199                          'In the for loop of c_get_child_tasks and l_task_stage_id is: '||l_task_stage_id);
2200    END IF;
2201 
2202    -- For the passed stage id, loop through all of its successive parents
2203    FOR parent_stage_rec IN c_get_parent_stages(l_stage_id) LOOP
2204     IF (l_log_statement >= l_log_current_level) THEN
2205            fnd_log.string(l_log_statement,
2206                           L_DEBUG_KEY,
2207                           'In the for loop of c_get_parent_stages and parent_stage_rec.subject_id is: '||parent_stage_rec.subject_id);
2208     END IF;
2209     -- If any of the successive children of passed task id falls in any of the successive parent
2210     -- of the passed stage id, then throw an error
2211     IF l_task_stage_id = parent_stage_rec.subject_id THEN
2212       -- throw error
2213       Fnd_Message.SET_NAME('AHL','AHL_VWP_ST_NUM_INV');
2214       --Fnd_Message.SET_TOKEN('STAGE_NUM', l_stage_NUM);
2215       Fnd_Msg_Pub.ADD;
2216       x_return_status := Fnd_Api.g_ret_sts_error;
2217     END IF;
2218    END LOOP;
2219    l_task_stage_id := null;
2220  END LOOP;
2221 
2222  -- SET OUT PARAM
2223  IF (l_log_statement >= l_log_current_level) THEN
2224            fnd_log.string(l_log_statement,
2225                           L_DEBUG_KEY,
2226                            'Before setting stage id as out param: '||l_stage_id);
2227  END IF;
2228  x_stage_id := l_stage_id;
2229 -- VWP ER-12424063:: tchimira :: 1-JUN-2011:: end
2230 
2231 end VALIDATE_STAGE_UPDATES;
2232 
2233 
2234 procedure default_missing_attributes(
2235    p_x_stages_rec              IN OUT NOCOPY     Visit_Stages_Rec_Type
2236 )
2237 is
2238 cursor C_get_stage_data(c_stage_id number)
2239 is
2240         select * from ahl_vwp_stages_vl where stage_id = c_stage_id;
2241 l_stage_REC   C_get_stage_data%rowtype;
2242 
2243 begin
2244    OPEN C_get_stage_data(p_x_stages_rec.STAGE_ID);
2245    FETCH C_get_stage_data INTO L_STAGE_REC;
2246    CLOSE C_get_stage_data;
2247 
2248 
2249    IF NVL(p_x_stages_rec.STAGE_NUM, 99) = FND_API.G_MISS_NUM
2250    THEN
2251         p_x_stages_rec.STAGE_NUM := L_stage_rec.STAGE_NUM;
2252    END IF;
2253 
2254    IF NVL(p_x_stages_rec.STAGE_NAME, 'A') = FND_API.G_MISS_CHAR
2255    THEN
2256         p_x_stages_rec.STAGE_NAME := L_stage_rec.STAGE_NAME;
2257    END IF;
2258 
2259    IF NVL(p_x_stages_rec.DURATION, 99) = FND_API.G_MISS_NUM
2260    THEN
2261         p_x_stages_rec.DURATION := L_stage_rec.DURATION;
2262    END IF;
2263 
2264    IF p_x_stages_rec.Stage_Planned_Start_Time = FND_API.G_MISS_DATE THEN
2265         p_x_stages_rec.Stage_Planned_Start_Time := L_stage_rec.planned_start_date;--VWPE :: ER 12424063 :: PRAKKUM :: 05-MAY-2011
2266    END IF;
2267 
2268    IF p_x_stages_rec.Stage_Planned_End_Time = FND_API.G_MISS_DATE THEN
2269         p_x_stages_rec.Stage_Planned_End_Time := L_stage_rec.planned_end_date;--VWPE :: ER 12424063 :: PRAKKUM :: 05-MAY-2011
2270    END IF;
2271 
2272 end default_missing_attributes;
2273 
2274 --------------------------------------------------------------------
2275 -- PROCEDURE
2276 --    Check_Stage_Name_Or_Id
2277 --
2278 -- PURPOSE
2279 --    Converts Stage Name to Stage ID
2280 --------------------------------------------------------------------
2281 PROCEDURE Check_Stage_Name_Or_Id
2282     (p_visit_id          IN NUMBER,
2283      p_Stage_Name         IN VARCHAR2,
2284      x_Stage_id          OUT NOCOPY NUMBER,
2285      x_return_status     OUT NOCOPY VARCHAR2,
2286      x_error_msg_code    OUT NOCOPY VARCHAR2
2287      )
2288 IS
2289   -- Define local variables
2290    L_API_NAME             CONSTANT VARCHAR2(30) := 'Check_Stage_Name_Or_Id';
2291    L_FULL_NAME            CONSTANT VARCHAR2(60) := G_PKG_NAME || '.' || L_API_NAME;
2292 BEGIN
2293     IF (p_Stage_Name IS NOT NULL) THEN
2294           SELECT Stage_Id INTO x_Stage_id
2295             FROM AHL_VWP_STAGES_VL
2296           WHERE Visit_Id  = p_visit_id AND Stage_Name = p_Stage_Name;
2297     ELSE
2298          x_Stage_id := null;
2299     END IF;
2300 
2301       x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
2302       -- Debug info.
2303            IF G_DEBUG='Y' THEN
2304           Ahl_Debug_Pub.debug( 'API Return Status = ' ||L_FULL_NAME||':'|| x_return_status);
2305            END IF;
2306 
2307 EXCEPTION
2308     WHEN NO_DATA_FOUND THEN
2309          x_return_status:= Fnd_Api.G_RET_STS_ERROR;
2310          x_error_msg_code:= 'AHL_VWP_STAGE_NOT_EXISTS';
2311     WHEN TOO_MANY_ROWS THEN
2312          x_return_status:= Fnd_Api.G_RET_STS_ERROR;
2313          x_error_msg_code:= 'AHL_VWP_STAGE_NOT_EXISTS';
2314     WHEN OTHERS THEN
2315          x_return_status:= Fnd_Api.G_RET_STS_UNEXP_ERROR;
2316 RAISE;
2317 END Check_Stage_Name_Or_Id;
2318 
2319 --------------------------------------------------------------------
2320 -- PROCEDURE
2321 --    Validate_bef_Times_Derive
2322 --
2323 -- PURPOSE
2324 --    To validate visit and tasks before deriving their start and end datetimes
2325 --------------------------------------------------------------------
2326 PROCEDURE Validate_bef_Times_Derive
2327  ( p_visit_id         IN        NUMBER,
2328    x_valid_flag       OUT NOCOPY VARCHAR2,
2329    x_return_status    OUT NOCOPY VARCHAR2,
2330    x_error_msg_code   OUT NOCOPY VARCHAR2)
2331 IS
2332   -- Define local variables
2333    L_API_NAME             CONSTANT VARCHAR2(30) := 'Validate_bef_Times_Derive';
2334    L_FULL_NAME            CONSTANT VARCHAR2(60) := G_PKG_NAME || '.' || L_API_NAME;
2335 
2336    l_dept                 NUMBER;
2337    l_count                NUMBER:=0;
2338    l_dummy                NUMBER;
2339  --  i                      NUMBER;
2340 --   x                      NUMBER;
2341 
2342  -- Define local cursors
2343  -- To find out all visit/template details
2344     CURSOR c_visit(x_id IN NUMBER) IS
2345       SELECT * FROM AHL_VISITS_VL
2346       WHERE VISIT_ID = x_id;
2347     c_visit_rec  c_visit%ROWTYPE;
2348 
2349 -- To find whether dept shifts exist for the dept
2350    CURSOR c_dept (x_id IN NUMBER) IS
2351     SELECT COUNT(*) FROM AHL_DEPARTMENT_SHIFTS
2352     WHERE DEPARTMENT_ID = x_id;
2353 
2354 -- Commented by amagrawa based on review comments.
2355 -- To find all departments from a visit's tasks table
2356 /*   CURSOR c_task (x_id IN NUMBER) IS
2357     SELECT DEPARTMENT_ID FROM AHL_VISIT_TASKS_B WHERE VISIT_ID = x_id
2358     AND NVL(STATUS_CODE,'X') <> 'DELETED' AND DEPARTMENT_ID IS NOT NULL;
2359     c_task_rec c_task%ROWTYPE;
2360 */
2361 -- To find only those routes which are there in tasks table but not in route table for a visit
2362 -- Changed by amagrawa to improve performance.
2363    CURSOR c_route_chk(x_id IN NUMBER) IS
2364     SELECT DISTINCT(MR_Route_ID) "ROUTE_ID" FROM AHL_VISIT_TASKS_B TSK
2365     WHERE VISIT_ID = x_id AND MR_Route_ID IS NOT NULL
2366     AND NOT EXISTS
2367     (SELECT DISTINCT(MR_Route_ID) "ROUTE_ID" FROM AHL_MR_ROUTES_V MR
2368           where MR.mr_route_id =TSK.mr_route_id) and rownum=1;
2369 
2370     c_route_chk_rec c_route_chk%ROWTYPE;
2371 
2372 -- Added by amagrawa based on review comments
2373 -- To find if the all visit tasks dept has department shifts defined
2374    CURSOR c_task_dep_exist (x_visit_id IN NUMBER) IS
2375      SELECT 1 from dual WHERE exists(
2376             SELECT visit_task_id from ahl_visit_tasks_b
2377             Where department_id is not null
2378                 and visit_id =  x_visit_id
2379                 and nvl(status_code,'X')<>'DELETED'
2380                 and department_id not in (select department_id from ahl_department_shifts)
2381                 );
2382 
2383 
2384 
2385 BEGIN
2386    --  Initialize API return status to success
2387     x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
2388     x_valid_flag := 'Y';
2389    OPEN c_Visit(p_visit_id);
2390    FETCH c_visit INTO c_visit_rec;
2391    CLOSE c_Visit;
2392 
2393    IF(c_visit_rec.START_DATE_TIME IS NULL OR c_visit_rec.START_DATE_TIME = Fnd_Api.g_miss_date)
2394     THEN
2395        Fnd_Message.SET_NAME('AHL','AHL_VWP_VST_NO_ST_DATE');
2396        Fnd_Msg_Pub.ADD;
2397        x_valid_flag := 'N';
2398     END IF;
2399 
2400     IF(c_visit_rec.DEPARTMENT_ID IS NULL OR c_visit_rec.DEPARTMENT_ID = Fnd_Api.g_miss_num)
2401     THEN
2402        Fnd_Message.SET_NAME('AHL','AHL_VWP_VST_NO_DEP');
2403        Fnd_Msg_Pub.ADD;
2404        x_valid_flag := 'N';
2405     ELSE
2406 -- Modified by amagrawa based on review comments
2407      -- To find if the visit dept has department shifts defined
2408       OPEN c_dept (c_visit_rec.department_id);
2409       FETCH c_dept INTO l_count;
2410       CLOSE c_dept;
2411         IF l_count=0
2412               THEN
2413                    Fnd_Message.SET_NAME('AHL','AHL_VWP_VNO_DEP_SFT');
2414                        Fnd_Msg_Pub.ADD;
2415                        x_valid_flag := 'N';
2416              END IF;
2417     END IF;
2418 
2419 -- Added by amagrawa based on review comments
2420     open c_task_dep_exist(p_visit_id);
2421     FETCH c_task_dep_exist into l_dummy;
2422     IF(c_task_dep_exist%FOUND)
2423     THEN
2424        Fnd_Message.SET_NAME('AHL','AHL_VWP_TNO_DEP_SFT');
2425        Fnd_Msg_Pub.ADD;
2426        x_valid_flag := 'N';
2427     END IF;
2428         CLOSE c_task_dep_exist;
2429 
2430 -- To check routes present in visits exists in MRRoutes table
2431 -- Modified by amagrawa based on review comments
2432     OPEN c_route_chk (p_visit_id);
2433     FETCH c_route_chk INTO c_route_chk_rec;
2434     IF c_route_chk%FOUND THEN
2435       Fnd_Message.SET_NAME('AHL','AHL_VWP_TSK_MR_NOT_VAL');
2436        Fnd_Msg_Pub.ADD;
2437        x_valid_flag := 'N';
2438     END IF;
2439     CLOSE c_route_chk;
2440 
2441 END Validate_bef_Times_Derive;
2442 
2443 --VWPE ER-12424063:: tchimira :: 16-FEB -2011 :: start
2444 -----------------------------------------------------------------------------------------
2445 -- PROCEDURE
2446 --    NON_CYCLIC_STAGE_REL
2447 --
2448 -- PURPOSE
2449 --    To check all the stage rules if any cyclic relation exists across stages of a visit
2450 -----------------------------------------------------------------------------------------
2451 
2452 PROCEDURE  NON_CYCLIC_STAGE_REL
2453 (
2454  P_CHILD_STAGE_ID               IN NUMBER,
2455  P_PARENT_STAGE_NUMBER          IN VARCHAR2,
2456  x_return_status                OUT NOCOPY VARCHAR2,
2457  x_msg_count                    OUT NOCOPY NUMBER,
2458  x_msg_data                     OUT NOCOPY VARCHAR2
2459 )
2460 AS
2461 
2462 l_cyclic_loop           EXCEPTION;
2463 PRAGMA                  EXCEPTION_INIT(l_cyclic_loop,-1436);
2464 l_counter               NUMBER;
2465 
2466 BEGIN
2467         x_return_status:=FND_API.G_RET_STS_SUCCESS;
2468 
2469         SELECT COUNT(*) INTO l_counter
2470         FROM  AHL_STAGE_LINKS A
2471         START WITH OBJECT_ID = P_CHILD_STAGE_ID
2472         CONNECT BY PRIOR OBJECT_ID =SUBJECT_ID;
2473 EXCEPTION
2474  WHEN l_cyclic_loop  THEN
2475     FND_MESSAGE.SET_NAME('AHL','AHL_VWP_VISIT_STG_ID_CYC');
2476     FND_MESSAGE.SET_TOKEN('STAGE_NUMBER',P_PARENT_STAGE_NUMBER);
2477     FND_MSG_PUB.ADD;
2478     x_return_status := FND_API.G_RET_STS_ERROR;
2479 
2480  WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
2481     X_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2482     FND_MSG_PUB.count_and_get( p_encoded => FND_API.G_FALSE,
2483                                p_count => x_msg_count,
2484                                p_data  => x_msg_data);
2485 
2486  WHEN FND_API.G_EXC_ERROR THEN
2487     X_return_status := FND_API.G_RET_STS_ERROR;
2488     FND_MSG_PUB.count_and_get( p_encoded => FND_API.G_FALSE,
2489                                p_count => x_msg_count,
2490                                p_data  => X_msg_data);
2491  WHEN OTHERS THEN
2492     X_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2493     IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
2494     THEN
2495        fnd_msg_pub.add_exc_msg(p_pkg_name        => G_PKG_NAME,
2496                                p_procedure_name  => 'NON_CYCLIC_STAGE_REL',
2497                                p_error_text      => SUBSTR(SQLERRM,1,240));
2498     END IF;
2499     FND_MSG_PUB.count_and_get( p_encoded => FND_API.G_FALSE,
2500                                p_count => x_msg_count,
2501                                p_data  => X_msg_data);
2502 END;
2503 
2504 
2505 --------------------------------------------------------------------
2506 -- PROCEDURE
2507 --    VALIDATE_STAGE_RULES
2508 --
2509 -- PURPOSE
2510 --    To do the following validations for all the stage rules:
2511 --     1. Duplicacy of stage rules
2512 --     2. A stage cannot have more than one predecessor
2513 --     3. Cyclic relations across stages
2514 --     4. Stage rules do not violate already defined task rules
2515 --------------------------------------------------------------------
2516 
2517 PROCEDURE VALIDATE_STAGE_RULES(
2518    p_stage_rule_rec          IN     Stage_Rule_Rec_Type,
2519    x_return_status           OUT    NOCOPY VARCHAR2,
2520    x_msg_count               OUT    NOCOPY NUMBER,
2521    x_msg_data                OUT    NOCOPY VARCHAR2
2522 )
2523 IS
2524   -- Define local Variables
2525   L_API_NAME              CONSTANT VARCHAR2(30) := 'Validate Stage Rules';
2526   L_DEBUG_KEY   CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
2527   L_FULL_NAME          CONSTANT VARCHAR2(60) := G_PKG_NAME || '.' || L_API_NAME;
2528 
2529   l_parent_stage_num   NUMBER;
2530   l_prev_stage_num     NUMBER;
2531   l_child_stage_num    NUMBER;
2532   l_object_id          NUMBER;
2533   l_return_Status      VARCHAR2(1);
2534   l_msg_count          NUMBER;
2535   l_msg_data           VARCHAR2(2000);
2536   l_dummy              VARCHAR2(1);
2537   l_duplicated_count   NUMBER;
2538   l_invalid_rules_count  NUMBER; --PRAKKUM :: VWPE :: ER 12424063 ::  31-MAY-2011 :: to find invalid stage rules
2539   l_val_dummy          VARCHAR2(1);
2540 
2541   --Cursor to fetch the stage number for the passed stage ID
2542   CURSOR c_stage_number(p_stage_id IN NUMBER)
2543    IS
2544    SELECT STAGE_NUM
2545    FROM AHL_VWP_STAGES_B
2546    WHERE stage_id = p_stage_id;
2547 
2548   --Cursor to fetch the previous stage number for the passed stage ID
2549   CURSOR c_prev_stage_num(p_stage_id IN NUMBER)
2550    IS
2551    SELECT PREV_STAGE_NUM
2552    FROM AHL_VWP_STAGES_B
2553    WHERE stage_id = p_stage_id;
2554 
2555   --Cursor to get all the stage rules of the stage in a visit
2556   CURSOR c_get_stage_rules (p_stage_id IN NUMBER)
2557    IS
2558    SELECT link.stage_link_id, link.relation_type, link.object_id, link.subject_id
2559    FROM ahl_stage_links link, ahl_vwp_stages_b stage1, ahl_vwp_stages_b stage2
2560    WHERE stage1.stage_id = p_stage_id
2561    AND stage1.visit_id = stage2.visit_id
2562    AND link.subject_id = stage2.stage_id;
2563 
2564   --Cursor to validate whether task rules does not violate stage rules
2565   CURSOR c_validate_stage_tasks (p_subject_id IN NUMBER, p_object_id IN NUMBER) IS
2566    SELECT 'X'
2567     FROM ahl_task_links
2568     WHERE parent_task_id IN (SELECT visit_task_id FROM ahl_visit_tasks_b WHERE stage_id = p_object_id)
2569     START WITH visit_task_id IN (SELECT visit_task_id FROM ahl_visit_tasks_b WHERE stage_id = p_subject_id)
2570     CONNECT BY PRIOR parent_task_id = visit_task_id;
2571 
2572   --Cursor to get stage task
2573   CURSOR c_get_stage_tasks (p_stage_id IN NUMBER) IS
2574    SELECT 'X'
2575    FROM ahl_visit_tasks_b
2576    WHERE stage_id = p_stage_id
2577    AND task_type_code <> 'STAGE';
2578 
2579   -- Get the passed stage parent id and all its successive parent stages
2580   CURSOR  c_get_parent_stages(p_subject_id IN NUMBER, p_object_id IN NUMBER)
2581   IS
2582    SELECT link.subject_id FROM ahl_stage_links link
2583    START WITH link.object_id = p_object_id
2584    AND link.subject_id = p_subject_id
2585    CONNECT BY PRIOR link.subject_id = link.object_id;
2586 
2587   -- Get the passed stage child id and all its successive child stages
2588   CURSOR  c_get_child_stages(p_subject_id IN NUMBER, p_object_id IN NUMBER)
2589   IS
2590    SELECT link.object_id FROM ahl_stage_links link
2591    START WITH link.subject_id = p_subject_id
2592    AND link.object_id = p_object_id
2593    CONNECT BY PRIOR link.object_id = link.subject_id;
2594 
2595   -- Cursor to get all the parallel stage rules
2596  CURSOR c_get_parallel_stage_rules1 (c_stage_id IN NUMBER) IS
2597    SELECT link.stage_link_id, link.object_id, link.subject_id, stage1.visit_id
2598    FROM ahl_stage_links link, ahl_vwp_stages_b stage1, ahl_vwp_stages_b stage2
2599    WHERE stage1.stage_id = c_stage_id
2600    AND stage1.visit_id = stage2.visit_id
2601    AND link.subject_id = stage2.stage_id
2602    AND link.relation_type = 'PARALLEL';
2603 
2604  CURSOR c_get_parallel_stage_rules2 (c_stage_id IN NUMBER, c_link_id IN NUMBER) IS
2605    SELECT link.stage_link_id, link.object_id, link.subject_id
2606    FROM ahl_stage_links link, ahl_vwp_stages_b stage1, ahl_vwp_stages_b stage2
2607    WHERE stage1.stage_id = c_stage_id
2608    AND stage1.visit_id = stage2.visit_id
2609    AND link.subject_id = stage2.stage_id
2610    AND link.relation_type = 'PARALLEL'
2611    AND link.stage_link_id <> c_link_id;
2612 
2613   --PRAKKUM :: VWPE :: ER 12424063 ::  15-APR-2011 :: to find duplicate rules
2614   --Cursor to find duplicate rules
2615   CURSOR c_get_stage_is_dup (p_sub_id IN NUMBER,p_obj_id IN NUMBER)
2616    IS
2617    SELECT count(1) -- PRAKKUM :: 06/03/2011 :: VWPE :: ER 12424063 :: Fixed issue in getting parallel stage ids for a stage
2618    FROM ahl_stage_links link
2619    WHERE ( link.subject_id = p_sub_id AND link.object_id = p_obj_id ) OR ( link.subject_id = p_obj_id AND link.object_id = p_sub_id ) ;
2620 
2621   --PRAKKUM :: VWPE :: ER 12424063 ::  31-MAY-2011 ::
2622   --Cursor to validate whether all rules are over planning stages or not
2623   CURSOR c_get_invalid_rule_stages (p_sub_id IN NUMBER,p_obj_id IN NUMBER)
2624    IS
2625    select distinct STAGE_NUM from
2626    ahl_vwp_stages_b where ( stage_id = p_sub_id OR stage_id = p_obj_id) and stage_status_code<>'PLANNING';
2627 
2628    l_invalid_stage_rules_rec c_get_invalid_rule_stages%RowType;
2629 
2630 
2631 BEGIN
2632 
2633   --  Initialize API return status to success
2634   x_return_status := Fnd_Api.g_ret_sts_success;
2635 
2636   --PRAKKUM :: VWPE :: ER 12424063 ::  15-APR-2011 :: to find duplicate rules :: START
2637   l_duplicated_count :=0; --Initialization
2638   IF (l_log_statement >= l_log_current_level) THEN
2639       fnd_log.string(l_log_statement,L_DEBUG_KEY,':Sub and Obj Id is : '||p_stage_rule_rec.SUBJECT_STAGE_ID||' and ' || p_stage_rule_rec.OBJECT_STAGE_ID||' and l_duplicated_count is :' ||l_duplicated_count );
2640   END IF;
2641 
2642   OPEN c_get_stage_is_dup (p_stage_rule_rec.SUBJECT_STAGE_ID,p_stage_rule_rec.OBJECT_STAGE_ID);
2643   FETCH c_get_stage_is_dup INTO l_duplicated_count;
2644   CLOSE c_get_stage_is_dup;
2645 
2646   IF (l_log_statement >= l_log_current_level) THEN
2647       fnd_log.string(l_log_statement,L_DEBUG_KEY,': l_duplicated_count is :' ||l_duplicated_count );
2648   END IF;
2649 
2650   IF l_duplicated_count IS NOT NULL AND l_duplicated_count > 1 THEN
2651       FND_MESSAGE.SET_NAME('AHL','AHL_VWP_STG_RULE_DUP'); --a stage rule already exists between these stages
2652       FND_MSG_PUB.ADD;
2653       RAISE FND_API.G_EXC_ERROR;
2654   END IF;
2655   --PRAKKUM :: VWPE :: ER 12424063 ::  15-APR-2011 :: to find duplicate rules :: END
2656 
2657   --PRAKKUM :: VWPE :: ER 12424063 ::  31-MAY-2011 :: to validate whether all rules are over planning stages or not :: START
2658   l_invalid_rules_count :=0; --Initialization
2659   FOR l_invalid_stage_rules_rec IN c_get_invalid_rule_stages (p_stage_rule_rec.SUBJECT_STAGE_ID,p_stage_rule_rec.OBJECT_STAGE_ID)
2660   LOOP
2661       FND_MESSAGE.SET_NAME('AHL','AHL_VWP_INV_STG_STATUS_RULE');
2662       Fnd_Message.SET_TOKEN('STAGE_NUM', l_invalid_stage_rules_rec.STAGE_NUM);
2663       FND_MSG_PUB.ADD;
2664       l_invalid_rules_count := l_invalid_rules_count+1;
2665   END LOOP;
2666 
2667   IF (l_log_statement >= l_log_current_level) THEN
2668       fnd_log.string(l_log_statement,L_DEBUG_KEY,': l_invalid_rules_count is :' ||l_invalid_rules_count );
2669   END IF;
2670 
2671   IF l_invalid_rules_count>0 THEN
2672       RAISE FND_API.G_EXC_ERROR;
2673   END IF;
2674 
2675   --PRAKKUM :: VWPE :: ER 12424063 ::  31-MAY-2011 :: to validate whether all rules are over planning stages or not :: END
2676 
2677   OPEN c_stage_number (p_stage_rule_rec.SUBJECT_STAGE_ID);
2678   FETCH c_stage_number INTO l_parent_stage_num;
2679   CLOSE c_stage_number;
2680 
2681   IF (l_log_statement >= l_log_current_level)THEN
2682          fnd_log.string (l_log_statement,L_DEBUG_KEY, 'Before Calling NON_CYCLIC_STAGE_REL');
2683   END IF;
2684 
2685   NON_CYCLIC_STAGE_REL
2686      (
2687       x_return_status             =>l_return_Status,
2688       x_msg_count                 =>l_msg_count,
2689       x_msg_data                  =>l_msg_data,
2690       P_CHILD_STAGE_ID            =>p_stage_rule_rec.OBJECT_STAGE_ID,
2691       P_PARENT_STAGE_NUMBER       =>l_parent_stage_num
2692      );
2693 
2694   IF (l_log_statement >= l_log_current_level)THEN
2695          fnd_log.string (l_log_statement,L_DEBUG_KEY, 'After Calling NON_CYCLIC_STAGE_REL &'||' Return status is: '||l_return_Status);
2696   END IF;
2697 
2698   IF l_return_Status <>'S' THEN
2699      IF l_return_Status = FND_API.G_RET_STS_ERROR THEN
2700         RAISE FND_API.G_EXC_ERROR;
2701      ELSIF l_return_Status = FND_API.G_RET_STS_UNEXP_ERROR THEN
2702         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2703      END IF;
2704   END IF;
2705 
2706     --Fetch the previous stage number of the OBJECT_STAGE_ID
2707     OPEN c_prev_stage_num(p_stage_rule_rec.OBJECT_STAGE_ID);
2708     FETCH c_prev_stage_num into l_prev_stage_num;
2709     CLOSE c_prev_stage_num;
2710 
2711     IF (l_log_statement >= l_log_current_level) THEN
2712       fnd_log.string(l_log_statement,L_DEBUG_KEY,'tch Parent stage number is: '||l_parent_stage_num||
2713                 'Previous stage number is: '||l_prev_stage_num);
2714     END IF;
2715 
2716 
2717   SAVEPOINT STAGE_RULE_UPDATE;
2718 
2719   FOR stage_parallel_rules1 IN c_get_parallel_stage_rules1 (p_stage_rule_rec.SUBJECT_STAGE_ID)  LOOP
2720      IF (stage_parallel_rules1.object_id = p_stage_rule_rec.OBJECT_STAGE_ID
2721      AND stage_parallel_rules1.subject_id = p_stage_rule_rec.SUBJECT_STAGE_ID) THEN
2722         l_object_id := p_stage_rule_rec.SUBJECT_STAGE_ID;
2723      ELSE
2724         l_object_id := p_stage_rule_rec.OBJECT_STAGE_ID;
2725      END IF;
2726      UPDATE ahl_stage_links
2727        SET object_id = stage_parallel_rules1.subject_id,
2728          subject_id = stage_parallel_rules1.object_id
2729        WHERE stage_link_id = stage_parallel_rules1.stage_link_id;
2730      IF l_object_id IS NOT NULL THEN
2731         NON_CYCLIC_STAGE_REL
2732           (
2733            x_return_status             =>l_return_Status,
2734            x_msg_count                 =>l_msg_count,
2735            x_msg_data                  =>l_msg_data,
2736            P_CHILD_STAGE_ID            =>l_object_id,
2737            P_PARENT_STAGE_NUMBER       =>l_parent_stage_num
2738           );
2739      END IF;
2740      FOR stage_parallel_rules2 IN c_get_parallel_stage_rules2 (p_stage_rule_rec.SUBJECT_STAGE_ID, stage_parallel_rules1.stage_link_id)  LOOP
2741        IF (stage_parallel_rules2.object_id = p_stage_rule_rec.OBJECT_STAGE_ID
2742        AND stage_parallel_rules2.subject_id = p_stage_rule_rec.SUBJECT_STAGE_ID) THEN
2743           l_object_id := p_stage_rule_rec.SUBJECT_STAGE_ID;
2744        ELSE
2745           l_object_id := p_stage_rule_rec.OBJECT_STAGE_ID;
2746        END IF;
2747        UPDATE ahl_stage_links
2748          SET object_id = stage_parallel_rules2.subject_id,
2749            subject_id = stage_parallel_rules2.object_id
2750          WHERE stage_link_id = stage_parallel_rules2.stage_link_id;
2751        IF l_object_id IS NOT NULL THEN
2752           NON_CYCLIC_STAGE_REL
2753           (
2754            x_return_status             =>l_return_Status,
2755            x_msg_count                 =>l_msg_count,
2756            x_msg_data                  =>l_msg_data,
2757            P_CHILD_STAGE_ID            =>l_object_id,
2758            P_PARENT_STAGE_NUMBER       =>l_parent_stage_num
2759           );
2760        END IF;
2761      END LOOP;--Loop through cursor c_get_parallel_stage_rules2
2762      UPDATE ahl_stage_links
2763        SET object_id = subject_id,
2764          subject_id = object_id
2765        WHERE subject_id IN (SELECT stage_id FROM ahl_vwp_stages_b WHERE visit_id = stage_parallel_rules1.visit_id)
2766        AND relation_type = 'PARALLEL';
2767   END LOOP;  -- Loop through curosr c_get_parallel_stage_rules1
2768 
2769   ROLLBACK TO STAGE_RULE_UPDATE;
2770 
2771   IF l_return_Status <>'S' THEN
2772      IF l_return_Status = FND_API.G_RET_STS_ERROR THEN
2773         RAISE FND_API.G_EXC_ERROR;
2774      ELSIF l_return_Status = FND_API.G_RET_STS_UNEXP_ERROR THEN
2775         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2776      END IF;
2777   END IF;
2778 
2779   --The relation type passed to this API can either be parallel or Before
2780   --Since in DB we will not store After relation for simpler calculations
2781   IF p_stage_rule_rec.RELATION_TYPE <> 'PARALLEL' THEN
2782 
2783     --Fetch the previous stage number of the OBJECT_STAGE_ID
2784     OPEN c_prev_stage_num(p_stage_rule_rec.OBJECT_STAGE_ID);
2785     FETCH c_prev_stage_num into l_prev_stage_num;
2786     CLOSE c_prev_stage_num;
2787 
2788     OPEN c_stage_number (p_stage_rule_rec.OBJECT_STAGE_ID);
2789     FETCH c_stage_number INTO l_child_stage_num;
2790     CLOSE c_stage_number;
2791     IF (l_log_statement >= l_log_current_level) THEN
2792       fnd_log.string(l_log_statement,L_DEBUG_KEY,'Parent stage number is: '||l_parent_stage_num||
2793                 'Previous stage number is: '||l_prev_stage_num);
2794     END IF;
2795 
2796     -- For the given stage rule, loop through all the successive parent stages
2797     FOR l_parent_stages_rec IN c_get_parent_stages(p_stage_rule_rec.SUBJECT_STAGE_ID, p_stage_rule_rec.OBJECT_STAGE_ID) LOOP
2798       -- For the given stage rule, loop through all the successive child stages
2799       FOR l_child_stages_rec IN c_get_child_stages(p_stage_rule_rec.SUBJECT_STAGE_ID, p_stage_rule_rec.OBJECT_STAGE_ID) LOOP
2800         -- Validate only if both child and parent stages have visit tasks.
2801 	OPEN c_get_stage_tasks(l_parent_stages_rec.subject_id);
2802         FETCH c_get_stage_tasks INTO l_val_dummy;
2803         CLOSE c_get_stage_tasks;
2804 
2805         IF l_val_dummy IS NOT NULL THEN
2806           l_val_dummy := NULL;
2807           OPEN c_get_stage_tasks(l_child_stages_rec.object_id);
2808           FETCH c_get_stage_tasks INTO l_val_dummy;
2809           CLOSE c_get_stage_tasks;
2810         END If;
2811         IF l_val_dummy IS NOT NULL THEN
2812 	  --  Validate that any of the tasks in child stage does not start before any of the tasks
2813 	  -- in parent stage
2814           OPEN c_validate_stage_tasks(l_parent_stages_rec.subject_id,l_child_stages_rec.object_id);
2815           FETCH c_validate_stage_tasks INTO l_dummy;
2816           IF c_validate_stage_tasks%FOUND THEN
2817              CLOSE c_validate_stage_tasks;
2818              Fnd_Message.SET_NAME('AHL','AHL_VWP_ST_NUM_INV');
2819              --Fnd_Message.SET_TOKEN('STAGE_NUM', l_child_stage_num); -- Stage rule for violates already defined task rule
2820              Fnd_Msg_Pub.ADD;
2821              RAISE FND_API.G_EXC_ERROR;
2822           END IF;
2823           CLOSE c_validate_stage_tasks;
2824         END If;
2825       END LOOP; -- Loop through cursor c_get_child_stages
2826     END LOOP; -- Loop through cursor c_get_parent_stages
2827 
2828     --If the previous stage number of the subject_stage_id is not null, then check if that is equal to parent stage number.
2829     --If not equal, throw an error since a stage cannot have more than one predecessors.
2830     IF(l_prev_stage_num IS NOT NULL) THEN
2831        IF (l_prev_stage_num <> l_parent_stage_num) THEN
2832          FND_MESSAGE.SET_NAME('AHL','AHL_STG_RULE_PRED'); --a stage cannot have more than one predecessors
2833          FND_MESSAGE.SET_TOKEN('STAGE_NUM',l_child_stage_num);
2834          FND_MSG_PUB.ADD;
2835          RAISE FND_API.G_EXC_ERROR;
2836        END IF;
2837     END IF;
2838   END IF; -- RELATION_TYPE is not parallel
2839 
2840 
2841 EXCEPTION
2842  WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
2843     X_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2844     FND_MSG_PUB.count_and_get( p_encoded => FND_API.G_FALSE,
2845                                p_count => x_msg_count,
2846                                p_data  => x_msg_data);
2847 
2848  WHEN FND_API.G_EXC_ERROR THEN
2849     X_return_status := FND_API.G_RET_STS_ERROR;
2850     FND_MSG_PUB.count_and_get( p_encoded => FND_API.G_FALSE,
2851                                p_count => x_msg_count,
2852                                p_data  => X_msg_data);
2853  WHEN OTHERS THEN
2854     X_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2855     IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
2856     fnd_msg_pub.add_exc_msg(p_pkg_name        =>  G_PKG_NAME,
2857                             p_procedure_name  =>  L_API_NAME,
2858                             p_error_text      => SUBSTR(SQLERRM,1,240));
2859     END IF;
2860     FND_MSG_PUB.count_and_get( p_encoded => FND_API.G_FALSE,
2861                                p_count => x_msg_count,
2862                                p_data  => X_msg_data);
2863 
2864 END VALIDATE_STAGE_RULES;
2865 
2866 
2867 -----------------------------------------------------------------------------
2868 -- PROCEDURE
2869 --    Process_StageTyp_Assoc
2870 --
2871 -- PURPOSE
2872 --    To create or delete associations between stage and stagetypes in a visit.
2873 ------------------------------------------------------------------------------
2874 PROCEDURE Process_StageTyp_Assoc (
2875    p_api_version             IN     NUMBER,
2876    p_init_msg_list           IN     VARCHAR2  := Fnd_Api.g_false,
2877    p_commit                  IN     VARCHAR2  := Fnd_Api.g_false,
2878    p_validation_level        IN     NUMBER    := Fnd_Api.g_valid_level_full,
2879    p_stage_type_assoc_tbl    IN     Stage_Type_Assoc_Tbl_Type,
2880    x_return_status           OUT    NOCOPY VARCHAR2,
2881    x_msg_count               OUT    NOCOPY NUMBER,
2882    x_msg_data                OUT    NOCOPY VARCHAR2
2883 )
2884 is
2885 
2886  -- Define local Variables
2887  L_API_VERSION           CONSTANT NUMBER := 1.0;
2888  L_API_NAME              CONSTANT VARCHAR2(30) := 'Process_StageTyp_Assoc';
2889  L_DEBUG_KEY   CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
2890  l_return_Status   VARCHAR2(1);
2891  l_msg_count       NUMBER;
2892  l_msg_data        VARCHAR2(2000);
2893  l_rowid                 ROWID;
2894  l_visit_id              NUMBER;
2895  l_stage_name            VARCHAR2(80);
2896  l_stage_id              NUMBER;
2897 
2898  --To fetch visit id.
2899  CURSOR get_stage_details (p_stage_id IN NUMBER) IS
2900    SELECT  visit_id, stage_name
2901    FROM ahl_vwp_stages_vl
2902    WHERE stage_id = p_stage_id;
2903 
2904  --To get visit tasks of a given stage type
2905  -- Here in the cursor, we are adding additional condition that "stage_id should be null";
2906  -- This is because we dont want to update those tasks for which user has associated the task to the stage manually.
2907  CURSOR c_visit_tasks (p_visit_id IN NUMBER, p_stage_type_code IN VARCHAR2) IS
2908    SELECT visit_task_id
2909    FROM ahl_visit_tasks_b
2910    WHERE visit_id = p_visit_id
2911    AND stage_type_code = p_stage_type_code
2912    AND STATUS_CODE = 'PLANNING'
2913    AND STAGE_ID IS NULL;
2914 
2915 begin
2916 
2917  --------------------- Initialize -----------------------
2918  SAVEPOINT Process_StageTyp_Assoc;
2919 
2920  IF (l_log_procedure >= l_log_current_level) THEN
2921        fnd_log.string(l_log_procedure,L_DEBUG_KEY||'.begin','At the start of the 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)
2926  THEN
2927    Fnd_Msg_Pub.initialize;
2928  END IF;
2929 
2930  --  Initialize API return status to success
2931  x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
2932 
2933  -- Standard call to check for call compatibility.
2934  IF NOT Fnd_Api.COMPATIBLE_API_CALL(l_api_version,
2935                                     p_api_version,
2936                                     l_api_name,G_PKG_NAME)
2937  THEN
2938      RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
2939  END IF;
2940 
2941  --Find the child task link
2942  OPEN get_stage_details(p_stage_type_assoc_tbl(1).STAGE_ID);
2943  FETCH get_stage_details INTO l_visit_id, l_stage_name;
2944  CLOSE get_stage_details;
2945 
2946  -------------------------------- Validate -----------------------------------------
2947  -- Check for the ID.
2948 
2949  IF (l_visit_id = Fnd_Api.g_miss_num OR l_visit_id IS Null)
2950  THEN
2951     Fnd_Message.SET_NAME('AHL','AHL_VWP_VISIT_INVALID');
2952     Fnd_Msg_Pub.ADD;
2953     RAISE Fnd_Api.G_EXC_ERROR;
2954  END IF;
2955 
2956  -------------------------- Insert/Delete --------------------------
2957  IF (l_log_procedure >= l_log_current_level) THEN
2958      fnd_log.string(l_log_procedure,L_DEBUG_KEY,'start of the DML operation');
2959  END IF;
2960 
2961  -- Loop through all the stage-stage type associations that are passed
2962  FOR i IN p_stage_type_assoc_tbl.FIRST..p_stage_type_assoc_tbl.LAST
2963  loop
2964 
2965    IF (p_stage_type_assoc_tbl(i).dml_operation = 'C') THEN
2966        IF (l_log_statement >= l_log_current_level) THEN
2967            fnd_log.string(l_log_statement,L_DEBUG_KEY,'DML operation for the record is Create');
2968        END IF;
2969        --We need to create an association between the passed stage type and stage id
2970        -- Invoke the table handler to create a record in "AHL_VISIT_STAGE_TYP_ASOC"
2971 
2972        Ahl_VWP_Stages_Pkg.INSERT_ASSOC_ROW (
2973           X_ROWID                 => l_rowid,
2974           X_STAGE_TYPE_ASSOC_ID   => p_stage_type_assoc_tbl(i).STAGE_TYPE_ASSOC_ID,
2975           X_STAGE_ID              => p_stage_type_assoc_tbl(i).STAGE_ID,
2976           X_STAGE_TYPE_CODE       => p_stage_type_assoc_tbl(i).STAGE_TYPE_CODE,
2977           X_ATTRIBUTE_CATEGORY      => NULL,
2978           X_ATTRIBUTE1              => NULL ,
2979           X_ATTRIBUTE2              => NULL ,
2980           X_ATTRIBUTE3              => NULL ,
2981           X_ATTRIBUTE4              => NULL ,
2982           X_ATTRIBUTE5              => NULL ,
2983           X_ATTRIBUTE6              => NULL ,
2984           X_ATTRIBUTE7              => NULL ,
2985           X_ATTRIBUTE8              => NULL ,
2986           X_ATTRIBUTE9              => NULL ,
2987           X_ATTRIBUTE10             => NULL ,
2988           X_ATTRIBUTE11             => NULL ,
2989           X_ATTRIBUTE12             => NULL ,
2990           X_ATTRIBUTE13             => NULL ,
2991           X_ATTRIBUTE14             => NULL ,
2992           X_ATTRIBUTE15             => NULL ,
2993           X_CREATION_DATE         => SYSDATE,
2994           X_CREATED_BY            => Fnd_Global.USER_ID,
2995           X_LAST_UPDATE_DATE      => SYSDATE,
2996           X_LAST_UPDATED_BY       => Fnd_Global.USER_ID,
2997           X_LAST_UPDATE_LOGIN     => Fnd_Global.LOGIN_ID);
2998 
2999        IF (l_log_statement >= l_log_current_level) THEN
3000            fnd_log.string(l_log_statement,L_DEBUG_KEY,'After calling insert row. Created an association for stage -  '||p_stage_type_assoc_tbl(i).STAGE_ID||' and stage type - '||p_stage_type_assoc_tbl(i).STAGE_TYPE_CODE);
3001        END IF;
3002 
3003        --We need to update all the tasks (that are in PLANNING) of this visit which have stage type that matches with the passed stage type. So loop through all such tasks
3004        -- Set the stage_id with the passed stage_id for all such tasks.
3005        FOR l_tasks_rec IN c_visit_tasks(l_visit_id, p_stage_type_assoc_tbl(i).stage_type_code) LOOP
3006           IF (l_log_statement >= l_log_current_level) THEN
3007               fnd_log.string(l_log_statement,
3008                              L_DEBUG_KEY,
3009                              ' Before Calling AHL_VWP_VISITS_STAGES_PVT.VALIDATE_STAGE_UPDATES ');
3010           END IF;
3011 
3012           AHL_VWP_VISITS_STAGES_PVT.VALIDATE_STAGE_UPDATES(
3013             P_API_VERSION      =>  1.0,
3014             P_VISIT_ID         =>  l_visit_id,
3015             P_VISIT_TASK_ID    =>  l_tasks_rec.visit_task_id,
3016             P_STAGE_NAME       =>  l_stage_name,
3017             X_STAGE_ID         =>  l_stage_id,
3018             X_RETURN_STATUS    =>  l_return_status,
3019             X_MSG_COUNT        =>  l_msg_count,
3020             X_MSG_DATA         =>  l_msg_data  );
3021 
3022           IF (l_log_statement >= l_log_current_level) THEN
3023               fnd_log.string(l_log_statement,
3024                              L_DEBUG_KEY,
3025                              ' After Calling VALIDATE_STAGE_UPDATES and return status is: '||l_return_status);
3026           END IF;
3027 
3028           IF l_msg_count > 0 OR NVL(l_return_status,'x') <> FND_API.G_RET_STS_SUCCESS THEN
3029              x_msg_count := l_msg_count;
3030              x_return_status := l_return_status;
3031              IF l_return_status = Fnd_Api.g_ret_sts_error THEN
3032                 RAISE Fnd_Api.g_exc_error;
3033              ELSIF l_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
3034                 RAISE Fnd_Api.g_exc_unexpected_error;
3035              END IF;
3036           END IF;
3037 
3038           UPDATE AHL_VISIT_TASKS_B
3039             SET STAGE_ID = p_stage_type_assoc_tbl(i).STAGE_ID
3040             WHERE visit_task_id = l_tasks_rec.visit_task_id;
3041 
3042        END LOOP; -- Loop through all the tasks
3043 
3044    END IF; -- DML operation is create
3045 
3046    IF (p_stage_type_assoc_tbl(i).dml_operation = 'D') THEN
3047 
3048       IF (l_log_statement >= l_log_current_level) THEN
3049           fnd_log.string(l_log_statement,L_DEBUG_KEY,'DML operation for the record is Delete. Deleting a record with assoc id : '||p_stage_type_assoc_tbl(i).STAGE_TYPE_ASSOC_ID);
3050       END IF;
3051 
3052       --We need to update all the tasks (that are in PLANNING) of this visit which have stage type that matches with the passed stage type.
3053       --Nullify the stage Ids for all such tasks
3054       UPDATE AHL_VISIT_TASKS_B
3055         SET STAGE_ID = NULL
3056         WHERE visit_id = l_visit_id
3057          AND stage_type_code = p_stage_type_assoc_tbl(i).stage_type_code
3058          AND status_code = 'PLANNING';
3059 
3060    END IF;  -- DML operation is delete
3061 
3062  END LOOP; -- Loop through all the stage - stage type associations that are passed
3063 
3064 EXCEPTION
3065  WHEN Fnd_Api.g_exc_error THEN
3066       x_return_status := Fnd_Api.g_ret_sts_error;
3067       ROLLBACK TO Process_StageTyp_Assoc;
3068       Fnd_Msg_Pub.count_and_get(
3069             p_encoded => Fnd_Api.g_false,
3070             p_count   => x_msg_count,
3071             p_data    => x_msg_data
3072       );
3073  WHEN Fnd_Api.g_exc_unexpected_error THEN
3074       x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
3075       ROLLBACK TO Process_StageTyp_Assoc;
3076       Fnd_Msg_Pub.count_and_get (
3077             p_encoded => Fnd_Api.g_false,
3078             p_count   => x_msg_count,
3079             p_data    => x_msg_data
3080       );
3081  WHEN OTHERS THEN
3082       x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
3083       ROLLBACK TO Process_StageTyp_Assoc;
3084       IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_unexp_error)
3085       THEN
3086          Fnd_Msg_Pub.add_exc_msg (G_PKG_NAME, l_api_name);
3087       END IF;
3088       Fnd_Msg_Pub.count_and_get (
3089             p_encoded => Fnd_Api.g_false,
3090             p_count   => x_msg_count,
3091             p_data    => x_msg_data
3092       );
3093 
3094 END Process_StageTyp_Assoc;
3095 
3096 
3097 ------------------------------------------------------------------------------------------
3098 -- PROCEDURE
3099 --    Assoc_VisitType_to_Visit
3100 --
3101 -- PURPOSE
3102 --    To create stages,stage tasks, stage rules, stage-stage type associations in a visit when visit type is associated to a visit.
3103 ------------------------------------------------------------------------------------------
3104 PROCEDURE Assoc_VisitType_to_Visit (
3105    p_api_version             IN     NUMBER,
3106    p_init_msg_list           IN     VARCHAR2  := Fnd_Api.g_false,
3107    p_commit                  IN     VARCHAR2  := Fnd_Api.g_false,
3108    p_validation_level        IN     NUMBER    := Fnd_Api.g_valid_level_full,
3109    p_visit_id                IN     NUMBER,
3110    p_visit_type_code         IN     VARCHAR2,
3111    x_return_status           OUT    NOCOPY VARCHAR2,
3112    x_msg_count               OUT    NOCOPY NUMBER,
3113    x_msg_data                OUT    NOCOPY VARCHAR2
3114 )
3115 is
3116 
3117   -- Define local Variables
3118   L_API_VERSION           CONSTANT NUMBER := 1.0;
3119   L_API_NAME              CONSTANT VARCHAR2(30) := 'Assoc_VisitType_to_Visit';
3120   L_DEBUG_KEY CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
3121   l_rowid                 ROWID;
3122   l_stage_id              NUMBER;
3123   l_cum_duration          NUMBER :=0;
3124   l_dept_id               NUMBER;
3125   l_visit_start_date      DATE;
3126   l_prev_stage_id         NUMBER;
3127   l_prev_stage_num        NUMBER;
3128   l_msg_data              VARCHAR2(2000);
3129   l_msg_count             NUMBER;
3130   l_return_status         varchar2(1);
3131   l_stg_id                NUMBER;
3132 
3133   -- To find visit related information
3134   CURSOR c_visit (x_id IN NUMBER) IS
3135     SELECT START_DATE_TIME , department_id
3136     FROM AHL_VISITS_VL
3137     WHERE VISIT_ID = x_id;
3138 
3139   -- To find previous stage id
3140   CURSOR c_prev_stage_id (p_stage_id IN NUMBER) IS
3141     SELECT subject_id
3142     FROM AHL_VST_TYP_STAGE_LINKS
3143     WHERE object_id = p_stage_id and relation_type = 'BEFORE' ;
3144 
3145   -- To find the stage number for the corresponding stage id
3146   CURSOR c_stage_num (p_stage_id IN NUMBER) IS
3147     SELECT stage_number
3148     FROM ahl_visit_type_stages_b
3149     WHERE visit_type_stage_id = p_stage_id;
3150 
3151   --To fetch all the stages associated to the passed visit type code.
3152   CURSOR get_visit_type_stages (p_visit_type_code IN VARCHAR2, p_visit_id IN NUMBER) IS
3153     SELECT distinct stg.visit_type_id, stg.duration, stg.visit_type_stage_id,stg.stage_number, stg.stage_name
3154     FROM ahl_visit_type_stages_vl stg, ahl_visit_types_b vt, ahl_visits_b visit,
3155     ahl_mc_headers_B mc, AHL_UNIT_CONFIG_HEADERS unit
3156     WHERE vt.visit_type_code = p_visit_type_code
3157      AND visit.visit_id = p_visit_id
3158      AND visit.item_instance_id = unit.CSI_ITEM_INSTANCE_ID
3159      AND vt.mc_id = mc.mc_id
3160      AND unit.master_config_id = mc.mc_header_id
3161      AND vt.STATUS_CODE = 'COMPLETE'
3162      AND vt.visit_type_id = stg.visit_type_id;
3163      l_stages_rec get_visit_type_stages%ROWTYPE;
3164 
3165   --To fetch all the stage-stage types associations of the passed visit type code.
3166   CURSOR get_stage_types (p_visit_type_stage_id IN NUMBER) IS
3167     SELECT stage_type_code
3168     FROM ahl_vst_typ_stg_typ_asoc
3169     WHERE visit_type_stage_id = p_visit_type_stage_id;
3170 
3171     l_stagetypes_rec get_stage_types%ROWTYPE;
3172 
3173   --To fetch all the stage rules of a stage and get the visit subject and object stage ids corresponding to visit type subject and object stage ids
3174   CURSOR get_stage_rules (p_visit_type_stage_id IN NUMBER, p_visit_id IN NUMBER) IS
3175     SELECT  stage_obj.stage_id object_id, stage_sub.stage_id subject_id, links.relation_type
3176     FROM ahl_vst_typ_stage_links links, ahl_visit_type_stages_b vt_obj, ahl_visit_type_stages_b vt_sub,
3177      ahl_vwp_stages_b stage_obj, ahl_vwp_stages_b stage_sub
3178     WHERE links.subject_id = p_visit_type_stage_id
3179      AND links.subject_id = vt_sub.visit_type_stage_id
3180      AND links.object_id = vt_obj.visit_type_stage_id
3181      AND vt_sub.stage_number = stage_sub.stage_num
3182      AND vt_obj.stage_number = stage_obj.stage_num
3183      AND stage_obj.visit_id = p_visit_id
3184      AND stage_sub.visit_id = p_visit_id;
3185      l_stage_rules_rec get_stage_rules%ROWTYPE;
3186 
3187   --To get visit tasks of a given stage type
3188   CURSOR c_visit_tasks (p_visit_id IN NUMBER, p_stage_type_code IN VARCHAR2) IS
3189     SELECT visit_task_id
3190     FROM ahl_visit_tasks_b
3191     WHERE visit_id = p_visit_id
3192      AND stage_type_code = p_stage_type_code
3193      AND STATUS_CODE = 'PLANNING';
3194 
3195 begin
3196   --------------------- Initialize -----------------------
3197   SAVEPOINT Assoc_VisitType_to_Visit;
3198 
3199   IF (l_log_procedure >= l_log_current_level) THEN
3200      fnd_log.string(l_log_procedure,L_DEBUG_KEY||'.begin','At the start of the PLSQL procedure');
3201   END IF;
3202 
3203   -- Initialize message list if p_init_msg_list is set to TRUE.
3204   IF Fnd_Api.to_boolean(p_init_msg_list)
3205   THEN
3206     Fnd_Msg_Pub.initialize;
3207   END IF;
3208 
3209   --  Initialize API return status to success
3210   x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
3211 
3212   -- Standard call to check for call compatibility.
3213   IF NOT Fnd_Api.COMPATIBLE_API_CALL(l_api_version,
3214                                      p_api_version,
3215                                      l_api_name,G_PKG_NAME)
3216   THEN
3217      RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
3218   END IF;
3219 
3220   IF (l_log_statement >= l_log_current_level) THEN
3221       fnd_log.string(l_log_statement,
3222                      L_DEBUG_KEY,
3223                      'Before inserting stages for visit_type_code '||p_visit_type_code||'Visit ID =' || P_VISIT_ID);
3224   END IF;
3225 
3226   -- Cursor to find visit start time
3227   OPEN c_visit (p_visit_id);
3228   FETCH c_visit INTO l_visit_start_date,l_dept_id;
3229   CLOSE c_visit;
3230 
3231   -- Loop through all the stages associated to the passed visit type code
3232   FOR l_stages_rec IN get_visit_type_stages(p_visit_type_code, P_VISIT_ID)
3233   LOOP
3234     l_stage_id := AHL_VWP_VISITS_STAGES_PVT.Get_Stage_Id;
3235 
3236     l_prev_stage_id := null;
3237     -- Cursor to find previous stage id
3238     OPEN c_prev_stage_id (l_stages_rec.visit_type_stage_id);
3239     FETCH c_prev_stage_id INTO l_prev_stage_id;
3240     CLOSE c_prev_stage_id;
3241 
3242     l_prev_stage_num  := null;
3243     -- Cursor to find previous stage number for the previous stage id
3244     OPEN c_stage_num (l_prev_stage_id);
3245     FETCH c_stage_num INTO l_prev_stage_num;
3246     CLOSE c_stage_num;
3247 
3248     IF (l_log_statement >= l_log_current_level) THEN
3249        fnd_log.string(l_log_statement,
3250                       L_DEBUG_KEY,
3251                       'Before calling table handler for inserting a record. stage ID is '||l_stage_id|| ' previous stage number is: '||l_prev_stage_num);
3252     END IF;
3253 
3254     -- Invoke the table handler to create a record
3255     Ahl_VWP_Stages_Pkg.Insert_Row (
3256        X_ROWID                 => l_rowid,
3257        X_VISIT_ID              => P_VISIT_ID,
3258        X_STAGE_ID              => l_stage_id,
3259        X_STAGE_NUM             => l_stages_rec.stage_number,
3260        X_STAGE_NAME            => l_stages_rec.stage_name,
3261        X_DURATION              => l_stages_rec.duration,
3262        X_OBJECT_VERSION_NUMBER => 1,
3263        X_ATTRIBUTE_CATEGORY      => NULL,
3264        X_ATTRIBUTE1              => NULL ,
3265        X_ATTRIBUTE2              => NULL ,
3266        X_ATTRIBUTE3              => NULL ,
3267        X_ATTRIBUTE4              => NULL ,
3268        X_ATTRIBUTE5              => NULL ,
3269        X_ATTRIBUTE6              => NULL ,
3270        X_ATTRIBUTE7              => NULL ,
3271        X_ATTRIBUTE8              => NULL ,
3272        X_ATTRIBUTE9              => NULL ,
3273        X_ATTRIBUTE10             => NULL ,
3274        X_ATTRIBUTE11             => NULL ,
3275        X_ATTRIBUTE12             => NULL ,
3276        X_ATTRIBUTE13             => NULL ,
3277        X_ATTRIBUTE14             => NULL ,
3278        X_ATTRIBUTE15             => NULL ,
3279        X_CREATION_DATE         => SYSDATE,
3280        X_CREATED_BY            => Fnd_Global.USER_ID,
3281        X_LAST_UPDATE_DATE      => SYSDATE,
3282        X_LAST_UPDATED_BY       => Fnd_Global.USER_ID,
3283        X_LAST_UPDATE_LOGIN     => Fnd_Global.LOGIN_ID,
3284        X_STAGE_STATUS_CODE     => 'PLANNING',
3285        X_PLANNED_START_DATE      => NULL,
3286        X_PLANNED_END_DATE        => NULL,
3287        X_PREV_STAGE_NUM          => l_prev_stage_num,
3288        X_EARLIEST_START_DATE     => NULL );
3289 
3290     IF (l_log_statement >= l_log_current_level) THEN
3291         fnd_log.string(l_log_statement,
3292                        L_DEBUG_KEY,
3293                        'After calling table handler for inserting a record and before calling AHL_VWP_TASKS_PVT.Create_Stage_Tasks');
3294     END IF;
3295 
3296     -- CREATE A STAGE TASK
3297     AHL_VWP_TASKS_PVT.Create_Stage_Tasks (
3298          p_api_version       =>  1.0,
3299          p_init_msg_list     =>  Fnd_Api.g_false,
3300          p_commit            =>  Fnd_Api.g_false,
3301          p_validation_level  =>  Fnd_Api.g_valid_level_full,
3302          p_module_type       =>  'JSP',
3303          p_stage_id          => l_stage_id,
3304          p_visit_id          => P_VISIT_ID,
3305          x_return_status     => l_return_status,
3306          x_msg_count         => l_msg_count,
3307          x_msg_data          => l_msg_data
3308       );
3309 
3310     IF (l_log_statement >= l_log_current_level) THEN
3311         fnd_log.string(l_log_statement,
3312                        L_DEBUG_KEY,
3313                        'After calling AHL_VWP_TASKS_PVT.Create_Stage_Tasks and the return status is: '||l_return_status);
3314     END IF;
3315 
3316     IF l_msg_count > 0 OR NVL(l_return_status,'x') <> FND_API.G_RET_STS_SUCCESS THEN
3317        x_msg_count := l_msg_count;
3318        x_return_status := l_return_status;
3319        IF l_return_status = Fnd_Api.g_ret_sts_error THEN
3320           RAISE Fnd_Api.g_exc_error;
3321        ELSIF l_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
3322           RAISE Fnd_Api.g_exc_unexpected_error;
3323        END IF;
3324     END IF;
3325 
3326     IF (l_log_statement >= l_log_current_level) THEN
3327           fnd_log.string(l_log_statement,
3328                        L_DEBUG_KEY,
3329                        'Before inserting stage - stage type association for stage num '||l_stages_rec.stage_number);
3330     END IF;
3331 
3332     -- Fetch all the stage-stage type associations of a stage and loop through all those records.
3333     FOR l_stagetypes_rec IN get_stage_types(l_stages_rec.visit_type_stage_id)
3334     LOOP
3335       INSERT INTO AHL_VISIT_STAGE_TYP_ASOC(
3336             STAGE_TYPE_ASSOC_ID,
3337             STAGE_ID,
3338             STAGE_TYPE_CODE,
3339             SECURITY_GROUP_ID,
3340             CREATION_DATE,
3341             CREATED_BY,
3342             LAST_UPDATE_DATE,
3343             LAST_UPDATED_BY,
3344             LAST_UPDATE_LOGIN)
3345             values
3346              (
3347              AHL_VISIT_STAGE_TYP_ASOC_S.nextval,
3348              l_stage_id,
3349              l_stagetypes_rec.stage_type_code,
3350              null,
3351              SYSDATE,
3352              Fnd_Global.USER_ID,
3353              SYSDATE,
3354              Fnd_Global.USER_ID,
3355              Fnd_Global.LOGIN_ID);
3356 
3357       --We need to update all the tasks (that are in PLANNING) of this visit which have stage type that matches with the passed stage type.
3358       -- Set the stage_id with the passed stage_id for all such tasks
3359       FOR l_tasks_rec IN c_visit_tasks(P_VISIT_ID, l_stagetypes_rec.stage_type_code) LOOP
3360           IF (l_log_statement >= l_log_current_level) THEN
3361               fnd_log.string(l_log_statement,
3362                              L_DEBUG_KEY,
3363                              'Before Calling AHL_VWP_VISITS_STAGES_PVT.VALIDATE_STAGE_UPDATES ');
3364           END IF;
3365           AHL_VWP_VISITS_STAGES_PVT.VALIDATE_STAGE_UPDATES(
3366               P_API_VERSION      =>  1.0,
3367               P_VISIT_ID         =>  P_VISIT_ID,
3368               P_VISIT_TASK_ID    =>  l_tasks_rec.visit_task_id,
3369               P_STAGE_NAME       =>  l_stages_rec.stage_name,
3370               X_STAGE_ID         =>  l_stg_id,
3371               X_RETURN_STATUS    =>  l_return_status,
3372               X_MSG_COUNT        =>  l_msg_count,
3373               X_MSG_DATA         =>  l_msg_data  );
3374 
3375           IF (l_log_statement >= l_log_current_level) THEN
3376               fnd_log.string(l_log_statement,
3377                              L_DEBUG_KEY,
3378                              ' After calling AHL_VWP_VISITS_STAGES_PVT.VALIDATE_STAGE_UPDATES and return status: '||l_return_status);
3379           END IF;
3380 
3381           IF l_msg_count > 0 OR NVL(l_return_status,'x') <> FND_API.G_RET_STS_SUCCESS THEN
3382              x_msg_count := l_msg_count;
3383              x_return_status := l_return_status;
3384              IF l_return_status = Fnd_Api.g_ret_sts_error THEN
3385                 RAISE Fnd_Api.g_exc_error;
3386              ELSIF l_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
3387                 RAISE Fnd_Api.g_exc_unexpected_error;
3388              END IF;
3389           END IF;
3390 
3391           UPDATE AHL_VISIT_TASKS_B
3392            SET STAGE_ID = l_stage_id
3393            WHERE visit_task_id = l_tasks_rec.visit_task_id;
3394 
3395       END LOOP; -- Loop through all the tasks.
3396 
3397     END LOOP; -- Loop though stage-stage type associations of a stage
3398 
3399   END LOOP;-- Loop through all the stages associated to the passed visit type code
3400 
3401   -- Loop through all the stages associated to the passed visit type code
3402   FOR l_stages_rec IN get_visit_type_stages(p_visit_type_code, P_VISIT_ID)
3403   LOOP
3404     IF (l_log_statement >= l_log_current_level) THEN
3405        fnd_log.string(l_log_statement,
3406                       L_DEBUG_KEY,
3407                       'Before calling inserting stage rules visit_type_stage_id= '||l_stages_rec.visit_type_stage_id||', visit_id'||p_visit_id);
3408     END IF;
3409 
3410     -- Fetch all the stage rules of a stage and loop through all the rules.
3411     FOR l_stage_rules_rec IN get_stage_rules(l_stages_rec.visit_type_stage_id, p_visit_id)
3412     LOOP
3413        IF (l_log_statement >= l_log_current_level) THEN
3414            fnd_log.string(l_log_statement,
3415                           L_DEBUG_KEY,
3416                           'Before inserting stage rules l_stage_rules_rec.object_id and l_stage_rules_rec.subject_id=      '||l_stage_rules_rec.object_id||' '||l_stage_rules_rec.subject_id);
3417        END IF;
3418 
3419         INSERT INTO AHL_STAGE_LINKS (
3420              STAGE_LINK_ID,
3421              OBJECT_ID,
3422              SUBJECT_ID,
3423              RELATION_TYPE,
3424              OBJECT_VERSION_NUMBER,
3425              SECURITY_GROUP_ID,
3426              CREATION_DATE,
3427              CREATED_BY,
3428              LAST_UPDATE_DATE,
3429              LAST_UPDATED_BY,
3430              LAST_UPDATE_LOGIN
3431              )
3432              values
3433              (
3434              AHL_STAGE_LINKS_S.nextval,
3435              l_stage_rules_rec.object_id,
3436              l_stage_rules_rec.subject_id,
3437              l_stage_rules_rec.relation_type,
3438              1,
3439              null,
3440              SYSDATE,
3441              Fnd_Global.USER_ID,
3442              SYSDATE,
3443              Fnd_Global.USER_ID,
3444              Fnd_Global.LOGIN_ID
3445              );
3446 
3447         IF (l_log_statement >= l_log_current_level) THEN
3448             fnd_log.string(l_log_statement,
3449                            L_DEBUG_KEY,
3450                        'After inserting stage rules and before claling validate stage rules');
3451         END IF;
3452 
3453         VALIDATE_STAGE_RULES(
3454             p_stage_rule_rec          => l_stage_rules_rec,
3455             x_return_status           => l_return_status,
3456             x_msg_count               => l_msg_count,
3457             x_msg_data                => l_msg_data
3458             );
3459 
3460         IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
3461             fnd_log.string(fnd_log.level_statement,L_DEBUG_KEY,'After calling AHL_VWP_VISITS_STAGES_PVT.VALIDATE_STAGE_RULES - l_return_status : '||l_return_status);
3462         END IF;
3463 
3464         l_msg_count := Fnd_Msg_Pub.count_msg;
3465         IF l_msg_count > 0 OR NVL(l_return_status,'X') <> FND_API.G_RET_STS_SUCCESS THEN
3466            x_msg_count := l_msg_count;
3467            x_return_status := l_return_status;
3468            IF l_return_status = Fnd_Api.g_ret_sts_error THEN
3469               RAISE Fnd_Api.g_exc_error;
3470            ELSIF l_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
3471               RAISE Fnd_Api.g_exc_unexpected_error;
3472            END IF;
3473         END IF;
3474 
3475     END LOOP; --Loop though stage rules of a stage.
3476 
3477   END LOOP; --Loop through all the stages associated to the passed visit type code
3478 
3479   IF (l_log_statement >= l_log_current_level) THEN
3480         fnd_log.string(l_log_statement,
3481                        L_DEBUG_KEY,
3482                        'Before calling UPDATE_STAGES_HIERARICHY and message count is :'||Fnd_Msg_Pub.count_msg);
3483   END IF;
3484 
3485   --Calculate and update all the stages planned start and end dates
3486   UPDATE_STAGES_HIERARICHY (
3487     p_api_version             => 1.0,
3488     p_init_msg_list           => Fnd_Api.g_false,
3489     p_commit                  => Fnd_Api.g_false,
3490     p_validation_level        => Fnd_Api.g_valid_level_full,
3491     p_module_type             => 'JSP',
3492     p_visit_id                => p_visit_id,
3493     x_return_status           => l_return_status,
3494     x_msg_count               => l_msg_count,
3495     x_msg_data                => l_msg_data
3496     );
3497 
3498   IF (l_log_statement >= l_log_current_level) THEN
3499       fnd_log.string(l_log_statement,
3500                      L_DEBUG_KEY,
3501                      'After calling UPDATE_STAGES_HIERARICHY and return status is:'||l_return_status);
3502   END IF;
3503 
3504   IF l_msg_count > 0 OR NVL(l_return_status,'x') <> FND_API.G_RET_STS_SUCCESS THEN
3505      x_msg_count := l_msg_count;
3506      x_return_status := l_return_status;
3507      IF l_return_status = Fnd_Api.g_ret_sts_error THEN
3508         RAISE Fnd_Api.g_exc_error;
3509      ELSIF l_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
3510         RAISE Fnd_Api.g_exc_unexpected_error;
3511      END IF;
3512   END IF;
3513 
3514   -- Standard check of p_commit
3515   IF FND_API.TO_BOOLEAN(p_commit) THEN
3516      COMMIT WORK;
3517   END IF;
3518 
3519   IF (l_log_procedure >= l_log_current_level)THEN
3520       fnd_log.string ( l_log_procedure,L_DEBUG_KEY ||'.end','At the end of PLSQL procedure');
3521   END IF;
3522 
3523 EXCEPTION
3524   WHEN Fnd_Api.g_exc_error THEN
3525       ROLLBACK TO Assoc_VisitType_to_Visit;
3526       x_return_status := Fnd_Api.g_ret_sts_error;
3527       Fnd_Msg_Pub.count_and_get(
3528             p_encoded => Fnd_Api.g_false,
3529             p_count   => x_msg_count,
3530             p_data    => x_msg_data
3531       );
3532   WHEN Fnd_Api.g_exc_unexpected_error THEN
3533       ROLLBACK TO Assoc_VisitType_to_Visit;
3534       x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
3535       Fnd_Msg_Pub.count_and_get (
3536             p_encoded => Fnd_Api.g_false,
3537             p_count   => x_msg_count,
3538             p_data    => x_msg_data
3539       );
3540   WHEN OTHERS THEN
3541       ROLLBACK TO Assoc_VisitType_to_Visit;
3542       x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
3543       IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_unexp_error)
3544                 THEN
3545          Fnd_Msg_Pub.add_exc_msg (G_PKG_NAME, l_api_name);
3546       END IF;
3547       Fnd_Msg_Pub.count_and_get (
3548             p_encoded => Fnd_Api.g_false,
3549             p_count   => x_msg_count,
3550             p_data    => x_msg_data
3551       );
3552 
3553 END Assoc_VisitType_to_Visit;
3554 
3555 --VWPE ER-12424063:: tchimira :: 16-FEB -2011 :: end
3556 
3557 -- PRAKKUM :: 15/03/2011 :: VWPE :: ER 12424063 :: START
3558 
3559 --------------------------------------------------------------------
3560 -- FUNCTION
3561 --    Get_Visit_Stage_Number
3562 --
3563 -- PURPOSE
3564 --    To retrieve visit stage's stage number with maximum plus one criteria
3565 --------------------------------------------------------------------
3566 
3567 FUNCTION Get_Visit_Stage_Number(p_visit_id IN NUMBER)
3568 RETURN NUMBER
3569 IS
3570  -- To find out the maximum task number value in the visit
3571   CURSOR c_stage_number IS
3572   SELECT FLOOR(nvl(MAX(stage_num),0)+1)
3573   FROM AHL_VWP_STAGES_B
3574   WHERE Visit_Id = p_visit_id;
3575 
3576   x_Visit_Stage_Number NUMBER;
3577   L_API_NAME           CONSTANT VARCHAR2(30) := 'Get_Visit_Stage_Number';
3578   L_DEBUG_KEY          CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
3579 
3580 BEGIN
3581 
3582    IF (l_log_procedure >= l_log_current_level) THEN
3583       fnd_log.string(l_log_procedure,
3584                      L_DEBUG_KEY ||'.begin',
3585                      'At the start of PL SQL function. Visit Id = ' || p_visit_id);
3586    END IF;
3587 
3588    -- Check for Stage Number
3589    OPEN c_stage_number;
3590    FETCH c_stage_number INTO x_Visit_Stage_Number;
3591    CLOSE c_stage_number;
3592 
3593    IF (l_log_procedure >= l_log_current_level) THEN
3594       fnd_log.string(l_log_procedure,
3595                      L_DEBUG_KEY ||'.end',
3596                      'At the end of PL SQL function. Visit Stage Number = ' || x_Visit_Stage_Number);
3597    END IF;
3598    RETURN x_Visit_Stage_Number;
3599 
3600 END Get_Visit_Stage_Number;
3601 
3602 -- PRAKKUM :: 15/03/2011 :: VWPE :: ER 12424063 :: START
3603 
3604 -- PRAKKUM :: 03/06/2011 :: VWPE :: ER 12424063 :: Added new method
3605 --------------------------------------------------------------------
3606 -- FUNCTION
3607 --    Get_Stage_Parallel_Stages
3608 --
3609 -- PURPOSE
3610 --    To find parallel stages of particular stage
3611 --------------------------------------------------------------------
3612 
3613 FUNCTION Get_Stage_Parallel_Stages(p_parallel_stage_ids IN PARALLEL_STAGE_ID_DETS, p_visit_id IN NUMBER)
3614 RETURN PARALLEL_STAGE_ID_DETS
3615 IS
3616 
3617   /* cursor to get all parallel relations of a visit */
3618   Cursor c_parallel_stages_dets(vst_id IN NUMBER) IS
3619   SELECT distinct STAGE_LINK_ID,subject_ID,object_ID FROM
3620   ahl_stage_links ,AHL_VWP_STAGES_B
3621   WHERE RELATION_TYPE='PARALLEL'
3622   AND ( ahl_stage_links.subject_id=AHL_VWP_STAGES_B.stage_id OR ahl_stage_links.object_id=AHL_VWP_STAGES_B.stage_id)
3623   AND VISIT_ID =vst_id;
3624 
3625   l_parallel_stg_dets c_parallel_stages_dets%RowType;
3626 
3627   l_changesExist VARCHAR2(1) := 'N';
3628 
3629   l_parallel_stage_ids  PARALLEL_STAGE_ID_DETS;
3630 
3631   L_API_NAME           CONSTANT VARCHAR2(30) := 'Get_Stage_Parallel_Stages';
3632   L_DEBUG_KEY          CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
3633 
3634 BEGIN
3635 
3636    IF (l_log_procedure >= l_log_current_level) THEN
3637       fnd_log.string(l_log_procedure,
3638                      L_DEBUG_KEY ||'.begin',
3639                      'At the start of PL SQL function. Visit Id = ' || p_visit_id);
3640    END IF;
3641 
3642    l_changesExist := 'N';
3643    l_parallel_stage_ids := p_parallel_stage_ids;
3644    FOR l_parallel_stg_dets IN c_parallel_stages_dets(p_visit_id)
3645    LOOP
3646 
3647         --If not both exists
3648         IF NOT (l_parallel_stage_ids.EXISTS(l_parallel_stg_dets.subject_ID) AND l_parallel_stage_ids.EXISTS(l_parallel_stg_dets.object_ID)) THEN
3649 
3650           IF l_parallel_stage_ids.EXISTS(l_parallel_stg_dets.subject_ID) THEN
3651             l_parallel_stage_ids(l_parallel_stg_dets.object_ID) := true;
3652             l_changesExist := 'Y';
3653           ELSIF l_parallel_stage_ids.EXISTS(l_parallel_stg_dets.object_ID) THEN
3654             l_parallel_stage_ids(l_parallel_stg_dets.subject_ID) := true;
3655             l_changesExist := 'Y';
3656           END IF;
3657 
3658         END IF;
3659 
3660    END LOOP;
3661 
3662    IF (l_log_statement >= l_log_current_level) THEN
3663       fnd_log.string(l_log_statement,
3664                      L_DEBUG_KEY ,'l_changesExist : '||l_changesExist);
3665    END IF;
3666 
3667    IF l_changesExist ='Y' THEN
3668        l_parallel_stage_ids := Get_Stage_Parallel_Stages(l_parallel_stage_ids , p_visit_id );
3669    END IF;
3670 
3671    IF (l_log_procedure >= l_log_current_level) THEN
3672       fnd_log.string(l_log_procedure,
3673                      L_DEBUG_KEY ||'.end',
3674                      'At the end of PL SQL function. p_visit_id = ' || p_visit_id);
3675    END IF;
3676 
3677    RETURN l_parallel_stage_ids;
3678 
3679 END Get_Stage_Parallel_Stages;
3680 
3681 --------------------------------------------------------------------
3682 -- PROCEDURE
3683 --    UPDATE_STAGES_HIERARICHY
3684 --
3685 -- PURPOSE
3686 -- To recalculate planned start and end date of all stages of a visit considering duration as a base
3687 --------------------------------------------------------------------
3688 PROCEDURE UPDATE_STAGES_HIERARICHY (
3689    p_api_version             IN     NUMBER,
3690    p_init_msg_list           IN     VARCHAR2  := Fnd_Api.g_false,
3691    p_commit                  IN     VARCHAR2  := Fnd_Api.g_false,
3692    p_validation_level        IN     NUMBER    := Fnd_Api.g_valid_level_full,
3693    p_module_type             IN     VARCHAR2  := 'JSP',
3694    p_visit_id                IN     NUMBER,
3695 
3696    x_return_status           OUT    NOCOPY VARCHAR2,
3697    x_msg_count               OUT    NOCOPY NUMBER,
3698    x_msg_data                OUT    NOCOPY VARCHAR2
3699 )
3700 IS
3701 
3702   L_API_VERSION        CONSTANT NUMBER := 1.0;
3703   L_API_NAME           CONSTANT VARCHAR2(30) := 'UPDATE_STAGES_HIERARICHY';
3704   L_FULL_NAME          CONSTANT VARCHAR2(60) := G_PKG_NAME || '.' || L_API_NAME;
3705   L_DEBUG            CONSTANT VARCHAR2(90) := 'ahl.plsql.'||L_FULL_NAME;
3706 
3707   l_msg_data           VARCHAR2(2000);
3708   l_msg_count          NUMBER;
3709   l_return_status      VARCHAR2(1);
3710 
3711   l_stages_ovn_tbl     AHL_VWP_VISITS_STAGES_PVT.Visit_Stages_OVN_Tbl_Type;
3712 
3713 BEGIN
3714 
3715    SAVEPOINT UPDATE_STAGES_HIERARICHY;
3716 
3717    IF (l_log_procedure >= l_log_current_level) THEN
3718        fnd_log.string(l_log_procedure,L_DEBUG||'.begin','Start');
3719    END IF;
3720 
3721    --  Initialize API return status to success
3722    -- Initialize message list if p_init_msg_list is set to TRUE.
3723    IF FND_API.to_boolean(p_init_msg_list) THEN
3724       FND_MSG_PUB.initialize;
3725    END IF;
3726 
3727    --Initialize API return status to success
3728    x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
3729    l_return_status := x_return_status;
3730 
3731    -- Standard call to check for call compatibility.
3732    IF NOT FND_API.COMPATIBLE_API_CALL(l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
3733        RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3734    END IF;
3735 
3736    --Passing null relation details will recalculate stage dates for the entire visit taking dependencies from database into account
3737    PROCESS_STAGE_DATES (
3738            p_visit_id       => p_visit_id,
3739            p_subject_id     => NULL,
3740            p_object_id      => NULL,
3741            p_relation_type  => NULL,
3742            p_operation_flag => 'U',
3743            p_x_stages_ovn_tbl => l_stages_ovn_tbl,--VWPE 12730539:: PRAKKUM :: 08-JUL-2011
3744            x_return_status  => l_return_status,
3745            x_msg_count      => l_msg_count,
3746            x_msg_data       => l_msg_data);
3747 
3748 --------------------------End of API Body---------------------------------------
3749 
3750    IF (l_log_statement >= l_log_current_level) THEN
3751         fnd_log.string(l_log_statement,L_DEBUG,'After calling AHL_VWP_VISITS_STAGES_PVT.PROCESS_STAGE_DATES - l_return_status : '||l_return_status);
3752    END IF;
3753 
3754    IF l_msg_count > 0 OR NVL(l_return_status,'x') <> FND_API.G_RET_STS_SUCCESS THEN
3755     x_msg_count := l_msg_count;
3756     x_return_status := l_return_status;
3757     IF l_return_status = Fnd_Api.g_ret_sts_error THEN
3758       RAISE Fnd_Api.g_exc_error;
3759     ELSIF l_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
3760       RAISE Fnd_Api.g_exc_unexpected_error;
3761     END IF;
3762    END IF;
3763 
3764    l_msg_count := Fnd_Msg_Pub.count_msg;
3765    IF l_msg_count > 0 THEN
3766       X_msg_count := l_msg_count;
3767       X_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
3768       RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
3769    END IF;
3770 
3771    --Standard check for commit
3772    IF Fnd_Api.TO_BOOLEAN(p_commit) THEN
3773       COMMIT;
3774    END IF;
3775 
3776    IF (l_log_procedure >= l_log_current_level) THEN
3777        fnd_log.string(l_log_procedure,L_DEBUG||'.end','End');
3778    END IF;
3779 
3780 EXCEPTION
3781  WHEN Fnd_Api.G_EXC_ERROR THEN
3782    x_return_status := Fnd_Api.G_RET_STS_ERROR;
3783    ROLLBACK TO UPDATE_STAGES_HIERARICHY;
3784    Fnd_Msg_Pub.count_and_get( p_count => x_msg_count,
3785                               p_data  => x_msg_data,
3786                               p_encoded => Fnd_Api.g_false);
3787  WHEN Fnd_Api.G_EXC_UNEXPECTED_ERROR THEN
3788    x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
3789    ROLLBACK TO UPDATE_STAGES_HIERARICHY;
3790    Fnd_Msg_Pub.count_and_get( p_count => x_msg_count,
3791                               p_data  => x_msg_data,
3792                                p_encoded => Fnd_Api.g_false);
3793  WHEN OTHERS THEN
3794       ROLLBACK TO UPDATE_STAGES_HIERARICHY;
3795       x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
3796       IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_unexp_error)
3797                 THEN
3798          Fnd_Msg_Pub.add_exc_msg (G_PKG_NAME, l_api_name);
3799       END IF;
3800       Fnd_Msg_Pub.count_and_get (
3801             p_encoded => Fnd_Api.g_false,
3802             p_count   => x_msg_count,
3803             p_data    => x_msg_data  );
3804 
3805 
3806 END UPDATE_STAGES_HIERARICHY;
3807 
3808 --------------------------------------------------------------------
3809 -- PROCEDURE
3810 --    UPDATE_AS_STAGE_RULE_DEL
3811 --
3812 -- PURPOSE
3813 -- To recalculate planned start and end date of all successor stages of a stages that involve in dependency deletion considering duration as a base
3814 --------------------------------------------------------------------
3815 PROCEDURE UPDATE_AS_STAGE_RULE_DEL (
3816    p_api_version             IN     NUMBER,
3817    p_init_msg_list           IN     VARCHAR2  := Fnd_Api.g_false,
3818    p_commit                  IN     VARCHAR2  := Fnd_Api.g_false,
3819    p_validation_level        IN     NUMBER    := Fnd_Api.g_valid_level_full,
3820    p_module_type             IN     VARCHAR2  := 'JSP',
3821 
3822    p_object_id               IN     NUMBER,
3823    p_subject_id              IN     NUMBER,
3824    p_relation_type           IN     VARCHAR2,
3825 
3826    p_visit_id                IN     NUMBER,
3827 
3828    x_return_status           OUT    NOCOPY VARCHAR2,
3829    x_msg_count               OUT    NOCOPY NUMBER,
3830    x_msg_data                OUT    NOCOPY VARCHAR2
3831 )
3832 IS
3833 
3834   -- Procedure Description
3835   --
3836   -- If deletion of relation type is before then find and keep all parallel stages of object stage.
3837   -- If deletion of relation type is parallel then find and keep all parallel stages of subject stage and object stage.
3838   --
3839   -- Update all this parallel stages start date to a before stage planned end date or visit start date.
3840   --
3841   -- Call PROCESS_STAGE_DATES which will update all successor stages in hierarichy to correct stage start dates.
3842 
3843   /* cursor to get all parallel relations of a visit */
3844   Cursor c_parallel_stages_dets(vst_id IN NUMBER) IS
3845   SELECT distinct STAGE_LINK_ID,subject_ID,object_ID FROM
3846   ahl_stage_links ,AHL_VWP_STAGES_B
3847   WHERE RELATION_TYPE='PARALLEL'
3848   AND ( ahl_stage_links.subject_id=AHL_VWP_STAGES_B.stage_id OR ahl_stage_links.object_id=AHL_VWP_STAGES_B.stage_id)
3849   AND VISIT_ID =vst_id;
3850 
3851   l_parallel_stg_dets c_parallel_stages_dets%RowType;
3852 
3853 
3854   parallel_stage_ids PARALLEL_STAGE_ID_DETS;
3855 
3856   l_update_stage_id             NUMBER; -- temporary variable to keep stage id
3857 
3858   l_visit_start_date            DATE; -- temporary variable to keep visit start date
3859   l_prev_stage_planned_end_date DATE; -- temporary variable to keep max planned end date of previous stage
3860 
3861   l_stages_ovn_tbl     AHL_VWP_VISITS_STAGES_PVT.Visit_Stages_OVN_Tbl_Type;
3862 
3863   l_msg_data                    VARCHAR2(2000);
3864   l_msg_count                   NUMBER;
3865   l_return_status               VARCHAR2(1);
3866 
3867   L_API_VERSION                 CONSTANT NUMBER := 1.0;
3868   L_API_NAME                    CONSTANT VARCHAR2(30) := 'UPDATE_AS_STAGE_RULE_DEL';
3869   L_FULL_NAME                   CONSTANT VARCHAR2(60) := G_PKG_NAME || '.' || L_API_NAME;
3870   L_DEBUG            CONSTANT VARCHAR2(90) := 'ahl.plsql.'||L_FULL_NAME;
3871 
3872 BEGIN
3873 
3874    SAVEPOINT UPDATE_AS_STAGE_RULE_DEL;
3875 
3876    IF (l_log_procedure >= l_log_current_level) THEN
3877        fnd_log.string(l_log_procedure,L_DEBUG||'.begin','Start');
3878    END IF;
3879 
3880    --  Initialize API return status to success
3881    -- Initialize message list if p_init_msg_list is set to TRUE.
3882    IF FND_API.to_boolean(p_init_msg_list) THEN
3883       FND_MSG_PUB.initialize;
3884    END IF;
3885 
3886    --Initialize API return status to success
3887    x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
3888    l_return_status := x_return_status;
3889 
3890    -- Standard call to check for call compatibility.
3891    IF NOT FND_API.COMPATIBLE_API_CALL(l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
3892       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3893    END IF;
3894 
3895    select max(START_DATE_TIME) into l_visit_start_date from AHL_VISITS_VL where VISIT_ID = p_visit_id;
3896    IF p_relation_type = 'BEFORE' THEN -- BEFORE
3897 
3898       --Update prev_stage_num to null as current relation is going to be deleted.
3899        update AHL_VWP_STAGES_B set object_version_number=object_version_number+1,
3900                                    PREV_STAGE_NUM = NULL,
3901                                    LAST_UPDATE_DATE      = SYSDATE,
3902                                    LAST_UPDATED_BY       = Fnd_Global.USER_ID,
3903                                    LAST_UPDATE_LOGIN     = Fnd_Global.LOGIN_ID
3904                                    where STAGE_ID = p_object_id;
3905        IF (l_log_statement >= l_log_current_level) THEN
3906           fnd_log.string(l_log_statement,L_DEBUG,p_object_id||' stage id updated');
3907        END IF;
3908 
3909    END IF;
3910    IF l_visit_start_date is NOT NULL THEN -- PRAKKUM :: 02/06/2011 :: VWPE :: Fixed start date null issue on draft status visits
3911 
3912        IF p_relation_type = 'BEFORE' THEN -- BEFORE
3913 
3914 
3915             parallel_stage_ids(p_object_id) := true;
3916 
3917             parallel_stage_ids := Get_Stage_Parallel_Stages(parallel_stage_ids , p_visit_id );
3918 
3919 
3920        ELSE  -- PARALLEL
3921        --If deletion of relation type is parallel then find and keep all parallel stages of subject stage and object stage.
3922 
3923              parallel_stage_ids(p_subject_id) := true;
3924              parallel_stage_ids(p_object_id) := true;
3925 
3926              parallel_stage_ids := Get_Stage_Parallel_Stages(parallel_stage_ids , p_visit_id );
3927 
3928 
3929 
3930        END IF;
3931 
3932        --Update all this parallel stages start date to a before stage planned end date or visit start date.
3933        l_update_stage_id := parallel_stage_ids.FIRST;
3934        WHILE l_update_stage_id IS NOT NULL
3935        LOOP
3936 
3937             IF (l_log_statement >= l_log_current_level) THEN
3938                 fnd_log.string(l_log_statement,L_DEBUG,'Before planned end date calc ');
3939             END IF;
3940 
3941             --Get previous stage planned end date
3942             SELECT max(PLANNED_END_DATE) into l_prev_stage_planned_end_date from AHL_VWP_STAGES_B,AHL_STAGE_LINKS
3943             WHERE subject_ID = STAGE_ID AND RELATION_TYPE='BEFORE' AND object_ID=l_update_stage_id AND VISIT_ID=p_visit_id;
3944 
3945             IF (l_log_statement >= l_log_current_level) THEN
3946                 fnd_log.string(l_log_statement,L_DEBUG,'After planned end date calc ');
3947             END IF;
3948 
3949             IF l_prev_stage_planned_end_date is NULL THEN
3950                l_prev_stage_planned_end_date := l_visit_start_date;
3951             END IF;
3952 
3953             IF (l_log_statement >= l_log_current_level) THEN
3954                 fnd_log.string(l_log_statement,L_DEBUG,'Update stage start date is '||l_prev_stage_planned_end_date||' for stage '||l_update_stage_id);
3955             END IF;
3956 
3957             -- update stage start date to previous stage planned end date
3958             update AHL_VWP_STAGES_B set OBJECT_VERSION_NUMBER=OBJECT_VERSION_NUMBER+1,
3959                                         PLANNED_START_DATE=l_prev_stage_planned_end_date,
3960                                         LAST_UPDATE_DATE      = SYSDATE,
3961                                         LAST_UPDATED_BY       = Fnd_Global.USER_ID,
3962                                         LAST_UPDATE_LOGIN     = Fnd_Global.LOGIN_ID
3963                                         where STAGE_ID = l_update_stage_id;
3964             IF (l_log_statement >= l_log_current_level) THEN
3965                fnd_log.string(l_log_statement,L_DEBUG,l_update_stage_id||' stage id updated');
3966             END IF;
3967 
3968             l_update_stage_id := parallel_stage_ids.NEXT(l_update_stage_id);
3969 
3970        END LOOP;
3971 
3972    END IF;
3973 
3974    --If deletion of relation type is before then find and keep all parallel stages of object stage.
3975 
3976    IF (l_log_statement >= l_log_current_level) THEN
3977        fnd_log.string(l_log_statement,L_DEBUG,' Visit Id : '||p_visit_id);
3978    END IF;
3979 
3980    --Call PROCESS_STAGE_DATES which will update all successor stages in hierarichy to correct stage start dates.
3981    PROCESS_STAGE_DATES (
3982         p_visit_id        => p_visit_id,
3983         p_subject_id      => p_subject_id,
3984         p_object_id       => p_object_id,
3985         p_relation_type   => p_relation_type,
3986         p_operation_flag  => 'D',
3987         p_x_stages_ovn_tbl => l_stages_ovn_tbl,--VWPE 12730539:: PRAKKUM :: 08-JUL-2011
3988         x_return_status   => l_return_status,
3989         x_msg_count       => l_msg_count,
3990         x_msg_data        => l_msg_data);
3991 
3992 
3993    --------------------------End of API Body---------------------------------------
3994    IF (l_log_statement >= l_log_current_level) THEN
3995         fnd_log.string(l_log_statement,L_DEBUG,'After calling AHL_VWP_VISITS_STAGES_PVT.PROCESS_STAGE_DATES - l_return_status : '||l_return_status);
3996    END IF;
3997 
3998    IF l_msg_count > 0 OR NVL(l_return_status,'x') <> FND_API.G_RET_STS_SUCCESS THEN
3999     x_msg_count := l_msg_count;
4000     x_return_status := l_return_status;
4001     IF l_return_status = Fnd_Api.g_ret_sts_error THEN
4002       RAISE Fnd_Api.g_exc_error;
4003     ELSIF l_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
4004       RAISE Fnd_Api.g_exc_unexpected_error;
4005     END IF;
4006    END IF;
4007 
4008    l_msg_count := Fnd_Msg_Pub.count_msg;
4009    IF l_msg_count > 0 THEN
4010       X_msg_count := l_msg_count;
4011       X_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
4012       RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
4013    END IF;
4014 
4015    --Standard check for commit
4016    IF Fnd_Api.TO_BOOLEAN(p_commit) THEN
4017       COMMIT;
4018    END IF;
4019 
4020    IF (l_log_procedure >= l_log_current_level) THEN
4021        fnd_log.string(l_log_procedure,L_DEBUG||'.end','End');
4022    END IF;
4023 
4024 EXCEPTION
4025  WHEN Fnd_Api.G_EXC_ERROR THEN
4026    x_return_status := Fnd_Api.G_RET_STS_ERROR;
4027    ROLLBACK TO UPDATE_AS_STAGE_RULE_DEL;
4028    Fnd_Msg_Pub.count_and_get( p_count => x_msg_count,
4029                               p_data  => x_msg_data,
4030                               p_encoded => Fnd_Api.g_false);
4031  WHEN Fnd_Api.G_EXC_UNEXPECTED_ERROR THEN
4032    x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
4033    ROLLBACK TO UPDATE_AS_STAGE_RULE_DEL;
4034    Fnd_Msg_Pub.count_and_get( p_count => x_msg_count,
4035                               p_data  => x_msg_data,
4036                                p_encoded => Fnd_Api.g_false);
4037  WHEN OTHERS THEN
4038       ROLLBACK TO UPDATE_AS_STAGE_RULE_DEL;
4039       x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
4040       IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_unexp_error)
4041                 THEN
4042          Fnd_Msg_Pub.add_exc_msg (G_PKG_NAME, l_api_name);
4043       END IF;
4044       Fnd_Msg_Pub.count_and_get (
4045             p_encoded => Fnd_Api.g_false,
4046             p_count   => x_msg_count,
4047             p_data    => x_msg_data  );
4048 
4049 END UPDATE_AS_STAGE_RULE_DEL;
4050 
4051 --------------------------------------------------------------------
4052 -- PROCEDURE
4053 --    UPDATE_STAGE_DEPENDENCY_RULES
4054 --
4055 -- PURPOSE
4056 -- To change stage planned start date if it is later to calculated planned end date and to update all successor stage start dates accordingly.
4057 --------------------------------------------------------------------
4058 PROCEDURE UPDATE_STAGE_DEPENDENCY_RULES (
4059    p_stage_id                IN     NUMBER,
4060    p_visit_id                IN     NUMBER,
4061    p_x_stages_ovn_tbl        IN  OUT NOCOPY Visit_Stages_OVN_Tbl_Type,--VWPE 12730539:: PRAKKUM :: 08-JUL-2011
4062    x_return_status           OUT    NOCOPY VARCHAR2,
4063    x_msg_count               OUT    NOCOPY NUMBER,
4064    x_msg_data                OUT    NOCOPY VARCHAR2
4065 )
4066 IS
4067 
4068   -- Procedure Description
4069   --
4070   -- Since earliest start date of stage is changed, on each rule the stage belongs do
4071   --
4072   -- Call PROCESS_STAGE_DATES which will update all successor stages in hierarichy to correct stage start dates.
4073 
4074   --Cursor to fetch the stage number for the passed stage ID
4075   CURSOR c_stage_link_details(p_stage_id IN NUMBER)
4076   IS
4077   SELECT DISTINCT SUBJECT_ID, OBJECT_ID , RELATION_TYPE
4078   FROM AHL_STAGE_LINKS
4079   WHERE SUBJECT_ID =p_stage_id OR OBJECT_ID = p_stage_id;
4080 
4081   l_Stage_link_dets c_stage_link_details%RowType;
4082 
4083   L_API_VERSION                 CONSTANT NUMBER := 1.0;
4084   L_API_NAME                    CONSTANT VARCHAR2(30) := 'UPDATE_STAGE_DEPENDENCY_RULES';
4085   L_FULL_NAME                   CONSTANT VARCHAR2(60) := G_PKG_NAME || '.' || L_API_NAME;
4086   L_DEBUG                       CONSTANT VARCHAR2(90) := 'ahl.plsql.'||L_FULL_NAME;
4087 
4088   l_msg_data                    VARCHAR2(2000);
4089   l_msg_count                   NUMBER;
4090   l_return_status               VARCHAR2(1);
4091 
4092 -- PRAKKUM :: 03/06/2011 :: VWPE :: ER 12424063 :: Fixed issue in getting parallel stage :: START
4093 
4094   parallel_stage_ids        PARALLEL_STAGE_ID_DETS;
4095 
4096   --cursor to find whether previous stage end date is manually updated by user or not
4097   CURSOR c_get_user_upd_details(obj_id IN NUMBER) IS
4098    SELECT
4099    CASE WHEN SUBSTG.PLANNED_END_DATE <> OBJSTG.PLANNED_START_DATE THEN 'Y' ELSE 'N' END IS_USER_UPDATED, -- PRAKKUM :: 10/05/2012 :: Bug 13965577
4100     SUBSTG.STAGE_ID SUB_STAGE_ID,
4101     SUBSTG.PLANNED_END_DATE SUB_PLANNED_END_DATE ,
4102     SUBSTG.VISIT_ID SUB_VISIT_ID
4103    FROM (
4104     SELECT SUBJECT_ID,OBJECT_ID FROM AHL_STAGE_LINKS
4105     WHERE OBJECT_ID = obj_id AND RELATION_TYPE ='BEFORE'
4106    ) SRules,
4107    AHL_VWP_STAGES_B SUBSTG,
4108    AHL_VWP_STAGES_B OBJSTG
4109    WHERE SUBSTG.STAGE_ID = SRules.SUBJECT_ID AND OBJSTG.STAGE_ID = SRules.OBJECT_ID;
4110 
4111   -- To get all parallel stages under visit
4112   Cursor c_parallel_stages_dets(vst_id IN NUMBER) IS
4113   SELECT distinct STAGE_LINK_ID,subject_ID,object_ID FROM
4114   ahl_stage_links ,AHL_VWP_STAGES_B
4115   WHERE RELATION_TYPE='PARALLEL'
4116   AND ( ahl_stage_links.subject_id=AHL_VWP_STAGES_B.stage_id OR ahl_stage_links.object_id=AHL_VWP_STAGES_B.stage_id)
4117   AND VISIT_ID =vst_id;
4118 
4119   l_parallel_stg_dets c_parallel_stages_dets%RowType;
4120 
4121 
4122   --Cursor to get calculated stage start date
4123   Cursor c_get_stage_start_date_dets(vst_id IN NUMBER,stg_id IN NUMBER) IS
4124   SELECT VST.VISIT_ID,STAGE_ID,
4125   VST.department_id DEPT_ID, nvl(STG.duration,0) DURATION,
4126   CASE WHEN nvl(VST.start_date_time,STG.earliest_start_date) >= nvl(STG.earliest_start_date,VST.start_date_time)
4127      THEN VST.start_date_time ELSE STG.earliest_start_date END MAX_START_DATE
4128   from AHL_VISITS_B VST, AHL_VWP_STAGES_B STG
4129   WHERE VST.VISIT_ID = STG.VISIT_ID
4130   AND VST.VISIT_ID = vst_id
4131   AND STG.STAGE_ID = stg_id;
4132 
4133   l_stg_start_date_dets c_get_stage_start_date_dets%RowType;
4134 
4135   l_usr_upd_dets c_get_user_upd_details%RowType;
4136 
4137   l_process_stage_id    NUMBER;
4138   l_no_of_stage_rules   NUMBER :=0;
4139   l_planned_end_date    DATE;
4140 
4141 -- PRAKKUM :: 03/06/2011 :: VWPE :: ER 12424063 :: Fixed issue in getting parallel stage :: END
4142 
4143 BEGIN
4144 
4145    SAVEPOINT UPDATE_STAGE_DEPENDENCY_RULES;
4146 
4147    IF (l_log_procedure >= l_log_current_level) THEN
4148        fnd_log.string(l_log_procedure,L_DEBUG||'.begin','Start');
4149    END IF;
4150 
4151    --Initialize API return status to success
4152    x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
4153    l_return_status := x_return_status;
4154 
4155 
4156 
4157    FOR l_Stage_link_dets IN c_stage_link_details(p_stage_id)
4158    LOOP
4159 
4160       l_no_of_stage_rules := l_no_of_stage_rules+1;
4161 
4162       --Call PROCESS_STAGE_DATES which will update all successor stages in hierarichy to correct stage start dates.
4163       PROCESS_STAGE_DATES (
4164            p_visit_id       => p_visit_id,
4165            p_subject_id     => l_Stage_link_dets.subject_id,
4166            p_object_id      => l_Stage_link_dets.object_id,
4167            p_relation_type  => l_Stage_link_dets.relation_type,
4168            p_operation_flag => 'U' ,
4169            p_x_stages_ovn_tbl => p_x_stages_ovn_tbl,--VWPE 12730539:: PRAKKUM :: 08-JUL-2011
4170            x_return_status  => l_return_status,
4171            x_msg_count      => l_msg_count,
4172            x_msg_data       => l_msg_data);
4173 
4174       IF (l_log_statement >= l_log_current_level) THEN
4175         fnd_log.string(l_log_statement,L_DEBUG,'Stage rule : subject id:'||l_Stage_link_dets.subject_id||' object id:'||l_Stage_link_dets.object_id);
4176         fnd_log.string(l_log_statement,L_DEBUG,'After calling AHL_VWP_VISITS_STAGES_PVT.PROCESS_STAGE_DATES - l_return_status : '||l_return_status);
4177       END IF;
4178 
4179       IF l_msg_count > 0 OR NVL(l_return_status,'x') <> FND_API.G_RET_STS_SUCCESS THEN
4180         x_msg_count := l_msg_count;
4181         x_return_status := l_return_status;
4182         IF l_return_status = Fnd_Api.g_ret_sts_error THEN
4183           RAISE Fnd_Api.g_exc_error;
4184         ELSIF l_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
4185           RAISE Fnd_Api.g_exc_unexpected_error;
4186         END IF;
4187       END IF;
4188 
4189    END LOOP;
4190 
4191    -- If no stage rules, simply update stage start date with max earliest start date and visit start date
4192    IF l_no_of_stage_rules = 0 THEN
4193 
4194      OPEN c_get_stage_start_date_dets (p_visit_id, p_stage_id);
4195      FETCH c_get_stage_start_date_dets INTO l_stg_start_date_dets;
4196      IF c_get_stage_start_date_dets%FOUND AND l_stg_start_date_dets.DEPT_ID IS NOT NULL
4197             AND l_stg_start_date_dets.MAX_START_DATE IS NOT NULL THEN
4198 
4199          -- PRAKKUM :: 23-FEB-2011 :: Bug 13711800 :: Fix for Operational Visits
4200          l_planned_end_date := Compute_Stage_End_Date(p_visit_id, null, l_stg_start_date_dets.MAX_START_DATE, l_stg_start_date_dets.DEPT_ID, l_stg_start_date_dets.DURATION);
4201 
4202          UPDATE AHL_VWP_STAGES_B SET OBJECT_VERSION_NUMBER = OBJECT_VERSION_NUMBER+1,
4203                                      PLANNED_START_DATE = l_stg_start_date_dets.MAX_START_DATE,
4204                                      PLANNED_END_DATE = l_planned_end_date,
4205                                      LAST_UPDATE_DATE      = SYSDATE,
4206                                      LAST_UPDATED_BY       = Fnd_Global.USER_ID,
4207                                      LAST_UPDATE_LOGIN     = Fnd_Global.LOGIN_ID
4208                                      WHERE STAGE_ID = p_stage_id;
4209          IF (l_log_statement >= l_log_current_level) THEN
4210                fnd_log.string(l_log_statement,L_DEBUG,p_stage_id||' stage id updated');
4211          END IF;
4212 
4213      END IF;
4214      CLOSE c_get_stage_start_date_dets;
4215 
4216    END IF;
4217 
4218 -- PRAKKUM :: 03/06/2011 :: VWPE :: ER 12424063 :: Fixed issue in getting parallel stage :: START
4219 
4220    IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
4221       fnd_log.string(fnd_log.level_statement,L_DEBUG,' p_stage_id: '||p_stage_id);
4222    END IF;
4223    parallel_stage_ids(p_stage_id) := true;
4224 
4225 
4226    parallel_stage_ids := Get_Stage_Parallel_Stages(parallel_stage_ids , p_visit_id );
4227 
4228    --Loop to build IN string to use it in query
4229    l_process_stage_id := parallel_stage_ids.FIRST;
4230    WHILE l_process_stage_id IS NOT NULL
4231    LOOP
4232 
4233        IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
4234           fnd_log.string(fnd_log.level_statement,L_DEBUG,' l_process_stage_id: '||l_process_stage_id);
4235        END IF;
4236 
4237        OPEN c_get_user_upd_details (l_process_stage_id);
4238        FETCH c_get_user_upd_details INTO l_usr_upd_dets;
4239 
4240        IF c_get_user_upd_details%FOUND AND l_usr_upd_dets.IS_USER_UPDATED = 'Y' THEN
4241          CLOSE c_get_user_upd_details;
4242 
4243          IF (l_log_statement >= l_log_current_level) THEN
4244            fnd_log.string(l_log_statement,L_DEBUG,'IS_USER_UPDATED '||l_usr_upd_dets.IS_USER_UPDATED);
4245          END IF;
4246 
4247             UPDATE_SUCC_STG_START_DATES(
4248                 p_stage_id => l_usr_upd_dets.SUB_STAGE_ID,
4249                 p_visit_id => l_usr_upd_dets.SUB_VISIT_ID,
4250                 p_planned_end_date => l_usr_upd_dets.SUB_PLANNED_END_DATE,
4251                 p_x_stages_ovn_tbl => p_x_stages_ovn_tbl,--VWPE 12730539:: PRAKKUM :: 08-JUL-2011
4252                 p_caller_id         => 'P',
4253                 x_return_status     => l_return_status,
4254                 x_msg_count         => l_msg_count,
4255                 x_msg_data          => l_msg_data);
4256 
4257             IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
4258              fnd_log.string(fnd_log.level_statement,L_DEBUG,'After calling AHL_VWP_VISITS_STAGES_PVT.UPDATE_SUCC_STG_START_DATES - l_return_status : '||l_return_status);
4259             END IF;
4260 
4261             IF l_msg_count > 0 OR NVL(l_return_status,'x') <> FND_API.G_RET_STS_SUCCESS THEN
4262                x_msg_count := l_msg_count;
4263                x_return_status := l_return_status;
4264                IF l_return_status = Fnd_Api.g_ret_sts_error THEN
4265                  RAISE Fnd_Api.g_exc_error;
4266                ELSIF l_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
4267                  RAISE Fnd_Api.g_exc_unexpected_error;
4268                END IF;
4269             END IF;
4270        ELSE
4271           CLOSE c_get_user_upd_details;
4272        END IF;
4273 
4274        l_process_stage_id := parallel_stage_ids.NEXT(l_process_stage_id);
4275 
4276    END LOOP;
4277 
4278 -- PRAKKUM :: 03/06/2011 :: VWPE :: ER 12424063 :: Fixed issue in getting parallel stage :: END
4279 
4280    --------------------------End of API Body---------------------------------------
4281 
4282    l_msg_count := Fnd_Msg_Pub.count_msg;
4283    IF l_msg_count > 0 THEN
4284       X_msg_count := l_msg_count;
4285       X_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
4286       RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
4287    END IF;
4288 
4289    IF (l_log_procedure >= l_log_current_level) THEN
4290        fnd_log.string(l_log_procedure,L_DEBUG||'.end','End');
4291    END IF;
4292 
4293 EXCEPTION
4294  WHEN Fnd_Api.G_EXC_ERROR THEN
4295    x_return_status := Fnd_Api.G_RET_STS_ERROR;
4296    ROLLBACK TO UPDATE_STAGE_DEPENDENCY_RULES;
4297    Fnd_Msg_Pub.count_and_get( p_count => x_msg_count,
4298                               p_data  => x_msg_data,
4299                               p_encoded => Fnd_Api.g_false);
4300  WHEN Fnd_Api.G_EXC_UNEXPECTED_ERROR THEN
4301    x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
4302    ROLLBACK TO UPDATE_STAGE_DEPENDENCY_RULES;
4303    Fnd_Msg_Pub.count_and_get( p_count => x_msg_count,
4304                               p_data  => x_msg_data,
4305                                p_encoded => Fnd_Api.g_false);
4306  WHEN OTHERS THEN
4307       ROLLBACK TO UPDATE_STAGE_DEPENDENCY_RULES;
4308       x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
4309       IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_unexp_error)
4310                 THEN
4311          Fnd_Msg_Pub.add_exc_msg (G_PKG_NAME, l_api_name);
4312       END IF;
4313       Fnd_Msg_Pub.count_and_get (
4314             p_encoded => Fnd_Api.g_false,
4315             p_count   => x_msg_count,
4316             p_data    => x_msg_data  );
4317 
4318 END UPDATE_STAGE_DEPENDENCY_RULES;
4319 
4320 --------------------------------------------------------------------
4321 -- PROCEDURE
4322 --    UPDATE_STG_RUL_HIERARCHY
4323 --
4324 -- PURPOSE
4325 -- To recalculate planned start and end date of all successor stages of a stages that involve in dependency deletion considering duration as a base
4326 --------------------------------------------------------------------
4327 PROCEDURE UPDATE_STG_RUL_HIERARCHY (
4328    p_api_version             IN     NUMBER,
4329    p_init_msg_list           IN     VARCHAR2  := Fnd_Api.g_false,
4330    p_commit                  IN     VARCHAR2  := Fnd_Api.g_false,
4331    p_validation_level        IN     NUMBER    := Fnd_Api.g_valid_level_full,
4332    p_module_type             IN     VARCHAR2  := 'JSP',
4333 
4334    p_stage_link_id           IN     NUMBER,
4335    p_visit_id                IN     NUMBER,
4336 
4337    x_return_status           OUT    NOCOPY VARCHAR2,
4338    x_msg_count               OUT    NOCOPY NUMBER,
4339    x_msg_data                OUT    NOCOPY VARCHAR2
4340 )
4341 IS
4342 
4343   -- Procedure Description
4344   --
4345   --   Update previous stage number and planned start date to previous stage end date or visit start date
4346   --
4347   -- Call PROCESS_STAGE_DATES which will update all successor stages in hierarichy to correct stage start dates.
4348 
4349   --Cursor to fetch the stage number for the passed stage ID
4350   CURSOR c_stage_details(p_stage_id IN NUMBER)
4351   IS
4352   SELECT STAGE_NUM , PLANNED_END_DATE
4353   FROM AHL_VWP_STAGES_B
4354   WHERE stage_id = p_stage_id;
4355 
4356   -- To find stage link details
4357   CURSOR c_stage_link_dets (x_id IN NUMBER)
4358   IS
4359   SELECT * FROM AHL_STAGE_LINKS
4360   WHERE STAGE_LINK_ID = x_id;
4361 
4362   -- Cursor to fetch prev stage number
4363   CURSOR c_get_prev_stage_dets (p_stage_id IN NUMBER)
4364   IS
4365   SELECT PREV_STAGE_NUM FROM AHL_VWP_STAGES_B
4366   WHERE STAGE_ID = p_stage_id;
4367 
4368   l_prev_stg_num                NUMBER;
4369 
4370   l_Stage_link_dets c_stage_link_dets%RowType;
4371 
4372   l_stage_rule_record Stage_Rule_Rec_Type;
4373 
4374   l_prev_stage_planned_end_date DATE;
4375 
4376   l_stg_stage_number            NUMBER;
4377 
4378   l_prev_stage_id               NUMBER;
4379   l_update_stage_id             NUMBER;
4380 
4381   l_is_stages_parallel          BOOLEAN default false;
4382   l_stages_ovn_tbl     AHL_VWP_VISITS_STAGES_PVT.Visit_Stages_OVN_Tbl_Type;
4383 
4384   L_API_VERSION                 CONSTANT NUMBER := 1.0;
4385   L_API_NAME                    CONSTANT VARCHAR2(30) := 'UPDATE_STG_RUL_HIERARCHY';
4386   L_FULL_NAME                   CONSTANT VARCHAR2(60) := G_PKG_NAME || '.' || L_API_NAME;
4387   L_DEBUG                       CONSTANT VARCHAR2(90) := 'ahl.plsql.'||L_FULL_NAME;
4388 
4389   l_msg_data                    VARCHAR2(2000);
4390   l_msg_count                   NUMBER;
4391   l_return_status               VARCHAR2(1);
4392 
4393 BEGIN
4394 
4395    SAVEPOINT UPDATE_STG_RUL_HIERARCHY;
4396 
4397    IF (l_log_procedure >= l_log_current_level) THEN
4398        fnd_log.string(l_log_procedure,L_DEBUG||'.begin','Start');
4399    END IF;
4400 
4401    --  Initialize API return status to success
4402    -- Initialize message list if p_init_msg_list is set to TRUE.
4403    IF FND_API.to_boolean(p_init_msg_list) THEN
4404       FND_MSG_PUB.initialize;
4405    END IF;
4406 
4407    --Initialize API return status to success
4408    x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
4409    l_return_status := x_return_status;
4410 
4411    -- Standard call to check for call compatibility.
4412    IF NOT FND_API.COMPATIBLE_API_CALL(l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
4413      RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4414    END IF;
4415 
4416    OPEN c_stage_link_dets(p_stage_link_id);
4417    FETCH c_stage_link_dets INTO l_Stage_link_dets;
4418    CLOSE c_stage_link_dets;
4419 
4420    IF l_Stage_link_dets.STAGE_LINK_ID IS NULL THEN
4421         Fnd_Message.SET_NAME('AHL','AHL_VWP_STG_RUL_NFOUND');
4422         Fnd_Msg_Pub.ADD;
4423         RAISE Fnd_Api.G_EXC_ERROR;
4424    END IF;
4425 
4426    l_is_stages_parallel := false;
4427 
4428    IF(l_Stage_link_dets.relation_type = 'BEFORE') Then -- If Before relation set prev stage number as subject id
4429         l_prev_stage_id := l_Stage_link_dets.subject_ID;
4430         l_update_stage_id := l_Stage_link_dets.object_ID;
4431    ELSIF(l_Stage_link_dets.relation_type = 'AFTER') Then -- If After relation set prev stage number as object id
4432         l_prev_stage_id := l_Stage_link_dets.object_ID;
4433         l_update_stage_id := l_Stage_link_dets.subject_ID;
4434    ELSE
4435         -- Considered as parallel
4436         l_update_stage_id := l_Stage_link_dets.subject_ID;
4437         l_prev_stage_id := l_Stage_link_dets.object_ID; -- Considered as parallel
4438         l_is_stages_parallel := true;
4439    END IF;
4440 
4441    IF (l_log_statement >= l_log_current_level) THEN
4442       fnd_log.string(l_log_statement,L_DEBUG,' For Stage ' || l_update_stage_id ||' Prev Stage Number is ' ||  l_prev_stage_id);
4443    END IF;
4444 
4445    --Update previous stage number and planned start date to previous stage end date or visit start date
4446    IF NOT l_is_stages_parallel THEN
4447 
4448            OPEN c_stage_details (l_prev_stage_id);
4449            FETCH c_stage_details INTO l_stg_stage_number,l_prev_stage_planned_end_date;
4450            CLOSE c_stage_details;
4451 
4452            IF l_stg_stage_number IS NULL THEN
4453                 Fnd_Message.SET_NAME('AHL','AHL_VSP_STG_INVALID_ID');
4454                 Fnd_Msg_Pub.ADD;
4455                 RAISE Fnd_Api.G_EXC_ERROR;
4456            END IF;
4457 
4458            IF (l_log_statement >= l_log_current_level) THEN
4459               fnd_log.string(l_log_statement,L_DEBUG,' Previous stage num is '||l_stg_stage_number);
4460               fnd_log.string(l_log_statement,L_DEBUG,' Previous stage end date is '||l_prev_stage_planned_end_date);
4461            END IF;
4462 
4463            OPEN c_get_prev_stage_dets(l_update_stage_id);
4464            FETCH c_get_prev_stage_dets INTO l_prev_stg_num;
4465            CLOSE c_get_prev_stage_dets;
4466 
4467            IF (l_log_statement >= l_log_current_level) THEN
4468               fnd_log.string(l_log_statement,L_DEBUG,' l_prev_stg_num is '||l_prev_stg_num);
4469            END IF;
4470 
4471            --IF l_prev_stg_num is NULL THEN
4472 
4473                 /*update AHL_VWP_STAGES_B set object_version_number=object_version_number+1,
4474                          PLANNED_START_DATE=l_prev_stage_planned_end_date,
4475                          PREV_STAGE_NUM = l_stg_stage_number,
4476                          LAST_UPDATE_DATE      = SYSDATE,
4477                          LAST_UPDATED_BY       = Fnd_Global.USER_ID,
4478                          LAST_UPDATE_LOGIN     = Fnd_Global.LOGIN_ID
4479                          where STAGE_ID = l_update_stage_id;
4480                 IF (l_log_statement >= l_log_current_level) THEN
4481                   fnd_log.string(l_log_statement,L_DEBUG,l_update_stage_id||' stage id updated');
4482                 END IF;*/
4483 
4484            IF l_prev_stg_num is NOT NULL THEN -- Two predessors validation
4485               IF l_prev_stg_num <> l_stg_stage_number THEN
4486                 Fnd_Message.SET_NAME('AHL','AHL_VWP_RULE_PREDECESSOR');
4487                 Fnd_Msg_Pub.ADD;
4488                 RAISE Fnd_Api.G_EXC_ERROR;
4489               END IF;
4490            END IF;
4491 
4492    END IF;
4493 
4494    l_stage_rule_record.subject_STAGE_ID  := l_Stage_link_dets.subject_ID;
4495    l_stage_rule_record.object_STAGE_ID := l_Stage_link_dets.object_ID;
4496    l_stage_rule_record.RELATION_TYPE    := l_Stage_link_dets.RELATION_TYPE;
4497 
4498    IF l_stage_rule_record.subject_STAGE_ID = l_stage_rule_record.object_STAGE_ID THEN
4499         Fnd_Message.SET_NAME('AHL','AHL_VWP_STG_INVALID_RULE');
4500         Fnd_Msg_Pub.ADD;
4501         RAISE Fnd_Api.G_EXC_ERROR;
4502    END IF;
4503 
4504    VALIDATE_STAGE_RULES(
4505           p_stage_rule_rec          => l_stage_rule_record,
4506           x_return_status           => l_return_status,
4507           x_msg_count               => l_msg_count,
4508           x_msg_data                => l_msg_data
4509    );
4510 
4511    IF (l_log_statement >= l_log_current_level) THEN
4512         fnd_log.string(l_log_statement,L_DEBUG,'After calling AHL_VWP_VISITS_STAGES_PVT.VALIDATE_STAGE_RULES - l_return_status : '||l_return_status);
4513    END IF;
4514 
4515    IF l_msg_count > 0 OR NVL(l_return_status,'x') <> FND_API.G_RET_STS_SUCCESS THEN
4516      x_msg_count := l_msg_count;
4517      x_return_status := l_return_status;
4518      IF l_return_status = Fnd_Api.g_ret_sts_error THEN
4519        RAISE Fnd_Api.g_exc_error;
4520      ELSIF l_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
4521        RAISE Fnd_Api.g_exc_unexpected_error;
4522      END IF;
4523    END IF;
4524 
4525    --Call PROCESS_STAGE_DATES which will update all successor stages in hierarichy to correct stage start dates.
4526    PROCESS_STAGE_DATES (
4527            p_visit_id       => p_visit_id,
4528            p_subject_id     => l_prev_stage_id,
4529            p_object_id      => l_update_stage_id,
4530            p_relation_type  => l_Stage_link_dets.relation_type,
4531            p_operation_flag => 'U' ,
4532            p_x_stages_ovn_tbl => l_stages_ovn_tbl,--VWPE 12730539:: PRAKKUM :: 08-JUL-2011
4533            x_return_status  => l_return_status,
4534            x_msg_count      => l_msg_count,
4535            x_msg_data       => l_msg_data);
4536 
4537 
4538    --------------------------End of API Body---------------------------------------
4539    IF (l_log_statement >= l_log_current_level) THEN
4540         fnd_log.string(l_log_statement,L_DEBUG,'After calling AHL_VWP_VISITS_STAGES_PVT.PROCESS_STAGE_DATES - l_return_status : '||l_return_status);
4541    END IF;
4542 
4543    IF l_msg_count > 0 OR NVL(l_return_status,'x') <> FND_API.G_RET_STS_SUCCESS THEN
4544      x_msg_count := l_msg_count;
4545      x_return_status := l_return_status;
4546      IF l_return_status = Fnd_Api.g_ret_sts_error THEN
4547        RAISE Fnd_Api.g_exc_error;
4548      ELSIF l_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
4549        RAISE Fnd_Api.g_exc_unexpected_error;
4550      END IF;
4551    END IF;
4552 
4553    --Update previous stage number and planned start date to previous stage end date or visit start date
4554    IF NOT l_is_stages_parallel THEN
4555 
4556           UPDATE_SUCC_STG_START_DATES(
4557               p_stage_id          => l_prev_stage_id,
4558               p_visit_id          => p_visit_id,
4559               p_planned_end_date  => l_prev_stage_planned_end_date,
4560               p_x_stages_ovn_tbl  => l_stages_ovn_tbl,--VWPE 12730539:: PRAKKUM :: 08-JUL-2011
4561               p_caller_id         => 'R',
4562               x_return_status     => l_return_status,
4563               x_msg_count         => l_msg_count,
4564               x_msg_data          => l_msg_data);
4565 
4566           IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
4567            fnd_log.string(fnd_log.level_statement,L_DEBUG,'After calling AHL_VWP_VISITS_STAGES_PVT.UPDATE_SUCC_STG_START_DATES - l_return_status : '||l_return_status);
4568           END IF;
4569 
4570           IF l_msg_count > 0 OR NVL(l_return_status,'x') <> FND_API.G_RET_STS_SUCCESS THEN
4571              x_msg_count := l_msg_count;
4572              x_return_status := l_return_status;
4573              IF l_return_status = Fnd_Api.g_ret_sts_error THEN
4574                RAISE Fnd_Api.g_exc_error;
4575              ELSIF l_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
4576                RAISE Fnd_Api.g_exc_unexpected_error;
4577              END IF;
4578           END IF;
4579 
4580    END IF;
4581 
4582    l_msg_count := Fnd_Msg_Pub.count_msg;
4583    IF l_msg_count > 0 THEN
4584       X_msg_count := l_msg_count;
4585       X_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
4586       RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
4587    END IF;
4588 
4589    --Standard check for commit
4590    IF Fnd_Api.TO_BOOLEAN(p_commit) THEN
4591       COMMIT;
4592    END IF;
4593 
4594    IF (l_log_procedure >= l_log_current_level) THEN
4595        fnd_log.string(l_log_procedure,L_DEBUG||'.end','End');
4596    END IF;
4597 
4598 EXCEPTION
4599  WHEN Fnd_Api.G_EXC_ERROR THEN
4600    x_return_status := Fnd_Api.G_RET_STS_ERROR;
4601    ROLLBACK TO UPDATE_STG_RUL_HIERARCHY;
4602    Fnd_Msg_Pub.count_and_get( p_count => x_msg_count,
4603                               p_data  => x_msg_data,
4604                               p_encoded => Fnd_Api.g_false);
4605  WHEN Fnd_Api.G_EXC_UNEXPECTED_ERROR THEN
4606    x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
4607    ROLLBACK TO UPDATE_STG_RUL_HIERARCHY;
4608    Fnd_Msg_Pub.count_and_get( p_count => x_msg_count,
4609                               p_data  => x_msg_data,
4610                                p_encoded => Fnd_Api.g_false);
4611  WHEN OTHERS THEN
4612       ROLLBACK TO UPDATE_STG_RUL_HIERARCHY;
4613       x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
4614       IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_unexp_error)
4615                 THEN
4616          Fnd_Msg_Pub.add_exc_msg (G_PKG_NAME, l_api_name);
4617       END IF;
4618       Fnd_Msg_Pub.count_and_get (
4619             p_encoded => Fnd_Api.g_false,
4620             p_count   => x_msg_count,
4621             p_data    => x_msg_data  );
4622 
4623 END UPDATE_STG_RUL_HIERARCHY;
4624 
4625 --------------------------------------------------------------------
4626 -- PROCEDURE
4627 --    PROCESS_STAGE_DATES
4628 --
4629 -- PURPOSE
4630 -- To recalculate planned start and end date of all successor stages of a stages that involve dependency considering duration as a base.
4631 -- This is a common method which will be called whenever a stage rule is created/updated/deleted or to reset start date and end dates of all stages under a visit.
4632 --------------------------------------------------------------------
4633 PROCEDURE PROCESS_STAGE_DATES (
4634    p_visit_id                IN NUMBER,
4635    p_subject_id              IN NUMBER,
4636    p_object_id               IN NUMBER,
4637    p_relation_type           IN VARCHAR2,
4638    p_operation_flag          IN VARCHAR2,
4639    p_x_stages_ovn_tbl        IN  OUT NOCOPY Visit_Stages_OVN_Tbl_Type,--VWPE 12730539:: PRAKKUM :: 08-JUL-2011
4640    x_return_status           OUT    NOCOPY VARCHAR2,
4641    x_msg_count               OUT    NOCOPY NUMBER,
4642    x_msg_data                OUT    NOCOPY VARCHAR2
4643 )
4644 IS
4645 
4646   -- Procedure Description
4647   -- Get all stage dependency rules under a visit.
4648   -- Get all stage duration and start date details.
4649   -- Call CALC_STAGE_START_DURATIONS which will calculation repective stage start dates in respect to duration
4650   -- If stage dependency details is null, then consider as resetting all visit stage start and planned end dates. So set valid stages to all stages and update stage dates.
4651   -- If stage dependency details is not null, then get valid stages to recalculate and update stage start and planned end dates accordingly.
4652   --
4653   -- One special case is if dependency rule is getting deleted and rule is parallel then getting valid stage list and updating those need to be call on both object stage and subject stage.
4654 
4655   --cursor to fetch stage details
4656   cursor c_stage_dets (x_id IN NUMBER)
4657   IS
4658   select rownum as INDEX_ID, STAGE_ID, DURATION, PLANNED_START_DATE,
4659   --nvl(stg.earliest_start_date,vst.start_date_time) stage_start_date ,
4660   case when nvl(stg.earliest_start_date,vst.start_date_time) > vst.start_date_time THEN
4661     stg.earliest_start_date
4662   ELSE
4663     nvl(vst.start_date_time,stg.earliest_start_date)
4664   END stage_start_date , -- PRAKKUM :: 08-JUL-2011 :: VWPE 12730539 :: Stage start date w.r.t visit start date
4665   vst.department_id
4666   from ahl_vwp_stages_b stg,
4667   ahl_visits_vl vst
4668   WHERE
4669   vst.visit_id = stg.visit_id AND vst.VISIT_ID = x_id;
4670 
4671   --cursor to fetch visit details
4672   cursor c_visit_dets (x_id IN NUMBER)
4673   IS
4674   select DEPARTMENT_ID,START_DATE_TIME,STATUS_CODE,VISIT_TYPE_CODE,AHL_VWP_VISITS_PVT.Is_Old_Visit(VISIT_ID) IS_OLD_VISIT
4675   , CASE WHEN UNIT_SCHEDULE_ID IS NOT NULL THEN 'Y' ELSE 'N' END IS_OPERATIONAL_VISIT
4676   from ahl_visits_vl
4677   WHERE VISIT_ID = x_id;-- PRAKKUM :: 13-FEB-2011 :: Bug 13711800
4678 
4679   l_visit_limited_dets c_visit_dets%RowType;
4680 
4681   cursor c_stage_rules_count (p_visit_id IN NUMBER)
4682   IS
4683   SELECT count(1) as cnt
4684    FROM
4685    AHL_STAGE_LINKS STG_LK,AHL_VWP_STAGES_B STG
4686    WHERE ( STG.STAGE_ID = STG_LK.subject_ID OR STG.STAGE_ID = STG_LK.object_ID )
4687    AND STG.VISIT_ID = p_visit_id;
4688   /*
4689   --cursor to find stages whose earliest start date not wintinh stage planned start date and end dates
4690   cursor c_get_invalid_stage_numbers(vst_id IN NUMBER) IS
4691   SELECT STAGE_NUM FROM AHL_VWP_STAGES_B WHERE VISIT_ID =vst_id
4692   AND
4693   (( PLANNED_END_DATE IS NOT NULL AND earliest_start_date IS NOT NULL AND earliest_start_date>PLANNED_END_DATE )
4694     OR
4695   ( PLANNED_START_DATE IS NOT NULL AND earliest_start_date IS NOT NULL AND earliest_start_date<PLANNED_START_DATE ));
4696 
4697   --To hold invalid stage numbers
4698   invalid_stage_numbers c_get_invalid_stage_numbers%RowType;*/
4699 
4700   l_empty_details          Stage_Details;
4701   l_stages_links           Relation_Details;
4702   l_stages_dets            Stage_Details;
4703   l_valid_stages           Stage_Details;
4704   l_stage_relations_lookup Stage_Relations;
4705 
4706   l_stage_dets             Stage_Record;
4707 
4708   l_current_rel_rec        Relation_Record;
4709 
4710   l_relations_count        NUMBER default 0;
4711   l_visit_start_date       DATE;
4712   l_dept_id                NUMBER;
4713   l_visit_type_code        VARCHAR2(30);
4714 
4715   L_START_FROM_STAGE_ID    NUMBER;
4716 
4717   l_isValidationFailed     BOOLEAN DEFAULT FALSE;
4718 
4719   L_API_VERSION            CONSTANT NUMBER := 1.0;
4720   L_API_NAME               CONSTANT VARCHAR2(30) := 'PROCESS_STAGE_DATES';
4721   L_FULL_NAME              CONSTANT VARCHAR2(60) := G_PKG_NAME || '.' || L_API_NAME;
4722   L_DEBUG                  CONSTANT VARCHAR2(90) := 'ahl.plsql.'||L_FULL_NAME;
4723 
4724   l_msg_data               VARCHAR2(2000);
4725   l_msg_count              NUMBER;
4726   l_return_status          VARCHAR2(1);
4727 
4728 BEGIN
4729 
4730    IF (l_log_procedure >= l_log_current_level) THEN
4731        fnd_log.string(l_log_procedure,L_DEBUG||'.begin','Start');
4732    END IF;
4733 
4734    --Initialize API return status to success
4735    x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
4736    l_return_status := x_return_status;
4737 
4738    OPEN c_visit_dets(p_visit_id);
4739    FETCH c_visit_dets INTO l_visit_limited_dets;
4740    CLOSE c_visit_dets;
4741 
4742    l_dept_id := l_visit_limited_dets.DEPARTMENT_ID;
4743    l_visit_start_date := l_visit_limited_dets.START_DATE_TIME;
4744 
4745    IF (l_log_statement >= l_log_current_level) THEN
4746         fnd_log.string(l_log_statement,L_DEBUG,' Visit Id : '||p_visit_id);
4747         fnd_log.string(l_log_statement,L_DEBUG,' Dept Id : '||l_dept_id);
4748    END IF;
4749 
4750    IF l_visit_limited_dets.status_code='DRAFT' AND (l_dept_id IS NULL OR l_visit_start_date IS NULL OR (l_visit_limited_dets.visit_type_code IS NULL AND l_visit_limited_dets.IS_OLD_VISIT <> 'Y')) THEN
4751 
4752         -- On a draft visit if anything above seems null then stop processing and make all date calculations to null
4753         UPDATE AHL_VWP_STAGES_B set object_version_number=object_version_number+1,
4754                                     PLANNED_START_DATE=null,
4755                                     PLANNED_END_DATE=null,
4756                                     LAST_UPDATE_DATE      = SYSDATE,
4757                                     LAST_UPDATED_BY       = Fnd_Global.USER_ID,
4758                                     LAST_UPDATE_LOGIN     = Fnd_Global.LOGIN_ID
4759                                     WHERE VISIT_ID =p_visit_id;
4760         RETURN;
4761 
4762    ELSE
4763 
4764         IF l_dept_id IS NULL THEN
4765             IF (l_log_statement >= l_log_current_level) THEN
4766                fnd_log.string(l_log_statement,L_DEBUG,' No Dept Id' );
4767             END IF;
4768             Fnd_Message.SET_NAME('AHL','AHL_VWP_VST_NO_DEP');
4769             Fnd_Msg_Pub.ADD;
4770             RAISE Fnd_Api.G_EXC_ERROR;
4771         END IF;
4772 
4773         IF l_visit_start_date IS NULL THEN
4774             IF (l_log_statement >= l_log_current_level) THEN
4775                fnd_log.string(l_log_statement,L_DEBUG,' No visit start date' );
4776             END IF;
4777             Fnd_Message.SET_NAME('AHL','AHL_LTP_VISIT_ST_DATE_NULL');
4778             Fnd_Msg_Pub.ADD;
4779             RAISE Fnd_Api.G_EXC_ERROR;
4780         END IF;
4781 
4782         IF ( l_visit_limited_dets.visit_type_code IS NULL AND l_visit_limited_dets.IS_OLD_VISIT <> 'Y' ) THEN
4783         IF (l_log_statement >= l_log_current_level) THEN
4784                fnd_log.string(l_log_statement,L_DEBUG,' No visit type code' );
4785             END IF;
4786             Fnd_Message.SET_NAME('AHL','AHL_VWP_VST_TYPE_MAND');
4787             Fnd_Msg_Pub.ADD;
4788             RAISE Fnd_Api.G_EXC_ERROR;
4789         END IF;
4790 
4791    END IF;
4792 
4793    OPEN c_stage_rules_count(p_visit_id);
4794    FETCH c_stage_rules_count INTO l_relations_count;
4795    CLOSE c_stage_rules_count;
4796 
4797    IF (l_log_statement >= l_log_current_level) THEN
4798         fnd_log.string(l_log_statement,L_DEBUG,' Stage rules count is '||l_relations_count);
4799    END IF;
4800 
4801    IF l_relations_count IS NULL OR l_relations_count=0 THEN
4802         --Update stages start date to null and return , since there is no rules defined between any of stages
4803         UPDATE AHL_VWP_STAGES_B
4804            set OBJECT_VERSION_NUMBER=OBJECT_VERSION_NUMBER+1,
4805                PLANNED_START_DATE=l_visit_start_date,
4806                PLANNED_END_DATE=Compute_Stage_End_Date(p_visit_id,
4807                                 l_visit_limited_dets.IS_OPERATIONAL_VISIT,
4808                                 l_visit_start_date, l_dept_id, DURATION ),-- PRAKKUM :: 23-FEB-2011 :: Bug 13711800 :: Fix for Operational Visits
4809                LAST_UPDATE_DATE      = SYSDATE,
4810                LAST_UPDATED_BY       = Fnd_Global.USER_ID,
4811                LAST_UPDATE_LOGIN     = Fnd_Global.LOGIN_ID
4812                WHERE VISIT_ID =p_visit_id;
4813                --PRAKKUM :: Bug 13817921 :: 07/03/2012 :: Commented since below condition not updating stage start dates even on department change
4814                --AND ( PLANNED_START_DATE IS NULL OR PLANNED_START_DATE<>l_visit_start_date );-- To update only stages whose start date is not equals to visit start date
4815 
4816            -- PRAKKUM :: 06-APR-2011 :: Bug 13711800 :: START
4817 
4818            IF (l_log_statement >= l_log_current_level) THEN
4819                    fnd_log.string(l_log_statement,L_DEBUG,'Before calling AHL_VWP_VISITS_STAGES_PVT.VALIDATE_STAGE_DATES ');
4820            END IF;
4821 
4822            VALIDATE_STAGE_DATES( p_visit_id          => p_visit_id,
4823                                  x_return_status     => l_return_status,
4824                                  x_msg_count         => l_msg_count,
4825                                  x_msg_data          => l_msg_data);
4826 
4827            IF (l_log_statement >= l_log_current_level) THEN
4828               fnd_log.string(l_log_statement,L_DEBUG,'After calling AHL_VWP_VISITS_STAGES_PVT.VALIDATE_STAGE_DATES - l_return_status : '||l_return_status);
4829            END IF;
4830 
4831            IF l_msg_count > 0 OR NVL(l_return_status,'x') <> FND_API.G_RET_STS_SUCCESS THEN
4832                x_msg_count := l_msg_count;
4833                x_return_status := l_return_status;
4834                IF l_return_status = Fnd_Api.g_ret_sts_error THEN
4835                  RAISE Fnd_Api.g_exc_error;
4836                ELSIF l_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
4837                  RAISE Fnd_Api.g_exc_unexpected_error;
4838                END IF;
4839            END IF;
4840            -- PRAKKUM :: 06-APR-2011 :: Bug 13711800 :: END
4841 
4842         return;--No relations to do process
4843    END IF;
4844 
4845    IF (l_log_statement >= l_log_current_level) THEN
4846         fnd_log.string(l_log_statement,L_DEBUG,' Before fetch stage links');
4847    END IF;
4848 
4849    SELECT distinct STG_LK.subject_ID, STG_LK.object_ID, STG_LK.RELATION_TYPE
4850    BULK COLLECT INTO l_stages_links
4851    FROM
4852    AHL_STAGE_LINKS STG_LK,AHL_VWP_STAGES_B STG
4853    WHERE ( STG.STAGE_ID = STG_LK.subject_ID OR STG.STAGE_ID = STG_LK.object_ID )
4854    AND STG.VISIT_ID = p_visit_id;
4855 
4856    IF (l_log_statement >= l_log_current_level) THEN
4857         fnd_log.string(l_log_statement,L_DEBUG,' Stage links fetched');
4858    END IF;
4859 
4860    FOR l_stage_dets IN c_stage_dets(p_visit_id)
4861    LOOP
4862         l_stages_dets(l_stage_dets.STAGE_ID) := l_stage_dets; -- Indexed By stage id
4863    END LOOP;
4864 
4865    IF (l_log_statement >= l_log_current_level) THEN
4866         fnd_log.string(l_log_statement,L_DEBUG,' Stage details fetched');
4867    END IF;
4868 
4869    l_relations_count := l_stages_links.count;
4870    FOR I in 1 .. l_relations_count
4871    LOOP
4872         l_current_rel_rec := l_stages_links(I);
4873 
4874         IF 'PARALLEL' = l_current_rel_rec.RELATION_TYPE THEN
4875 
4876                 IF (l_log_statement >= l_log_current_level) THEN
4877                     fnd_log.string(l_log_statement,L_DEBUG,' Relation'||l_current_rel_rec.subject_ID||':'||l_current_rel_rec.object_ID||' is PARALLEL');
4878                 END IF;
4879 
4880                 l_stage_relations_lookup(l_current_rel_rec.subject_ID||':'||l_current_rel_rec.object_ID) := 'PARALLEL'; -- PARALLEL
4881                 l_stage_relations_lookup(l_current_rel_rec.object_ID||':'||l_current_rel_rec.subject_ID) := 'PARALLEL'; -- PARALLEL
4882 
4883         ELSIF 'BEFORE' = l_current_rel_rec.RELATION_TYPE THEN
4884 
4885                 IF (l_log_statement >= l_log_current_level) THEN
4886                     fnd_log.string(l_log_statement,L_DEBUG,' Relation'||l_current_rel_rec.subject_ID||':'||l_current_rel_rec.object_ID||' is BEFORE');
4887                 END IF;
4888 
4889                 l_stage_relations_lookup(l_current_rel_rec.subject_ID||':'||l_current_rel_rec.object_ID) := 'BEFORE'; -- BEFORE
4890 
4891         END IF;
4892    END LOOP;
4893 
4894    IF (l_log_statement >= l_log_current_level) THEN
4895         fnd_log.string(l_log_statement,L_DEBUG,' Stage relations populated as a lookup');
4896         fnd_log.string(l_log_statement,L_DEBUG,' Before call to process stage rules');
4897    END IF;
4898 
4899    CALC_STAGE_START_DURATIONS (
4900            p_visit_id         => p_visit_id,-- PRAKKUM :: 13-FEB-2011 :: Bug 13711800
4901            p_relations        => l_stages_links,
4902            p_x_stages         => l_stages_dets,
4903            x_return_status    => l_return_status,
4904            x_msg_count        => l_msg_count,
4905            x_msg_data         => l_msg_data);
4906 
4907    IF (l_log_statement >= l_log_current_level) THEN
4908         fnd_log.string(l_log_statement,L_DEBUG,'After calling AHL_VWP_VISITS_STAGES_PVT.CALC_STAGE_START_DURATIONS - l_return_status : '||l_return_status);
4909    END IF;
4910 
4911    IF l_msg_count > 0 OR NVL(l_return_status,'x') <> FND_API.G_RET_STS_SUCCESS THEN
4912      x_msg_count := l_msg_count;
4913      x_return_status := l_return_status;
4914      IF l_return_status = Fnd_Api.g_ret_sts_error THEN
4915        RAISE Fnd_Api.g_exc_error;
4916      ELSIF l_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
4917        RAISE Fnd_Api.g_exc_unexpected_error;
4918      END IF;
4919    END IF;
4920 
4921    IF (l_log_statement >= l_log_current_level) THEN
4922         fnd_log.string(l_log_statement,L_DEBUG,' After call to process stage rules');
4923    END IF;
4924 
4925    IF p_subject_id is NULL AND p_object_id is NULL AND p_relation_type is NULL THEN
4926 
4927         IF (l_log_statement >= l_log_current_level) THEN
4928            fnd_log.string(l_log_statement,L_DEBUG,' Set valid stages list');
4929         END IF;
4930 
4931         l_valid_stages := l_stages_dets; -- All stage are valid for updation
4932 
4933         IF (l_log_statement >= l_log_current_level) THEN
4934            fnd_log.string(l_log_statement,L_DEBUG,' Before call to update stage dates');
4935         END IF;
4936 
4937         UPDATE_STAGE_DATES (
4938                 p_visit_id         => p_visit_id,-- PRAKKUM :: 13-FEB-2011 :: Bug 13711800
4939                 p_base_stage_id    => NULL,
4940                 P_visit_start_date => l_visit_start_date,
4941                 p_dept_id          => l_dept_id,
4942                 p_valid_stages     => l_valid_stages,
4943                 p_x_stages_ovn_tbl => p_x_stages_ovn_tbl,--VWPE 12730539:: PRAKKUM :: 08-JUL-2011
4944                 x_return_status    => l_return_status,
4945                 x_msg_count        => l_msg_count,
4946                 x_msg_data         => l_msg_data);
4947 
4948         IF (l_log_statement >= l_log_current_level) THEN
4949              fnd_log.string(l_log_statement,L_DEBUG,'After calling AHL_VWP_VISITS_STAGES_PVT.UPDATE_STAGE_DATES - l_return_status : '||l_return_status);
4950         END IF;
4951 
4952         IF l_msg_count > 0 OR NVL(l_return_status,'x') <> FND_API.G_RET_STS_SUCCESS THEN
4953          x_msg_count := l_msg_count;
4954          x_return_status := l_return_status;
4955          IF l_return_status = Fnd_Api.g_ret_sts_error THEN
4956            RAISE Fnd_Api.g_exc_error;
4957          ELSIF l_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
4958            RAISE Fnd_Api.g_exc_unexpected_error;
4959          END IF;
4960         END IF;
4961 
4962         IF (l_log_statement >= l_log_current_level) THEN
4963            fnd_log.string(l_log_statement,L_DEBUG,' After call to update stage dates');
4964         END IF;
4965 
4966    ELSIF p_subject_id is NOT NULL AND p_object_id is NOT NULL AND p_relation_type is NOT NULL THEN
4967 
4968         IF 'PARALLEL' = p_relation_type AND UPPER(p_operation_flag) = 'D' THEN -- On deletion of parallel rule
4969 
4970            IF (l_log_statement >= l_log_current_level) THEN
4971               fnd_log.string(l_log_statement,L_DEBUG,' Before call to get valid stages list');
4972            END IF;
4973 
4974            GET_VALID_STAGES_LIST ( p_stage_id => p_subject_id,
4975                                 p_all_stage_details => l_stages_dets,
4976                                 p_stage_relations   => l_stage_relations_lookup,
4977                                 p_x_valid_stages    => l_valid_stages,
4978                                 x_return_status     => l_return_status,
4979                                 x_msg_count         => l_msg_count,
4980                                 x_msg_data          => l_msg_data);
4981 
4982            IF (l_log_statement >= l_log_current_level) THEN
4983              fnd_log.string(l_log_statement,L_DEBUG,'After calling AHL_VWP_VISITS_STAGES_PVT.GET_VALID_STAGES_LIST - l_return_status : '||l_return_status);
4984            END IF;
4985 
4986            IF l_msg_count > 0 OR NVL(l_return_status,'x') <> FND_API.G_RET_STS_SUCCESS THEN
4987              x_msg_count := l_msg_count;
4988              x_return_status := l_return_status;
4989              IF l_return_status = Fnd_Api.g_ret_sts_error THEN
4990                RAISE Fnd_Api.g_exc_error;
4991              ELSIF l_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
4992                RAISE Fnd_Api.g_exc_unexpected_error;
4993              END IF;
4994            END IF;
4995 
4996            IF (l_log_statement >= l_log_current_level) THEN
4997               fnd_log.string(l_log_statement,L_DEBUG,' After call to get valid stages list');
4998               fnd_log.string(l_log_statement,L_DEBUG,' Before call to update stage dates');
4999            END IF;
5000 
5001            UPDATE_STAGE_DATES ( p_visit_id          => p_visit_id,-- PRAKKUM :: 13-FEB-2011 :: Bug 13711800
5002                                 p_base_stage_id     => p_subject_id,
5003                                 p_visit_start_date  => l_visit_start_date,
5004                                 p_dept_id           => l_dept_id,
5005                                 p_valid_stages      => l_valid_stages,
5006                                 p_x_stages_ovn_tbl => p_x_stages_ovn_tbl,--VWPE 12730539:: PRAKKUM :: 08-JUL-2011
5007                                 x_return_status     => l_return_status,
5008                                 x_msg_count         => l_msg_count,
5009                                 x_msg_data          => l_msg_data);
5010 
5011            IF (l_log_statement >= l_log_current_level) THEN
5012                fnd_log.string(l_log_statement,L_DEBUG,'After calling AHL_VWP_VISITS_STAGES_PVT.UPDATE_STAGE_DATES - l_return_status : '||l_return_status);
5013                fnd_log.string(l_log_statement,L_DEBUG,'After call to update stage dates');
5014            END IF;
5015 
5016            IF l_msg_count > 0 OR NVL(l_return_status,'x') <> FND_API.G_RET_STS_SUCCESS THEN
5017              x_msg_count := l_msg_count;
5018              x_return_status := l_return_status;
5019              IF l_return_status = Fnd_Api.g_ret_sts_error THEN
5020                RAISE Fnd_Api.g_exc_error;
5021              ELSIF l_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
5022                RAISE Fnd_Api.g_exc_unexpected_error;
5023              END IF;
5024            END IF;
5025 
5026            l_valid_stages := l_empty_details;
5027 
5028            IF (l_log_statement >= l_log_current_level) THEN
5029                fnd_log.string(l_log_statement,L_DEBUG,'Before call to get valid stages list');
5030            END IF;
5031 
5032            GET_VALID_STAGES_LIST ( p_stage_id       => p_object_id,
5033                                 p_all_stage_details => l_stages_dets,
5034                                 p_stage_relations   => l_stage_relations_lookup,
5035                                 p_x_valid_stages    => l_valid_stages,
5036                                 x_return_status     => l_return_status,
5037                                 x_msg_count         => l_msg_count,
5038                                 x_msg_data          => l_msg_data);
5039 
5040            IF (l_log_statement >= l_log_current_level) THEN
5041              fnd_log.string(l_log_statement,L_DEBUG,'After calling AHL_VWP_VISITS_STAGES_PVT.GET_VALID_STAGES_LIST - l_return_status : '||l_return_status);
5042            END IF;
5043 
5044            IF l_msg_count > 0 OR NVL(l_return_status,'x') <> FND_API.G_RET_STS_SUCCESS THEN
5045              x_msg_count := l_msg_count;
5046              x_return_status := l_return_status;
5047              IF l_return_status = Fnd_Api.g_ret_sts_error THEN
5048                RAISE Fnd_Api.g_exc_error;
5049              ELSIF l_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
5050                RAISE Fnd_Api.g_exc_unexpected_error;
5051              END IF;
5052            END IF;
5053 
5054            IF (l_log_statement >= l_log_current_level) THEN
5055                fnd_log.string(l_log_statement,L_DEBUG,'After call to get valid stages list');
5056                fnd_log.string(l_log_statement,L_DEBUG,'Before call to update stage dates');
5057            END IF;
5058 
5059            UPDATE_STAGE_DATES ( p_visit_id          => p_visit_id,-- PRAKKUM :: 13-FEB-2011 :: Bug 13711800
5060                                 p_base_stage_id     => p_object_id,
5061                                 p_visit_start_date  => l_visit_start_date,
5062                                 p_dept_id           => l_dept_id,
5063                                 p_valid_stages      => l_valid_stages,
5064                                 p_x_stages_ovn_tbl  => p_x_stages_ovn_tbl,--VWPE 12730539:: PRAKKUM :: 08-JUL-2011
5065                                 x_return_status     => l_return_status,
5066                                 x_msg_count         => l_msg_count,
5067                                 x_msg_data          => l_msg_data);
5068            IF (l_log_statement >= l_log_current_level) THEN
5069              fnd_log.string(l_log_statement,L_DEBUG,'After calling AHL_VWP_VISITS_STAGES_PVT.UPDATE_STAGE_DATES - l_return_status : '||l_return_status);
5070            END IF;
5071 
5072            IF l_msg_count > 0 OR NVL(l_return_status,'x') <> FND_API.G_RET_STS_SUCCESS THEN
5073              x_msg_count := l_msg_count;
5074              x_return_status := l_return_status;
5075              IF l_return_status = Fnd_Api.g_ret_sts_error THEN
5076                RAISE Fnd_Api.g_exc_error;
5077              ELSIF l_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
5078                RAISE Fnd_Api.g_exc_unexpected_error;
5079              END IF;
5080            END IF;
5081 
5082            IF (l_log_statement >= l_log_current_level) THEN
5083                fnd_log.string(l_log_statement,L_DEBUG,'After call to update stage dates');
5084            END IF;
5085 
5086         ELSE
5087 
5088            IF (l_log_statement >= l_log_current_level) THEN
5089                fnd_log.string(l_log_statement,L_DEBUG,'Before call to get valid stages list');
5090            END IF;
5091            GET_VALID_STAGES_LIST ( p_stage_id       => p_object_id,
5092                                 p_all_stage_details => l_stages_dets,
5093                                 p_stage_relations   => l_stage_relations_lookup,
5094                                 p_x_valid_stages    => l_valid_stages,
5095                                 x_return_status     => l_return_status,
5096                                 x_msg_count         => l_msg_count,
5097                                 x_msg_data          => l_msg_data);
5098            IF (l_log_statement >= l_log_current_level) THEN
5099              fnd_log.string(l_log_statement,L_DEBUG,'After calling AHL_VWP_VISITS_STAGES_PVT.GET_VALID_STAGES_LIST - l_return_status : '||l_return_status);
5100            END IF;
5101 
5102            IF l_msg_count > 0 OR NVL(l_return_status,'x') <> FND_API.G_RET_STS_SUCCESS THEN
5103              x_msg_count := l_msg_count;
5104              x_return_status := l_return_status;
5105              IF l_return_status = Fnd_Api.g_ret_sts_error THEN
5106                RAISE Fnd_Api.g_exc_error;
5107              ELSIF l_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
5108                RAISE Fnd_Api.g_exc_unexpected_error;
5109              END IF;
5110            END IF;
5111 
5112            IF (l_log_statement >= l_log_current_level) THEN
5113                fnd_log.string(l_log_statement,L_DEBUG,'After call to get valid stages list');
5114                fnd_log.string(l_log_statement,L_DEBUG,'Before call to update stage dates');
5115            END IF;
5116 
5117            UPDATE_STAGE_DATES ( p_visit_id          => p_visit_id,-- PRAKKUM :: 13-FEB-2011 :: Bug 13711800
5118                                 p_base_stage_id     => p_object_id,
5119                                 p_visit_start_date  => l_visit_start_date,
5120                                 p_dept_id           => l_dept_id,
5121                                 p_valid_stages      => l_valid_stages,
5122                                 p_x_stages_ovn_tbl  => p_x_stages_ovn_tbl,--VWPE 12730539:: PRAKKUM :: 08-JUL-2011
5123                                 x_return_status     => l_return_status,
5124                                 x_msg_count         => l_msg_count,
5125                                 x_msg_data          => l_msg_data);
5126            IF (l_log_statement >= l_log_current_level) THEN
5127              fnd_log.string(l_log_statement,L_DEBUG,'After calling AHL_VWP_VISITS_STAGES_PVT.UPDATE_STAGE_DATES - l_return_status : '||l_return_status);
5128            END IF;
5129 
5130            IF l_msg_count > 0 OR NVL(l_return_status,'x') <> FND_API.G_RET_STS_SUCCESS THEN
5131              x_msg_count := l_msg_count;
5132              x_return_status := l_return_status;
5133              IF l_return_status = Fnd_Api.g_ret_sts_error THEN
5134                RAISE Fnd_Api.g_exc_error;
5135              ELSIF l_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
5136                RAISE Fnd_Api.g_exc_unexpected_error;
5137              END IF;
5138            END IF;
5139 
5140            IF (l_log_statement >= l_log_current_level) THEN
5141                fnd_log.string(l_log_statement,L_DEBUG,'After call to update stage dates');
5142            END IF;
5143 
5144         END IF;
5145 
5146    ELSE
5147 
5148         IF (l_log_statement >= l_log_current_level) THEN
5149            fnd_log.string(l_log_statement,L_DEBUG,'Invalid stage rule');
5150         END IF;
5151 
5152         Fnd_Message.SET_NAME('AHL','AHL_VWP_MAND_STG_RULE');
5153         Fnd_Msg_Pub.ADD;
5154         RAISE Fnd_Api.G_EXC_ERROR;
5155 
5156    END IF;
5157 
5158    -- PRAKKUM :: 13-FEB-2011 :: Bug 13711800 :: START
5159 
5160    IF (l_log_statement >= l_log_current_level) THEN
5161            fnd_log.string(l_log_statement,L_DEBUG,'Before calling AHL_VWP_VISITS_STAGES_PVT.VALIDATE_STAGE_DATES ');
5162    END IF;
5163 
5164    VALIDATE_STAGE_DATES( p_visit_id          => p_visit_id,
5165                          x_return_status     => l_return_status,
5166                          x_msg_count         => l_msg_count,
5167                          x_msg_data          => l_msg_data);
5168 
5169    IF (l_log_statement >= l_log_current_level) THEN
5170       fnd_log.string(l_log_statement,L_DEBUG,'After calling AHL_VWP_VISITS_STAGES_PVT.VALIDATE_STAGE_DATES - l_return_status : '||l_return_status);
5171    END IF;
5172 
5173    IF l_msg_count > 0 OR NVL(l_return_status,'x') <> FND_API.G_RET_STS_SUCCESS THEN
5174        x_msg_count := l_msg_count;
5175        x_return_status := l_return_status;
5176        IF l_return_status = Fnd_Api.g_ret_sts_error THEN
5177          RAISE Fnd_Api.g_exc_error;
5178        ELSIF l_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
5179          RAISE Fnd_Api.g_exc_unexpected_error;
5180        END IF;
5181    END IF;
5182    -- PRAKKUM :: 13-FEB-2011 :: Bug 13711800 :: END
5183 
5184   IF l_isValidationFailed THEN
5185     RAISE Fnd_Api.G_EXC_ERROR;
5186   END IF;
5187 
5188   --Standard check to count messages
5189   l_msg_count := Fnd_Msg_Pub.count_msg;
5190   IF l_msg_count > 0 THEN
5191       X_msg_count := l_msg_count;
5192       X_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
5193       RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
5194   END IF;
5195 
5196   IF (l_log_procedure >= l_log_current_level) THEN
5197        fnd_log.string(l_log_procedure,L_DEBUG||'.end','End');
5198   END IF;
5199 
5200 EXCEPTION
5201  WHEN Fnd_Api.G_EXC_ERROR THEN
5202    x_return_status := Fnd_Api.G_RET_STS_ERROR;
5203    Fnd_Msg_Pub.count_and_get( p_count => x_msg_count,
5204                               p_data  => x_msg_data,
5205                               p_encoded => Fnd_Api.g_false);
5206  WHEN Fnd_Api.G_EXC_UNEXPECTED_ERROR THEN
5207    x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
5208    Fnd_Msg_Pub.count_and_get( p_count => x_msg_count,
5209                               p_data  => x_msg_data,
5210                                p_encoded => Fnd_Api.g_false);
5211  WHEN OTHERS THEN
5212       x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
5213       IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_unexp_error)
5214                 THEN
5215          Fnd_Msg_Pub.add_exc_msg (G_PKG_NAME, l_api_name);
5216       END IF;
5217       Fnd_Msg_Pub.count_and_get (
5218             p_encoded => Fnd_Api.g_false,
5219             p_count   => x_msg_count,
5220             p_data    => x_msg_data  );
5221 
5222 END PROCESS_STAGE_DATES;
5223 
5224 --------------------------------------------------------------------
5225 -- PROCEDURE
5226 --    CALC_STAGE_START_DURATIONS
5227 --
5228 -- PURPOSE
5229 -- To calculate stage start dates in respect to duration considering all stage dependency rules into account
5230 --------------------------------------------------------------------
5231 PROCEDURE CALC_STAGE_START_DURATIONS (
5232    p_visit_id             IN     NUMBER,-- PRAKKUM :: 13-FEB-2011 :: Bug 13711800
5233    p_relations            IN     Relation_Details,
5234    p_x_stages             IN OUT NOCOPY Stage_Details,
5235 
5236    x_return_status           OUT    NOCOPY VARCHAR2,
5237    x_msg_count               OUT    NOCOPY NUMBER,
5238    x_msg_data                OUT    NOCOPY VARCHAR2
5239 )
5240 IS
5241   -- Procedure Description
5242   -- This procedure recursively called until no stage relation violating the dates.
5243   -- Apply all rules and calc dates. If any dirty call this procedure again.
5244 
5245    l_dirtyFlag             BOOLEAN default false;
5246    l_relations_count       INTEGER;
5247 
5248    l_subject_details       Stage_Record;
5249    l_object_details        Stage_Record;
5250    l_current_rel_rec       Relation_Record;
5251 
5252     -- Define local Variables
5253    L_API_VERSION           CONSTANT NUMBER := 1.0;
5254    L_API_NAME              CONSTANT VARCHAR2(30) := 'CALC_STAGE_START_DURATIONS';
5255    L_FULL_NAME             CONSTANT VARCHAR2(60) := G_PKG_NAME || '.' || L_API_NAME;
5256    L_DEBUG                 CONSTANT VARCHAR2(90) := 'ahl.plsql.'||L_FULL_NAME;
5257 
5258    l_msg_data              VARCHAR2(2000);
5259    l_msg_count             NUMBER;
5260    l_return_status         varchar2(1);
5261    l_computed_date         DATE;
5262 
5263 BEGIN
5264 
5265    IF (l_log_procedure >= l_log_current_level) THEN
5266        fnd_log.string(l_log_procedure,L_DEBUG||'.begin','Start');
5267    END IF;
5268 
5269    --Initialize API return status to success
5270    x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
5271    l_return_status := x_return_status;
5272 
5273    l_dirtyFlag := false;
5274    l_relations_count := p_relations.COUNT;
5275 
5276    IF (l_log_statement >= l_log_current_level) THEN
5277        fnd_log.string(l_log_statement,L_DEBUG,'l_relations_count ' ||l_relations_count );
5278    END IF;
5279 
5280    FOR I in 1 .. l_relations_count
5281    LOOP
5282 
5283         l_current_rel_rec := p_relations(I);
5284 
5285         l_subject_details := p_x_stages(l_current_rel_rec.subject_ID);
5286 
5287         l_object_details := p_x_stages(l_current_rel_rec.object_ID);
5288 
5289         IF 'PARALLEL' = l_current_rel_rec.RELATION_TYPE THEN
5290 
5291            -- Max date will be considered and override the other stage duration to this max value
5292 
5293            IF l_subject_details.CALCULATED_START_TIME > l_object_details.CALCULATED_START_TIME THEN
5294 
5295                 p_x_stages(l_current_rel_rec.object_ID).CALCULATED_START_TIME := l_subject_details.CALCULATED_START_TIME;
5296                 l_dirtyFlag := true;
5297 
5298            ELSIF l_subject_details.CALCULATED_START_TIME < l_object_details.CALCULATED_START_TIME THEN
5299 
5300                 p_x_stages(l_current_rel_rec.subject_ID).CALCULATED_START_TIME := l_object_details.CALCULATED_START_TIME;
5301                 l_dirtyFlag := true;
5302 
5303            END IF;
5304 
5305         ELSIF 'BEFORE' = l_current_rel_rec.RELATION_TYPE THEN
5306 
5307                 -- Set object stage total duration to subject stage duration plus total duration
5308 
5309                 -- PRAKKUM :: 23-FEB-2011 :: Bug 13711800 :: Fix for Operational Visits
5310                 l_computed_date := Compute_Stage_End_Date(p_visit_id, null, l_subject_details.CALCULATED_START_TIME, l_subject_details.DEPARTMENT_ID , l_subject_details.DURATION );
5311 
5312                 IF l_object_details.CALCULATED_START_TIME < l_computed_date THEN
5313 
5314                    p_x_stages(l_current_rel_rec.object_ID).CALCULATED_START_TIME := ( l_computed_date );
5315                    l_dirtyFlag := true;
5316 
5317                 END IF;
5318 
5319         END IF;
5320 
5321    END LOOP;
5322 
5323    IF l_dirtyFlag THEN
5324 
5325         IF (l_log_statement >= l_log_current_level) THEN
5326            fnd_log.string(l_log_statement,L_DEBUG,'Before Recursive call to CALC_STAGE_START_DURATIONS');
5327         END IF;
5328 
5329         CALC_STAGE_START_DURATIONS (
5330            p_visit_id       => p_visit_id,-- PRAKKUM :: 13-FEB-2011 :: Bug 13711800
5331            p_relations      => p_relations,
5332            p_x_stages       => p_x_stages,
5333            x_return_status  => l_return_status,
5334            x_msg_count      => l_msg_count,
5335            x_msg_data       => l_msg_data);
5336 
5337         IF (l_log_statement >= l_log_current_level) THEN
5338            fnd_log.string(l_log_statement,L_DEBUG,'After calling AHL_VWP_VISITS_STAGES_PVT.CALC_STAGE_START_DURATIONS - l_return_status : '||l_return_status);
5339         END IF;
5340 
5341         IF l_msg_count > 0 OR NVL(l_return_status,'x') <> FND_API.G_RET_STS_SUCCESS THEN
5342           x_msg_count := l_msg_count;
5343           x_return_status := l_return_status;
5344           IF l_return_status = Fnd_Api.g_ret_sts_error THEN
5345             RAISE Fnd_Api.g_exc_error;
5346           ELSIF l_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
5347             RAISE Fnd_Api.g_exc_unexpected_error;
5348           END IF;
5349         END IF;
5350 
5351         IF (l_log_statement >= l_log_current_level) THEN
5352            fnd_log.string(l_log_statement,L_DEBUG,'After Recursive call to CALC_STAGE_START_DURATIONS');
5353         END IF;
5354 
5355    END IF;
5356 
5357    --Standard check to count messages
5358    l_msg_count := Fnd_Msg_Pub.count_msg;
5359    IF l_msg_count > 0 THEN
5360       X_msg_count := l_msg_count;
5361       X_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
5362       RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
5363    END IF;
5364 
5365    IF (l_log_procedure >= l_log_current_level) THEN
5366        fnd_log.string(l_log_procedure,L_DEBUG||'.end','End');
5367    END IF;
5368 
5369 EXCEPTION
5370  WHEN Fnd_Api.G_EXC_ERROR THEN
5371    x_return_status := Fnd_Api.G_RET_STS_ERROR;
5372    Fnd_Msg_Pub.count_and_get( p_count => x_msg_count,
5373                               p_data  => x_msg_data,
5374                               p_encoded => Fnd_Api.g_false);
5375  WHEN Fnd_Api.G_EXC_UNEXPECTED_ERROR THEN
5376    x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
5377    Fnd_Msg_Pub.count_and_get( p_count => x_msg_count,
5378                               p_data  => x_msg_data,
5379                                p_encoded => Fnd_Api.g_false);
5380  WHEN OTHERS THEN
5381       x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
5382       IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_unexp_error)
5383                 THEN
5384          Fnd_Msg_Pub.add_exc_msg (G_PKG_NAME, l_api_name);
5385       END IF;
5386       Fnd_Msg_Pub.count_and_get (
5387             p_encoded => Fnd_Api.g_false,
5388             p_count   => x_msg_count,
5389             p_data    => x_msg_data  );
5390 
5391 END CALC_STAGE_START_DURATIONS;
5392 
5393 --------------------------------------------------------------------
5394 -- PROCEDURE
5395 --    GET_VALID_STAGES_LIST
5396 --
5397 -- PURPOSE
5398 -- To return valid stages that need to be update with the new start dates and planned end dates in the hierarichy
5399 --------------------------------------------------------------------
5400 PROCEDURE GET_VALID_STAGES_LIST (
5401    p_stage_id             IN NUMBER,
5402    p_all_stage_details    IN Stage_Details,
5403    p_stage_relations      IN Stage_Relations,
5404    p_x_valid_stages       IN OUT NOCOPY Stage_Details,
5405 
5406    x_return_status           OUT    NOCOPY VARCHAR2,
5407    x_msg_count               OUT    NOCOPY NUMBER,
5408    x_msg_data                OUT    NOCOPY VARCHAR2
5409 )
5410 IS
5411     l_empty_details       Stage_Details;
5412     l_stage_id            NUMBER;
5413     l_obj_stage_id        NUMBER;
5414 
5415     l_stages_count        INTEGER;
5416     l_is_valid_stage      BOOLEAN default false;
5417 
5418     L_API_VERSION         CONSTANT NUMBER := 1.0;
5419     L_API_NAME            CONSTANT VARCHAR2(30) := 'GET_VALID_STAGES_LIST';
5420     L_FULL_NAME           CONSTANT VARCHAR2(60) := G_PKG_NAME || '.' || L_API_NAME;
5421     L_DEBUG            CONSTANT VARCHAR2(90) := 'ahl.plsql.'||L_FULL_NAME;
5422 
5423    l_msg_data             VARCHAR2(2000);
5424    l_msg_count            NUMBER;
5425    l_return_status        VARCHAR2(1);
5426 
5427 BEGIN
5428 
5429    IF (l_log_procedure >= l_log_current_level) THEN
5430        fnd_log.string(l_log_procedure,L_DEBUG||'.begin','Start');
5431    END IF;
5432 
5433    --Initialize API return status to success
5434    x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
5435    l_return_status := x_return_status;
5436 
5437    IF (l_log_statement >= l_log_current_level) THEN
5438       fnd_log.string(l_log_statement,L_DEBUG,'Stage count '||p_all_stage_details.count);
5439       fnd_log.string(l_log_statement,L_DEBUG,'Valid Stages count before '||p_x_valid_stages.count);
5440       fnd_log.string(l_log_statement,L_DEBUG,'Stage id '||p_stage_id);
5441    END IF;
5442 
5443    p_x_valid_stages(p_stage_id) := p_all_stage_details(p_stage_id);
5444 
5445    IF (l_log_statement >= l_log_current_level) THEN
5446       fnd_log.string(l_log_statement,L_DEBUG,'Valid Stages count after '||p_x_valid_stages.count);
5447    END IF;
5448 
5449    l_obj_stage_id := p_all_stage_details.FIRST;
5450    WHILE l_obj_stage_id IS NOT NULL
5451    LOOP
5452 
5453         IF (l_log_statement >= l_log_current_level) THEN
5454            fnd_log.string(l_log_statement,L_DEBUG,'In iteration - stage id '||l_obj_stage_id);
5455         END IF;
5456 
5457         IF (NOT p_x_valid_stages.EXISTS(l_obj_stage_id)) THEN
5458 
5459              l_is_valid_stage := false;
5460              IF (l_log_statement >= l_log_current_level) THEN
5461                 fnd_log.string(l_log_statement,L_DEBUG,'Processing relation '||p_stage_id||':'||l_obj_stage_id);
5462              END IF;
5463 
5464              IF p_stage_relations.EXISTS(p_stage_id||':'||l_obj_stage_id) THEN
5465                 IF (l_log_statement >= l_log_current_level) THEN
5466                    fnd_log.string(l_log_statement,L_DEBUG,'Relation Exisits');
5467                 END IF;
5468                 IF p_stage_relations(p_stage_id||':'||l_obj_stage_id)='BEFORE' THEN -- BEFORE RELATION
5469                    l_is_valid_stage := true;
5470                 ELSIF p_stage_relations(p_stage_id||':'||l_obj_stage_id)='PARALLEL' THEN -- PARALLEL RELATION
5471                    l_is_valid_stage := true;
5472                 END IF;
5473              END IF;
5474 
5475              IF l_is_valid_stage THEN
5476                 IF (l_log_statement >= l_log_current_level) THEN
5477                    fnd_log.string(l_log_statement,L_DEBUG,'Before Recursive call to GET_VALID_STAGES_LIST');
5478                 END IF;
5479                 -- Make call only if stage is not processed
5480                 GET_VALID_STAGES_LIST ( p_stage_id => l_obj_stage_id,
5481                                 p_all_stage_details => p_all_stage_details,
5482                                 p_stage_relations => p_stage_relations,
5483                                 p_x_valid_stages => p_x_valid_stages,
5484                                 x_return_status => l_return_status,
5485                                 x_msg_count => l_msg_count,
5486                                 x_msg_data => l_msg_data);
5487                 IF (l_log_statement >= l_log_current_level) THEN
5488                    fnd_log.string(l_log_statement,L_DEBUG,'After Recursive call to GET_VALID_STAGES_LIST');
5489                 END IF;
5490 
5491                 IF (l_log_statement >= l_log_current_level) THEN
5492                     fnd_log.string(l_log_statement,L_DEBUG,'After calling AHL_VWP_VISITS_STAGES_PVT.GET_VALID_STAGES_LIST - l_return_status : '||l_return_status);
5493                 END IF;
5494 
5495                 IF l_msg_count > 0 OR NVL(l_return_status,'x') <> FND_API.G_RET_STS_SUCCESS THEN
5496                   x_msg_count := l_msg_count;
5497                   x_return_status := l_return_status;
5498                   IF l_return_status = Fnd_Api.g_ret_sts_error THEN
5499                     RAISE Fnd_Api.g_exc_error;
5500                   ELSIF l_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
5501                     RAISE Fnd_Api.g_exc_unexpected_error;
5502                   END IF;
5503                 END IF;
5504              END IF;
5505 
5506         END IF;
5507 
5508         l_obj_stage_id := p_all_stage_details.NEXT(l_obj_stage_id);
5509 
5510    END LOOP;
5511 
5512    --Standard check to count messages
5513    l_msg_count := Fnd_Msg_Pub.count_msg;
5514    IF l_msg_count > 0 THEN
5515       X_msg_count := l_msg_count;
5516       X_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
5517       RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
5518    END IF;
5519 
5520    IF (l_log_procedure >= l_log_current_level) THEN
5521        fnd_log.string(l_log_procedure,L_DEBUG||'.end','End');
5522    END IF;
5523 
5524 EXCEPTION
5525  WHEN Fnd_Api.G_EXC_ERROR THEN
5526    x_return_status := Fnd_Api.G_RET_STS_ERROR;
5527    Fnd_Msg_Pub.count_and_get( p_count => x_msg_count,
5528                               p_data  => x_msg_data,
5529                               p_encoded => Fnd_Api.g_false);
5530  WHEN Fnd_Api.G_EXC_UNEXPECTED_ERROR THEN
5531    x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
5532    Fnd_Msg_Pub.count_and_get( p_count => x_msg_count,
5533                               p_data  => x_msg_data,
5534                                p_encoded => Fnd_Api.g_false);
5535  WHEN OTHERS THEN
5536       x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
5537       IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_unexp_error)
5538                 THEN
5539          Fnd_Msg_Pub.add_exc_msg (G_PKG_NAME, l_api_name);
5540       END IF;
5541       Fnd_Msg_Pub.count_and_get (
5542             p_encoded => Fnd_Api.g_false,
5543             p_count   => x_msg_count,
5544             p_data    => x_msg_data  );
5545 
5546 
5547 END GET_VALID_STAGES_LIST;
5548 
5549 --------------------------------------------------------------------
5550 -- PROCEDURE
5551 --    UPDATE_STAGE_DATES
5552 --
5553 -- PURPOSE
5554 -- On all valid stages calculate dates taking duration into account and update accordingly
5555 --------------------------------------------------------------------
5556 PROCEDURE UPDATE_STAGE_DATES (
5557    p_visit_id                IN NUMBER,        -- PRAKKUM :: 13-FEB-2011 :: Bug 13711800
5558    p_base_stage_id           IN NUMBER,
5559    p_visit_start_date        IN DATE,
5560    p_dept_id                 IN NUMBER,
5561    p_valid_stages            IN Stage_Details ,
5562    p_x_stages_ovn_tbl        IN  OUT NOCOPY Visit_Stages_OVN_Tbl_Type,--VWPE 12730539:: PRAKKUM :: 08-JUL-2011
5563    x_return_status           OUT    NOCOPY VARCHAR2,
5564    x_msg_count               OUT    NOCOPY NUMBER,
5565    x_msg_data                OUT    NOCOPY VARCHAR2
5566 )
5567 IS
5568    l_stage_id            NUMBER;
5569    l_base_start_time     DATE;
5570    l_relative_duration   NUMBER;
5571 
5572    l_max_start_date_time DATE;
5573    l_current_stage_rec   Stage_Record;
5574 
5575    l_stage_start_date    DATE;
5576    l_stage_end_date      DATE;
5577 
5578    L_API_VERSION         CONSTANT NUMBER := 1.0;
5579    L_API_NAME            CONSTANT VARCHAR2(30) := 'UPDATE_STAGE_DATES';
5580    L_FULL_NAME           CONSTANT VARCHAR2(60) := G_PKG_NAME || '.' || L_API_NAME;
5581    L_DEBUG               CONSTANT VARCHAR2(90) := 'ahl.plsql.'||L_FULL_NAME;
5582    l_msg_data            VARCHAR2(2000);
5583    l_msg_count           NUMBER;
5584    l_return_status       VARCHAR2(1);
5585 
5586 BEGIN
5587 
5588    IF (l_log_procedure >= l_log_current_level) THEN
5589        fnd_log.string(l_log_procedure,L_DEBUG||'.begin','Start');
5590    END IF;
5591 
5592    --Initialize API return status to success
5593    x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
5594    l_return_status := x_return_status;
5595 
5596    IF (l_log_statement >= l_log_current_level) THEN
5597       fnd_log.string(l_log_statement,L_DEBUG,'p_base_stage_id '||p_base_stage_id);
5598    END IF;
5599 
5600    -- p_base_stage_id is null if this is called to update entire visit stage start dates
5601    IF p_base_stage_id = Fnd_Api.g_miss_num OR p_base_stage_id IS NULL THEN
5602       l_base_start_time := p_visit_start_date;
5603    ELSE
5604       l_base_start_time := p_valid_stages(p_base_stage_id).CALCULATED_START_TIME;
5605    END IF;
5606 
5607    IF (l_log_statement >= l_log_current_level) THEN
5608       fnd_log.string(l_log_statement,L_DEBUG,'Base start time '||l_base_start_time);
5609    END IF;
5610 
5611    l_stage_id := p_valid_stages.FIRST;
5612    WHILE l_stage_id IS NOT NULL
5613    LOOP
5614        l_current_stage_rec := p_valid_stages(l_stage_id);
5615 
5616        l_stage_start_date := l_current_stage_rec.CALCULATED_START_TIME;
5617 
5618        -- PRAKKUM :: 23-FEB-2011 :: Bug 13711800 :: Fix for Operational Visits
5619        l_stage_end_date := Compute_Stage_End_Date(p_visit_id, null, l_current_stage_rec.CALCULATED_START_TIME, p_dept_id, l_current_stage_rec.DURATION);
5620 
5621        IF (l_log_statement >= l_log_current_level) THEN
5622            fnd_log.string(l_log_statement,L_DEBUG,'SD '||l_stage_start_date||' ED '||l_stage_end_date ||' for stage id '||l_stage_id);
5623        END IF;
5624 
5625        -- Stage dates are updated
5626        UPDATE AHL_VWP_STAGES_B SET object_version_number=object_version_number+1,
5627                                    PLANNED_START_DATE = l_stage_start_date,
5628                                    PLANNED_END_DATE = l_stage_end_date,
5629                                    LAST_UPDATE_DATE      = SYSDATE,
5630                                    LAST_UPDATED_BY       = Fnd_Global.USER_ID,
5631                                    LAST_UPDATE_LOGIN     = Fnd_Global.LOGIN_ID
5632                                    WHERE STAGE_ID = l_stage_id;
5633        IF (l_log_statement >= l_log_current_level) THEN
5634             fnd_log.string(l_log_statement,L_DEBUG,l_stage_id||' stage id updated');
5635        END IF;
5636 
5637        UPDATE_STAGES_OVN_COUNT(
5638          p_stage_id                => p_base_stage_id,
5639          p_updated_stage_id        => l_stage_id,
5640          p_x_stages_ovn_tbl        => p_x_stages_ovn_tbl,
5641          x_return_status           => l_return_status,
5642          x_msg_count               => l_msg_count,
5643          x_msg_data                => l_msg_data);
5644 
5645        IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
5646         fnd_log.string(fnd_log.level_statement,L_DEBUG,'After calling AHL_VWP_VISITS_STAGES_PVT.UPDATE_STAGES_OVN_COUNT - l_return_status : '||l_return_status);
5647        END IF;
5648 
5649        IF l_msg_count > 0 OR NVL(l_return_status,'x') <> FND_API.G_RET_STS_SUCCESS THEN
5650          x_msg_count := l_msg_count;
5651          x_return_status := l_return_status;
5652          IF l_return_status = Fnd_Api.g_ret_sts_error THEN
5653            RAISE Fnd_Api.g_exc_error;
5654          ELSIF l_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
5655            RAISE Fnd_Api.g_exc_unexpected_error;
5656          END IF;
5657        END IF;
5658 
5659        l_stage_id := p_valid_stages.NEXT(l_stage_id);
5660    END LOOP;
5661 
5662    --Standard check to count messages
5663    l_msg_count := Fnd_Msg_Pub.count_msg;
5664    IF l_msg_count > 0 THEN
5665       X_msg_count := l_msg_count;
5666       X_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
5667       RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
5668    END IF;
5669 
5670    IF (l_log_procedure >= l_log_current_level) THEN
5671        fnd_log.string(l_log_procedure,L_DEBUG||'.end','End');
5672    END IF;
5673 
5674 EXCEPTION
5675  WHEN Fnd_Api.G_EXC_ERROR THEN
5676    x_return_status := Fnd_Api.G_RET_STS_ERROR;
5677    Fnd_Msg_Pub.count_and_get( p_count => x_msg_count,
5678                               p_data  => x_msg_data,
5679                               p_encoded => Fnd_Api.g_false);
5680  WHEN Fnd_Api.G_EXC_UNEXPECTED_ERROR THEN
5681    x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
5682    Fnd_Msg_Pub.count_and_get( p_count => x_msg_count,
5683                               p_data  => x_msg_data,
5684                                p_encoded => Fnd_Api.g_false);
5685  WHEN OTHERS THEN
5686       x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
5687       IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_unexp_error)
5688                 THEN
5689          Fnd_Msg_Pub.add_exc_msg (G_PKG_NAME, l_api_name);
5690       END IF;
5691       Fnd_Msg_Pub.count_and_get (
5692             p_encoded => Fnd_Api.g_false,
5693             p_count   => x_msg_count,
5694             p_data    => x_msg_data  );
5695 
5696 END UPDATE_STAGE_DATES;
5697 
5698 --------------------------------------------------------------------
5699 -- PROCEDURE
5700 --    UPDATE_SUCC_STG_START_DATES
5701 --
5702 -- PURPOSE
5703 -- To update all successor stages start dates with new planned end date
5704 --------------------------------------------------------------------
5705 PROCEDURE UPDATE_SUCC_STG_START_DATES(
5706    p_stage_id                IN NUMBER,
5707    p_visit_id                IN NUMBER,
5708    p_planned_end_date        IN DATE,
5709    p_x_stages_ovn_tbl        IN  OUT NOCOPY Visit_Stages_OVN_Tbl_Type,--VWPE 12730539:: PRAKKUM :: 08-JUL-2011
5710    p_caller_id               IN VARCHAR2,
5711    x_return_status           OUT NOCOPY VARCHAR2,
5712    x_msg_count               OUT NOCOPY NUMBER,
5713    x_msg_data                OUT NOCOPY VARCHAR2
5714 )
5715 IS
5716 
5717   -- To get all parallel stages under visit
5718   Cursor c_parallel_stages_dets(vst_id IN NUMBER) IS
5719   SELECT distinct STAGE_LINK_ID,subject_ID,object_ID FROM
5720   ahl_stage_links ,AHL_VWP_STAGES_B
5721   WHERE RELATION_TYPE='PARALLEL'
5722   AND ( ahl_stage_links.subject_id=AHL_VWP_STAGES_B.stage_id OR ahl_stage_links.object_id=AHL_VWP_STAGES_B.stage_id)
5723   AND VISIT_ID =vst_id;
5724 
5725   l_parallel_stg_dets c_parallel_stages_dets%RowType;
5726 
5727   --To get next stage to passed stage id
5728   cursor c_get_after_stage(stg_id IN NUMBER) IS
5729   select object_ID object_ID FROM AHL_STAGE_LINKS WHERE RELATION_TYPE='BEFORE' and subject_ID=stg_id
5730   UNION
5731   select subject_ID object_ID FROM AHL_STAGE_LINKS WHERE RELATION_TYPE='AFTER' and object_ID=stg_id;
5732 
5733   --cursor to get invalid stages
5734   cursor c_get_invalid_stage_numbers(vst_id IN NUMBER) IS
5735   SELECT STAGE_NUM,planned_start_date,planned_end_date
5736   FROM AHL_VWP_STAGES_B
5737   WHERE PLANNED_END_DATE IS NOT NULL
5738   AND PLANNED_START_DATE IS NOT NULL
5739   and PLANNED_END_DATE < PLANNED_START_DATE AND VISIT_ID =vst_id;
5740 
5741   --To hold invalid stage numbers
5742   invalid_stage_numbers     c_get_invalid_stage_numbers%RowType;
5743 
5744 
5745   parallel_stage_ids        PARALLEL_STAGE_ID_DETS;
5746 
5747   parallelStagesInStr       VARCHAR2(2000);
5748   l_query_str               VARCHAR2(2000);
5749 
5750   l_isValidationFailed      BOOLEAN default false;
5751 
5752   l_obj_stage_id            NUMBER;
5753   l_update_stage_id         NUMBER;
5754   l_ovn_p_stage_id          NUMBER;
5755 
5756   l_max_planned_end_date    DATE;
5757   l_max_planned_start_date  DATE;
5758   l_max_earliest_start_date  DATE;
5759   l_planned_end_date        DATE;
5760 
5761   L_API_VERSION             CONSTANT NUMBER := 1.0;
5762   L_API_NAME                CONSTANT VARCHAR2(30) := 'UPDATE_SUCC_STG_START_DATES';
5763   L_FULL_NAME               CONSTANT VARCHAR2(60) := G_PKG_NAME || '.' || L_API_NAME;
5764   L_DEBUG                   CONSTANT VARCHAR2(90) := 'ahl.plsql.'||L_FULL_NAME;
5765 
5766   l_msg_data               VARCHAR2(2000);
5767   l_msg_count              NUMBER;
5768   l_return_status          VARCHAR2(1);
5769 
5770 BEGIN
5771 
5772    IF (l_log_procedure >= l_log_current_level) THEN
5773        fnd_log.string(l_log_procedure,L_DEBUG||'.begin','Start');
5774    END IF;
5775 
5776    --Initialize API return status to success
5777    x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
5778    l_return_status := x_return_status;
5779 
5780    OPEN c_get_after_stage (p_stage_id);
5781    FETCH c_get_after_stage INTO l_obj_stage_id;
5782    CLOSE c_get_after_stage;
5783 
5784    IF l_obj_stage_id IS NOT NULL THEN -- Check whether there is any successors
5785        parallel_stage_ids(l_obj_stage_id) := true;
5786        parallel_stage_ids := Get_Stage_Parallel_Stages(parallel_stage_ids , p_visit_id );
5787 
5788        --Loop to build IN string to use it in query
5789        l_update_stage_id := parallel_stage_ids.FIRST;
5790        WHILE l_update_stage_id IS NOT NULL
5791        LOOP
5792         parallelStagesInStr:=parallelStagesInStr||','||l_update_stage_id;
5793         l_update_stage_id := parallel_stage_ids.NEXT(l_update_stage_id);
5794        END LOOP;
5795 
5796        IF length(parallelStagesInStr)>1 THEN
5797 
5798         parallelStagesInStr := SUBSTR(parallelStagesInStr, 2);
5799         IF (l_log_statement >= l_log_current_level) THEN
5800            fnd_log.string(l_log_statement,L_DEBUG,'parallelStagesInStr is :' ||parallelStagesInStr );
5801         END IF;
5802 
5803         -- Get max planned end date from all parallel stage before stages
5804         l_query_str :=' select MAX(stg.PLANNED_END_DATE) from ahl_stage_links, ahl_vwp_stages_b stg '||
5805                       ' where stg.STAGE_ID = subject_id AND relation_type = ''BEFORE'' '||
5806                       ' and object_id in (' || parallelStagesInStr ||')';
5807 
5808         IF (l_log_statement >= l_log_current_level) THEN
5809            fnd_log.string(l_log_statement,L_DEBUG,'l_query_str is :' ||l_query_str);
5810         END IF;
5811 
5812         EXECUTE IMMEDIATE l_query_str into l_max_planned_end_date ;
5813 
5814         IF (l_log_statement >= l_log_current_level) THEN
5815            fnd_log.string(l_log_statement,L_DEBUG,'l_max_planned_end_date is :' ||l_max_planned_end_date );
5816         END IF;
5817 
5818         -- PRAKKUM :: 09/05/2012 :: Bug 13965577
5819         -- Get max earliest start date from all parallel stages
5820         l_query_str :=' select '||
5821                       ' MAX(stg.EARLIEST_START_DATE) MAX_EARLIEST_START_DATE from ahl_vwp_stages_b stg '||
5822                       ' where stg.STAGE_ID in (' || parallelStagesInStr ||')';
5823 
5824         IF (l_log_statement >= l_log_current_level) THEN
5825            fnd_log.string(l_log_statement,L_DEBUG,'l_query_str is :' ||l_query_str);
5826         END IF;
5827 
5828         EXECUTE IMMEDIATE l_query_str into l_max_earliest_start_date ;
5829 
5830         IF (l_log_statement >= l_log_current_level) THEN
5831            fnd_log.string(l_log_statement,L_DEBUG,'l_max_planned_start_date is :' ||l_max_earliest_start_date );
5832         END IF;
5833 
5834         -- Get max planned start date from all parallel stages considering if earliest start date exists
5835         l_query_str :=' select case when '||
5836                       ' (MAX(stg.EARLIEST_START_DATE)>MAX(stg.PLANNED_START_DATE)) then MAX(stg.EARLIEST_START_DATE) '||
5837                       ' else MAX(stg.PLANNED_START_DATE) end MIN_PLANNED_START_DATE from ahl_vwp_stages_b stg '||
5838                       ' where stg.STAGE_ID in (' || parallelStagesInStr ||')';
5839 
5840         IF (l_log_statement >= l_log_current_level) THEN
5841            fnd_log.string(l_log_statement,L_DEBUG,'l_query_str is :' ||l_query_str);
5842         END IF;
5843 
5844         EXECUTE IMMEDIATE l_query_str into l_max_planned_start_date ;
5845 
5846         IF (l_log_statement >= l_log_current_level) THEN
5847            fnd_log.string(l_log_statement,L_DEBUG,'l_max_planned_start_date is :' ||l_max_planned_start_date );
5848         END IF;
5849 
5850         -- PRAKKUM :: 09/05/2012 :: Bug 13965577
5851         -- Get updated planned end date of a stage is greater than  max planned start date that calc before then update all parallel stage start date to new date
5852         IF l_max_planned_end_date IS NOT NULL AND p_planned_end_date <> NVL(l_max_earliest_start_date,(p_planned_end_date-1)) THEN
5853 
5854 
5855             IF (l_log_statement >= l_log_current_level) THEN
5856                fnd_log.string(l_log_statement,L_DEBUG,'l_max_planned_end_date is :' ||TO_CHAR(l_max_planned_end_date,'DD-MON-YYYY HH24:MI:SS') );
5857             END IF;
5858             -- PRAKKUM :: 09/05/2012 :: Bug 13965577 :: START
5859             --Find latest date among planned start date of llel stages and updated date and planned end date of llel stage before stages
5860             IF l_max_earliest_start_date >= l_max_planned_end_date THEN
5861                 l_planned_end_date := l_max_earliest_start_date;
5862             ELSE
5863                 l_planned_end_date := l_max_planned_end_date;
5864             END IF;
5865 
5866             IF l_max_earliest_start_date IS NOT NULL THEN -- IF Earliest Date is defined then only it is not null
5867               IF p_planned_end_date > l_planned_end_date THEN
5868                 l_planned_end_date := p_planned_end_date;
5869               END IF;
5870             ELSE
5871               l_planned_end_date := p_planned_end_date;
5872             END IF;
5873             -- PRAKKUM :: 09/05/2012 :: Bug 13965577 :: END
5874 
5875             IF (l_log_statement >= l_log_current_level) THEN
5876                fnd_log.string(l_log_statement,L_DEBUG,'l_planned_end_date is :' ||TO_CHAR(l_planned_end_date,'DD-MON-YYYY HH24:MI:SS') );
5877             END IF;
5878 
5879 
5880             l_query_str :=' UPDATE AHL_VWP_STAGES_B set object_version_number=object_version_number+1, '||
5881                           ' PLANNED_START_DATE = :p_planned_end_date, '||
5882                           ' LAST_UPDATE_DATE      = SYSDATE, '||
5883                           ' LAST_UPDATED_BY       = Fnd_Global.USER_ID, '||
5884                           ' LAST_UPDATE_LOGIN     = Fnd_Global.LOGIN_ID '||
5885                           ' WHERE STAGE_ID IN ('||parallelStagesInStr||') '||
5886                           ' AND PLANNED_START_DATE = :p_max_planned_start_date';
5887             IF (l_log_statement >= l_log_current_level) THEN
5888                fnd_log.string(l_log_statement,L_DEBUG,parallelStagesInStr||' stage id updated');
5889             END IF;
5890 
5891             IF (l_log_statement >= l_log_current_level) THEN
5892                fnd_log.string(l_log_statement,L_DEBUG,'l_query_str is :' ||l_query_str);
5893             END IF;
5894             EXECUTE IMMEDIATE l_query_str USING l_planned_end_date,l_max_planned_start_date;
5895 
5896             -- PRAKKUM :: 08-JUL-2011 :: VWPE 12730539 :: start
5897             l_ovn_p_stage_id := parallel_stage_ids.FIRST;
5898             WHILE l_ovn_p_stage_id IS NOT NULL
5899             LOOP
5900 
5901               UPDATE_STAGES_OVN_COUNT(
5902                  p_stage_id                => p_stage_id,
5903                  p_updated_stage_id        => l_ovn_p_stage_id,
5904                  p_x_stages_ovn_tbl        => p_x_stages_ovn_tbl,
5905                  x_return_status           => l_return_status,
5906                  x_msg_count               => l_msg_count,
5907                  x_msg_data                => l_msg_data);
5908 
5909               IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
5910                fnd_log.string(fnd_log.level_statement,L_DEBUG,'After calling AHL_VWP_VISITS_STAGES_PVT.UPDATE_STAGES_OVN_COUNT - l_return_status : '||l_return_status);
5911               END IF;
5912 
5913               IF l_msg_count > 0 OR NVL(l_return_status,'x') <> FND_API.G_RET_STS_SUCCESS THEN
5914                  x_msg_count := l_msg_count;
5915                  x_return_status := l_return_status;
5916                  IF l_return_status = Fnd_Api.g_ret_sts_error THEN
5917                    RAISE Fnd_Api.g_exc_error;
5918                  ELSIF l_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
5919                    RAISE Fnd_Api.g_exc_unexpected_error;
5920                  END IF;
5921               END IF;
5922 
5923               l_ovn_p_stage_id := parallel_stage_ids.NEXT(l_ovn_p_stage_id);
5924 
5925             END LOOP;
5926             -- PRAKKUM :: 08-JUL-2011 :: VWPE 12730539 :: END
5927 
5928         END IF;
5929 
5930         l_isValidationFailed := false;
5931 
5932         FOR invalid_stage_numbers IN  c_get_invalid_stage_numbers (p_visit_id)
5933         LOOP
5934 
5935             IF (l_log_statement >= l_log_current_level) THEN
5936                fnd_log.string(l_log_statement,L_DEBUG,'Invalid Stage Num is :' ||invalid_stage_numbers.STAGE_NUM );
5937             END IF;
5938 
5939             IF p_caller_id = 'R' THEN -- If validation failed during stage rule addition
5940                     Fnd_Message.SET_NAME('AHL','AHL_VWP_VST_R_STAGE_NUMS');
5941                     FND_MESSAGE.SET_TOKEN('STAGE_NUM',invalid_stage_numbers.STAGE_NUM);
5942                     Fnd_Message.SET_TOKEN('STG_ST_DATE', invalid_stage_numbers.planned_start_date);
5943                     Fnd_Message.SET_TOKEN('STG_ST_TIMESTAMP', TO_CHAR(invalid_stage_numbers.planned_start_date,'HH24:MI:SS'));
5944                     Fnd_Message.SET_TOKEN('STG_ED_DATE', invalid_stage_numbers.planned_end_date);
5945                     Fnd_Message.SET_TOKEN('STG_ED_TIMESTAMP', TO_CHAR(invalid_stage_numbers.planned_end_date,'HH24:MI:SS'));
5946                     Fnd_Msg_Pub.ADD;
5947             ELSE
5948                     Fnd_Message.SET_NAME('AHL','AHL_VWP_VST_STAGE_NUMS');
5949                     FND_MESSAGE.SET_TOKEN('STAGE_NUM',invalid_stage_numbers.STAGE_NUM);
5950                     Fnd_Message.SET_TOKEN('STG_ST_DATE', invalid_stage_numbers.planned_start_date);
5951                     Fnd_Message.SET_TOKEN('STG_ST_TIMESTAMP', TO_CHAR(invalid_stage_numbers.planned_start_date,'HH24:MI:SS'));
5952                     Fnd_Message.SET_TOKEN('STG_ED_DATE', invalid_stage_numbers.planned_end_date);
5953                     Fnd_Message.SET_TOKEN('STG_ED_TIMESTAMP', TO_CHAR(invalid_stage_numbers.planned_end_date,'HH24:MI:SS'));
5954                     Fnd_Msg_Pub.ADD;
5955             END IF;
5956             l_isValidationFailed := true;
5957 
5958         END LOOP;
5959 
5960         IF l_isValidationFailed THEN
5961             RAISE Fnd_Api.G_EXC_ERROR;
5962         END IF;
5963 
5964        END IF;
5965    END IF;
5966 
5967 
5968    -- PRAKKUM :: 13-FEB-2011 :: Bug 13711800 :: START
5969 
5970    IF (l_log_statement >= l_log_current_level) THEN
5971        fnd_log.string(l_log_statement,L_DEBUG,'Before calling AHL_VWP_VISITS_STAGES_PVT.VALIDATE_STAGE_DATES ');
5972    END IF;
5973 
5974    VALIDATE_STAGE_DATES( p_visit_id          => p_visit_id,
5975                          x_return_status     => l_return_status,
5976                          x_msg_count         => l_msg_count,
5977                          x_msg_data          => l_msg_data);
5978 
5979    IF (l_log_statement >= l_log_current_level) THEN
5980        fnd_log.string(l_log_statement,L_DEBUG,'After calling AHL_VWP_VISITS_STAGES_PVT.VALIDATE_STAGE_DATES - l_return_status : '||l_return_status);
5981    END IF;
5982 
5983    IF l_msg_count > 0 OR NVL(l_return_status,'x') <> FND_API.G_RET_STS_SUCCESS THEN
5984       x_msg_count := l_msg_count;
5985       x_return_status := l_return_status;
5986       IF l_return_status = Fnd_Api.g_ret_sts_error THEN
5987          RAISE Fnd_Api.g_exc_error;
5988       ELSIF l_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
5989          RAISE Fnd_Api.g_exc_unexpected_error;
5990       END IF;
5991    END IF;
5992    -- PRAKKUM :: 13-FEB-2011 :: Bug 13711800 :: END
5993 
5994    --Standard check to count messages
5995    l_msg_count := Fnd_Msg_Pub.count_msg;
5996    IF l_msg_count > 0 THEN
5997       X_msg_count := l_msg_count;
5998       X_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
5999       RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
6000    END IF;
6001 
6002    IF (l_log_procedure >= l_log_current_level) THEN
6003        fnd_log.string(l_log_procedure,L_DEBUG||'.end','End');
6004    END IF;
6005 
6006 EXCEPTION
6007  WHEN Fnd_Api.G_EXC_ERROR THEN
6008    x_return_status := Fnd_Api.G_RET_STS_ERROR;
6009    Fnd_Msg_Pub.count_and_get( p_count => x_msg_count,
6010                               p_data  => x_msg_data,
6011                               p_encoded => Fnd_Api.g_false);
6012  WHEN Fnd_Api.G_EXC_UNEXPECTED_ERROR THEN
6013    x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
6014    Fnd_Msg_Pub.count_and_get( p_count => x_msg_count,
6015                               p_data  => x_msg_data,
6016                                p_encoded => Fnd_Api.g_false);
6017  WHEN OTHERS THEN
6018       x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
6019       IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_unexp_error)
6020                 THEN
6021          Fnd_Msg_Pub.add_exc_msg (G_PKG_NAME, l_api_name);
6022       END IF;
6023       Fnd_Msg_Pub.count_and_get (
6024             p_encoded => Fnd_Api.g_false,
6025             p_count   => x_msg_count,
6026             p_data    => x_msg_data  );
6027 
6028 END UPDATE_SUCC_STG_START_DATES;
6029 
6030 -- PRAKKUM :: 15/03/2011 :: VWPE :: ER 12424063 :: END
6031 
6032 --VWPE 12730539:: PRAKKUM :: 08-JUL-2011 :: start
6033 
6034 --------------------------------------------------------------------
6035 -- PROCEDURE
6036 --    UPDATE_STAGES_OVN_COUNT
6037 --
6038 -- PURPOSE
6039 -- To keep track of updated object version number count
6040 --------------------------------------------------------------------
6041 PROCEDURE UPDATE_STAGES_OVN_COUNT(
6042    p_stage_id                IN NUMBER,
6043    p_updated_stage_id        IN NUMBER,
6044    p_x_stages_ovn_tbl        IN  OUT NOCOPY Visit_Stages_OVN_Tbl_Type,
6045    x_return_status           OUT NOCOPY VARCHAR2,
6046    x_msg_count               OUT NOCOPY NUMBER,
6047    x_msg_data                OUT NOCOPY VARCHAR2
6048 )
6049 IS
6050 
6051   l_table_size             NUMBER :=0;
6052   l_updated_version_no     VARCHAR2(1) := 'N';
6053 
6054   L_API_VERSION             CONSTANT NUMBER := 1.0;
6055   L_API_NAME                CONSTANT VARCHAR2(30) := 'UPDATE_STAGES_OVN_COUNT';
6056   L_FULL_NAME               CONSTANT VARCHAR2(60) := G_PKG_NAME || '.' || L_API_NAME;
6057   L_DEBUG                   CONSTANT VARCHAR2(90) := 'ahl.plsql.'||L_FULL_NAME;
6058 
6059   l_msg_data               VARCHAR2(2000);
6060   l_msg_count              NUMBER;
6061   l_return_status          VARCHAR2(1);
6062 
6063 BEGIN
6064 
6065    IF (l_log_procedure >= l_log_current_level) THEN
6066        fnd_log.string(l_log_procedure,L_DEBUG||'.begin','Start');
6067    END IF;
6068 
6069    --Initialize API return status to success
6070    x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
6071    l_return_status := x_return_status;
6072 
6073    /*IF p_stage_id = p_updated_stage_id THEN
6074       fnd_log.string(l_log_procedure,L_DEBUG||'.end','Return');
6075       RETURN; -- NO need to update
6076    END IF;*/
6077 
6078    l_updated_version_no := 'N';
6079    l_table_size :=p_x_stages_ovn_tbl.count;
6080 
6081    IF (l_log_statement >= l_log_current_level) THEN
6082        fnd_log.string(l_log_statement,L_DEBUG,' p_stage_id '||p_stage_id||' p_updated_stage_id '||p_updated_stage_id);
6083        fnd_log.string(l_log_statement,L_DEBUG,' p_x_stages_ovn_tbl count is '||p_x_stages_ovn_tbl.count||' : l_table_size is '||l_table_size);
6084    END IF;
6085 
6086    IF p_x_stages_ovn_tbl.count > 0 THEN
6087      FOR i IN p_x_stages_ovn_tbl.FIRST..p_x_stages_ovn_tbl.LAST
6088      loop
6089 
6090        IF (l_log_statement >= l_log_current_level) THEN
6091          fnd_log.string(l_log_statement,L_DEBUG,' p_x_stages_ovn_tbl(i).STAGE_ID '||p_x_stages_ovn_tbl(i).STAGE_ID
6092                         ||' p_x_stages_ovn_tbl(i).UPDATED_OBJ_VERSION_NO_COUNT:'||p_x_stages_ovn_tbl(i).UPDATED_OBJ_VERSION_NO_COUNT);
6093        END IF;
6094        IF p_x_stages_ovn_tbl(i).STAGE_ID = p_updated_stage_id THEN
6095           p_x_stages_ovn_tbl(i).UPDATED_OBJ_VERSION_NO_COUNT := p_x_stages_ovn_tbl(i).UPDATED_OBJ_VERSION_NO_COUNT + 1;
6096           l_updated_version_no := 'Y';
6097        END IF;
6098 
6099        EXIT WHEN l_updated_version_no ='Y';
6100 
6101      END LOOP;
6102    END IF;
6103 
6104    IF (l_log_statement >= l_log_current_level) THEN
6105        fnd_log.string(l_log_statement,L_DEBUG,' l_table_size '||l_table_size||' : l_updated_version_no '||l_updated_version_no);
6106    END IF;
6107 
6108    l_table_size := l_table_size+1;
6109 
6110    IF l_updated_version_no = 'N' THEN
6111       p_x_stages_ovn_tbl(l_table_size).STAGE_ID := p_updated_stage_id;
6112       p_x_stages_ovn_tbl(l_table_size).UPDATED_OBJ_VERSION_NO_COUNT := 1; -- Initialized
6113    END IF;
6114 
6115    IF (l_log_statement >= l_log_current_level) THEN
6116          fnd_log.string(l_log_statement,L_DEBUG,' p_x_stages_ovn_tbl count is '||p_x_stages_ovn_tbl.count);
6117    END IF;
6118 
6119    --Standard check to count messages
6120    l_msg_count := Fnd_Msg_Pub.count_msg;
6121    IF l_msg_count > 0 THEN
6122       X_msg_count := l_msg_count;
6123       X_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
6124       RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
6125    END IF;
6126 
6127    IF (l_log_procedure >= l_log_current_level) THEN
6128        fnd_log.string(l_log_procedure,L_DEBUG||'.end','End');
6129    END IF;
6130 
6131 EXCEPTION
6132  WHEN Fnd_Api.G_EXC_ERROR THEN
6133    x_return_status := Fnd_Api.G_RET_STS_ERROR;
6134    Fnd_Msg_Pub.count_and_get( p_count => x_msg_count,
6135                               p_data  => x_msg_data,
6136                               p_encoded => Fnd_Api.g_false);
6137  WHEN Fnd_Api.G_EXC_UNEXPECTED_ERROR THEN
6138    x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
6139    Fnd_Msg_Pub.count_and_get( p_count => x_msg_count,
6140                               p_data  => x_msg_data,
6141                                p_encoded => Fnd_Api.g_false);
6142  WHEN OTHERS THEN
6143       x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
6144       IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_unexp_error)
6145                 THEN
6146          Fnd_Msg_Pub.add_exc_msg (G_PKG_NAME, l_api_name);
6147       END IF;
6148       Fnd_Msg_Pub.count_and_get (
6149             p_encoded => Fnd_Api.g_false,
6150             p_count   => x_msg_count,
6151             p_data    => x_msg_data  );
6152 
6153 END UPDATE_STAGES_OVN_COUNT;
6154 
6155 --VWPE 12730539:: PRAKKUM :: 08-JUL-2011 :: end
6156 
6157 -- PRAKKUM :: 13-FEB-2011 :: Bug 13711800 :: START
6158 --------------------------------------------------------------------
6159 -- PROCEDURE
6160 --    VALIDATE_STAGE_DATES
6161 --
6162 -- PURPOSE
6163 -- To validate stage dates against visit dates
6164 --------------------------------------------------------------------
6165 PROCEDURE VALIDATE_STAGE_DATES(
6166    p_visit_id                IN NUMBER,
6167    x_return_status           OUT NOCOPY VARCHAR2,
6168    x_msg_count               OUT NOCOPY NUMBER,
6169    x_msg_data                OUT NOCOPY VARCHAR2
6170 )
6171 IS
6172 
6173   L_API_VERSION             CONSTANT NUMBER := 1.0;
6174   L_API_NAME                CONSTANT VARCHAR2(30) := 'VALIDATE_STAGE_DATES';
6175   L_FULL_NAME               CONSTANT VARCHAR2(60) := G_PKG_NAME || '.' || L_API_NAME;
6176   L_DEBUG                   CONSTANT VARCHAR2(90) := 'ahl.plsql.'||L_FULL_NAME;
6177 
6178   l_msg_data               VARCHAR2(2000);
6179   l_msg_count              NUMBER;
6180   l_return_status          VARCHAR2(1);
6181 
6182   --To get invalid stages whose end date falls beyond visit end date
6183   CURSOR get_invalid_stages(c_visit_id IN NUMBER) IS
6184   SELECT stg.stage_id,stg.stage_num,stg.planned_end_date,vst.close_date_time
6185   FROM ahl_visits_b vst,
6186        ahl_vwp_stages_b stg
6187   WHERE vst.visit_id = stg.visit_id
6188   AND TRUNC(stg.planned_end_date,'MI') > TRUNC(nvl(vst.close_date_time,stg.planned_end_date),'MI')
6189   AND vst.visit_id = c_visit_id
6190   AND vst.status_code <> 'DRAFT'
6191   ORDER BY stg.stage_num;
6192 
6193   l_stages_rec  get_invalid_stages%ROWTYPE;
6194 
6195   l_isValidationFailed      VARCHAR2(1):='N';
6196 
6197 BEGIN
6198 
6199    IF (l_log_procedure >= l_log_current_level) THEN
6200        fnd_log.string(l_log_procedure,L_DEBUG||'.begin','Start');
6201    END IF;
6202 
6203    --Initialize API return status to success
6204    x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
6205    l_return_status := x_return_status;
6206 
6207    IF (l_log_statement >= l_log_current_level) THEN
6208        fnd_log.string(l_log_statement,L_DEBUG,' p_visit_id '||p_visit_id);
6209    END IF;
6210 
6211    -- Cursor to find visit start time
6212    FOR l_stages_rec IN get_invalid_stages(p_visit_id)
6213    LOOP
6214 
6215        IF (l_log_statement >= l_log_current_level) THEN
6216           fnd_log.string(l_log_statement,L_DEBUG,' Stage Number --@>'|| l_stages_rec.stage_num);
6217           fnd_log.string(l_log_statement,L_DEBUG,' Stage Planned End Date --@>'|| TO_CHAR(l_stages_rec.planned_end_date,'DD-MON-YYYY HH24:MI:SS'));
6218           fnd_log.string(l_log_statement,L_DEBUG,' Visit Planned End Date --@>'|| TO_CHAR(l_stages_rec.close_date_time,'DD-MON-YYYY HH24:MI:SS'));
6219        END IF;
6220 
6221        Fnd_Message.SET_NAME('AHL','AHL_VWP_INV_STAGE_DATE');
6222        Fnd_Message.SET_TOKEN('STAGE_NUM', l_stages_rec.stage_num);
6223        Fnd_Message.SET_TOKEN('STAGE_DATE', l_stages_rec.planned_end_date);
6224        Fnd_Message.SET_TOKEN('STAGE_TIMESTAMP', TO_CHAR(l_stages_rec.planned_end_date,'HH24:MI:SS'));
6225        Fnd_Message.SET_TOKEN('VISIT_END_DATE', l_stages_rec.close_date_time);
6226        Fnd_Message.SET_TOKEN('VISIT_END_TIMESTAMP', TO_CHAR(l_stages_rec.close_date_time,'HH24:MI:SS'));
6227        Fnd_Msg_Pub.ADD;
6228 
6229        l_isValidationFailed := 'Y';
6230    END LOOP;
6231 
6232    IF l_isValidationFailed='Y' THEN
6233       RAISE Fnd_Api.G_EXC_ERROR;
6234    END IF;
6235 
6236    IF (l_log_statement >= l_log_current_level) THEN
6237        fnd_log.string(l_log_statement,L_DEBUG,' l_isValidationFailed --@>'|| l_isValidationFailed);
6238    END IF;
6239 
6240    --Standard check to count messages
6241    l_msg_count := Fnd_Msg_Pub.count_msg;
6242    IF l_msg_count > 0 THEN
6243       X_msg_count := l_msg_count;
6244       X_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
6245       RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
6246    END IF;
6247 
6248    IF (l_log_procedure >= l_log_current_level) THEN
6249        fnd_log.string(l_log_procedure,L_DEBUG||'.end','End');
6250    END IF;
6251 
6252 EXCEPTION
6253  WHEN Fnd_Api.G_EXC_ERROR THEN
6254    x_return_status := Fnd_Api.G_RET_STS_ERROR;
6255    Fnd_Msg_Pub.count_and_get( p_count => x_msg_count,
6256                               p_data  => x_msg_data,
6257                               p_encoded => Fnd_Api.g_false);
6258  WHEN Fnd_Api.G_EXC_UNEXPECTED_ERROR THEN
6259    x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
6260    Fnd_Msg_Pub.count_and_get( p_count => x_msg_count,
6261                               p_data  => x_msg_data,
6262                                p_encoded => Fnd_Api.g_false);
6263  WHEN OTHERS THEN
6264       x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
6265       IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_unexp_error)
6266                 THEN
6267          Fnd_Msg_Pub.add_exc_msg (G_PKG_NAME, l_api_name);
6268       END IF;
6269       Fnd_Msg_Pub.count_and_get (
6270             p_encoded => Fnd_Api.g_false,
6271             p_count   => x_msg_count,
6272             p_data    => x_msg_data  );
6273 
6274 END VALIDATE_STAGE_DATES;
6275 
6276 -----------------------------------------------------------
6277 --  Function Name:  Compute_Stage_End_Date
6278 --  Type:           Private
6279 --  Function:       Compute end date depending on type of visit.
6280 --                  If visit is operational visit then compute end date without considering department shifts/holidays
6281 --                  Else compute end date considering department shifts & holidays
6282 --
6283 --  Compute_Stage_End_Date Parameters:
6284 --      p_visit_id                      IN  NUMBER  Required
6285 --      p_visit_unit_schedule_id        IN  NUMBER  Optional -- If caller have details, good to pass this info
6286 --      p_start_date                    IN  NUMBER  Required
6287 --      The start date of the compute date value
6288 --      p_dept_id                       IN  NUMBER  Required
6289 --      The department id to calculate the date for
6290 --      p_duration                      IN  NUMBER
6291 --      The duration in hours of the tasks offset
6292 --   RETURNs end date
6293 --
6294 ---------------------------------------------------------
6295 FUNCTION Compute_Stage_End_Date(
6296     p_visit_id                NUMBER,
6297     p_is_operational_visit    VARCHAR2,
6298     p_start_date              DATE,
6299     p_dept_id                 NUMBER,
6300     p_duration                NUMBER)
6301 RETURN DATE
6302 IS
6303 --
6304 -- Purpose of this method is to calculate end dates differently in case of operational visits. Operational visits visit end date is calculated based on visit type duration.
6305 -- However this calculation won't consider dept. shifts or holidays in to account. So to keep things consistent, stage dates calc. also won't consider dept. shifts or holidays
6306 -- into account.
6307 --
6308 CURSOR GET_VISIT_DETS ( C_VISIT_ID IN NUMBER ) IS
6309 SELECT VISIT_ID, UNIT_SCHEDULE_ID FROM AHL_VISITS_B
6310 WHERE VISIT_ID = C_VISIT_ID;
6311 
6312 l_visit_dets_rec GET_VISIT_DETS%RowType;
6313 
6314 l_is_operational_visit BOOLEAN DEFAULT FALSE;
6315 l_end_date             DATE;   --The end date that is being calculated.
6316 L_API_NAME  CONSTANT   VARCHAR2(30)  := 'Compute_Stage_End_Date';
6317 L_DEBUG_KEY CONSTANT   VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
6318 --
6319 BEGIN
6320 
6321   IF (l_log_procedure >= l_log_current_level) THEN
6322      fnd_log.string(l_log_procedure,
6323                     L_DEBUG_KEY ||'.begin',
6324                     'At the start of PL SQL function. Visit Id = '||p_visit_id||
6325                     ', Start Date = ' || p_start_date ||
6326                     ', Department Id = ' || p_dept_id || ', Duration = ' || p_duration);
6327   END IF;
6328 
6329   --Query visit details if caller doesn't pass info. whether visit is operational visit or not
6330   IF p_is_operational_visit IS NULL THEN
6331      OPEN GET_VISIT_DETS(p_visit_id);
6332      FETCH GET_VISIT_DETS INTO l_visit_dets_rec;
6333      CLOSE GET_VISIT_DETS;
6334 
6335      IF l_visit_dets_rec.UNIT_SCHEDULE_ID IS NOT NULL THEN-- Operational Visit
6336          l_is_operational_visit := true;
6337      ELSE-- Normal Visit
6338          l_is_operational_visit := false;
6339      END IF;
6340   ELSE
6341      IF p_is_operational_visit = 'Y' THEN-- Operational Visit
6342          l_is_operational_visit := true;
6343      ELSE-- Normal Visit
6344          l_is_operational_visit := false;
6345      END IF;
6346   END IF;
6347 
6348   IF l_is_operational_visit THEN-- Operational Visit
6349 
6350       l_end_date := p_start_date + (p_duration/24);
6351 
6352       IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
6353         fnd_log.string(fnd_log.level_statement,L_DEBUG_KEY,'Operational Visit - l_end_date : '||TO_CHAR(l_end_date,'DD-MON-YYYY HH24:MI:SS'));
6354         fnd_log.string(fnd_log.level_statement,L_DEBUG_KEY,'l_visit_dets_rec.UNIT_SCHEDULE_ID : '||l_visit_dets_rec.UNIT_SCHEDULE_ID);
6355       END IF;
6356 
6357   ELSE -- Normal Visit
6358 
6359       l_end_date := AHL_VWP_TIMES_PVT.compute_date(p_start_date, p_dept_id, p_duration );
6360 
6361       IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
6362         fnd_log.string(fnd_log.level_statement,L_DEBUG_KEY,'Normal Visit - l_end_date : '||l_end_date);
6363       END IF;
6364 
6365   END IF;
6366 
6367   --RETURN the derived end date.
6368   IF (l_log_procedure >= l_log_current_level) THEN
6369      fnd_log.string(l_log_procedure,
6370                     L_DEBUG_KEY ||'.end',
6371                     'At the end of PL SQL function. End Date = ' || TO_CHAR(l_end_date,'DD-MON-YYYY HH24:MI:SS'));
6372   END IF;
6373   RETURN l_end_date;
6374 
6375 END Compute_Stage_End_Date;
6376 -- PRAKKUM :: 13-FEB-2011 :: Bug 13711800 :: END
6377 
6378 END AHL_VWP_VISITS_STAGES_PVT;