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;