DBA Data[Home] [Help]

PACKAGE BODY: APPS.AHL_VWP_PROJ_PROD_PVT

Source


1 PACKAGE BODY AHL_VWP_PROJ_PROD_PVT AS
2 /* $Header: AHLVPRDB.pls 120.88.12020000.4 2013/03/13 06:34:41 prakkum ship $ */
3 
4 -- Global CONSTANTS
5 G_PKG_NAME             CONSTANT VARCHAR2(30) := 'AHL_VWP_PROJ_PROD_PVT';
6 G_APP_NAME             CONSTANT VARCHAR2(3)  := 'AHL';
7 --G_DEBUG     VARCHAR2(1):= FND_PROFILE.VALUE('AHL_API_FILE_DEBUG_ON');
8 G_DEBUG                VARCHAR2(1)   := AHL_DEBUG_PUB.is_log_enabled;
9 
10 G_PM_PRODUCT_CODE      CONSTANT VARCHAR2(30) := 'AHL';
11 G_TRANS_TSK_TRAIL_NAME CONSTANT VARCHAR2(1) := 'X';  --PRAKKUM :: 11/06/2012 :: Bug 14068468
12 
13 ------------------------------------
14 -- Common constants and variables --
15 ------------------------------------
16 l_log_current_level     NUMBER      := fnd_log.g_current_runtime_level;
17 l_log_statement         NUMBER      := fnd_log.level_statement;
18 l_log_procedure         NUMBER      := fnd_log.level_procedure;
19 l_log_error             NUMBER      := fnd_log.level_error;
20 l_log_unexpected        NUMBER      := fnd_log.level_unexpected;
21 -----------------------------------------------------------------
22 
23 --  Record Type for track on tasks for which jobs has been created
24 TYPE Job_Rec_Type IS RECORD
25    (TASK_ID              NUMBER,
26     WORKORDER_ID         NUMBER,
27     RETURN_STATUS        VARCHAR2(30));
28 
29 --  Table Type for Unit config check on SerialId
30 TYPE Job_Tbl_Type IS TABLE OF Job_Rec_Type
31    INDEX BY BINARY_INTEGER;
32 
33 --  Table Type for Dept for Tasks
34 TYPE Dept_Tbl_Type IS TABLE OF NUMBER
35    INDEX BY BINARY_INTEGER;
36 
37 -------------------------------------------------------------------
38 --  Procedure name : Push_to_Production
39 --  Type           : Private
40 --  Function       : To push a visit to production
41 --  Parameters     :
42 --
43 --  Standard IN  Parameters :
44 --      p_api_version      IN  NUMBER   Required
45 --      p_init_msg_list    IN  VARCHAR2 Default  FND_API.G_FALSE
46 --      p_commit           IN  VARCHAR2 Default  FND_API.G_FALSE
47 --      p_validation_level IN  NUMBER   Default  FND_API.G_VALID_LEVEL_FULL
48 --      p_default          IN  VARCHAR2 Default  FND_API.G_TRUE
49 --      p_module_type      IN  VARCHAR2 Default  NULL.
50 --
51 --  Standard OUT Parameters :
52 --      x_return_status    OUT VARCHAR2 Required
53 --      x_msg_count        OUT NUMBER   Required
54 --      x_msg_data         OUT VARCHAR2 Required
55 --
56 --  Push_to_Production Parameters:
57 --      p_visit_id         IN  NUMBER   Required
58 --      p_release_flag     IN  VARCHAR2 Required
59 --         The visit id which is to be pushed to production.
60 --
61 --  Version :
62 --      Initial Version   1.0
63 -------------------------------------------------------------------
64 PROCEDURE Push_to_Production
65     (p_api_version       IN  NUMBER,
66      p_init_msg_list     IN  VARCHAR2  := Fnd_Api.g_false,
67      p_commit            IN  VARCHAR2  := Fnd_Api.g_false,
68      p_validation_level  IN  NUMBER    := Fnd_Api.g_valid_level_full,
69      p_module_type       IN  VARCHAR2  := Null,
70      p_visit_id          IN  NUMBER,
71      p_release_flag      IN  VARCHAR2  := 'N',
72      p_orig_visit_id     IN  NUMBER    := NULL, -- By yazhou   08/06/04 for TC changes
73      x_return_status     OUT NOCOPY VARCHAR2,
74      x_msg_count         OUT NOCOPY NUMBER,
75      x_msg_data          OUT NOCOPY VARCHAR2
76     );
77 
78 -------------------------------------------------------------------
79 --  Procedure name : Push_MR_to_Production
80 --  Type           : Private
81 --  Function       : To push a MR to production
82 --  Parameters     :
83 --
84 --  Standard IN  Parameters :
85 --      p_api_version          IN  NUMBER   Required
86 --      p_init_msg_list        IN  VARCHAR2 Default  FND_API.G_FALSE
87 --      p_commit               IN  VARCHAR2 Default  FND_API.G_FALSE
88 --      p_validation_level     IN  NUMBER   Default  FND_API.G_VALID_LEVEL_FULL
89 --      p_module_type          IN  VARCHAR2 Default  NULL.
90 --
91 --  Standard OUT Parameters :
92 --      x_return_status        OUT VARCHAR2 Required
93 --      x_msg_count            OUT NUMBER   Required
94 --      x_msg_data             OUT VARCHAR2 Required
95 --
96 --      PRAKKUM :: PIE Changes :: 13-OCT-2010 :: CORRECTION
97 --  Push_MR_to_Production Parameters:
98 --      p_visit_id             IN  NUMBER   Required
99 --      p_unit_effectivity_id  IN  NUMBER   Required
100 --      p_release_flag         IN  VARCHAR2 optional
101 --
102 --  Version :
103 --      Initial Version   1.0 Created by Yazhou
104 -------------------------------------------------------------------
105 PROCEDURE Push_MR_to_Production
106     (p_api_version          IN  NUMBER,
107      p_init_msg_list        IN  VARCHAR2  := Fnd_Api.g_false,
108      p_commit               IN  VARCHAR2  := Fnd_Api.g_false,
109      p_validation_level     IN  NUMBER    := Fnd_Api.g_valid_level_full,
110      p_module_type          IN  VARCHAR2  := Null,
111      p_visit_id             IN  NUMBER,
112      p_unit_effectivity_id  IN  NUMBER,
113      p_release_flag         IN  VARCHAR2  := 'N',
114      --TCHIMIRA::ER 9368251 ::15-JUN-2010 :: Added to include firm-planned flag(1 is Firm and 2 is Planned)as entered by user
115      p_firm_planned_flag    IN  NUMBER,
116      x_return_status        OUT NOCOPY VARCHAR2,
117      x_msg_count            OUT NOCOPY NUMBER,
118      x_msg_data             OUT NOCOPY VARCHAR2
119      );
120 
121 -------------------------------------------------------------------
122 --  Procedure name : Add_MR_to_Project
123 --  Type           : Private
124 --  Function       : To add Project Task for all the tasks for a given MR
125 --                  when SR tasks are created in prodution
126 --  Parameters     :
127 --
128 --  Standard IN  Parameters :
129 --      p_api_version         IN  NUMBER   Required
130 --      p_init_msg_list       IN  VARCHAR2 Default  FND_API.G_FALSE
131 --      p_commit              IN  VARCHAR2 Default  FND_API.G_FALSE
132 --      p_validation_level    IN  NUMBER   Default  FND_API.G_VALID_LEVEL_FULL
133 --      p_default             IN  VARCHAR2 Default  FND_API.G_TRUE
134 --      p_module_type         IN  VARCHAR2 Default  NULL.
135 --
136 --  Standard OUT Parameters :
137 --      x_return_status       OUT VARCHAR2 Required
138 --      x_msg_count           OUT NUMBER   Required
139 --      x_msg_data            OUT VARCHAR2 Required
140 --
141 --      PRAKKUM :: PIE Changes :: 13-OCT-2010 :: CORRECTION
142 --  Add_MR_to_Project Parameters:
143 --      p_visit_id            IN  NUMBER   Required
144 --      p_unit_effectivity_id IN  NUMBER   Required
145 --
146 --  Version :
147 --      Initial Version   1.0 29-Jul-2005 Yazhou
148 -------------------------------------------------------------------
149 PROCEDURE Add_MR_to_Project(
150    p_api_version         IN  NUMBER,
151    p_init_msg_list       IN  VARCHAR2  := Fnd_Api.g_false,
152    p_commit              IN  VARCHAR2  := Fnd_Api.g_false,
153    p_validation_level    IN  NUMBER    := Fnd_Api.g_valid_level_full,
154    p_module_type         IN  VARCHAR2  := Null,
155    p_visit_id            IN  NUMBER,
156    p_unit_effectivity_id IN  NUMBER,
157    x_return_status       OUT NOCOPY VARCHAR2,
158    x_msg_count           OUT NOCOPY NUMBER,
159    x_msg_data            OUT NOCOPY VARCHAR2
160   );
161 
162 -------------------------------------------------------------------
163 --  Procedure name : Create_Project
164 --  Type           : Private
165 --  Function       : To create Project when visit is pushed to projects
166 --  Parameters     :
167 --
168 --------------------------------------------------------------------
169 PROCEDURE Create_Project(
170    p_visit_id      IN  NUMBER,
171    x_return_status OUT NOCOPY VARCHAR2
172    );
173 
174 ------------------------------------------------------------------
175 --  Procedure name : Validate_tasks_bef_production
176 --  Type           : Private
177 --  Function       : Validate the tasks before pushing the tasks to prodn.
178 --  Parameters     :
179 --
180 --  Standard OUT Parameters :
181 --      x_return_status OUT VARCHAR2      Required
182 --      x_msg_count     OUT NUMBER        Required
183 --      x_msg_data      OUT VARCHAR2      Required
184 --
185 --  Validate_tasks_bef_production Parameters:
186 --      p_visit_id      IN  NUMBER        Required
187 --      p_tasks_tbl     IN  Task_Tbl_Type Required
188 --      x_tasks_tbl     OUT Task_Tbl_Type Required
189 --
190 --  Version :
191 --      30 November, 2007  RNAHATA  Initial Version - 1.0
192 -------------------------------------------------------------------
193 
194 PROCEDURE Validate_tasks_bef_production(
195     p_visit_id       IN         NUMBER,
196     p_tasks_tbl      IN         Task_Tbl_Type,
197     x_tasks_tbl      OUT NOCOPY Task_Tbl_Type,
198     x_return_status  OUT NOCOPY VARCHAR2,
199     x_msg_count      OUT NOCOPY NUMBER,
200     x_msg_data       OUT NOCOPY VARCHAR2
201 );
202 
203 -------------------------------------------------------------------
204 --  Procedure name : Push_tasks_to_production
205 --  Type           : Private
206 --  Function       : Push the selected tasks to production.
207 --  Parameters     :
208 --
209 --  Standard IN  Parameters :
210 --      p_api_version      IN  NUMBER        Required
211 --      p_init_msg_list    IN  VARCHAR2      Default  FND_API.G_FALSE
212 --      p_commit           IN  VARCHAR2      Default  FND_API.G_FALSE
213 --      p_validation_level IN  NUMBER        Default  FND_API.G_VALID_LEVEL_FULL
214 --      p_module_type      IN  VARCHAR2      Default  Null
215 --
216 --  Standard OUT Parameters :
217 --      x_return_status    OUT VARCHAR2      Required
218 --      x_msg_count        OUT NUMBER        Required
219 --      x_msg_data         OUT VARCHAR2      Required
220 --
221 --  Push_tasks_to_production Parameters:
222 --       p_visit_id        IN  NUMBER        Required
223 --       p_tasks_tbl       IN  Task_Tbl_Type Required
224 --       p_release_flag    IN  VARCHAR2      Default = 'N'
225 --
226 --  Version :
227 --      30 November, 2007  RNAHATA  Initial Version - 1.0
228 -------------------------------------------------------------------
229 
230 PROCEDURE Push_tasks_to_production(
231     p_api_version      IN         NUMBER,
232     p_init_msg_list    IN         VARCHAR2  := Fnd_Api.g_false,
233     p_validation_level IN         NUMBER    := Fnd_Api.g_valid_level_full,
234     p_module_type      IN         VARCHAR2  := Null,
235     p_visit_id         IN         NUMBER,
236     p_tasks_tbl        IN         Task_Tbl_Type,
237     p_release_flag     IN         VARCHAR2  := 'N',
238     x_return_status    OUT NOCOPY VARCHAR2,
239     x_msg_count        OUT NOCOPY NUMBER,
240     x_msg_data         OUT NOCOPY VARCHAR2
241 );
242 
243 -- AnRaj added for ACL changes in VWP
244 -- Bug number 4297066
245 -------------------------------------------------------------------
246 --  Procedure name      : check_unit_quarantined
247 --  Type                : Private
248 --  Function            : To check whether the Unit is quarantined
249 --  Parameters          : p_visit_id
250 --  Parameters          : item_instance_id
251 ----------------------------------------------------------------------
252 PROCEDURE check_unit_quarantined(
253       p_visit_id       IN  NUMBER,
254       item_instance_id IN  NUMBER
255   );
256 
257 -------------------------------------------------------------------
258 --  Procedure name : Aggregate_Task_Material_Reqrs
259 --  Type           : Private
260 --  Function       : Find the total requirment of a specific
261 --                   item at the task level
262 --  Parameters     :
263 --
264 --  Standard OUT Parameters :
265 --      x_return_status OUT  VARCHAR2 Required
266 --      x_msg_count     OUT  NUMBER   Required
267 --      x_msg_data      OUT  VARCHAR2 Required
268 --
269 --  Aggregate_Task_Material_Reqrs Parameters:
270 --      p_task_id       IN   NUMBER   Required
271 --
272 --  Version :
273 --      30 November, 2007  RNAHATA  Initial Version - 1.0
274 -------------------------------------------------------------------
275 PROCEDURE Aggregate_Task_Material_Reqrs
276     (p_api_version      IN         NUMBER,
277      p_init_msg_list    IN         VARCHAR2,
278      p_commit           IN         VARCHAR2,
279      p_validation_level IN         NUMBER,
280      p_module_type      IN         VARCHAR2,
281      p_task_id          IN         NUMBER,
282      p_rel_tsk_flag     IN         VARCHAR2 := 'Y',
283      x_return_status    OUT NOCOPY VARCHAR2,
284      x_msg_count        OUT NOCOPY NUMBER,
285      x_msg_data         OUT NOCOPY VARCHAR2
286     );
287 
288 PROCEDURE Aggregate_Material_Reqrs
289     (p_api_version      IN          NUMBER,
290      p_init_msg_list    IN          VARCHAR2,
291      p_commit           IN          VARCHAR2,
292      p_validation_level IN          NUMBER,
293      p_module_type      IN          VARCHAR2,
294      p_visit_id         IN          NUMBER,
295      x_return_status    OUT NOCOPY  VARCHAR2,
296      x_msg_count        OUT NOCOPY  NUMBER,
297      x_msg_data         OUT NOCOPY  VARCHAR2
298     );
299 
300 
301 -- PRAKKUM :: PIE :: 13-OCT-2010 :: START
302 -- Added new this procedure
303 -------------------------------------------------------------------
304 --  Procedure name    : Add_Task_To_Project_Int
305 --  Type              : Private
306 --  Function          : New helper function to call from Add_MR_to_Project
307 --  Parameters :
308 --  Add_Task_To_Project_Int Parameters
309 --      p_project_id            IN NUMBER              Required
310 --      p_project_number        IN VARCHAR2            Required
311 --      p_task_number           IN VARCHAR2            Required
312 --      p_task_reference        IN VARCHAR2            Required
313 --      p_task_name             IN VARCHAR2            Required
314 --      p_task_description      IN VARCHAR2            Required
315 --      p_task_start_date       IN DATE                Required
316 --      p_task_completion_date  IN DATE                Required
317 --      p_parent_task_reference IN VARCHAR2            Required
318 --      x_task_id               OUT NOCOPY NUMBER      Required
319 --
320 --  Standard OUT Parameters :
321 --      x_return_status           OUT     VARCHAR2     Required
322 --      x_msg_count               OUT     NUMBER       Required
323 --      x_msg_data                OUT     VARCHAR2     Required
324 --
325 --  Version :
326 -------------------------------------------------------------------
327 
328 PROCEDURE Add_Task_To_Project_Int(
329    p_project_id            IN NUMBER,
330    p_project_number        IN VARCHAR2,
331    p_task_number           IN VARCHAR2,
332    p_task_reference        IN VARCHAR2,
333    p_task_name             IN VARCHAR2,
334    p_long_task_name        IN VARCHAR2,
335    p_task_description      IN VARCHAR2,
336    p_task_start_date       IN DATE,
337    p_task_completion_date  IN DATE,
338    p_parent_task_reference IN VARCHAR2,
339    p_service_type_code     IN VARCHAR2,
340    x_return_status     OUT NOCOPY VARCHAR2,
341    x_msg_count         OUT NOCOPY NUMBER,
342    x_msg_data          OUT NOCOPY VARCHAR2,
343    x_task_id           OUT NOCOPY NUMBER
344 );
345 
346 -- To sort a table of Project Tasks by their display_sequence.
347 PROCEDURE Sort_Task_Table (p_x_task_tbl IN OUT NOCOPY PA_PROJECT_PUB.TASK_IN_TBL_TYPE);
348 
349 -- PRAKKUM :: PIE :: 13-OCT-2010 :: END
350 
351 -- salogan added for supplier warranty starts
352 PROCEDURE Get_Entl_rec_for_delete(
353         p_visit_id          IN         NUMBER,
354         x_warranty_entl_tbl OUT NOCOPY AHL_WARRANTY_ENTL_PVT.Warranty_Entl_Tbl_Type
355 );
356 -- salogan added for supplier warranty ends
357 
358 -- SKPATHAK :: ER:12730539 :: 01-AUG-2011
359 -- To validate whether the passed stages have any predessor stage in planning status
360 PROCEDURE Validate_Stage_Predecessors ( p_visit_id               IN         NUMBER,
361                                         p_stages_tbl             IN         AHL_VWP_VISITS_STAGES_PVT.Visit_Stages_Tbl_Type,
362                                         x_has_pre_in_planning    OUT NOCOPY VARCHAR2);
363 
364 -- SATRAJEN :: Bug 12990261 :: FUnction to sum up all the error messages :: Jun 2012.
365 -- Same functionality as the procedure Validate_MR_Route_Date except for raising the error messages in the same place.
366 
367 FUNCTION Validate_MR_Route_Date(
368    p_mr_route_id       IN  NUMBER,
369    p_visit_task_number IN  NUMBER,
370    p_start_date_time   IN  DATE,
371    p_end_date_time     IN  DATE
372   )
373 RETURN NUMBER; -- PRAKKUM :: FPBug 16481732 for BaseBug 15884730 :: 16/11/2012
374 
375   -- SATRAJEN :: End of Bug 12990261 :: Jun 2012.
376 
377 --TCHIMIRA::P2P CP ER 9151144::02-DEC-2009::BEGIN
378 --------------------------------------------------------------------
379 -- PROCEDURE
380 --    BG_Release_Visit
381 --
382 -- PURPOSE
383 --    To carry push to Production and Plan Visit as background processes
384 --  Parameters :
385 
386 --  Standard IN Parameters :
387 --      p_commit      IN    VARCHAR2  Fnd_Api.G_FALSE
388 --
389 --  Standard OUT Parameters :
390 --      x_return_status    OUT   VARCHAR2   Required
391 --      x_msg_count        OUT   NUMBER     Required
392 --      x_msg_data         OUT   VARCHAR2   Required
393 
394 --  BG_Release_visit Parameters  :
395 --      p_visit_id         IN    NUMBER      Required
396 --         visit id is required to get visit number and passed to concurrent program
397 --      p_release_flag     IN    VARCHAR2    Required
398 --         This is passed to concurrent program as an argument
399 --      x_request_id       OUT   NUMBER     Required
400 --         Stores request id that is passed from concurrent program
401 
402 --  Version :
403 --      02 Dec, 2009    P2P CP ER 9151144 TCHIMIRA  Initial Version - 1.0
404 --------------------------------------------------------------------
405 PROCEDURE BG_Release_Visit
406 ( p_api_version      IN            NUMBER,
407   p_init_msg_list    IN            VARCHAR2  := Fnd_Api.G_FALSE,
408   p_commit           IN            VARCHAR2  := Fnd_Api.G_FALSE,
409   p_validation_level IN            NUMBER    := Fnd_Api.G_VALID_LEVEL_FULL,
410   p_module_type      IN            VARCHAR2  := NULL,
411   p_visit_id         IN            NUMBER,
412   p_release_flag     IN            VARCHAR2 := 'U',
413   x_request_id        OUT NOCOPY NUMBER,
414   x_return_status    OUT NOCOPY VARCHAR2,
415   x_msg_count        OUT NOCOPY NUMBER,
416   x_msg_data         OUT NOCOPY VARCHAR2
417 )
418 IS
419   --Standard local variables
420   L_API_NAME         CONSTANT VARCHAR2(30)  := 'BG_Release_Visit';
421   L_API_VERSION      CONSTANT NUMBER        := 1.0;
422   L_DEBUG_KEY        CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
423   l_msg_data                  VARCHAR2(2000);
424   l_return_status             VARCHAR2(1);
425   l_msg_count                 NUMBER;
426   l_Error_Tbl_Type            Error_Tbl_Type;
427   l_error_msg                 VARCHAR2(5000);
428   l_error_count               NUMBER;
429   l_commit                    VARCHAR2(1) := 'F';
430   l_validate_error            CONSTANT VARCHAR2(1) := 'V';
431   l_req_id                    NUMBER;
432   l_phase_code                VARCHAR2(1);
433   l_curr_org_id               NUMBER;
434   -- SKPATHAK :: 02-MAY-2011 :: VWPE: ER:12424063  :: Added below two local variables
435   l_visit_status              VARCHAR2(30);
436   l_module_type               VARCHAR2(3) := p_module_type;
437 
438   -- To find visit related information
439   CURSOR c_visit (c_id IN NUMBER) IS
440    SELECT * FROM AHL_VISITS_B
441      WHERE VISIT_ID = c_id
442      FOR UPDATE OF OBJECT_VERSION_NUMBER;
443   c_visit_rec c_visit%ROWTYPE;
444 
445   --Cursor to fetch phase
446   --salogan::Modified the cursor to handle both request id from P2P and Cost Estimation CP ER 9299910::01-JUN-2009::BEGIN
447   --Cursor to fetch phase
448   CURSOR c_conc_req_phase(c_id IN NUMBER) IS
449     SELECT 'X'
450      FROM FND_CONCURRENT_REQUESTS FCR, AHL_VISITS_B AVB
451      WHERE FCR.REQUEST_ID IN ( AVB.CST_EST_REQUEST_ID, AVB.REQUEST_ID )
452      AND FCR.PHASE_CODE IN ('P', 'R')
453      AND AVB.VISIT_ID = c_id;
454      l_dummy_val c_conc_req_phase%ROWTYPE;
455   --salogan::Modified the cursor to handle both request id from P2P and Cost Estimation CP ER 9299910::01-JUN-2009::END
456 
457   -- SKPATHAK :: 02-MAY-2011 :: VWPE: ER:12424063
458   --Get visit status
459   CURSOR get_visit_status (c_visit_id IN NUMBER) IS
460   SELECT status_code
461   FROM ahl_visits_b
462   WHERE visit_id = c_visit_id;
463 
464 --CHANGES by jrotich bug #13028686 begin
465   CURSOR c_stages_without_types(c_visit_id IN NUMBER ) IS
466     SELECT DISTINCT STAGES.STAGE_ID ,
467       STAGES.STAGE_NAME
468     FROM AHL_VISIT_TASKS_B TASKS,
469       AHL_VWP_STAGES_VL STAGES
470     WHERE
471       TASKS.VISIT_ID= c_visit_id AND
472       STAGES.STAGE_ID=TASKS.STAGE_ID AND
473       TASKS.TASK_TYPE_CODE <> 'STAGE' AND --SKPATHAK :: stages not having any visit tasks need not be validated
474       NOT EXISTS (
475         SELECT STAGE_ID
476         FROM AHL_VISIT_STAGE_TYP_ASOC
477         WHERE STAGE_ID=STAGES.STAGE_ID);
478   l_invalid_stage BOOLEAN;
479 --CHANGES by jrotich bug #13028686 end
480 
481 BEGIN
482 
483     IF (l_log_procedure >= l_log_current_level) THEN
484       fnd_log.string(l_log_procedure,L_DEBUG_KEY||'.begin','At the start of the PLSQL procedure. Visit Id = ' || p_visit_id);
485     END IF;
486     -- Standard start of API savepoint
487     SAVEPOINT BG_Release_Visit_Pvt;
488 
489     -- Initialize message list if p_init_msg_list is set to TRUE
490     IF FND_API.To_Boolean(p_init_msg_list) THEN
491        FND_MSG_PUB.Initialize;
492     END IF;
493     -- Initialize API return status to success
494     x_return_status := FND_API.G_RET_STS_SUCCESS;
495 
496     -- Standard call to check for call compatibility.
497     IF NOT FND_API.COMPATIBLE_API_CALL(l_api_version,
498                                        p_api_version,
499                                        l_api_name,G_PKG_NAME) THEN
500       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
501     END IF;
502 
503     -- Check for Required Parameters
504     IF(p_visit_id IS NULL OR p_visit_id = FND_API.G_MISS_NUM) THEN
505         FND_MESSAGE.Set_Name(G_PM_PRODUCT_CODE,'AHL_VWP_CST_INPUT_MISS');
506         FND_MSG_PUB.ADD;
507         IF (l_log_unexpected >= l_log_current_level)THEN
508             fnd_log.string
509             (
510                 l_log_unexpected,
511                 'ahl.plsql.AHL_VWP_CST_WO_PVT.Release_Visit',
512                 'Visit id is mandatory but found null in input '
513             );
514         END IF;
515         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
516     END IF;
517 
518     --salogan::Modified the cursor fetch to handle both request id from P2P and Cost Estimation CP ER 9299910::01-JUN-2009::BEGIN
519     OPEN c_conc_req_phase(p_visit_id);
520     FETCH c_conc_req_phase INTO l_dummy_val;
521       IF(c_conc_req_phase%FOUND) THEN
522         FND_MESSAGE.Set_Name(G_PM_PRODUCT_CODE,'AHL_VWP_CP_P2P_IN_PROGS');
523         FND_MSG_PUB.ADD;
524         RAISE FND_API.G_EXC_ERROR;
525       END IF;
526     CLOSE c_conc_req_phase;
527     --salogan::Modified the cursor fetch to handle both request id from P2P and Cost Estimation CP ER 9299910::01-JUN-2009::END
528 
529     -- SKPATHAK :: 02-MAY-2011 :: VWPE: ER:12424063
530     -- If the concurrent program has been launched for plan visit, pass 'CST' as the module type so that WOs are created in DRAFT status
531     OPEN get_visit_status (p_visit_id);
532     FETCH get_visit_status INTO l_visit_status;
533     IF get_visit_status%NOTFOUND THEN
534        FND_MESSAGE.Set_Name(G_PM_PRODUCT_CODE,'AHL_VWP_INVALID_VST');
535        FND_MESSAGE.SET_TOKEN('VISIT_ID', p_visit_id);
536        FND_MSG_PUB.ADD;
537        CLOSE get_visit_status;
538        RAISE FND_API.G_EXC_ERROR;
539     END IF;
540     CLOSE get_visit_status;
541     -- If visit status is draft, CP for plan visit need to be launched
542     IF l_visit_status = 'DRAFT' THEN
543       l_module_type := 'CST';
544     END IF;
545     --CHANGES by jrotich bug #13028686 begin
546     IF l_visit_status <> 'DRAFT' THEN -- SKPATHAK :: have this validation only during P2P and NOT during plan visit
547       IF (l_log_statement >= l_log_current_level)THEN
548            fnd_log.string (l_log_statement,L_DEBUG_KEY, 'Validating stage details, visit status: '||l_visit_status);
549       END IF;
550 
551       l_invalid_stage :=FALSE;
552       FOR stage_details_rec in c_stages_without_types(p_visit_id)
553       LOOP
554         l_invalid_stage :=TRUE;
555         IF (l_log_statement >= l_log_current_level) THEN
556           fnd_log.string(l_log_statement,
557                          L_DEBUG_KEY,
558                          'Stage does not have an associated stage type ' ||
559                          stage_details_rec.stage_name);
560         END IF;
561         FND_MESSAGE.SET_NAME('AHL', 'AHL_VWP_NO_STAGE_TYPE');
562         FND_MESSAGE.SET_TOKEN('STAGE_NAME',stage_details_rec.stage_name);
563         FND_MSG_PUB.ADD;
564 
565       END LOOP;
566     END IF;
567 
568     IF(l_invalid_stage=TRUE) THEN
569       RAISE FND_API.G_EXC_ERROR;
570     END IF;
571 
572     --CHANGES by jrotich bug #13028686 END
573 
574     IF (l_log_statement >= l_log_current_level)THEN
575          fnd_log.string (l_log_statement,L_DEBUG_KEY, 'Before Calling AHL_VWP_PROJ_PROD_PVT.Validate_Before_Production, visit status: '||l_visit_status);
576     END IF;
577 
578     --Valdate before push to production happens
579     AHL_VWP_PROJ_PROD_PVT.Validate_Before_Production
580               (p_api_version      => l_api_version,
581                p_init_msg_list    => p_init_msg_list,
582                p_commit           => l_commit,
583                p_validation_level => p_validation_level,
584                p_module_type      => l_module_type,
585                p_visit_id         => p_visit_id,
586                x_error_tbl        => l_error_tbl_type,
587                x_return_status    => l_return_status,
588                x_msg_count        => l_msg_count,
589                x_msg_data         => l_msg_data);
590 
591     IF (l_log_statement >= l_log_current_level)THEN
592       fnd_log.string (l_log_statement, L_DEBUG_KEY, 'After Calling AHL_VWP_PROJ_PROD_PVT.Validate_Before_Production - l_return_status = '||l_return_status);
593     END IF;
594 
595     IF l_error_tbl_type.COUNT > 0 THEN
596        l_return_status := l_validate_error;
597        x_return_status := l_validate_error;
598     ELSIF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
599       -- Check Error Message stack.
600        x_msg_count := FND_MSG_PUB.count_msg;
601 
602        IF (l_log_statement >= l_log_current_level)THEN
603           fnd_log.string ( l_log_statement, L_DEBUG_KEY,'Errors from AHL_VWP_PROJ_PROD_PVT.Validate_Before_Production - '||x_msg_count);
604        END IF;
605        RAISE Fnd_Api.g_exc_error;
606     ELSE
607        --salogan::Commented the repeated code CP ER 9299910::01-JUN-2009::BEGIN
608        --IF(l_phase_code IN('R' , 'P')) THEN
609               --FND_MESSAGE.Set_Name(G_PM_PRODUCT_CODE,'AHL_VWP_CP_P2P_IN_PROGS');
610               --FND_MSG_PUB.ADD;
611               --RAISE FND_API.G_EXC_ERROR;
612        --END IF;
613        --salogan::Commented the repeated code CP ER 9299910::01-JUN-2009::END
614 
615        IF (l_log_statement >= l_log_current_level) THEN
616               FND_LOG.STRING(l_log_statement,L_DEBUG_KEY,
617                              ' Before calling concurrent program to push the visit to production ');
618        END IF;
619 
620        OPEN c_visit(p_visit_id);
621        FETCH c_visit INTO c_visit_rec;
622 
623        IF (l_log_statement >= l_log_current_level) THEN
624                 fnd_log.string(l_log_statement,L_DEBUG_KEY, 'concurrent parameter values  p_api_version ->       '||p_api_version||' , visit_number -> '||c_visit_rec.visit_number||' , p_release_flag -> '||p_release_flag);
625        END IF;
626 
627        l_curr_org_id := MO_GLOBAL.get_current_org_id();
628        FND_REQUEST.SET_ORG_ID(l_curr_org_id);
629 
630        -- SKPATHAK :: 02-MAY-2011 :: VWPE: ER:12424063
631        -- If the visit status is DRAFT, treat the call of this API from front end as Plan_visit else as P2P
632        -- Also note that we are passing the fourth argument 'caller' as JAVA, since this API is being called from JAVA layer
633        -- The concurrent programs can also be launched through FORM, in which case FORMS will be passed as caller to BG_Push_to_Production
634        IF l_visit_status = 'DRAFT' THEN
635          l_req_id := FND_REQUEST.SUBMIT_REQUEST(
636                           application =>  'AHL',
637                           program     => 'AHLVWPPLN',  --launch concurrent program for plan_visit
638                           argument1   => p_api_version,
639                           argument2   => c_visit_rec.visit_number,
640                           argument3   => p_release_flag,
641                           argument4   => 'JAVA');
642        ELSE
643          l_req_id := FND_REQUEST.SUBMIT_REQUEST(
644                           application =>  'AHL',
645                           program     => 'AHLVWPP2P',  --launch concurrent program for P2P
646                           argument1   => p_api_version,
647                           argument2   => c_visit_rec.visit_number,
648                           argument3   => p_release_flag);
649        END IF;
650 
651        IF (l_log_statement >= l_log_current_level) THEN
652        fnd_log.string(l_log_statement,L_DEBUG_KEY,'l_req_id = '|| l_req_id);
653        END IF;
654 
655        IF (l_req_id = 0) THEN
656          IF (l_log_statement >= l_log_current_level) THEN
657                 fnd_log.string(l_log_statement,L_DEBUG_KEY, ' Concurrent program request failed.');
658          END IF;
659        ELSE
660          IF (l_log_statement >= l_log_current_level) THEN
661                 fnd_log.string(l_log_statement,L_DEBUG_KEY, ' Concurrent program request successful.');
662          END IF;
663 
664         x_request_id := l_req_id;
665        --Update the table with l_req_id
666        UPDATE ahl_visits_b
667         SET REQUEST_ID = l_req_id,
668         OBJECT_VERSION_NUMBER = object_version_number + 1,-- PRAKKUM :: PIE :: 13-OCT-2010 ::
669         LAST_UPDATE_DATE      = SYSDATE,
670         LAST_UPDATED_BY       = Fnd_Global.USER_ID,
671         LAST_UPDATE_LOGIN     = Fnd_Global.LOGIN_ID
672         WHERE visit_id = p_visit_id;
673         CLOSE c_visit;
674         COMMIT WORK;
675 
676       END IF;
677     END IF;
678     IF (l_log_procedure >= l_log_current_level)THEN
679         fnd_log.string ( l_log_procedure,L_DEBUG_KEY ||'.end','At the end of PLSQL procedure, x_return_status=' || x_return_status);
680     END IF;
681 EXCEPTION
682    WHEN FND_API.G_EXC_ERROR THEN
683       x_return_status := FND_API.G_RET_STS_ERROR;
684       ROLLBACK TO BG_Release_Visit_Pvt;
685       FND_MSG_PUB.count_and_get(
686             p_count => x_msg_count,
687             p_data  => x_msg_data,
688             p_encoded => fnd_api.g_false);
689 
690    WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
691       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
692       ROLLBACK TO BG_Release_Visit_Pvt;
693       FND_MSG_PUB.count_and_get(
694             p_count => x_msg_count,
695             p_data  => x_msg_data,
696             p_encoded => fnd_api.g_false);
697 
698    WHEN OTHERS THEN
699       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
700       ROLLBACK TO BG_Release_Visit_Pvt;
701       IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
702       fnd_msg_pub.add_exc_msg(
703             p_pkg_name       => G_PKG_NAME,
704             p_procedure_name => 'BG_Release_Visit',
705             p_error_text     => SUBSTR(SQLERRM,1,500));
706       END IF;
707     FND_MSG_PUB.count_and_get(p_count => x_msg_count,
708                               p_data  => x_msg_data,
709                               p_encoded => fnd_api.g_false);
710 
711 END BG_Release_Visit;
712 --------------------------------------------------------------------
713 -- PROCEDURE
714 --    BG_Push_to_Production
715 --
716 -- PURPOSE
717 --    Made as an executable for the P2P CP and for Plan_visit CP
718 --  BG_Push_to_Production Parameters :
719 --      p_visit_number      IN    NUMBER
720 --      errbuf              OUT   VARCHAR2   Required
721 --         Defines in pl/sql to store procedure to get error messages into log file
722 --      retcode             OUT   NUMBER     Required
723 --         To get the status of the concurrent program
724 
725 --  Version :
726 --      02 Dec, 2009    P2P CP ER 9151144 TCHIMIRA  Initial Version - 1.0
727 --------------------------------------------------------------------
728 PROCEDURE BG_Push_to_Production(
729     errbuf            OUT NOCOPY VARCHAR2,
730     retcode           OUT NOCOPY NUMBER,
731     p_api_version     IN  NUMBER,
732     p_visit_number    IN  NUMBER,
733     p_release_flag    IN  VARCHAR2 := 'U',
734     p_caller          IN  VARCHAR2  := NULL
735 )
736 IS
737 
738 
739 -- Local variables section
740 l_msg_count             NUMBER;
741 l_msg_data              VARCHAR2(2000);
742 l_return_status         VARCHAR2(1);
743 l_api_version           NUMBER := 1.0;
744 l_api_name              VARCHAR2(30) := 'BG_Push_to_Production';
745 l_err_msg               VARCHAR2(2000);
746 l_msg_index_out         NUMBER;
747 l_visit_id              NUMBER;
748 
749 BEGIN
750 
751    -- Standard start of API savepoint
752    SAVEPOINT BG_Push_to_Production;
753 
754    -- 1. Initialize error message stack by default
755    FND_MSG_PUB.Initialize;
756 
757    -- Standard call to check for call compatibility
758    IF NOT FND_API.Compatible_API_Call(l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
759       retcode := 2;
760       errbuf := FND_MSG_PUB.Get;
761       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
762    END IF;
763 
764    -- 2. Dump all input parameters
765    fnd_file.put_line(fnd_file.log, '*************API input parameters**************');
766    fnd_file.put_line(fnd_file.log, 'p_visit_number -> '|| p_visit_number);
767    fnd_file.put_line(fnd_file.log, 'p_caller -> '|| p_caller);
768    fnd_file.put_line(fnd_file.log, 'p_release_flag -> '||p_release_flag);
769    fnd_file.put_line(fnd_file.log, 'fnd_global.USER_ID -> '|| fnd_global.USER_ID);
770    fnd_file.put_line(fnd_file.log, 'fnd_global.RESP_ID -> '||fnd_global.RESP_ID);
771    fnd_file.put_line(fnd_file.log, 'fnd_global.PROG_APPL_ID -> '|| fnd_global.PROG_APPL_ID);
772    fnd_file.put_line(fnd_file.log, 'mo_global.get_current_org_id -> '|| mo_global.get_current_org_id());
773 
774    SELECT visit_id INTO l_visit_id FROM AHL_VISITS_B WHERE visit_number = p_visit_number;
775 
776    IF l_visit_id IS NOT NULL THEN
777 
778    fnd_file.put_line(fnd_file.log, 'before calling AHL_VWP_PROJ_PROD_PVT.Release_visit');
779    fnd_file.put_line(fnd_file.log, 'visit_id -> '||l_visit_id);
780 
781 
782       -- SKPATHAK :: 02-MAY-2011 :: VWPE: ER:12424063
783       --If the caller if 'FORMS' or 'JAVA', then the request has been launched for Plan_Visit else for P2P
784       IF p_caller IN ('FORMS', 'JAVA') THEN
785          AHL_VWP_PROJ_PROD_PVT.plan_visit(
786            p_api_version           => p_api_version,
787            p_init_msg_list         => Fnd_Api.G_FALSE,
788            p_commit                => Fnd_Api.g_false,
789            p_validation_level      => Fnd_Api.G_VALID_LEVEL_FULL,
790            p_caller                => p_caller,
791            p_visit_id              => l_visit_id,
792            x_return_status         => l_return_status,
793            x_msg_count             => l_msg_count,
794            x_msg_data              => l_msg_data);
795 
796          l_msg_count := FND_MSG_PUB.Count_Msg;
797          IF (l_msg_count > 0) THEN
798             fnd_file.put_line(fnd_file.log, 'Following error occured while plan visit..');
799             IF (l_return_status = FND_API.G_RET_STS_ERROR) THEN
800                 RAISE FND_API.G_EXC_ERROR;
801             ELSE
802                 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
803             END IF;
804          END IF;
805       ELSE
806          AHL_VWP_PROJ_PROD_PVT.Release_Visit(
807                 p_api_version      =>         p_api_version,
808                 p_module_type      =>         'JSP',  --passing p_module_type as JSP
809                 p_visit_id         =>         l_visit_id,
810                 p_release_flag     =>         p_release_flag,
811                 x_return_status    =>         l_return_status,
812                 x_msg_count        =>         l_msg_count,
813                 x_msg_data         =>         l_msg_data);
814 
815          l_msg_count := FND_MSG_PUB.Count_Msg;
816          IF (l_msg_count > 0) THEN
817             fnd_file.put_line(fnd_file.log, 'Following error occured while pushing the visit to production..');
818             IF (l_return_status = FND_API.G_RET_STS_ERROR) THEN
819                 RAISE FND_API.G_EXC_ERROR;
820             ELSE
821                 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
822             END IF;
823          END IF;
824       END IF; --p_caller check
825    END IF; --l_visit_id IS NOT NULL
826 
827 EXCEPTION
828  WHEN FND_API.G_EXC_ERROR THEN
829    ROLLBACK TO BG_Push_to_Production;
830    retcode := 2;
831    FOR i IN 1..l_msg_count
832        LOOP
833          fnd_msg_pub.get( p_msg_index => i,
834                           p_encoded   => FND_API.G_FALSE,
835                           p_data      => l_err_msg,
836                           p_msg_index_out => l_msg_index_out);
837 
838          fnd_file.put_line(FND_FILE.LOG, 'Err message-'||l_msg_index_out||':' || l_err_msg);
839        END LOOP;
840 
841 
842  WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
843    ROLLBACK TO BG_Push_to_Production;
844    retcode := 2;
845    l_msg_count := Fnd_Msg_Pub.count_msg;
846    FOR i IN 1..l_msg_count
847        LOOP
848          fnd_msg_pub.get( p_msg_index => i,
849                           p_encoded   => FND_API.G_FALSE,
850                           p_data      => l_err_msg,
851                           p_msg_index_out => l_msg_index_out);
852 
853          fnd_file.put_line(FND_FILE.LOG, 'Err message-'||l_msg_index_out||':' || l_err_msg);
854        END LOOP;
855 
856 
857  WHEN OTHERS THEN
858    ROLLBACK TO BG_Push_to_Production;
859    retcode := 2;
860    IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
861      fnd_msg_pub.add_exc_msg(p_pkg_name       => G_PKG_NAME,
862                              p_procedure_name => 'BG_Push_to_Production',
863                              p_error_text     => SUBSTR(SQLERRM,1,500));
864    END IF;
865    l_msg_count := Fnd_Msg_Pub.count_msg;
866    FOR i IN 1..l_msg_count
867      LOOP
868         fnd_msg_pub.get( p_msg_index => i,
869                          p_encoded   => FND_API.G_FALSE,
870                          p_data      => l_err_msg,
871                          p_msg_index_out => l_msg_index_out);
872 
873         fnd_file.put_line(FND_FILE.LOG, 'Err message-'||l_msg_index_out||':' || l_err_msg);
874      END LOOP;
875 
876 
877 END BG_Push_to_Production;
878 --TCHIMIRA::P2P CP ER 9151144::02-DEC-2009::END
879 
880 --****************************************************************--
881 --------------------------------------------------------------------
882 --              VWP INTEGRATION WITH PROJECTS                     --
883 --------------------------------------------------------------------
884 --****************************************************************--
885 
886 --------------------------------------------------------------------
887 -- PROCEDURE
888 --    Integrate_to_Projects
889 --
890 -- PURPOSE
891 --    To Integrate with Projects i.e creating projects for
892 --    visits and project tasks for all associated visit task
893 --------------------------------------------------------------------
894 PROCEDURE Integrate_to_Projects (
895    p_api_version      IN         NUMBER,
896    p_init_msg_list    IN         VARCHAR2 := Fnd_Api.g_false,
897    p_commit           IN         VARCHAR2 := Fnd_Api.g_false,
898    p_validation_level IN         NUMBER   := Fnd_Api.g_valid_level_full,
899    p_module_type      IN         VARCHAR2 := Null,
900    p_visit_id         IN         NUMBER,
901    x_return_status    OUT NOCOPY VARCHAR2,
902    x_msg_count        OUT NOCOPY NUMBER,
903    x_msg_data         OUT NOCOPY VARCHAR2)
904 
905 IS
906    L_API_VERSION CONSTANT NUMBER        := 1.0;
907    L_API_NAME    CONSTANT VARCHAR2(30)  := 'Integrate_to_Projects';
908    L_DEBUG_KEY   CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
909 
910    -- To find visit related information
911    CURSOR c_visit (x_id IN NUMBER) IS
912     SELECT * FROM AHL_VISITS_VL
913     WHERE VISIT_ID = x_id;
914    c_visit_rec c_visit%ROWTYPE;
915 
916 BEGIN
917    --------------------- initialize -----------------------
918    SAVEPOINT Integrate_to_Projects;
919 
920    IF (l_log_procedure >= l_log_current_level) THEN
921       fnd_log.string(l_log_procedure,
922                      L_DEBUG_KEY ||'.begin',
923                      'At the start of PL SQL procedure. Visit Id = ' || p_visit_id);
924    END IF;
925 
926    -- Initialize message list if p_init_msg_list is set to TRUE.
927    IF Fnd_Api.to_boolean(p_init_msg_list) THEN
928       Fnd_Msg_Pub.initialize;
929    END IF;
930 
931    --  Initialize API return status to success
932    x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
933 
934    -- Standard call to check for call compatibility.
935    IF NOT Fnd_Api.COMPATIBLE_API_CALL(l_api_version,
936                                       p_api_version,
937                                       l_api_name,G_PKG_NAME)
938    THEN
939        RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
940    END IF;
941 
942    IF (l_log_statement >= l_log_current_level) THEN
943        fnd_log.string(l_log_statement,L_DEBUG_KEY,'Visit Id= '|| p_visit_id);
944    END IF;
945 
946    OPEN c_visit (p_visit_id);
947    FETCH c_visit INTO c_visit_rec;
948    CLOSE c_visit;
949 
950    IF (l_log_statement >= l_log_current_level) THEN
951        fnd_log.string(l_log_statement,L_DEBUG_KEY,'Visits Project Id = '|| c_visit_rec.PROJECT_ID);
952    END IF;
953 
954    IF c_visit_rec.PROJECT_ID IS NULL THEN
955        IF (l_log_statement >= l_log_current_level) THEN
956            fnd_log.string(l_log_statement,L_DEBUG_KEY,'Before calling Create_Project');
957        END IF;
958 
959       -- Call Create_Project local procedure to create project  tasks
960          Create_Project (
961                 p_visit_id      => p_visit_id,
962                 x_return_status => x_return_status);
963 
964        IF (l_log_statement >= l_log_current_level) THEN
965              fnd_log.string(l_log_statement,L_DEBUG_KEY,'After calling Create_Project - '||x_return_status);
966        END IF;
967    ELSE
968        IF (l_log_statement >= l_log_current_level) THEN
969            fnd_log.string(l_log_statement,L_DEBUG_KEY,'Before calling Update_Project');
970        END IF;
971 
972       -- Call Update_Project local procedure to update project tasks
973       Update_Project (
974              p_api_version      => p_api_version,
975              p_init_msg_list    => p_init_msg_list,
976              p_commit           => p_commit,
977              p_validation_level => p_validation_level,
978              p_module_type      => p_module_type,
979              p_visit_id         => p_visit_id,
980              x_return_status    => x_return_status,
981              x_msg_count        => x_msg_count,
982              x_msg_data         => x_msg_data);
983 
984        IF (l_log_statement >= l_log_current_level) THEN
985              fnd_log.string(l_log_statement,L_DEBUG_KEY,'After calling Update_Project - '||x_return_status);
986        END IF;
987    END IF;
988 
989  ---------------------------End of Body-------------------------------------
990   --
991   -- END of API body.
992   --
993   -- Standard check of p_commit.
994    IF Fnd_Api.To_Boolean ( p_commit ) THEN
995       COMMIT WORK;
996    END IF;
997 
998    Fnd_Msg_Pub.count_and_get(
999          p_encoded => Fnd_Api.g_false,
1000          p_count   => x_msg_count,
1001          p_data    => x_msg_data
1002   );
1003 
1004    IF (l_log_procedure >= l_log_current_level) THEN
1005        fnd_log.string(l_log_procedure,L_DEBUG_KEY ||'.end','End of PL/SQL procedure');
1006    END IF;
1007 
1008 EXCEPTION
1009    WHEN Fnd_Api.g_exc_error THEN
1010       ROLLBACK TO Integrate_to_Projects;
1011       x_return_status := Fnd_Api.g_ret_sts_error;
1012       Fnd_Msg_Pub.count_and_get (
1013             p_encoded => Fnd_Api.g_false,
1014             p_count   => x_msg_count,
1015             p_data    => x_msg_data
1016      );
1017    WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
1018       ROLLBACK TO Integrate_to_Projects;
1019       x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
1020       Fnd_Msg_Pub.count_and_get (
1021             p_encoded => Fnd_Api.g_false,
1022             p_count   => x_msg_count,
1023             p_data    => x_msg_data
1024      );
1025    WHEN OTHERS THEN
1026       ROLLBACK TO Integrate_to_Projects;
1027       x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
1028       IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_unexp_error) THEN
1029          Fnd_Msg_Pub.add_exc_msg (G_PKG_NAME, L_API_NAME);
1030       END IF;
1031       Fnd_Msg_Pub.count_and_get (
1032             p_encoded => Fnd_Api.g_false,
1033             p_count   => x_msg_count,
1034             p_data    => x_msg_data
1035      );
1036 END Integrate_to_Projects;
1037 
1038 -- PRAKKUM :: PIE :: 13-OCT-2010
1039 -- Commented out this procedure as it is no longer in use
1040 /*
1041 --------------------------------------------------------------------
1042 -- PROCEDURE
1043 --    Add_Task_to_Project
1044 --
1045 -- PURPOSE
1046 --
1047 --
1048 --------------------------------------------------------------------
1049 PROCEDURE Add_Task_to_Project(
1050    p_api_version      IN         NUMBER,
1051    p_init_msg_list    IN         VARCHAR2  := Fnd_Api.g_false,
1052    p_commit           IN         VARCHAR2  := Fnd_Api.g_false,
1053    p_validation_level IN         NUMBER    := Fnd_Api.g_valid_level_full,
1054    p_module_type      IN         VARCHAR2  := Null,
1055    p_visit_task_id    IN         NUMBER,
1056 
1057    x_return_status    OUT NOCOPY VARCHAR2,
1058    x_msg_count        OUT NOCOPY NUMBER,
1059    x_msg_data         OUT NOCOPY VARCHAR2
1060  )
1061 IS
1062    L_API_VERSION  CONSTANT NUMBER := 1.0;
1063    L_API_NAME     CONSTANT VARCHAR2(30)  := 'Add_Task_to_Project';
1064    L_DEBUG_KEY    CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
1065 
1066    G_EXC_ERROR             EXCEPTION;
1067    l_msg_count             NUMBER;
1068    l_task_id               NUMBER;
1069    l_pa_project_id_out     NUMBER;
1070    l_msg_index_out         NUMBER;
1071    l_return_status         VARCHAR2(1);
1072    l_chk_project           VARCHAR2(1);
1073    l_proj_ref_flag         VARCHAR2(1);
1074    l_project_tsk_flag      VARCHAR2(1);
1075    l_default               VARCHAR2(30);
1076    l_msg_data              VARCHAR2(2000);
1077    l_pa_project_number_out VARCHAR2(25);
1078    l_commit                VARCHAR2(1) := 'F';
1079    l_init_msg_list         VARCHAR2(1) := 'F';
1080 
1081     -- To find visit related information
1082    CURSOR c_visit (x_id IN NUMBER) IS
1083     SELECT * FROM AHL_VISITS_VL
1084     WHERE VISIT_ID = x_id;
1085    c_visit_rec c_visit%ROWTYPE;
1086 
1087    -- To find tasks information for visit
1088    CURSOR c_task (x_id IN NUMBER) IS
1089     SELECT T1.PROJECT_ID, T1.VISIT_NUMBER, T2.*
1090     FROM  AHL_VISITS_VL T1, AHL_VISIT_TASKS_VL T2
1091     WHERE VISIT_TASK_ID = x_id
1092     AND T1.VISIT_ID = T2.VISIT_ID;
1093 
1094    c_task_rec c_task%ROWTYPE;
1095 
1096 BEGIN
1097    --------------------- initialize -----------------------
1098    SAVEPOINT Add_Task_to_Project;
1099 
1100    -- Debug info.
1101    IF (l_log_procedure >= l_log_current_level) THEN
1102        fnd_log.string(l_log_procedure,L_DEBUG_KEY ||'.begin','At the start of PLSQL procedure');
1103    END IF;
1104 
1105    -- Initialize message list if p_init_msg_list is set to TRUE.
1106    IF Fnd_Api.to_boolean(p_init_msg_list) THEN
1107       Fnd_Msg_Pub.initialize;
1108    END IF;
1109 
1110    --  Initialize API return status to success
1111    x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
1112 
1113    -- Standard call to check for call compatibility.
1114    IF NOT Fnd_Api.COMPATIBLE_API_CALL(l_api_version,
1115                                       p_api_version,
1116                                       L_API_NAME,G_PKG_NAME) THEN
1117       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1118    END IF;
1119 
1120    IF (l_log_statement >= l_log_current_level) THEN
1121       fnd_log.string(l_log_statement,L_DEBUG_KEY,'Visit Task Id = '|| p_visit_task_id);
1122    END IF;
1123 
1124    ----------------------------------------- Cursor ----------------------------------
1125    OPEN c_task (p_visit_task_id);
1126    FETCH c_task INTO c_task_rec;
1127    CLOSE c_task;
1128 
1129    OPEN c_Visit(c_task_rec.visit_id);
1130    FETCH c_visit INTO c_visit_rec;
1131    CLOSE c_Visit;
1132    ----------------------------------------- Start of Body ----------------------------------
1133    -- To check Project responsibilites
1134    -- post 11.5.10 change                                                  -- Post 11.5.10
1135    -- change start
1136 
1137    -- RROY
1138    IF (l_log_statement >= l_log_current_level) THEN
1139       fnd_log.string(l_log_statement,
1140                      L_DEBUG_KEY,
1141                      'Before calling AHL_VWP_RULES_PVT.Check_Proj_Responsibility.');
1142    END IF;
1143 
1144    AHL_VWP_RULES_PVT.Check_Proj_Responsibility
1145            (x_check_project    => l_chk_project,
1146             x_return_status    => l_return_status);
1147 
1148    IF (l_log_statement >= l_log_current_level) THEN
1149       fnd_log.string(l_log_statement,
1150                      L_DEBUG_KEY,
1151                      'After calling AHL_VWP_RULES_PVT.Check_Proj_Responsibility. Return Status = ' ||
1152                      l_return_status);
1153    END IF;
1154 
1155    IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
1156       IF (l_log_statement >= l_log_current_level) THEN
1157          fnd_log.string(l_log_statement,
1158                         L_DEBUG_KEY,
1159                         'Errors from AHL_VWP_RULES_PVT.Check_Proj_Responsibility.');
1160       END IF;
1161       IF l_return_status = FND_API.G_RET_STS_ERROR THEN
1162          RAISE FND_API.G_EXC_ERROR;
1163       ELSE
1164          RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1165       END IF;
1166    END IF;
1167 
1168    IF l_chk_project = 'Y' THEN
1169      IF c_task_rec.PROJECT_TASK_ID IS NULL THEN
1170      -- change end
1171        IF (l_log_statement >= l_log_current_level) THEN
1172           fnd_log.string(l_log_statement,
1173                          L_DEBUG_KEY,
1174                          'Before calling PA_PROJECT_PUB.CHECK_UNIQUE_TASK_NUMBER.');
1175           fnd_log.string(l_log_statement,
1176                          L_DEBUG_KEY,
1177                          'p_project_id = ' || c_visit_rec.project_id);
1178           fnd_log.string(l_log_statement,
1179                          L_DEBUG_KEY,
1180                          'p_pm_project_reference = ' || c_visit_rec.visit_number);
1181           fnd_log.string(l_log_statement,
1182                          L_DEBUG_KEY,
1183                          'p_task_number = ' || c_task_rec.visit_task_number);
1184        END IF;
1185 
1186         PA_PROJECT_PUB.Check_Unique_Task_Number
1187         ( p_api_version_number      => 1,
1188           p_init_msg_list           => l_init_msg_list,
1189           p_return_status           => l_return_status,
1190           p_msg_count               => l_msg_count,
1191           p_msg_data                => l_msg_data,
1192           p_project_id              => c_visit_rec.project_id,
1193           p_pm_project_reference    => c_visit_rec.visit_number,
1194           p_task_number             => c_task_rec.visit_task_number,
1195           p_unique_task_number_flag => l_project_tsk_flag
1196         );
1197 
1198        IF (l_log_statement >= l_log_current_level) THEN
1199           fnd_log.string(l_log_statement,
1200                          L_DEBUG_KEY,
1201                          'After calling PA_PROJECT_PUB.check_unique_task_number. p_unique_task_number_flag = ' ||
1202                          l_project_tsk_flag || ' Return Status = ' || l_return_status);
1203           IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
1204              fnd_log.string(l_log_statement,
1205                             L_DEBUG_KEY,
1206                             'Errors from PA_PROJECT_PUB.check_unique_task_number. Message count: ' ||
1207                             l_msg_count || ', message data: ' || l_msg_data);
1208           END IF;
1209           fnd_log.string(l_log_statement,
1210                          L_DEBUG_KEY,
1211                          'Before calling PA_PROJECT_PUB.check_unique_task_reference.');
1212        END IF;
1213 
1214        PA_PROJECT_PUB.Check_Unique_Task_Reference
1215           (p_api_version_number    => 1,
1216            p_init_msg_list         => l_init_msg_list,
1217            p_return_status         => l_return_status,
1218            p_msg_count             => l_msg_count,
1219            p_msg_data              => l_msg_data,
1220            p_project_id            => c_visit_rec.project_id,
1221            p_pm_project_reference  => c_visit_rec.visit_number,
1222            p_pm_task_reference     => c_task_rec.visit_task_number,
1223            p_unique_task_ref_flag  => l_proj_ref_flag
1224       );
1225 
1226        IF (l_log_statement >= l_log_current_level) THEN
1227           fnd_log.string(l_log_statement,L_DEBUG_KEY,'After calling -- Check_Unique_Task_Reference l_proj_ref_flag = ' || l_proj_ref_flag);
1228        END IF;
1229 
1230       IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
1231          IF (l_log_statement >= l_log_current_level) THEN
1232             fnd_log.string(l_log_statement,
1233                            L_DEBUG_KEY,
1234                            'Errors from PA_PROJECT_PUB.check_unique_task_number. Message count: ' ||
1235                             l_msg_count || ', message data: ' || l_msg_data);
1236          END IF;
1237          IF (l_return_status = FND_API.G_RET_STS_ERROR) THEN
1238             RAISE FND_API.G_EXC_ERROR;
1239          ELSE
1240             RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1241          END IF;
1242       END IF;
1243 
1244        IF l_project_tsk_flag = 'Y' AND l_proj_ref_flag = 'Y' THEN
1245           IF (l_log_statement >= l_log_current_level) THEN
1246             fnd_log.string(l_log_statement,L_DEBUG_KEY,'Before calling PA_PROJECT_PUB.ADD_TASK..');
1247             fnd_log.string(l_log_statement,L_DEBUG_KEY,'c_task_rec.PROJECT_ID=: ' || c_task_rec.PROJECT_ID);
1248             fnd_log.string(l_log_statement,L_DEBUG_KEY,'c_task_rec.VISIT_NUMBER=: ' || c_task_rec.VISIT_NUMBER);
1249             fnd_log.string(l_log_statement,L_DEBUG_KEY,'c_task_rec.VISIT_TASK_NUMBER=: ' || c_task_rec.VISIT_TASK_NUMBER);
1250             fnd_log.string(l_log_statement,L_DEBUG_KEY,'c_task_rec.VISIT_TASK_NAME=: ' || c_task_rec.VISIT_TASK_NAME);
1251             fnd_log.string(l_log_statement,L_DEBUG_KEY,'c_task_rec.DESCRIPTION=: ' || c_task_rec.DESCRIPTION);
1252           END IF;
1253 
1254           PA_PROJECT_PUB.ADD_TASK
1255                (p_api_version_number      => 1
1256                ,p_commit            => l_commit
1257                ,p_init_msg_list          => l_init_msg_list
1258                ,p_msg_count            => l_msg_count
1259                ,p_msg_data            => l_msg_data
1260                ,p_return_status          => l_return_status
1261                ,p_pm_product_code        => G_PM_PRODUCT_CODE
1262                ,p_pm_project_reference      => c_task_rec.VISIT_NUMBER
1263                ,p_pa_project_id          => c_task_rec.PROJECT_ID
1264                ,p_pm_task_reference        => c_task_rec.VISIT_TASK_NUMBER
1265                ,p_pa_task_number            => c_task_rec.VISIT_TASK_NUMBER
1266                -- SKPATHAK :: Bug 8321556 :: 23-MAR-2009 :: Use SUBSTRB instead of SUBSTR
1267                ,p_task_name            => SUBSTRB( c_task_rec.VISIT_TASK_NAME , 1,15)
1268                -- AnRaj: Changed for Bug#5069540
1269                 --Begin changes by rnahata for Bug 5758813
1270                 -- ,p_task_description   => SUBSTR(c_task_rec.DESCRIPTION,1,250)
1271                 -- PRAKKUM :: Bug 8321557 :: 10-DEC-2010 :: Use SUBSTRB instead of SUBSTR
1272                 ,p_task_description      => SUBSTRB(c_task_rec.visit_task_name,1,250)
1273                --Fix for the Bug 7009212. rnahata truncated the dates
1274                ,p_task_start_date       => trunc(c_task_rec.start_date_time)
1275                ,p_task_completion_date  => trunc(c_task_rec.end_date_time)
1276                 -- End changes by rnahata for Bug 5758813
1277                ,p_pa_project_id_out      => l_pa_project_id_out
1278                ,p_pa_project_number_out    => l_pa_project_number_out
1279                ,p_task_id            => l_task_id
1280                 );
1281 
1282           IF (l_log_statement >= l_log_current_level) THEN
1283             fnd_log.string(l_log_statement,L_DEBUG_KEY,'After calling PA_PROJECT_PUB.ADD_TASK - l_return_status = '||l_return_status);
1284           END IF;
1285 
1286           IF (l_return_status <> 'S') THEN
1287             IF (fnd_msg_pub.count_msg > 0 ) THEN
1288               FOR i IN 1..fnd_msg_pub.count_msg
1289               LOOP
1290                 fnd_msg_pub.get( p_msg_index => i,
1291                                  p_encoded   => 'F',
1292                                  p_data      => l_msg_data,
1293                                  p_msg_index_out => l_msg_index_out);
1294 
1295                 IF (l_log_statement >= l_log_current_level) THEN
1296                   fnd_log.string(l_log_statement,L_DEBUG_KEY,'Error - '||l_msg_data);
1297                 END IF;
1298               END LOOP;
1299             ELSE
1300               IF (l_log_statement >= l_log_current_level) THEN
1301                   fnd_log.string(l_log_statement,L_DEBUG_KEY,'Another Error - '||l_msg_data);
1302               END IF;
1303             END IF;
1304             RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
1305           END IF;
1306 
1307           IF l_return_status = 'S' THEN
1308             UPDATE AHL_VISIT_TASKS_B
1309             SET PROJECT_TASK_ID = l_task_id,
1310                 OBJECT_VERSION_NUMBER = object_version_number + 1,
1311                 --TCHIMIRA::BUG 9222622 ::15-DEC-2009::UPDATE WHO COLUMNS
1312                 LAST_UPDATE_DATE      = SYSDATE,
1313                 LAST_UPDATED_BY       = Fnd_Global.USER_ID,
1314                 LAST_UPDATE_LOGIN     = Fnd_Global.LOGIN_ID
1315             WHERE VISIT_TASK_ID = p_visit_task_id;
1316           END IF;
1317 
1318         ELSIF l_project_tsk_flag = 'N' AND l_proj_ref_flag = 'Y' THEN
1319           x_return_status := Fnd_Api.g_ret_sts_error;
1320           IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_error) THEN
1321              Fnd_Message.set_name ('AHL', 'AHL_VWP_PROJ_TSK_REF_NOT_UNIQ');
1322              Fnd_Msg_Pub.ADD;
1323           END IF;
1324         ELSIF l_project_tsk_flag = 'Y' AND l_proj_ref_flag = 'N' THEN
1325           x_return_status := Fnd_Api.g_ret_sts_error;
1326           IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_error) THEN
1327              Fnd_Message.set_name ('AHL', 'AHL_VWP_PROJ_TSK_NUM_NOT_UNIQ');
1328              Fnd_Msg_Pub.ADD;
1329           END IF;
1330         ELSE
1331           x_return_status := Fnd_Api.g_ret_sts_error;
1332           IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_error) THEN
1333              Fnd_Message.set_name ('AHL', 'AHL_VWP_PROJ_TASK_NOT_UNIQUE');
1334              Fnd_Msg_Pub.ADD;
1335           END IF;
1336         END IF;
1337    END IF;
1338 
1339  END IF; -- l_chk_project
1340  ---------------------------End of Body-------------------------------------
1341   --
1342   -- END of API body.
1343   --
1344   -- Standard check of p_commit.
1345 
1346    IF Fnd_Api.To_Boolean (p_commit) THEN
1347       COMMIT WORK;
1348    END IF;
1349 
1350    Fnd_Msg_Pub.count_and_get(
1351          p_encoded => Fnd_Api.g_false,
1352          p_count   => x_msg_count,
1353          p_data    => x_msg_data
1354   );
1355 
1356    IF (l_log_procedure >= l_log_current_level) THEN
1357        fnd_log.string(l_log_procedure,L_DEBUG_KEY ||'.end','End of the procedure');
1358    END IF;
1359 
1360 EXCEPTION
1361    WHEN Fnd_Api.g_exc_error THEN
1362       ROLLBACK TO Add_Task_to_Project;
1363       x_return_status := Fnd_Api.g_ret_sts_error;
1364       Fnd_Msg_Pub.count_and_get (
1365             p_encoded => Fnd_Api.g_false,
1366             p_count   => x_msg_count,
1367             p_data    => x_msg_data
1368      );
1369    WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
1370       ROLLBACK TO Add_Task_to_Project;
1371       x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
1372       Fnd_Msg_Pub.count_and_get (
1373             p_encoded => Fnd_Api.g_false,
1374             p_count   => x_msg_count,
1375             p_data    => x_msg_data
1376      );
1377    WHEN OTHERS THEN
1378       ROLLBACK TO Add_Task_to_Project;
1379       x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
1380       IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_unexp_error) THEN
1381          Fnd_Msg_Pub.add_exc_msg (G_PKG_NAME, L_API_NAME);
1382       END IF;
1383       Fnd_Msg_Pub.count_and_get (
1384             p_encoded => Fnd_Api.g_false,
1385             p_count   => x_msg_count,
1386             p_data    => x_msg_data
1387      );
1388 END Add_Task_to_Project;
1389 */
1390 
1391 --------------------------------------------------------------------
1392 -- PROCEDURE
1393 --    Delete_Task_to_Project
1394 --
1395 -- PURPOSE
1396 --    To delete Project and its tasks if visit in VWP is deleted
1397 --------------------------------------------------------------------
1398 PROCEDURE Delete_Task_to_Project(
1399    p_visit_task_id   IN  NUMBER,
1400    x_return_status   OUT NOCOPY VARCHAR2)
1401 AS
1402   -- Define local Variables
1403    L_API_NAME      CONSTANT VARCHAR2(30) := 'Delete_Task_to_Project';
1404    L_DEBUG_KEY         CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
1405 
1406    l_count           NUMBER;
1407    l_msg_count       NUMBER;
1408    l_project_id      NUMBER;
1409    l_task_id         NUMBER;
1410    i                 NUMBER;
1411 
1412    l_return_status   VARCHAR2(1);
1413    l_chk_project     VARCHAR2(1);
1414    l_del_task_flag   VARCHAR2(1);
1415    l_commit          VARCHAR2(1) := 'F';
1416    l_init_msg_list   VARCHAR2(1) := 'F';
1417    l_default         VARCHAR2(30);
1418    l_msg_data        VARCHAR2(2000);
1419    G_EXC_ERROR       EXCEPTION;
1420 
1421  -- Define local Cursors
1422    -- To find all tasks related information
1423    CURSOR c_Task (x_id IN NUMBER) IS
1424       SELECT * FROM Ahl_Visit_Tasks_VL
1425       WHERE Visit_Task_ID = x_id;
1426       c_task_rec    c_Task%ROWTYPE;
1427 
1428     -- To find visit related information
1429    CURSOR c_visit (x_id IN NUMBER) IS
1430     SELECT * FROM AHL_VISITS_VL
1431     WHERE VISIT_ID = x_id;
1432    c_visit_rec c_visit%ROWTYPE;
1433 
1434    --VWPE: ER:12424063 :: SKPATHAK :: 07-JUN-2012
1435    --Get the parent project task for a given task
1436    CURSOR c_get_parent_project_task (c_project_task_id IN NUMBER) IS
1437       SELECT PARENT.TASK_ID PARENT_TASK_ID, PARENT.PM_TASK_REFERENCE PARENT_TASK_REFERENCE
1438       FROM PA_TASKS TASK, PA_TASKS PARENT
1439      WHERE TASK.TASK_ID = c_project_task_id
1440        AND PARENT.TASK_ID (+) = TASK.PARENT_TASK_ID;
1441 
1442    parent_project_task_rec c_get_parent_project_task%ROWTYPE;
1443 
1444    l_new_structure_flag VARCHAR2(1);
1445 
1446 BEGIN
1447 
1448     x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
1449 
1450     IF (l_log_procedure >= l_log_current_level) THEN
1451        fnd_log.string(l_log_procedure,L_DEBUG_KEY ||'.begin','At the start of the procedure');
1452     END IF;
1453 
1454     OPEN c_task (p_visit_task_id);
1455     FETCH c_task INTO c_task_rec;
1456     CLOSE c_task;
1457 
1458     OPEN c_visit (c_task_rec.visit_id);
1459     FETCH c_visit INTO c_visit_rec;
1460     CLOSE c_visit;
1461 
1462     -- To check Project responsibilites
1463     -- Post 11.5.10
1464     -- RROY
1465    IF (l_log_statement >= l_log_current_level) THEN
1466       fnd_log.string(l_log_statement,
1467                      L_DEBUG_KEY,
1468                      'Before calling AHL_VWP_RULES_PVT.Check_Proj_Responsibility');
1469    END IF;
1470     AHL_VWP_RULES_PVT.Check_Proj_Responsibility
1471           ( x_check_project    => l_chk_project,
1472             x_return_status    => l_return_status);
1473 
1474      IF (l_log_statement >= l_log_current_level) THEN
1475         fnd_log.string(l_log_statement,
1476                        L_DEBUG_KEY,
1477                        'After calling AHL_VWP_RULES_PVT.Check_Proj_Responsibility. Return Status = ' || l_return_status);
1478      END IF;
1479 
1480      IF (l_return_status <> Fnd_Api.G_RET_STS_SUCCESS) THEN
1481         IF (l_log_statement >= l_log_current_level) THEN
1482            fnd_log.string(l_log_statement,
1483                           L_DEBUG_KEY,
1484                           'Errors from AHL_VWP_RULES_PVT.Check_Proj_Responsibility');
1485         END IF;
1486         x_return_status := l_return_status;
1487         IF l_return_status = FND_API.G_RET_STS_ERROR THEN
1488            RAISE FND_API.G_EXC_ERROR;
1489         ELSE
1490            RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1491         END IF;
1492      END IF;
1493 
1494     IF (l_log_statement >= l_log_current_level) THEN
1495       fnd_log.string(l_log_statement,
1496                      L_DEBUG_KEY,
1497                      'p_visit_task_id = '||p_visit_task_id);
1498       fnd_log.string(l_log_statement,
1499                      L_DEBUG_KEY,
1500                      'visit_id = '||c_visit_rec.visit_id);
1501       fnd_log.string(l_log_statement,
1502                      L_DEBUG_KEY,
1503                      'l_chk_project = '||l_chk_project);
1504     END IF;
1505 
1506     IF l_chk_project = 'Y' THEN
1507         IF (l_log_statement >= l_log_current_level) THEN
1508            fnd_log.string(l_log_statement,L_DEBUG_KEY,'Before calling PA_PROJECT_PUB.CHECK_DELETE_TASK_OK');
1509            fnd_log.string(l_log_statement,L_DEBUG_KEY,'c_visit_rec.PROJECT_ID - '|| c_visit_rec.PROJECT_ID);
1510            fnd_log.string(l_log_statement,L_DEBUG_KEY,'c_visit_rec.visit_number - '|| c_visit_rec.visit_number);
1511            fnd_log.string(l_log_statement,L_DEBUG_KEY,'c_task_rec.PROJECT_TASK_ID - '|| c_task_rec.PROJECT_TASK_ID);
1512            fnd_log.string(l_log_statement,L_DEBUG_KEY,'c_task_rec.VISIT_TASK_NUMBER - '|| c_task_rec.VISIT_TASK_NUMBER);
1513            fnd_log.string(l_log_statement,L_DEBUG_KEY,'c_task_rec.status_code - '|| c_task_rec.status_code);
1514            fnd_log.string(l_log_statement,L_DEBUG_KEY,'l_del_task_flag - '|| l_del_task_flag);
1515         END IF;
1516 
1517         PA_PROJECT_PUB.CHECK_DELETE_TASK_OK
1518                 ( p_api_version_number     => 1
1519                   , p_init_msg_list         =>  l_init_msg_list
1520                   , p_return_status         => l_return_status
1521                   , p_msg_count           => l_msg_count
1522                   , p_msg_data           => l_msg_data
1523                   , p_project_id       => c_visit_rec.PROJECT_ID
1524                   , p_pm_project_reference   =>  c_visit_rec.visit_number
1525                   , p_task_id           =>  c_task_rec.PROJECT_TASK_ID
1526                   , p_pm_task_reference     =>  c_task_rec.VISIT_TASK_NUMBER
1527                   , p_delete_task_ok_flag   => l_del_task_flag
1528                 );
1529 
1530       IF (l_log_statement >= l_log_current_level) THEN
1531          fnd_log.string(l_log_statement,
1532                         L_DEBUG_KEY,
1533                         'After calling PA_PROJECT_PUB.check_delete_task_ok. Return Status = ' ||
1534                         l_return_status || ', delete task flag = ' || l_del_task_flag);
1535       END IF;
1536 
1537       IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
1538          IF (l_log_statement >= l_log_current_level) THEN
1539             fnd_log.string(l_log_statement,
1540                            L_DEBUG_KEY,
1541                            'Errors from PA_PROJECT_PUB.check_delete_task_ok. Message count: ' ||
1542                             l_msg_count || ', message data: ' || l_msg_data);
1543          END IF;
1544          x_return_status := l_return_status;
1545          RAISE FND_API.G_EXC_ERROR;
1546       ELSE
1547          IF l_del_task_flag = 'Y' THEN
1548             IF (l_log_statement >= l_log_current_level) THEN
1549                fnd_log.string(l_log_statement,
1550                               L_DEBUG_KEY,
1551                               'Before calling PA_PROJECT_PUB.delete_task.');
1552                fnd_log.string(l_log_statement,
1553                               L_DEBUG_KEY,
1554                               'c_task_rec.task_type_code --@>'||c_task_rec.task_type_code);
1555             END IF;
1556             --VWPE: ER:12424063 :: SKPATHAK :: 07-JUN-2012
1557             --Get the rollup task details for a given non-summary, non-stage task
1558             IF c_task_rec.task_type_code NOT IN ('SUMMARY','STAGE') THEN
1559               OPEN c_get_parent_project_task (c_task_rec.PROJECT_TASK_ID);
1560               FETCH c_get_parent_project_task INTO parent_project_task_rec;
1561               CLOSE c_get_parent_project_task;
1562             END IF;
1563 
1564             -- SOSAHNI :: INTERNAL BUG :: 17-JAN-2013 :: Cancel Visit Issue
1565             -- Moved the code in order to find whether the project tasks follow new task structure before cancelling/deleting any task
1566             Use_New_Task_Structure
1567               ( p_visit_id            =>  c_visit_rec.visit_id,
1568                 x_new_structure_flag  =>  l_new_structure_flag
1569               );
1570 
1571             PA_PROJECT_PUB.DELETE_TASK
1572                     ( p_api_version_number    =>   1
1573                      ,p_commit              =>   l_commit
1574                      ,p_init_msg_list        =>   l_init_msg_list
1575                      ,p_msg_count          =>  l_msg_count
1576                      ,p_msg_data          =>  l_msg_data
1577                      ,p_return_status        =>  l_return_status
1578                      ,p_pm_product_code        =>  G_PM_PRODUCT_CODE
1579                      ,p_pm_project_reference  =>   c_visit_rec.visit_number
1580                      ,p_pa_project_id        =>  c_visit_rec.PROJECT_ID
1581                      ,p_pm_task_reference    =>  c_task_rec.VISIT_TASK_NUMBER
1582                      ,p_pa_task_id          =>  c_task_rec.PROJECT_TASK_ID
1583                      ,p_cascaded_delete_flag  =>  'N'
1584                      ,p_project_id          =>  l_project_id
1585                      ,p_task_id              =>  l_task_id
1586                     );
1587 
1588             IF (l_log_statement >= l_log_current_level) THEN
1589                fnd_log.string(l_log_statement,
1590                               L_DEBUG_KEY,
1591                               'After calling PA_PROJECT_PUB.delete_task. Return Status = ' ||
1592                               l_return_status);
1593             END IF;
1594 
1595             IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
1596                IF (l_log_statement >= l_log_current_level) THEN
1597                   fnd_log.string(l_log_statement,
1598                                  L_DEBUG_KEY,
1599                                  'Errors from PA_PROJECT_PUB.delete_task. Message count: ' ||
1600                                  l_msg_count || ', message data: ' || l_msg_data);
1601                END IF;
1602                x_return_status := Fnd_Api.g_ret_sts_error;
1603                RAISE FND_API.G_EXC_ERROR;
1604             END IF;
1605 
1606             --VWPE: ER:12424063 :: SKPATHAK :: 07-JUN-2012 :: START
1607             --Delete the rollup task details for a given non-summary, non-stage task
1608             -- SKPATHAK :: 07-OCT-2011 :: VWPE ER: 12856858 :: Old Visits cannot have roll-up tasks
1609             /*Use_New_Task_Structure
1610               ( p_visit_id            =>  c_visit_rec.visit_id,
1611                 x_new_structure_flag  =>  l_new_structure_flag
1612               );*/
1613             IF (l_log_statement >= l_log_current_level) THEN
1614                fnd_log.string(l_log_statement,
1615                               L_DEBUG_KEY,
1616                               'c_task_rec.task_type_code ** l_new_structure_flag = ' ||c_task_rec.task_type_code||' ** '||l_new_structure_flag);
1617             END IF;
1618 
1619             IF c_task_rec.task_type_code NOT IN ('SUMMARY','STAGE') AND l_new_structure_flag = 'Y' THEN
1620 
1621               IF (l_log_statement >= l_log_current_level) THEN
1622                  fnd_log.string(l_log_statement,
1623                                 L_DEBUG_KEY,
1624                                 'Deleting rollup task');
1625                  fnd_log.string(l_log_statement,
1626                                 L_DEBUG_KEY,
1627                                 'Before calling PA_PROJECT_PUB.delete_task.');
1628               END IF;
1629 
1630               PA_PROJECT_PUB.DELETE_TASK
1631                     ( p_api_version_number    =>   1
1632                      ,p_commit              =>   l_commit
1633                      ,p_init_msg_list        =>   l_init_msg_list
1634                      ,p_msg_count          =>  l_msg_count
1635                      ,p_msg_data          =>  l_msg_data
1636                      ,p_return_status        =>  l_return_status
1637                      ,p_pm_product_code        =>  G_PM_PRODUCT_CODE
1638                      ,p_pm_project_reference  =>   c_visit_rec.visit_number
1639                      ,p_pa_project_id        =>  c_visit_rec.PROJECT_ID
1640                      ,p_pm_task_reference    =>  parent_project_task_rec.PARENT_TASK_REFERENCE
1641                      ,p_pa_task_id          =>  parent_project_task_rec.PARENT_TASK_ID
1642                      ,p_cascaded_delete_flag  =>  'N'
1643                      ,p_project_id          =>  l_project_id
1644                      ,p_task_id              =>  l_task_id
1645                     );
1646 
1647               IF (l_log_statement >= l_log_current_level) THEN
1648                  fnd_log.string(l_log_statement,
1649                                 L_DEBUG_KEY,
1650                                 'After calling PA_PROJECT_PUB.delete_task. Return Status = ' ||
1651                                 l_return_status);
1652               END IF;
1653 
1654               IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
1655                  IF (l_log_statement >= l_log_current_level) THEN
1656                     fnd_log.string(l_log_statement,
1657                                    L_DEBUG_KEY,
1658                                    'Errors from PA_PROJECT_PUB.delete_task. Message count: ' ||
1659                                    l_msg_count || ', message data: ' || l_msg_data);
1660                  END IF;
1661                  x_return_status := Fnd_Api.g_ret_sts_error;
1662                  RAISE FND_API.G_EXC_ERROR;
1663               END IF;
1664             END IF;
1665             --VWPE: ER:12424063 :: SKPATHAK :: 07-JUN-2012 :: END
1666 
1667           END IF;
1668         END IF;
1669     END IF;
1670 
1671    IF (l_log_procedure >= l_log_current_level) THEN
1672       fnd_log.string(l_log_procedure,
1673                      L_DEBUG_KEY ||'.end',
1674                      'At the end of PL SQL procedure. Return Status = ' || x_return_status);
1675    END IF;
1676 
1677 END Delete_Task_to_Project;
1678 
1679 --------------------------------------------------------------------
1680 -- PROCEDURE
1681 --    Create_Project
1682 --
1683 -- PURPOSE
1684 --    To create Project and project tasks for the visit and its tasks
1685 --------------------------------------------------------------------
1686 PROCEDURE Create_Project(
1687    p_visit_id        IN  NUMBER,
1688    x_return_status   OUT NOCOPY VARCHAR2)
1689 AS
1690 --
1691   -- Define local Variables
1692    L_API_NAME     CONSTANT VARCHAR2(30) := 'Create_Project';
1693    L_DEBUG_KEY    CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
1694    l_count                 NUMBER;
1695    l_msg_count             NUMBER;
1696    l_obj_version           NUMBER;
1697    l_created_project_id    NUMBER;
1698    l_msg_index_out         NUMBER;
1699    i                       NUMBER;
1700    Z                       NUMBER;
1701    CREATED_FROM_PROJECT_ID NUMBER;
1702    l_return_status         VARCHAR2(1);
1703    l_chk_project           VARCHAR2(1);
1704    l_workflow_started      VARCHAR2(1);
1705    l_valid_flag            VARCHAR2(1):= 'N';
1706    l_commit                VARCHAR2(1) := 'F';
1707    l_init_msg_list         VARCHAR2(1) := 'F';
1708    l_project_flag          VARCHAR2(1):= 'N';
1709    l_default               VARCHAR2(30);
1710    l_msg_data              VARCHAR2(2000);
1711    G_EXC_ERROR             EXCEPTION;
1712 
1713    -- PRAKKUM :: PIE :: 13-OCT-2010
1714    -- Associative array of visit task id to project task ref
1715    TYPE Ref_Tbl_Type IS TABLE OF VARCHAR2(30) INDEX BY BINARY_INTEGER;
1716    l_id_ref_map_Tbl        Ref_Tbl_Type;
1717 
1718    -- Define local table and record datatypes
1719    l_project_rec        PA_PROJECT_PUB.PROJECT_IN_REC_TYPE;
1720    l_project_out        PA_PROJECT_PUB.PROJECT_OUT_REC_TYPE;
1721    l_task_in            PA_PROJECT_PUB.TASK_IN_TBL_TYPE;
1722    l_task_out           PA_PROJECT_PUB.TASK_OUT_TBL_TYPE;
1723    l_key_members        PA_PROJECT_PUB.PROJECT_ROLE_TBL_TYPE;
1724    l_class_categories   PA_PROJECT_PUB.CLASS_CATEGORY_TBL_TYPE;
1725    -- Post 11.5.10
1726    -- RROY
1727    l_param_data         PJM_PROJECT_PARAM_PUB.ParamRecType;
1728    -- yazhou 26Sept2005 starts
1729    -- ER#4618348
1730    -- l_project_name_prefix  VARCHAR2(10);
1731    l_project_num_prefix      VARCHAR2(10);
1732    l_visit_name_len          NUMBER;
1733    -- yazhou 26Sept2005 ends
1734    --Bug#5587893
1735    /*sowsubra - Added a new profile that enables user to specify project status
1736    when a visit is pushed to prodn.*/
1737    l_project_status_code   VARCHAR2(30);
1738    l_new_txns_flag         VARCHAR2(1):= 'N'; -- Added by rnahata for Bug 6334682
1739 
1740    -- Define local Cursors
1741    -- To find visit related information
1742    CURSOR c_visit (x_id IN NUMBER) IS
1743     SELECT * FROM AHL_VISITS_VL
1744     WHERE VISIT_ID = x_id;
1745    c_visit_rec c_visit%ROWTYPE;
1746 
1747    -- To find count for tasks for visit
1748    CURSOR c_task_ct (x_id IN NUMBER) IS
1749     SELECT count(*) FROM AHL_VISIT_TASKS_VL
1750     WHERE VISIT_ID = x_id
1751      AND NVL(status_code, 'Y') <> NVL ('DELETED', 'X')    ;
1752 
1753    -- To find tasks information for visit
1754    CURSOR c_task (x_id IN NUMBER) IS
1755     SELECT * FROM AHL_VISIT_TASKS_VL
1756     WHERE VISIT_ID = x_id
1757      AND NVL(status_code, 'Y') <> NVL ('DELETED', 'X')    ;
1758    c_task_rec c_task%ROWTYPE;
1759 
1760    -- To find tasks information for visit
1761    CURSOR c_task_OVN (x_id IN NUMBER, x_task_num IN NUMBER) IS
1762     SELECT OBJECT_VERSION_NUMBER FROM AHL_VISIT_TASKS_VL
1763     WHERE VISIT_ID = x_id AND VISIT_TASK_NUMBER = x_task_num;
1764 
1765    -- To get the cost group for the Org
1766    CURSOR c_cost_group(p_org_id IN NUMBER) IS
1767    SELECT default_cost_group_id
1768    FROM mtl_parameters
1769     WHERE organization_id = p_org_id;
1770 
1771    -- Added by rnahata for Bug 6334682
1772    CURSOR c_new_txns_flag(c_project_status_code IN VARCHAR) IS
1773     SELECT ENABLED_FLAG FROM PA_PROJECT_STATUS_CONTROLS
1774     WHERE PROJECT_STATUS_CODE LIKE c_project_status_code
1775      AND ACTION_CODE LIKE 'NEW_TXNS';
1776 
1777    /*Added by rnahata for Bug 5758813 - fetches the task details for all the tasks in the visit
1778     The first part of the union fetches task details for all the Planned and Unplanned tasks.
1779     The second part fetches task details of all the MR/NR/SR Summary tasks.
1780     The third part fetches task details of all the manually created Summary and Unassociated tasks.
1781     */
1782     -- PRAKKUM :: 24-NOV-2010 :: Bug 9705164 :: FP12.0.9-12.2:PIE :: START
1783     -- Changed the below cursor to fetch results in the order of the cost parent hierarchy of visit tasks
1784     -- Need to pass these tasks' details to the Projects API, in the order of their hierarchy
1785    CURSOR get_prj_route_dtls_cur (p_visit_id IN NUMBER) IS
1786     SELECT * FROM (
1787     SELECT SUBSTR(NVL(ar.route_no,avt.visit_task_name),1,20) task_name,
1788     SUBSTR(NVL(ar.title,avt.visit_task_name),1,250) description,
1789     avt.visit_task_name, avt.visit_task_number, avt.start_date_time task_start_date, avt.visit_task_id,
1790     avt.end_date_time task_end_date, avt.task_type_code, avt.cost_parent_id, avt.service_type_code, avt.status_code -- PRAKKUM :: PIE :: 13-OCT-2010
1791     , avt.repair_batch_name --PRAKKUM :: 11/06/2012 :: Bug 14068468
1792     FROM ahl_routes_vl ar,ahl_visit_tasks_vl avt, ahl_mr_routes mrr
1793     WHERE avt.visit_id = p_visit_id
1794      AND NVL(avt.status_code,'Y') = 'PLANNING'
1795      AND avt.task_type_code NOT IN ('SUMMARY','UNASSOCIATED','STAGE') ----SKPATHAK :: VWPE: ER:12424063 :: 13-JUN-2012 :: Need not create project task for a stage
1796      AND avt.mr_route_id = mrr.mr_route_id (+)
1797      AND mrr.route_id = ar.route_id (+)
1798     UNION ALL
1799     SELECT SUBSTR(NVL(amh.title,avt.visit_task_name),1,20) task_name, NVL(amh.title,avt.visit_task_name) description,
1800     avt.visit_task_name, avt.visit_task_number, avt.start_date_time task_start_date, avt.visit_task_id,
1801     avt.end_date_time task_end_date, avt.task_type_code, avt.cost_parent_id, avt.service_type_code, avt.status_code -- PRAKKUM :: PIE :: 13-OCT-2010
1802     , avt.repair_batch_name --PRAKKUM :: 11/06/2012 :: Bug 14068468
1803     FROM ahl_mr_headers_v amh,ahl_visit_tasks_vl avt
1804     WHERE avt.visit_id = p_visit_id
1805      AND NVL(avt.status_code,'Y') = 'PLANNING'
1806      AND avt.task_type_code = 'SUMMARY'
1807      AND avt.summary_task_flag = 'N'
1808      AND avt.mr_id = amh.mr_header_id (+)
1809     UNION ALL
1810     SELECT SUBSTR(avt.visit_task_name,1,20) task_name, avt.visit_task_name description,
1811     avt.visit_task_name, avt.visit_task_number, avt.start_date_time task_start_date, avt.visit_task_id,
1812     avt.end_date_time task_end_date, avt.task_type_code, avt.cost_parent_id, avt.service_type_code, avt.status_code -- PRAKKUM :: PIE :: 13-OCT-2010
1813     , avt.repair_batch_name --PRAKKUM :: 11/06/2012 :: Bug 14068468
1814     FROM ahl_visit_tasks_vl avt
1815     WHERE avt.visit_id = p_visit_id
1816      AND NVL(avt.status_code,'Y') = 'PLANNING'
1817      AND ((avt.task_type_code = 'SUMMARY' AND avt.summary_task_flag = 'Y')
1818           OR (avt.task_type_code ='UNASSOCIATED'))
1819     --ORDER BY 4;
1820      )
1821      START WITH cost_parent_id IS NULL AND NVL(status_code,'Y') = 'PLANNING'
1822      CONNECT BY PRIOR visit_task_id = cost_parent_id;
1823     -- PRAKKUM :: 24-NOV-2010 :: Bug 9705164 :: FP12.0.9-12.2:PIE :: END
1824    -- End changes by rnahata for Bug 5758813
1825 
1826     get_prj_route_dtls_rec  get_prj_route_dtls_cur%ROWTYPE;
1827 
1828     l_is_comp_visit VARCHAR2(1) := 'N'; --PRAKKUM :: 11/06/2012 :: Bug 14068468
1829 
1830     CURSOR get_proj_details (x_prjId IN NUMBER)
1831     IS
1832     SELECT pt.task_id,pt.project_id,pt.parent_task_id, pt.task_name
1833     FROM PA_TASKS pt
1834     WHERE
1835     pt.project_id=x_prjId;
1836 
1837     get_proj_details_rec  get_proj_details%ROWTYPE;
1838 
1839 BEGIN
1840    --  Initialize API return status to success
1841     x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
1842 
1843    IF (l_log_procedure >= l_log_current_level) THEN
1844       fnd_log.string(l_log_procedure,
1845                      L_DEBUG_KEY ||'.begin',
1846                      'At the start of PL SQL procedure. Visit Id = ' || p_visit_id);
1847    END IF;
1848 
1849     --Bug#5587893
1850     /*sowsubra - starts */
1851     l_project_status_code := nvl(FND_PROFILE.VALUE('AHL_INITIAL_PROJECT_STATUS'),'SUBMITTED');
1852 
1853     /*
1854     IF (l_project_status_code IS NULL) THEN
1855       IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_error) THEN
1856          Fnd_Message.set_name ('AHL', 'AHL_PROJECT_STATUS_NOT_SET');
1857          Fnd_Msg_Pub.ADD;
1858       END IF;
1859       RAISE FND_API.G_EXC_ERROR;
1860    END IF;
1861     */
1862    /*sowsubra - ends */
1863 
1864     -- Begin changes by rnahata for Bug 6334682
1865     IF (l_log_statement >= l_log_current_level) THEN
1866        fnd_log.string(l_log_statement,
1867                       L_DEBUG_KEY,
1868                       'Initial project status code is: ' || l_project_status_code);
1869     END IF;
1870     OPEN c_new_txns_flag(l_project_status_code);
1871     FETCH c_new_txns_flag INTO l_new_txns_flag;
1872     CLOSE c_new_txns_flag;
1873     IF (l_log_statement >= l_log_current_level) THEN
1874        fnd_log.string(l_log_statement,
1875                       L_DEBUG_KEY,
1876                       'Create New Transaction Flag = ' || l_new_txns_flag);
1877     END IF;
1878     IF (l_new_txns_flag =  'N') THEN
1879        IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_error) THEN
1880           Fnd_Message.SET_NAME('AHL','AHL_PRJ_NEW_TXN_DISABLED');
1881           Fnd_Message.SET_TOKEN('PRJ_STATUS', l_project_status_code);
1882           Fnd_Msg_Pub.ADD;
1883        END IF;
1884        RAISE Fnd_Api.G_EXC_ERROR;
1885     END IF;
1886     -- End changes by rnahata for Bug 6334682
1887 
1888    OPEN c_Visit(p_visit_id);
1889    FETCH c_visit INTO c_visit_rec;
1890    CLOSE c_Visit;
1891 
1892    --PRAKKUM :: 11/06/2012 :: Bug 14068468
1893    -- Flag to find whether visit is component visit or not
1894    l_is_comp_visit := AHL_CMP_UTIL_PKG.Is_Comp_Visit (p_visit_id);
1895    IF (l_log_statement >= l_log_current_level) THEN
1896      fnd_log.string(l_log_statement,L_DEBUG_KEY,'p_visit_id ** l_is_comp_visit--@> '||p_visit_id||' ** '||l_is_comp_visit);
1897    END IF;
1898 
1899    IF (c_visit_rec.START_DATE_TIME IS NOT NULL
1900        AND c_visit_rec.START_DATE_TIME <> Fnd_Api.G_MISS_DATE
1901        AND c_visit_rec.DEPARTMENT_ID IS NOT NULL
1902        AND c_visit_rec.DEPARTMENT_ID <> FND_API.G_MISS_NUM) THEN
1903 
1904       -- Post 11.5.10
1905       -- RROY
1906       IF c_visit_rec.project_template_id IS NOT NULL THEN
1907          CREATED_FROM_PROJECT_ID := c_visit_rec.project_template_id;
1908       ELSE
1909          CREATED_FROM_PROJECT_ID := nvl(FND_PROFILE.VALUE('AHL_DEFAULT_PA_TEMPLATE_ID'),0);
1910       END IF;
1911 
1912       IF (l_log_statement >= l_log_current_level) THEN
1913         fnd_log.string(l_log_statement,L_DEBUG_KEY,'CREATED_FROM_PROJECT_ID = '||CREATED_FROM_PROJECT_ID);
1914       END IF;
1915 
1916       -- yazhou 26Sept2005 starts
1917       -- ER#4618348
1918 
1919       --l_project_name_prefix := SUBSTR(FND_PROFILE.VALUE('AHL_PROJECT_PREFIX'),1,10);
1920       l_project_num_prefix := SUBSTR(FND_PROFILE.VALUE('AHL_PROJECT_NUM_PREFIX'),1,10);
1921 
1922       IF (l_log_statement >= l_log_current_level) THEN
1923         fnd_log.string(l_log_statement,L_DEBUG_KEY,'l_project_num_prefix = '||l_project_num_prefix);
1924       END IF;
1925 
1926       --l_visit_name_len := 30 - nvl(length(SubStr(l_project_name_prefix,1,255)),0);
1927 
1928       -- TO CREATE PROJECT IN PROJECTS
1929       l_Project_rec.PM_PROJECT_REFERENCE      := l_project_num_prefix || to_char(c_visit_rec.visit_number);
1930 --    l_Project_rec.PROJECT_NAME              := l_project_name_prefix|| SUBSTR(c_visit_rec.visit_name,1,l_visit_name_len);
1931       l_Project_rec.PROJECT_NAME              := l_project_num_prefix || to_char(c_visit_rec.visit_number);
1932 -- yazhou 26Sept2005 ends
1933       l_Project_rec.CREATED_FROM_PROJECT_ID   := CREATED_FROM_PROJECT_ID;
1934 -- yazhou 08Nov2005 starts
1935 -- Changed by jaramana on April 28, 2005 to fix Bug 4273892
1936 --    l_Project_rec.PROJECT_STATUS_CODE       := 'ACTIVE';
1937 -- Changed by sowsubra to fix Bug#5587893
1938 --    l_Project_rec.PROJECT_STATUS_CODE       := 'SUBMITTED';
1939       l_Project_rec.PROJECT_STATUS_CODE       := l_project_status_code ;
1940 -- yazhou 08Nov2005 ends
1941 
1942 -- AnRaj: Changed for Bug#5069540
1943       -- SKPATHAK :: Bug 8321556 :: 23-MAR-2009 :: Use SUBSTRB instead of SUBSTR
1944       l_Project_rec.DESCRIPTION               := SUBSTRB(c_visit_rec.description,1,250);
1945       --Fix for the Bug 7009212. rnahata truncated the time components
1946       l_Project_rec.START_DATE              := trunc(c_visit_rec.start_date_time);
1947       l_Project_rec.COMPLETION_DATE           := null; -- pass completion date as null for the project and all its tasks :: PRAKKUM :: PIE :: 13-OCT-2010
1948       l_Project_rec.SCHEDULED_START_DATE    := trunc(c_visit_rec.start_date_time);
1949       --rnahata End
1950 
1951       OPEN c_task_ct(p_visit_id);
1952       FETCH c_task_ct INTO l_count;
1953       CLOSE c_task_ct;
1954 
1955       IF (l_log_statement >= l_log_current_level) THEN
1956         fnd_log.string(l_log_statement,L_DEBUG_KEY,'Tasks Count = '||l_count);
1957       END IF;
1958 
1959       IF l_count > 0 THEN
1960         IF (l_log_statement >= l_log_current_level) THEN
1961           fnd_log.string(l_log_statement,L_DEBUG_KEY,'Inside Tasks as Count more than zero');
1962         END IF;
1963         -- Begin changes by rnahata for Bug 5758813
1964         OPEN get_prj_route_dtls_cur(p_visit_id);
1965         i:=1;
1966         LOOP
1967           -- PRAKKUM :: PIE :: 13-OCT-2010 ::START
1968           FETCH get_prj_route_dtls_cur INTO get_prj_route_dtls_rec;
1969           EXIT WHEN get_prj_route_dtls_cur%NOTFOUND;
1970           IF get_prj_route_dtls_rec.task_type_code <> 'SUMMARY' THEN
1971             -- Not a Summary task: First create a rollup task
1972             l_task_in(i).PM_TASK_REFERENCE         := get_prj_route_dtls_rec.visit_task_number || '-1';
1973             l_task_in(i).TASK_NAME                 := SUBSTRB(get_prj_route_dtls_rec.task_name,1,15) || '-1';
1974             l_task_in(i).LONG_TASK_NAME            := get_prj_route_dtls_rec.task_name || '-1';
1975             l_task_in(i).PA_TASK_NUMBER            := get_prj_route_dtls_rec.visit_task_number || '-1';
1976             l_task_in(i).TASK_START_DATE           := trunc(get_prj_route_dtls_rec.task_start_date); -- Pass visit date for Rollup tasks
1977             l_task_in(i).TASK_COMPLETION_DATE      := null;
1978             -- Store the value of the cost parent id temporarily
1979             -- which will be reset or overwritten later with the task number corresponding to this cost parent
1980             IF (get_prj_route_dtls_rec.cost_parent_id IS NOT NULL) THEN
1981               l_task_in(i).PM_PARENT_TASK_REFERENCE  := '-' || get_prj_route_dtls_rec.cost_parent_id;
1982             ELSE
1983               l_task_in(i).PM_PARENT_TASK_REFERENCE  := null;
1984             END IF;
1985             -- Then add the non-summary task under the rollup task
1986             i := i + 1;
1987             l_task_in(i).PM_TASK_REFERENCE         := get_prj_route_dtls_rec.visit_task_number;
1988             l_task_in(i).TASK_NAME                 := SUBSTRB(get_prj_route_dtls_rec.task_name,1,15);
1989             l_task_in(i).LONG_TASK_NAME            := get_prj_route_dtls_rec.task_name;
1990             l_task_in(i).PA_TASK_NUMBER            := get_prj_route_dtls_rec.visit_task_number;
1991             l_task_in(i).TASK_DESCRIPTION          := SUBSTRB(get_prj_route_dtls_rec.description,1,250);
1992             l_task_in(i).TASK_START_DATE           := trunc(get_prj_route_dtls_rec.task_start_date);
1993             l_task_in(i).TASK_COMPLETION_DATE      := null;
1994             l_task_in(i).SERVICE_TYPE_CODE         := get_prj_route_dtls_rec.service_type_code;
1995             l_task_in(i).PM_PARENT_TASK_REFERENCE  := get_prj_route_dtls_rec.visit_task_number || '-1';  -- Parent is the rollup task added above
1996             -- Store the ref in the associative array
1997             -- to keep route tasks to always be leaf tasks even if something is added underneath
1998             -- If the non-summary task has a child, it is actually the child of the rollup and not the child of the route
1999             l_id_ref_map_Tbl(get_prj_route_dtls_rec.visit_task_id) := get_prj_route_dtls_rec.visit_task_number || '-1';
2000 
2001           ELSE
2002 
2003             -- Summary Task
2004             l_task_in(i).PM_TASK_REFERENCE         := get_prj_route_dtls_rec.visit_task_number;
2005             l_task_in(i).TASK_NAME                 := SUBSTRB(get_prj_route_dtls_rec.task_name,1,15);
2006             l_task_in(i).LONG_TASK_NAME            := get_prj_route_dtls_rec.task_name;
2007             l_task_in(i).PA_TASK_NUMBER            := get_prj_route_dtls_rec.visit_task_number;
2008             l_task_in(i).TASK_DESCRIPTION          := SUBSTRB(get_prj_route_dtls_rec.description,1,250);
2009             l_task_in(i).TASK_START_DATE           := trunc(get_prj_route_dtls_rec.task_start_date);--Pass visit start date to avoid error from Projects
2010             l_task_in(i).TASK_COMPLETION_DATE      := null;
2011             l_task_in(i).SERVICE_TYPE_CODE         := get_prj_route_dtls_rec.service_type_code;
2012             -- Store the value of the cost parent id temporarily
2013             -- which will be reset or overwritten later with the task number corresponding to this cost parent
2014             IF (get_prj_route_dtls_rec.cost_parent_id IS NOT NULL) THEN
2015               l_task_in(i).PM_PARENT_TASK_REFERENCE  := '-' || get_prj_route_dtls_rec.cost_parent_id;
2016             ELSE
2017               l_task_in(i).PM_PARENT_TASK_REFERENCE  := null;
2018             END IF;
2019             -- Store the ref in the associative array
2020             l_id_ref_map_Tbl(get_prj_route_dtls_rec.visit_task_id) := get_prj_route_dtls_rec.visit_task_number;
2021 
2022             --PRAKKUM :: 11/06/2012 :: Bug 14068468
2023             -- IF repair batch name exists, then visit is considered as component visit, visit task that referencing as repair batch summary task
2024             -- So create a child dummy task to hold transactions
2025             IF (l_log_statement >= l_log_current_level) THEN
2026               fnd_log.string(l_log_statement,L_DEBUG_KEY,'get_prj_route_dtls_rec.repair_batch_name--@>'||get_prj_route_dtls_rec.repair_batch_name);
2027             END IF;
2028             IF l_is_comp_visit = 'Y' AND get_prj_route_dtls_rec.repair_batch_name IS NOT NULL THEN
2029                 i := i + 1;
2030                 l_task_in(i).PM_TASK_REFERENCE         := get_prj_route_dtls_rec.visit_task_number|| '-' || G_TRANS_TSK_TRAIL_NAME;
2031                 l_task_in(i).TASK_NAME                 := SUBSTRB(get_prj_route_dtls_rec.task_name,1,15)|| '-' || G_TRANS_TSK_TRAIL_NAME;
2032                 l_task_in(i).LONG_TASK_NAME            := get_prj_route_dtls_rec.task_name|| '-' || G_TRANS_TSK_TRAIL_NAME;
2033                 l_task_in(i).PA_TASK_NUMBER            := get_prj_route_dtls_rec.visit_task_number|| '-' || G_TRANS_TSK_TRAIL_NAME;
2034                 l_task_in(i).TASK_START_DATE           := trunc(get_prj_route_dtls_rec.task_start_date);
2035                 l_task_in(i).TASK_COMPLETION_DATE      := null;
2036                 l_task_in(i).SERVICE_TYPE_CODE         := get_prj_route_dtls_rec.service_type_code;
2037                 l_task_in(i).PM_PARENT_TASK_REFERENCE  := get_prj_route_dtls_rec.visit_task_number;  -- Parent is the rollup task added above
2038             END IF;
2039 
2040           END IF;
2041 
2042           i := i + 1;
2043         END LOOP;
2044         CLOSE get_prj_route_dtls_cur;
2045         -- PRAKKUM :: PIE :: 13-OCT-2010 ::END
2046       END IF; -- End of l_count
2047 
2048           -- PRAKKUM :: PIE :: 13-OCT-2010 :: START
2049       IF l_task_in.COUNT > 0 THEN
2050         -- Setup the parent task for all Summary and Rollup Tasks
2051         i := l_task_in.FIRST;
2052         LOOP
2053           IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
2054             fnd_log.string(fnd_log.level_statement, L_DEBUG_KEY, 'i = ' || i ||
2055                     ', l_task_in(i).pm_parent_task_reference = ' || l_task_in(i).pm_parent_task_reference);
2056           END IF;
2057           IF (l_task_in(i).pm_parent_task_reference IS NOT NULL AND (SUBSTR(l_task_in(i).pm_parent_task_reference, 1, 1) = '-')) THEN
2058             -- Has a parent whose index is not known: Lookup the index in the associative array
2059             l_task_in(i).pm_parent_task_reference := l_id_ref_map_Tbl(TO_NUMBER(SUBSTR(l_task_in(i).pm_parent_task_reference, 2)));
2060           END IF;
2061           EXIT WHEN i = l_task_in.LAST ;
2062           i := l_task_in.NEXT(i);
2063         END LOOP;
2064 
2065         i := l_task_in.FIRST;
2066 
2067         IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
2068           LOOP
2069             fnd_log.string(fnd_log.level_statement, L_DEBUG_KEY, 'Index i = '|| i || ', PA_TASK_NUMBER = ' || l_task_in(i).PA_TASK_NUMBER ||
2070                                                              ', pm_parent_task_reference = ' || l_task_in(i).pm_parent_task_reference);
2071             fnd_log.string(fnd_log.level_statement,L_DEBUG_KEY,'TASK REFERENCE - '|| l_task_in(i).PM_TASK_REFERENCE);
2072             fnd_log.string(fnd_log.level_statement,L_DEBUG_KEY,'TASK NAME - '|| l_task_in(i).TASK_NAME);
2073             fnd_log.string(fnd_log.level_statement,L_DEBUG_KEY,'TASK NUMBER - '|| l_task_in(i).PA_TASK_NUMBER);
2074             fnd_log.string(fnd_log.level_statement,L_DEBUG_KEY,'TASK_DESCRIPTION - '|| l_task_in(i).TASK_DESCRIPTION);
2075             fnd_log.string(fnd_log.level_statement,L_DEBUG_KEY,'TASK_START_DATE - '|| l_task_in(i).TASK_START_DATE);
2076             fnd_log.string(fnd_log.level_statement,L_DEBUG_KEY,'TASK_COMPLETION_DATE - '|| l_task_in(i).TASK_COMPLETION_DATE);
2077 
2078           EXIT WHEN i = l_task_in.LAST ;
2079           i := l_task_in.NEXT(i);
2080           END LOOP;
2081         END IF;
2082 
2083       END IF;  -- End of l_task_in
2084       -- PRAKKUM :: PIE :: 13-OCT-2010 :: END
2085       -- To check Project responsibilites
2086       -- Post 11.5.10
2087       -- RROY
2088 
2089       IF (l_log_statement >= l_log_current_level) THEN
2090          fnd_log.string(l_log_statement,
2091                         L_DEBUG_KEY,
2092                         'Before calling AHL_VWP_RULES_PVT.Check_Proj_Responsibility');
2093       END IF;
2094 
2095       AHL_VWP_RULES_PVT.Check_Proj_Responsibility
2096       (x_check_project => l_chk_project,
2097        x_return_status => l_return_status);
2098 
2099       IF (l_log_statement >= l_log_current_level) THEN
2100          fnd_log.string(l_log_statement,
2101                         L_DEBUG_KEY,
2102                         'After calling AHL_VWP_RULES_PVT.Check_Proj_Responsibility. Return Status = ' || l_return_status);
2103       END IF;
2104 
2105       IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
2106          IF (l_log_statement >= l_log_current_level) THEN
2107             fnd_log.string(l_log_statement,
2108                            L_DEBUG_KEY,
2109                            'Errors from AHL_VWP_RULES_PVT.Check_Proj_Responsibility');
2110          END IF;
2111          x_return_status := l_return_status;
2112          IF l_return_status = FND_API.G_RET_STS_ERROR THEN
2113             RAISE FND_API.G_EXC_ERROR;
2114          ELSE
2115             RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2116          END IF;
2117       END IF;
2118 
2119       IF l_chk_project = 'Y' THEN
2120          IF (l_log_statement >= l_log_current_level) THEN
2121             fnd_log.string(l_log_statement,
2122                            L_DEBUG_KEY,
2123                            'Before calling PA_PROJECT_PUB.check_unique_project_reference to check for ' || l_project_num_prefix || c_visit_rec.visit_number);
2124          END IF;
2125 
2126          PA_PROJECT_PUB.Check_Unique_Project_Reference(
2127             p_api_version_number      => 1,
2128             p_init_msg_list           => l_init_msg_list,
2129             p_return_status           => l_return_status,
2130             p_msg_count               => l_msg_count,
2131             p_msg_data                => l_msg_data,
2132             -- Modified by rnahata on February 19, 2008 for Bug 6685071
2133             -- by prepending the l_project_num_prefix
2134             p_pm_project_reference    => l_project_num_prefix || c_visit_rec.visit_number,
2135             p_unique_project_ref_flag => l_project_flag);
2136 
2137          IF (l_log_statement >= l_log_current_level) THEN
2138             fnd_log.string(l_log_statement,
2139                            L_DEBUG_KEY,
2140                            'Returned from PA_PROJECT_PUB.check_unique_project_reference: p_unique_project_ref_flag = ' || l_project_flag || ', Return Status = ' || l_return_status );
2141          END IF;
2142 
2143          IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
2144             IF (l_log_statement >= l_log_current_level) THEN
2145                fnd_log.string(l_log_statement,
2146                               L_DEBUG_KEY,
2147                               'Errors from PA_PROJECT_PUB.check_unique_project_reference. Message count: ' ||
2148                               l_msg_count || ', message data: ' || l_msg_data);
2149             END IF;
2150             IF l_return_status = FND_API.G_RET_STS_ERROR THEN
2151                RAISE FND_API.G_EXC_ERROR;
2152             ELSE
2153                RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2154             END IF;
2155          END IF;
2156 
2157          IF l_project_flag = 'Y' THEN
2158             IF (l_log_statement >= l_log_current_level) THEN
2159                fnd_log.string(l_log_statement,
2160                               L_DEBUG_KEY,
2161                               'Before calling PA_PROJECT_PUB.create_project');
2162             END IF;
2163 
2164             PA_PROJECT_PUB.CREATE_PROJECT
2165             (p_api_version_number => 1,
2166              p_commit             => l_commit,
2167              p_init_msg_list      => l_init_msg_list,
2168              p_msg_count          => l_msg_count,
2169              p_msg_data           => l_msg_data,
2170              p_return_status      => x_return_status,
2171              p_workflow_started   => l_workflow_started,
2172              p_pm_product_code    => G_PM_PRODUCT_CODE,
2173              p_project_in         => l_project_rec,
2174              p_project_out        => l_project_out,
2175              p_key_members        => l_key_members,
2176              p_class_categories   => l_class_categories,
2177              p_tasks_in           => l_task_in,
2178              p_tasks_out          => l_task_out
2179             );
2180 
2181             IF (l_log_statement >= l_log_current_level) THEN
2182                fnd_log.string(l_log_statement,
2183                               L_DEBUG_KEY,
2184                               'After calling PA_PROJECT_PUB.create_project. Project_Id = ' ||
2185                               l_project_out.pa_project_id || ' Return Status = ' || x_return_status);
2186             END IF;
2187 
2188             IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
2189                IF (l_log_statement >= l_log_current_level) THEN
2190                   fnd_log.string(l_log_statement,
2191                                  L_DEBUG_KEY,
2192                                  'Errors from PA_PROJECT_PUB.create_project. Message count: ' ||
2193                                  l_msg_count || ', message data: ' || l_msg_data);
2194                END IF;
2195                IF l_return_status = FND_API.G_RET_STS_ERROR THEN
2196                   RAISE FND_API.G_EXC_ERROR;
2197                ELSE
2198                   RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2199                END IF;
2200             END IF;
2201 
2202             IF x_return_status = 'S' THEN
2203                UPDATE AHL_VISITS_B
2204                SET PROJECT_ID = l_project_out.pa_project_id,
2205                    OBJECT_VERSION_NUMBER = c_visit_rec.object_version_number + 1,
2206                    --TCHIMIRA::BUG 9222622 ::15-DEC-2009::UPDATE WHO COLUMNS
2207                    LAST_UPDATE_DATE      = SYSDATE,
2208                    LAST_UPDATED_BY       = Fnd_Global.USER_ID,
2209                    LAST_UPDATE_LOGIN     = Fnd_Global.LOGIN_ID
2210                WHERE VISIT_ID = p_visit_id;
2211                -- RROY
2212                -- Post 11.5.10
2213                -- Call Create_Project_Parameter API
2214                -- RROY
2215                -- Confirm the parameters
2216                -- Other parameters are not mandatory
2217 
2218                OPEN c_cost_group(c_visit_rec.organization_id);
2219                FETCH c_cost_group INTO l_param_data.cost_group_id;
2220                CLOSE c_cost_group;
2221 
2222                l_param_data.project_id := l_project_out.pa_project_id;
2223                l_param_data.organization_id := c_visit_rec.organization_id;
2224                --l_param_data.cost_group_id := NVL(l_param_data.cost_group_id,1);
2225                l_param_data.wip_acct_class_code := NULL;
2226                l_param_data.eam_acct_class_code := NULL;
2227                l_param_data.ipv_expenditure_type := NULL;
2228                l_param_data.erv_expenditure_type := NULL;
2229                l_param_data.freight_expenditure_type := NULL;
2230                l_param_data.tax_expenditure_type := NULL;
2231                l_param_data.misc_expenditure_type := NULL;
2232                l_param_data.ppv_expenditure_type := NULL;
2233                l_param_data.dir_item_expenditure_type := 'Machine Usage';
2234                -- yazhou 06Oct2005 starts
2235                -- Bug fix #4658861
2236                --l_param_data.start_date_active := c_visit_rec.start_date_time;
2237                --l_param_data.end_date_active := c_visit_rec.close_date_time;
2238                l_param_data.start_date_active := NULL;
2239                l_param_data.end_date_active := NULL;
2240                -- yazhou 06Oct2005 ends
2241                -- Changes made by jaramana on May 5, 2006 to accommodate PJM Bug 5197977/5194650
2242                IF (l_log_statement >= l_log_current_level) THEN
2243                    FND_LOG.STRING(l_log_statement, L_DEBUG_KEY, 'About to set MFG_ORGANIZATION_ID Profile with ' || c_visit_rec.organization_id);
2244                END IF;
2245                FND_PROFILE.PUT('MFG_ORGANIZATION_ID', TO_CHAR(c_visit_rec.organization_id));
2246 
2247                PJM_PROJECT_PARAM_PUB.Create_Project_Parameter(
2248                     p_api_version   => 1.0,
2249                     p_init_msg_list => l_init_msg_list,
2250                     p_commit        => l_commit,
2251                     x_return_status => l_return_status,
2252                     x_msg_count     => l_msg_count,
2253                     x_msg_data      => l_msg_data,
2254                     p_param_data    => l_param_data);
2255 
2256                IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
2257                   IF (l_log_statement >= l_log_current_level) THEN
2258                      fnd_log.string(l_log_statement,
2259                                     L_DEBUG_KEY,
2260                                     'Errors from PJM_PROJECT_PARAM_PUB.Create_Project_Parameter. Message count: ' ||
2261                                     l_msg_count || ', message data: ' || l_msg_data);
2262                   END IF;
2263 
2264                   IF l_return_status = FND_API.G_RET_STS_ERROR THEN
2265                     RAISE FND_API.G_EXC_ERROR;
2266                   ELSE
2267                     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2268                   END IF;
2269                END IF;
2270                -- RROY
2271                IF l_task_out.COUNT > 0 THEN
2272                   z := l_task_out.FIRST;
2273                   LOOP
2274                      IF (l_log_statement >= l_log_current_level) THEN
2275                         fnd_log.string(l_log_statement,
2276                                        L_DEBUG_KEY,
2277                                        'Updating all tasks project_task_id = ' ||
2278                                        l_task_out(z).pa_task_id);
2279                      END IF;
2280 
2281                      --PRAKKUM :: PIE :: 13-OCT-2010 ::START
2282                      -- Update AHL_VISIT_TASKS_B only for non-rollup tasks
2283                      IF (INSTR(l_task_in(z).PA_TASK_NUMBER, '-') = 0) THEN
2284                        OPEN c_Task_OVN(p_visit_id,l_task_in(z).PA_TASK_NUMBER);
2285                        FETCH c_Task_OVN INTO l_obj_version;
2286                        CLOSE c_Task_OVN;
2287 
2288                        UPDATE AHL_VISIT_TASKS_B
2289                        SET PROJECT_TASK_ID = l_task_out(z).pa_task_id,
2290                            OBJECT_VERSION_NUMBER = l_obj_version + 1,
2291                          --TCHIMIRA::BUG 9222622 ::15-DEC-2009::UPDATE WHO COLUMNS
2292                          LAST_UPDATE_DATE      = SYSDATE,
2293                          LAST_UPDATED_BY       = Fnd_Global.USER_ID,
2294                          LAST_UPDATE_LOGIN     = Fnd_Global.LOGIN_ID
2295                        WHERE VISIT_ID = p_visit_id AND VISIT_TASK_NUMBER = l_task_in(z).PA_TASK_NUMBER;
2296                      END IF;
2297                      --PRAKKUM :: PIE :: 13-OCT-2010 ::END
2298                      EXIT WHEN z = l_task_out.LAST ;
2299                      z := l_task_out.NEXT(z);
2300                   END LOOP;
2301                END IF; -- End of l_task_out.COUNT
2302             END IF; -- End of x_return_status = 'S'
2303          ELSE -- Else of l_project_flag = 'Y'
2304             x_return_status := Fnd_Api.g_ret_sts_error;
2305             IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_error) THEN
2306               Fnd_Message.set_name ('AHL', 'AHL_VWP_PROJECT_NOT_UNIQUE');
2307               Fnd_Msg_Pub.ADD;
2308             END IF;
2309          END IF; -- End of l_project_flag = 'Y'
2310       END IF;  --- End of l_chk_project = 'Y'
2311    ELSIF c_visit_rec.START_DATE_TIME IS NULL or c_visit_rec.START_DATE_TIME = Fnd_Api.G_MISS_DATE THEN
2312       x_return_status := Fnd_Api.g_ret_sts_error;
2313       IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_error) THEN
2314          Fnd_Message.set_name ('AHL', 'AHL_VWP_VISIT_ST_DT_MISSING');
2315          Fnd_Msg_Pub.ADD;
2316       END IF;
2317    END IF;  -- End of Start Time and Department null Check
2318 
2319    IF (l_log_statement >= l_log_current_level) THEN
2320      FOR get_proj_details_rec IN get_proj_details(l_project_out.pa_project_id)
2321      LOOP
2322        fnd_log.string(l_log_statement, L_DEBUG_KEY , 'task_id--@>'||get_proj_details_rec.task_id);
2323        fnd_log.string(l_log_statement, L_DEBUG_KEY , 'project_id--@>'||get_proj_details_rec.project_id);
2324        fnd_log.string(l_log_statement, L_DEBUG_KEY , 'parent_task_id--@>'||get_proj_details_rec.parent_task_id);
2325        fnd_log.string(l_log_statement, L_DEBUG_KEY , 'task_name--@>'||get_proj_details_rec.task_name);
2326      END LOOP;
2327    END IF;
2328 
2329    IF (l_log_procedure >= l_log_current_level) THEN
2330       fnd_log.string(l_log_procedure,
2331                      L_DEBUG_KEY ||'.end',
2332                      'At the end of PL SQL procedure. Return Status = ' || x_return_status);
2333    END IF;
2334 END Create_Project;
2335 
2336 --------------------------------------------------------------------
2337 -- PROCEDURE
2338 --    Update_Project
2339 --
2340 -- PURPOSE
2341 --    To update Project status to CLOSED when visit is set as Closed/Canceled
2342 --------------------------------------------------------------------
2343 PROCEDURE Update_Project(
2344    p_api_version       IN  NUMBER,
2345    p_init_msg_list     IN  VARCHAR2  := Fnd_Api.g_false,
2346    p_commit            IN  VARCHAR2  := Fnd_Api.g_false,
2347    p_validation_level  IN  NUMBER    := Fnd_Api.g_valid_level_full,
2348    p_module_type       IN  VARCHAR2  := Null,
2349    p_visit_id          IN  NUMBER,
2350 
2351    x_return_status     OUT NOCOPY VARCHAR2,
2352    x_msg_count         OUT NOCOPY NUMBER,
2353    x_msg_data          OUT NOCOPY VARCHAR2)
2354 AS
2355   -- Define local Variables
2356    L_API_NAME     CONSTANT VARCHAR2(30)  := 'Update_Project';
2357    L_API_VERSION  CONSTANT NUMBER := 1.0;
2358    L_DEBUG_KEY    CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
2359    l_count                 NUMBER;
2360    l_msg_count             NUMBER;
2361    l_created_project_id    NUMBER;
2362    i                       NUMBER;
2363    l_msg_index_out         NUMBER;
2364 --  PRAKKUM :: PIE Changes :: 13-OCT-2010
2365 --  CREATED_FROM_PROJECT_ID NUMBER;
2366    l_return_status         VARCHAR2(1);
2367    l_chk_project           VARCHAR2(1);
2368    l_workflow_started      VARCHAR2(1);
2369    l_valid_flag            VARCHAR2(1):= 'N';
2370    l_commit                VARCHAR2(1) := 'F';
2371    l_init_msg_list         VARCHAR2(1) := 'F';
2372    l_default               VARCHAR2(30);
2373    l_msg_data              VARCHAR2(2000);
2374    G_EXC_ERROR             EXCEPTION;
2375 
2376   -- Define local table and record datatypes
2377    l_project_rec       PA_PROJECT_PUB.PROJECT_IN_REC_TYPE;
2378    l_project_out       PA_PROJECT_PUB.PROJECT_OUT_REC_TYPE;
2379    l_param_data        PJM_PROJECT_PARAM_PUB.ParamRecType;
2380    l_task_in           PA_PROJECT_PUB.TASK_IN_TBL_TYPE;
2381    l_op_task_in        PA_PROJECT_PUB.TASK_IN_TBL_TYPE;
2382    l_display_seq       NUMBER;
2383    l_task_out          PA_PROJECT_PUB.TASK_OUT_TBL_TYPE;
2384    l_key_members       PA_PROJECT_PUB.PROJECT_ROLE_TBL_TYPE;
2385    l_class_categories  PA_PROJECT_PUB.CLASS_CATEGORY_TBL_TYPE;
2386 
2387    -- yazhou 26Sept2005 starts
2388    -- ER#4618348
2389    -- l_project_name_prefix  VARCHAR2(10);
2390    l_project_num_prefix      VARCHAR2(10);
2391    l_visit_name_len          NUMBER;
2392    -- yazhou 26Sept2005 ends
2393 
2394    -- PRAKKUM :: PIE :: 13-OCT-2010 :: START
2395    l_top_task_id NUMBER := NULL;
2396    l_new_structure_flag VARCHAR2(1);
2397    -- Associative array of visit task id to project task ref
2398    TYPE Ref_Tbl_Type IS TABLE OF VARCHAR2(30) INDEX BY BINARY_INTEGER;
2399    l_id_ref_map_Tbl        Ref_Tbl_Type;
2400 
2401    -- PRAKKUM :: 24-NOV-2010 :: Bug 9370120 :: FP:12.0-12.2
2402    TYPE Id_Tbl_Type IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
2403    l_task_id_tbl              Id_Tbl_Type;
2404    -- PRAKKUM :: 08-JAN-2013 :: FPBug 16481709 for BaseBug 14828418 : In reference of bug 9047048
2405    l_parent_task_id_tbl       Id_Tbl_Type;
2406    l_tasks_disp_seq_tbl       Id_Tbl_Type;
2407 
2408    l_is_wp_separate_from_fn   VARCHAR2(1);
2409    l_is_wp_versioning_enabled VARCHAR2(1);
2410    l_pass_entire_structure    VARCHAR2(1) := 'N'; -- Default to 'N';
2411    l_task_ref_tbl             ref_tbl_type;
2412    l_parent_task_ref_tbl      ref_tbl_type;
2413    L_CURR_TASK_COUNT          NUMBER;
2414 
2415    -- PRAKKUM :: 08-JAN-2013 :: FPBug 16481709 for BaseBug 14828418 : In reference of bug 9047048
2416    -- Changed code to resolve error that being thrown if non-cmro project tasks have hierarchy
2417    -- This cursor gets the task ref and parent task ref for all the tasks in the given project
2418    CURSOR get_project_tasks_csr (c_project_id IN NUMBER) IS
2419      SELECT ppe.pm_source_reference, ppe1.pm_source_reference PARENT_TASK_REFERENCE, ppe.proj_element_id TASK_ID
2420             , parent_p_tsks.task_id PARENT_TASK_ID, PPEV.DISPLAY_SEQUENCE
2421      --SELECT ppe.pm_source_reference, ppe1.pm_source_reference PARENT_TASK_REFERENCE, ppe.proj_element_id
2422        FROM pa_proj_element_versions ppev, pa_object_relationships por,
2423             pa_proj_element_versions ppev1, pa_proj_elements ppe,
2424             pa_proj_elements ppe1,
2425             pa_tasks parent_p_tsks
2426       WHERE ppev.element_version_id = por.object_id_to1
2427         AND por.relationship_type = 'S'  -- WORKPLAN STRUCTURE
2428         AND por.object_id_from1 = ppev1.element_version_id
2429         AND ppev.project_id = c_project_id
2430         AND ppev1.project_id = c_project_id
2431         AND ppe.project_id = ppev.project_id
2432         AND ppe.proj_element_id = ppev.proj_element_id
2433         AND ppe1.project_id = ppev1.project_id
2434         AND ppe1.proj_element_id = ppev1.proj_element_id
2435         AND parent_p_tsks.task_id (+) = ppe1.proj_element_id
2436    ORDER BY ppev.DISPLAY_SEQUENCE;
2437 
2438    -- PRAKKUM :: 08-JAN-2013 :: FPBug 16481709 for BaseBug 14828418 : In reference of bug 9047048
2439    -- This cursor gets the task ref and parent task ref for all the tasks in the given project
2440    -- leaving out those in the current visit (represented by its top task id)
2441    CURSOR get_other_vst_prj_tsks_csr(c_project_id IN NUMBER, c_top_task_id IN NUMBER) IS
2442      SELECT CURR.PM_TASK_REFERENCE, P_CURR.PM_TASK_REFERENCE PARENT_TASK_REFERENCE,
2443        CURR.TASK_ID  -- PRAKKUM :: 24-NOV-2010 :: Bug 9370120 :: FP:12.0-12.2 :: Fetch project task id as well
2444        , P_CURR.task_id PARENT_TASK_ID, PPEV.DISPLAY_SEQUENCE
2445        FROM PA_TASKS CURR, PA_PROJ_ELEMENT_VERSIONS PPEV, PA_TASKS P_CURR
2446       WHERE CURR.PROJECT_ID = c_project_id
2447         AND CURR.TOP_TASK_ID <> c_top_task_id
2448         AND PPEV.PROJ_ELEMENT_ID = CURR.TASK_ID
2449         AND PPEV.PROJECT_ID = c_project_id
2450         AND P_CURR.TASK_ID (+) = CURR.PARENT_TASK_ID
2451    ORDER BY PPEV.DISPLAY_SEQUENCE;
2452    -- PRAKKUM :: PIE :: 13-OCT-2010 :: END
2453 
2454    -- PRAKKUM :: 04-JAN-2013 :: FPBug 16481709 for BaseBug 14828418 : In reference of bug 9047048 :: START
2455    -- Query to retrive only project tasks whihc are not mapped to visits - excluding roll up tasks
2456    CURSOR get_prj_tsks_not_mapd_to_vst(c_project_id IN NUMBER, c_visit_id IN NUMBER) IS
2457     SELECT CURR.TASK_ID TASK_ID, CURR.PARENT_TASK_ID PARENT_TASK_ID, PPEV.DISPLAY_SEQUENCE
2458      FROM PA_TASKS CURR,
2459           PA_PROJ_ELEMENT_VERSIONS PPEV
2460      WHERE CURR.PROJECT_ID = c_project_id
2461       AND CURR.TOP_TASK_ID not IN
2462           (
2463             SELECT DISTINCT TOP_TASK_ID
2464             FROM AHL_VISIT_TASKS_VL VT, PA_PROJ_ELEMENT_VERSIONS PPEV, PA_TASKS PTSKS
2465             WHERE PPEV.PROJECT_ID = c_project_id
2466             AND VT.VISIT_ID = c_visit_id -- PRAKKUM :: 17-JAN-2013 :: FPBug 16481709 for BaseBug 14828418
2467             AND PPEV.PROJ_ELEMENT_ID = VT.PROJECT_TASK_ID
2468             AND PTSKS.TASK_ID = PPEV.PROJ_ELEMENT_ID
2469           ) /* Query to get all the top project tasks corresponding to visits */
2470       AND PPEV.PROJ_ELEMENT_ID = CURR.TASK_ID
2471       AND PPEV.PROJECT_ID = c_project_id
2472      ORDER BY PPEV.DISPLAY_SEQUENCE;
2473 
2474    CURSOR get_vst_prj_top_task(c_project_id IN AHL_VISITS_B.PROJECT_ID%TYPE, c_visit_id IN AHL_VISITS_B.VISIT_ID%TYPE) IS
2475     SELECT distinct PTSKS.TOP_TASK_ID TOP_TASK_ID
2476       FROM AHL_VISIT_TASKS_VL VT, PA_PROJ_ELEMENT_VERSIONS PPEV, PA_TASKS PTSKS
2477       WHERE PPEV.PROJECT_ID = c_project_id
2478       AND PPEV.PROJ_ELEMENT_ID = VT.PROJECT_TASK_ID
2479       AND PTSKS.TASK_ID = PPEV.PROJ_ELEMENT_ID
2480       AND VT.VISIT_ID = c_visit_id;
2481    l_vst_prj_top_tsk_rec get_vst_prj_top_task%RowType;
2482    -- PRAKKUM :: 04-JAN-2013 :: FPBug 16481709 for BaseBug 14828418 : In reference of bug 9047048 :: END
2483 
2484  -- Define local Cursors
2485     -- To find visit related information
2486    CURSOR c_visit (x_id IN NUMBER) IS
2487     SELECT * FROM AHL_VISITS_VL
2488     WHERE VISIT_ID = x_id;
2489    c_visit_rec c_visit%ROWTYPE;
2490 
2491   -- To find count for tasks for visit
2492    CURSOR c_task_ct (x_id IN NUMBER) IS
2493     SELECT count(*) FROM AHL_VISIT_TASKS_VL
2494     WHERE VISIT_ID = x_id
2495      AND NVL(status_code, 'Y') <> NVL ('DELETED', 'X')    ;
2496 
2497 --      PRAKKUM :: PIE :: 13-OCT-2010 ::
2498    -- To find tasks information for visit
2499    CURSOR c_task (x_id IN NUMBER) IS
2500    -- SELECT * FROM AHL_VISIT_TASKS_VL
2501    -- WHERE VISIT_ID = x_id
2502    -- AND NVL(status_code, 'Y') <> NVL ('DELETED', 'X');
2503     SELECT PPEV.DISPLAY_SEQUENCE, VT.*
2504     FROM AHL_VISIT_TASKS_VL VT, PA_PROJ_ELEMENT_VERSIONS PPEV
2505     WHERE VT.VISIT_ID = x_id
2506      AND NVL(VT.status_code, 'Y') <> NVL ('DELETED', 'X')
2507      AND PPEV.PROJ_ELEMENT_ID (+) = VT.PROJECT_TASK_ID;
2508      c_task_rec c_task%ROWTYPE;
2509 
2510   -- To find tasks information for visit
2511    CURSOR c_task_proj (x_id IN NUMBER) IS
2512     SELECT TASK_ID, TASK_NUMBER
2513     FROM PA_TASKS
2514     WHERE PROJECT_ID = x_id;
2515    c_task_proj_rec c_task_proj%ROWTYPE;
2516 
2517   -- PRAKKUM :: PIE :: 13-OCT-2010
2518   -- To find project task id, given the task number
2519    CURSOR get_task_id_parent_ref_csr (c_project_id IN NUMBER, c_task_number IN VARCHAR2) IS
2520     SELECT CURR.TASK_ID, PARENT.PM_TASK_REFERENCE PARENT_TASK_REFERENCE
2521       FROM PA_TASKS CURR, PA_TASKS PARENT
2522      WHERE CURR.PROJECT_ID = c_project_id
2523        AND CURR.TASK_NUMBER = c_task_number
2524        AND PARENT.TASK_ID (+) = CURR.PARENT_TASK_ID;
2525 
2526    CURSOR get_task_disp_seq_csr (c_project_task_id IN NUMBER) IS
2527     SELECT PPEV.DISPLAY_SEQUENCE
2528       FROM PA_PROJ_ELEMENT_VERSIONS PPEV
2529      WHERE PPEV.PROJ_ELEMENT_ID = c_project_task_id;
2530 
2531   CURSOR c_pjm_param(x_proj_id IN NUMBER,x_org_id IN NUMBER) IS
2532   SELECT 'x'
2533   FROM   pjm_project_parameters_v
2534   WHERE  project_id = x_proj_id
2535   AND    organization_id = x_org_id;
2536 
2537   l_dummy VARCHAR2(1);
2538 
2539   -- To get the cost group for the Org
2540   CURSOR c_cost_group(p_org_id IN NUMBER) IS
2541   SELECT default_cost_group_id
2542   FROM mtl_parameters
2543   WHERE organization_id = p_org_id;
2544 
2545   --Bug#5587893
2546   /*sowsubra - starts*/
2547   -- To get the project status for visit updation
2548   CURSOR c_proj_status_code(x_id IN NUMBER) IS
2549   SELECT ppa.project_status_code
2550   FROM ahl_visits_b avb, pa_projects_all ppa
2551   WHERE avb.visit_id = x_id
2552   AND avb.project_id = ppa.project_id;
2553 
2554   l_prj_status_code_fdb   pa_projects_all.project_status_code%TYPE;
2555   /*sowsubra - ends*/
2556 
2557   /*
2558   Modified by rnahata for Bug 5758813
2559   Fetches the task details for all the tasks in the visit
2560   The first part of the union fetches task details for all the Planned and Unplanned tasks.
2561   The second part fetches task details of all the MR/NR/SR Summary tasks.
2562   The third part fetches task details of all the manually created Summary and Unassociated tasks.
2563   */
2564   -- PRAKKUM :: 24-NOV-2010 :: Bug 9705164 :: FP12.0.9-12.2:PIE :: START
2565   -- Changed the below cursor to fetch results in the order of the cost parent hierarchy of visit tasks
2566   -- Need to pass these tasks' details to the Projects API, in the order of their hierarchy
2567   -- PRAKKUM :: PIE :: 28-OCT-2010 :: START Commented planning
2568   CURSOR get_prj_route_dtls_cur (p_visit_id IN NUMBER) IS
2569    SELECT * FROM (
2570    SELECT SUBSTR(NVL(ar.route_no,avt.visit_task_name),1,20) task_name,
2571    SUBSTR(NVL(ar.title,avt.visit_task_name),1,250) description,
2572    avt.visit_task_name, avt.visit_task_number, avt.start_date_time task_start_date,
2573    avt.end_date_time task_end_date, avt.project_Task_id project_task_id, ppev.display_sequence,
2574    avt.task_type_code, avt.cost_parent_id, avt.service_type_code, avt.visit_task_id
2575    , avt.repair_batch_name --PRAKKUM :: 11/06/2012 :: Bug 14068468
2576    FROM ahl_routes_vl ar,ahl_visit_tasks_vl avt, ahl_mr_routes mrr, pa_proj_element_versions ppev
2577    WHERE avt.visit_id = p_visit_id
2578    --VWPE: ER:12424063 :: SKPATHAK :: 07-JUN-2012 :: Tasks should not be in deleted status
2579     AND NVL(avt.status_code,'Y') <> 'DELETED'
2580     AND avt.task_type_code NOT IN ('SUMMARY','UNASSOCIATED','STAGE') ----SKPATHAK :: VWPE: ER:12424063 :: 13-JUN-2012 :: Need not create project task for a stage
2581     AND avt.mr_route_id = mrr.mr_route_id (+)
2582     AND mrr.route_id = ar.route_id (+)
2583     AND ppev.proj_element_id (+) = avt.project_task_id
2584    UNION ALL
2585    SELECT SUBSTR(NVL(amh.title,avt.visit_task_name),1,20) task_name, NVL(amh.title,avt.visit_task_name) description,
2586    avt.visit_task_name, avt.visit_task_number, avt.start_date_time task_start_date,
2587    avt.end_date_time task_end_date, avt.project_Task_id project_task_id, ppev.display_sequence,
2588    avt.task_type_code, avt.cost_parent_id, avt.service_type_code, avt.visit_task_id
2589    , avt.repair_batch_name --PRAKKUM :: 11/06/2012 :: Bug 14068468
2590    FROM ahl_mr_headers_v amh,ahl_visit_tasks_vl avt, pa_proj_element_versions ppev
2591    WHERE avt.visit_id = p_visit_id
2592    --VWPE: ER:12424063 :: SKPATHAK :: 07-JUN-2012 :: Tasks should not be in deleted status
2593     AND NVL(avt.status_code,'Y') <> 'DELETED'
2594     AND avt.task_type_code = 'SUMMARY'
2595     AND avt.summary_task_flag = 'N'
2596     AND avt.mr_id = amh.mr_header_id (+)
2597     AND ppev.proj_element_id (+) = avt.project_task_id
2598    UNION ALL
2599    SELECT SUBSTR(avt.visit_task_name,1,20) task_name, avt.visit_task_name description,
2600    avt.visit_task_name, avt.visit_task_number, avt.start_date_time task_start_date,
2601    avt.end_date_time task_end_date, avt.project_Task_id project_task_id, ppev.display_sequence,
2602    avt.task_type_code, avt.cost_parent_id, avt.service_type_code, avt.visit_task_id
2603    , avt.repair_batch_name --PRAKKUM :: 11/06/2012 :: Bug 14068468
2604    FROM ahl_visit_tasks_vl avt, pa_proj_element_versions ppev
2605    WHERE avt.visit_id = p_visit_id
2606    --VWPE: ER:12424063 :: SKPATHAK :: 07-JUN-2012 :: Tasks should not be in deleted status
2607     AND NVL(avt.status_code,'Y') <> 'DELETED'
2608     AND ((avt.task_type_code = 'SUMMARY' AND avt.summary_task_flag = 'Y')
2609      OR (avt.task_type_code ='UNASSOCIATED'))
2610     AND ppev.proj_element_id (+) = avt.project_task_id
2611    --ORDER BY 4;
2612     )
2613     START WITH cost_parent_id IS NULL
2614     CONNECT BY PRIOR visit_task_id = cost_parent_id;
2615   -- End changes by rnahata for Bug 5758813
2616   -- PRAKKUM :: PIE :: 28-OCT-2010 :: END Commented planning
2617   -- PRAKKUM :: 24-NOV-2010 :: Bug 9705164 :: FP12.0.9-12.2:PIE :: END
2618 
2619   get_prj_route_dtls_rec  get_prj_route_dtls_cur%ROWTYPE;
2620 
2621   -- SKPATHAK :: Bug 14016007 :: 29-APR-2012 :: Added the below cursor
2622   --Fetch the project number
2623   CURSOR get_project_number (c_project_id IN NUMBER) IS
2624    SELECT segment1
2625      from pa_projects_all
2626      where project_id = c_project_id;
2627   l_project_number VARCHAR2(25);
2628 
2629   --PRAKKUM :: 11/06/2012 :: Bug 14068468 :: START
2630   l_is_comp_visit VARCHAR2(1) := 'N';
2631 
2632   /* Query to find whether visit have any repair batch with transactions on it. If so, visit is treated as old component visit and also
2633      further transactions will be done only over repair batch task itself */
2634   CURSOR is_rep_batch_have_trans(c_visit_id IN NUMBER)
2635   IS
2636   SELECT 'Y' FROM
2637   AHL_VISITS_B vst
2638   WHERE
2639   visit_id = c_visit_id AND
2640   EXISTS (
2641    SELECT 1
2642     FROM ahl_visit_tasks_b avt,
2643          pa_tasks pt
2644     WHERE avt.visit_id = vst.visit_id
2645     AND avt.visit_id = c_visit_id
2646     AND avt.repair_batch_name IS NOT NULL
2647     and avt.project_task_id =  pt.task_id
2648     AND EXISTS (
2649        SELECT 1
2650        FROM mtl_material_transactions mmt
2651        WHERE mmt.project_id = vst.PROJECT_ID
2652        AND mmt.task_id = nvl(pt.task_id,mmt.task_id)
2653     )
2654   );
2655 
2656   l_is_vst_hav_trx_on_rep_btch VARCHAR2(1) := 'N';
2657   --PRAKKUM :: 11/06/2012 :: Bug 14068468 :: END
2658 
2659 BEGIN
2660     SAVEPOINT Update_project;
2661 
2662    IF (l_log_procedure >= l_log_current_level) THEN
2663       fnd_log.string(l_log_procedure,
2664                      L_DEBUG_KEY ||'.begin',
2665                      'At the start of PL SQL procedure. Visit Id = ' || p_visit_id);
2666    END IF;
2667 
2668     -- Initialize message list if p_init_msg_list is set to TRUE.
2669     IF Fnd_Api.to_boolean(p_init_msg_list) THEN
2670       Fnd_Msg_Pub.initialize;
2671     END IF;
2672 
2673     --  Initialize API return status to success
2674     x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
2675 
2676     -- Standard call to check for call compatibility.
2677     IF NOT Fnd_Api.COMPATIBLE_API_CALL(l_api_version,
2678                                       p_api_version,
2679                                       l_api_name,G_PKG_NAME)
2680     THEN
2681        RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
2682     END IF;
2683 
2684     -- To check Project responsibilites
2685     -- Post 11.5.10
2686     -- RROY
2687    IF (l_log_statement >= l_log_current_level) THEN
2688       fnd_log.string(l_log_statement,
2689                      L_DEBUG_KEY,
2690                      'Before calling AHL_VWP_RULES_PVT.Check_Proj_Responsibility');
2691    END IF;
2692     AHL_VWP_RULES_PVT.Check_Proj_Responsibility
2693           ( x_check_project    => l_chk_project,
2694             x_return_status    => l_return_status);
2695 
2696    IF (l_log_statement >= l_log_current_level) THEN
2697       fnd_log.string(l_log_statement,
2698                      L_DEBUG_KEY,
2699                      'After calling AHL_VWP_RULES_PVT.Check_Proj_Responsibility. Return Status = ' || l_return_status);
2700    END IF;
2701 
2702    IF (l_return_status <> Fnd_Api.G_RET_STS_SUCCESS) THEN
2703       IF (l_log_statement >= l_log_current_level) THEN
2704          fnd_log.string(l_log_statement,
2705                         L_DEBUG_KEY,
2706                         'Errors from AHL_VWP_RULES_PVT.Check_Proj_Responsibility');
2707       END IF;
2708       x_return_status := l_return_status;
2709       IF l_return_status = FND_API.G_RET_STS_ERROR THEN
2710          RAISE FND_API.G_EXC_ERROR;
2711       ELSE
2712          RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2713       END IF;
2714    END IF;
2715 
2716     IF l_chk_project = 'Y' THEN
2717       OPEN c_Visit(p_visit_id);
2718       FETCH c_visit INTO c_visit_rec;
2719       CLOSE c_Visit;
2720 
2721       OPEN is_rep_batch_have_trans(p_visit_id);
2722       FETCH is_rep_batch_have_trans INTO l_is_vst_hav_trx_on_rep_btch;
2723       CLOSE is_rep_batch_have_trans;
2724 
2725       --PRAKKUM :: 11/06/2012 :: Bug 14068468
2726       l_is_comp_visit := AHL_CMP_UTIL_PKG.Is_Comp_Visit (p_visit_id);
2727       IF (l_log_statement >= l_log_current_level) THEN
2728          fnd_log.string(l_log_statement,L_DEBUG_KEY,'p_visit_id --@> '||p_visit_id);
2729          fnd_log.string(l_log_statement,L_DEBUG_KEY,'l_is_vst_hav_trx_on_rep_btch--@> '||l_is_vst_hav_trx_on_rep_btch);
2730          fnd_log.string(l_log_statement,L_DEBUG_KEY,'l_is_comp_visit--@> '||l_is_comp_visit);
2731       END IF;
2732 
2733       -- PRAKKUM :: PIE:FP :: 13-OCT-2010 :: START
2734       IF c_visit_rec.PROJECT_ID IS NOT NULL THEN
2735         l_is_wp_separate_from_fn   := PA_PROJ_TASK_STRUC_PUB.IS_WP_SEPARATE_FROM_FN(c_visit_rec.PROJECT_ID);
2736         l_is_wp_versioning_enabled := PA_PROJ_TASK_STRUC_PUB.IS_WP_VERSIONING_ENABLED(c_visit_rec.PROJECT_ID);
2737         IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2738           FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'c_visit_rec.PROJECT_ID = ' || c_visit_rec.PROJECT_ID ||
2739                         ', l_is_wp_separate_from_fn = ' || l_is_wp_separate_from_fn ||
2740                         ' and l_is_wp_versioning_enabled = ' || l_is_wp_versioning_enabled);
2741         END IF;
2742         IF (l_is_wp_separate_from_fn = 'N') THEN
2743           -- Workplan is enabled, Using Shared Structure
2744           -- In order to avoid the error with updating projects with Work Plan Structure enabled,
2745           -- just pass the task reference and the parent task reference for all existing tasks even if there is no change
2746           l_pass_entire_structure := 'Y';
2747         END IF;
2748       END IF;
2749       -- PRAKKUM :: PIE:FP :: 13-OCT-2010 :: END
2750 
2751       --Bug#5587893
2752       OPEN c_proj_status_code(p_visit_id);
2753       FETCH c_proj_status_code INTO l_prj_status_code_fdb;
2754       CLOSE c_proj_status_code;
2755 
2756       IF p_module_type = 'DEL' AND (c_visit_rec.start_date_time is null OR c_visit_rec.start_date_time =Fnd_Api.G_MISS_DATE) then
2757         c_visit_rec.start_date_time := SYSDATE;
2758       END IF;
2759 
2760       IF (c_visit_rec.START_DATE_TIME IS NOT NULL
2761         AND c_visit_rec.START_DATE_TIME <> Fnd_Api.G_MISS_DATE
2762         AND c_visit_rec.DEPARTMENT_ID IS NOT NULL
2763         AND c_visit_rec.DEPARTMENT_ID <> FND_API.G_MISS_NUM) THEN
2764 
2765         -- PRAKKUM :: PIE:FP :: 19-NOV-2010 ::
2766         /*
2767         IF c_visit_rec.project_template_id IS NOT NULL THEN
2768           CREATED_FROM_PROJECT_ID := c_visit_rec.project_template_id;
2769         ELSE
2770           CREATED_FROM_PROJECT_ID := nvl(FND_PROFILE.VALUE('AHL_DEFAULT_PA_TEMPLATE_ID'),0);
2771         END IF;
2772         */
2773 
2774         -- yazhou 26Sept2005 starts
2775         -- ER#4618348
2776 
2777         --l_project_name_prefix := SUBSTR(FND_PROFILE.VALUE('AHL_PROJECT_PREFIX'),1,10);
2778         --l_project_num_prefix := SUBSTR(FND_PROFILE.VALUE('AHL_PROJECT_NUM_PREFIX'),1,10);
2779         -- SKPATHAK :: Bug 14016007 :: 29-APR-2012
2780         -- Since in this API only a project is updated and not created, instead of getting project number prefix from the profile, derive it from already created project
2781         OPEN get_project_number (c_visit_rec.PROJECT_ID);
2782         FETCH get_project_number INTO l_project_number;
2783         CLOSE get_project_number;
2784         IF (l_project_number = (to_char(c_visit_rec.visit_number))) THEN
2785           l_project_num_prefix := null;
2786         ELSE
2787           l_project_num_prefix := SUBSTR (l_project_number, 0, (length(l_project_number) - length(to_char(c_visit_rec.visit_number))));
2788         END IF;
2789 
2790         IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
2791            fnd_log.string(fnd_log.level_statement,L_DEBUG_KEY,'l_project_num_prefix = ' || l_project_num_prefix);
2792         END IF;
2793 
2794 
2795         -- PRAKKUM :: PIE Changes :: 15-OCT-2010 :: START
2796         IF (l_log_statement >= l_log_current_level) THEN
2797          fnd_log.string(l_log_statement, L_DEBUG_KEY, 'Before calling Use_New_Task_Structure.');
2798         END IF;
2799 
2800         Use_New_Task_Structure
2801         ( p_visit_id            =>  p_visit_id,
2802           x_new_structure_flag  =>  l_new_structure_flag
2803          );
2804         -- If a visit is being pushed into production for the first time under a parent project,
2805         -- and the cost has not been estimated for this visit, create a top level task
2806         -- If the visit is in Planning and project_id is not null and top task is null and project_template_id is null,
2807         -- need to create the hierarchy under the existing project
2808         -- SKPATHAK :: VWPE: ER:12424063 :: 08-JUN-2012 :: Going forward, initial status of the visit will be draft
2809         IF (c_visit_rec.STATUS_CODE = 'DRAFT' AND
2810             c_visit_rec.PROJECT_ID IS NOT NULL AND
2811             c_visit_rec.TOP_PROJECT_TASK_ID IS NULL AND
2812             c_visit_rec.PROJECT_TEMPLATE_ID IS NULL) THEN
2813 
2814           -- TYPE 1: Visit is being pushed into production for the first time under a parent project
2815           IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
2816             fnd_log.string(fnd_log.level_statement, L_DEBUG_KEY, 'TYPE 1');
2817           END IF;
2818 
2819           IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
2820              fnd_log.string(fnd_log.level_statement, L_DEBUG_KEY, 'Adding top task to Project Id: ' || c_visit_rec.PROJECT_ID);
2821           END IF;
2822           l_Project_rec.PA_PROJECT_ID := c_visit_rec.PROJECT_ID;  -- Update the Parent Project
2823           -- Create the Top Task
2824           l_task_in(1).PM_TASK_REFERENCE        := l_project_num_prefix || to_char(c_visit_rec.visit_number);
2825           -- PRAKKUM :: Bug 8321557 :: 10-DEC-2010 :: Use SUBSTRB instead of SUBSTR
2826           l_task_in(1).TASK_NAME                := SUBSTRB(c_visit_rec.visit_name,1,15);
2827           l_task_in(1).LONG_TASK_NAME           := c_visit_rec.visit_name;
2828           l_task_in(1).PA_TASK_NUMBER           := l_project_num_prefix || to_char(c_visit_rec.visit_number);
2829           l_task_in(1).TASK_DESCRIPTION         := SUBSTRB(c_visit_rec.description,1,250);
2830           l_task_in(1).TASK_START_DATE          := trunc(c_visit_rec.start_date_time);
2831           l_task_in(1).TASK_COMPLETION_DATE     := null;
2832           l_task_in(1).PM_PARENT_TASK_REFERENCE := null;  -- No parent task for the top task
2833           l_top_task_id := -1;
2834 
2835 
2836           OPEN c_task_ct(p_visit_id);
2837           FETCH c_task_ct INTO l_count;
2838           CLOSE c_task_ct;
2839 
2840           IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
2841             fnd_log.string(fnd_log.level_statement, L_DEBUG_KEY, 'Number of tasks = ' || l_count);
2842           END IF;
2843 
2844           IF l_count > 0 THEN
2845             OPEN get_prj_route_dtls_cur(p_visit_id);
2846             i := 2;  -- Top Task index is 1
2847             LOOP
2848               FETCH get_prj_route_dtls_cur INTO get_prj_route_dtls_rec;
2849               EXIT WHEN get_prj_route_dtls_cur%NOTFOUND;
2850               -- If the visit start has been changed such that the visit start date is later than the visit task start date
2851               -- Then make the project task start date same as visit start date
2852               -- Later on, this will again be updated on the basis of EAM re-scheduling using Update_Project_Task_Times
2853               IF c_visit_rec.start_date_time > get_prj_route_dtls_rec.task_start_date THEN
2854                 get_prj_route_dtls_rec.task_start_date := c_visit_rec.start_date_time;
2855               END IF;
2856               IF get_prj_route_dtls_rec.task_type_code <> 'SUMMARY' THEN
2857                 -- Not a Summary task: First create a rollup task
2858                 l_task_in(i).PM_TASK_REFERENCE         := c_visit_rec.visit_number || '-' || get_prj_route_dtls_rec.visit_task_number || '-1';
2859                 l_task_in(i).TASK_NAME                 := SUBSTRB(get_prj_route_dtls_rec.task_name,1,15) || '-1';
2860                 l_task_in(i).LONG_TASK_NAME            := get_prj_route_dtls_rec.task_name || '-1';
2861                 l_task_in(i).PA_TASK_NUMBER            := c_visit_rec.visit_number || '-' || get_prj_route_dtls_rec.visit_task_number || '-1';
2862                 l_task_in(i).TASK_START_DATE           := trunc(c_visit_rec.start_date_time); -- Pass visit date for Rollup tasks
2863                 l_task_in(i).TASK_COMPLETION_DATE      := null;--trunc(c_visit_rec.close_date_time); -- Pass visit date for Rollup tasks
2864                 -- Store the value of the cost parent id temporarily
2865                 -- which will be reset or overwritten later with the task number corresponding to this cost parent
2866                 IF (get_prj_route_dtls_rec.cost_parent_id IS NOT NULL) THEN
2867                   l_task_in(i).PM_PARENT_TASK_REFERENCE  := '-' || get_prj_route_dtls_rec.cost_parent_id;
2868                 ELSE
2869                   -- Add this under the top task
2870                   l_task_in(i).PM_PARENT_TASK_REFERENCE  := l_project_num_prefix || to_char(c_visit_rec.visit_number);
2871                 END IF;
2872                 -- Then add the non-summary task under the rollup task
2873                 i := i + 1;
2874                 l_task_in(i).PM_TASK_REFERENCE         := c_visit_rec.visit_number || '-' || get_prj_route_dtls_rec.visit_task_number;
2875                 l_task_in(i).TASK_NAME                 := SUBSTRB(get_prj_route_dtls_rec.task_name,1,15);
2876                 l_task_in(i).LONG_TASK_NAME            := get_prj_route_dtls_rec.task_name;
2877                 l_task_in(i).PA_TASK_NUMBER            := c_visit_rec.visit_number || '-' || get_prj_route_dtls_rec.visit_task_number;
2878                 l_task_in(i).TASK_DESCRIPTION          := SUBSTRB(get_prj_route_dtls_rec.description,1,250);
2879                 l_task_in(i).TASK_START_DATE           := trunc(get_prj_route_dtls_rec.task_start_date);
2880                 l_task_in(i).TASK_COMPLETION_DATE      := null;
2881                 l_task_in(i).SERVICE_TYPE_CODE         := get_prj_route_dtls_rec.service_type_code;
2882                 l_task_in(i).PM_PARENT_TASK_REFERENCE  := c_visit_rec.visit_number || '-' || get_prj_route_dtls_rec.visit_task_number || '-1';  -- Parent is the rollup task added above
2883                 -- Store the ref in the associative array
2884                 -- To make the rollup as the parent always and
2885                 -- to keep route tasks to always be leaf tasks even if something is added underneath
2886                 -- If the non-summary task has a child, it is actually the child of the rollup and not the child of the route
2887                 l_id_ref_map_Tbl(get_prj_route_dtls_rec.visit_task_id) := c_visit_rec.visit_number || '-' || get_prj_route_dtls_rec.visit_task_number || '-1';
2888               ELSE
2889                 -- Summary Task
2890                 l_task_in(i).PM_TASK_REFERENCE         := c_visit_rec.visit_number || '-' || get_prj_route_dtls_rec.visit_task_number;
2891                 l_task_in(i).TASK_NAME                 := SUBSTRB(get_prj_route_dtls_rec.task_name,1,15);
2892                 l_task_in(i).LONG_TASK_NAME            := get_prj_route_dtls_rec.task_name;
2893                 l_task_in(i).PA_TASK_NUMBER            := c_visit_rec.visit_number || '-' || get_prj_route_dtls_rec.visit_task_number;
2894                 l_task_in(i).TASK_DESCRIPTION          := SUBSTRB(get_prj_route_dtls_rec.description,1,250);
2895                 l_task_in(i).TASK_START_DATE           := trunc(c_visit_rec.start_date_time);--Pass visit start date to avoid error from Projects
2896                 l_task_in(i).TASK_COMPLETION_DATE      := null;
2897                 l_task_in(i).SERVICE_TYPE_CODE         := get_prj_route_dtls_rec.service_type_code;
2898                 -- Store the value of the cost parent id temporarily
2899                 -- which will be reset or overwritten later with the task number corresponding to this cost parent
2900                 IF (get_prj_route_dtls_rec.cost_parent_id IS NOT NULL) THEN
2901                   l_task_in(i).PM_PARENT_TASK_REFERENCE  := '-' || get_prj_route_dtls_rec.cost_parent_id;
2902                 ELSE
2903                   -- Add this under the top task
2904                   l_task_in(i).PM_PARENT_TASK_REFERENCE  := l_project_num_prefix || to_char(c_visit_rec.visit_number);
2905                 END IF;
2906                 -- Store the ref in the associative array
2907                 l_id_ref_map_Tbl(get_prj_route_dtls_rec.visit_task_id) := c_visit_rec.visit_number || '-' || get_prj_route_dtls_rec.visit_task_number;
2908 
2909                 --PRAKKUM :: 11/06/2012 :: Bug 14068468
2910                 -- IF repair batch name exists, then visit is considered as component visit, visit task that referencing as repair batch summary task
2911                 -- So create a child dummy task to hold transactions
2912                 IF (l_log_statement >= l_log_current_level) THEN
2913                   fnd_log.string(l_log_statement,L_DEBUG_KEY,'get_prj_route_dtls_rec.repair_batch_name--@>'||get_prj_route_dtls_rec.repair_batch_name);
2914                 END IF;
2915                 IF l_is_comp_visit = 'Y' AND get_prj_route_dtls_rec.repair_batch_name IS NOT NULL AND NVL(l_is_vst_hav_trx_on_rep_btch,'N') = 'N' THEN
2916                    i := i + 1;
2917                    l_task_in(i).PM_TASK_REFERENCE         := c_visit_rec.visit_number || '-' || get_prj_route_dtls_rec.visit_task_number || '-' || G_TRANS_TSK_TRAIL_NAME;
2918                    l_task_in(i).TASK_NAME                 := SUBSTRB(get_prj_route_dtls_rec.task_name,1,15)|| '-' || G_TRANS_TSK_TRAIL_NAME;
2919                    l_task_in(i).LONG_TASK_NAME            := get_prj_route_dtls_rec.task_name|| '-' || G_TRANS_TSK_TRAIL_NAME;
2920                    l_task_in(i).PA_TASK_NUMBER            := c_visit_rec.visit_number || '-' || get_prj_route_dtls_rec.visit_task_number|| '-' || G_TRANS_TSK_TRAIL_NAME;
2921                    l_task_in(i).TASK_START_DATE           := trunc(get_prj_route_dtls_rec.task_start_date);
2922                    l_task_in(i).TASK_COMPLETION_DATE      := null;
2923                    l_task_in(i).SERVICE_TYPE_CODE         := get_prj_route_dtls_rec.service_type_code;
2924                    l_task_in(i).PM_PARENT_TASK_REFERENCE  := c_visit_rec.visit_number || '-' || get_prj_route_dtls_rec.visit_task_number;  -- Parent is the rollup task added above
2925 
2926                    -- For the rollup task, get the Project Task Id from the Task Number in case the project task is already created
2927                    OPEN get_task_id_parent_ref_csr(c_project_id => c_visit_rec.PROJECT_ID, c_task_number => l_task_in(i).PA_TASK_NUMBER);
2928                    FETCH get_task_id_parent_ref_csr INTO l_task_in(i).PA_TASK_ID, l_task_in(i).PM_PARENT_TASK_REFERENCE;
2929                    CLOSE get_task_id_parent_ref_csr;
2930 
2931                    IF (l_task_in(i).PA_TASK_ID IS NOT NULL AND l_task_in(i).PA_TASK_ID <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM) THEN
2932                      OPEN get_task_disp_seq_csr(c_project_task_id => l_task_in(i).PA_TASK_ID);
2933                      FETCH get_task_disp_seq_csr INTO l_task_in(i).DISPLAY_SEQUENCE;
2934                      CLOSE get_task_disp_seq_csr;
2935                    END IF;
2936 
2937                    IF (l_log_statement >= l_log_current_level) THEN
2938                      fnd_log.string(l_log_statement,L_DEBUG_KEY,'repair batch child task id--@>'||l_task_in(i).PA_TASK_ID);
2939                      fnd_log.string(l_log_statement,L_DEBUG_KEY,'repair batch child task name--@>'||l_task_in(i).PM_PARENT_TASK_REFERENCE);
2940                      fnd_log.string(l_log_statement,L_DEBUG_KEY,'repair batch child DISPLAY_SEQUENCE--@>'||l_task_in(i).DISPLAY_SEQUENCE);
2941                    END IF;
2942 
2943                 END IF;
2944 
2945               END IF;
2946 
2947               IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
2948                 fnd_log.string(fnd_log.level_statement, L_DEBUG_KEY, 'Visit Task index: ' || i || ', Name = ' || l_task_in(i).TASK_NAME);
2949               END IF;
2950               i := i + 1;
2951             END LOOP;  -- All tasks
2952             CLOSE get_prj_route_dtls_cur;
2953 
2954             -- Setup the parent task for summary and rollup tasks
2955             IF l_task_in.COUNT > 0 THEN
2956               i := l_task_in.FIRST;
2957               LOOP
2958                 IF (l_task_in(i).pm_parent_task_reference IS NOT NULL AND (SUBSTR(l_task_in(i).pm_parent_task_reference, 1, 1) = '-')) THEN
2959                   -- Has a parent whose index is not known: Lookup the index in the associative array
2960                   l_task_in(i).pm_parent_task_reference := l_id_ref_map_Tbl(TO_NUMBER(SUBSTR(l_task_in(i).pm_parent_task_reference, 2)));
2961                 END IF;
2962                 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
2963                   fnd_log.string(fnd_log.level_statement, L_DEBUG_KEY, 'Index i = '|| i || ', PA_TASK_NUMBER = ' || l_task_in(i).PA_TASK_NUMBER ||
2964                                                                    ', PM_PARENT_TASK_REFERENCE = ' || l_task_in(i).pm_parent_task_reference);
2965                   fnd_log.string(fnd_log.level_statement,L_DEBUG_KEY,'PM_TASK_REFERENCE: '|| l_task_in(i).PM_TASK_REFERENCE);
2966                   fnd_log.string(fnd_log.level_statement,L_DEBUG_KEY,'TASK_NAME: '|| l_task_in(i).TASK_NAME);
2967                   fnd_log.string(fnd_log.level_statement,L_DEBUG_KEY,'TASK_DESCRIPTION: '|| l_task_in(i).TASK_DESCRIPTION);
2968                   fnd_log.string(fnd_log.level_statement,L_DEBUG_KEY,'TASK_START_DATE: '|| l_task_in(i).TASK_START_DATE);
2969                   fnd_log.string(fnd_log.level_statement,L_DEBUG_KEY,'TASK_COMPLETION_DATE: '|| l_task_in(i).TASK_COMPLETION_DATE);
2970                   fnd_log.string(fnd_log.level_statement,L_DEBUG_KEY,'PA_TASK_ID: '|| l_task_in(i).PA_TASK_ID);
2971                 END IF;
2972                 EXIT WHEN i = l_task_in.LAST ;
2973                 i := l_task_in.NEXT(i);
2974               END LOOP;  -- All Tasks
2975             END IF;  -- l_task_in.COUNT > 0
2976           END IF;  -- l_count > 0
2977 
2978           -- Check if using Shared Workplan Structure: If so need to pass all existing tasks
2979           -- (will be only for other visits - the current visit is being pushed into production now only)
2980           -- through l_task_in
2981           IF (l_is_wp_separate_from_fn = 'N') THEN
2982             -- Workplan is enabled, Using Shared Structure
2983             -- In order to avoid the error with updating projects with Work Plan Structure enabled,
2984             -- just pass the task reference and the parent task reference for all existing tasks even if there is no change
2985             OPEN get_project_tasks_csr(c_project_id => c_visit_rec.PROJECT_ID);
2986             -- PRAKKUM :: 08-JAN-2013 :: FPBug 16481709 for BaseBug 14828418 : In reference of bug 9047048 :: START
2987             -- Changed code to resolve error that being thrown if non-cmro project tasks have hierarchy
2988             --FETCH get_project_tasks_csr BULK COLLECT INTO l_task_ref_tbl, l_parent_task_ref_tbl,l_task_id_tbl; -- PRAKKUM :: 24-NOV-2010 :: Bug 9370120 :: FP:12.0-12.2 :: Fetch project task id as well, and populate l_task_in with it
2989             FETCH get_project_tasks_csr BULK COLLECT INTO l_task_ref_tbl, l_parent_task_ref_tbl, l_task_id_tbl, l_parent_task_id_tbl, l_tasks_disp_seq_tbl;
2990             CLOSE get_project_tasks_csr;
2991             IF l_task_id_tbl.count > 0 THEN
2992               L_CURR_TASK_COUNT := l_task_in.COUNT;
2993               FOR k IN l_task_id_tbl.FIRST..l_task_id_tbl.LAST LOOP
2994                   IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2995                       FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY,
2996                       'k = ' || k ||
2997                       ', PM_TASK_REFERENCE = ' || l_task_ref_tbl(k) ||
2998                       ', PM_PARENT_TASK_REFERENCE = ' || l_parent_task_ref_tbl(k)||
2999                       ', PA_TASK_ID = ' || l_task_id_tbl(k) ||
3000                       ', PARENT_PA_TASK_ID = ' || l_parent_task_id_tbl(k) ||
3001                       ', DISPLAY_SEQUENCE = ' || l_tasks_disp_seq_tbl(k));
3002                   END IF;
3003                   l_task_in(k + L_CURR_TASK_COUNT).PA_TASK_ID               := l_task_id_tbl(k);
3004                   IF l_task_ref_tbl(k) IS NOT NULL THEN --Project tasks created from Projects UI, wont have task_reference
3005                      l_task_in(k + L_CURR_TASK_COUNT).PM_TASK_REFERENCE        := l_task_ref_tbl(k);
3006                      l_task_in(k + L_CURR_TASK_COUNT).PM_PARENT_TASK_REFERENCE := l_parent_task_ref_tbl(k);
3007                   ELSE -- Only project tasks created from Projects UI will come to this block
3008                      l_task_in(k + L_CURR_TASK_COUNT).PA_PARENT_TASK_ID        := l_parent_task_id_tbl(k);
3009                   END IF;
3010                   l_task_in(k + L_CURR_TASK_COUNT).DISPLAY_SEQUENCE         := l_tasks_disp_seq_tbl(k);
3011               END LOOP;
3012             END IF;  -- l_task_id_tbl.count > 0
3013             -- PRAKKUM :: 08-JAN-2013 :: FPBug 16481709 for BaseBug 14828418 : In reference of bug 9047048 :: END
3014           END IF;  -- l_is_wp_separate_from_fn = N
3015 
3016           -- PRAKKUM :: 08-JAN-2013 :: FPBug 16481709 for BaseBug 14828418 : In reference of bug 9047048
3017           Sort_Task_Table(l_task_in);
3018 
3019         ELSIF (l_new_structure_flag='Y')  THEN
3020           --If the visit was created using project name, and either it has already been pushed to production
3021           --or cost has been estimated for it
3022           IF ((c_visit_rec.PROJECT_ID IS NOT NULL) AND
3023               (c_visit_rec.TOP_PROJECT_TASK_ID IS NOT NULL)) THEN
3024             -- TYPE 2: Visit was created using project name, Top Task already exists for visit
3025             IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
3026               fnd_log.string(fnd_log.level_statement, L_DEBUG_KEY, 'TYPE 2');
3027             END IF;
3028             l_Project_rec.PA_PROJECT_ID := c_visit_rec.PROJECT_ID;  -- Update the Parent Project
3029             -- Update the Top Task
3030             l_task_in(1).TASK_START_DATE          := trunc(c_visit_rec.start_date_time);
3031             l_task_in(1).TASK_COMPLETION_DATE     := trunc(c_visit_rec.close_date_time);
3032             l_task_in(1).PA_TASK_ID               := c_visit_rec.TOP_PROJECT_TASK_ID;
3033 
3034             l_task_in(1).PM_TASK_REFERENCE        := l_project_num_prefix || to_char(c_visit_rec.visit_number);
3035             l_task_in(1).PM_PARENT_TASK_REFERENCE := null;
3036             OPEN get_task_disp_seq_csr(c_project_task_id => c_visit_rec.TOP_PROJECT_TASK_ID);
3037             FETCH get_task_disp_seq_csr INTO l_task_in(1).DISPLAY_SEQUENCE;
3038             CLOSE get_task_disp_seq_csr;
3039 
3040             OPEN c_task_ct(p_visit_id);
3041             FETCH c_task_ct INTO l_count;
3042             CLOSE c_task_ct;
3043 
3044             IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
3045               fnd_log.string(fnd_log.level_statement, L_DEBUG_KEY, 'Number of tasks = ' || l_count);
3046             END IF;
3047 
3048             IF l_count > 0 THEN
3049               OPEN get_prj_route_dtls_cur(p_visit_id);
3050               i := 2;  -- Top Task index is 1
3051               LOOP
3052                 FETCH get_prj_route_dtls_cur INTO get_prj_route_dtls_rec;
3053                 EXIT WHEN get_prj_route_dtls_cur%NOTFOUND;
3054                 IF c_visit_rec.start_date_time > get_prj_route_dtls_rec.task_start_date THEN
3055                   get_prj_route_dtls_rec.task_start_date := c_visit_rec.start_date_time;
3056                 END IF;
3057 
3058                 IF get_prj_route_dtls_rec.task_type_code <> 'SUMMARY' THEN
3059                   -- Not a Summary task: First create a rollup task
3060                   l_task_in(i).PM_TASK_REFERENCE         := c_visit_rec.visit_number || '-' || get_prj_route_dtls_rec.visit_task_number || '-1';
3061                   l_task_in(i).TASK_NAME                 := SUBSTRB(get_prj_route_dtls_rec.task_name,1,15) || '-1';
3062                   l_task_in(i).LONG_TASK_NAME            := get_prj_route_dtls_rec.task_name || '-1';
3063                   l_task_in(i).PA_TASK_NUMBER            := c_visit_rec.visit_number || '-' || get_prj_route_dtls_rec.visit_task_number || '-1';
3064                   l_task_in(i).TASK_START_DATE           := trunc(c_visit_rec.start_date_time); -- Pass visit date for Rollup tasks
3065                   l_task_in(i).TASK_COMPLETION_DATE      := null;
3066                   -- For the rollup task, get the Project Task Id from the Task Number in case the project task is already created
3067                   OPEN get_task_id_parent_ref_csr(c_project_id => c_visit_rec.PROJECT_ID, c_task_number => l_task_in(i).PA_TASK_NUMBER);
3068                   FETCH get_task_id_parent_ref_csr INTO l_task_in(i).PA_TASK_ID, l_task_in(i).PM_PARENT_TASK_REFERENCE;
3069                   CLOSE get_task_id_parent_ref_csr;
3070                   IF l_task_in(i).PA_TASK_ID IS NOT NULL THEN
3071                     OPEN get_task_disp_seq_csr(c_project_task_id => l_task_in(i).PA_TASK_ID);
3072                     FETCH get_task_disp_seq_csr INTO l_task_in(i).DISPLAY_SEQUENCE;
3073                     CLOSE get_task_disp_seq_csr;
3074                   END IF;
3075 
3076                   -- Store the value of the cost parent id temporarily
3077                   -- which will be reset or overwritten later with the task number corresponding to this cost parent
3078                   IF l_task_in(i).PA_TASK_ID = PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM THEN  --i.e. above cursor did not fetch anything
3079                     IF (get_prj_route_dtls_rec.cost_parent_id IS NOT NULL) THEN
3080                       l_task_in(i).PM_PARENT_TASK_REFERENCE  := '-' || get_prj_route_dtls_rec.cost_parent_id;
3081                     ELSE
3082                       -- Add this under the top task
3083                       l_task_in(i).PM_PARENT_TASK_REFERENCE  := l_project_num_prefix ||   to_char(c_visit_rec.visit_number);
3084                     END IF;
3085                   END IF;
3086 
3087                   -- Then add the non-summary task under the rollup task
3088                   i := i + 1;
3089                   l_task_in(i).PM_TASK_REFERENCE         := c_visit_rec.visit_number || '-' || get_prj_route_dtls_rec.visit_task_number;
3090                   l_task_in(i).TASK_NAME                 := SUBSTRB(get_prj_route_dtls_rec.task_name,1,15);
3091                   l_task_in(i).LONG_TASK_NAME            := get_prj_route_dtls_rec.task_name;
3092                   l_task_in(i).PA_TASK_NUMBER            := c_visit_rec.visit_number || '-' ||   get_prj_route_dtls_rec.visit_task_number;
3093                   l_task_in(i).TASK_DESCRIPTION          := SUBSTRB(get_prj_route_dtls_rec.description,1,250);
3094                   l_task_in(i).TASK_START_DATE           := trunc(get_prj_route_dtls_rec.task_start_date);
3095                   l_task_in(i).TASK_COMPLETION_DATE      := null;
3096                   l_task_in(i).SERVICE_TYPE_CODE         := get_prj_route_dtls_rec.service_type_code;
3097                   IF get_prj_route_dtls_rec.PROJECT_TASK_ID IS NOT NULL THEN
3098                     l_task_in(i).PA_TASK_ID              := get_prj_route_dtls_rec.PROJECT_TASK_ID;
3099                     l_task_in(i).DISPLAY_SEQUENCE        := get_prj_route_dtls_rec.DISPLAY_SEQUENCE;
3100                   END IF;
3101                   l_task_in(i).PM_PARENT_TASK_REFERENCE  := c_visit_rec.visit_number || '-' || get_prj_route_dtls_rec.visit_task_number || '-1';  -- Parent is the rollup task added above
3102 
3103                   -- To make the rollup as the parent always and
3104                   -- to keep route tasks to always be leaf tasks even if something is added underneath
3105                   -- If the non-summary task has a child, it is actually the child of the rollup and not the child of the route
3106                   l_id_ref_map_Tbl(get_prj_route_dtls_rec.visit_task_id) := c_visit_rec.visit_number || '-' || get_prj_route_dtls_rec.visit_task_number || '-1';
3107                 ELSE
3108                   -- Summary Task
3109                   l_task_in(i).PM_TASK_REFERENCE         := c_visit_rec.visit_number || '-' || get_prj_route_dtls_rec.visit_task_number;
3110                   l_task_in(i).TASK_NAME                 := SUBSTRB(get_prj_route_dtls_rec.task_name,1,15);
3111                   l_task_in(i).LONG_TASK_NAME            := get_prj_route_dtls_rec.task_name;
3112                   l_task_in(i).PA_TASK_NUMBER            := c_visit_rec.visit_number || '-' ||   get_prj_route_dtls_rec.visit_task_number;
3113                   l_task_in(i).TASK_DESCRIPTION          := SUBSTRB(get_prj_route_dtls_rec.description,1,250);
3114                   l_task_in(i).TASK_START_DATE           := trunc(c_visit_rec.start_date_time); --Pass visit start date to avoid error from Projects
3115                   l_task_in(i).TASK_COMPLETION_DATE      := null;
3116                   l_task_in(i).SERVICE_TYPE_CODE         := get_prj_route_dtls_rec.service_type_code;
3117                   IF get_prj_route_dtls_rec.PROJECT_TASK_ID IS NOT NULL THEN
3118                     l_task_in(i).PA_TASK_ID              := get_prj_route_dtls_rec.PROJECT_TASK_ID;
3119                     l_task_in(i).DISPLAY_SEQUENCE        := get_prj_route_dtls_rec.DISPLAY_SEQUENCE;
3120                   END IF;
3121                     -- Store the value of the cost parent id temporarily
3122                     -- which will be reset or overwritten later with the task number corresponding to this cost parent
3123                     IF (get_prj_route_dtls_rec.cost_parent_id IS NOT NULL) THEN
3124                       l_task_in(i).PM_PARENT_TASK_REFERENCE  := '-' || get_prj_route_dtls_rec.cost_parent_id;
3125                     ELSE
3126                       -- Add this under the top task
3127                       l_task_in(i).PM_PARENT_TASK_REFERENCE  := l_project_num_prefix || to_char(c_visit_rec.visit_number);
3128 
3129                     END IF;
3130                   -- Store the ref in the associative array
3131                   l_id_ref_map_Tbl(get_prj_route_dtls_rec.visit_task_id) := c_visit_rec.visit_number || '-' || get_prj_route_dtls_rec.visit_task_number;
3132 
3133                   --PRAKKUM :: 11/06/2012 :: Bug 14068468
3134                   -- IF repair batch name exists, then visit is considered as component visit, visit task that referencing as repair batch summary task
3135                   -- So create a child dummy task to hold transactions
3136                   IF (l_log_statement >= l_log_current_level) THEN
3137                     fnd_log.string(l_log_statement,L_DEBUG_KEY,'get_prj_route_dtls_rec.repair_batch_name--@>'||get_prj_route_dtls_rec.repair_batch_name);
3138                   END IF;
3139                   IF l_is_comp_visit = 'Y' AND get_prj_route_dtls_rec.repair_batch_name IS NOT NULL AND NVL(l_is_vst_hav_trx_on_rep_btch,'N') = 'N'  THEN
3140                      i := i + 1;
3141                      l_task_in(i).PM_TASK_REFERENCE         := c_visit_rec.visit_number || '-' || get_prj_route_dtls_rec.visit_task_number || '-' || G_TRANS_TSK_TRAIL_NAME;
3142                      l_task_in(i).TASK_NAME                 := SUBSTRB(get_prj_route_dtls_rec.task_name,1,15)|| '-' || G_TRANS_TSK_TRAIL_NAME;
3143                      l_task_in(i).LONG_TASK_NAME            := get_prj_route_dtls_rec.task_name|| '-' || G_TRANS_TSK_TRAIL_NAME;
3144                      l_task_in(i).PA_TASK_NUMBER            := c_visit_rec.visit_number || '-' || get_prj_route_dtls_rec.visit_task_number|| '-' || G_TRANS_TSK_TRAIL_NAME;
3145                      l_task_in(i).TASK_START_DATE           := trunc(get_prj_route_dtls_rec.task_start_date);
3146                      l_task_in(i).TASK_COMPLETION_DATE      := null;
3147                      l_task_in(i).SERVICE_TYPE_CODE         := get_prj_route_dtls_rec.service_type_code;
3148                      l_task_in(i).PM_PARENT_TASK_REFERENCE  := c_visit_rec.visit_number || '-' || get_prj_route_dtls_rec.visit_task_number;  -- Parent is the rollup task added above
3149 
3150                      -- For the rollup task, get the Project Task Id from the Task Number in case the project task is already created
3151                      OPEN get_task_id_parent_ref_csr(c_project_id => c_visit_rec.PROJECT_ID, c_task_number => l_task_in(i).PA_TASK_NUMBER);
3152                      FETCH get_task_id_parent_ref_csr INTO l_task_in(i).PA_TASK_ID, l_task_in(i).PM_PARENT_TASK_REFERENCE;
3153                      CLOSE get_task_id_parent_ref_csr;
3154 
3155                      IF (l_task_in(i).PA_TASK_ID IS NOT NULL AND l_task_in(i).PA_TASK_ID <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM) THEN
3156                        OPEN get_task_disp_seq_csr(c_project_task_id => l_task_in(i).PA_TASK_ID);
3157                        FETCH get_task_disp_seq_csr INTO l_task_in(i).DISPLAY_SEQUENCE;
3158                        CLOSE get_task_disp_seq_csr;
3159                      END IF;
3160 
3161                      IF (l_log_statement >= l_log_current_level) THEN
3162                        fnd_log.string(l_log_statement,L_DEBUG_KEY,'repair batch child task id--@>'||l_task_in(i).PA_TASK_ID);
3163                        fnd_log.string(l_log_statement,L_DEBUG_KEY,'repair batch child task name--@>'||l_task_in(i).PM_PARENT_TASK_REFERENCE);
3164                        fnd_log.string(l_log_statement,L_DEBUG_KEY,'repair batch child DISPLAY_SEQUENCE--@>'||l_task_in(i).DISPLAY_SEQUENCE);
3165                      END IF;
3166                    END IF;
3167 
3168                 END IF;
3169 
3170                 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
3171                   fnd_log.string(fnd_log.level_statement, L_DEBUG_KEY, 'Visit Task index: ' || i || ', Name = ' || l_task_in(i).TASK_NAME);
3172                 END IF;
3173                 i := i + 1;
3174               END LOOP;  -- All tasks
3175               CLOSE get_prj_route_dtls_cur;
3176 
3177               -- Setup the parent task for summary and rollup tasks
3178               IF l_task_in.COUNT > 0 THEN
3179                 i := l_task_in.FIRST;
3180                 LOOP
3181                   IF (l_task_in(i).pm_parent_task_reference IS NOT NULL AND (SUBSTR(l_task_in(i).pm_parent_task_reference, 1, 1) = '-')) THEN
3182                   -- Has a parent whose index is not known: Lookup the index in the associative array
3183                     l_task_in(i).pm_parent_task_reference := l_id_ref_map_Tbl(TO_NUMBER(SUBSTR(l_task_in(i).pm_parent_task_reference, 2)));
3184                   END IF;
3185                   IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
3186                     fnd_log.string(fnd_log.level_statement, L_DEBUG_KEY, 'Index i = '|| i || ', PA_TASK_NUMBER = ' || l_task_in(i).PA_TASK_NUMBER ||
3187                                                                    ', PM_PARENT_TASK_REFERENCE = ' || l_task_in(i).pm_parent_task_reference);
3188                     fnd_log.string(fnd_log.level_statement,L_DEBUG_KEY,'PM_TASK_REFERENCE: '|| l_task_in(i).PM_TASK_REFERENCE);
3189                     fnd_log.string(fnd_log.level_statement,L_DEBUG_KEY,'TASK_NAME: '|| l_task_in(i).TASK_NAME);
3190                     fnd_log.string(fnd_log.level_statement,L_DEBUG_KEY,'TASK_DESCRIPTION: '|| l_task_in(i).TASK_DESCRIPTION);
3191                     fnd_log.string(fnd_log.level_statement,L_DEBUG_KEY,'TASK_START_DATE: '|| l_task_in(i).TASK_START_DATE);
3192                     fnd_log.string(fnd_log.level_statement,L_DEBUG_KEY,'TASK_COMPLETION_DATE: '|| l_task_in(i).TASK_COMPLETION_DATE);
3193                     fnd_log.string(fnd_log.level_statement,L_DEBUG_KEY,'PA_TASK_ID: '|| l_task_in(i).PA_TASK_ID);
3194                   END IF;
3195                   EXIT WHEN i = l_task_in.LAST ;
3196                   i := l_task_in.NEXT(i);
3197                 END LOOP;  -- All Tasks
3198               END IF;  -- l_task_in.COUNT > 0
3199             END IF;  -- l_count > 0
3200 
3201             -- Check if using Shared Workplan Structure: If so need to pass all tasks of all OTHER visits
3202             -- also through l_task_in.
3203             -- Note that this is a shared project and l_task_in contains tasks for current visit only so far.
3204             IF (l_is_wp_separate_from_fn = 'N') THEN
3205               -- Workplan is enabled, Using Shared Structure
3206               -- In order to avoid the error with updating projects with Work Plan Structure enabled,
3207               -- just pass the task reference and the parent task reference for all existing tasks
3208               -- of all other visits even if there is no change
3209               OPEN get_other_vst_prj_tsks_csr(c_project_id => c_visit_rec.PROJECT_ID,
3210                                               c_top_task_id => c_visit_rec.TOP_PROJECT_TASK_ID);
3211               -- PRAKKUM :: 08-JAN-2013 :: FPBug 16481709 for BaseBug 14828418 : In reference of bug 9047048 :: START
3212               FETCH get_other_vst_prj_tsks_csr BULK COLLECT INTO l_task_ref_tbl, l_parent_task_ref_tbl, l_task_id_tbl, l_parent_task_id_tbl, l_tasks_disp_seq_tbl;
3213               CLOSE get_other_vst_prj_tsks_csr;
3214               IF l_task_id_tbl.count > 0 THEN
3215                 --L_CURR_TASK_COUNT := l_task_in.COUNT;
3216                 FOR k IN l_task_id_tbl.FIRST..l_task_id_tbl.LAST LOOP
3217                     IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3218                         FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY,
3219                         'k = ' || k ||
3220                         ', PM_TASK_REFERENCE = ' || l_task_ref_tbl(k) ||
3221                         ', PM_PARENT_TASK_REFERENCE = ' || l_parent_task_ref_tbl(k)||
3222                         ', PA_TASK_ID = ' || l_task_id_tbl(k) ||
3223                         ', PARENT_PA_TASK_ID = ' || l_parent_task_id_tbl(k) ||
3224                         ', DISPLAY_SEQUENCE = ' || l_tasks_disp_seq_tbl(k));
3225                     END IF;
3226                     l_op_task_in(k).PA_TASK_ID               := l_task_id_tbl(k);
3227                     IF l_task_ref_tbl(k) IS NOT NULL THEN --Project tasks created from Projects UI, wont have task_reference
3228                        l_op_task_in(k).PM_TASK_REFERENCE        := l_task_ref_tbl(k);
3229                        l_op_task_in(k).PM_PARENT_TASK_REFERENCE := l_parent_task_ref_tbl(k);
3230                     ELSE -- Only project tasks created from Projects UI will come to this block
3231                        l_op_task_in(k).PA_PARENT_TASK_ID        := l_parent_task_id_tbl(k);
3232                     END IF;
3233                     l_op_task_in(k).DISPLAY_SEQUENCE         := l_tasks_disp_seq_tbl(k);
3234                 END LOOP;
3235               END IF;  -- l_task_id_tbl.count > 0
3236               -- PRAKKUM :: 08-JAN-2013 :: FPBug 16481709 for BaseBug 14828418 : In reference of bug 9047048 :: END
3237             END IF;  -- l_is_wp_separate_from_fn = N
3238 
3239             -- Added by jaramana on 06-OCT-2009 for the WBS ER 8674208
3240             Sort_Task_Table(l_op_task_in);
3241 
3242             IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
3243                 fnd_log.string(fnd_log.level_statement, L_DEBUG_KEY, 'l_task_in.COUNT --@>'||l_task_in.COUNT);
3244                 fnd_log.string(fnd_log.level_statement, L_DEBUG_KEY, 'l_op_task_in.COUNT --@>'||l_op_task_in.COUNT);
3245             END IF;
3246 
3247             -- PRAKKUM :: FPBug 16481709 for BaseBug 14828418 :: 31/01/2013
3248             -- Added code to pass all project tasks belonging to visit together
3249             -- So visit which updated latest will be last in display sequence
3250             IF (l_is_wp_separate_from_fn = 'N') THEN
3251                 IF l_task_in.COUNT>0 THEN
3252                     --Merge Tables
3253                     L_CURR_TASK_COUNT := l_op_task_in.COUNT;
3254                     FOR k IN l_task_in.FIRST..l_task_in.LAST LOOP
3255                         l_op_task_in(k+L_CURR_TASK_COUNT) := l_task_in(k);
3256                     END LOOP;
3257                     l_task_in := l_op_task_in;
3258                 END IF;
3259              END IF; -- l_is_wp_separate_from_fn
3260 
3261           --Else if the visit was created using project template and obviously since it is in update project
3262           --API, so either the cost has already been estimated or the visit has been pushed to production
3263           ELSIF(c_visit_rec.PROJECT_ID IS NOT NULL AND
3264                 c_visit_rec.TOP_PROJECT_TASK_ID IS NULL AND
3265                 c_visit_rec.PROJECT_TEMPLATE_ID IS NOT NULL) THEN
3266             -- TYPE 3: Visit with Project created using a template
3267             IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
3268               fnd_log.string(fnd_log.level_statement, L_DEBUG_KEY, 'TYPE 3');
3269             END IF;
3270             -- Update the Project
3271             l_Project_rec.DESCRIPTION               := SUBSTRB(c_visit_rec.description,1,250);
3272             l_Project_rec.START_DATE                := trunc(c_visit_rec.start_date_time);
3273             l_Project_rec.COMPLETION_DATE           := null;
3274             l_Project_rec.SCHEDULED_START_DATE      := trunc(c_visit_rec.start_date_time);
3275             l_Project_rec.PA_PROJECT_ID             := c_visit_rec.PROJECT_ID;
3276             IF c_visit_rec.status_code = 'CLOSED' OR c_visit_rec.status_code = 'CANCELLED' THEN
3277               l_Project_rec.PROJECT_STATUS_CODE := 'CLOSED';
3278             ELSIF p_module_type = 'UPT' OR p_module_type = 'DEL' THEN
3279               l_Project_rec.PROJECT_STATUS_CODE := 'REJECTED';
3280             ELSE
3281               l_Project_rec.PROJECT_STATUS_CODE := l_prj_status_code_fdb;
3282             END IF;
3283 
3284             IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
3285               fnd_log.string(fnd_log.level_statement,L_DEBUG_KEY,'After assigning all values to project record type');
3286             END IF;
3287 
3288 
3289             OPEN c_task_ct(p_visit_id);
3290             FETCH c_task_ct INTO l_count;
3291             CLOSE c_task_ct;
3292 
3293             IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
3294               fnd_log.string(fnd_log.level_statement, L_DEBUG_KEY, 'Number of tasks = ' || l_count);
3295             END IF;
3296 
3297             IF l_count > 0 THEN
3298               OPEN get_prj_route_dtls_cur(p_visit_id);
3299               i := 1;  -- No Top Task
3300               LOOP
3301                 FETCH get_prj_route_dtls_cur INTO get_prj_route_dtls_rec;
3302                 EXIT WHEN get_prj_route_dtls_cur%NOTFOUND;
3303                 IF c_visit_rec.start_date_time > get_prj_route_dtls_rec.task_start_date THEN
3304                   get_prj_route_dtls_rec.task_start_date := c_visit_rec.start_date_time;
3305                 END IF;
3306 
3307                 IF get_prj_route_dtls_rec.task_type_code <> 'SUMMARY' THEN
3308                   -- Not a Summary task: First create a rollup task
3309                   l_task_in(i).PM_TASK_REFERENCE         := get_prj_route_dtls_rec.visit_task_number || '-1';
3310                   l_task_in(i).TASK_NAME                 := SUBSTRB(get_prj_route_dtls_rec.task_name,1,15) || '-1';
3311                   l_task_in(i).LONG_TASK_NAME            := get_prj_route_dtls_rec.task_name || '-1';
3312                   l_task_in(i).PA_TASK_NUMBER            := get_prj_route_dtls_rec.visit_task_number || '-1';
3313                   l_task_in(i).TASK_START_DATE           := trunc(c_visit_rec.start_date_time); -- Pass visit date for Rollup tasks
3314                   l_task_in(i).TASK_COMPLETION_DATE      := null;--trunc(c_visit_rec.close_date_time); -- Pass visit date for Rollup tasks
3315                   -- For the rollup task, get the Project Task Id from the Task Number in case the project task is already created
3316                   OPEN get_task_id_parent_ref_csr(c_project_id => c_visit_rec.PROJECT_ID, c_task_number => l_task_in(i).PA_TASK_NUMBER);
3317                   FETCH get_task_id_parent_ref_csr INTO l_task_in(i).PA_TASK_ID, l_task_in(i).PM_PARENT_TASK_REFERENCE;
3318                   CLOSE get_task_id_parent_ref_csr;
3319 
3320                   IF (l_task_in(i).PA_TASK_ID IS NOT NULL AND l_task_in(i).PA_TASK_ID <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM) THEN
3321                     OPEN get_task_disp_seq_csr(c_project_task_id => l_task_in(i).PA_TASK_ID);
3322                     FETCH get_task_disp_seq_csr INTO l_task_in(i).DISPLAY_SEQUENCE;
3323                     CLOSE get_task_disp_seq_csr;
3324                   END IF;
3325 
3326                   -- Store the value of the cost parent id temporarily
3327                   -- which will be reset or overwritten later with the task number corresponding to this cost parent
3328                   IF l_task_in(i).PA_TASK_ID = PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM THEN  --i.e. above cursor did not fetch anything
3329                     IF (get_prj_route_dtls_rec.cost_parent_id IS NOT NULL) THEN
3330                       l_task_in(i).PM_PARENT_TASK_REFERENCE  := '-' || get_prj_route_dtls_rec.cost_parent_id;
3331                     ELSE
3332                       l_task_in(i).PM_PARENT_TASK_REFERENCE  := null;
3333                     END IF;
3334                   END IF;
3335                   -- Then add the non-summary task under the rollup task
3336                   i := i + 1;
3337                   l_task_in(i).PM_TASK_REFERENCE         := get_prj_route_dtls_rec.visit_task_number;
3338                   l_task_in(i).TASK_NAME                 := SUBSTRB(get_prj_route_dtls_rec.task_name,1,15);
3339                   l_task_in(i).LONG_TASK_NAME            := get_prj_route_dtls_rec.task_name;
3340                   l_task_in(i).PA_TASK_NUMBER            := get_prj_route_dtls_rec.visit_task_number;
3341                   l_task_in(i).TASK_DESCRIPTION          := SUBSTRB(get_prj_route_dtls_rec.description,1,250);
3342                   l_task_in(i).TASK_START_DATE           := trunc(get_prj_route_dtls_rec.task_start_date);
3343                   l_task_in(i).TASK_COMPLETION_DATE      := null;
3344                   l_task_in(i).SERVICE_TYPE_CODE         := get_prj_route_dtls_rec.service_type_code;
3345                   IF get_prj_route_dtls_rec.PROJECT_TASK_ID IS NOT NULL THEN
3346                     l_task_in(i).PA_TASK_ID               := get_prj_route_dtls_rec.PROJECT_TASK_ID;
3347                     l_task_in(i).DISPLAY_SEQUENCE         := get_prj_route_dtls_rec.DISPLAY_SEQUENCE;
3348                   END IF;
3349                   l_task_in(i).PM_PARENT_TASK_REFERENCE  := get_prj_route_dtls_rec.visit_task_number || '-1';  -- Parent is the rollup task added above
3350                   -- To make the rollup as the parent always and
3351                   -- to keep route tasks to always be leaf tasks even if something is added underneath
3352                   -- If the non-summary task has a child, it is actually the child of the rollup and not the child of the route
3353                   l_id_ref_map_Tbl(get_prj_route_dtls_rec.visit_task_id) := get_prj_route_dtls_rec.visit_task_number || '-1';
3354                 ELSE
3355                   -- Summary Task
3356                   l_task_in(i).PM_TASK_REFERENCE         := get_prj_route_dtls_rec.visit_task_number;
3357                   l_task_in(i).TASK_NAME                 := SUBSTRB(get_prj_route_dtls_rec.task_name,1,15);
3358                   l_task_in(i).LONG_TASK_NAME            := get_prj_route_dtls_rec.task_name;
3359                   l_task_in(i).PA_TASK_NUMBER            := get_prj_route_dtls_rec.visit_task_number;
3360                   l_task_in(i).TASK_DESCRIPTION          := SUBSTRB(get_prj_route_dtls_rec.description,1,250);
3361                   l_task_in(i).TASK_START_DATE           := trunc(c_visit_rec.start_date_time);--Pass visit start date to avoid error from Projects
3362                   l_task_in(i).TASK_COMPLETION_DATE      := null;
3363                   l_task_in(i).SERVICE_TYPE_CODE         := get_prj_route_dtls_rec.service_type_code;
3364                   IF get_prj_route_dtls_rec.PROJECT_TASK_ID IS NOT NULL THEN
3365                     l_task_in(i).PA_TASK_ID               := get_prj_route_dtls_rec.PROJECT_TASK_ID;
3366                     l_task_in(i).DISPLAY_SEQUENCE         := get_prj_route_dtls_rec.DISPLAY_SEQUENCE;
3367                   END IF;
3368                     -- Store the value of the cost parent id temporarily
3369                     -- which will be reset or overwritten later with the task number corresponding to this cost parent
3370                     IF (get_prj_route_dtls_rec.cost_parent_id IS NOT NULL) THEN
3371                       l_task_in(i).PM_PARENT_TASK_REFERENCE  := '-' || get_prj_route_dtls_rec.cost_parent_id;
3372                     ELSE
3373                       l_task_in(i).PM_PARENT_TASK_REFERENCE  := null;
3374                     END IF;
3375                   -- Store the ref in the associative array
3376                   l_id_ref_map_Tbl(get_prj_route_dtls_rec.visit_task_id) := get_prj_route_dtls_rec.visit_task_number;
3377 
3378                   --PRAKKUM :: 11/06/2012 :: Bug 14068468
3379                   -- IF repair batch name exists, then visit is considered as component visit, visit task that referencing as repair batch summary task
3380                   -- So create a child dummy task to hold transactions
3381                   IF (l_log_statement >= l_log_current_level) THEN
3382                      fnd_log.string(l_log_statement,L_DEBUG_KEY,'get_prj_route_dtls_rec.repair_batch_name--@>'||get_prj_route_dtls_rec.repair_batch_name);
3383                   END IF;
3384                   IF l_is_comp_visit = 'Y' AND get_prj_route_dtls_rec.repair_batch_name IS NOT NULL AND NVL(l_is_vst_hav_trx_on_rep_btch,'N') = 'N' THEN
3385                      i := i + 1;
3386                      l_task_in(i).PM_TASK_REFERENCE         := get_prj_route_dtls_rec.visit_task_number || '-' || G_TRANS_TSK_TRAIL_NAME;
3387                      l_task_in(i).TASK_NAME                 := SUBSTRB(get_prj_route_dtls_rec.task_name,1,15)|| '-' || G_TRANS_TSK_TRAIL_NAME;
3388                      l_task_in(i).LONG_TASK_NAME            := get_prj_route_dtls_rec.task_name|| '-' || G_TRANS_TSK_TRAIL_NAME;
3389                      l_task_in(i).PA_TASK_NUMBER            := get_prj_route_dtls_rec.visit_task_number|| '-' || G_TRANS_TSK_TRAIL_NAME;
3390                      l_task_in(i).TASK_START_DATE           := trunc(get_prj_route_dtls_rec.task_start_date);
3391                      l_task_in(i).TASK_COMPLETION_DATE      := null;
3392                      l_task_in(i).SERVICE_TYPE_CODE         := get_prj_route_dtls_rec.service_type_code;
3393                      l_task_in(i).PM_PARENT_TASK_REFERENCE  := get_prj_route_dtls_rec.visit_task_number;  -- Parent is the rollup task added above
3394 
3395                      -- For the rollup task, get the Project Task Id from the Task Number in case the project task is already created
3396                      OPEN get_task_id_parent_ref_csr(c_project_id => c_visit_rec.PROJECT_ID, c_task_number => l_task_in(i).PA_TASK_NUMBER);
3397                      FETCH get_task_id_parent_ref_csr INTO l_task_in(i).PA_TASK_ID, l_task_in(i).PM_PARENT_TASK_REFERENCE;
3398                      CLOSE get_task_id_parent_ref_csr;
3399 
3400                      IF (l_task_in(i).PA_TASK_ID IS NOT NULL AND l_task_in(i).PA_TASK_ID <> PA_INTERFACE_UTILS_PUB.G_PA_MISS_NUM) THEN
3401                        OPEN get_task_disp_seq_csr(c_project_task_id => l_task_in(i).PA_TASK_ID);
3402                        FETCH get_task_disp_seq_csr INTO l_task_in(i).DISPLAY_SEQUENCE;
3403                        CLOSE get_task_disp_seq_csr;
3404                      END IF;
3405 
3406                      IF (l_log_statement >= l_log_current_level) THEN
3407                        fnd_log.string(l_log_statement,L_DEBUG_KEY,'repair batch child task id--@>'||l_task_in(i).PA_TASK_ID);
3408                        fnd_log.string(l_log_statement,L_DEBUG_KEY,'repair batch child task name--@>'||l_task_in(i).PM_PARENT_TASK_REFERENCE);
3409                        fnd_log.string(l_log_statement,L_DEBUG_KEY,'repair batch child DISPLAY_SEQUENCE--@>'||l_task_in(i).DISPLAY_SEQUENCE);
3410                      END IF;
3411 
3412                   END IF;
3413 
3414                 END IF;
3415 
3416                 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
3417                   fnd_log.string(fnd_log.level_statement, L_DEBUG_KEY, 'Visit Task index: ' || i || ', Name = ' || l_task_in(i).TASK_NAME);
3418                 END IF;
3419                 i := i + 1;
3420               END LOOP;  -- All tasks
3421               CLOSE get_prj_route_dtls_cur;
3422 
3423               -- Setup the parent task for summary and rollup tasks
3424               IF l_task_in.COUNT > 0 THEN
3425                 i := l_task_in.FIRST;
3426                 LOOP
3427                   IF (l_task_in(i).pm_parent_task_reference IS NOT NULL AND (SUBSTR(l_task_in(i).pm_parent_task_reference, 1, 1) = '-')) THEN
3428                     -- Has a parent whose index is not known: Lookup the index in the associative array
3429                       l_task_in(i).pm_parent_task_reference := l_id_ref_map_Tbl(TO_NUMBER(SUBSTR(l_task_in(i).pm_parent_task_reference, 2)));
3430                   END IF;
3431                   IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
3432                     fnd_log.string(fnd_log.level_statement, L_DEBUG_KEY, 'Index i = '|| i || ', PA_TASK_NUMBER = ' || l_task_in(i).PA_TASK_NUMBER ||
3433                                                                      ', PM_PARENT_TASK_REFERENCE = ' || l_task_in(i).pm_parent_task_reference);
3434                     fnd_log.string(fnd_log.level_statement,L_DEBUG_KEY,'PM_TASK_REFERENCE: '|| l_task_in(i).PM_TASK_REFERENCE);
3435                     fnd_log.string(fnd_log.level_statement,L_DEBUG_KEY,'TASK_NAME: '|| l_task_in(i).TASK_NAME);
3436                     fnd_log.string(fnd_log.level_statement,L_DEBUG_KEY,'TASK_DESCRIPTION: '|| l_task_in(i).TASK_DESCRIPTION);
3437                     fnd_log.string(fnd_log.level_statement,L_DEBUG_KEY,'TASK_START_DATE: '|| l_task_in(i).TASK_START_DATE);
3438                     fnd_log.string(fnd_log.level_statement,L_DEBUG_KEY,'TASK_COMPLETION_DATE: '|| l_task_in(i).TASK_COMPLETION_DATE);
3439                     fnd_log.string(fnd_log.level_statement,L_DEBUG_KEY,'PA_TASK_ID: '|| l_task_in(i).PA_TASK_ID);
3440                   END IF;
3441                   EXIT WHEN i = l_task_in.LAST ;
3442                   i := l_task_in.NEXT(i);
3443                 END LOOP;  -- All Tasks
3444               END IF;  -- l_task_in.COUNT > 0
3445             END IF;  -- l_count > 0
3446 
3447               -- PRAKKUM :: 04-JAN-2013 :: FPBug 16481709 for BaseBug 14828418 : In reference of bug 9047048 :: START
3448               -- Check if using Shared Workplan Structure: If so need to pass all tasks of all OTHER visits
3449               -- also through l_task_in.
3450               -- Note that this is a shared project and l_task_in contains tasks for current visit only so far.
3451               IF (l_is_wp_separate_from_fn = 'N') THEN
3452                 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3453                     FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY,' PROCESSING TO PASS ENTIRE HIERARCHY ');
3454                 END IF;
3455                 -- Workplan is enabled, Using Shared Structure
3456                 -- In order to avoid the error with updating projects with Work Plan Structure enabled,
3457                 -- just pass the task reference and the parent task reference for all existing tasks
3458                 -- of all other visits even if there is no change
3459                 OPEN get_prj_tsks_not_mapd_to_vst(c_project_id => c_visit_rec.PROJECT_ID,
3460                                                   c_visit_id => c_visit_rec.VISIT_ID);-- PRAKKUM :: 17-JAN-2013 :: FPBug 16481709 for BaseBug 14828418
3461                 FETCH get_prj_tsks_not_mapd_to_vst BULK COLLECT INTO l_task_id_tbl, l_parent_task_id_tbl, l_tasks_disp_seq_tbl;
3462                 CLOSE get_prj_tsks_not_mapd_to_vst;
3463                 IF l_task_id_tbl.count > 0 THEN
3464                   L_CURR_TASK_COUNT := l_task_in.COUNT;
3465                   FOR k IN l_task_id_tbl.FIRST..l_task_id_tbl.LAST LOOP
3466                     IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3467                         FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY,
3468                         'k = ' || k ||
3469                         ', PA_TASK_ID = ' || l_task_id_tbl(k) ||
3470                         ', PARENT_PA_TASK_ID = ' || l_parent_task_id_tbl(k) ||
3471                         ', DISPLAY_SEQUENCE = ' || l_tasks_disp_seq_tbl(k));
3472                     END IF;
3473                     l_task_in(k + L_CURR_TASK_COUNT).PA_TASK_ID               := l_task_id_tbl(k);
3474                     l_task_in(k + L_CURR_TASK_COUNT).PA_PARENT_TASK_ID        := l_parent_task_id_tbl(k);
3475                     l_task_in(k + L_CURR_TASK_COUNT).DISPLAY_SEQUENCE         := l_tasks_disp_seq_tbl(k);
3476                   END LOOP;
3477                 END IF;  -- l_task_ref_tbl.count > 0
3478               END IF;  -- l_is_wp_separate_from_fn = N
3479               -- PRAKKUM :: 04-JAN-2013 :: FPBug 16481709 for BaseBug 14828418 : In reference of bug 9047048 :: END
3480 
3481               Sort_Task_Table(l_task_in);
3482 
3483           END IF;
3484         ELSE --l_new_structure_flag='Y'
3485           -- TYPE 4: Use the old hierarchy
3486           IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
3487             fnd_log.string(fnd_log.level_statement, L_DEBUG_KEY, 'TYPE 4');
3488           END IF;
3489           --Follow the old hierarchy
3490 
3491           -- TO UPDATE PROJECT IN PROJECTS
3492           l_Project_rec.PM_PROJECT_REFERENCE      := l_project_num_prefix || to_char(c_visit_rec.visit_number);
3493           l_Project_rec.PROJECT_NAME              := l_project_num_prefix || to_char(c_visit_rec.visit_number);
3494           l_Project_rec.DESCRIPTION               := SUBSTRB(c_visit_rec.description,1,250);
3495           l_Project_rec.START_DATE                := trunc(c_visit_rec.start_date_time);
3496           l_Project_rec.COMPLETION_DATE           := null;--c_visit_rec.close_date_time;
3497           l_Project_rec.SCHEDULED_START_DATE      := c_visit_rec.start_date_time;
3498           l_Project_rec.PA_PROJECT_ID             := c_visit_rec.PROJECT_ID;
3499           IF c_visit_rec.status_code = 'CLOSED' OR c_visit_rec.status_code = 'CANCELLED' THEN
3500             l_Project_rec.PROJECT_STATUS_CODE := 'CLOSED';
3501           ELSIF p_module_type = 'UPT' OR p_module_type = 'DEL' THEN
3502             l_Project_rec.PROJECT_STATUS_CODE := 'REJECTED';
3503           ELSE
3504             l_Project_rec.PROJECT_STATUS_CODE := l_prj_status_code_fdb;
3505           END IF;
3506 
3507           IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
3508             fnd_log.string(fnd_log.level_statement,L_DEBUG_KEY,'After assigning all values to project record type' || 'Project date  = ' || l_Project_rec.START_DATE);
3509           END IF;
3510 
3511           OPEN c_task_ct(p_visit_id);
3512           FETCH c_task_ct INTO l_count;
3513           CLOSE c_task_ct;
3514 
3515           IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
3516             fnd_log.string(fnd_log.level_statement,L_DEBUG_KEY,'Number of tasks = ' || l_count);
3517           END IF;
3518           --PRAKKUM     :: PIE :: 28-OCT-2010 :: Changed get_prj_route_dtls_cur to c_task
3519           IF l_count > 0 THEN
3520             OPEN c_task(p_visit_id);
3521             i := 1;
3522             LOOP
3523               FETCH c_task INTO c_task_rec;
3524               EXIT WHEN c_task%NOTFOUND;
3525               IF c_task%NOTFOUND THEN
3526                 CLOSE c_task;
3527               ELSE
3528                 IF c_visit_rec.start_date_time >= NVL(c_task_rec.start_date_time, c_visit_rec.start_date_time) THEN
3529                   c_task_rec.start_date_time := c_visit_rec.start_date_time;
3530                 END IF;
3531 
3532                 l_task_in(i).PM_TASK_REFERENCE         := c_task_rec.visit_task_number;
3533                 l_task_in(i).TASK_NAME                 := SUBSTRB(c_task_rec.visit_task_name,1,15);
3534                 l_task_in(i).PA_TASK_NUMBER            := c_task_rec.visit_task_number;
3535                 l_task_in(i).TASK_DESCRIPTION          := SUBSTRB(c_task_rec.description,1,250);
3536                 l_task_in(i).TASK_START_DATE           := trunc(c_visit_rec.start_date_time); --l_task_START_TIME;
3537                 l_task_in(i).TASK_COMPLETION_DATE      := Null; --l_task_END_TIME;
3538                 IF c_task_rec.PROJECT_TASK_ID IS NOT NULL THEN
3539                   l_task_in(i).PA_TASK_ID              := c_task_rec.PROJECT_TASK_ID;
3540                 ELSE
3541                   l_task_in(i).PA_TASK_ID              := Null;
3542                 END IF;
3543                 -- PRAKKUM :: 04-JAN-2013 :: FPBug 16481709 for BaseBug 14828418 : In reference of bug 9047048
3544                 l_task_in(i).DISPLAY_SEQUENCE := c_task_rec.DISPLAY_SEQUENCE;
3545                 -- No need to pass PM_PARENT_TASK_REFERENCE for old visits - will always be null
3546                 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
3547                   fnd_log.string(fnd_log.level_statement,L_DEBUG_KEY,'Visit Tasks = ' || i || 'Name = ' || l_task_in(i).TASK_NAME);
3548                 END IF;
3549                 i := i + 1;
3550               END IF;
3551             END LOOP;
3552             CLOSE c_task;
3553           END IF;
3554 
3555           -- PRAKKUM :: 04-JAN-2013 :: FPBug 16481709 for BaseBug 14828418 : In reference of bug 9047048 :: START
3556           -- Check if using Shared Workplan Structure: If so need to pass all tasks of all OTHER visits
3557           -- also through l_task_in.
3558           -- Note that this is a shared project and l_task_in contains tasks for current visit only so far.
3559           IF (l_is_wp_separate_from_fn = 'N') THEN
3560             IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3561                 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY,' PROCESSING TO PASS ENTIRE HIERARCHY ');
3562             END IF;
3563             -- Workplan is enabled, Using Shared Structure
3564             -- In order to avoid the error with updating projects with Work Plan Structure enabled,
3565             -- just pass the task reference and the parent task reference for all existing tasks
3566             -- of all other visits even if there is no change
3567             OPEN get_prj_tsks_not_mapd_to_vst(c_project_id => c_visit_rec.PROJECT_ID,
3568                                               c_visit_id => c_visit_rec.VISIT_ID);-- PRAKKUM :: 17-JAN-2013 :: FPBug 16481709 for BaseBug 14828418);
3569             FETCH get_prj_tsks_not_mapd_to_vst BULK COLLECT INTO l_task_id_tbl, l_parent_task_id_tbl, l_tasks_disp_seq_tbl;
3570             CLOSE get_prj_tsks_not_mapd_to_vst;
3571             IF l_task_id_tbl.count > 0 THEN
3572               L_CURR_TASK_COUNT := l_task_in.COUNT;
3573               FOR k IN l_task_id_tbl.FIRST..l_task_id_tbl.LAST LOOP
3574                 IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3575                    FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY,
3576                     'k = ' || k ||
3577                     ', PA_TASK_ID = ' || l_task_id_tbl(k) ||
3578                     ', PARENT_PA_TASK_ID = ' || l_parent_task_id_tbl(k) ||
3579                     ', DISPLAY_SEQUENCE = ' || l_tasks_disp_seq_tbl(k));
3580                 END IF;
3581                 l_task_in(k + L_CURR_TASK_COUNT).PA_TASK_ID               := l_task_id_tbl(k);
3582                 l_task_in(k + L_CURR_TASK_COUNT).PA_PARENT_TASK_ID        := l_parent_task_id_tbl(k);
3583                 l_task_in(k + L_CURR_TASK_COUNT).DISPLAY_SEQUENCE         := l_tasks_disp_seq_tbl(k);
3584               END LOOP;
3585             END IF;  -- l_task_ref_tbl.count > 0
3586           END IF;  -- l_is_wp_separate_from_fn = N
3587 
3588           Sort_Task_Table(l_task_in);
3589           -- PRAKKUM :: 04-JAN-2013 :: FPBug 16481709 for BaseBug 14828418 : In reference of bug 9047048 :: END
3590 
3591         END IF;  -- New Parent Project Flow or Old Flow
3592       -- PRAKKUM :: PIE Changes :: 15-OCT-2010 :: END
3593       -- Need to update proejct for
3594       IF c_visit_rec.PROJECT_ID IS NOT NULL THEN
3595         IF (l_log_statement >= l_log_current_level) THEN
3596           fnd_log.string(l_log_statement,L_DEBUG_KEY,'Visit Project ID = ' || c_visit_rec.PROJECT_ID);
3597           fnd_log.string(l_log_statement,L_DEBUG_KEY,'Before calling PA_PROJECT_PUB.UPDATE_PROJECT');
3598         END IF;
3599 
3600         IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
3601            fnd_log.string(fnd_log.level_statement, L_DEBUG_KEY, 'l_task_in.COUNT --@>'||l_task_in.COUNT);
3602            IF l_task_in.COUNT > 0 THEN
3603               fnd_log.string(fnd_log.level_statement, L_DEBUG_KEY, 'List of Project Tasks getting passed ');
3604               FOR i in l_task_in.FIRST .. l_task_in.LAST LOOP
3605                 fnd_log.string(fnd_log.level_statement, L_DEBUG_KEY, ' PA_TASK_ID --@>'||l_task_in(i).PA_TASK_ID ||
3606                                                                      ' PA_PARENT_TASK_ID --@>'||l_task_in(i).PA_PARENT_TASK_ID ||
3607                                                                      ' PM_TASK_REFERENCE --@>'||l_task_in(i).PM_TASK_REFERENCE ||
3608                                                                      ' PM_PARENT_TASK_REFERENCE --@>'||l_task_in(i).PM_PARENT_TASK_REFERENCE ||
3609                                                                      ' TASK_NAME --@>'||l_task_in(i).TASK_NAME ||
3610                                                                      ' LONG_TASK_NAME --@>'||l_task_in(i).LONG_TASK_NAME ||
3611                                                                      ' PA_TASK_NUMBER --@>'||l_task_in(i).PA_TASK_NUMBER ||
3612                                                                      ' TASK_START_DATE --@>'||l_task_in(i).TASK_START_DATE ||
3613                                                                      ' TASK_COMPLETION_DATE --@>'||l_task_in(i).TASK_COMPLETION_DATE ||
3614                                                                      ' SERVICE_TYPE_CODE --@>'||l_task_in(i).SERVICE_TYPE_CODE ||
3615                                                                      ' DISPLAY_SEQUENCE --@>'||l_task_in(i).DISPLAY_SEQUENCE);
3616               END LOOP;  -- i loop
3617               fnd_log.string(fnd_log.level_statement, L_DEBUG_KEY, 'End of Project Tasks');
3618            END IF;
3619         END IF;
3620 
3621         PA_PROJECT_PUB.UPDATE_PROJECT
3622                    (p_api_version_number     => 1,
3623                     p_commit                 => l_commit,
3624                     p_init_msg_list          => l_init_msg_list,
3625                     p_msg_count              => l_msg_count,
3626                     p_msg_data               => l_msg_data,
3627                     p_return_status          => l_return_status,
3628                     p_workflow_started       => l_workflow_started,
3629                     p_pm_product_code        => G_PM_PRODUCT_CODE,
3630                     p_project_in             => l_project_rec,
3631                     p_project_out            => l_project_out,
3632                     p_key_members            => l_key_members,
3633                     p_class_categories       => l_class_categories,
3634                     p_tasks_in               => l_task_in,
3635                     p_tasks_out              => l_task_out,
3636                     p_pass_entire_structure  => l_pass_entire_structure
3637                    ); -- PRAKKUM :: FP:PIE :: 13-OCT-2010 ::
3638 
3639         IF (l_log_statement >= l_log_current_level) THEN
3640             fnd_log.string(l_log_statement,L_DEBUG_KEY,'After calling PA_PROJECT_PUB.UPDATE_PROJECT - l_return_status = '||l_return_status);
3641         END IF;
3642 
3643         IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
3644           IF (l_log_statement >= l_log_current_level) THEN
3645               fnd_log.string(l_log_statement,L_DEBUG_KEY,'Errors from PA_PROJECT_PUB.UPDATE_PROJECT - l_msg_count = '||l_msg_count);
3646           END IF;
3647           RAISE Fnd_Api.g_exc_error;
3648         END IF;
3649 
3650         -- PRAKKUM :: FP:PIE :: 13-OCT-2010 ::
3651         /*IF (l_top_task_id = -1) THEN
3652           l_top_task_id := l_task_out(1).pa_task_id;
3653         END IF;*/
3654 
3655         -- If the Visit Organisation is chnaged after costing
3656         -- need to set pjm paramters for the new org if it doesnot exist.
3657         OPEN c_pjm_param(c_visit_rec.project_id, c_visit_rec.organization_id);
3658         FETCH c_pjm_param INTO l_dummy;
3659         IF c_pjm_param%NOTFOUND THEN -- need to create for new org
3660 
3661             OPEN c_cost_group(c_visit_rec.organization_id);
3662             FETCH c_cost_group INTO l_param_data.cost_group_id;
3663             CLOSE c_cost_group;
3664 
3665             l_param_data.project_id := c_visit_rec.project_id;
3666             l_param_data.organization_id := c_visit_rec.organization_id;
3667             -- l_param_data.cost_group_id := NVL(l_param_data.cost_group_id,1);
3668             l_param_data.wip_acct_class_code := NULL;
3669             l_param_data.eam_acct_class_code := NULL;
3670             l_param_data.ipv_expenditure_type := NULL;
3671             l_param_data.erv_expenditure_type := NULL;
3672             l_param_data.freight_expenditure_type := NULL;
3673             l_param_data.tax_expenditure_type := NULL;
3674             l_param_data.misc_expenditure_type := NULL;
3675             l_param_data.ppv_expenditure_type := NULL;
3676             l_param_data.dir_item_expenditure_type := 'Machine Usage';
3677             -- yazhou 06Oct2005 starts
3678             -- Bug fix #4658861
3679             -- l_param_data.start_date_active := c_visit_rec.start_date_time;
3680             -- l_param_data.end_date_active := c_visit_rec.close_date_time;
3681             l_param_data.start_date_active := NULL;
3682             l_param_data.end_date_active := NULL;
3683             -- yazhou 06Oct2005 ends
3684 
3685             PJM_PROJECT_PARAM_PUB.CREATE_PROJECT_PARAMETER(
3686               p_api_version => 1.0,
3687               p_init_msg_list => p_init_msg_list,
3688               p_commit => l_commit,
3689               x_return_status => l_return_status,
3690               x_msg_count => l_msg_count,
3691               x_msg_data => l_msg_data,
3692               p_param_data => l_param_data);
3693 
3694             IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
3695                CLOSE c_pjm_param;
3696                RAISE FND_API.G_EXC_ERROR;
3697             END IF;
3698             -- RROY
3699          END IF;
3700          CLOSE c_pjm_param;
3701 
3702          -- Merge process fro 11.5 10 bug fix on cmrdv10p env.
3703          -- Bug# 3594083 fix by shbhanda on 04/23
3704          -- To update all tasks without project task with project task id
3705          -- PRAKKUM :: PIE Changes :: 13-OCT-2010 :: START
3706          -- To update all tasks without project task with project task id
3707 
3708          -- PRAKKUM :: 04-JAN-2013 :: FPBug 16481709 for BaseBug 14828418 : In reference of bug 9047048
3709          -- Top task id won't be null if project details populated using Type 1 method (l_top_task_id:-1),
3710          -- in other cases it will be null
3711          IF (l_log_statement >= l_log_current_level) THEN
3712             fnd_log.string(l_log_statement,L_DEBUG_KEY,'l_top_task_id = ' || l_top_task_id);
3713          END IF;
3714 
3715          OPEN c_task_proj(c_visit_rec.PROJECT_ID);
3716          LOOP
3717             FETCH c_task_proj INTO c_task_proj_rec;
3718             EXIT WHEN c_task_proj%NOTFOUND;
3719             -- Update AHL_VISIT_TASKS_B only for non-rollup tasks
3720             IF (c_visit_rec.TOP_PROJECT_TASK_ID IS NULL
3721                 AND l_top_task_id IS NULL) THEN
3722               IF (INSTR(c_task_proj_rec.task_number, '-') = 0) THEN -- tasks not under a visit level top task
3723                 UPDATE AHL_VISIT_TASKS_B SET
3724                 PROJECT_TASK_ID = c_task_proj_rec.task_id,
3725                 OBJECT_VERSION_NUMBER = OBJECT_VERSION_NUMBER + 1,
3726                      --TCHIMIRA::BUG 9222622 ::15-DEC-2009::UPDATE WHO COLUMNS
3727                      LAST_UPDATE_DATE      = SYSDATE,
3728                      LAST_UPDATED_BY       = Fnd_Global.USER_ID,
3729                      LAST_UPDATE_LOGIN     = Fnd_Global.LOGIN_ID
3730                      /*B6436358 - sowsubra - Visit task number is of type number and task number in projects
3731                      is of type char. Hence the invalid number error. And so added a to_char function to convert
3732                      the visit task number to character*/
3733                 WHERE VISIT_ID = p_visit_id AND TO_CHAR(VISIT_TASK_NUMBER) = c_task_proj_rec.task_number
3734                 AND PROJECT_TASK_ID is NULL;
3735               END IF;
3736             ELSE
3737               IF (INSTR(c_task_proj_rec.task_number,'-',1,2) = 0) THEN -- tasks under a visit top task
3738                 UPDATE AHL_VISIT_TASKS_B SET
3739                 PROJECT_TASK_ID = c_task_proj_rec.task_id,
3740                 OBJECT_VERSION_NUMBER = OBJECT_VERSION_NUMBER + 1,
3741                      --TCHIMIRA::BUG 9222622 ::15-DEC-2009::UPDATE WHO COLUMNS
3742                      LAST_UPDATE_DATE      = SYSDATE,
3743                      LAST_UPDATED_BY       = Fnd_Global.USER_ID,
3744                      LAST_UPDATE_LOGIN     = Fnd_Global.LOGIN_ID
3745                      /*B6436358 - sowsubra - Visit task number is of type number and task number in projects
3746                      is of type char. Hence the invalid number error. And so added a to_char function to convert
3747                      the visit task number to character*/
3748                 WHERE VISIT_ID = p_visit_id
3749                 AND TO_CHAR(c_visit_rec.visit_number) || '-' || TO_CHAR(VISIT_TASK_NUMBER) = c_task_proj_rec.task_number
3750                 AND PROJECT_TASK_ID is NULL;
3751               END IF;
3752             END IF;
3753          END LOOP;
3754          CLOSE c_task_proj;
3755 
3756         -- PRAKKUM :: 04-JAN-2013 :: FPBug 16481709 for BaseBug 14828418 : In reference of bug 9047048
3757         -- Moved code to update top task after mapping project tasks with visit tasks
3758         -- PRAKKUM :: FP:PIE :: 13-OCT-2010 ::
3759         IF (l_top_task_id = -1) THEN
3760           -- Added code to retrieve correct top task id
3761           IF l_pass_entire_structure = 'Y' THEN
3762              IF (l_log_statement >= l_log_current_level) THEN
3763                 fnd_log.string(l_log_statement,L_DEBUG_KEY,'c_visit_rec.PROJECT_ID = ' || c_visit_rec.PROJECT_ID);
3764                 fnd_log.string(l_log_statement,L_DEBUG_KEY,'c_visit_rec.VISIT_ID = ' || c_visit_rec.VISIT_ID);
3765              END IF;
3766              OPEN get_vst_prj_top_task(c_visit_rec.PROJECT_ID, c_visit_rec.VISIT_ID);
3767              FETCH get_vst_prj_top_task INTO l_vst_prj_top_tsk_rec;
3768              CLOSE get_vst_prj_top_task;
3769              l_top_task_id := l_vst_prj_top_tsk_rec.TOP_TASK_ID;
3770           ELSE
3771              l_top_task_id := l_task_out(1).pa_task_id;
3772           END IF;
3773         END IF;
3774 
3775         IF (l_log_statement >= l_log_current_level) THEN
3776           fnd_log.string(l_log_statement,L_DEBUG_KEY,'l_top_task_id = ' || l_top_task_id);
3777         END IF;
3778 
3779          -- Update AHL_VISITS_B.TOP_PROJECT_TASK_ID with the top task id just created
3780          IF l_top_task_id IS NOT NULL THEN
3781            UPDATE AHL_VISITS_B
3782               SET TOP_PROJECT_TASK_ID = l_top_task_id
3783             WHERE VISIT_ID = p_visit_id;
3784          END IF;
3785       END IF; -- c_visit_rec.PROJECT_ID IS NOT NULL
3786       -- PRAKKUM :: PIE Changes :: 13-OCT-2010 :: END
3787    ELSIF c_visit_rec.START_DATE_TIME IS NULL or c_visit_rec.START_DATE_TIME = Fnd_Api.G_MISS_DATE THEN
3788       x_return_status := Fnd_Api.g_ret_sts_error;
3789       IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_error) THEN
3790          Fnd_Message.set_name ('AHL', 'AHL_VWP_VISIT_ST_DT_MISSING');
3791          Fnd_Msg_Pub.ADD;
3792       END IF;
3793    END IF; -- check for visit's start date time
3794 END IF; -- l_chk_project
3795 
3796 ---------------------------End of API Body---------------------------------------
3797 --Standard check to count messages
3798 l_msg_count := Fnd_Msg_Pub.count_msg;
3799 
3800 IF l_msg_count > 0 THEN
3801    X_msg_count := l_msg_count;
3802    X_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
3803    RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
3804 END IF;
3805 
3806 IF (l_log_procedure >= l_log_current_level) THEN
3807     fnd_log.string(l_log_procedure,L_DEBUG_KEY ||'.end','End of the procedure');
3808 END IF;
3809 
3810 EXCEPTION
3811  WHEN FND_API.G_EXC_ERROR THEN
3812    x_return_status := FND_API.G_RET_STS_ERROR;
3813    ROLLBACK TO Update_Project;
3814    FND_MSG_PUB.count_and_get(p_count => x_msg_count,
3815                               p_data  => x_msg_data,
3816                               p_encoded => fnd_api.g_false);
3817 
3818  WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
3819    x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
3820    ROLLBACK TO Update_Project;
3821    FND_MSG_PUB.count_and_get(p_count => x_msg_count,
3822                               p_data  => x_msg_data,
3823                               p_encoded => fnd_api.g_false);
3824 
3825  WHEN OTHERS THEN
3826     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
3827     ROLLBACK TO Update_Project;
3828     IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
3829        fnd_msg_pub.add_exc_msg(p_pkg_name       => G_PKG_NAME,
3830                                p_procedure_name => 'Update_Project',
3831                                p_error_text     => SUBSTR(SQLERRM,1,500));
3832     END IF;
3833     FND_MSG_PUB.count_and_get(p_count => x_msg_count,
3834                                p_data  => x_msg_data,
3835                                p_encoded => fnd_api.g_false);
3836 
3837 END Update_Project;
3838 
3839 --------------------------------------------------------------------
3840 -- PROCEDURE
3841 --    Delete_Project
3842 --
3843 -- PURPOSE
3844 --    To delete Project and its tasks if visit in VWP is deleted
3845 --------------------------------------------------------------------
3846 PROCEDURE Delete_Project(
3847    p_api_version       IN  NUMBER,
3848    p_init_msg_list     IN  VARCHAR2  := Fnd_Api.g_false,
3849    p_commit            IN  VARCHAR2  := Fnd_Api.g_false,
3850    p_validation_level  IN  NUMBER    := Fnd_Api.g_valid_level_full,
3851    p_module_type       IN  VARCHAR2  := Null,
3852    p_visit_id          IN  NUMBER,
3853    x_return_status     OUT NOCOPY VARCHAR2,
3854    x_msg_count         OUT NOCOPY NUMBER,
3855    x_msg_data          OUT NOCOPY VARCHAR2  )
3856 AS
3857   -- Define local Variables
3858    L_API_NAME    CONSTANT VARCHAR2(30)  := 'Delete_Project';
3859    L_DEBUG_KEY   CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
3860    L_API_VERSION CONSTANT NUMBER := 1.0;
3861    l_count                NUMBER;
3862    l_msg_count            NUMBER;
3863    l_created_project_id   NUMBER;
3864    i                      NUMBER;
3865    l_return_status        VARCHAR2(1);
3866    l_chk_project          VARCHAR2(1);
3867    l_del_proj_flag        VARCHAR2(1);
3868    l_valid_flag           VARCHAR2(1):= 'N';
3869    l_commit               VARCHAR2(1) := 'F';
3870    l_init_msg_list        VARCHAR2(1) := 'F';
3871    l_default              VARCHAR2(30);
3872    l_msg_data             VARCHAR2(2000);
3873    G_EXC_ERROR            EXCEPTION;
3874 
3875  -- Define local Cursors
3876     -- To find visit related information
3877    CURSOR c_visit (x_id IN NUMBER) IS
3878     SELECT * FROM AHL_VISITS_VL
3879     WHERE VISIT_ID = x_id;
3880    c_visit_rec c_visit%ROWTYPE;
3881 
3882    -- To find whether the visit project occurs in PJM_PROJECT_PARAMETERS table
3883     CURSOR c_Project(x_proj_id IN NUMBER) IS
3884        SELECT count(*) FROM PJM_PROJECT_PARAMETERS
3885          WHERE Project_ID = x_proj_id;
3886 BEGIN
3887 
3888   SAVEPOINT Delete_project;
3889 
3890   IF (l_log_procedure >= l_log_current_level) THEN
3891     fnd_log.string(l_log_procedure,L_DEBUG_KEY ||'.begin','At the start of the procedure');
3892   END IF;
3893 
3894   -- Initialize message list if p_init_msg_list is set to TRUE.
3895   IF Fnd_Api.to_boolean(p_init_msg_list)THEN
3896      Fnd_Msg_Pub.initialize;
3897   END IF;
3898 
3899   --  Initialize API return status to success
3900   x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
3901 
3902   -- Standard call to check for call compatibility.
3903   IF NOT Fnd_Api.COMPATIBLE_API_CALL(l_api_version,
3904                                       p_api_version,
3905                                       L_API_NAME,G_PKG_NAME) THEN
3906        RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3907   END IF;
3908 
3909   IF (l_log_statement >= l_log_current_level) THEN
3910     fnd_log.string(l_log_statement,L_DEBUG_KEY,'Visit Id=' || p_visit_id);
3911   END IF;
3912 
3913   OPEN c_visit (p_visit_id);
3914   FETCH c_visit INTO c_visit_rec;
3915   CLOSE c_visit;
3916 
3917   -- To check Project responsibilites
3918   -- Post 11.5.10
3919   -- RROY
3920   AHL_VWP_RULES_PVT.Check_Proj_Responsibility
3921    (x_check_project    => l_chk_project,
3922     x_return_status    => l_return_status);
3923 
3924   IF l_return_status <> Fnd_Api.G_RET_STS_SUCCESS THEN
3925     x_return_status := l_return_status;
3926     RAISE G_EXC_ERROR;
3927   END IF;
3928 
3929   IF l_chk_project = 'Y' THEN
3930     OPEN  c_Project(c_visit_rec.PROJECT_ID);
3931     FETCH c_Project INTO l_count;
3932     CLOSE c_Project;
3933 
3934     IF l_count > 0 THEN -- merge process for 11.5 10 bug# 3470801 fix on CMRDV10P
3935       Fnd_Message.SET_NAME('AHL','AHL_VWP_PROJ_PJM_PARA');
3936       Fnd_Message.SET_TOKEN('VISIT_NUMBER', c_visit_rec.Visit_Number);
3937       Fnd_Msg_Pub.ADD;
3938       RAISE Fnd_Api.G_EXC_ERROR;
3939     ELSE
3940       IF (l_log_statement >= l_log_current_level) THEN
3941         fnd_log.string(l_log_statement,L_DEBUG_KEY,'Before calling :  PA_PROJECT_PUB.CHECK_DELETE_PROJECT_OK');
3942       END IF;
3943 
3944       PA_PROJECT_PUB.CHECK_DELETE_PROJECT_OK
3945                 ( p_api_version_number     => 1
3946                   , p_init_msg_list         =>  l_init_msg_list
3947                   , p_return_status         => l_return_status
3948                   , p_msg_count           => l_msg_count
3949                   , p_msg_data           => l_msg_data
3950                   , p_project_id       => c_visit_rec.PROJECT_ID
3951                   , p_pm_project_reference   =>  c_visit_rec.visit_number
3952                   , p_delete_project_ok_flag => l_del_proj_flag
3953                 );
3954 
3955       IF (l_log_statement >= l_log_current_level) THEN
3956         fnd_log.string(l_log_statement,L_DEBUG_KEY,'After calling PA_PROJECT_PUB.CHECK_DELETE_PROJECT_OK - l_return_status = '||l_return_status);
3957       END IF;
3958 
3959       IF l_return_status <> 'S' THEN
3960         RAISE G_EXC_ERROR;
3961       END IF;
3962 
3963       IF (l_log_statement >= l_log_current_level) THEN
3964         fnd_log.string(l_log_statement,L_DEBUG_KEY,'l_del_proj_flag = '||l_del_proj_flag);
3965       END IF;
3966 
3967       IF l_del_proj_flag = 'Y' THEN
3968           IF (l_log_statement >= l_log_current_level) THEN
3969             fnd_log.string(l_log_statement,L_DEBUG_KEY,'Before calling PA_PROJECT_PUB.DELETE_PROJECT');
3970           END IF;
3971 
3972           PA_PROJECT_PUB.DELETE_PROJECT
3973                  ( p_api_version_number  =>  1
3974                  ,p_commit               =>  l_commit
3975                  ,p_init_msg_list        =>  l_init_msg_list
3976                  ,p_msg_count            =>  l_msg_count
3977                  ,p_msg_data             =>  l_msg_data
3978                  ,p_return_status        =>  l_return_status
3979                  ,p_pm_product_code      =>  G_PM_PRODUCT_CODE
3980                  ,p_pm_project_reference =>  c_visit_rec.visit_number
3981                  ,p_pa_project_id        =>  c_visit_rec.PROJECT_ID
3982                 );
3983 
3984           IF (l_log_statement >= l_log_current_level) THEN
3985             fnd_log.string(l_log_statement,L_DEBUG_KEY,'After calling PA_PROJECT_PUB.DELETE_PROJECT - l_return_status = '||l_return_status);
3986           END IF;
3987 
3988           IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
3989             IF (l_log_statement >= l_log_current_level) THEN
3990               fnd_log.string(l_log_statement,L_DEBUG_KEY,'Errors from PA_PROJECT_PUB.DELETE_PROJECT API : '|| x_msg_count );
3991             END IF;
3992             RAISE Fnd_Api.g_exc_error;
3993           END IF;
3994       END IF;
3995     END IF;
3996   END IF;
3997 
3998 ---------------------------End of API Body---------------------------------------
3999   --Standard check to count messages
4000   l_msg_count := Fnd_Msg_Pub.count_msg;
4001 
4002   IF l_msg_count > 0 THEN
4003      X_msg_count := l_msg_count;
4004      X_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
4005      RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
4006   END IF;
4007 
4008   IF (l_log_procedure >= l_log_current_level) THEN
4009     fnd_log.string(l_log_procedure,L_DEBUG_KEY ||'.end','End of the procedure');
4010   END IF;
4011 
4012 EXCEPTION
4013  WHEN FND_API.G_EXC_ERROR THEN
4014    x_return_status := FND_API.G_RET_STS_ERROR;
4015    ROLLBACK TO Delete_Project;
4016    FND_MSG_PUB.count_and_get(p_count => x_msg_count,
4017                              p_data  => x_msg_data,
4018                              p_encoded => fnd_api.g_false);
4019 
4020  WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
4021    x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4022    ROLLBACK TO Delete_Project;
4023    FND_MSG_PUB.count_and_get(p_count => x_msg_count,
4024                              p_data  => x_msg_data,
4025                              p_encoded => fnd_api.g_false);
4026 
4027  WHEN OTHERS THEN
4028     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4029     ROLLBACK TO Delete_Project;
4030     IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
4031        fnd_msg_pub.add_exc_msg(p_pkg_name       => G_PKG_NAME,
4032                                p_procedure_name => 'Delete_Project',
4033                                p_error_text     => SUBSTR(SQLERRM,1,500));
4034     END IF;
4035     FND_MSG_PUB.count_and_get(p_count => x_msg_count,
4036                                p_data  => x_msg_data,
4037                                p_encoded => fnd_api.g_false);
4038 END Delete_Project;
4039 
4040 
4041 -- SATRAJEN :: BUG 12990261 :: Minimize the number of Error Messages :: Jun 2012
4042 --****************************************************************--
4043 --------------------------------------------------------------------
4044 --              VWP INTEGRATION WITH PRODUCTION                   --
4045 --------------------------------------------------------------------
4046 --****************************************************************--
4047 
4048 ------------------------------------------------------------------
4049 --  Function name    : Validate_MR_Route_Date
4050 --  Type              : Private
4051 --  Function          : Validate if the tasks associated to MR Route Id
4052 --                      have an expired MR Id / Route Id. Also to sum up
4053 --                      all the error messages.
4054 --  Parameters  :
4055 --
4056 --  Validate_MR_Route_Date Parameters:
4057 --       p_mr_route_id            IN     NUMBER     Required
4058 --       p_visit_task_number      IN     NUMBER     Required
4059 --       p_start_date_time        IN     DATE       Required
4060 --       p_end_date_time          IN     DATE       Required
4061 --
4062 --  Version :
4063 --      21/06/2012                      SATRAJEN  Initial Version - 1.0
4064 --                                      Added for Bug 12990261
4065 -------------------------------------------------------------------
4066 
4067 FUNCTION Validate_MR_Route_Date(
4068    p_mr_route_id       IN  NUMBER,
4069    p_visit_task_number IN  NUMBER,
4070    p_start_date_time   IN  DATE,
4071    p_end_date_time     IN  DATE
4072   )
4073 RETURN NUMBER -- PRAKKUM :: FPBug 16481732 for BaseBug 15884730 :: 16/11/2012
4074 IS
4075    -- Define local Variables
4076    L_API_NAME     CONSTANT VARCHAR2(30)  := 'Validate_MR_Route_Date';
4077    L_DEBUG_KEY    CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
4078    --Flag value is a number manipulated in binary form to keep information of validation errors that found
4079    x_valid_flag            NUMBER :=0; -- PRAKKUM :: FPBug 16481732 for BaseBug 15884730 :: 16/11/2012
4080 
4081 
4082    -- To find MR related Information
4083    CURSOR c_mr_header (c_id IN NUMBER) IS
4084      SELECT mrh1.effective_from,mrh1.effective_to
4085      FROM AHL_MR_HEADERS_APP_V mrh1, AHL_MR_ROUTES mrr
4086      WHERE mrh1.mr_status_code = 'COMPLETE' AND
4087            trunc(mrh1.effective_from) <= trunc(sysdate) AND
4088            trunc(nvl(mrh1.effective_to,sysdate)) >= trunc(sysdate) AND
4089            mrr.mr_route_id = c_id  AND
4090            mrh1.mr_header_id = mrr.mr_header_id AND
4091            mrh1.version_number = (select max(version_number)
4092                                  from AHL_MR_HEADERS_APP_V mrh2
4093                                  where mrh2.title = mrh1.title
4094                                  and mrh2.mr_status_code = 'COMPLETE'
4095                                  and trunc(effective_from) <= trunc(sysdate) AND
4096                                  trunc(nvl(effective_to,sysdate)) >= trunc(sysdate));
4097 
4098    c_mr_header_rec c_mr_header%ROWTYPE;
4099 
4100    -- To find Route related Information
4101    CURSOR c_route (c_id IN NUMBER) IS
4102      SELECT ra.*
4103      FROM AHL_ROUTES_APP_V ra, AHL_MR_ROUTES mrr
4104      WHERE ra.route_id = mrr.route_id AND
4105            mrr.mr_route_id = c_id AND
4106            ra.revision_status_code = 'COMPLETE';
4107 
4108    c_route_rec c_route%ROWTYPE;
4109 
4110 BEGIN
4111 
4112    -- Log API Entry Point
4113    IF (l_log_procedure >= l_log_current_level) THEN
4114        fnd_log.string(l_log_procedure,
4115                       L_DEBUG_KEY ||'.begin',
4116                       'At the start of PL SQL procedure.');
4117        fnd_log.string(l_log_procedure,
4118                       L_DEBUG_KEY,
4119                       'MR Route Id = ' || p_mr_route_id || 'Visit Task Number = ' || p_visit_task_number ||
4120                       'Start Date = ' || p_start_date_time || 'End Date = ' || p_end_date_time);
4121     END IF;
4122 
4123    IF p_mr_route_id IS NOT NULL THEN
4124       OPEN c_route (p_mr_route_id);
4125       FETCH c_route INTO c_route_rec;
4126 
4127       IF c_route%FOUND THEN
4128          CLOSE c_route;
4129 
4130          IF (l_log_statement >= l_log_current_level) THEN
4131             fnd_log.string(l_log_statement,
4132                            L_DEBUG_KEY,
4133                            'Checking Route Start and End Dates');
4134          END IF;
4135 
4136          IF TRUNC(c_route_rec.start_date_active) > p_start_date_time THEN
4137 
4138             -- SATRAJEN :: Bug 12990261 :: Commented to Sum up all the error Messages :: Jun 2012
4139             /*Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_TSK_STDT_ROUT_STDT');
4140             Fnd_Message.Set_Token('TASK_NUMBER', p_visit_task_number);
4141             Fnd_Msg_Pub.ADD;*/
4142             -- PRAKKUM :: FPBug 16481732 for BaseBug 15884730 :: 16/11/2012
4143             --bitor value of x and y=(x+y)-bitand(x,y);
4144             x_valid_flag := (x_valid_flag+POWER(2,0))-bitand(x_valid_flag,POWER(2,0));
4145 
4146          END IF;
4147 
4148          IF TRUNC(c_route_rec.end_date_active) IS NOT NULL THEN
4149             IF TRUNC(c_route_rec.end_date_active) < p_end_date_time THEN
4150 
4151                -- SATRAJEN :: Bug 12990261 :: Commented to Sum up all the error Messages :: Jun 2012
4152                /*Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_TSK_ENDT_ROUT_ENDT');
4153                Fnd_Message.Set_Token('TASK_NUMBER', p_visit_task_number);
4154                Fnd_Msg_Pub.ADD;*/
4155                -- PRAKKUM :: FPBug 16481732 for BaseBug 15884730 :: 16/11/2012
4156                --bitor value of x and y=(x+y)-bitand(x,y);
4157                x_valid_flag := (x_valid_flag+POWER(2,1))-bitand(x_valid_flag,POWER(2,1));
4158 
4159             END IF;
4160          END IF;
4161 
4162       ELSE  -- Else of c_route%FOUND check
4163 
4164          CLOSE c_route;
4165 
4166          -- SATRAJEN :: Bug 12990261 :: Commented to Sum up all the error Messages :: Jun 2012
4167          /*Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_TSK_NO_ROUTE');
4168          Fnd_Message.Set_Token('TASK_NUMBER', p_visit_task_number);
4169          Fnd_Msg_Pub.ADD;*/
4170          -- PRAKKUM :: FPBug 16481732 for BaseBug 15884730 :: 16/11/2012
4171          --bitor value of x and y=(x+y)-bitand(x,y);
4172          x_valid_flag := (x_valid_flag+POWER(2,2))-bitand(x_valid_flag,POWER(2,2));
4173 
4174       END IF; -- End of c_route%FOUND check
4175 
4176      -- If the tasks associated to MR Route Id have an expired MR Id
4177      -- then it cannot be pushed into Production Planning.
4178      OPEN c_mr_header (p_mr_route_id);
4179      FETCH c_mr_header INTO c_mr_header_rec;
4180 
4181      IF c_mr_header%FOUND THEN
4182         CLOSE c_mr_header;
4183 
4184         IF (l_log_statement >= l_log_current_level) THEN
4185            fnd_log.string(l_log_statement,
4186                           L_DEBUG_KEY,
4187                           'Checking MR Start and End Dates');
4188         END IF;
4189 
4190         IF TRUNC(c_mr_header_rec.effective_from) > p_start_date_time THEN
4191            -- SATRAJEN :: Bug 12990261 :: Commented to Sum up all the error Messages :: Jun 2012
4192            /*Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_NO_TS_SD_LT_MR');
4193            Fnd_Message.Set_Token('TASK_NUMBER', p_visit_task_number);
4194            Fnd_Msg_Pub.ADD;*/
4195            -- PRAKKUM :: FPBug 16481732 for BaseBug 15884730 :: 16/11/2012
4196            --bitor value of x and y=(x+y)-bitand(x,y);
4197            x_valid_flag := (x_valid_flag+POWER(2,3))-bitand(x_valid_flag,POWER(2,3));
4198         END IF;
4199         IF TRUNC(c_mr_header_rec.effective_to) IS NOT NULL THEN
4200            IF TRUNC(c_mr_header_rec.effective_to) < p_end_date_time THEN
4201 
4202               -- SATRAJEN :: Bug 12990261 :: Commented to Sum up all the error Messages :: Jun 2012
4203               /*Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_NO_TS_ED_GT_MR');
4204               Fnd_Message.Set_Token('TASK_NUMBER', p_visit_task_number);
4205               Fnd_Msg_Pub.ADD;*/
4206               -- PRAKKUM :: FPBug 16481732 for BaseBug 15884730 :: 16/11/2012
4207               --bitor value of x and y=(x+y)-bitand(x,y);
4208               x_valid_flag := (x_valid_flag+POWER(2,4))-bitand(x_valid_flag,POWER(2,4));
4209            END IF;
4210         END IF;
4211 
4212      ELSE -- Else for c_mr_header%FOUND check
4213        CLOSE c_mr_header;
4214 
4215        -- SATRAJEN :: Bug 12990261 :: Commented to Sum up all the error Messages :: Jun 2012
4216        /*Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_NO_MR_ID');
4217        Fnd_Message.Set_Token('TASK_NUMBER', p_visit_task_number);
4218        Fnd_Msg_Pub.ADD;*/
4219        -- PRAKKUM :: FPBug 16481732 for BaseBug 15884730 :: 16/11/2012
4220        --bitor value of x and y=(x+y)-bitand(x,y);
4221        x_valid_flag := (x_valid_flag+POWER(2,5))-bitand(x_valid_flag,POWER(2,5));
4222 
4223       END IF; -- End of c_mr_header%FOUND check
4224    END IF; -- End of p_mr_route_id IS NOT NULL check
4225 
4226    IF (l_log_statement >= l_log_current_level) THEN
4227         fnd_log.string(l_log_statement,
4228                        L_DEBUG_KEY,
4229                        'x_valid_flag --@>'||x_valid_flag);
4230    END IF;
4231 
4232    ---------------------------End of API Body---------------------------------------
4233    IF (l_log_procedure >= l_log_current_level) THEN
4234       fnd_log.string(l_log_procedure,
4235                      L_DEBUG_KEY ||'.end',
4236                      'At the end of PL SQL Function.');
4237    END IF;
4238    RETURN x_valid_flag;
4239 
4240 END Validate_MR_Route_Date;
4241 
4242 
4243 
4244 --****************************************************************--
4245 --------------------------------------------------------------------
4246 --              VWP INTEGRATION WITH PRODUCTION                   --
4247 --------------------------------------------------------------------
4248 --****************************************************************--
4249 
4250 ------------------------------------------------------------------
4251 --  Procedure name    : Validate_MR_Route_Date
4252 --  Type              : Private
4253 --  Function          : Validate if the tasks associated to MR Route Id
4254 --                      have an expired MR Id / Route Id.
4255 --  Parameters  :
4256 --
4257 --  Validate_MR_Route_Date Parameters:
4258 --       p_mr_route_id            IN     NUMBER     Required
4259 --       p_visit_task_number      IN     NUMBER     Required
4260 --       p_start_date_time        IN     DATE       Required
4261 --       p_end_date_time          IN     DATE       Required
4262 --
4263 --  Version :
4264 --      28 Sep, 2007                    RNAHATA  Initial Version - 1.0
4265 --                                      Added for Bug 6448678
4266 -------------------------------------------------------------------
4267 
4268 PROCEDURE Validate_MR_Route_Date(
4269    p_mr_route_id       IN  NUMBER,
4270    p_visit_task_number IN  NUMBER,
4271    p_start_date_time   IN  DATE,
4272    p_end_date_time     IN  DATE
4273   )
4274 AS
4275    -- Define local Variables
4276    L_API_NAME     CONSTANT VARCHAR2(30)  := 'Validate_MR_Route_Date';
4277    L_DEBUG_KEY    CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
4278 
4279    -- To find MR related Information
4280    CURSOR c_mr_header (c_id IN NUMBER) IS
4281      SELECT mrh1.effective_from,mrh1.effective_to
4282      FROM AHL_MR_HEADERS_APP_V mrh1, AHL_MR_ROUTES mrr
4283      WHERE mrh1.mr_status_code = 'COMPLETE' AND
4284            trunc(mrh1.effective_from) <= trunc(sysdate) AND
4285            trunc(nvl(mrh1.effective_to,sysdate)) >= trunc(sysdate) AND
4286            mrr.mr_route_id = c_id  AND
4287            mrh1.mr_header_id = mrr.mr_header_id AND
4288            mrh1.version_number = (select max(version_number)
4289                                  from AHL_MR_HEADERS_APP_V mrh2
4290                                  where mrh2.title = mrh1.title
4291                                  and mrh2.mr_status_code = 'COMPLETE'
4292                                  and trunc(effective_from) <= trunc(sysdate) AND
4293                                  trunc(nvl(effective_to,sysdate)) >= trunc(sysdate));
4294 
4295    c_mr_header_rec c_mr_header%ROWTYPE;
4296 
4297    -- To find Route related Information
4298    CURSOR c_route (c_id IN NUMBER) IS
4299      SELECT ra.*
4300      FROM AHL_ROUTES_APP_V ra, AHL_MR_ROUTES mrr
4301      WHERE ra.route_id = mrr.route_id AND
4302            mrr.mr_route_id = c_id AND
4303            ra.revision_status_code = 'COMPLETE';
4304 
4305    c_route_rec c_route%ROWTYPE;
4306 
4307 BEGIN
4308 
4309    -- Log API Entry Point
4310    IF (l_log_procedure >= l_log_current_level) THEN
4311        fnd_log.string(l_log_procedure,
4312                       L_DEBUG_KEY ||'.begin',
4313                       'At the start of PL SQL procedure.');
4314        fnd_log.string(l_log_procedure,
4315                       L_DEBUG_KEY,
4316                       'MR Route Id = ' || p_mr_route_id || 'Visit Task Number = ' || p_visit_task_number ||
4317                       'Start Date = ' || p_start_date_time || 'End Date = ' || p_end_date_time);
4318     END IF;
4319 
4320    IF p_mr_route_id IS NOT NULL THEN
4321       OPEN c_route (p_mr_route_id);
4322       FETCH c_route INTO c_route_rec;
4323 
4324       IF c_route%FOUND THEN
4325          CLOSE c_route;
4326 
4327          IF (l_log_statement >= l_log_current_level) THEN
4328             fnd_log.string(l_log_statement,
4329                            L_DEBUG_KEY,
4330                            'Checking Route Start and End Dates');
4331          END IF;
4332 
4333          IF TRUNC(c_route_rec.start_date_active) > p_start_date_time THEN
4334 
4335             Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_TSK_STDT_ROUT_STDT');
4336             Fnd_Message.Set_Token('TASK_NUMBER', p_visit_task_number);
4337             Fnd_Msg_Pub.ADD;
4338 
4339          END IF;
4340 
4341          IF TRUNC(c_route_rec.end_date_active) IS NOT NULL THEN
4342             IF TRUNC(c_route_rec.end_date_active) < p_end_date_time THEN
4343 
4344                Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_TSK_ENDT_ROUT_ENDT');
4345                Fnd_Message.Set_Token('TASK_NUMBER', p_visit_task_number);
4346                Fnd_Msg_Pub.ADD;
4347 
4348             END IF;
4349          END IF;
4350 
4351       ELSE  -- Else of c_route%FOUND check
4352 
4353          CLOSE c_route;
4354 
4355          Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_TSK_NO_ROUTE');
4356          Fnd_Message.Set_Token('TASK_NUMBER', p_visit_task_number);
4357          Fnd_Msg_Pub.ADD;
4358 
4359       END IF; -- End of c_route%FOUND check
4360 
4361      -- If the tasks associated to MR Route Id have an expired MR Id
4362      -- then it cannot be pushed into Production Planning.
4363      OPEN c_mr_header (p_mr_route_id);
4364      FETCH c_mr_header INTO c_mr_header_rec;
4365 
4366      IF c_mr_header%FOUND THEN
4367         CLOSE c_mr_header;
4368 
4369         IF (l_log_statement >= l_log_current_level) THEN
4370            fnd_log.string(l_log_statement,
4371                           L_DEBUG_KEY,
4372                           'Checking MR Start and End Dates');
4373         END IF;
4374 
4375         IF TRUNC(c_mr_header_rec.effective_from) > p_start_date_time THEN
4376            Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_NO_TS_SD_LT_MR');
4377            Fnd_Message.Set_Token('TASK_NUMBER', p_visit_task_number);
4378            Fnd_Msg_Pub.ADD;
4379 
4380         END IF;
4381         IF TRUNC(c_mr_header_rec.effective_to) IS NOT NULL THEN
4382            IF TRUNC(c_mr_header_rec.effective_to) < p_end_date_time THEN
4383 
4384               Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_NO_TS_ED_GT_MR');
4385               Fnd_Message.Set_Token('TASK_NUMBER', p_visit_task_number);
4386               Fnd_Msg_Pub.ADD;
4387 
4388            END IF;
4389         END IF;
4390 
4391      ELSE -- Else for c_mr_header%FOUND check
4392        CLOSE c_mr_header;
4393 
4394        Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_NO_MR_ID');
4395        Fnd_Message.Set_Token('TASK_NUMBER', p_visit_task_number);
4396        Fnd_Msg_Pub.ADD;
4397 
4398       END IF; -- End of c_mr_header%FOUND check
4399    END IF; -- End of p_mr_route_id IS NOT NULL check
4400 
4401    ---------------------------End of API Body---------------------------------------
4402    IF (l_log_procedure >= l_log_current_level) THEN
4403       fnd_log.string(l_log_procedure,
4404                      L_DEBUG_KEY ||'.end',
4405                      'At the end of PL SQL procedure.');
4406    END IF;
4407 
4408 END Validate_MR_Route_Date;
4409 
4410 --------------------------------------------------------------------
4411 -- PROCEDURE
4412 --    Validate_Before_Production
4413 --
4414 -- PURPOSE
4415 --    To validate Visit and all its Tasks before the push to production
4416 --------------------------------------------------------------------
4417 PROCEDURE Validate_Before_Production
4418   (
4419    p_api_version       IN         NUMBER,
4420    p_init_msg_list     IN         VARCHAR2  := Fnd_Api.g_false,
4421    p_commit            IN         VARCHAR2  := Fnd_Api.g_false,
4422    p_validation_level  IN         NUMBER    := Fnd_Api.g_valid_level_full,
4423    p_module_type       IN         VARCHAR2  := 'JSP',
4424    p_visit_id          IN         NUMBER,
4425 
4426    x_error_tbl         OUT NOCOPY Error_Tbl_Type,
4427    x_return_status     OUT NOCOPY VARCHAR2,
4428    x_msg_count         OUT NOCOPY NUMBER,
4429    x_msg_data          OUT NOCOPY VARCHAR2
4430  )
4431 IS
4432    L_API_VERSION  CONSTANT NUMBER := 1.0;
4433    L_API_NAME     CONSTANT VARCHAR2(30) := 'Validate_Before_Production';
4434    --part-chgER - sowsubra
4435    L_DEBUG_KEY    CONSTANT VARCHAR2(90) := 'ahl.plsql.'||G_PKG_NAME||'.'||L_API_NAME;
4436    l_dept_Tbl              Dept_Tbl_Type;
4437    l_error_tbl             Error_Tbl_Type;
4438    l_visit_end_time        DATE;
4439    -- l_flag               VARCHAR2(1):= 'N';
4440    l_return_status         VARCHAR2(1);
4441    l_chk_flag              VARCHAR2(1);
4442    l_check_flag            VARCHAR2(1);
4443    l_proj_task_flag        VARCHAR2(1);
4444    -- Post 11.5.10
4445    -- RROY
4446    l_hierarchy_flag        VARCHAR2(1);
4447    l_job_released_flag     VARCHAR2(1);
4448    l_task_invalid_flag     VARCHAR2(1);
4449    -- RROY
4450    l_default               VARCHAR2(30);
4451    l_temp                  VARCHAR2(2000);
4452    l_msg_data              VARCHAR2(2000);
4453    l_plan_end_hour         NUMBER;
4454    -- Post 11.5.10
4455    -- RROY
4456    l_start_from_hour       NUMBER;
4457    l_visit_task_id         NUMBER;
4458    -- RROY
4459    l_end_hour              NUMBER;
4460    l_visit_task_id         NUMBER;
4461    l_count                 NUMBER;
4462    l_msg_count             NUMBER :=0;
4463    l_data                  VARCHAR2(2000);
4464    l_count1                NUMBER;
4465    l_count2                NUMBER;
4466    i                       NUMBER:=0;
4467    j                       NUMBER:=0;
4468    x                       NUMBER:=0;
4469    l_dept_flag             VARCHAR2(1):= 'N';
4470    l_dept                  NUMBER;
4471    l_dummy_i               NUMBER;
4472    l_val_task_tbl          AHL_VWP_RULES_PVT.Task_Tbl_Type; --SKPATHAK :: VWPE
4473    l_plan_date_flag        VARCHAR2(1):= 'N'; -- SOSAHNI :: BUG 16061401 :: FP base bug :: 12929344 :: 10/01/2013  :: Flag to check if plan date is missing
4474 
4475    -- To find visit related information
4476    -- Added where condition for checking DELETED status in 11.5.10
4477    -- PRAKKUM :: VWPE: ER:12673125  :: 23-JUN-2011 :: Upgrade Changes
4478    CURSOR c_visit (x_id IN NUMBER) IS
4479     SELECT AHL_VISITS_VL.*,AHL_VWP_VISITS_PVT.Is_Old_Visit(VISIT_ID) IS_OLD_VISIT FROM AHL_VISITS_VL
4480     WHERE VISIT_ID = x_id
4481     AND NVL(STATUS_CODE,'X') <> 'DELETED';
4482    c_visit_rec c_visit%ROWTYPE;
4483 
4484    -- To find visit dept has any dept shifts
4485     CURSOR c_dept (x_id IN NUMBER) IS
4486     SELECT COUNT(*) FROM AHL_DEPARTMENT_SHIFTS
4487     WHERE DEPARTMENT_ID = x_id;
4488 
4489 /* Begin Changes by Shkalyan */
4490    -- To find task related information
4491    -- Added where condition for checking DELETED status in 11.5.10
4492    /* MANESING::Component Maintenance Planning Project, 07-Aug-2011, added visit task CLOSED status
4493     * in cursor query to prevent fetching tasks that are Closed due to Repair Batch closure.
4494     */
4495    CURSOR c_task (x_visit_id IN NUMBER) IS
4496     SELECT * FROM AHL_VISIT_TASKS_VL
4497     WHERE VISIT_ID = x_visit_id
4498          AND NVL(STATUS_CODE,'X') not in ('DELETED','RELEASED','CLOSED')
4499     AND (TASK_TYPE_CODE <> 'SUMMARY' OR
4500           (TASK_TYPE_CODE = 'SUMMARY' AND
4501             MR_ID IS NOT NULL));
4502 /* End Changes by Shkalyan */
4503    c_task_rec c_task%ROWTYPE;
4504 
4505   -- VWP11.5.10 Enhancements
4506   -- To find whether any visit which is in a primaryplan has any simulation plans
4507    CURSOR c_simulation (x_id IN NUMBER) IS
4508     SELECT COUNT(*) FROM AHL_SIMULATION_PLANS_VL
4509     WHERE SIMULATION_PLAN_ID = x_id
4510     AND PRIMARY_PLAN_FLAG = 'Y';
4511 
4512 -- AnRaj: Following two cursors have been changed due to  performnace issues
4513 -- Bug Number 4919291
4514   -- To find MR header related information
4515  /*  CURSOR c_mr_header (x_id IN NUMBER) IS
4516       SELECT T1.* FROM AHL_MR_HEADERS_APP_V T1, AHL_MR_ROUTES_V T2
4517         WHERE T1.MR_HEADER_ID = T2.MR_HEADER_ID
4518         AND T2.MR_ROUTE_ID = x_id;
4519 */
4520 
4521 -- yazhou 02-Jun-2006 starts
4522 -- bug fix#5209826
4523 /*
4524   CURSOR c_mr_header (x_id IN NUMBER) IS
4525     SELECT   T1.EFFECTIVE_FROM,T1.EFFECTIVE_TO
4526     FROM     AHL_MR_HEADERS_APP_V T1, AHL_MR_ROUTES_V T2
4527     WHERE    T1.MR_HEADER_ID = T2.MR_HEADER_ID
4528     AND      T2.MR_ROUTE_ID = x_id;
4529 */
4530   CURSOR c_mr_header (x_id IN NUMBER) IS
4531      SELECT T1.EFFECTIVE_FROM,T1.EFFECTIVE_TO
4532      FROM ahl_mr_headers_app_v T1, AHL_MR_ROUTES_V T2
4533      WHERE T1.mr_status_code = 'COMPLETE' AND
4534            trunc(T1.effective_from) <= trunc(sysdate) AND
4535            trunc(nvl(T1.effective_to,sysdate)) >= trunc(sysdate) AND
4536            T2.MR_ROUTE_ID = x_id  AND
4537            T1.MR_HEADER_ID = T2.MR_HEADER_ID AND
4538            T1.version_number = (select max(version_number)
4539                              from ahl_mr_headers_app_v mr1
4540                              where mr1.title = T1.title
4541                              and mr1.mr_status_code = 'COMPLETE'
4542                              and trunc(effective_from) <= trunc(sysdate) AND
4543                              trunc(nvl(effective_to,sysdate)) >= trunc(sysdate));
4544 
4545 -- yazhou 02-Jun-2006 ends
4546 
4547    c_mr_header_rec c_mr_header%ROWTYPE;
4548 
4549   -- To find route related information
4550   /* CURSOR c_route (x_id IN NUMBER) IS
4551       SELECT T1.* FROM AHL_ROUTES_APP_V T1, AHL_MR_ROUTES_V T2
4552         WHERE T1.ROUTE_ID = T2.ROUTE_ID
4553         AND T2.MR_ROUTE_ID = x_id
4554         AND T1.REVISION_STATUS_CODE = 'COMPLETE';
4555   */
4556   CURSOR c_route (x_id IN NUMBER) IS
4557     SELECT   T1.START_DATE_ACTIVE,T1.END_DATE_ACTIVE
4558     FROM     AHL_ROUTES_APP_V T1, AHL_MR_ROUTES_V T2
4559     WHERE    T1.ROUTE_ID = T2.ROUTE_ID
4560     AND      T2.MR_ROUTE_ID = x_id
4561     AND      T1.REVISION_STATUS_CODE = 'COMPLETE';
4562    c_route_rec c_route%ROWTYPE;
4563   -- End of Fix for 4919291
4564 
4565     -- To find only those routes which are there in tasks table but not in route table for a visit
4566     -- Added where condition for checking DELETED status in 11.5.10
4567     /* MANESING::Component Maintenance Planning Project, 07-Aug-2011, added visit task CLOSED status
4568      * in cursor query to prevent fetching tasks that are Closed due to Repair Batch closure.
4569      */
4570     CURSOR c_route_chk (x_id IN NUMBER) IS
4571      SELECT VT.MR_ROUTE_ID
4572      FROM AHL_VISIT_TASKS_B VT
4573      WHERE VT.VISIT_ID = x_id
4574            AND NVL(STATUS_CODE,'X') not in ('DELETED','RELEASED','CLOSED')
4575        AND VT.MR_Route_ID IS NOT NULL
4576        AND NOT EXISTS (
4577        SELECT 1
4578         FROM AHL_MR_ROUTES T1, AHL_ROUTES_APP_V T2, AHL_MR_HEADERS_APP_V B
4579         WHERE T1.MR_ROUTE_ID = VT.MR_ROUTE_ID
4580           AND T1.MR_HEADER_ID = B.MR_HEADER_ID
4581           AND T1.ROUTE_ID = T2.ROUTE_ID
4582           AND T2.REVISION_STATUS_CODE = 'COMPLETE');
4583     c_route_chk_rec c_route_chk%ROWTYPE;
4584 
4585     -- To find visit task id for the non-summary tasks which have no MR Routes
4586     -- Added where condition for checking DELETED status in 11.5.10
4587     /* MANESING::Component Maintenance Planning Project, 07-Aug-2011, added visit task CLOSED status
4588      * in cursor query to prevent fetching tasks that are Closed due to Repair Batch closure.
4589      */
4590     CURSOR c_route_tsk (x_id IN NUMBER) IS
4591        SELECT VISIT_TASK_ID, VISIT_TASK_NUMBER FROM AHL_VISIT_TASKS_B
4592            WHERE VISIT_ID = x_id
4593                        AND NVL(STATUS_CODE,'X') not in ('DELETED','RELEASED','CLOSED')
4594            AND MR_Route_ID IS NULL
4595            AND TASK_TYPE_CODE <> 'SUMMARY';
4596 
4597 /* commented out for bug fix 4081044
4598  yazhou 03-Jan-2005
4599  -- To find count for Item and MR Header ID
4600    CURSOR c_check (x_item_id IN NUMBER, x_mr_route_id IN NUMBER) IS
4601       SELECT count(*) FROM Ahl_MR_Items_V T1, AHL_MR_ROUTES_APP_V T2
4602          WHERE T1.Inventory_Item_ID = x_item_id
4603          AND T1.MR_HEADER_ID = T2.MR_HEADER_ID
4604          AND MR_ROUTE_ID = x_mr_route_id;
4605 */
4606 
4607    -- To find all departments from a visit's tasks table
4608    -- Added where condition for checking DELETED status in 11.5.10
4609    /* MANESING::Component Maintenance Planning Project, 07-Aug-2011, added visit task CLOSED status
4610     * in cursor query to prevent fetching tasks that are Closed due to Repair Batch closure.
4611     */
4612    CURSOR c_dept_task (x_id IN NUMBER) IS
4613     SELECT DEPARTMENT_ID FROM AHL_VISIT_TASKS_B
4614       WHERE VISIT_ID = x_id
4615             AND NVL(STATUS_CODE,'X') not in ('DELETED','RELEASED','CLOSED')
4616     AND DEPARTMENT_ID IS NOT NULL;
4617     c_dept_task_rec c_dept_task%ROWTYPE;
4618 
4619    -- To find all departments from a visit's tasks table
4620    -- Added where condition for checking DELETED status in 11.5.10
4621    /* MANESING::Component Maintenance Planning Project, 07-Aug-2011, added visit task CLOSED status
4622     * in cursor query to prevent fetching tasks that are Closed due to Repair Batch closure.
4623     */
4624    CURSOR c_dept_tsk (x_id IN NUMBER) IS
4625     SELECT DEPARTMENT_ID, VISIT_TASK_NUMBER FROM AHL_VISIT_TASKS_B
4626      WHERE VISIT_ID = x_id
4627           AND NVL(STATUS_CODE,'X') not in ('DELETED','RELEASED','CLOSED')
4628     AND DEPARTMENT_ID IS NOT NULL;
4629     c_dept_tsk_rec c_dept_tsk%ROWTYPE;
4630 
4631     /*sowsubra - part-chgER - 18 July, 2007 - start*/
4632    CURSOR c_get_inst_item (c_instance_id IN NUMBER) IS
4633     SELECT INVENTORY_ITEM_ID, INSTANCE_NUMBER FROM CSI_ITEM_INSTANCES
4634     WHERE  instance_id = c_instance_id;
4635 
4636    c_inst_item_rec    c_get_inst_item%ROWTYPE;
4637    /*sowsubra - part-chgER - end*/
4638 
4639  -- To find out if the item instances associated to a visit or task is still active
4640  -- CURSOR c_serial (p_serial_id IN NUMBER, p_item_id IN NUMBER, p_org_id IN NUMBER) IS
4641  -- part-chgER - changed the name of the cusror.
4642   CURSOR c_instance (c_instance_id IN NUMBER, c_item_id IN NUMBER, c_org_id IN NUMBER) IS
4643     SELECT count(*)FROM CSI_ITEM_INSTANCES
4644       WHERE Instance_Id  = c_instance_id
4645     AND Inventory_Item_Id = c_item_id
4646     AND Inv_Master_Organization_Id = c_org_id
4647     AND ACTIVE_START_DATE <= sysdate
4648     AND (ACTIVE_END_DATE >= sysdate OR ACTIVE_END_DATE IS NULL);
4649 
4650 -- RROY
4651 
4652  -- bug fix 4077103 -yazhou
4653  -- To check the current status of the Unit
4654    CURSOR c_uc_status (p_instance_id IN NUMBER) IS
4655     SELECT name, AHL_UTIL_UC_PKG.GET_UC_STATUS_CODE(UNIT_CONFIG_HEADER_ID) uc_status
4656     FROM  ahl_unit_config_headers uc,
4657           csi_item_instances csis
4658     WHERE uc.csi_item_instance_id=csis.instance_id
4659     AND (uc.active_end_date IS NULL OR uc.active_end_date > SYSDATE)
4660     AND csis.instance_id = p_instance_id;
4661 
4662     c_uc_status_rec c_uc_status%ROWTYPE;
4663     -- SKPATHAK :: ER:12730539 :: 01-AUG-2011
4664     CURSOR get_task_status (c_task_id IN NUMBER) IS
4665       SELECT status_code FROM ahl_visit_tasks_b
4666       WHERE visit_task_id = c_task_id;
4667     l_task_status       VARCHAR2(30);
4668 
4669 BEGIN
4670    --------------------- initialize -----------------------
4671    SAVEPOINT Validate_Before_Production;
4672 
4673    IF (l_log_procedure >= l_log_current_level) THEN
4674       fnd_log.string(l_log_procedure,
4675                      L_DEBUG_KEY ||'.begin',
4676                      'At the start of PL SQL procedure. Visit Id = ' || p_visit_id);
4677    END IF;
4678 
4679    -- Initialize message list if p_init_msg_list is set to TRUE.
4680    IF Fnd_Api.to_boolean(p_init_msg_list) THEN
4681       Fnd_Msg_Pub.initialize;
4682    END IF;
4683 
4684    --  Initialize API return status to success
4685    x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
4686 
4687    -- Standard call to check for call compatibility.
4688    IF NOT Fnd_Api.COMPATIBLE_API_CALL(l_api_version,
4689                                       p_api_version,
4690                                       l_api_name,G_PKG_NAME) THEN
4691       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4692    END IF;
4693 
4694    OPEN c_visit (p_visit_id);
4695    FETCH c_visit INTO c_visit_rec;
4696    CLOSE c_visit;
4697 
4698    -- SKPATHAK :: 02-MAY-2011 :: VWPE: ER:12424063
4699    -- If the visit does not have visit type associated to it, an error should be thrown
4700    -- Errored only if visit is not an old visit -- PRAKKUM :: VWPE: ER:12673125  :: 23-JUN-2011 :: Upgrade Changes
4701    IF c_visit_rec.visit_type_code IS NULL AND c_visit_rec.IS_OLD_VISIT <> 'Y' THEN
4702       Fnd_Message.SET_NAME('AHL','AHL_VWP_VISIT_TYPE_MAND');
4703       Fnd_Message.Set_Token('VISIT_NUMBER', c_visit_rec.VISIT_NUMBER);
4704       Fnd_Msg_Pub.ADD;
4705    END IF;
4706 
4707    -- To check if the unit is quarantined
4708    -- AnRaj added for R 12.0 ACL changes in VWP, Start
4709    check_unit_quarantined(p_visit_id,c_visit_rec.Item_Instance_Id);
4710    -- AnRaj added for R 12.0 ACL changes in VWP, End
4711    IF c_visit_rec.TEMPLATE_FLAG = 'N' THEN
4712    -- To check visit's start date is not null
4713       IF c_visit_rec.START_DATE_TIME IS NULL THEN
4714          IF (l_log_statement >= l_log_current_level) THEN
4715             fnd_log.string(l_log_statement,
4716                            L_DEBUG_KEY,
4717                            'Visit Start Date is null.');
4718          END IF;
4719          -- By shbhanda 05/21/04 for TC changes
4720          Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_NO_ST_DATE');
4721          Fnd_Message.Set_Token('VISIT_NUMBER', c_visit_rec.VISIT_NUMBER);
4722          Fnd_Msg_Pub.ADD;
4723       END IF;
4724 
4725      -- To check visit's status is not null and it should be only planning or partially released
4726      IF c_visit_rec.STATUS_CODE IS NOT NULL THEN
4727         -- SKPATHAK :: 02-MAY-2011 :: VWPE: ER:12424063  :: Consider the new status DRAFT as well
4728         IF ((c_visit_rec.STATUS_CODE NOT IN ('PLANNING', 'PARTIALLY RELEASED', 'DRAFT'))
4729         OR (c_visit_rec.STATUS_CODE = 'DRAFT' and p_module_type NOT IN ('CST','VWP'))) THEN
4730            IF (l_log_statement >= l_log_current_level) THEN
4731               fnd_log.string(l_log_statement,
4732                              L_DEBUG_KEY,
4733                              'Visit Status Code is not Planning/Partially Released.');
4734            END IF;
4735            Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_NOT_PLANNING'); -- **** IMPortant uPDATE FOR PARTIALLY RELEASED
4736            Fnd_Message.Set_Token('VISIT_NUMBER', c_visit_rec.VISIT_NUMBER);
4737            Fnd_Msg_Pub.ADD;
4738            /* l_temp := 'ERROR: Visit Number ' || c_visit_rec.VISIT_NUMBER || ' : Status Code is not Planning or Partially Released' ;
4739            l_error_tbl(j).Msg_Index := j;
4740            l_error_tbl(j).Msg_Data  := l_temp;
4741            j := j + 1;*/
4742 
4743         --VWPE :: tchimira :: 15-FEB -2011 :: start
4744         --As a part of the VWPE Enhancement, we need to allow the user to P2P a past dated visit that is in Planning status. For this, we need --to remove the below check.Commenting for the same.
4745         /*ELSIF TRUNC(c_visit_rec.start_date_time) < TRUNC(SYSDATE) AND c_visit_rec.STATUS_CODE <> 'PARTIALLY RELEASED'
4746         THEN
4747            IF (l_log_statement >= l_log_current_level) THEN
4748               fnd_log.string(l_log_statement,
4749                              L_DEBUG_KEY,
4750                              'Visit Status Code is Planning and Visit Start Date is less than sysdate. ');
4751            END IF;
4752            Fnd_Message.SET_NAME('AHL','AHL_VWP_START_DATE_LT_SYS');
4753            Fnd_Message.Set_Token('VISIT_NUMBER', c_visit_rec.VISIT_NUMBER);
4754            Fnd_Msg_Pub.ADD;
4755            /* l_error_tbl(j).Msg_Index := j;
4756            l_error_tbl(j).Msg_Data  := REPLACE(FND_MESSAGE.GET_STRING(APPIN => 'AHL',
4757            NAMEIN => 'AHL_VWP_START_DATE_LT_SYS')
4758            ,'VISIT_NUMBER',c_visit_rec.VISIT_NUMBER);
4759            j := j + 1; */
4760         --VWPE :: tchimira :: 15-FEB -2011 :: end
4761         END IF;
4762      -- visit's status is null
4763      ELSE
4764         IF (l_log_statement >= l_log_current_level) THEN
4765            fnd_log.string(l_log_statement,
4766                           L_DEBUG_KEY,
4767                           'Visit Status Code is null.');
4768         END IF;
4769         Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_NO_STATUS');
4770         Fnd_Message.Set_Token('VISIT_NUMBER', c_visit_rec.VISIT_NUMBER);
4771         Fnd_Msg_Pub.ADD;
4772 
4773         /*l_temp := 'ERROR: Visit Number ' || c_visit_rec.VISIT_NUMBER || ' : Status Code Missing' ;
4774         l_error_tbl(j).Msg_Index := j;
4775         l_error_tbl(j).Msg_Data  := l_temp;
4776         j := j + 1; */
4777      END IF;
4778 
4779      -- To check visit's organization is not null
4780      IF c_visit_rec.ORGANIZATION_ID IS NULL THEN
4781         IF (l_log_statement >= l_log_current_level) THEN
4782            fnd_log.string(l_log_statement,
4783                           L_DEBUG_KEY,
4784                           'Visit Organization is null.');
4785         END IF;
4786 
4787         Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_NO_ORG');
4788         Fnd_Message.Set_Token('VISIT_NUMBER', c_visit_rec.VISIT_NUMBER);
4789         Fnd_Msg_Pub.ADD;
4790 
4791         /* l_temp := 'ERROR: Visit Number ' || c_visit_rec.VISIT_NUMBER || ' : Organization Missing' ;
4792         l_error_tbl(j).Msg_Index := j;
4793         l_error_tbl(j).Msg_Data  := l_temp;
4794         j := j + 1; */
4795      END IF;
4796 
4797      -- To check visit's department is not null
4798      IF c_visit_rec.DEPARTMENT_ID IS NULL THEN
4799         IF (l_log_statement >= l_log_current_level) THEN
4800            fnd_log.string(l_log_statement,
4801                           L_DEBUG_KEY,
4802                           'Visit Department is null.');
4803         END IF;
4804 
4805         Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_NO_DEPT');
4806         Fnd_Message.Set_Token('VISIT_NUMBER', c_visit_rec.VISIT_NUMBER);
4807         Fnd_Msg_Pub.ADD;
4808 
4809         /* l_temp := 'ERROR: Visit Number ' || c_visit_rec.VISIT_NUMBER || ' : Department Missing';
4810         l_error_tbl(j).Msg_Index := j;
4811         l_error_tbl(j).Msg_Data  := l_temp;
4812         j := j + 1; */
4813      END IF;
4814 
4815      -- Start by shbhanda on 29-Jan-04
4816      -- To check visit's close date time i.e planned end date is not null
4817      IF c_visit_rec.CLOSE_DATE_TIME IS NULL AND p_module_type = 'CST' THEN -- SOSAHNI :: BUG 16061401 :: FP base bug 12929344 :: 10/01/2013  :: Added a p_module_type condition to check if action is 'Plan Visit' or 'Validate'
4818         IF (l_log_statement >= l_log_current_level) THEN
4819            fnd_log.string(l_log_statement,
4820                           L_DEBUG_KEY,
4821                           'Visit Plan End Date is null.');
4822         END IF;
4823 
4824         Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_NO_PLN_END_DT');
4825         Fnd_Message.Set_Token('VISIT_NUMBER', c_visit_rec.VISIT_NUMBER);
4826         Fnd_Msg_Pub.ADD;
4827 
4828         /* l_temp := 'ERROR: Visit Number ' || c_visit_rec.VISIT_NUMBER || ' : Planned end date missing' ;
4829         l_error_tbl(j).Msg_Index := j;
4830         l_error_tbl(j).Msg_Data  := l_temp;
4831         j := j + 1; */
4832 
4833         l_plan_date_flag:= 'Y'; -- SOSAHNI :: BUG 16061401 :: FP base bug 12929344 :: 10/01/2013  :: Set flag to mark error is shown to avoid further display of error message
4834      END IF;
4835      -- End by shbhanda on 29-Jan-04
4836 
4837      -- SOSAHNI :: BUG 16061401 :: FP base bug 12929344 :: 10/01/2013 :: Added a p_module_type condition to check if action is 'PushToProduction'. Then only this error message is printed - start
4838      IF c_visit_rec.close_date_time IS NULL AND p_module_type = 'OAF' THEN
4839         IF (l_log_statement >= l_log_current_level) THEN
4840            fnd_log.string(l_log_statement,
4841                           L_DEBUG_KEY,
4842                           'Visit Plan End Date is needed for p2p.');
4843         END IF;
4844 
4845         Fnd_Message.SET_NAME('AHL','AHL_VWP_PLN_END_DATE_NULL');
4846         Fnd_Message.Set_Token('VISIT_NUMBER', c_visit_rec.VISIT_NUMBER);
4847         Fnd_Msg_Pub.ADD;
4848 
4849         /* l_temp := 'ERROR: Visit Number ' || c_visit_rec.VISIT_NUMBER || ' : Planned end date missing' ;
4850         l_error_tbl(j).Msg_Index := j;
4851         l_error_tbl(j).Msg_Data  := l_temp;
4852         j := j + 1; */
4853 
4854         l_plan_date_flag:= 'Y';
4855      END IF;
4856      -- End by SOSAHNI on 10/01/2013 for BUG 16061401 :: FP base bug 12929344
4857 
4858      -- To check visit's simulation plan lies in primary plan
4859      IF c_visit_rec.SIMULATION_PLAN_ID IS NOT NULL THEN
4860         OPEN c_simulation (c_visit_rec.SIMULATION_PLAN_ID);
4861         FETCH c_simulation INTO l_count;
4862         CLOSE c_simulation;
4863         IF l_count = 0 THEN
4864            IF (l_log_statement >= l_log_current_level) THEN
4865               fnd_log.string(l_log_statement,
4866                              L_DEBUG_KEY,
4867                              'Visit has 0 Simulations.');
4868            END IF;
4869 
4870            Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_NO_PRIM_PLAN');
4871            Fnd_Message.Set_Token('VISIT_NUMBER', c_visit_rec.VISIT_NUMBER);
4872            Fnd_Msg_Pub.ADD;
4873         END IF;
4874      END IF;
4875 
4876      --sowsubra FP:Bug#5758829
4877      /*When the visit type code is not null, then validate the type code to see if
4878      the visit type is enabled and not end-dated.*/
4879      IF c_visit_rec.visit_type_code IS NOT NULL THEN
4880         IF (l_log_statement >= l_log_current_level) THEN
4881            fnd_log.string(l_log_statement,
4882                           L_DEBUG_KEY,
4883                           'Before calling AHL_VWP_RULES_PVT.CHECK_LOOKUP_NAME_OR_ID.');
4884         END IF;
4885 
4886         AHL_VWP_RULES_PVT.CHECK_LOOKUP_NAME_OR_ID (
4887              p_lookup_type  => 'AHL_PLANNING_VISIT_TYPE',
4888              p_lookup_code  => trim(c_visit_rec.visit_type_code),
4889              p_meaning      => NULL,
4890              p_check_id_flag => 'Y',
4891              x_lookup_code   => c_visit_rec.visit_type_code,
4892              x_return_status => l_return_status);
4893 
4894         IF (l_log_statement >= l_log_current_level) THEN
4895            fnd_log.string(l_log_statement,
4896                           L_DEBUG_KEY,
4897                           'After calling AHL_VWP_RULES_PVT.CHECK_LOOKUP_NAME_OR_ID.');
4898         END IF;
4899 
4900         IF NVL(l_return_status, 'X') <> 'S' THEN
4901            Fnd_Message.SET_NAME('AHL','AHL_VWP_TYPE_CODE_NOT_EXISTS');
4902            Fnd_Msg_Pub.ADD;
4903            RAISE Fnd_Api.G_EXC_ERROR;
4904         END IF;
4905      END IF;
4906 
4907      /*sowsubra - part-chgER - 18 July, 2007- start*/
4908      -- only when unit is associated with the visit then check if the item-instance
4909      IF (c_visit_rec.item_instance_id IS NOT NULL) THEN
4910        OPEN c_get_inst_item(c_visit_rec.item_instance_id);
4911        FETCH c_get_inst_item INTO c_inst_item_rec;
4912        CLOSE c_get_inst_item;
4913 
4914        IF (l_log_statement >= l_log_current_level) THEN
4915           fnd_log.string(l_log_statement,
4916                          L_DEBUG_KEY,
4917                          'Item Id from csi instances = ' || c_inst_item_rec.inventory_item_id);
4918           fnd_log.string(l_log_statement,
4919                          L_DEBUG_KEY,
4920                          'Instance number from csi instances = ' || c_inst_item_rec.instance_number);
4921           fnd_log.string(l_log_statement,
4922                          L_DEBUG_KEY,
4923                          'Visit Item Id = ' || c_visit_rec.Inventory_Item_Id);
4924        END IF;
4925 
4926        IF c_inst_item_rec.inventory_item_id = c_visit_rec.Inventory_Item_Id THEN
4927           /*sowsubra - part-chgER - end*/
4928           -- To check visit must be associated to an Active Item Instance.
4929           -- To find out if the item instances associated to the visit is still active
4930           IF c_visit_rec.Item_Instance_Id IS NOT NULL THEN
4931               OPEN c_instance (c_visit_rec.Item_Instance_Id, c_visit_rec.Inventory_Item_Id, c_visit_rec.Item_Organization_Id);
4932               FETCH c_instance INTO l_count;
4933               CLOSE c_instance;
4934               IF l_count = 0 THEN
4935 
4936                  Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_INST_NO_ACTIVE');
4937                  Fnd_Message.Set_Token('VISIT_NUMBER', c_visit_rec.VISIT_NUMBER);
4938                  Fnd_Msg_Pub.ADD;
4939               END IF;
4940           END IF;
4941        ELSE
4942           -- SKPATHAK :: Bug 8312388 :: 07-MAY-2009
4943           -- Earlier the error AHL_VWP_VST_INST_ITM_CHNGD was thrown if
4944           -- c_inst_item_rec.inventory_item_id and c_visit_rec.Inventory_Item_Id were
4945           -- not the same. This check has now been removed.
4946           IF (l_log_statement >= l_log_current_level) THEN
4947             fnd_log.string(l_log_statement, L_DEBUG_KEY,
4948                            'Visit Instance has undergone part number change.');
4949           END IF;
4950        END IF;
4951    END IF; --c_visit_rec.item_instance_id IS NOT NULL
4952 
4953    -- bug fix 4077103 -yazhou
4954    -- To check visit must be associated to an Active Unit.
4955    -- Also the unit must be in Complete or Incomplete status
4956    IF c_visit_rec.Item_Instance_Id IS NOT NULL THEN
4957        OPEN c_uc_status (c_visit_rec.Item_Instance_Id);
4958        FETCH c_uc_status INTO c_uc_status_rec;
4959        CLOSE c_uc_status;
4960 
4961          IF c_uc_status_rec.uc_status not in ('COMPLETE','INCOMPLETE') THEN
4962 
4963             IF (l_log_statement >= l_log_current_level) THEN
4964                fnd_log.string(l_log_statement,
4965                               L_DEBUG_KEY,
4966                               c_uc_status_rec.name || ' UC status is invalid: '|| c_uc_status_rec.uc_status);
4967             END IF;
4968 
4969             Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_INVALID_UC');
4970             Fnd_Message.Set_Token('VISIT_NUMBER', c_visit_rec.VISIT_NUMBER);
4971             Fnd_Message.Set_Token('UNIT_NAME', c_uc_status_rec.name);
4972             Fnd_Msg_Pub.ADD;
4973          END IF;
4974    END IF;
4975 
4976    -- To check tasks must be associated to Active Item Instances.
4977    -- To find out if the item instances associated to the tasks are still active
4978 
4979    OPEN c_task (p_visit_id);
4980    LOOP
4981       FETCH c_task INTO c_task_rec;
4982       EXIT WHEN c_task%NOTFOUND;
4983 
4984         /*commented out by sowsubra as a visit can be created without a unit, then the tasks
4985         present in the visit should be still validated.*/
4986         --IF c_visit_rec.Item_Instance_Id IS NOT NULL THEN
4987 
4988       /*sowsubra - part-chgER - 18 July, 2007 - start*/
4989       IF (c_task_rec.instance_id IS NOT NULL) THEN
4990          OPEN c_get_inst_item(c_task_rec.instance_id);
4991          FETCH c_get_inst_item INTO c_inst_item_rec;
4992          CLOSE c_get_inst_item;
4993 
4994          IF (l_log_statement >= l_log_current_level) THEN
4995             fnd_log.string(l_log_statement,
4996                            L_DEBUG_KEY,
4997                            'Item Id from csi instances - ' || c_inst_item_rec.inventory_item_id);
4998             fnd_log.string(l_log_statement,
4999                            L_DEBUG_KEY,
5000                            'Visit Item Id - ' || c_task_rec.Inventory_Item_Id);
5001          END IF;
5002 
5003          IF c_inst_item_rec.inventory_item_id = c_task_rec.Inventory_Item_Id THEN
5004             IF c_task_rec.INSTANCE_ID IS NOT NULL THEN
5005                OPEN c_instance (c_task_rec.INSTANCE_ID, c_task_rec.Inventory_Item_Id, c_task_rec.Item_Organization_Id);
5006                FETCH c_instance INTO l_count;
5007                CLOSE c_instance;
5008 
5009                IF l_count = 0 THEN
5010                  Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_TSK_INST_NO_ACTIVE');
5011                  Fnd_Message.Set_Token('TASK_NUMBER', c_task_rec.VISIT_TASK_NUMBER);
5012                  Fnd_Msg_Pub.ADD;
5013                END IF;
5014             END IF;
5015          ELSE
5016             -- SKPATHAK :: Bug 8312388 :: 07-MAY-2009
5017             -- Earlier the error AHL_VWP_TSK_INST_ITM_CHNGD was thrown if
5018             -- c_inst_item_rec.inventory_item_id and c_task_rec.Inventory_Item_Id were
5019             -- not the same. This check has now been removed.
5020             IF (l_log_statement >= l_log_current_level) THEN
5021               fnd_log.string(l_log_statement, L_DEBUG_KEY,
5022                              'Task Instance has undergone part number change.');
5023             END IF;
5024          END IF;
5025       END IF; -- c_task_rec.instance_id is not null
5026       /*sowsubra - part-chgER - end*/
5027    END LOOP;
5028    CLOSE c_task;
5029    --END IF; -- End for Check Instance Id presence
5030 
5031    -- NR-MR Changes - sowsubra - Begin comment
5032    /* The check for instance_in_config_tree for the visit instance is redundant since
5033      in instance_in_config_tree, the visit instance is compared against itself.*/
5034    /***
5035 
5036    -- To check visit must be associated to an Item Instance.
5037    -- To check all task's serial number are still active
5038    IF c_visit_rec.Item_Instance_Id IS NOT NULL THEN
5039 
5040        --BEGIN: jeli added for bug 3777720
5041        IF (AHL_VWP_RULES_PVT.instance_in_config_tree(p_visit_id, c_visit_rec.item_instance_id)= FND_API.G_RET_STS_ERROR) THEN
5042        --END: jeli added for bug 3777720
5043          Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_INST_NO_FOUND');
5044          Fnd_Message.Set_Token('VISIT_NUMBER',c_visit_rec.VISIT_NUMBER);
5045          Fnd_Msg_Pub.ADD;
5046        END IF;
5047    END IF;
5048 
5049    IF c_visit_rec.Item_Instance_Id IS NOT NULL THEN
5050 
5051        OPEN c_task (p_visit_id);
5052        LOOP
5053        FETCH c_task INTO c_task_rec;
5054           EXIT WHEN c_task%NOTFOUND;
5055          IF c_task_rec.INSTANCE_ID IS NOT NULL THEN
5056 --             IF l_check_flag = 'N' THEN
5057            --BEGIN: jeli added for bug 3777720
5058            IF (AHL_VWP_RULES_PVT.instance_in_config_tree(p_visit_id, c_task_rec.instance_id) = FND_API.G_RET_STS_ERROR) THEN
5059            --END: jeli added for bug 3777720
5060               Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_INST_NO_FOUND');
5061               Fnd_Message.Set_Token('VISIT_NUMBER', c_visit_rec.VISIT_NUMBER);
5062               Fnd_Msg_Pub.ADD;
5063                   END IF;
5064               END IF;
5065            END LOOP;
5066            CLOSE c_task;
5067 
5068 --   Removed for POst 11.5.10 Changes by Senthil.
5069 --     ELSE
5070 --         IF (l_log_statement >= l_log_current_level) THEN
5071 --            fnd_log.string(l_log_statement,
5072 --                          L_DEBUG_KEY,
5073 --                          'Check Visit Serial Number');
5074 --         END IF;
5075 --         l_temp := 'ERROR: Visit Number ' || c_visit_rec.VISIT_NUMBER || ' : Serial Number Missing' ;
5076 --         l_error_tbl(j).Msg_Index := j;
5077 --         l_error_tbl(j).Msg_Data  := l_temp;
5078 --              j := j + 1;
5079 
5080       END IF; -- End for Check Instance Id presence
5081       ***/
5082       -- NR-MR Changes - sowsubra - end comment
5083 
5084       -- To check visit must be associated to a Project ID
5085       -- Check for the proejct id presence in PJM_PROJECT_PARAMETER table
5086       -- Post 11.5.10
5087       -- RROY
5088       /*
5089       IF c_visit_rec.Project_Id IS NOT NULL THEN
5090           OPEN c_Project(c_visit_rec.Project_Id);
5091           FETCH c_Project INTO l_count;
5092           CLOSE c_Project;
5093           IF l_count = 0 THEN
5094               l_temp := 'ERROR: Visit Number ' || c_visit_rec.VISIT_NUMBER || ' :  This project should be included in PJM_PROJECT_PARAMETERS from PA' ;
5095               l_error_tbl(j).Msg_Index := j;
5096               l_error_tbl(j).Msg_Data  := l_temp;
5097               j := j + 1;
5098           END IF;
5099       ELSE
5100           l_temp := 'ERROR: Visit Number ' || c_visit_rec.VISIT_NUMBER || ' : No Project is associated to this Visit' ;
5101           l_error_tbl(j).Msg_Index := j;
5102           l_error_tbl(j).Msg_Data  := l_temp;
5103           j := j + 1;
5104       END IF;
5105       */
5106       -- Post 11.5.10
5107       -- RROY
5108 
5109    -- To check all routes for visit's tasks must exists
5110    IF (l_log_statement >= l_log_current_level) THEN
5111       fnd_log.string(l_log_statement,
5112                      L_DEBUG_KEY,
5113                      'Initially, FLAG = ' || l_chk_flag);
5114    END IF;
5115 
5116    OPEN c_route_chk (p_visit_id);
5117    l_chk_flag := 'N';
5118    LOOP
5119        FETCH c_route_chk INTO c_route_chk_rec;
5120        EXIT WHEN c_route_chk%NOTFOUND;
5121        IF c_route_chk%FOUND THEN
5122          l_chk_flag := 'Y';
5123        END IF;
5124    END LOOP;
5125    CLOSE c_route_chk;
5126 
5127    IF (l_log_statement >= l_log_current_level) THEN
5128       fnd_log.string(l_log_statement,
5129                      L_DEBUG_KEY,
5130                      'After Route Check, FLAG = ' || l_chk_flag);
5131    END IF;
5132 
5133    -- To check visit's department should have dept shifts defined
5134    OPEN c_dept (c_visit_rec.department_id);
5135    FETCH c_dept INTO l_count;
5136    CLOSE c_dept;
5137 
5138    -- To find if the all visit tasks dept has department shifts defined
5139    OPEN c_dept_task (p_visit_id);
5140    i:=0;
5141    LOOP
5142        FETCH c_dept_task INTO c_dept_task_rec;
5143        EXIT WHEN c_dept_task%NOTFOUND;
5144        IF c_dept_task%FOUND THEN
5145           IF (l_log_statement >= l_log_current_level) THEN
5146              fnd_log.string(l_log_statement,
5147                             L_DEBUG_KEY,
5148                             'task dept' || c_dept_task_rec.department_id);
5149           END IF;
5150           OPEN c_dept (c_dept_task_rec.department_id);
5151           FETCH c_dept INTO l_dept;
5152           l_dept_Tbl(i) := l_dept;
5153           IF (l_log_statement >= l_log_current_level) THEN
5154              fnd_log.string(l_log_statement,
5155                             L_DEBUG_KEY,
5156                             'task dept count ' || l_dept);
5157           END IF;
5158           i := i + 1;
5159           CLOSE c_dept;
5160        END IF;
5161    END LOOP;
5162    CLOSE c_dept_task;
5163 
5164    IF (l_log_statement >= l_log_current_level) THEN
5165       fnd_log.string(l_log_statement,
5166                      L_DEBUG_KEY,
5167                      'task dept table count ' || l_dept_Tbl.COUNT);
5168    END IF;
5169 
5170    IF l_dept_Tbl.COUNT > 0 THEN
5171       l_dept_flag := 'N';
5172       x := l_dept_Tbl.FIRST;
5173       LOOP
5174       IF (l_log_statement >= l_log_current_level) THEN
5175          fnd_log.string(l_log_statement,
5176                         L_DEBUG_KEY,
5177                         'task dept table values ' || l_dept_Tbl(x));
5178       END IF;
5179       IF l_dept_Tbl(x) = 0 THEN
5180          l_dept_flag := 'Y';
5181          EXIT WHEN l_dept_flag = 'Y';
5182       END IF;
5183          EXIT WHEN x = l_dept_Tbl.LAST ;
5184          x := l_dept_Tbl.NEXT(x);
5185       END LOOP;
5186    END IF;
5187 
5188       IF (c_visit_rec.START_DATE_TIME IS NOT NULL
5189           AND c_visit_rec.START_DATE_TIME <> Fnd_Api.g_miss_date)
5190           AND (c_visit_rec.DEPARTMENT_ID IS NOT NULL
5191           AND c_visit_rec.DEPARTMENT_ID <> Fnd_Api.g_miss_num)
5192           AND l_count > 0 AND l_chk_flag = 'N' AND l_dept_flag = 'N' THEN
5193 
5194          --The visit end date
5195          -- SKPATHAK :: 02-MAY-2011 :: VWPE: ER:12424063
5196          -- Validation comparing visit's calculated and planned end is no more needed, planned end date should not be null is still valid
5197          IF c_visit_rec.close_date_time IS NULL AND l_plan_date_flag = 'N' THEN -- SOSAHNI :: BUG 16061401 :: FP base bug 12929344 :: 10/01/2013  :: Added a l_plan_date_flag condition to check if plan date error was not previously found
5198             Fnd_Message.SET_NAME('AHL','AHL_VWP_PLN_END_DATE_NULL');
5199             Fnd_Message.Set_Token('VISIT_NUMBER',
5200                             c_visit_rec.VISIT_NUMBER);
5201             Fnd_Msg_Pub.ADD;
5202          END IF;
5203 
5204 
5205          -- To find any visit task if Tasks associated to a route/MR, must be associated to the item as set up in FMP
5206          OPEN c_task(p_visit_id);
5207          LOOP
5208          FETCH c_task INTO c_task_rec;
5209          EXIT WHEN c_task%NOTFOUND;
5210 
5211          IF c_task_rec.task_type_code IS NOT NULL THEN
5212             IF UPPER(c_task_rec.task_type_code) = 'PLANNED' THEN
5213                --- Changes made by VSUNDARA for Production - SR Integration
5214                IF c_task_rec.mr_route_id is null THEN
5215                   IF c_task_rec.SERVICE_REQUEST_ID is null OR c_task_rec.UNIT_EFFECTIVITY_ID is null THEN
5216                      Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_NO_SR_UE'); --***** change this
5217                      Fnd_Message.Set_Token('VISIT_NUMBER', c_visit_rec.VISIT_NUMBER);
5218                      Fnd_Msg_Pub.ADD;
5219                   END IF; --Added by jeli on 07/26/04 when merging code otherwise it couldn't pass compilation
5220                END IF; --- End Changes made by VSUNDARA for Production - SR Integration
5221             END IF;
5222          END IF;
5223 
5224          IF UPPER(c_task_rec.task_type_code) = 'UNASSOCIATED' AND c_task_rec.DURATION IS NULL THEN
5225 
5226             IF (l_log_statement >= l_log_current_level) THEN
5227                fnd_log.string(l_log_statement,
5228                               L_DEBUG_KEY,
5229                               'Unassociated Task. Task Duration is null');
5230             END IF;
5231             Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_TSK_NO_DURATION');
5232             Fnd_Message.Set_Token('TASK_NUMBER', c_task_rec.VISIT_TASK_NUMBER);
5233             Fnd_Msg_Pub.ADD;
5234          END IF; -- End for c_task_rec.task_type_code check
5235 
5236          -- To find all visit tasks must be associated to an item and item instance.
5237          IF c_task_rec.instance_id IS NULL THEN
5238             IF (l_log_statement >= l_log_current_level) THEN
5239                fnd_log.string(l_log_statement,
5240                               L_DEBUG_KEY,
5241                               'Check Task Serial');
5242             END IF;
5243             Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_TSK_NO_SERIAL');
5244             Fnd_Message.Set_Token('TASK_NUMBER', c_task_rec.VISIT_TASK_NUMBER);
5245             Fnd_Msg_Pub.ADD;
5246          END IF;
5247 
5248          IF c_task_rec.inventory_item_id IS NULL THEN
5249             IF (l_log_statement >= l_log_current_level) THEN
5250                fnd_log.string(l_log_statement,
5251                               L_DEBUG_KEY,
5252                               'Task Inventory Item is null.');
5253             END IF;
5254             Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_TSK_NO_ITEM');
5255             Fnd_Message.Set_Token('TASK_NUMBER', c_task_rec.VISIT_TASK_NUMBER);
5256             Fnd_Msg_Pub.ADD;
5257          END IF;
5258 
5259       -- Begin changes by rnahata for Bug 6448678
5260       IF (l_log_statement >= l_log_current_level) THEN
5261          fnd_log.string(l_log_statement,
5262                         L_DEBUG_KEY,
5263                         'Before calling Validate_MR_Route_Date. l_msg_count = ' || l_msg_count);
5264       END IF;
5265 
5266       -- SKPATHAK :: ER:12730539 :: 01-AUG-2011
5267       -- If the task's summary task is in partially implemented, need not validate MR and routes
5268       OPEN get_task_status (c_task_rec.originating_task_id);
5269       FETCH get_task_status INTO l_task_status;
5270       CLOSE get_task_status;
5271       IF l_task_status <> 'PARTIALLY RELEASED' THEN
5272 
5273         Validate_MR_Route_Date(
5274           p_mr_route_id       => c_task_rec.mr_route_id,
5275           p_visit_task_number => c_task_rec.visit_task_number,
5276           p_start_date_time   => sysdate,
5277           p_end_date_time     => sysdate);
5278 
5279         IF (l_log_statement >= l_log_current_level) THEN
5280            fnd_log.string(l_log_statement,
5281                           L_DEBUG_KEY,
5282                           'After calling Validate_MR_Route_Date for Task Id: ' ||
5283                           c_task_rec.visit_task_id || ' and l_msg_count = ' || l_msg_count);
5284         END IF;
5285         -- End changes by rnahata for Bug 6448678
5286       END IF;
5287 
5288       END LOOP; -- End of loop to check c_task cursor
5289       CLOSE c_task;
5290 
5291    ELSE
5292 
5293       IF c_visit_rec.DEPARTMENT_ID IS NOT NULL AND l_count = 0 THEN -- SOSAHNI :: BUG 16061392 :: FP base bug :: 12990824 :: 10/01/2013  :: Added check for Department ID not null
5294          Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_NO_DEPT_SHIFT');
5295          Fnd_Message.Set_Token('VISIT_NUMBER', c_visit_rec.VISIT_NUMBER);
5296          Fnd_Msg_Pub.ADD;
5297       END IF;
5298 
5299       IF l_chk_flag = 'Y' THEN
5300          Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_RT_EXISTS');
5301          Fnd_Message.Set_Token('VISIT_NUMBER', c_visit_rec.VISIT_NUMBER);
5302          Fnd_Msg_Pub.ADD;
5303       END IF;
5304 
5305       IF l_dept_flag = 'Y' THEN
5306          OPEN c_dept_tsk (p_visit_id);
5307          LOOP
5308             FETCH c_dept_tsk INTO c_dept_tsk_rec;
5309             EXIT WHEN c_dept_tsk%NOTFOUND;
5310             IF c_dept_tsk%FOUND THEN
5311                IF (l_log_statement >= l_log_current_level) THEN
5312                    fnd_log.string(l_log_statement,
5313                            L_DEBUG_KEY,
5314                            'Task Dept' || c_dept_tsk_rec.department_id);
5315                END IF;
5316                OPEN c_dept (c_dept_tsk_rec.department_id);
5317                FETCH c_dept INTO l_dept;
5318                IF l_dept = 0 THEN
5319                   IF (l_log_statement >= l_log_current_level) THEN
5320                      fnd_log.string(l_log_statement,
5321                                     L_DEBUG_KEY,
5322                                     'Task Dept Count ' || l_dept);
5323                   END IF;
5324                   Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_NO_DEPT_SHIFT');
5325                   Fnd_Message.Set_Token('TASK_NUMBER', c_dept_tsk_rec.VISIT_TASK_NUMBER);
5326                   Fnd_Msg_Pub.ADD;
5327                END IF;
5328                CLOSE c_dept;
5329             END IF;
5330          END LOOP;
5331          CLOSE c_dept_tsk;
5332       END IF;
5333    END IF;
5334 
5335       /* MANESING::Component Maintenance Planning Project, 05-Jul-2011
5336        * Following validation needs to be bypassed for Component Visits, else it will fail when
5337        * the Component Visit is in Planning status, and it contains only Repair Batches (summary tasks).
5338        */
5339       IF c_task_rec.visit_task_id IS NULL AND c_visit_rec.STATUS_CODE = 'PLANNING' AND
5340          AHL_CMP_UTIL_PKG.Is_Comp_Visit (c_visit_rec.visit_id) = 'N' THEN
5341 
5342          IF (l_log_statement >= l_log_current_level) THEN
5343             fnd_log.string(l_log_statement,
5344                            L_DEBUG_KEY,
5345                            'No Task Found for the Visit');
5346          END IF;
5347 
5348          Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_TASK_NULL');
5349          Fnd_Message.Set_Token('VISIT_NUMBER', c_visit_rec.VISIT_NUMBER);
5350          Fnd_Msg_Pub.ADD;
5351 
5352       END IF;
5353    END IF;
5354 
5355    -- SKPATHAK :: ER:12730539 :: 01-AUG-2011 :: START :: Validate Return to Supply Flags
5356    IF (l_log_statement >= l_log_current_level) THEN
5357       fnd_log.string(l_log_statement,
5358                      L_DEBUG_KEY,
5359                      'Before Calling AHL_VWP_RULES_PVT.Validate_Return_To_Supply. p_visit_id = ' || p_visit_id );
5360    END IF;
5361 
5362    IF (p_visit_id IS NOT NULL AND p_module_type NOT IN ('CST','TSK','MR')) THEN
5363 
5364        AHL_VWP_RULES_PVT.Validate_Return_To_Supply
5365        (
5366          p_api_version           => 1.0,
5367          p_init_msg_list         => FND_API.G_FALSE,
5368          p_commit                => FND_API.G_FALSE,
5369          p_validation_level      => FND_API.G_VALID_LEVEL_FULL,
5370          p_module_type           => 'VST',
5371          p_visit_id              => p_visit_id,
5372          p_tasks_tbl             => l_val_task_tbl,
5373          x_return_status         => l_return_status,
5374          x_msg_count             => l_msg_count,
5375          x_msg_data              => l_msg_data
5376       );
5377 
5378       IF (l_log_statement >= l_log_current_level) THEN
5379          fnd_log.string(l_log_statement,
5380                         L_DEBUG_KEY,
5381                         'After Calling AHL_VWP_RULES_PVT.Validate_Return_To_Supply. Return Status = ' || l_return_status );
5382       END IF;
5383 
5384       IF l_return_status <> 'S' THEN
5385         -- SOSAHNI :: BUG 16089769 :: FP base bug 14098719 :: 10/01/2013 :: Added a loop to include all error messages in error table for showing error message on UI - Start
5386         /*l_error_tbl(1).Msg_Index := 1;
5387         l_error_tbl(1).Msg_Data  := l_msg_data;*/
5388 
5389         j := 1;
5390         l_msg_count := Fnd_Msg_Pub.count_msg;
5391         FOR i IN 1..l_msg_count LOOP
5392           FND_MSG_PUB.get (
5393                 p_msg_index      => i,
5394                 p_encoded        => FND_API.G_FALSE,
5395                 p_data           => x_msg_data,
5396                 p_msg_index_out  => x_msg_count);
5397           l_error_tbl(j).Msg_Index := j;
5398           l_error_tbl(j).Msg_Data  := x_msg_data;
5399           j := j + 1;
5400         END LOOP;
5401         -- End by SOSAHNI on 10/01/2013 for BUG 16089769 :: FP base bug 14098719
5402         x_error_tbl :=  l_error_tbl;
5403         RAISE Fnd_Api.g_exc_error;
5404       END IF;
5405 
5406    END IF;
5407    -- SKPATHAK :: ER:12730539 :: 01-AUG-2011 :: END
5408 
5409    l_msg_count := Fnd_Msg_Pub.count_msg;
5410 
5411    IF (l_log_statement >= l_log_current_level) THEN
5412       fnd_log.string(l_log_statement,
5413                      L_DEBUG_KEY,
5414                      'After calling *count_msg* l_count = ' || l_msg_count);
5415       fnd_log.string(l_log_statement,
5416                      L_DEBUG_KEY,
5417                      'Start calling Fnd_Msg_Pub.GET');
5418    END IF;
5419 
5420    j := 1;
5421 
5422    FOR i IN 1..l_msg_count LOOP
5423 
5424         IF (l_log_statement >= l_log_current_level) THEN
5425            fnd_log.string(l_log_statement,
5426                           L_DEBUG_KEY,
5427                           '------------------------------------------------');
5428         END IF;
5429 
5430         FND_MSG_PUB.get (
5431            p_msg_index      => i, -- SOSAHNI :: BUG 16061401 :: FP base bug 12929344 :: 10/01/2013  :: Found this error while testing for this bug. Error message is not displayed when error count is one. Hence added the parameter
5432            p_encoded        => FND_API.G_FALSE,
5433            p_data           => l_data,
5434            p_msg_index_out  => l_msg_count);
5435         IF (l_log_statement >= l_log_current_level) THEN
5436            fnd_log.string(l_log_statement,
5437                           L_DEBUG_KEY,
5438                           'Error Message : '||l_data);
5439         END IF;
5440         l_error_tbl(j).Msg_Index := j;
5441         l_error_tbl(j).Msg_Data  := l_data;
5442         j := j + 1;
5443 
5444    END LOOP;
5445    IF (l_log_statement >= l_log_current_level) THEN
5446       fnd_log.string(l_log_statement,
5447                      L_DEBUG_KEY,
5448                      'End calling Fnd_Msg_Pub.GET');
5449    END IF;
5450 
5451 x_error_tbl :=  l_error_tbl;
5452 
5453  -------------------- finish --------------------------
5454   -- END of API body.
5455   -- Standard check of p_commit.
5456 
5457    IF Fnd_Api.To_Boolean (p_commit) THEN
5458       COMMIT WORK;
5459    END IF;
5460 
5461    Fnd_Msg_Pub.count_and_get(
5462          p_encoded => Fnd_Api.g_false,
5463          p_count   => x_msg_count,
5464          p_data    => x_msg_data
5465   );
5466 
5467    IF (l_log_procedure >= l_log_current_level) THEN
5468       fnd_log.string(l_log_procedure,
5469                      L_DEBUG_KEY ||'.end',
5470                      'At the end of PL SQL procedure. Return Status = ' || x_return_status);
5471    END IF;
5472 
5473 EXCEPTION
5474    WHEN Fnd_Api.g_exc_error THEN
5475       ROLLBACK TO Validate_Before_Production;
5476       x_return_status := Fnd_Api.g_ret_sts_error;
5477       Fnd_Msg_Pub.count_and_get (
5478             p_encoded => Fnd_Api.g_false,
5479             p_count   => x_msg_count,
5480             p_data    => x_msg_data
5481      );
5482    WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
5483       ROLLBACK TO Validate_Before_Production;
5484       x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
5485       Fnd_Msg_Pub.count_and_get (
5486             p_encoded => Fnd_Api.g_false,
5487             p_count   => x_msg_count,
5488             p_data    => x_msg_data
5489      );
5490    WHEN OTHERS THEN
5491       ROLLBACK TO Validate_Before_Production;
5492       x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
5493       IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_unexp_error)
5494     THEN
5495          Fnd_Msg_Pub.add_exc_msg (G_PKG_NAME, l_api_name);
5496       END IF;
5497       Fnd_Msg_Pub.count_and_get (
5498             p_encoded => Fnd_Api.g_false,
5499             p_count   => x_msg_count,
5500             p_data    => x_msg_data
5501      );
5502 END Validate_Before_Production;
5503 
5504 --------------------------------------------------------------------
5505 -- PROCEDURE
5506 --    Get_Task_Relationships
5507 --
5508 -- PURPOSE
5509 -- To get all the Relationships for the Visit Task.
5510 --------------------------------------------------------------------
5511 
5512 PROCEDURE Get_Task_Relationships
5513 ( p_visit_id           IN            NUMBER,
5514   p_visit_number       IN            NUMBER,
5515   p_visit_task_id      IN            NUMBER,
5516   p_x_relationship_tbl IN OUT NOCOPY AHL_PRD_WORKORDER_PVT.prd_workorder_rel_tbl
5517 ) IS
5518 
5519 CURSOR get_mwo_wip_entity_id(x_visit_id IN NUMBER) IS
5520  SELECT wip_entity_id
5521  FROM AHL_WORKORDERS
5522 WHERE visit_id = x_visit_id
5523   AND VISIT_TASK_ID IS NULL
5524   AND MASTER_WORKORDER_FLAG = 'Y';
5525 
5526 CURSOR get_task_dtls(c_visit_task_id IN NUMBER) IS
5527  SELECT visit_task_number, task_type_code, SERVICE_REQUEST_ID, MR_ID, originating_task_id
5528  FROM AHL_VISIT_TASKS_B
5529  WHERE visit_task_id = c_visit_task_id;
5530 
5531 -- Get all the Parent Task Records For the Visit Task
5532 CURSOR get_parent_task_dtls(c_visit_task_id NUMBER) IS
5533  SELECT PARENT.visit_task_number, PARENT.visit_task_id
5534  FROM AHL_VISIT_TASKS_B PARENT, AHL_VISIT_TASKS_B CHILD
5535  WHERE PARENT.visit_task_id = CHILD.originating_task_id
5536   AND CHILD.visit_task_id = c_visit_task_id;
5537 
5538 CURSOR does_wo_exist_csr(c_visit_task_id NUMBER) IS
5539  SELECT 1 FROM AHL_WORKORDERS
5540  WHERE VISIT_TASK_ID = c_visit_task_id;
5541 
5542 CURSOR get_wip_entity_id(c_visit_task_id NUMBER) IS
5543  SELECT wip_entity_id FROM AHL_WORKORDERS
5544  WHERE VISIT_TASK_ID = c_visit_task_id;
5545 
5546 L_API_NAME     CONSTANT VARCHAR2(30)  := 'Get_Task_Relationships';
5547 L_DEBUG_KEY    CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
5548 rel_count               NUMBER;
5549 l_task_wip_id           NUMBER := 0;
5550 l_visit_task_no         NUMBER;
5551 l_visit_task_type       VARCHAR2(30);
5552 l_orig_task_id          NUMBER := 0;
5553 l_parent_task_number    NUMBER;
5554 l_parent_visit_task_id  NUMBER;
5555 l_mwo_wip_entity_id     NUMBER;
5556 l_parent_task_wip_id    NUMBER := 0;
5557 l_sr_id                 NUMBER := 0;
5558 l_mr_id                 NUMBER := 0;
5559 
5560 BEGIN
5561 
5562  IF (l_log_procedure >= l_log_current_level) THEN
5563     fnd_log.string(l_log_procedure,
5564                    L_DEBUG_KEY ||'.begin',
5565                    'At the start of PL SQL procedure.');
5566     fnd_log.string(l_log_procedure,
5567                    L_DEBUG_KEY,
5568                    'Visit Id = ' || p_visit_id ||
5569                    ', Visit Number = ' || p_visit_number ||
5570                    ', Visit Task Id = ' || p_visit_task_id);
5571  END IF;
5572 
5573  rel_count := p_x_relationship_tbl.COUNT;
5574 
5575  -- Create relationship only if WO doesn't exist for p_task_id
5576  OPEN does_wo_exist_csr(p_visit_task_id);
5577  FETCH does_wo_exist_csr INTO l_task_wip_id;
5578  IF does_wo_exist_csr%FOUND THEN
5579     CLOSE does_wo_exist_csr;
5580     RETURN;
5581  END IF;
5582  CLOSE does_wo_exist_csr;
5583 
5584  OPEN get_task_dtls(p_visit_task_id);
5585  FETCH get_task_dtls into l_visit_task_no, l_visit_task_type, l_sr_id, l_mr_id, l_orig_task_id;
5586  CLOSE get_task_dtls;
5587 
5588  OPEN  get_parent_task_dtls(p_visit_task_id);
5589  FETCH get_parent_task_dtls INTO l_parent_task_number, l_parent_visit_task_id;
5590  CLOSE get_parent_task_dtls;
5591 
5592  OPEN get_mwo_wip_entity_id(p_visit_id);
5593  FETCH get_mwo_wip_entity_id INTO l_mwo_wip_entity_id;
5594  CLOSE get_mwo_wip_entity_id;
5595 
5596  OPEN get_wip_entity_id(l_parent_visit_task_id);
5597  FETCH get_wip_entity_id INTO l_parent_task_wip_id;
5598  CLOSE get_wip_entity_id;
5599 
5600  IF (l_log_statement >= l_log_current_level) THEN
5601     fnd_log.string(l_log_statement,
5602                    L_DEBUG_KEY,
5603                    'Total Relationships : ' || rel_count);
5604     fnd_log.string(l_log_statement,
5605                    L_DEBUG_KEY,
5606                    'Getting Parent Tasks for task : ' || l_visit_task_no);
5607  END IF;
5608 
5609  rel_count := rel_count + 1;
5610  p_x_relationship_tbl(rel_count).batch_id := p_visit_number;
5611  p_x_relationship_tbl(rel_count).dml_operation := 'C';
5612  p_x_relationship_tbl(rel_count).relationship_type := 1;
5613  p_x_relationship_tbl(rel_count).child_header_id := l_visit_task_no;
5614 
5615  IF (l_orig_task_id IS NOT NULL) THEN
5616        p_x_relationship_tbl(rel_count).parent_wip_entity_id := l_parent_task_wip_id;
5617        p_x_relationship_tbl(rel_count).parent_header_id := l_parent_task_number;
5618  ELSE
5619     -- If the Originating Task is null, make the the Visit's MWO as the parent of this task's WO
5620     p_x_relationship_tbl(rel_count).parent_wip_entity_id := l_mwo_wip_entity_id;
5621     p_x_relationship_tbl(rel_count).parent_header_id := 0;
5622  END IF;
5623 
5624  IF (l_log_statement >= l_log_current_level) THEN
5625     fnd_log.string(l_log_statement,
5626                    L_DEBUG_KEY,
5627                    'Total Relationships : ' || rel_count);
5628     fnd_log.string(l_log_statement,
5629                    L_DEBUG_KEY,
5630                    'All tasks obtained for task : ' || l_visit_task_no);
5631  END IF;
5632 
5633  IF (l_log_procedure >= l_log_current_level) THEN
5634     fnd_log.string(l_log_procedure,
5635                    L_DEBUG_KEY ||'.end',
5636                    'At the end of PL SQL procedure. p_x_relationship_tbl.COUNT = ' ||
5637                    p_x_relationship_tbl.COUNT);
5638  END IF;
5639 
5640 END Get_Task_Relationships;
5641 
5642 --------------------------------------------------------------------
5643 -- PROCEDURE
5644 --    Get_Visit_Relationships
5645 --
5646 -- PURPOSE
5647 -- To get all the Relationships for the Visit. These include :
5648 -- 1.A record for Each MR to MR / Visit Relationship.
5649 -- 2.A record for Each Visit Task to MR Relationship.
5650 -- 3.A record for Each Visit Task to Visit Relationship for Unassociated Tasks.
5651 --------------------------------------------------------------------
5652 
5653 PROCEDURE Get_Visit_Relationships
5654 (
5655   p_visit_id           IN            NUMBER,
5656   p_visit_number       IN            NUMBER,
5657   p_x_relationship_tbl IN OUT NOCOPY AHL_PRD_WORKORDER_PVT.prd_workorder_rel_tbl
5658 )
5659 AS
5660   L_API_VERSION CONSTANT NUMBER        := 1.0;
5661   L_API_NAME    CONSTANT VARCHAR2(30)  := 'Get_Visit_Relationships';
5662   L_DEBUG_KEY   CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
5663   l_wip_entity_id        NUMBER;
5664   l_parent_wip_entity_id NUMBER;
5665   rel_count              NUMBER := 0;
5666   mr_count               NUMBER := 0;
5667 
5668 /*-- Get all the Task Records corresponding to a MR.
5669 CURSOR   get_mrs_for_visit(c_visit_id NUMBER)
5670 IS
5671 SELECT   visit_task_id,
5672          visit_task_number,
5673          NVL(originating_task_id, -1)
5674 FROM     AHL_VISIT_TASKS_B
5675 WHERE    visit_id = c_visit_id
5676 AND      task_type_code='SUMMARY'
5677 AND      mr_id IS NOT NULL
5678 ORDER BY 3;*/
5679 
5680 /* Changes made by VSUNDARA for SR INTEGRATION*/
5681 -- Get all the Task Records corresponding to a MR.
5682 CURSOR get_mrs_for_visit(c_visit_id NUMBER)
5683 IS
5684  SELECT visit_task_id,
5685         visit_task_number,
5686         NVL(originating_task_id, -1)
5687  FROM AHL_VISIT_TASKS_B
5688  WHERE visit_id = c_visit_id
5689   AND task_type_code='SUMMARY'
5690   AND (mr_id IS NOT NULL OR unit_effectivity_id IS NOT NULL)
5691   AND NVL(STATUS_CODE, 'X') <> 'DELETED'
5692   -- SKPATHAK :: Bug 9444849 :: 19-MAR-2010
5693   -- This condition added during bug #4075702 fix is not needed
5694   -- since after opening this cursor we have a check if the visit task id fetched by this cursor already has a corresponding WO
5695   -- so only for tasks in planning we are building the relationships
5696   -- Also it is necessary to remove this condition to fix the bug 9444849, since the parent task can be implemented as well
5697   --AND NVL(STATUS_CODE, 'X') = 'PLANNING'  --Srini Bug #4075702
5698  ORDER BY 3;
5699 /* End */
5700 
5701 TYPE mr_task_rec_type IS RECORD
5702 (
5703   visit_task_id        NUMBER,
5704   visit_task_number    NUMBER,
5705   originating_task_id  NUMBER
5706 );
5707 
5708 TYPE mr_task_tbl_type IS TABLE OF mr_task_rec_type INDEX BY BINARY_INTEGER;
5709 
5710 l_mrs_for_visit  mr_task_tbl_type;
5711 
5712 -- Get all the Tasks associated to a MR.
5713 CURSOR get_tasks_for_mr(c_visit_id NUMBER, c_mr_task_id NUMBER)
5714 IS
5715 SELECT visit_task_number, visit_task_id
5716 FROM   AHL_VISIT_TASKS_B
5717 WHERE  visit_id = c_visit_id
5718 AND    originating_task_id = c_mr_task_id
5719 AND    task_type_code <> 'SUMMARY'
5720 AND NVL(STATUS_CODE, 'X') = 'PLANNING'  --Srini Bug #4075702
5721 AND NVL(STATUS_CODE, 'X') <> 'DELETED';
5722 
5723 --SKPATHAK :: VWPE ER-12424063 :: 09-JUN-2011 :: For relationship, consider stage tasks as well
5724 -- Get all the Unassociated Tasks and Stage Tasks.
5725 CURSOR get_unassoc_stage_tasks(c_visit_id NUMBER)
5726 IS
5727 SELECT visit_task_number, visit_task_id
5728 FROM   AHL_VISIT_TASKS_B
5729 WHERE  visit_id = c_visit_id
5730 AND NVL(STATUS_CODE, 'X') = 'PLANNING'
5731 AND    task_type_code IN ('UNASSOCIATED','STAGE');
5732 
5733 -- yazhou 27-Jun-2006 starts
5734 -- fix along with bug#5377347, should get the active job for the task only
5735 
5736 CURSOR get_wo(c_visit_task_id NUMBER)
5737 IS
5738 SELECT wip_entity_id
5739 FROM AHL_WORKORDERS
5740 WHERE VISIT_TASK_ID = c_visit_task_id
5741       -- SKPATHAK :: Bug 9940275 :: 18-AUG-2010 :: Removed status '7' from below  condtn
5742       -- This cursor is used to check if a visit task has a corresponding WO and if not, WO relationship needs to be created
5743       -- So even if the status is 7 (cancelled),  cursor must fetch the result, since relationship need not be created in this case
5744       AND STATUS_CODE <>  '22';
5745 
5746 CURSOR get_parent_wo(c_visit_task_id NUMBER)
5747 IS
5748 SELECT wip_entity_id
5749 FROM AHL_WORKORDERS
5750 WHERE VISIT_TASK_ID = c_visit_task_id
5751       AND STATUS_CODE NOT IN ('22','7');
5752 -- yazhou 27-Jun-2006 ends
5753 
5754 CURSOR get_mwo(c_visit_id NUMBER)
5755 IS
5756 SELECT wip_entity_id
5757 FROM AHL_WORKORDERS
5758 WHERE visit_id = c_visit_id
5759 AND VISIT_TASK_ID IS NULL
5760 AND MASTER_WORKORDER_FLAG = 'Y'
5761 AND STATUS_CODE NOT IN ('7', '22');
5762 
5763 BEGIN
5764 
5765   IF (l_log_procedure >= l_log_current_level) THEN
5766    fnd_log.string(l_log_procedure,L_DEBUG_KEY||'.begin','At the start of PLSQL procedure');
5767   END IF;
5768 
5769   rel_count := p_x_relationship_tbl.COUNT;
5770   -- Get all the Task Records corresponding to a MR for the Visit.
5771   OPEN get_mrs_for_visit(p_visit_id);
5772   LOOP
5773      EXIT WHEN get_mrs_for_visit%NOTFOUND;
5774      mr_count := mr_count + 1;
5775      FETCH get_mrs_for_visit
5776      INTO  l_mrs_for_visit(mr_count).visit_task_id,
5777             l_mrs_for_visit(mr_count).visit_task_number,
5778             l_mrs_for_visit(mr_count).originating_task_id;
5779    END LOOP;
5780    CLOSE get_mrs_for_visit;
5781 
5782    IF (l_log_statement >= l_log_current_level) THEN
5783     fnd_log.string(l_log_statement,L_DEBUG_KEY,'Total MRs for Visit : '||l_mrs_for_visit.COUNT);
5784    END IF;
5785 
5786    IF (l_mrs_for_visit.COUNT > 0) THEN
5787       FOR i IN l_mrs_for_visit.FIRST..l_mrs_for_visit.LAST LOOP
5788           -- if the visit task already has a workorder then do not
5789           -- create a relationship for it
5790           OPEN get_wo(l_mrs_for_visit(i).visit_task_id);
5791           FETCH get_wo INTO l_wip_entity_id;
5792           IF get_wo%NOTFOUND THEN
5793              rel_count := rel_count + 1;
5794              p_x_relationship_tbl(rel_count).batch_id := p_visit_number;
5795              p_x_relationship_tbl(rel_count).child_header_id := l_mrs_for_visit(i).visit_task_number;
5796              p_x_relationship_tbl(rel_count).relationship_type := 1;
5797              p_x_relationship_tbl(rel_count).dml_operation := 'C';
5798              -- Loop to Find out Parent MRs
5799              IF (l_mrs_for_visit(i).originating_task_id <> -1) THEN
5800                 FOR j IN l_mrs_for_visit.FIRST..l_mrs_for_visit.LAST LOOP
5801                     IF (l_mrs_for_visit(i).originating_task_id = l_mrs_for_visit(j).visit_task_id) THEN
5802                        p_x_relationship_tbl(rel_count).parent_header_id := l_mrs_for_visit(j).visit_task_number;
5803                        OPEN get_parent_wo(l_mrs_for_visit(j).visit_task_id);
5804                        FETCH get_parent_wo INTO l_parent_wip_entity_id;
5805                        IF get_parent_wo%FOUND THEN
5806                           p_x_relationship_tbl(rel_count).parent_wip_entity_id := l_parent_wip_entity_id;
5807                        END IF;
5808                        CLOSE get_parent_wo;
5809                       EXIT;
5810                     END IF;
5811                 END LOOP;
5812              END IF;
5813              -- If no Parent MR is found set the parent as the Visit
5814              IF (p_x_relationship_tbl(rel_count).parent_header_id IS NULL) THEN
5815                 p_x_relationship_tbl(rel_count).parent_header_id := 0;
5816                 OPEN get_mwo(p_visit_id);
5817                 FETCH get_mwo INTO l_parent_wip_entity_id;
5818                 IF get_mwo%FOUND THEN
5819                    p_x_relationship_tbl(rel_count).parent_wip_entity_id := l_parent_wip_entity_id;
5820                 END IF;
5821                 CLOSE get_mwo;
5822              END IF;
5823           END IF;
5824           CLOSE get_wo;
5825       END LOOP;
5826    END IF;
5827 
5828    IF (l_log_statement >= l_log_current_level) THEN
5829     fnd_log.string(l_log_statement,L_DEBUG_KEY,'Getting Tasks for MRs');
5830    END IF;
5831    -- Get all the Tasks for a MR.
5832    IF (l_mrs_for_visit.COUNT > 0) THEN
5833      FOR i IN l_mrs_for_visit.FIRST..l_mrs_for_visit.LAST LOOP
5834        FOR mr_tasks_cursor IN get_tasks_for_mr(p_visit_id, l_mrs_for_visit(i).visit_task_id) LOOP
5835            OPEN get_wo(mr_tasks_cursor.visit_task_id);
5836            FETCH get_wo INTO l_wip_entity_id;
5837            IF get_wo%NOTFOUND THEN
5838               rel_count := rel_count + 1;
5839               p_x_relationship_tbl(rel_count).batch_id := p_visit_number;
5840               p_x_relationship_tbl(rel_count).parent_header_id := l_mrs_for_visit(i).visit_task_number;
5841               p_x_relationship_tbl(rel_count).child_header_id := mr_tasks_cursor.visit_task_number;
5842               p_x_relationship_tbl(rel_count).relationship_type := 1;
5843               p_x_relationship_tbl(rel_count).dml_operation := 'C';
5844               -- if this visit task is already in shop floor then get the wip_entity_id
5845               OPEN get_parent_wo(l_mrs_for_visit(i).visit_task_id);
5846               FETCH get_parent_wo INTO l_parent_wip_entity_id;
5847               IF get_parent_wo%FOUND THEN
5848                 p_x_relationship_tbl(rel_count).parent_wip_entity_id := l_parent_wip_entity_id;
5849               END IF;
5850               CLOSE get_parent_wo;
5851           END IF;
5852           CLOSE get_wo;
5853        END LOOP;
5854      END LOOP;
5855    END IF;
5856 
5857    IF (l_log_statement >= l_log_current_level) THEN
5858     fnd_log.string(l_log_statement,L_DEBUG_KEY,'Getting Unassociated Tasks for Visit');
5859    END IF;
5860 
5861    -- Get all Un-associated Tasks for a Visit.
5862    OPEN get_mwo(p_visit_id);
5863    FETCH get_mwo INTO l_parent_wip_entity_id;
5864    IF get_mwo%NOTFOUND THEN
5865       l_parent_wip_entity_id := 0;
5866    END IF;
5867    CLOSE get_mwo;
5868 
5869    --SKPATHAK :: VWPE ER-12424063 :: 09-JUN-2011 :: For relationship, consider stage tasks as well
5870    FOR tsk_cursor IN get_unassoc_stage_tasks(p_visit_id) LOOP
5871        OPEN get_wo(tsk_cursor.visit_task_id);
5872        FETCH get_wo INTO l_wip_entity_id;
5873        IF get_wo%NOTFOUND THEN
5874           rel_count := rel_count + 1;
5875           p_x_relationship_tbl(rel_count).batch_id := p_visit_number;
5876           p_x_relationship_tbl(rel_count).parent_header_id := 0; -- Visit
5877           p_x_relationship_tbl(rel_count).child_header_id := tsk_cursor.visit_task_number;
5878           p_x_relationship_tbl(rel_count).relationship_type := 1;
5879           p_x_relationship_tbl(rel_count).dml_operation := 'C';
5880           p_x_relationship_tbl(rel_count).parent_wip_entity_id := l_parent_wip_entity_id;
5881        END IF;
5882        CLOSE get_wo;
5883    END LOOP;
5884 
5885    IF (l_log_procedure >= l_log_current_level) THEN
5886     fnd_log.string(l_log_procedure,L_DEBUG_KEY,'Total Relationships : ' || p_x_relationship_tbl.COUNT );
5887     fnd_log.string(l_log_procedure,L_DEBUG_KEY||'.end','At the end of PLSQL procedure');
5888    END IF;
5889 
5890 END Get_Visit_Relationships;
5891 
5892 --------------------------------------------------------------------
5893 -- PROCEDURE
5894 --    Get_Task_Dependencies
5895 --
5896 -- PURPOSE
5897 -- To get all the Technical Dependencies for the Visit Task.
5898 --------------------------------------------------------------------
5899 
5900 PROCEDURE Get_Task_Dependencies
5901 (
5902   p_visit_number       IN            NUMBER,
5903   p_visit_task_id      IN            NUMBER,
5904   p_visit_task_number  IN            NUMBER,
5905   p_x_relationship_tbl IN OUT NOCOPY AHL_PRD_WORKORDER_PVT.prd_workorder_rel_tbl
5906 )
5907 AS
5908    L_API_VERSION   CONSTANT NUMBER        := 1.0;
5909    L_API_NAME      CONSTANT VARCHAR2(30)  := 'Get_Task_Dependencies';
5910    L_DEBUG_KEY     CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
5911 
5912 -- Get all the Task Dependencies.
5913 CURSOR get_tech_dependencies(c_visit_task_id NUMBER)
5914 IS
5915  SELECT PARENT.visit_task_number parent_task_number,
5916         CHILD.visit_task_number child_task_number
5917  FROM AHL_VISIT_TASKS_B PARENT,
5918       AHL_VISIT_TASKS_B CHILD,
5919       AHL_TASK_LINKS LINK
5920  WHERE PARENT.visit_task_id = LINK.parent_task_id
5921   AND CHILD.visit_task_id = LINK.visit_task_id
5922   AND NVL(PARENT.STATUS_CODE,'X') = 'PLANNING'
5923   AND NVL(CHILD.STATUS_CODE,'X') = 'PLANNING'
5924   AND (PARENT.visit_task_id = c_visit_task_id
5925        OR  CHILD.visit_task_id = c_visit_task_id);
5926 
5927 l_visit_task_number NUMBER;
5928 rel_count           NUMBER;
5929 dup_found           BOOLEAN;
5930 
5931 BEGIN
5932 
5933    IF (l_log_procedure >= l_log_current_level) THEN
5934       fnd_log.string(l_log_procedure,
5935                  L_DEBUG_KEY ||'.begin',
5936                  'At the start of PL SQL procedure.');
5937       fnd_log.string(l_log_procedure,
5938                  L_DEBUG_KEY,
5939                  'Visit Number = ' || p_visit_number ||
5940                  ', Visit Task Id = ' || p_visit_task_id ||
5941                  ', Visit Task Number = ' || p_visit_task_number);
5942    END IF;
5943 
5944    rel_count := p_x_relationship_tbl.COUNT;
5945 
5946    IF (l_log_statement >= l_log_current_level) THEN
5947       fnd_log.string(l_log_statement,
5948                      L_DEBUG_KEY,
5949                      'Total dependencies = ' || rel_count);
5950    END IF;
5951    -- Get the Technical Dependencies between Visit Tasks for a Visit.
5952    FOR tsk_cursor IN get_tech_dependencies(p_visit_task_id) LOOP
5953 
5954        dup_found := FALSE;
5955        --Do not insert the row if it already exists in relationship table.
5956        --SKPATHAK :: VWPE: ER:12424063 :: 13-JUN-2012
5957        IF rel_count > 0 THEN
5958          FOR i IN p_x_relationship_tbl.FIRST..p_x_relationship_tbl.LAST LOOP
5959            IF (p_x_relationship_tbl(i).relationship_type = 2 AND
5960                 p_x_relationship_tbl(i).parent_header_id = tsk_cursor.parent_task_number AND
5961                 p_x_relationship_tbl(i).child_header_id = tsk_cursor.child_task_number) THEN
5962              dup_found := TRUE;
5963              EXIT;
5964            END IF;
5965          END LOOP;
5966        END IF;
5967 
5968        IF (dup_found = FALSE) THEN
5969           rel_count := rel_count + 1;
5970           p_x_relationship_tbl(rel_count).batch_id := p_visit_number;
5971           p_x_relationship_tbl(rel_count).parent_header_id := tsk_cursor.parent_task_number;
5972           p_x_relationship_tbl(rel_count).child_header_id := tsk_cursor.child_task_number;
5973           p_x_relationship_tbl(rel_count).relationship_type := 2;
5974           p_x_relationship_tbl(rel_count).dml_operation := 'C';
5975        END IF;
5976 
5977    END LOOP;
5978 
5979    IF (l_log_procedure >= l_log_current_level ) THEN
5980       fnd_log.string(l_log_procedure,
5981                      L_DEBUG_KEY,
5982                      'Total dependencies for Visit Task ' || p_visit_task_number ||
5983                      'is: '|| rel_count);
5984       fnd_log.string(l_log_procedure,
5985                      L_DEBUG_KEY ||'.end',
5986                      'At the end of PL SQL procedure.');
5987    END IF;
5988 
5989 END Get_Task_Dependencies;
5990 
5991 --------------------------------------------------------------------
5992 -- PROCEDURE
5993 --    Get_Visit_Dependencies
5994 --
5995 -- PURPOSE
5996 -- To get all the Technical Dependencies for the Visit.
5997 --------------------------------------------------------------------
5998 
5999 PROCEDURE Get_Visit_Dependencies
6000 (
6001   p_visit_id           IN            NUMBER,
6002   p_visit_number       IN            NUMBER,
6003   p_x_relationship_tbl IN OUT NOCOPY AHL_PRD_WORKORDER_PVT.prd_workorder_rel_tbl
6004 )
6005 AS
6006   L_API_VERSION  CONSTANT NUMBER        := 1.0;
6007   L_API_NAME     CONSTANT VARCHAR2(30)  := 'Get_Visit_Dependencies';
6008   L_DEBUG_KEY    CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
6009   rel_count               NUMBER;
6010 
6011 -- Get all the Task Dependencies.
6012 CURSOR get_tech_dependencies(c_visit_id NUMBER)
6013 IS
6014 SELECT PARENT.visit_task_number parent_task_number,
6015        CHILD.visit_task_number child_task_number
6016 FROM   AHL_VISIT_TASKS_B PARENT,
6017        AHL_VISIT_TASKS_B CHILD,
6018        AHL_TASK_LINKS LINK
6019 WHERE  PARENT.visit_task_id = LINK.parent_task_id
6020  AND    CHILD.visit_task_id = LINK.visit_task_id
6021  AND    NVL(PARENT.STATUS_CODE,'X') = 'PLANNING' --Srini Bug #4075702
6022  AND    PARENT.visit_id = c_visit_id
6023  AND    CHILD.visit_id = c_visit_id;
6024 
6025 BEGIN
6026 
6027    IF (l_log_procedure >= l_log_current_level) THEN
6028       fnd_log.string(l_log_procedure,
6029                      L_DEBUG_KEY ||'.begin',
6030                      'At the start of PL SQL procedure.');
6031    END IF;
6032 
6033    rel_count := p_x_relationship_tbl.COUNT;
6034 
6035    -- Get the Technical Dependencies between Visit Tasks for a Visit.
6036    FOR tsk_cursor IN get_tech_dependencies(p_visit_id) LOOP
6037      rel_count := rel_count + 1;
6038      p_x_relationship_tbl(rel_count).batch_id := p_visit_number;
6039      p_x_relationship_tbl(rel_count).parent_header_id := tsk_cursor.parent_task_number;
6040      p_x_relationship_tbl(rel_count).child_header_id := tsk_cursor.child_task_number;
6041      p_x_relationship_tbl(rel_count).relationship_type := 2;
6042      p_x_relationship_tbl(rel_count).dml_operation := 'C';
6043    END LOOP;
6044 
6045    IF (l_log_procedure >= l_log_current_level ) THEN
6046       fnd_log.string(l_log_procedure,
6047                      L_DEBUG_KEY,
6048                      'Total Relationships : ' || p_x_relationship_tbl.COUNT);
6049       fnd_log.string(l_log_procedure,
6050                      L_DEBUG_KEY ||'.end',
6051                      'At the end of PL SQL procedure.');
6052    END IF;
6053 
6054 END Get_Visit_Dependencies;
6055 
6056 /* End Changes by Shkalyan */
6057 
6058 --------------------------------------------------------------------
6059 -- PROCEDURE
6060 --    Push_to_Production
6061 --
6062 -- PURPOSE
6063 --    To push visit along with all its tasks to Production for create jobs
6064 --------------------------------------------------------------------
6065 PROCEDURE Push_to_Production
6066 (   p_api_version       IN  NUMBER,
6067     p_init_msg_list     IN  VARCHAR2 := Fnd_Api.g_false,
6068     p_commit            IN  VARCHAR2 := Fnd_Api.g_false,
6069     p_validation_level  IN  NUMBER   := Fnd_Api.g_valid_level_full,
6070     p_module_type       IN  VARCHAR2 := Null,
6071     p_visit_id          IN  NUMBER,
6072     p_release_flag      IN  VARCHAR2 := 'N', -- By shbhanda 05/21/04 for TC changes
6073     p_orig_visit_id     IN  NUMBER   := NULL, -- By yazhou  08/06/04 for TC changes
6074     x_return_status     OUT NOCOPY VARCHAR2,
6075     x_msg_count         OUT NOCOPY NUMBER,
6076     x_msg_data          OUT NOCOPY VARCHAR2
6077 )
6078 IS
6079    L_API_VERSION   CONSTANT NUMBER       := 1.0;
6080    L_API_NAME      CONSTANT VARCHAR2(30) := 'Push_to_Production';
6081    L_DEBUG_KEY     CONSTANT VARCHAR2(100):= 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
6082    l_prd_workorder_tbl  AHL_PRD_WORKORDER_PVT.PRD_WORKORDER_TBL;
6083    /* Begin Changes by Shkalyan */
6084    l_prd_workorder_rel_tbl  AHL_PRD_WORKORDER_PVT.PRD_WORKORDER_REL_TBL;
6085    l_firm_planned_flag    VARCHAR2(1) := FND_PROFILE.value('AHL_PRD_FIRM_PLANNED_FLAG');
6086    l_visit_wo_id          NUMBER;
6087    l_visit_wo_ovn         NUMBER;
6088    l_visit_wo_status      VARCHAR2(30);
6089    l_visit_wo_start_time  DATE;
6090    l_visit_wo_end_time    DATE;
6091    l_orig_visit_status    VARCHAR2(30);
6092    l_orig_task_status     VARCHAR2(30);
6093    l_workorder_id         NUMBER;
6094    l_workorder_ovn        NUMBER;
6095    l_workorder_status     VARCHAR2(30);
6096    /* End Changes by Shkalyan */
6097    l_return_status        VARCHAR2(1);
6098    l_msg_count            NUMBER;
6099    l_msg_data             VARCHAR2(2000);
6100    idx                    NUMBER;
6101    l_count                NUMBER;
6102    l_route_id             NUMBER;
6103    l_commit               VARCHAR2(1) := 'F';
6104    l_visit_end_time       DATE;
6105    l_temp_msg_count       NUMBER:=0; --rnahata
6106    l_init_msg_list        VARCHAR2(1) := 'F';
6107    --PRAKKUM :: PIE :: 13-OCT-2010
6108    l_new_structure_flag   VARCHAR2(1);
6109    l_def_stage_task_id    NUMBER; --added by tchimira for VWPE
6110    l_planned_order_flag   VARCHAR2(1); --added by skpathak for VWPE
6111    l_is_comp_visit        VARCHAR2(1) := AHL_CMP_UTIL_PKG.Is_Comp_Visit (p_visit_id);
6112    -- SATRAJEN :: Bug 12990261 :: Sum up all error messages :: Jun 2012
6113    l_task_nos_1           VARCHAR2(1000):= '';
6114    l_task_nos_2           VARCHAR2(1000):= '';
6115    l_task_nos_3           VARCHAR2(1000):= '';
6116    l_task_nos_4           VARCHAR2(1000):= '';
6117    l_task_nos_5           VARCHAR2(1000):= '';
6118    l_task_nos_6           VARCHAR2(1000):= '';
6119    l_valid_flag           NUMBER;
6120    -- SATRAJEN :: BUG 14336467 :: Prevent erroring out in case of operational visit. :: 12-07-2012
6121    l_invalid_mr           VARCHAR2(1):='N';
6122    l_auto_visit_flag      VARCHAR2(10):=NULL;
6123    l_unit_sch_id          NUMBER;
6124 
6125 
6126    -- To find visit related information
6127    CURSOR c_visit (x_id IN NUMBER) IS
6128     SELECT AHL_VISITS_VL.*, AHL_VWP_VISITS_PVT.Is_Old_Visit(VISIT_ID) IS_OLD_VISIT FROM AHL_VISITS_VL
6129     WHERE VISIT_ID = x_id;
6130 
6131    c_visit_rec c_visit%ROWTYPE;
6132    c_orig_visit_rec c_visit%ROWTYPE;
6133 
6134    /* Begin Changes by VSUNDARA For SR Integration*/
6135    -- To find task related information
6136    CURSOR c_task (x_id IN NUMBER) IS
6137     SELECT * FROM AHL_VISIT_TASKS_VL
6138     WHERE VISIT_ID = x_id
6139      AND NVL(STATUS_CODE, 'X') = 'PLANNING'
6140      AND (TASK_TYPE_CODE <> 'SUMMARY' OR
6141            (TASK_TYPE_CODE = 'SUMMARY' AND
6142              (MR_ID IS NOT NULL OR UNIT_EFFECTIVITY_ID IS NOT NULL)));
6143    /* End */
6144 
6145    c_task_rec c_task%ROWTYPE;
6146    c_orig_task_rec c_task%ROWTYPE;
6147 
6148    /* Begin Changes by Shkalyan */
6149    -- To find count for tasks for visit
6150    CURSOR c_task_ct (x_id IN NUMBER) IS
6151     SELECT count(*) FROM AHL_VISIT_TASKS_VL
6152     WHERE VISIT_ID = x_id
6153      AND NVL(STATUS_CODE, 'X') = 'PLANNING'
6154      AND (TASK_TYPE_CODE <> 'SUMMARY' OR
6155            (TASK_TYPE_CODE = 'SUMMARY' AND
6156              MR_ID IS NOT NULL OR UNIT_EFFECTIVITY_ID IS NOT NULL));
6157    /* End Changes by Shkalyan */
6158 
6159    -- To find Route Id from MR Routes view
6160    CURSOR c_route (x_id IN NUMBER) IS
6161     SELECT Route_Id FROM AHL_MR_ROUTES_V
6162     WHERE MR_ROUTE_ID = x_id;
6163 
6164    /* Begin Changes by Shkalyan */
6165     -- To find job for task
6166    CURSOR c_job (x_id IN NUMBER) IS
6167     SELECT workorder_id, object_version_number, status_code
6168     FROM AHL_WORKORDERS
6169     WHERE VISIT_TASK_ID = x_id
6170      AND STATUS_CODE not in ('22','7'); --(22-Deleted, 7-Cancelled)
6171 
6172    --transit check visit change
6173    --yazhou start
6174    -- To find master workorder for Visit
6175    CURSOR c_visit_job (x_visit_id IN NUMBER) IS
6176     SELECT wo.workorder_id, wo.object_version_number, wo.status_code,
6177           WIP.SCHEDULED_START_DATE,
6178           WIP.SCHEDULED_COMPLETION_DATE
6179     FROM AHL_WORKORDERS WO,
6180          WIP_DISCRETE_JOBS WIP
6181     WHERE wo.VISIT_ID = x_visit_id
6182      AND   wo.VISIT_TASK_ID IS NULL
6183      AND   wo.MASTER_WORKORDER_FLAG = 'Y'
6184      AND   WIP.WIP_ENTITY_ID = WO.WIP_ENTITY_ID
6185      AND   wo.STATUS_CODE not in ('22','7'); --(22-Deleted, 7-Cancelled)
6186 
6187    CURSOR c_visit_wo_status (x_visit_id IN NUMBER) IS
6188     SELECT wo.status_code
6189     FROM AHL_WORKORDERS WO
6190     WHERE wo.VISIT_ID = x_visit_id
6191      AND   wo.VISIT_TASK_ID IS NULL
6192      AND   wo.MASTER_WORKORDER_FLAG = 'Y'
6193      AND   wo.STATUS_CODE not in ('22','7'); --(22-Deleted, 7-Cancelled)
6194 
6195    -- Get workorder status for the coresponding job in originating visit
6196    CURSOR c_wo_status (x_orig_visit_id IN NUMBER, x_visit_task_id IN NUMBER) IS
6197     SELECT wo.status_code
6198     FROM AHL_WORKORDERS WO,
6199          AHL_VISIT_TASKS_B t
6200     WHERE wo.VISIT_ID = x_orig_visit_id
6201      AND   wo.visit_task_id = t.visit_task_id
6202      AND   t.visit_task_number = (Select visit_task_number
6203                                   from ahl_visit_tasks_b
6204                                  where visit_task_id = x_visit_task_id)
6205      AND   wo.STATUS_CODE not in ('22','7'); --(22-Deleted, 7-Cancelled)
6206    -- yazhou end
6207 
6208   /* End Changes by Shkalyan */
6209 
6210    --Post11510. Added to get summary task start, end time
6211    CURSOR get_summary_task_times_csr(x_task_id IN NUMBER)IS
6212          SELECT min(start_date_time), max(end_date_time)
6213       --TCHIMIRA::19-FEB-2010::BUG 9384614
6214       -- Use the base table instead of the vl view
6215       FROM ahl_visit_tasks_b VST
6216          START WITH visit_task_id  = x_task_id
6217        -- anraj changed coz the nvl on the RHS is not required
6218          -- AND NVL(VST.status_code, 'Y') <> NVL ('DELETED', 'X')
6219        AND NVL(VST.status_code, 'Y') <> 'DELETED'
6220          CONNECT BY originating_task_id = PRIOR visit_task_id;
6221 
6222 -- Added by Jerry on 08/13/2004 per Yan and Alex's request
6223 -- Yan added the condition to filter out summary tasks on 08/31/2005
6224 CURSOR get_independent_tasks(c_visit_id IN NUMBER) IS
6225   select t.visit_task_id
6226     from ahl_visit_tasks_b t,
6227          ahl_visits_b v
6228    where v.visit_id = c_visit_id
6229      and v.visit_id = t.visit_id
6230      --and v.status_code = 'PARTIALLY RELEASED'
6231      and v.status_code IN ('PLANNING', 'PARTIALLY RELEASED') -- PRAKKUM :: BUG Internal :: 19/01/2012  :: Task Time Adjustments
6232      and t.start_date_time < SYSDATE
6233      and t.status_code ='PLANNING'
6234      and t.task_type_code <>'SUMMARY'
6235      -- SKPATHAK :: ER: 9147951 :: 11-JAN-2010 :: Adjust task times only if past task start date is null
6236      and t.past_task_start_date IS NULL
6237      and (not exists (select 1 from ahl_task_links l0
6238                       where l0.parent_task_id = t.visit_task_id
6239                          or l0.visit_task_id = t.visit_task_id)
6240           or t.visit_task_id in (select l1.parent_task_id from ahl_task_links l1
6241                                   where not exists (select l2.visit_task_id from ahl_task_links l2
6242                                                      where l2.visit_task_id = l1.parent_task_id)));
6243 --Modified by Srini Nov08, 2004 to create master workorder not having an asset
6244 
6245 -- anraj: Modified the cursor definition to exclude the tasks in status DELETED
6246 CURSOR get_task_inst_dtls(c_visit_id IN NUMBER)
6247 IS
6248   SELECT inventory_item_id,instance_id
6249   FROM ahl_visit_tasks_vl
6250   WHERE visit_id = c_visit_id
6251   AND NVL(status_code, 'Y') <> 'DELETED'
6252   AND ROWNUM = 1;
6253 get_task_inst_rec  get_task_inst_dtls%ROWTYPE;
6254 
6255 /* Added by rnahata for Bug 6447196 */
6256 CURSOR c_get_vst_status_and_date (c_visit_id IN NUMBER) IS
6257  SELECT status_code, close_date_time
6258  FROM ahl_visits_b
6259  WHERE visit_id = c_visit_id;
6260 get_vst_status_and_date_rec   c_get_vst_status_and_date%ROWTYPE;
6261 
6262 /* Added by rnahata for Bug 5758813
6263    Fetches the route information for updating workorder
6264    description for tasks created from Routes */
6265 CURSOR get_wo_dtls_for_mrtasks_cur (p_task_id IN NUMBER) IS
6266  --TCHIMIRA::Bug 9149770 ::09-FEB-2010
6267  --use substrb and lengthb instead of substr and length respectively
6268  SELECT ar.route_no||'.'||substrb(ar.title,1,(240 - (lengthb(ar.route_no) + 1))) workorder_description
6269  FROM ahl_routes_vl ar,ahl_visit_tasks_b avt, ahl_mr_routes mrr
6270  WHERE avt.visit_task_id = p_task_id
6271   AND nvl(avt.status_code,'Y') = 'PLANNING'
6272   AND avt.mr_route_id = mrr.mr_route_id
6273   AND mrr.route_id = ar.route_id;
6274   get_wo_dtls_for_mrtasks_rec    get_wo_dtls_for_mrtasks_cur%ROWTYPE;
6275 
6276 -- SKPATHAK :: 02-MAY-2011 :: VWPE: ER:12424063
6277 -- Get all the planning stages' tasks and duplicate tasks of the visit
6278 CURSOR get_visit_tasks_to_cancel (c_visit_id IN NUMBER) IS
6279   SELECT wo.workorder_id, stage.stage_id, task.task_type_code
6280   FROM ahl_visit_tasks_b task, ahl_vwp_stages_b stage, ahl_workorders wo
6281   WHERE task.visit_id = c_visit_id
6282   AND task.stage_id = stage.stage_id(+)
6283   -- do not select the default stage task
6284   AND ((task.task_type_code = 'STAGE' AND task.stage_id IS NOT NULL)
6285        OR task.task_type_code = 'DUPLICATE')
6286   -- SKPATHAK :: 07-JUN-2011 :: VWPE: ER:12424063 :: Consider partially implemented stages also
6287   AND stage.stage_status_code IN  ('PLANNING', 'PARTIALLY RELEASED')
6288   AND task.visit_task_id = wo.visit_task_id;
6289 
6290 -- TCHIMIRA :: 28-JUN-2011 :: VWPE: ER:12673125 :: START
6291 -- Cursor to fetch default stage task ID
6292 CURSOR c_get_vst_def_stage_task (c_visit_id IN NUMBER) IS
6293  SELECT VISIT_TASK_ID
6294  FROM AHL_VISIT_TASKS_B
6295  WHERE STAGE_ID IS NULL
6296  AND TASK_TYPE_CODE = 'STAGE'
6297  AND VISIT_ID = c_visit_id;
6298  -- TCHIMIRA :: 28-JUN-2011 :: VWPE: ER:12673125 :: END
6299 
6300 -- SKPATHAK :: ER:12730539 :: 01-AUG-2011
6301 CURSOR get_task_status (c_task_id IN NUMBER) IS
6302   SELECT status_code FROM ahl_visit_tasks_b
6303   WHERE visit_task_id = c_task_id;
6304     l_task_status       VARCHAR2(30);
6305 
6306 -- MANESING::Component Maintenance Planning Project, 02-Nov-2011, added following cursor
6307 -- Cursor to get any instance from UC table
6308 CURSOR get_any_uc_inst_csr IS
6309     SELECT INST.inventory_item_id, UC.csi_item_instance_id
6310     FROM   AHL_UNIT_CONFIG_HEADERS UC,
6311            CSI_ITEM_INSTANCES      INST
6312     WHERE  UC.unit_config_status_code         = 'COMPLETE'
6313     AND    NVL(UC.active_end_date, SYSDATE+1) > SYSDATE
6314     AND    INST.instance_id                   = UC.csi_item_instance_id
6315     AND    rownum = 1;
6316 
6317 -- MANESING::Component Maintenance Planning Project, 02-Nov-2011, added following cursor
6318 -- Cursor to get serial number given the item instance id
6319 CURSOR get_inst_serial_no_csr (c_instance_id NUMBER) IS
6320     SELECT serial_number
6321     FROM   CSI_ITEM_INSTANCES
6322     WHERE  instance_id = c_instance_id;
6323     l_serial_number      VARCHAR2(30);
6324 
6325 -- MANESING::Component Maintenance Planning Project, 02-Nov-2011, added following cursor
6326 -- Cursor to find a serialized instance in any of Repair Batches within the given Component Visit
6327 CURSOR get_serialized_inst_csr (c_visit_id NUMBER) IS
6328     SELECT INST.inventory_item_id, INST.instance_id
6329     FROM   AHL_VISIT_TASKS_B  TSK,
6330            CSI_ITEM_INSTANCES INST
6331     WHERE  TSK.visit_id       = c_visit_id
6332     AND    TSK.status_code    NOT IN ('DELETED', 'CANCELLED', 'CLOSED')
6333     AND    TSK.instance_id    = INST.instance_id
6334     AND    INST.serial_number IS NOT NULL
6335     AND    rownum             = 1;
6336     serialized_inst_rec       get_serialized_inst_csr%ROWTYPE;
6337 
6338 l_max_schedule_start_date DATE; --BUG 13373947 :: PRAKKUM :: 10/02/2012
6339 
6340 BEGIN
6341    --------------------- initialize -----------------------
6342 
6343    SAVEPOINT Push_to_Production;
6344    IF (l_log_procedure >= l_log_current_level) THEN
6345       fnd_log.string(l_log_procedure,
6346                      L_DEBUG_KEY ||'.begin',
6347                      'At the start of PL SQL procedure. Visit Id = ' || p_visit_id);
6348    END IF;
6349 
6350    -- Initialize message list if p_init_msg_list is set to TRUE.
6351    IF Fnd_Api.to_boolean(p_init_msg_list)
6352    THEN
6353       Fnd_Msg_Pub.initialize;
6354    END IF;
6355 
6356    --  Initialize API return status to success
6357     x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
6358 
6359    -- Standard call to check for call compatibility.
6360    IF NOT Fnd_Api.COMPATIBLE_API_CALL(l_api_version,
6361                                       p_api_version,
6362                                       l_api_name,G_PKG_NAME)
6363    THEN
6364        RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
6365    END IF;
6366 
6367    IF (l_log_statement >= l_log_current_level) THEN
6368       fnd_log.string(l_log_statement,
6369                      L_DEBUG_KEY,
6370                      'Before calling AHL_VWP_TIMES_PVT.Calculate_Task_Times');
6371    END IF;
6372 
6373    -- Calculate Task Start/End time
6374    AHL_VWP_TIMES_PVT.CALCULATE_TASK_TIMES(
6375            p_api_version      => 1.0,
6376            p_init_msg_list    => Fnd_Api.G_FALSE,
6377            p_commit           => Fnd_Api.G_FALSE,
6378            p_validation_level => Fnd_Api.G_VALID_LEVEL_FULL,
6379            x_return_status    => l_return_status,
6380            x_msg_count        => l_msg_count,
6381            x_msg_data         => l_msg_data,
6382            p_visit_id         => p_visit_id);
6383 
6384    IF (l_log_statement >= l_log_current_level) THEN
6385       fnd_log.string(l_log_statement,
6386                      L_DEBUG_KEY,
6387                      'After calling AHL_VWP_TIMES_PVT.Calculate_Task_Times. Return Status = ' || l_return_status);
6388    END IF;
6389 
6390    IF (l_return_status <> Fnd_Api.G_RET_STS_SUCCESS) THEN
6391       IF (l_log_statement >= l_log_current_level) THEN
6392          fnd_log.string(l_log_statement,
6393                         L_DEBUG_KEY,
6394                         'Errors from AHL_VWP_TIMES_PVT.Calculate_Task_Times. Message count: ' ||
6395                         l_msg_count || ', message data: ' || l_msg_data);
6396       END IF;
6397    END IF;
6398 
6399    /*rnahata - B6447196 - start*/
6400    /*c_visit_rec fetch has been moved after the project details are updated for the visit. Hence
6401    moved the cursor after integrate_to_projects*/
6402    OPEN c_get_vst_status_and_date (p_visit_id);
6403    FETCH c_get_vst_status_and_date INTO get_vst_status_and_date_rec;
6404    CLOSE c_get_vst_status_and_date;
6405    /*rnahata - B6447196 - end*/
6406 
6407    --Jerry updated on 08/13/2004 after discussion with Yan and Alex for adjusting task start date
6408    --IF get_vst_status_and_date_rec.STATUS_CODE = 'PARTIALLY RELEASED' THEN
6409    -- PRAKKUM :: BUG Internal :: 19/01/2012 :: Task Time Adjustments
6410    IF get_vst_status_and_date_rec.STATUS_CODE = 'PLANNING' OR get_vst_status_and_date_rec.STATUS_CODE = 'PARTIALLY RELEASED' THEN
6411       IF (l_log_statement >= l_log_current_level) THEN
6412          fnd_log.string(l_log_statement,
6413                         L_DEBUG_KEY,
6414                         'Before calling AHL_VWP_TIMES_PVT.adjust_task_times');
6415       END IF;
6416       FOR l_get_independent_tasks IN get_independent_tasks(p_visit_id) LOOP
6417           AHL_VWP_TIMES_PVT.adjust_task_times(
6418                  p_api_version         => 1.0,
6419                  p_init_msg_list       => Fnd_Api.G_FALSE,
6420                  p_commit              => Fnd_Api.G_FALSE,
6421                  p_validation_level    => Fnd_Api.G_VALID_LEVEL_FULL,
6422                  x_return_status       => l_return_status,
6423                  x_msg_count           => l_msg_count,
6424                  x_msg_data            => l_msg_data,
6425                  p_task_id             => l_get_independent_tasks.visit_task_id,
6426                  p_reset_sysdate_flag  => FND_API.G_TRUE);
6427       END LOOP;
6428 
6429       IF (l_log_statement >= l_log_current_level) THEN
6430          fnd_log.string(l_log_statement,
6431                         L_DEBUG_KEY,
6432                         'After calling AHL_VWP_TIMES_PVT.adjust_task_times. Return Status = ' || l_return_status);
6433       END IF;
6434 
6435       IF (l_return_status <> Fnd_Api.G_RET_STS_SUCCESS) THEN
6436          IF (l_log_statement >= l_log_current_level) THEN
6437             fnd_log.string(l_log_statement,
6438                            L_DEBUG_KEY,
6439                            'Errors from AHL_VWP_TIMES_PVT.adjust_task_times. Message count: ' ||
6440                            l_msg_count || ', message data: ' || l_msg_data);
6441          END IF;
6442       END IF;
6443 
6444       l_visit_end_time := AHL_VWP_TIMES_PVT.get_visit_end_time(p_visit_id);
6445       IF (l_log_statement >= l_log_current_level) THEN
6446           fnd_log.string(l_log_statement,
6447                      L_DEBUG_KEY,
6448                      'l_visit_end_time --@>'||l_visit_end_time);
6449       END IF;
6450       IF l_visit_end_time > get_vst_status_and_date_rec.close_date_time THEN
6451          Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_TSK_STDT_ADJU');
6452          Fnd_Message.Set_Token('VISIT_END_DATE', l_visit_end_time);
6453          Fnd_Msg_Pub.ADD;
6454          RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
6455       END IF;
6456    END IF;
6457 
6458    /*rnahata - B6447196 - start*/
6459    /*moved the call to integrate to projects after task times gets updated
6460    esp in case of visits that is partially implemented*/
6461    idx := idx + 1;
6462    --Call prrojects
6463    -- Post 11.5.10
6464    -- RROY
6465 
6466    IF (l_log_statement >= l_log_current_level) THEN
6467       fnd_log.string(l_log_statement,
6468                      L_DEBUG_KEY,
6469                      'Before calling INTEGRATE_TO_PROJECTS');
6470    END IF;
6471 
6472    AHL_VWP_PROJ_PROD_PVT.Integrate_to_Projects
6473               (p_api_version       => l_api_version,
6474                p_init_msg_list     => p_init_msg_list,
6475                p_commit            => l_commit,
6476                p_validation_level  => p_validation_level,
6477                p_module_type       => p_module_type,
6478                p_visit_id          => p_visit_id,
6479                x_return_status     => l_return_status,
6480                x_msg_count         => l_msg_count,
6481                x_msg_data          => x_msg_data);
6482 
6483    IF (l_log_statement >= l_log_current_level) THEN
6484       fnd_log.string(l_log_statement,
6485                      L_DEBUG_KEY,
6486                      'After calling INTEGRATE_TO_PROJECTS. l_return_status '||l_return_status);
6487    END IF;
6488 
6489    IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
6490      -- Check Error Message stack.
6491      x_msg_count := FND_MSG_PUB.count_msg;
6492      RAISE FND_API.G_EXC_ERROR;
6493    END IF;
6494 
6495    -- Post 11.5.10
6496    -- RROY
6497    OPEN c_visit (p_visit_id);
6498    FETCH c_visit INTO c_visit_rec;
6499    CLOSE c_visit;
6500    /*rnahata - B6447196 - end*/
6501 
6502    -- Begin changes by rnahata for Bug 6448678
6503    l_temp_msg_count := Fnd_Msg_Pub.count_msg;
6504 
6505    IF (l_log_statement >= l_log_current_level) THEN
6506       fnd_log.string(l_log_statement,
6507        L_DEBUG_KEY,
6508        'Before calling VALIDATE_MR_ROUTE_DATE. l_msg_count = ' || l_msg_count);
6509    END IF;
6510 
6511    OPEN c_task (p_visit_id);
6512    LOOP
6513        FETCH c_task INTO c_task_rec;
6514        EXIT WHEN c_task%NOTFOUND;
6515        -- SKPATHAK :: ER:12730539 :: 01-AUG-2011
6516        -- If the task's summary task is in partially implemented status, need not validate its route/MR
6517        OPEN get_task_status (c_task_rec.originating_task_id);
6518        FETCH get_task_status INTO l_task_status;
6519        CLOSE get_task_status;
6520        IF l_task_status <> 'PARTIALLY RELEASED' THEN
6521          --SATRAJEN :: BUG 12990261 :: Called a different function to sum up all task numbers. :: Jun 2012
6522          --Validate_MR_Route_Date
6523          l_valid_flag := Validate_MR_Route_Date
6524          (
6525             p_mr_route_id       => c_task_rec.mr_route_id,
6526             p_visit_task_number => c_task_rec.visit_task_number,
6527             p_start_date_time   => c_task_rec.start_date_time,
6528             p_end_date_time     => c_task_rec.end_date_time
6529          );
6530 
6531          IF (l_log_statement >= l_log_current_level) THEN
6532             fnd_log.string(l_log_statement,
6533             L_DEBUG_KEY,
6534             'After calling VALIDATE_MR_ROUTE_DATE for task Id: ' ||
6535             c_task_rec.visit_task_id ||', l_msg_count = ' || l_msg_count);
6536             fnd_log.string(l_log_statement,
6537             L_DEBUG_KEY,
6538             'c_task_rec.visit_task_number ** l_valid_flag --@> ' ||c_task_rec.visit_task_number||' ** '||l_valid_flag);
6539          END IF;
6540 
6541          -- SATRAJEN :: BUG 12990261 ::  :: Jun 2012
6542          -- Added logic for Bug 14336467 :: 12-JUL-2012
6543          IF BitAND(l_valid_flag,POWER(2,0))<>0 THEN l_task_nos_1 := l_task_nos_1 || c_task_rec.visit_task_number || ',' ; l_invalid_mr := 'Y'; END IF;
6544          IF BitAND(l_valid_flag,POWER(2,1))<>0 THEN l_task_nos_2 := l_task_nos_2 || c_task_rec.visit_task_number || ',' ; l_invalid_mr := 'Y'; END IF;
6545          IF BitAND(l_valid_flag,POWER(2,2))<>0 THEN l_task_nos_3 := l_task_nos_3 || c_task_rec.visit_task_number || ',' ; l_invalid_mr := 'Y'; END IF;
6546          IF BitAND(l_valid_flag,POWER(2,3))<>0 THEN l_task_nos_4 := l_task_nos_4 || c_task_rec.visit_task_number || ',' ; l_invalid_mr := 'Y'; END IF;
6547          IF BitAND(l_valid_flag,POWER(2,4))<>0 THEN l_task_nos_5 := l_task_nos_5 || c_task_rec.visit_task_number || ',' ; l_invalid_mr := 'Y'; END IF;
6548          IF BitAND(l_valid_flag,POWER(2,5))<>0 THEN l_task_nos_6 := l_task_nos_6 || c_task_rec.visit_task_number || ',' ; l_invalid_mr := 'Y'; END IF;
6549          -- END of Bug 12990261 :: Jun 2012
6550 
6551        END IF;
6552 
6553    END LOOP;
6554 
6555    -- SATRAJEN :: BUG 14336467 :: 12-JUL-2012 :: To prevent erroring out in case of OPERATIONAL visits.
6556    l_auto_visit_flag := c_visit_rec.auto_visit_type_flag ;
6557    l_unit_sch_id := c_visit_rec.unit_schedule_id ;
6558 
6559    IF (l_log_statement >= l_log_current_level) THEN
6560       fnd_log.string(l_log_statement, L_DEBUG_KEY, 'l_auto_visit_flag--@>'||l_auto_visit_flag );
6561       fnd_log.string(l_log_statement, L_DEBUG_KEY, 'l_unit_sch_id--@>'||l_unit_sch_id );
6562    END IF;
6563 
6564    -- On plan visit : p_module_type = 'CST'
6565    -- And if it is operational visit running from concurrent procedure create/update operational visits.
6566    IF (l_auto_visit_flag IS NOT NULL AND l_unit_sch_id IS NOT NULL AND p_module_type = 'CST' ) THEN
6567       IF (l_invalid_mr = 'Y') THEN
6568           Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_MR_ASSOC_FAIL');
6569           Fnd_Msg_Pub.ADD;
6570       END IF;
6571    ELSE
6572        -- SATRAJEN :: Bug 12990261 :: Jun 2012
6573        IF (LENGTH(l_task_nos_1) > 0) THEN
6574           l_task_nos_1 := SUBSTR (l_task_nos_1,0,(LENGTH(l_task_nos_1)-1));
6575           Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_TSK_STDT_ROUT_STDT');
6576           Fnd_Message.Set_Token('TASK_NUMBER', l_task_nos_1);
6577           Fnd_Msg_Pub.ADD;
6578        END IF;
6579 
6580        IF (LENGTH(l_task_nos_2) > 0) THEN
6581           l_task_nos_2 := SUBSTR (l_task_nos_2,0,(LENGTH(l_task_nos_2)-1));
6582           Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_TSK_ENDT_ROUT_ENDT');
6583           Fnd_Message.Set_Token('TASK_NUMBER', l_task_nos_2);
6584           Fnd_Msg_Pub.ADD;
6585        END IF;
6586 
6587        IF (LENGTH(l_task_nos_3) > 0) THEN
6588           l_task_nos_3 := SUBSTR (l_task_nos_3,0,(LENGTH(l_task_nos_3)-1));
6589           Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_TSK_NO_ROUTE');
6590           Fnd_Message.Set_Token('TASK_NUMBER', l_task_nos_3);
6591           Fnd_Msg_Pub.ADD;
6592        END IF;
6593 
6594        IF (LENGTH(l_task_nos_4) > 0) THEN
6595           l_task_nos_4 := SUBSTR (l_task_nos_4,0,(LENGTH(l_task_nos_4)-1));
6596           Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_NO_TS_SD_LT_MR');
6597           Fnd_Message.Set_Token('TASK_NUMBER', l_task_nos_4);
6598           Fnd_Msg_Pub.ADD;
6599        END IF;
6600 
6601        IF (LENGTH(l_task_nos_5) > 0) THEN
6602           l_task_nos_5 := SUBSTR (l_task_nos_5,0,(LENGTH(l_task_nos_5)-1));
6603           Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_NO_TS_ED_GT_MR');
6604           Fnd_Message.Set_Token('TASK_NUMBER', l_task_nos_5);
6605           Fnd_Msg_Pub.ADD;
6606        END IF;
6607 
6608        IF (LENGTH(l_task_nos_6) > 0) THEN
6609           l_task_nos_6 := SUBSTR (l_task_nos_6,0,(LENGTH(l_task_nos_6)-1));
6610           Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_NO_MR_ID');
6611           Fnd_Message.Set_Token('TASK_NUMBER', l_task_nos_6);
6612           Fnd_Msg_Pub.ADD;
6613        END IF;
6614 
6615        -- END of Bug 12990261 :: Jun 2012
6616    END IF; -- l_auto_visit_flag is not null check.
6617    -- END of Bug 14336467 :: 12-JUL-2012
6618 
6619    CLOSE c_task;
6620 
6621    l_msg_count := Fnd_Msg_Pub.count_msg;
6622    IF (l_msg_count <> l_temp_msg_count) THEN
6623       IF (l_log_statement >= l_log_current_level) THEN
6624          fnd_log.string(l_log_statement,
6625          L_DEBUG_KEY,
6626          'Errors from VALIDATE_MR_ROUTE_DATE. Message count: ' || l_msg_count);
6627       END IF;
6628       RAISE FND_API.G_EXC_ERROR;
6629    END IF;
6630    -- End changes by rnahata for Bug 6448678
6631 
6632   -- transit check visit Change
6633   -- yazhou start
6634    IF  p_orig_visit_id IS NOT NULL THEN
6635 
6636       OPEN c_visit (p_orig_visit_id);
6637       FETCH c_visit INTO c_orig_visit_rec;
6638       CLOSE c_visit;
6639 
6640       OPEN c_visit_wo_status (p_orig_visit_id);
6641       FETCH c_visit_wo_status INTO l_orig_visit_status;
6642       CLOSE c_visit_wo_status;
6643    END IF;
6644    -- yazhou end
6645 
6646    -- SKPATHAK :: ER:12730539 :: 01-AUG-2011 :: START
6647    -- Need to update materials for this visit on P2P
6648    IF (l_log_statement >= l_log_current_level) THEN
6649       fnd_log.string(l_log_statement,
6650                      L_DEBUG_KEY,
6651                      'Before Calling AHL_LTP_REQST_MATRL_PUB.Process_Planned_Materials. p_visit_id = ' || p_visit_id );
6652    END IF;
6653 
6654    IF (p_visit_id IS NOT NULL) THEN
6655       AHL_LTP_REQST_MATRL_PUB.Process_Planned_Materials (
6656          p_api_version             => 1.0,
6657          p_init_msg_list           => FND_API.G_FALSE,
6658          p_commit                  => FND_API.G_FALSE,
6659          p_validation_level        => FND_API.G_VALID_LEVEL_FULL,
6660          p_visit_id                => p_visit_id,
6661          p_operation_flag          => 'U',
6662          x_planned_order_flag      => l_planned_order_flag,
6663          x_return_status           => l_return_status,
6664          x_msg_count               => l_msg_count,
6665          x_msg_data                => x_msg_data);
6666 
6667       IF (l_log_statement >= l_log_current_level) THEN
6668          fnd_log.string(l_log_statement,
6669                         L_DEBUG_KEY,
6670                         'After Calling AHL_LTP_REQST_MATRL_PUB.Process_Planned_Materials. Return Status = ' || l_return_status );
6671       END IF;
6672 
6673       IF NVL(l_return_status,'x') <> FND_API.G_RET_STS_SUCCESS THEN
6674         x_msg_count := l_msg_count;
6675         x_return_status := l_return_status;
6676         IF l_return_status = Fnd_Api.g_ret_sts_error THEN
6677           RAISE Fnd_Api.g_exc_error;
6678         ELSIF l_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
6679           RAISE Fnd_Api.g_exc_unexpected_error;
6680         END IF;
6681       END IF;
6682    END IF;
6683 
6684    -- Delete UMP BOM data when UE is pushed to production (any status)
6685    DELETE FROM AHL_UMP_RESOURCE_REQMNTS
6686    WHERE object_type = 'UE'
6687    AND MAINTENANCE_REQMNT_ID IN (SELECT unit_effectivity_id FROM ahl_visit_tasks_b WHERE visit_id = p_visit_id);
6688 
6689    DELETE FROM AHL_UMP_MATERIAL_REQMNTS
6690    WHERE object_type = 'UE'
6691    AND MAINTENANCE_REQMNT_ID IN (SELECT unit_effectivity_id FROM ahl_visit_tasks_b WHERE visit_id = p_visit_id);
6692 
6693    DELETE FROM AHL_UMP_MAINT_REQMNTS
6694    WHERE object_type = 'UE'
6695    AND MAINTENANCE_REQMNT_ID IN (SELECT unit_effectivity_id FROM ahl_visit_tasks_b WHERE visit_id = p_visit_id);
6696    -- SKPATHAK :: ER:12730539 :: 01-AUG-2011 :: END
6697 
6698    -- Start for 11.5.10 release
6699    -- By shbhanda 05-Jun-03
6700    -- For creating/updating Master Workorder in production for the visit in VWP
6701 
6702    --VWPE :: tchimira :: 15-FEB -2011 :: start
6703    IF (l_log_statement >= l_log_current_level) THEN
6704        fnd_log.string(l_log_statement,
6705                              L_DEBUG_KEY,
6706                              'Past Dated Flag value is : ' || c_visit_rec.past_dated_visit_flag);
6707    END IF;
6708    --Now if the value of the l_PAST_DATED_VISIT_FLAG is Y which means it is past dated visit.
6709    -- Create WOs as firm so that they will not be considered by PS schedule engine.
6710    IF(c_visit_rec.past_dated_visit_flag = 'Y') THEN
6711         l_firm_planned_flag := 1; --Firm
6712    END IF;
6713    --VWPE :: tchimira :: 15-FEB -2011 :: end
6714 
6715    /* Begin Changes by Shkalyan */
6716 
6717    idx := 0;
6718 
6719    OPEN c_visit_job (p_visit_id);
6720    FETCH c_visit_job INTO l_visit_wo_id, l_visit_wo_ovn, l_visit_wo_status, l_visit_wo_start_time,l_visit_wo_end_time;
6721    CLOSE c_visit_job;
6722    --
6723    OPEN get_task_inst_dtls(p_visit_id);
6724    FETCH get_task_inst_dtls INTO get_task_inst_rec;
6725    CLOSE get_task_inst_dtls;
6726    --
6727    -- master workorder for visit already exists
6728    IF l_visit_wo_id IS NOT NULL THEN
6729 
6730       -- If visit dates changed then reschedule the jobs
6731       -- SKPATHAK :: 20-JUN-2011 :: VWPE: ER:12673125
6732       -- If visit's status is not draft, do NOT reshedule the visit jobs since the rescheduling has already been done during visit dates update
6733       IF ((l_visit_wo_start_time <> c_visit_rec.START_DATE_TIME
6734           OR l_visit_wo_end_time <> c_visit_rec.CLOSE_DATE_TIME) AND  c_visit_rec.status_code = 'DRAFT') THEN
6735 
6736          IF (l_log_statement >= l_log_current_level) THEN
6737             fnd_log.string(l_log_statement,
6738              L_DEBUG_KEY,
6739              'Before calling AHL_PRD_WORKORDER_PVT.reschedule_visit_jobs');
6740          END IF;
6741 
6742          AHL_PRD_WORKORDER_PVT.reschedule_visit_jobs(
6743               P_API_VERSION                  => 1.0,
6744               x_return_status                => l_return_status,
6745               x_msg_count                    => l_msg_count,
6746               x_msg_data                     => l_msg_data,
6747               P_VISIT_ID                     => p_visit_id,
6748               p_x_scheduled_start_date       => c_visit_rec.START_DATE_TIME,
6749               p_x_scheduled_end_date         => c_visit_rec.CLOSE_DATE_TIME);
6750 
6751          IF (l_log_statement >= l_log_current_level) THEN
6752             fnd_log.string(l_log_statement,
6753                            L_DEBUG_KEY,
6754                            'After calling AHL_PRD_WORKORDER_PVT.reschedule_visit_jobs. Return Status = ' || l_return_status);
6755          END IF;
6756 
6757          IF (l_return_status <> Fnd_Api.G_RET_STS_SUCCESS) THEN
6758             IF (l_log_statement >= l_log_current_level) THEN
6759                fnd_log.string(l_log_statement,
6760                               L_DEBUG_KEY,
6761                               'Errors from AHL_PRD_WORKORDER_PVT.reschedule_visit_jobs. Message count: ' ||
6762                               l_msg_count || ', message data: ' || l_msg_data);
6763             END IF;
6764             IF l_return_status = FND_API.G_RET_STS_ERROR THEN
6765                RAISE FND_API.G_EXC_ERROR;
6766             ELSE
6767                RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
6768             END IF;
6769          END IF;
6770 
6771       END IF; --reschedule visit jobs
6772 
6773       -- If p_module_type is 'CST' then master workorder status should stay as DRAFT
6774       -- Update only workorder time
6775 
6776       -- Re-Query the OVN for the workorder again since its been updated by
6777       -- AHL_PRD_WORKORDER_PVT.RESCHEDULE_VISIT_JOBS API.
6778       -- Balaji added this fix as a part of BAE OVN bug fix for workorders.
6779       OPEN c_visit_job (p_visit_id);
6780       FETCH c_visit_job INTO l_visit_wo_id, l_visit_wo_ovn, l_visit_wo_status, l_visit_wo_start_time,l_visit_wo_end_time;
6781       CLOSE c_visit_job;
6782 
6783       IF p_module_type = 'CST' THEN
6784          idx := idx+1;
6785          l_prd_workorder_tbl(idx).DML_OPERATION := 'U';
6786          l_prd_workorder_tbl(idx).WORKORDER_ID := l_visit_wo_id;
6787          l_prd_workorder_tbl(idx).OBJECT_VERSION_NUMBER := l_visit_wo_ovn;
6788          l_prd_workorder_tbl(idx).SCHEDULED_START_DATE  := c_visit_rec.start_date_time;
6789          l_prd_workorder_tbl(idx).SCHEDULED_END_DATE    := c_visit_rec.close_date_time;
6790       END IF;
6791 
6792       -- If visit master workorder status is already RELEASED, the no change should be made
6793 
6794       IF p_module_type <> 'CST' AND l_visit_wo_status <> '3' THEN
6795          --TCHIMIRA::P2P CP ER 9151144::02-DEC-2009
6796          --Modified the if condition
6797          IF (p_release_flag = 'Y' OR p_release_flag = 'R')  THEN
6798             -- change status from UNRELEASED/DRAFT to RELEASED
6799             idx := idx+1;
6800             l_prd_workorder_tbl(idx).DML_OPERATION := 'U';
6801             l_prd_workorder_tbl(idx).WORKORDER_ID := l_visit_wo_id;
6802             l_prd_workorder_tbl(idx).OBJECT_VERSION_NUMBER := l_visit_wo_ovn;
6803             l_prd_workorder_tbl(idx).STATUS_CODE  := '3';   -- Released
6804             l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG     := 1; -- Firm
6805             -- l_prd_workorder_tbl(idx).VALIDATE_STRUCTURE := 'Y'; -- rroy - TC - validate entire structure
6806             l_prd_workorder_tbl(idx).SCHEDULED_START_DATE  := c_visit_rec.start_date_time;
6807             l_prd_workorder_tbl(idx).SCHEDULED_END_DATE    := c_visit_rec.close_date_time;
6808          ELSIF l_visit_wo_status = '17' THEN
6809             -- Master workorder was in Draft status
6810             -- Need to make it UNRELEASED now
6811             idx := idx+1;
6812             l_prd_workorder_tbl(idx).DML_OPERATION := 'U';
6813             l_prd_workorder_tbl(idx).WORKORDER_ID := l_visit_wo_id;
6814             l_prd_workorder_tbl(idx).OBJECT_VERSION_NUMBER := l_visit_wo_ovn;
6815             l_prd_workorder_tbl(idx).SCHEDULED_START_DATE  := c_visit_rec.start_date_time;
6816             l_prd_workorder_tbl(idx).SCHEDULED_END_DATE    := c_visit_rec.close_date_time;
6817             l_prd_workorder_tbl(idx).STATUS_CODE           := '1';   -- Unreleased
6818             l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG     := 1; -- Firm
6819          -- Added by jaramana on 20-OCT-2009 for Bug 9016332
6820          -- Also need to handle if the Master Work Order is in Unreleased status
6821          -- and user does P2P with Unreleased work orders
6822          ELSIF l_visit_wo_status = '1' THEN
6823             -- Master workorder is in Unreleased status and user wants to keep it that way
6824             idx := idx+1;
6825             l_prd_workorder_tbl(idx).DML_OPERATION         := 'U';
6826             l_prd_workorder_tbl(idx).WORKORDER_ID          := l_visit_wo_id;
6827             l_prd_workorder_tbl(idx).OBJECT_VERSION_NUMBER := l_visit_wo_ovn;
6828             l_prd_workorder_tbl(idx).SCHEDULED_START_DATE  := c_visit_rec.start_date_time;
6829             l_prd_workorder_tbl(idx).SCHEDULED_END_DATE    := c_visit_rec.close_date_time;
6830             l_prd_workorder_tbl(idx).STATUS_CODE           := '1';   -- Unreleased
6831             l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG     := 1; -- Firm
6832          -- End addition by jaramana on 20-OCT-2009 for Bug 9016332
6833          END IF;
6834       ELSIF p_module_type <> 'CST' THEN
6835          idx := idx+1;
6836          l_prd_workorder_tbl(idx).DML_OPERATION := 'U';
6837          l_prd_workorder_tbl(idx).WORKORDER_ID := l_visit_wo_id;
6838          l_prd_workorder_tbl(idx).OBJECT_VERSION_NUMBER := l_visit_wo_ovn;
6839          --l_prd_workorder_tbl(idx).STATUS_CODE  := '3';   -- Released
6840          --l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG     := 1; -- Firm
6841          --l_prd_workorder_tbl(idx).VALIDATE_STRUCTURE := 'Y'; -- rroy - TC - validate entire structure
6842          l_prd_workorder_tbl(idx).SCHEDULED_START_DATE  := c_visit_rec.start_date_time;
6843          l_prd_workorder_tbl(idx).SCHEDULED_END_DATE    := c_visit_rec.close_date_time;
6844       END IF;
6845       l_prd_workorder_tbl(idx).BATCH_ID := c_visit_rec.VISIT_NUMBER;
6846       l_prd_workorder_tbl(idx).HEADER_ID := 0; -- Visit
6847 
6848       /* MANESING::Component Maintenance Planning Project, 02-Nov-2011
6849        * This is a workaround for Component Visits. Visit master workorder may have been created with an
6850        * instance in UC table due to non-serialized instance in 1st Repair Batch. Therefore, if available,
6851        * update visit master workorder instance with serialized instance in any of the Repair Batches in this
6852        * Component Visit, otherwise let still there be UC instance in Visit master workorder.
6853        */
6854       IF (l_is_comp_visit = 'Y') THEN
6855 
6856           -- check whether any serialized instance is available in any of the Repair Batches for this Component Visit
6857           OPEN get_serialized_inst_csr (p_visit_id);
6858           FETCH get_serialized_inst_csr INTO serialized_inst_rec;
6859           IF (get_serialized_inst_csr%FOUND) THEN
6860               l_prd_workorder_tbl(idx).inventory_item_id := serialized_inst_rec.inventory_item_id;
6861               l_prd_workorder_tbl(idx).item_instance_id  := serialized_inst_rec.instance_id;
6862           ELSE
6863               OPEN get_any_uc_inst_csr;
6864               FETCH get_any_uc_inst_csr INTO l_prd_workorder_tbl(idx).inventory_item_id,
6865                                              l_prd_workorder_tbl(idx).item_instance_id;
6866               CLOSE get_any_uc_inst_csr;
6867           END IF;
6868           CLOSE get_serialized_inst_csr;
6869       END IF; -- if l_is_comp_visit = 'Y'
6870 
6871    ELSE  -- Visit Master Workorder doesn't exist
6872 
6873       idx := idx+1;
6874 
6875       l_prd_workorder_tbl(idx).DML_OPERATION := 'C';
6876 
6877       IF (p_module_type = 'CST') THEN
6878          l_prd_workorder_tbl(idx).STATUS_CODE           := '17';  -- draft
6879 
6880          -- sracha 27Jul05. Create Draft WO as firm to avoid scheduling by EAM.
6881          --l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG     := 2; -- Planned
6882          l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG     := 1; -- Firm
6883 
6884      ELSE
6885          IF p_orig_visit_id IS NOT NULL THEN
6886             -- Create master workorder in same status as that of the originating visit
6887             l_prd_workorder_tbl(idx).STATUS_CODE           := l_orig_visit_status;
6888          ELSE
6889             --TCHIMIRA::P2P CP ER 9151144::02-DEC-2009::Modified if condition
6890             IF (p_release_flag = 'Y' OR p_release_flag = 'R') THEN
6891                l_prd_workorder_tbl(idx).STATUS_CODE           := '3';  -- Released
6892             ELSE
6893                l_prd_workorder_tbl(idx).STATUS_CODE           := '1';  -- Unreleased
6894             END IF;
6895          END IF;
6896 
6897          l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG     := 1; -- Firm
6898 
6899      END IF;
6900      -- Post 11.5.10 Changes by senthil
6901      l_prd_workorder_tbl(idx).SCHEDULED_START_DATE  := c_visit_rec.start_date_time;
6902      -- Changed by Shbhanda on 30th Jan 04
6903      l_prd_workorder_tbl(idx).SCHEDULED_END_DATE  := c_visit_rec.close_date_time;
6904 
6905      l_prd_workorder_tbl(idx).MASTER_WORKORDER_FLAG := 'Y';
6906      l_prd_workorder_tbl(idx).BATCH_ID := c_visit_rec.VISIT_NUMBER;
6907      l_prd_workorder_tbl(idx).HEADER_ID := 0; -- Visit
6908      /* End Changes by Shkalyan */
6909      l_prd_workorder_tbl(idx).VISIT_ID              := p_visit_id;
6910      l_prd_workorder_tbl(idx).ORGANIZATION_ID       := c_visit_rec.organization_id;
6911      l_prd_workorder_tbl(idx).PROJECT_ID            := c_visit_rec.project_id;
6912      l_prd_workorder_tbl(idx).DEPARTMENT_ID         := c_visit_rec.department_id ;
6913      l_prd_workorder_tbl(idx).JOB_DESCRIPTION       := c_visit_rec.visit_name;
6914      l_prd_workorder_tbl(idx).INVENTORY_ITEM_ID     := NVL(c_visit_rec.inventory_item_id,get_task_inst_rec.inventory_item_id);
6915      l_prd_workorder_tbl(idx).ITEM_INSTANCE_ID      := NVL(c_visit_rec.item_instance_id,get_task_inst_rec.instance_id);
6916 
6917      /* MANESING::Component Maintenance Planning Project, 02-Nov-2011
6918       * This is a workaround for Component Visits. If the 1st Repair Batch is created for a non-serialized
6919       * instance, then create visit master workorder with any instance in UC table.
6920       */
6921      IF (l_is_comp_visit = 'Y') THEN
6922 
6923          -- check whether visit master workorder instance is serialized
6924          OPEN get_inst_serial_no_csr (l_prd_workorder_tbl(idx).item_instance_id);
6925          FETCH get_inst_serial_no_csr INTO l_serial_number;
6926          IF (get_inst_serial_no_csr%FOUND) THEN
6927 
6928              -- if 1st Repair Batch instance is non-serialized
6929              IF (l_serial_number IS NULL) THEN
6930                  OPEN get_any_uc_inst_csr;
6931                  FETCH get_any_uc_inst_csr INTO l_prd_workorder_tbl(idx).inventory_item_id,
6932                                                 l_prd_workorder_tbl(idx).item_instance_id;
6933                  CLOSE get_any_uc_inst_csr;
6934              END IF;
6935          END IF;
6936          CLOSE get_inst_serial_no_csr;
6937      END IF; -- if l_is_comp_visit = 'Y'
6938 
6939   END IF; --visit master workorder exist
6940 
6941   -- Create Workorders for tasks that have no workorder in production
6942   -- Update workorder only if the previous status is DRAFT
6943 
6944   OPEN c_task_ct(p_visit_id);
6945   FETCH c_task_ct INTO l_count;
6946   CLOSE c_task_ct;
6947 
6948   IF (l_log_statement >= l_log_current_level) THEN
6949      fnd_log.string(l_log_statement,
6950                     L_DEBUG_KEY,
6951                     'Task Count' || l_count);
6952   END IF;
6953 
6954   IF l_count > 0 THEN
6955      OPEN c_task(p_visit_id);
6956      FETCH c_task INTO c_task_rec;
6957      WHILE c_task%FOUND LOOP
6958 
6959      /* Begin Changes by Shkalyan */
6960      IF p_orig_visit_id is not NULL THEN
6961         -- Check the workorder status for the coresponding task in originating visit
6962 
6963         l_orig_task_status := null;
6964 
6965         OPEN c_wo_status(p_orig_visit_id,c_task_rec.visit_task_id);
6966         FETCH c_wo_status INTO l_orig_task_status;
6967         CLOSE c_wo_status;
6968      END IF;
6969 
6970      IF p_orig_visit_id is NULL OR l_orig_task_status is not null THEN
6971 
6972         -- Merge process for 11.5.10 bug fix on CMRDV10P
6973         -- Fix for Bug 3549573
6974         l_workorder_id := NULL;
6975         l_workorder_ovn := NULL;
6976         l_workorder_status := NULL;
6977 
6978         -- To get the Workorder for Visit Task
6979         OPEN c_job(c_task_rec.visit_task_id);
6980         FETCH c_job INTO l_workorder_id, l_workorder_ovn, l_workorder_status;
6981         CLOSE c_job;
6982 
6983         -- if workorder exists for the task
6984         IF l_workorder_id IS NOT NULL THEN
6985            IF (l_log_statement >= l_log_current_level) THEN
6986               fnd_log.string(l_log_statement,
6987                              L_DEBUG_KEY,
6988                              'Workorder Id for Task = ' || l_workorder_id);
6989               END IF;
6990                -- If p_module_type is 'CST' then workorder status should stay as DRAFT
6991                -- Update only workorder time
6992 
6993               IF p_module_type = 'CST' THEN
6994                    idx := idx+1;
6995                    l_prd_workorder_tbl(idx).DML_OPERATION := 'U';
6996                    l_prd_workorder_tbl(idx).WORKORDER_ID := l_workorder_id;
6997                    l_prd_workorder_tbl(idx).OBJECT_VERSION_NUMBER := l_workorder_ovn;
6998 
6999               --POST11510 cxcheng. If summary task, use the min,max for sub tasks
7000               IF (c_task_rec.task_type_code = 'SUMMARY') THEN
7001                  OPEN get_summary_task_times_csr(c_task_rec.visit_task_id);
7002                  FETCH get_summary_task_times_csr INTO l_prd_workorder_tbl(idx).SCHEDULED_START_DATE,
7003                                                     l_prd_workorder_tbl(idx).SCHEDULED_END_DATE;
7004                  CLOSE get_summary_task_times_csr;
7005               ELSE
7006                  l_prd_workorder_tbl(idx).SCHEDULED_START_DATE := c_task_rec.START_DATE_TIME;
7007                  l_prd_workorder_tbl(idx).SCHEDULED_END_DATE   := c_task_rec.END_DATE_TIME;
7008               END IF;
7009 
7010                   l_prd_workorder_tbl(idx).ITEM_INSTANCE_ID  := c_task_rec.instance_id ;                    l_prd_workorder_tbl(idx).BATCH_ID := c_visit_rec.visit_number;
7011             l_prd_workorder_tbl(idx).HEADER_ID := c_task_rec.visit_task_number;
7012 
7013               END IF;
7014               -- Only update task if previous status is DRAFT
7015               -- SKPATHAK :: 20-JUN-2011 :: VWPE: ER:12673125
7016               -- Do not release or unrelease duplicate or stage tasks
7017               IF ( p_module_type <> 'CST' AND l_workorder_status = '17' AND c_task_rec.task_type_code NOT IN ('STAGE','DUPLICATE')) THEN
7018                    idx := idx+1;
7019                    --TCHIMIRA::P2P CP ER 9151144::02-DEC-2009::Modified if condition
7020                    IF (p_release_flag = 'Y' OR p_release_flag = 'R') THEN
7021                       l_prd_workorder_tbl(idx).STATUS_CODE := '3';  -- Released
7022                    ELSE
7023                       l_prd_workorder_tbl(idx).STATUS_CODE := '1';  -- Unreleased
7024                    END IF;
7025                    l_prd_workorder_tbl(idx).DML_OPERATION := 'U';
7026                    l_prd_workorder_tbl(idx).WORKORDER_ID := l_workorder_id;
7027                    l_prd_workorder_tbl(idx).OBJECT_VERSION_NUMBER := l_workorder_ovn;
7028                    IF ( l_firm_planned_flag IS NOT NULL AND
7029                         -- SKPATHAK :: ER: 9147951 :: 11-JAN-2010
7030                         -- For task with past task dates, WOs are always firm irrespective of the profile value
7031                         c_task_rec.past_task_start_date IS NULL AND
7032                         l_firm_planned_flag = '2' ) THEN
7033                         l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG := 2; -- Planned
7034                    ELSE
7035                         l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG := 1; -- Firm
7036                    END IF;
7037                   --POST11510 cxcheng. If summary task, use the min,max for sub tasks
7038                   IF (c_task_rec.task_type_code = 'SUMMARY') THEN
7039                   OPEN get_summary_task_times_csr(c_task_rec.visit_task_id);
7040                   FETCH get_summary_task_times_csr INTO l_prd_workorder_tbl(idx).SCHEDULED_START_DATE,
7041                                                   l_prd_workorder_tbl(idx).SCHEDULED_END_DATE  ;
7042                   CLOSE get_summary_task_times_csr;
7043                   ELSE
7044                        l_prd_workorder_tbl(idx).SCHEDULED_START_DATE := c_task_rec.START_DATE_TIME;
7045                        l_prd_workorder_tbl(idx).SCHEDULED_END_DATE := c_task_rec.END_DATE_TIME;
7046                   END IF;
7047 
7048               /* Begin changes by rnahata for Bug 5758813 - For summary tasks (both manual and MR summary tasks)
7049               and unassociated tasks the task name is passed as the workorder description.
7050               And for the Route tasks, the route number concatenated with the route title is
7051               passed as workorder description.*/
7052 
7053               IF (c_task_rec.task_type_code IN ('SUMMARY','UNASSOCIATED')) THEN
7054                  l_prd_workorder_tbl(idx).JOB_DESCRIPTION   :=  c_task_rec.visit_task_name;
7055               ELSE
7056                  OPEN get_wo_dtls_for_mrtasks_cur(c_task_rec.visit_task_id);
7057                  FETCH get_wo_dtls_for_mrtasks_cur INTO get_wo_dtls_for_mrtasks_rec;
7058                  --salogan added for bug 9754641 begin
7059                  IF get_wo_dtls_for_mrtasks_cur%NOTFOUND THEN
7060                     get_wo_dtls_for_mrtasks_rec.workorder_description := NULL;
7061                  END IF;
7062                  --salogan added for bug 9754641 begin
7063                  CLOSE get_wo_dtls_for_mrtasks_cur;
7064                  l_prd_workorder_tbl(idx).JOB_DESCRIPTION := get_wo_dtls_for_mrtasks_rec.workorder_description;
7065               END IF;
7066               l_prd_workorder_tbl(idx).ITEM_INSTANCE_ID := c_task_rec.instance_id ;                     l_prd_workorder_tbl(idx).BATCH_ID := c_visit_rec.visit_number;
7067               l_prd_workorder_tbl(idx).BATCH_ID := c_visit_rec.visit_number;
7068               l_prd_workorder_tbl(idx).HEADER_ID := c_task_rec.visit_task_number;
7069            END IF;
7070            /* End Changes by Shkalyan */
7071 
7072            --l_prd_workorder_tbl(idx).VISIT_ID          := p_visit_id;
7073            --l_prd_workorder_tbl(idx).ORGANIZATION_ID   := c_visit_rec.organization_id;
7074            --l_prd_workorder_tbl(idx).PROJECT_ID        := c_visit_rec.project_id;
7075            --l_prd_workorder_tbl(idx).INVENTORY_ITEM_ID := c_task_rec.inventory_item_id ;
7076            --l_prd_workorder_tbl(idx).ITEM_INSTANCE_ID  := c_task_rec.instance_id ;
7077            --l_prd_workorder_tbl(idx).VISIT_TASK_ID     := c_task_rec.visit_task_id ;
7078            --l_prd_workorder_tbl(idx).VISIT_TASK_NUMBER := c_task_rec.visit_task_number ;
7079            --l_prd_workorder_tbl(idx).PROJECT_TASK_ID   := c_task_rec.project_task_id ;
7080            --l_prd_workorder_tbl(idx).JOB_DESCRIPTION   := c_task_rec.visit_task_name ;
7081 
7082            ELSE  -- workorder doesn't exist
7083               idx := idx+1;
7084               l_prd_workorder_tbl(idx).DML_OPERATION     := 'C';
7085               IF (p_module_type = 'CST') THEN
7086                  l_prd_workorder_tbl(idx).STATUS_CODE           := '17';  -- Draft
7087                  -- sracha 27Jul05. Create Draft WO as firm to avoid scheduling by EAM.
7088                  --l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG     := 2; -- Planned
7089                  -- Modified the below line by tchimira on 20-Mar-2012 for the bug 13695008
7090                  -- Pass the value from the profile so that PS schedules draft work orders also.
7091                  l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG     := NVL(l_firm_planned_flag, 1);
7092 
7093                ELSE
7094                   IF p_orig_visit_id IS NOT NULL THEN
7095                      -- Create master workorder in same status as that of the originating visit
7096                      l_prd_workorder_tbl(idx).STATUS_CODE     := l_orig_task_status;
7097                   ELSE
7098                      IF (p_release_flag = 'Y' OR p_release_flag = 'R') THEN
7099                         l_prd_workorder_tbl(idx).STATUS_CODE  := '3';  -- Released
7100                                                                                     ELSE
7101                         l_prd_workorder_tbl(idx).STATUS_CODE  := '1';  -- Unreleased
7102                      END IF;
7103                      -- SKPATHAK :: 18-JUL-2011 :: VWPE 12730539
7104                      -- Always create draft WOs for stage tasks
7105                      IF c_task_rec.task_type_code = 'STAGE' THEN
7106                        l_prd_workorder_tbl(idx).STATUS_CODE           := '17';  -- Draft
7107                      END IF;
7108 
7109                   END IF;
7110 
7111                   IF ( l_firm_planned_flag IS NOT NULL AND
7112                        -- SKPATHAK :: ER: 9147951 :: 11-JAN-2010
7113                        -- For task with past task dates, WOs are always firm irrespective of the profile value
7114                        c_task_rec.past_task_start_date IS NULL AND
7115                        l_firm_planned_flag = '2' ) THEN
7116                       l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG     := 2; -- Planned
7117                   ELSE
7118                       l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG     := 1; -- Firm
7119                   END IF;
7120 
7121                /*
7122                Get_Task_Dependencies
7123                (
7124                  p_visit_number       => c_visit_rec.visit_number,
7125                  p_visit_task_id      => c_task_rec.visit_task_id,
7126                  p_visit_task_number  => c_task_rec.visit_task_number,
7127                  p_x_relationship_tbl => l_prd_workorder_rel_tbl
7128                );
7129                */
7130               END IF; -- 'CST'
7131               IF (c_task_rec.task_type_code = 'SUMMARY') THEN
7132                  l_prd_workorder_tbl(idx).MASTER_WORKORDER_FLAG := 'Y';
7133               ELSE
7134                  l_prd_workorder_tbl(idx).MASTER_WORKORDER_FLAG := 'N';
7135               END IF;
7136 
7137               l_prd_workorder_tbl(idx).BATCH_ID := c_visit_rec.visit_number;
7138               l_prd_workorder_tbl(idx).HEADER_ID := c_task_rec.visit_task_number;
7139               /* End Changes by Shkalyan */
7140               l_prd_workorder_tbl(idx).VISIT_ID          := p_visit_id;
7141               l_prd_workorder_tbl(idx).ORGANIZATION_ID   := c_visit_rec.organization_id;
7142               l_prd_workorder_tbl(idx).INVENTORY_ITEM_ID := c_task_rec.inventory_item_id ;
7143               l_prd_workorder_tbl(idx).ITEM_INSTANCE_ID  := c_task_rec.instance_id ;
7144               l_prd_workorder_tbl(idx).VISIT_TASK_ID     := c_task_rec.visit_task_id ;
7145               l_prd_workorder_tbl(idx).VISIT_TASK_NUMBER := c_task_rec.visit_task_number ;
7146               -- PRAKKUM :: PIE :: 13-OCT-2010
7147               -- Pass the Project Task Id only for work orders that don't correspond to Summary Tasks
7148               IF ( c_task_rec.task_type_code <> 'SUMMARY' ) THEN
7149                 l_prd_workorder_tbl(idx).PROJECT_TASK_ID   := c_task_rec.project_task_id ;
7150                 l_prd_workorder_tbl(idx).PROJECT_ID        := c_visit_rec.project_id;
7151               END IF;
7152 
7153               /*B5758813 - rnahata - For summary tasks (both manual and MR summary tasks)
7154               and unassociated tasks the task name is passed as the workorder description.
7155               And for the MR tasks, the route number concatenated with the route title is
7156               passed as workorder description.*/
7157               IF (c_task_rec.task_type_code IN ('SUMMARY','UNASSOCIATED')) THEN
7158                  l_prd_workorder_tbl(idx).JOB_DESCRIPTION   :=  c_task_rec.visit_task_name;
7159               ELSE
7160                  OPEN get_wo_dtls_for_mrtasks_cur(c_task_rec.visit_task_id);
7161                  FETCH get_wo_dtls_for_mrtasks_cur INTO get_wo_dtls_for_mrtasks_rec;
7162                  --salogan added for bug 9754641 begin
7163                  IF get_wo_dtls_for_mrtasks_cur%NOTFOUND THEN
7164                     get_wo_dtls_for_mrtasks_rec.workorder_description := NULL;
7165                  END IF;
7166                  --salogan added for bug 9754641 begin
7167                  CLOSE get_wo_dtls_for_mrtasks_cur;
7168                  l_prd_workorder_tbl(idx).JOB_DESCRIPTION := get_wo_dtls_for_mrtasks_rec.workorder_description;
7169               END IF;
7170 
7171               IF c_task_rec.mr_route_id IS NOT NULL AND c_task_rec.mr_route_id <> FND_API.g_miss_num THEN
7172                  OPEN c_route (c_task_rec.mr_route_id);
7173                  FETCH c_route INTO l_route_id;
7174                  CLOSE c_route;
7175                  l_prd_workorder_tbl(idx).ROUTE_ID := l_route_id ;
7176               ELSE
7177                  l_prd_workorder_tbl(idx).ROUTE_ID := Null;
7178               END IF;
7179 
7180               IF c_task_rec.department_id IS NOT NULL
7181                  AND c_task_rec.department_id <> FND_API.g_miss_num THEN
7182                  l_prd_workorder_tbl(idx).DEPARTMENT_ID   := c_task_rec.department_id ;
7183               ELSE
7184                  l_prd_workorder_tbl(idx).DEPARTMENT_ID   := c_visit_rec.department_id ;
7185               END IF;
7186 
7187               --POST11510 cxcheng. If summary task, use the min,max for sub tasks
7188               IF (c_task_rec.task_type_code = 'SUMMARY') THEN
7189                  OPEN get_summary_task_times_csr(c_task_rec.visit_task_id);
7190                  FETCH get_summary_task_times_csr INTO l_prd_workorder_tbl(idx).SCHEDULED_START_DATE,
7191                                                        l_prd_workorder_tbl(idx).SCHEDULED_END_DATE  ;
7192                  CLOSE get_summary_task_times_csr;
7193               ELSE
7194                  l_prd_workorder_tbl(idx).SCHEDULED_START_DATE  := c_task_rec.START_DATE_TIME;
7195                  l_prd_workorder_tbl(idx).SCHEDULED_END_DATE    := c_task_rec.END_DATE_TIME;
7196               END IF;
7197 
7198            END IF;  -- workorder exist
7199 
7200         END IF;  -- p_orig_visit null or orig_task_status null
7201 
7202         FETCH c_task INTO c_task_rec;
7203         END LOOP;
7204 
7205         CLOSE c_task;
7206 
7207      END IF; -- l_count
7208      -- yazhou end
7209 
7210    IF l_prd_workorder_tbl.COUNT > 0  THEN
7211 
7212        --BUG 13373947 :: PRAKKUM :: 10/02/2012  :: START
7213        -- IF visit planned end date is in PAST and visit itself is not past dated then validate workorder shcedule start dates
7214        IF ( c_visit_rec.close_date_time IS NOT NULL AND c_visit_rec.close_date_time<SYSDATE ) AND NVL(c_visit_rec.PAST_DATED_VISIT_FLAG,'N')='N' THEN
7215 
7216                l_max_schedule_start_date := c_visit_rec.close_date_time;
7217                For loopvar IN l_prd_workorder_tbl.FIRST..l_prd_workorder_tbl.LAST
7218                LOOP
7219 
7220                    IF (l_log_statement >= l_log_current_level) THEN
7221                         fnd_log.string(l_log_statement, L_DEBUG_KEY, 'l_prd_workorder_tbl(idx).SCHEDULED_START_DATE --@>'
7222                                                                      || TO_CHAR(l_prd_workorder_tbl(idx).SCHEDULED_START_DATE,'DD-MON-YYYY HH24:MI:SS'));
7223                         fnd_log.string(l_log_statement, L_DEBUG_KEY, 'get_vst_status_and_date_rec.close_date_time --@>'
7224                                                                      || TO_CHAR(get_vst_status_and_date_rec.close_date_time,'DD-MON-YYYY HH24:MI:SS'));
7225                    END IF;
7226 
7227                    IF l_prd_workorder_tbl(idx).SCHEDULED_START_DATE IS NOT NULL AND get_vst_status_and_date_rec.close_date_time IS NOT NULL THEN
7228                        IF l_prd_workorder_tbl(idx).SCHEDULED_START_DATE >  get_vst_status_and_date_rec.close_date_time THEN
7229                           -- Find max schedule start date
7230                           IF l_prd_workorder_tbl(idx).SCHEDULED_START_DATE > l_max_schedule_start_date THEN
7231                              l_max_schedule_start_date := l_prd_workorder_tbl(idx).SCHEDULED_START_DATE;
7232                           END IF;
7233                        END IF;
7234                    END IF;
7235                END LOOP;
7236 
7237                IF (l_log_statement >= l_log_current_level) THEN
7238                    fnd_log.string(l_log_statement, L_DEBUG_KEY, 'l_max_schedule_start_date --@>'
7239                                                                  || TO_CHAR(l_max_schedule_start_date,'DD-MON-YYYY HH24:MI:SS'));
7240                END IF;
7241 
7242                IF l_max_schedule_start_date > c_visit_rec.close_date_time THEN -- Validation Error
7243                   Fnd_Message.SET_NAME('AHL','AHL_VWP_NON_PS_PLAN_ED_DATE');
7244                   Fnd_Msg_Pub.ADD;
7245                   RAISE Fnd_Api.G_EXC_ERROR;
7246                END IF;
7247 
7248        END IF;
7249        --BUG 13373947 :: PRAKKUM :: 10/02/2012  :: END
7250 
7251       /* Begin Changes by Shkalyan */
7252       IF (l_log_statement >= l_log_current_level) THEN
7253          fnd_log.string(l_log_statement,
7254                         L_DEBUG_KEY,
7255                         'Before calling GET_VISIT_RELATIONSHIPS.');
7256       END IF;
7257       -- yazhou starts
7258       -- IF l_visit_wo_id IS NULL THEN
7259       Get_Visit_Relationships
7260       (
7261         p_visit_id           => p_visit_id,
7262         p_visit_number       => c_visit_rec.visit_number,
7263         p_x_relationship_tbl => l_prd_workorder_rel_tbl
7264       );
7265 
7266       IF (l_log_statement >= l_log_current_level) THEN
7267          fnd_log.string(l_log_statement,
7268                         L_DEBUG_KEY,
7269                         'After calling GET_VISIT_RELATIONSHIPS.');
7270       END IF;
7271       --     END IF;
7272       -- yazhou ends
7273 
7274       -- Commented the below code by tchimira on 14-MAR-2012 as per the requirement stated in the bug 13695008
7275       /*IF (l_log_statement >= l_log_current_level) THEN
7276          fnd_log.string(l_log_statement,
7277                         L_DEBUG_KEY,
7278                         'Before calling GET_VISIT_DEPENDENCIES.');
7279       END IF;
7280 
7281       IF (p_module_type <> 'CST') THEN
7282         Get_Visit_Dependencies
7283         (
7284           p_visit_id           => p_visit_id,
7285           p_visit_number       => c_visit_rec.visit_number,
7286           p_x_relationship_tbl => l_prd_workorder_rel_tbl
7287        );
7288       END IF;
7289 
7290       IF (l_log_statement >= l_log_current_level) THEN
7291          fnd_log.string(l_log_statement,
7292                         L_DEBUG_KEY,
7293                         'After calling GET_VISIT_DEPENDENCIES.');
7294       END IF;*/
7295 
7296       IF (l_log_statement >= l_log_current_level) THEN
7297          fnd_log.string(l_log_statement,
7298                         L_DEBUG_KEY,
7299                         'Before calling AHL_PRD_WORKORDER_PVT.Process_Jobs. l_prd_workorder_tbl.COUNT = ' || l_prd_workorder_tbl.COUNT);
7300       END IF;
7301 
7302       AHL_PRD_WORKORDER_PVT.Process_Jobs
7303       (    p_api_version           => p_api_version,
7304            p_init_msg_list         => p_init_msg_list,
7305            p_commit                => FND_API.G_FALSE,
7306            p_validation_level      => p_validation_level,
7307            p_default               => FND_API.G_TRUE,
7308            p_module_type           => p_module_type,
7309            x_return_status         => l_return_status,
7310            x_msg_count             => x_msg_count,
7311            x_msg_data              => x_msg_data,
7312            p_x_prd_workorder_tbl   => l_prd_workorder_tbl,
7313            p_prd_workorder_rel_tbl => l_prd_workorder_rel_tbl
7314       );
7315       /* End Changes by Shkalyan */
7316 
7317       IF (l_log_statement >= l_log_current_level) THEN
7318          fnd_log.string(l_log_statement,
7319                         L_DEBUG_KEY,
7320                         'After calling AHL_PRD_WORKORDER_PVT.Process_Jobs. Return Status = ' || l_return_status);
7321       END IF;
7322 
7323       IF (l_return_status <> Fnd_Api.G_RET_STS_SUCCESS) THEN
7324          IF (l_log_statement >= l_log_current_level) THEN
7325             fnd_log.string(l_log_statement,
7326                            L_DEBUG_KEY,
7327                            'Errors from AHL_PRD_WORKORDER_PVT.Process_Jobs. Message count: ' ||
7328                            l_msg_count || ', message data: ' || l_msg_data);
7329          END IF;
7330          IF l_return_status = FND_API.G_RET_STS_ERROR THEN
7331             RAISE FND_API.G_EXC_ERROR;
7332          ELSE
7333             RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
7334          END IF;
7335       END IF;
7336 
7337       -- Begin changes by rnahata for Bug 5758813
7338       /*The project start/end dates have to be updated with the workorder scheduled
7339       start/end dates.*/
7340       IF (l_log_statement >= l_log_current_level) THEN
7341          For i IN l_prd_workorder_tbl.FIRST..l_prd_workorder_tbl.LAST
7342          LOOP
7343            fnd_log.string(l_log_statement,
7344            L_DEBUG_KEY,
7345            'WorkOrder Id ('||i||'): '||l_prd_workorder_tbl(i).workorder_id);
7346          END LOOP;
7347       END IF;
7348 
7349       IF (l_log_statement >= l_log_current_level) THEN
7350          fnd_log.string(l_log_statement,
7351                         L_DEBUG_KEY,
7352                         'Before calling Update_Project_Task_Times.');
7353       END IF;
7354 
7355       Update_Project_Task_Times(p_prd_workorder_tbl => l_prd_workorder_tbl,
7356                                  p_commit            =>'F',
7357                                  x_return_status     => l_return_status,
7358                                  x_msg_count         => l_msg_count,
7359                                  x_msg_data          => l_msg_data);
7360 
7361       IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
7362          x_msg_count := FND_MSG_PUB.count_msg;
7363          IF (l_log_statement >= l_log_current_level) THEN
7364            fnd_log.string(l_log_statement,
7365                           L_DEBUG_KEY,
7366                           'Errors from Update_Project_Task_Times. Message count: ' || x_msg_count);
7367          END IF;
7368          IF l_return_status = FND_API.G_RET_STS_ERROR THEN
7369             RAISE FND_API.G_EXC_ERROR;
7370          ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
7371             RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
7372          END IF;
7373       ELSE
7374          IF (l_log_statement >= l_log_current_level) THEN
7375            fnd_log.string(l_log_statement,
7376                           L_DEBUG_KEY,
7377                           'Returned Success from Update_Project_Task_Times');
7378          END IF;
7379       END IF;
7380       -- End changes by rnahata for Bug 5758813
7381    END IF; -- To find if the visit has any tasks
7382 
7383    IF (l_log_statement >= l_log_current_level) THEN
7384       fnd_log.string(l_log_statement,
7385                      L_DEBUG_KEY,
7386                      'Update Visit -- Released');
7387    END IF;
7388 --transit check visit change
7389 -- yazhou start
7390    IF (p_module_type <> 'CST') THEN
7391       IF p_orig_visit_id is null THEN
7392         --------------------------------- R12 changes For Serial Number Reservations Start----------------------------------
7393         ----------------------------------AnRaj added on 15th June 2005-----------------------------------------------------
7394         -- When a visit is pushed to production, all the material reservations that were
7395         -- created will have to be transferred with the WIP details
7396 
7397         IF (l_log_statement >= l_log_current_level) THEN
7398           fnd_log.string(l_log_statement,L_DEBUG_KEY,'Before calling AHL_RSV_RESERVATIONS_PVT.TRANSFER_RESERVATION');
7399         END IF;
7400 
7401         AHL_RSV_RESERVATIONS_PVT.TRANSFER_RESERVATION
7402         (
7403             p_api_version   => l_api_version,
7404             p_init_msg_list => l_init_msg_list,
7405             x_return_status => l_return_status,
7406             p_module_type   => p_module_type,
7407             x_msg_count     => l_msg_count,
7408             x_msg_data      => l_msg_data,
7409             p_visit_id      => p_visit_id
7410         );
7411 
7412         IF (l_log_statement >= l_log_current_level) THEN
7413           fnd_log.string(l_log_statement,L_DEBUG_KEY,'After calling AHL_RSV_RESERVATIONS_PVT.TRANSFER_RESERVATION - l_return_status : '||l_return_status);
7414         END IF;
7415 
7416         -- handle the exceptions, if any
7417         IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
7418            IF (l_log_statement >= l_log_current_level) THEN
7419               fnd_log.string(l_log_statement,
7420                              L_DEBUG_KEY,
7421                              ':Errors from AHL_RSV_RESERVATIONS_PVT.TRANSFER_RESERVATION API : ' || x_msg_count );
7422             END IF;
7423             RAISE Fnd_Api.g_exc_error;
7424         END IF;
7425         --------------------------------- R12 changes For Serial Number Reservations End----------------------------------
7426 
7427         -- SKPATHAK :: 02-MAY-2011 :: VWPE: ER:12424063  :: Cancel stage and duplicate tasks and change stage WOs
7428         FOR l_task_to_cancel_rec IN get_visit_tasks_to_cancel (p_visit_id) LOOP
7429           IF (l_task_to_cancel_rec.task_type_code = 'STAGE' and l_task_to_cancel_rec.stage_id IS NOT NULL) THEN
7430             IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
7431               fnd_log.string(fnd_log.level_statement,L_DEBUG_KEY,' c_visit_rec.IS_OLD_VISIT= '||c_visit_rec.IS_OLD_VISIT);
7432             END IF;
7433             IF c_visit_rec.IS_OLD_VISIT <> 'Y' THEN -- VWPE 12730539:: PRAKKUM :: 15-JUL-2011
7434               UPDATE AHL_VWP_STAGES_B
7435               SET    STAGE_STATUS_CODE = 'RELEASED',
7436                      OBJECT_VERSION_NUMBER = OBJECT_VERSION_NUMBER + 1,
7437                      LAST_UPDATE_DATE      = SYSDATE,
7438                      LAST_UPDATED_BY       = Fnd_Global.USER_ID,
7439                      LAST_UPDATE_LOGIN     = Fnd_Global.LOGIN_ID
7440               WHERE  STAGE_ID = l_task_to_cancel_rec.stage_id;
7441             END IF;
7442             IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
7443               fnd_log.string(fnd_log.level_statement,L_DEBUG_KEY,'Before calling AHL_PRD_WORKORDER_PVT.cancel_visit_jobs l_workorder_id= '||l_workorder_id);
7444             END IF;
7445           END IF;
7446 
7447           AHL_PRD_WORKORDER_PVT.cancel_visit_jobs
7448                        (p_api_version      => 1.0,
7449                         p_init_msg_list    => FND_API.G_FALSE,
7450                         p_commit           => FND_API.G_FALSE,
7451                         p_validation_level => FND_API.G_VALID_LEVEL_FULL,
7452                         p_default          => FND_API.G_FALSE,
7453                         p_module_type      => NULL,
7454                         x_return_status    => l_return_status,
7455                         x_msg_count        => l_msg_count,
7456                         x_msg_data         => l_msg_data,
7457                         p_visit_id         => NULL,
7458                         p_unit_effectivity_id => NULL,
7459                         p_workorder_id        => l_task_to_cancel_rec.workorder_id);
7460 
7461           IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
7462             fnd_log.string(fnd_log.level_statement,L_DEBUG_KEY,'After calling AHL_PRD_WORKORDER_PVT.cancel_visit_jobs - l_return_status : '||l_return_status);
7463           END IF;
7464 
7465           IF NVL(l_return_status,'x') <> FND_API.G_RET_STS_SUCCESS THEN
7466             x_msg_count := l_msg_count;
7467             x_return_status := l_return_status;
7468             IF l_return_status = Fnd_Api.g_ret_sts_error THEN
7469               RAISE Fnd_Api.g_exc_error;
7470             ELSIF l_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
7471               RAISE Fnd_Api.g_exc_unexpected_error;
7472             END IF;
7473          END IF;
7474        END LOOP;
7475 
7476          UPDATE AHL_VISITS_B
7477          SET    STATUS_CODE = 'RELEASED',
7478                 OBJECT_VERSION_NUMBER = OBJECT_VERSION_NUMBER + 1,
7479                 --TCHIMIRA::BUG 9222622 ::15-DEC-2009::UPDATE WHO COLUMNS
7480                 LAST_UPDATE_DATE      = SYSDATE,
7481                 LAST_UPDATED_BY       = Fnd_Global.USER_ID,
7482                 LAST_UPDATE_LOGIN     = Fnd_Global.LOGIN_ID
7483          WHERE  VISIT_ID = p_visit_id;
7484 
7485       ELSE
7486          UPDATE AHL_VISITS_B
7487          SET    STATUS_CODE = c_orig_visit_rec.STATUS_CODE,
7488                 OBJECT_VERSION_NUMBER = OBJECT_VERSION_NUMBER + 1,
7489                 --TCHIMIRA::BUG 9222622 ::15-DEC-2009::UPDATE WHO COLUMNS
7490                 LAST_UPDATE_DATE      = SYSDATE,
7491                 LAST_UPDATED_BY       = Fnd_Global.USER_ID,
7492                 LAST_UPDATE_LOGIN     = Fnd_Global.LOGIN_ID
7493          WHERE  VISIT_ID = p_visit_id;
7494     END IF;
7495 
7496    END IF;
7497 
7498    IF ( p_module_type <> 'CST' ) THEN
7499      IF p_orig_visit_id is null THEN
7500 
7501          UPDATE AHL_VISIT_TASKS_B
7502          SET STATUS_CODE = 'RELEASED',
7503              OBJECT_VERSION_NUMBER = OBJECT_VERSION_NUMBER + 1,
7504              --TCHIMIRA::BUG 9222622 ::15-DEC-2009::UPDATE WHO COLUMNS
7505              LAST_UPDATE_DATE      = SYSDATE,
7506              LAST_UPDATED_BY       = Fnd_Global.USER_ID,
7507              LAST_UPDATE_LOGIN     = Fnd_Global.LOGIN_ID
7508          WHERE VISIT_ID = p_visit_id
7509         AND STATUS_CODE IN ('PLANNING', 'PARTIALLY RELEASED')
7510          --SKPATHAK :: VWPE ER-12424063 :: 09-JUN-2011 :: Update the status of stage and duplicate tasks to CANCELLED
7511         AND TASK_TYPE_CODE NOT IN ('STAGE','DUPLICATE');
7512 
7513          UPDATE AHL_VISIT_TASKS_B
7514          SET STATUS_CODE = 'CANCELLED',
7515              OBJECT_VERSION_NUMBER = OBJECT_VERSION_NUMBER + 1,
7516              --TCHIMIRA::BUG 9222622 ::15-DEC-2009::UPDATE WHO COLUMNS
7517              LAST_UPDATE_DATE      = SYSDATE,
7518              LAST_UPDATED_BY       = Fnd_Global.USER_ID,
7519              LAST_UPDATE_LOGIN     = Fnd_Global.LOGIN_ID
7520          WHERE VISIT_ID = p_visit_id
7521         AND STATUS_CODE = 'PLANNING'
7522         AND ((TASK_TYPE_CODE = 'STAGE' AND STAGE_ID IS NOT NULL)
7523              OR TASK_TYPE_CODE = 'DUPLICATE');
7524 
7525     ELSE
7526        UPDATE AHL_VISIT_TASKS_B
7527        SET STATUS_CODE = 'RELEASED',
7528            OBJECT_VERSION_NUMBER = OBJECT_VERSION_NUMBER + 1,
7529            --TCHIMIRA::BUG 9222622 ::15-DEC-2009::UPDATE WHO COLUMNS
7530            LAST_UPDATE_DATE      = SYSDATE,
7531            LAST_UPDATED_BY       = Fnd_Global.USER_ID,
7532            LAST_UPDATE_LOGIN     = Fnd_Global.LOGIN_ID
7533        WHERE VISIT_ID = p_visit_id
7534          AND STATUS_CODE IN ('PLANNING', 'PARTIALLY RELEASED')
7535          --SKPATHAK :: VWPE ER-12424063 :: 09-JUN-2011 :: Need not s update the status of stage and duplicate tasks to RELEASED
7536          AND TASK_TYPE_CODE NOT IN ('STAGE','DUPLICATE')
7537          AND VISIT_TASK_NUMBER in (Select VISIT_TASK_NUMBER
7538                                    FROM ahl_visit_tasks_b
7539                                    where visit_id = p_orig_visit_id
7540                                    AND STATUS_CODE = 'RELEASED');
7541 
7542          --SKPATHAK :: VWPE ER-12424063 :: 09-JUN-2011 :: Update the status of stage and duplicate tasks to CANCELLED
7543        UPDATE AHL_VISIT_TASKS_B
7544        SET STATUS_CODE = 'CANCELLED',
7545            OBJECT_VERSION_NUMBER = OBJECT_VERSION_NUMBER + 1,
7546            --TCHIMIRA::BUG 9222622 ::15-DEC-2009::UPDATE WHO COLUMNS
7547            LAST_UPDATE_DATE      = SYSDATE,
7548            LAST_UPDATED_BY       = Fnd_Global.USER_ID,
7549            LAST_UPDATE_LOGIN     = Fnd_Global.LOGIN_ID
7550        WHERE VISIT_ID = p_visit_id
7551          AND STATUS_CODE = 'PLANNING'
7552          AND TASK_TYPE_CODE IN ('STAGE','DUPLICATE')
7553          AND VISIT_TASK_NUMBER in (Select VISIT_TASK_NUMBER
7554                                    FROM ahl_visit_tasks_b
7555                                    where visit_id = p_orig_visit_id
7556                                    AND STATUS_CODE = 'RELEASED');
7557       END IF;
7558    END IF;
7559    -- yazhou end
7560 
7561    -- Start By Shbhanda 16th Feb 2004 --
7562    -- Earlier this code was in Release_Visit procedure
7563    -- was moved here as whenever the visit is pushed to production
7564    -- 'any_task_chg_flag' in Visit should always be 'N'
7565    -----------------------------------------------
7566    -- To call AHL_VWP_RULES_PVT.Update_Visit_Task_Flag to update any_task_chg_flag as 'N'
7567    IF (l_log_statement >= l_log_current_level) THEN
7568       fnd_log.string(l_log_statement,
7569                      L_DEBUG_KEY,
7570                      'Before calling AHL_VWP_RULES_PVT.Update_Visit_Task_Flag.');
7571    END IF;
7572 
7573    IF c_visit_rec.any_task_chg_flag = 'Y' THEN
7574       AHL_VWP_RULES_PVT.Update_Visit_Task_Flag
7575           (p_visit_id      => p_visit_id,
7576            p_flag          => 'N',
7577            x_return_status => x_return_status);
7578    END IF;
7579 
7580    IF (l_log_statement >= l_log_current_level) THEN
7581       fnd_log.string(l_log_statement,
7582                      L_DEBUG_KEY,
7583                      'After calling AHL_VWP_RULES_PVT.Update_Visit_Task_Flag');
7584    END IF;
7585    -- End By Shbhanda 16th Feb 2004 -------------
7586 
7587    /* MANESING::Component Maintenance Planning Project, 05-Jul-2011
7588     * There is no need to delete Stage materials for Component Visits
7589     * as there won't be any Stage associated with them.
7590     */
7591    IF (l_is_comp_visit = 'N') THEN
7592 
7593      -- TCHIMIRA :: 28-JUN-2011 :: VWP: ER:12673125 :: START
7594      -- We need to delete materials of default stage task when a visit is P2Ped
7595      IF ( p_module_type <> 'CST' ) THEN
7596        IF AHL_VWP_VISITS_PVT.Is_Old_Visit(p_visit_id) = 'N' THEN -- PRAKKUM :: VWPE: ER:12856858  :: 10-AUG-2011 :: Upgrade Changes
7597          IF (l_log_statement >= l_log_current_level) THEN
7598            fnd_log.string(l_log_statement,
7599                           L_DEBUG_KEY,
7600                           'Before calling AHL_LTP_REQST_MATRL_PVT.Delete_Default_Stage_Materials');
7601          END IF;
7602          OPEN c_get_vst_def_stage_task(p_visit_id);
7603          FETCH c_get_vst_def_stage_task INTO l_def_stage_task_id;
7604          CLOSE c_get_vst_def_stage_task;
7605 
7606          AHL_LTP_REQST_MATRL_PVT.Delete_Default_Stage_Materials (
7607            p_api_version          => 1.0 ,
7608            p_init_msg_list        =>  FND_API.G_TRUE,
7609            p_commit               =>  FND_API.G_FALSE,
7610            p_validation_level     =>  FND_API.G_VALID_LEVEL_FULL,
7611            p_module_type          =>  'VST',
7612            p_visit_task_id        =>  l_def_stage_task_id,
7613            x_return_status        =>  l_return_status,
7614            x_msg_count            =>  l_msg_count,
7615            x_msg_data             =>  l_msg_data
7616          );
7617 
7618          IF (l_log_statement >= l_log_current_level) THEN
7619           fnd_log.string(l_log_statement,
7620                          L_DEBUG_KEY,
7621                          'After calling AHL_LTP_REQST_MATRL_PVT.Delete_Default_Stage_Materials. and return status is:'||l_return_status);
7622          END IF;
7623          -- Check Error Message stack.
7624          IF NVL(l_return_status,'x') <> FND_API.G_RET_STS_SUCCESS THEN
7625            x_msg_count := l_msg_count;
7626            x_return_status := l_return_status;
7627            IF l_return_status = Fnd_Api.g_ret_sts_error THEN
7628              RAISE Fnd_Api.g_exc_error;
7629            ELSIF l_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
7630              RAISE Fnd_Api.g_exc_unexpected_error;
7631            END IF;
7632          END IF;
7633        END IF;
7634      END IF;
7635      -- TCHIMIRA :: 28-JUN-2011 :: VWP: ER:12673125 :: END
7636    END IF; -- if l_is_comp_visit = 'N'
7637 
7638   ---------------------------End of Body-------------------------------------
7639   -- END of API body.
7640   -- Standard check of p_commit.
7641 
7642    IF Fnd_Api.To_Boolean (p_commit) THEN
7643       COMMIT WORK;
7644    END IF;
7645 
7646    Fnd_Msg_Pub.count_and_get(
7647          p_encoded => Fnd_Api.g_false,
7648          p_count   => x_msg_count,
7649          p_data    => x_msg_data
7650   );
7651 
7652    IF (l_log_procedure >= l_log_current_level) THEN
7653       fnd_log.string(l_log_procedure,
7654                      L_DEBUG_KEY ||'.end',
7655                      'At the end of PL SQL procedure. Return Status = ' || x_return_status);
7656    END IF;
7657 
7658 EXCEPTION
7659    WHEN Fnd_Api.g_exc_error THEN
7660       ROLLBACK TO Push_to_Production;
7661       x_return_status := Fnd_Api.g_ret_sts_error;
7662       Fnd_Msg_Pub.count_and_get (
7663             p_encoded => Fnd_Api.g_false,
7664             p_count   => x_msg_count,
7665             p_data    => x_msg_data
7666      );
7667    WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
7668       ROLLBACK TO Push_to_Production;
7669       x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
7670       Fnd_Msg_Pub.count_and_get (
7671             p_encoded => Fnd_Api.g_false,
7672             p_count   => x_msg_count,
7673             p_data    => x_msg_data
7674      );
7675    WHEN OTHERS THEN
7676       ROLLBACK TO Push_to_Production;
7677       x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
7678       IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_unexp_error)
7679       THEN
7680          Fnd_Msg_Pub.add_exc_msg (G_PKG_NAME, l_api_name);
7681       END IF;
7682       Fnd_Msg_Pub.count_and_get (
7683             p_encoded => Fnd_Api.g_false,
7684             p_count   => x_msg_count,
7685             p_data    => x_msg_data
7686      );
7687 END Push_to_Production;
7688 
7689 -------------------------------------------------------------------
7690 --  Procedure name    : Release_Visit
7691 --  Type              : Private
7692 --
7693 --
7694 --  Function          :To Validate before pushing visit and its tasks to production
7695 --
7696 --
7697 --  Pre-reqs    :
7698 --  Parameters  :
7699 --
7700 --  Standard IN  Parameters :
7701 --      p_api_version      IN  NUMBER   Required
7702 --      p_init_msg_list    IN  VARCHAR2 Default  FND_API.G_FALSE
7703 --      p_commit           IN  VARCHAR2 Default  FND_API.G_FALSE
7704 --      p_validation_level IN  NUMBER   Default  FND_API.G_VALID_LEVEL_FULL
7705 --
7706 --  Standard OUT Parameters :
7707 --      x_return_status    OUT VARCHAR2 Required
7708 --      x_msg_count        OUT NUMBER   Required
7709 --      x_msg_data         OUT VARCHAR2 Required
7710 --
7711 --  Release visit Parameters:
7712 --       p_visit_id             IN   NUMBER  Required
7713 --
7714 --  Version :
7715 --    09/09/2003     SSURAPAN   Initial  Creation
7716 -------------------------------------------------------------------
7717 PROCEDURE Release_Visit (
7718     p_api_version      IN         NUMBER,
7719     p_init_msg_list    IN         VARCHAR2 := Fnd_Api.G_FALSE,
7720     p_commit           IN         VARCHAR2 := Fnd_Api.G_FALSE,
7721     p_validation_level IN         NUMBER   := Fnd_Api.G_VALID_LEVEL_FULL,
7722     p_module_type      IN         VARCHAR2 := NULL,
7723     p_visit_id         IN         NUMBER,
7724     p_release_flag     IN         VARCHAR2 := 'N', -- By shbhanda 05/21/04 fro TC changes
7725     p_orig_visit_id    IN         NUMBER   := NULL, -- By yazhou   08/06/04 for TC changes
7726     x_return_status    OUT NOCOPY VARCHAR2,
7727     x_msg_count        OUT NOCOPY NUMBER,
7728     x_msg_data         OUT NOCOPY VARCHAR2)
7729  IS
7730     --Standard local variables
7731     L_API_NAME         CONSTANT VARCHAR2(30)  := 'Release_Visit';
7732     L_API_VERSION      CONSTANT NUMBER        := 1.0;
7733     L_DEBUG_KEY        CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
7734     l_msg_data                  VARCHAR2(2000);
7735     l_return_status             VARCHAR2(1);
7736     l_msg_count                 NUMBER;
7737     l_Error_Tbl_Type            Error_Tbl_Type;
7738     l_error_msg                 VARCHAR2(5000);
7739     l_error_count               NUMBER;
7740     l_commit                    VARCHAR2(1) := 'F';
7741     --Post 11.5.10
7742     -- RROY
7743     l_validate_error   CONSTANT VARCHAR2(1) := 'V';
7744     --l_projects_error CONSTANT VARCHAR2(1) := 'R';
7745     l_push_error       CONSTANT VARCHAR2(1) := 'P';
7746     -- RROY
7747     --TCHIMIRA::P2P CP ER 9151144::02-DEC-2009
7748     l_err_msg                   VARCHAR2(2000);
7749     l_msg_index_out             NUMBER;
7750     l_phase_code                VARCHAR2(1);
7751 
7752    --TCHIMIRA::P2P CP ER 9151144::09-DEC-2009
7753     l_entl_rec_tbl        AHL_WARRANTY_ENTL_PVT.Warranty_Entl_Tbl_Type; --salogan added for supplier warranty
7754 
7755    --salogan::Modified the cursor to handle both request id from P2P and Cost Estimation CP ER 9299910::01-JUN-2009::BEGIN
7756    --Cursor to fetch phase
7757    CURSOR c_conc_req_phase(c_id IN NUMBER) IS
7758     SELECT 'X'
7759     FROM FND_CONCURRENT_REQUESTS FCR, AHL_VISITS_B AVB
7760     WHERE FCR.REQUEST_ID IN ( AVB.CST_EST_REQUEST_ID, AVB.REQUEST_ID )
7761     AND FCR.PHASE_CODE IN ('P', 'R')
7762     AND AVB.VISIT_ID = c_id;
7763     l_dummy_val c_conc_req_phase%ROWTYPE;
7764    --salogan::Modified the cursor to handle both request id from P2P and Cost Estimation CP ER 9299910::01-JUN-2009::END
7765 
7766    -- To find visit related information
7767    CURSOR c_visit (x_id IN NUMBER) IS
7768     SELECT * FROM AHL_VISITS_VL
7769     WHERE VISIT_ID = x_id
7770     -- TCHIMIRA :: Bug 8594339 :: 19-NOV-2009
7771     -- Lock the visit record
7772     FOR UPDATE OF OBJECT_VERSION_NUMBER;
7773    c_visit_rec c_visit%ROWTYPE;
7774 
7775      -- SKPATHAK :: Bug 9971127 :: 13-AUG-2010
7776      -- Added this cursor to validate if any of the children UEs for a given visit is in EXCEPTION status
7777      -- and if yes, return the MR title corresponding to one of the UEs in EXCEPTION status
7778    CURSOR c_validate_ue_status (x_id IN NUMBER) IS
7779     SELECT mr.title
7780     FROM ahl_visit_tasks_vl avt, ahl_unit_effectivities_b ue, ahl_mr_headers_b mr
7781     WHERE avt.visit_id = x_id
7782      AND NVL(avt.status_code, 'X') = 'PLANNING'
7783      AND (avt.task_type_code <> 'SUMMARY' OR
7784            (avt.task_type_code = 'SUMMARY' AND
7785            (avt.mr_id IS NOT NULL OR avt.unit_effectivity_id IS NOT NULL)))
7786      AND avt.unit_effectivity_id = ue.unit_effectivity_id
7787      AND NVL(ue.status_code, 'X') = 'EXCEPTION'
7788      AND ue.mr_header_id = mr.mr_header_id
7789      AND rownum = 1;
7790      l_mr_title   VARCHAR2(200);
7791 
7792   --CHANGES by jrotich bug #13028686 begin
7793   CURSOR c_stages_without_types(c_visit_id IN NUMBER ) IS
7794     SELECT DISTINCT STAGES.STAGE_ID ,
7795       STAGES.STAGE_NAME
7796     FROM AHL_VISIT_TASKS_B TASKS,
7797       AHL_VWP_STAGES_VL STAGES
7798     WHERE
7799       TASKS.VISIT_ID= c_visit_id AND
7800       STAGES.STAGE_ID=TASKS.STAGE_ID AND
7801       TASKS.TASK_TYPE_CODE <> 'STAGE' AND --SKPATHAK :: stages not having any visit tasks need not be validated
7802       NOT EXISTS (
7803         SELECT STAGE_ID
7804         FROM AHL_VISIT_STAGE_TYP_ASOC
7805         WHERE STAGE_ID=STAGES.STAGE_ID);
7806   l_invalid_stage BOOLEAN;
7807 --CHANGES by jrotich bug #13028686 end
7808 
7809   BEGIN
7810 
7811     IF (l_log_procedure >= l_log_current_level) THEN
7812       fnd_log.string(l_log_procedure,L_DEBUG_KEY||'.begin','At the start of the PLSQL procedure');
7813     END IF;
7814 
7815     -- Standard start of API savepoint
7816     SAVEPOINT Release_Visit_Pvt;
7817 
7818 
7819 
7820          -- Initialize message list if p_init_msg_list is set to TRUE
7821          IF FND_API.To_Boolean(p_init_msg_list) THEN
7822          FND_MSG_PUB.Initialize;
7823          END IF;
7824 
7825      -- Initialize message list if p_init_msg_list is set to TRUE
7826     IF FND_API.To_Boolean(p_init_msg_list) THEN
7827        FND_MSG_PUB.Initialize;
7828     END IF;
7829     -- Initialize API return status to success
7830     x_return_status := FND_API.G_RET_STS_SUCCESS;
7831 
7832          -- Standard call to check for call compatibility.
7833          IF NOT FND_API.COMPATIBLE_API_CALL(l_api_version,
7834                                        p_api_version,
7835                                        l_api_name,G_PKG_NAME) THEN
7836          RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
7837          END IF;
7838 
7839     --
7840 
7841     IF (l_log_statement >= l_log_current_level) THEN
7842       fnd_log.string(l_log_statement,L_DEBUG_KEY,'Visit ID : '||p_visit_id);
7843     END IF;
7844 
7845     -- Check for Required Parameters
7846     IF(p_visit_id IS NULL OR p_visit_id = FND_API.G_MISS_NUM) THEN
7847         FND_MESSAGE.Set_Name(G_PM_PRODUCT_CODE,'AHL_VWP_CST_INPUT_MISS');
7848         FND_MSG_PUB.ADD;
7849         IF (l_log_unexpected >= l_log_current_level)THEN
7850             fnd_log.string
7851             (
7852                 l_log_unexpected,
7853                 'ahl.plsql.AHL_VWP_CST_WO_PVT.Release_Visit',
7854                 'Visit id is mandatory but found null in input '
7855             );
7856         END IF;
7857         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
7858      END IF;
7859 
7860      -- SKPATHAK :: Bug 9971127 :: 13-AUG-2010
7861      -- Added this cursor to validate if any of the children UEs for a given visit is in EXCEPTION status
7862      -- and if yes, return the MR title corresponding to one of the UEs in EXCEPTION status
7863      OPEN  c_validate_ue_status (p_visit_id);
7864      FETCH c_validate_ue_status INTO l_mr_title;
7865        IF c_validate_ue_status%FOUND THEN
7866          CLOSE  c_validate_ue_status;
7867          Fnd_Message.SET_NAME('AHL','AHL_VWP_UE_EXP_STATUS');
7868          Fnd_Message.Set_Token('MR_TITLE',l_mr_title);
7869          Fnd_Msg_Pub.ADD;
7870          RAISE Fnd_Api.G_EXC_ERROR;
7871        END IF;
7872      CLOSE  c_validate_ue_status;
7873 
7874     --TCHIMIRA::P2P CP ER 9151144::09-DEC-2009::BEGIN
7875     --Throws an error if the phase code is either pending or running
7876     IF(p_release_flag = 'Y' OR p_release_flag = 'N')THEN
7877         --salogan::Modified the cursor fetch to handle both request id from P2P and Cost Estimation CP ER 9299910::01-JUN-2009::BEGIN
7878         OPEN c_conc_req_phase(p_visit_id);
7879         FETCH c_conc_req_phase INTO l_dummy_val;
7880         IF(c_conc_req_phase%FOUND) THEN
7881             FND_MESSAGE.Set_Name(G_PM_PRODUCT_CODE,'AHL_VWP_CP_P2P_IN_PROGS');
7882             FND_MSG_PUB.ADD;
7883             RAISE FND_API.G_EXC_ERROR;
7884         END IF;
7885         CLOSE c_conc_req_phase;
7886         --salogan::Modified the cursor fetch to handle both request id from P2P and Cost Estimation CP ER 9299910::01-JUN-2009::END
7887     END IF;
7888     --TCHIMIRA::P2P CP ER 9151144::09-DEC-2009::END
7889 
7890     -- TCHIMIRA :: Bug 8594339 :: 19-NOV-2009
7891     -- Lock the visit record
7892     OPEN c_visit(p_visit_id);
7893     FETCH c_visit INTO c_visit_rec;
7894 
7895 
7896     --CHANGES by jrotich bug #13028686 begin
7897     IF p_module_type <> 'CST' THEN -- SKPATHAK :: have this validation only during P2P and NOT during plan visit
7898       IF (l_log_statement >= l_log_current_level)THEN
7899            fnd_log.string (l_log_statement,L_DEBUG_KEY, 'Validating stage details');
7900       END IF;
7901 
7902       l_invalid_stage :=FALSE;
7903       FOR stage_details_rec in c_stages_without_types(p_visit_id)
7904       LOOP
7905         l_invalid_stage :=TRUE;
7906         IF (l_log_statement >= l_log_current_level) THEN
7907           fnd_log.string(l_log_statement,
7908                          L_DEBUG_KEY,
7909                          'Stage does not have an associated stage type ' ||
7910                          stage_details_rec.stage_name);
7911         END IF;
7912         FND_MESSAGE.SET_NAME('AHL', 'AHL_VWP_NO_STAGE_TYPE');
7913         FND_MESSAGE.SET_TOKEN('STAGE_NAME',stage_details_rec.stage_name);
7914         FND_MSG_PUB.ADD;
7915 
7916       END LOOP;
7917 
7918       IF(l_invalid_stage=TRUE) THEN
7919         RAISE FND_API.G_EXC_ERROR;
7920       END IF;
7921     END IF;
7922 
7923     --CHANGES by jrotich bug #13028686 END
7924 
7925     --TCHIMIRA::P2P CP ER 9151144::02-DEC-2009::Modified the if condition to check if the P2P is normal or background
7926      IF(p_release_flag = 'Y' OR p_release_flag = 'N')THEN
7927           IF (l_log_statement >= l_log_current_level)THEN
7928             fnd_log.string (l_log_statement,L_DEBUG_KEY, 'Before Calling Validate Before Production');
7929           END IF;
7930 
7931        --Valdate before push to production happens
7932        AHL_VWP_PROJ_PROD_PVT.Validate_Before_Production
7933               (p_api_version      => l_api_version,
7934                p_init_msg_list    => p_init_msg_list,
7935                p_commit           => l_commit,
7936                p_validation_level => p_validation_level,
7937                p_module_type      => p_module_type,
7938                p_visit_id         => p_visit_id,
7939                x_error_tbl        => l_error_tbl_type,
7940                x_return_status    => l_return_status,
7941                x_msg_count        => l_msg_count,
7942                x_msg_data         => l_msg_data);
7943 
7944        IF (l_log_statement >= l_log_current_level)THEN
7945           fnd_log.string (l_log_statement, L_DEBUG_KEY, 'After Calling Validate Before Production - l_return_status = '||l_return_status);
7946        END IF;
7947     END IF;
7948      -- Post 11.5.10
7949      -- RROY
7950      IF l_error_tbl_type.COUNT > 0 THEN
7951        l_return_status := l_validate_error;
7952        x_return_status := l_validate_error;
7953      ELSIF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
7954       -- Check Error Message stack.
7955        x_msg_count := FND_MSG_PUB.count_msg;
7956 
7957        IF (l_log_statement >= l_log_current_level)THEN
7958           fnd_log.string ( l_log_statement, L_DEBUG_KEY,'Errors from Validate Before Production - '||x_msg_count);
7959        END IF;
7960        -- TCHIMIRA :: Bug 8594339 :: 19-NOV-2009
7961        CLOSE c_visit;
7962        RAISE Fnd_Api.g_exc_error;
7963      ELSE
7964           IF (l_log_statement >= l_log_current_level)THEN
7965           fnd_log.string(l_log_statement,L_DEBUG_KEY, 'Before Calling aggregate_material_requirements');
7966           END IF;
7967 
7968        -- AnRaj: Added as part of Material Requirement Aggrgation Enhancement, Bug#5303378
7969        -- Call aggregate_material_requirements for a visit
7970        -- If a visit task has more than one requirement for the same item, then this method will aggregate
7971        -- all those requirements into a single requirement
7972        Aggregate_Material_Reqrs
7973             (  p_api_version      => l_api_version,
7974                p_init_msg_list    => p_init_msg_list,
7975                p_commit           => l_commit,
7976                p_validation_level => p_validation_level,
7977                p_module_type      => p_module_type,
7978                p_visit_id         => p_visit_id,
7979                x_return_status    => l_return_status,
7980                x_msg_count        => l_msg_count,
7981                x_msg_data         => l_msg_data
7982             );
7983        IF (l_log_statement >= l_log_current_level)THEN
7984           fnd_log.string(l_log_statement,L_DEBUG_KEY, 'After Calling aggregate_material_requirements - l_return_status = '||l_return_status);
7985        END IF;
7986 
7987        IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
7988           x_msg_count := FND_MSG_PUB.count_msg;
7989           IF (l_log_statement >= l_log_current_level)THEN
7990               fnd_log.string(   l_log_statement,L_DEBUG_KEY,'Errors from aggregate_material_requirements: ' || x_msg_count);
7991           END IF;
7992           -- TCHIMIRA :: Bug 8594339 :: 19-NOV-2009
7993           CLOSE c_visit;
7994           RAISE Fnd_Api.g_exc_error;
7995        END IF;
7996 
7997        --salogan added the following code for supplier warranty starts
7998        Get_Entl_rec_for_Delete(
7999           p_visit_id          => p_visit_id,
8000           x_warranty_entl_tbl => l_entl_rec_tbl);
8001 
8002        IF (l_log_statement >= l_log_current_level) THEN
8003            fnd_log.string(l_log_statement,
8004                           L_DEBUG_KEY,
8005                           'Before calling AHL_WARRANTY_ENTL_PVT.Process_Warranty_Entitlements.');
8006        END IF;
8007 
8008        --Not passing p_commit the main API commits the data at the end
8009        AHL_WARRANTY_ENTL_PVT.Process_Warranty_Entitlements(
8010            p_api_version                 => l_api_version,
8011            p_validation_level            => p_validation_level,
8012            p_module_type                 => p_module_type,
8013            p_user_role                   => AHL_WARRANTY_ENTL_PVT.G_USER_PLANNER,
8014            p_x_warranty_entl_tbl         => l_entl_rec_tbl,
8015            x_return_status               => l_return_status,
8016            x_msg_count                   => l_msg_count,
8017            x_msg_data                    => l_msg_data);
8018 
8019        IF (l_log_statement >= l_log_current_level) THEN
8020            fnd_log.string(l_log_statement,
8021            L_DEBUG_KEY,
8022            'After calling AHL_WARRANTY_ENTL_PVT.Process_Warranty_Entitlements. Return Status = ' ||
8023            l_return_status);
8024        END IF;
8025 
8026        l_msg_count := Fnd_Msg_Pub.count_msg;
8027        IF l_msg_count > 0 OR l_return_status <> Fnd_Api.g_ret_sts_success THEN
8028           x_msg_count := l_msg_count;
8029           x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
8030           RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
8031        END IF;
8032        -- salogan added for supplier warranty ends
8033 
8034        IF (l_log_statement >= l_log_current_level)THEN
8035          fnd_log.string(l_log_statement,L_DEBUG_KEY, 'Before calling Push_to_Production');
8036        END IF;
8037 
8038        --Call push to production with module type 'CST'
8039        AHL_VWP_PROJ_PROD_PVT.Push_to_Production
8040              (p_api_version      => l_api_version,
8041               p_init_msg_list    => p_init_msg_list,
8042               p_commit           => l_commit,
8043               p_validation_level => p_validation_level,
8044               p_module_type      => p_module_type, --'JSP', -- earlier 'CST'
8045               p_visit_id         => p_visit_id,
8046               p_release_flag     => p_release_flag,
8047               p_orig_visit_id    => p_orig_visit_id,
8048               x_return_status    => l_return_status,
8049               x_msg_count        => l_msg_count,
8050               x_msg_data         => l_msg_data);
8051 
8052        IF (l_log_statement >= l_log_current_level)THEN
8053          fnd_log.string(l_log_statement,L_DEBUG_KEY, 'After calling Push_to_Production - l_return_status = '||l_return_status);
8054        END IF;
8055 
8056        IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
8057        -- Check Error Message stack.
8058          x_msg_count := FND_MSG_PUB.count_msg;
8059          IF (l_log_statement >= l_log_current_level)THEN
8060           fnd_log.string( l_log_statement,L_DEBUG_KEY, 'Errors from Push to Production: ' || x_msg_count );
8061          END IF;
8062          -- TCHIMIRA :: Bug 8594339 :: 19-NOV-2009
8063          CLOSE c_visit;
8064          RAISE Fnd_Api.g_exc_error;
8065        END IF;
8066 
8067        IF (l_log_statement >= l_log_current_level)THEN
8068          fnd_log.string(l_log_statement,L_DEBUG_KEY, 'Before calling AHL_LTP_SIMUL_PLAN_PVT.delete_simul_visits');
8069        END IF;
8070 
8071        -- SKPATHAK :: 02-MAY-2011 :: VWPE: ER:12424063
8072        -- Below call is not needed since LTP is being removed so no simulation visit exists
8073        -- Delete simulated visits associated to this visit
8074        /*AHL_LTP_SIMUL_PLAN_PVT.delete_simul_visits
8075              (p_api_version        => l_api_version,
8076               p_init_msg_list      => p_init_msg_list,
8077               p_commit             => l_commit,
8078               p_validation_level   => p_validation_level,
8079               p_visit_id           => p_visit_id,
8080               x_return_status      => l_return_status,
8081               x_msg_count          => l_msg_count,
8082               x_msg_data           => l_msg_data);
8083 
8084        IF (l_log_statement >= l_log_current_level)THEN
8085          fnd_log.string(l_log_statement,L_DEBUG_KEY, 'After calling AHL_LTP_SIMUL_PLAN_PVT.delete_simul_visits - l_return_status : '||l_return_status);
8086        END IF;
8087 
8088        IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
8089        -- Check Error Message stack.
8090          x_msg_count := FND_MSG_PUB.count_msg;
8091          IF (l_log_statement >= l_log_current_level)THEN
8092           fnd_log.string( l_log_statement,L_DEBUG_KEY,'Errors from delete_simul_visits: '||x_msg_count);
8093          END IF;
8094          -- TCHIMIRA :: Bug 8594339 :: 19-NOV-2009
8095          CLOSE c_visit;
8096          RAISE Fnd_Api.g_exc_error;
8097        END IF;*/
8098      END IF;
8099      -- Post 11.5.10
8100      -- RROY
8101      -- TCHIMIRA :: Bug 8594339 :: 19-NOV-2009
8102      CLOSE c_visit;
8103 
8104      -- Standard check of p_commit
8105      IF FND_API.TO_BOOLEAN(p_commit) THEN
8106         COMMIT WORK;
8107      END IF;
8108 
8109      IF (l_log_procedure >= l_log_current_level)THEN
8110         fnd_log.string ( l_log_procedure,L_DEBUG_KEY ||'.end','At the end of PLSQL procedure');
8111      END IF;
8112 
8113 EXCEPTION
8114  WHEN FND_API.G_EXC_ERROR THEN
8115    x_return_status := FND_API.G_RET_STS_ERROR;
8116    ROLLBACK TO Release_Visit_Pvt;
8117    FND_MSG_PUB.count_and_get(p_count => x_msg_count,
8118                               p_data  => x_msg_data,
8119                               p_encoded => fnd_api.g_false);
8120 
8121 
8122  WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
8123    x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
8124    ROLLBACK TO Release_Visit_Pvt;
8125    FND_MSG_PUB.count_and_get(p_count => x_msg_count,
8126                               p_data  => x_msg_data,
8127                               p_encoded => fnd_api.g_false);
8128 
8129 
8130  WHEN OTHERS THEN
8131     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
8132     ROLLBACK TO Release_Visit_Pvt;
8133     IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
8134        fnd_msg_pub.add_exc_msg(p_pkg_name       => G_PKG_NAME,
8135                                p_procedure_name => 'Release_Visit',
8136                                p_error_text     => SUBSTR(SQLERRM,1,500));
8137     END IF;
8138     FND_MSG_PUB.count_and_get(p_count => x_msg_count,
8139                               p_data  => x_msg_data,
8140                               p_encoded => fnd_api.g_false);
8141 
8142 END Release_Visit;
8143 
8144 -------------------------------------------------------------------
8145 --  Procedure name    : Release_Tasks
8146 --  Type              : Private
8147 --  Function          : Validate the tasks and then push tasks to production
8148 --  Parameters  :
8149 --
8150 --  Standard IN  Parameters :
8151 --      p_api_version      IN  NUMBER        Required
8152 --      p_init_msg_list    IN  VARCHAR2      Default  FND_API.G_FALSE
8153 --      p_commit           IN  VARCHAR2      Default  FND_API.G_FALSE
8154 --      p_validation_level IN  NUMBER        Default  FND_API.G_VALID_LEVEL_FULL
8155 --
8156 --  Standard OUT Parameters :
8157 --      x_return_status    OUT VARCHAR2      Required
8158 --      x_msg_count        OUT NUMBER        Required
8159 --      x_msg_data         OUT VARCHAR2      Required
8160 --
8161 --  Parameters:
8162 --      p_visit_id         IN  NUMBER        Required
8163 --      p_release_flag     IN  VARCHAR2      Default  'N'
8164 --      p_tasks_tbl        IN  Task_Tbl_Type Required
8165 --
8166 --  Version :
8167 --      30 November, 2007  RNAHATA  Initial Version - 1.0
8168 -------------------------------------------------------------------
8169 PROCEDURE Release_Tasks(
8170     p_api_version      IN         NUMBER,
8171     p_init_msg_list    IN         VARCHAR2  := Fnd_Api.G_FALSE,
8172     p_commit           IN         VARCHAR2  := Fnd_Api.G_FALSE,
8173     p_validation_level IN         NUMBER    := Fnd_Api.G_VALID_LEVEL_FULL,
8174     p_module_type      IN         VARCHAR2  := Null,
8175     p_visit_id         IN         NUMBER,
8176     p_tasks_tbl        IN         Task_Tbl_Type,
8177     p_release_flag     IN         VARCHAR2  := 'N',
8178     x_return_status    OUT NOCOPY VARCHAR2,
8179     x_msg_count        OUT NOCOPY NUMBER,
8180     x_msg_data         OUT NOCOPY VARCHAR2)
8181 IS
8182     L_API_NAME           CONSTANT VARCHAR2(30)  := 'Release_Tasks';
8183     L_API_VERSION        CONSTANT NUMBER        := 1.0;
8184     L_DEBUG_KEY          CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
8185     l_msg_data                    VARCHAR2(2000);
8186     l_return_status               VARCHAR2(1);
8187     l_msg_count                   NUMBER;
8188     l_Error_Tbl_Type              Error_Tbl_Type;
8189     l_tasks_tbl                   Task_Tbl_Type;
8190     l_validate_visit              NUMBER:= 0;
8191     l_temp_msg_count              NUMBER:=0; --rnahata
8192     -- SKPATHAK :: ER:12730539 :: 01-AUG-2011
8193     l_val_task_tbl              AHL_VWP_RULES_PVT.Task_Tbl_Type;
8194 
8195     -- chk if the visit is valid
8196     CURSOR c_validate_visit (x_id IN NUMBER) IS
8197      SELECT 1 FROM AHL_VISITS_B
8198      WHERE VISIT_ID = x_id;
8199 
8200     -- chk if the visit is in partially released or planning status
8201     CURSOR c_visit_info (x_id IN NUMBER) IS
8202      SELECT start_date_time,status_code FROM AHL_VISITS_B
8203      WHERE VISIT_ID = x_id
8204      AND NVL(STATUS_CODE,'X') IN ('PARTIALLY RELEASED', 'PLANNING');
8205 
8206     c_visit_info_rec    c_visit_info%ROWTYPE;
8207 
8208     -- SKPATHAK :: ER:12730539 :: 01-AUG-2011
8209     CURSOR get_task_status (c_task_id IN NUMBER) IS
8210      SELECT status_code FROM ahl_visit_tasks_b
8211      WHERE visit_task_id = c_task_id;
8212      l_task_status       VARCHAR2(30);
8213 
8214   BEGIN
8215 
8216     IF (l_log_procedure >= l_log_current_level) THEN
8217       fnd_log.string(l_log_procedure,
8218                      L_DEBUG_KEY ||'.begin',
8219                      'At the start of PL SQL procedure. Visit Id = ' || p_visit_id ||
8220                      'p_tasks_tbl.COUNT = ' || p_tasks_tbl.COUNT);
8221     END IF;
8222 
8223     -- Standard start of API savepoint
8224     SAVEPOINT Release_Tasks_Pvt;
8225 
8226     -- Initialize message list if p_init_msg_list is set to TRUE
8227     IF FND_API.To_Boolean(p_init_msg_list) THEN
8228       FND_MSG_PUB.Initialize;
8229     END IF;
8230 
8231     -- Initialize API return status to success
8232     x_return_status := FND_API.G_RET_STS_SUCCESS;
8233 
8234     -- Standard call to check for call compatibility.
8235     IF NOT FND_API.COMPATIBLE_API_CALL(l_api_version,
8236                                        p_api_version,
8237                                        l_api_name,G_PKG_NAME)
8238     THEN
8239       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
8240     END IF;
8241 
8242     --Check for required parameters
8243     IF (p_visit_id IS NOT NULL) THEN
8244 
8245        OPEN c_validate_visit(p_visit_id);
8246        FETCH c_validate_visit INTO l_validate_visit;
8247        CLOSE c_validate_visit;
8248 
8249        --Validate visit
8250        IF (nvl(l_validate_visit,0) = 0) THEN
8251           IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_error) THEN
8252              FND_MESSAGE.Set_Name(G_PM_PRODUCT_CODE,'AHL_VWP_INVALID_VST');
8253              FND_MESSAGE.SET_TOKEN('VISIT_ID', p_visit_id);
8254              FND_MSG_PUB.ADD;
8255           END IF;
8256           RAISE FND_API.G_EXC_ERROR;
8257        END IF;
8258 
8259        --Check if the visit is in planning or partially released status
8260        OPEN c_visit_info(p_visit_id);
8261        FETCH c_visit_info INTO c_visit_info_rec;
8262        IF c_visit_info%NOTFOUND THEN
8263           IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_error) THEN
8264              FND_MESSAGE.Set_Name(G_PM_PRODUCT_CODE,'AHL_VWP_VST_STATUS_INVALID');
8265              FND_MSG_PUB.ADD;
8266           END IF;
8267           CLOSE c_visit_info;
8268           RAISE FND_API.G_EXC_ERROR;
8269        END IF;
8270        CLOSE c_visit_info;
8271     --If visit_id is null
8272     ELSE
8273        IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_error) THEN
8274           FND_MESSAGE.Set_Name(G_PM_PRODUCT_CODE,'AHL_VWP_VISIT_NULL');
8275           FND_MSG_PUB.ADD;
8276        END IF;
8277        RAISE FND_API.G_EXC_ERROR;
8278     END IF;
8279 
8280     --No tasks selected
8281     IF (p_tasks_tbl.COUNT = 0) THEN
8282        IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_error) THEN
8283           FND_MESSAGE.Set_Name(G_PM_PRODUCT_CODE,'AHL_VWP_NO_TASK_SEL');
8284           FND_MSG_PUB.ADD;
8285        END IF;
8286        RAISE FND_API.G_EXC_ERROR;
8287     END IF;
8288 
8289     IF (l_log_statement >= l_log_current_level) THEN
8290        fnd_log.string(l_log_statement,
8291                       L_DEBUG_KEY,
8292                       'Before calling VALIDATE_BEFORE_PRODUCTION');
8293     END IF;
8294 
8295     --Validate visit before pushing the tasks to production
8296     AHL_VWP_PROJ_PROD_PVT.Validate_Before_Production
8297               (p_api_version      => l_api_version,
8298                p_init_msg_list    => p_init_msg_list,
8299                p_commit           => 'F',
8300                p_validation_level => p_validation_level,
8301                p_module_type      => 'TSK',
8302                p_visit_id         => p_visit_id,
8303                x_error_tbl        => l_error_tbl_type,
8304                x_return_status    => l_return_status,
8305                x_msg_count        => l_msg_count,
8306                x_msg_data         => l_msg_data);
8307 
8308     IF (l_log_statement >= l_log_current_level) THEN
8309        fnd_log.string(l_log_statement,
8310                       L_DEBUG_KEY,
8311                       'After calling VALIDATE_BEFORE_PRODUCTION, Return Status = ' ||
8312                       l_return_status);
8313     END IF;
8314 
8315     IF (l_return_status <> FND_API.G_RET_STS_SUCCESS OR l_error_tbl_type.COUNT > 0) THEN
8316        -- Check Error Message stack.
8317        x_msg_count := FND_MSG_PUB.count_msg;
8318        IF (l_log_statement >= l_log_current_level) THEN
8319           fnd_log.string(l_log_statement,
8320                          L_DEBUG_KEY,
8321                          'Errors from VALIDATE_BEFORE_PRODUCTION. Message count: ' || x_msg_count);
8322        END IF;
8323        IF l_return_status = FND_API.G_RET_STS_ERROR THEN
8324           RAISE FND_API.G_EXC_ERROR;
8325        ELSE
8326           RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
8327        END IF;
8328     END IF;
8329 
8330     IF (l_log_statement >= l_log_current_level) THEN
8331        fnd_log.string(l_log_statement,
8332                       L_DEBUG_KEY,
8333                       'Before calling VALIDATE_TASKS_BEF_PRODUCTION. p_module_type = ' || p_module_type);
8334     END IF;
8335 
8336     --Validate tasks before push to production happens
8337     AHL_VWP_PROJ_PROD_PVT.Validate_tasks_bef_production(
8338               p_visit_id        => p_visit_id,
8339               p_tasks_tbl       => p_tasks_tbl,
8340               x_tasks_tbl       => l_tasks_tbl,
8341               x_return_status   => l_return_status,
8342               x_msg_count       => l_msg_count,
8343               x_msg_data        => l_msg_data);
8344 
8345     IF (l_log_statement >= l_log_current_level) THEN
8346        fnd_log.string(l_log_statement,
8347                       L_DEBUG_KEY,
8348                       'After calling VALIDATE_TASKS_BEF_PRODUCTION. Records in l_tasks_tbl: ' ||
8349                       l_tasks_tbl.COUNT|| ', Return Status = ' || l_return_status);
8350     END IF;
8351 
8352     IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
8353        -- Check Error Message stack.
8354        x_msg_count := FND_MSG_PUB.count_msg;
8355 
8356        IF (l_log_statement >= l_log_current_level) THEN
8357           fnd_log.string(l_log_statement,
8358                          L_DEBUG_KEY,
8359                          'Errors from VALIDATE_TASKS_BEF_PRODUCTION. Message count: ' || x_msg_count);
8360        END IF;
8361 
8362        IF l_return_status = FND_API.G_RET_STS_ERROR THEN
8363           RAISE FND_API.G_EXC_ERROR;
8364        ELSE
8365           RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
8366        END IF;
8367     END IF;  -- l_return_status <> FND_API.G_RET_STS_SUCCESS
8368 
8369     -- SKPATHAK :: ER:12730539 :: 01-AUG-2011 :: START :: Validate Return to Supply Flags of only the released tasks
8370     -- SKPATHAK:: Moved this API call from after AHL_PRD_WORKORDER_PVT.Process_Jobs call to before AHL_PRD_WORKORDER_PVT.Process_Jobs call
8371     FOR i IN l_tasks_tbl.FIRST..l_tasks_tbl.LAST LOOP
8372       l_val_task_tbl(i)  := l_tasks_tbl(i);
8373     END LOOP;
8374 
8375     IF (l_log_statement >= l_log_current_level) THEN
8376        fnd_log.string(l_log_statement,
8377                       L_DEBUG_KEY,
8378                       'Before Calling AHL_VWP_RULES_PVT.Validate_Return_To_Supply. l_tasks_tbl.count = ' || l_tasks_tbl.count );
8379     END IF;
8380 
8381     IF (p_visit_id IS NOT NULL) THEN
8382       AHL_VWP_RULES_PVT.Validate_Return_To_Supply
8383       (
8384          p_api_version           => 1.0,
8385          p_init_msg_list         => FND_API.G_FALSE,
8386          p_commit                => FND_API.G_FALSE,
8387          p_validation_level      => FND_API.G_VALID_LEVEL_FULL,
8388          p_module_type           => null,
8389          p_visit_id              => null,
8390          p_tasks_tbl             => l_val_task_tbl,
8391          x_return_status         => l_return_status,
8392          x_msg_count             => l_msg_count,
8393          x_msg_data              => l_msg_data
8394      );
8395 
8396       IF (l_log_statement >= l_log_current_level) THEN
8397          fnd_log.string(l_log_statement,
8398                         L_DEBUG_KEY,
8399                         'After Calling AHL_VWP_RULES_PVT.Validate_Return_To_Supply. Return Status = ' || l_return_status );
8400       END IF;
8401 
8402       IF NVL(l_return_status,'x') <> FND_API.G_RET_STS_SUCCESS THEN
8403         x_msg_count := l_msg_count;
8404         x_return_status := l_return_status;
8405         IF l_return_status = Fnd_Api.g_ret_sts_error THEN
8406           RAISE Fnd_Api.g_exc_error;
8407         ELSIF l_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
8408           RAISE Fnd_Api.g_exc_unexpected_error;
8409         END IF;
8410       END IF;
8411     END IF;
8412     -- SKPATHAK :: ER:12730539 :: 01-AUG-2011 :: END
8413 
8414     IF (l_log_statement >= l_log_current_level) THEN
8415         fnd_log.string(l_log_statement,
8416                        L_DEBUG_KEY,
8417                        'Before calling AGGREGATE_TASK_MATERIAL_REQRS ');
8418     END IF;
8419 
8420     --Total the material requirements for a specific item at task level
8421     FOR i IN l_tasks_tbl.FIRST..l_tasks_tbl.LAST
8422     LOOP
8423        AHL_VWP_PROJ_PROD_PVT.Aggregate_Task_Material_Reqrs
8424            (  p_api_version      => p_api_version,
8425               p_init_msg_list    => p_init_msg_list,
8426               p_commit           => p_commit,
8427               p_validation_level => p_validation_level,
8428               p_module_type      => p_module_type,
8429               p_task_id          => l_tasks_tbl(i).visit_task_id,
8430               p_rel_tsk_flag     => 'Y',
8431               x_return_status    => l_return_status,
8432               x_msg_count        => l_msg_count,
8433               x_msg_data         => l_msg_data
8434            );
8435 
8436        IF (l_log_statement >= l_log_current_level) THEN
8437           fnd_log.string(l_log_statement,
8438                          L_DEBUG_KEY,
8439                          'After calling AGGREGATE_TASK_MATERIAL_REQRS for Task Id: ' ||
8440                          l_tasks_tbl(i).visit_task_id || '. Return Status = '|| l_return_status);
8441        END IF;
8442 
8443        IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
8444           x_msg_count := FND_MSG_PUB.count_msg;
8445           IF (l_log_statement >= l_log_current_level) THEN
8446              fnd_log.string(l_log_statement,
8447                             L_DEBUG_KEY,
8448                             'Errors from AGGREGATE_TASK_MATERIAL_REQRS. Message count: ' || x_msg_count);
8449           END IF;
8450           IF l_return_status = FND_API.G_RET_STS_ERROR THEN
8451              RAISE FND_API.G_EXC_ERROR;
8452           ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
8453              RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
8454           END IF;
8455        END IF;
8456     END LOOP;
8457 
8458     --for paritally implemented visits adjust the task times
8459     IF (c_visit_info_rec.start_date_time < SYSDATE and c_visit_info_rec.status_code = 'PARTIALLY RELEASED') THEN
8460 
8461       IF (l_log_statement >= l_log_current_level) THEN
8462          fnd_log.string(l_log_statement,
8463                         L_DEBUG_KEY,
8464                         'Before calling ADJUST_TASK_TIMES ');
8465       END IF;
8466 
8467       FOR i IN l_tasks_tbl.FIRST..l_tasks_tbl.LAST
8468       LOOP
8469         -- SKPATHAK :: ER: 9147951 :: 11-JAN-2010 :: Call adjust_task_times only if past task dates are null
8470         SELECT past_task_start_date INTO l_tasks_tbl(i).past_task_start_date FROM ahl_visit_tasks_b WHERE visit_task_id = l_tasks_tbl(i).visit_task_id;
8471         IF l_tasks_tbl(i).past_task_start_date IS NULL THEN
8472           AHL_VWP_TIMES_PVT.adjust_task_times
8473              (p_api_version        => l_api_version,
8474               p_init_msg_list      => p_init_msg_list,
8475               p_commit             => 'F',
8476               p_validation_level   => p_validation_level,
8477               p_task_id            => l_tasks_tbl(i).visit_task_id,
8478               p_reset_sysdate_flag => FND_API.G_TRUE,
8479               x_return_status      => l_return_status,
8480               x_msg_count          => l_msg_count,
8481               x_msg_data           => l_msg_data
8482            );
8483          END IF;
8484 
8485           IF (l_log_statement >= l_log_current_level) THEN
8486              fnd_log.string(l_log_statement,
8487                             L_DEBUG_KEY,
8488                             'After calling ADJUST_TASK_TIMES for task Id ' ||
8489                             l_tasks_tbl(i).visit_task_id ||'. Return Status = '|| l_return_status);
8490           END IF;
8491 
8492           IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
8493              x_msg_count := FND_MSG_PUB.count_msg;
8494              IF (l_log_statement >= l_log_current_level) THEN
8495                fnd_log.string(l_log_statement,
8496                               L_DEBUG_KEY,
8497                               'Errors from ADJUST_TASK_TIMES. Message count: ' || x_msg_count);
8498              END IF;
8499              IF l_return_status = FND_API.G_RET_STS_ERROR THEN
8500                 RAISE FND_API.G_EXC_ERROR;
8501              ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
8502                 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
8503              END IF;
8504           END IF;
8505         END LOOP;
8506     END IF; --partially released
8507 
8508     l_temp_msg_count := Fnd_Msg_Pub.count_msg;
8509 
8510     --Validate the MR/Route dates for all the tasks
8511     FOR i IN l_tasks_tbl.FIRST..l_tasks_tbl.LAST
8512     LOOP
8513         IF (l_log_statement >= l_log_current_level) THEN
8514            fnd_log.string(l_log_statement,
8515                           L_DEBUG_KEY,
8516                           'Before calling VALIDATE_MR_ROUTE_DATE. l_msg_count = ' || l_msg_count);
8517         END IF;
8518 
8519        -- SKPATHAK :: ER:12730539 :: 01-AUG-2011
8520        -- If the task's summary task is in partially implemented status, need not validate its route/MR
8521        OPEN get_task_status (l_tasks_tbl(i).originating_task_id);
8522        FETCH get_task_status INTO l_task_status;
8523        CLOSE get_task_status;
8524        IF l_task_status <> 'PARTIALLY RELEASED' THEN
8525         Validate_MR_Route_Date
8526         (
8527            p_mr_route_id       => l_tasks_tbl(i).MR_Route_Id,
8528            p_visit_task_number => l_tasks_tbl(i).VISIT_TASK_NUMBER,
8529            p_start_date_time   => l_tasks_tbl(i).TASK_START_DATE,
8530            p_end_date_time     => l_tasks_tbl(i).TASK_END_DATE
8531         );
8532 
8533         IF (l_log_statement >= l_log_current_level) THEN
8534            fnd_log.string(l_log_statement,L_DEBUG_KEY,
8535            'After calling VALIDATE_MR_ROUTE_DATE for task Id: ' ||l_tasks_tbl(i).visit_task_id || ' and l_msg_count - ' || l_msg_count);
8536         END IF;
8537        END IF;
8538     END LOOP;
8539 
8540     l_msg_count := Fnd_Msg_Pub.count_msg;
8541     IF (l_msg_count <> l_temp_msg_count) THEN
8542        IF (l_log_statement >= l_log_current_level) THEN
8543           fnd_log.string(l_log_statement,L_DEBUG_KEY,
8544                          'Errors from VALIDATE_MR_ROUTE_DATE. Message count: ' || l_msg_count);
8545        END IF;
8546        RAISE FND_API.G_EXC_ERROR;
8547     END IF;
8548 
8549     IF (l_log_statement >= l_log_current_level) THEN
8550        fnd_log.string(l_log_statement,
8551                       L_DEBUG_KEY,
8552                       'Before calling PUSH_TASKS_TO_PRODUCTION for visit id: ' ||p_visit_id);
8553     END IF;
8554 
8555     --push the selected tasks to production
8556     AHL_VWP_PROJ_PROD_PVT.Push_tasks_to_production
8557     ( p_api_version      => l_api_version,
8558       p_init_msg_list    => p_init_msg_list,
8559       p_validation_level => p_validation_level,
8560       p_module_type      => p_module_type,
8561       p_visit_id         => p_visit_id,
8562       p_tasks_tbl        => l_tasks_tbl,
8563       p_release_flag     => p_release_flag,
8564       x_return_status    => l_return_status,
8565       x_msg_count        => l_msg_count,
8566       x_msg_data         => l_msg_data
8567     );
8568 
8569     IF (l_log_statement >= l_log_current_level) THEN
8570        fnd_log.string(l_log_statement,
8571                       L_DEBUG_KEY,
8572                       'After calling PUSH_TASKS_TO_PRODUCTION. Return Status = '|| l_return_status);
8573     END IF;
8574 
8575     IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
8576        x_msg_count := FND_MSG_PUB.count_msg;
8577        IF (l_log_statement >= l_log_current_level) THEN
8578           fnd_log.string(l_log_statement,
8579                          L_DEBUG_KEY,
8580                          'Errors from PUSH_TASKS_TO_PRODUCTION. Message count: ' || x_msg_count);
8581        END IF;
8582        IF l_return_status = FND_API.G_RET_STS_ERROR THEN
8583           RAISE FND_API.G_EXC_ERROR;
8584        ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
8585           RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
8586        END IF;
8587     END IF;
8588 
8589     IF (l_log_statement >= l_log_current_level) THEN
8590        fnd_log.string(l_log_statement,
8591                       L_DEBUG_KEY,
8592                       'Before calling DELETE_SIMUL_VISITS for visit id: ' ||p_visit_id);
8593     END IF;
8594 
8595     -- SKPATHAK :: 02-MAY-2011 :: VWPE: ER:12424063
8596     -- Below call is not needed since LTP is being removed so no simulation visit exists
8597     -- Delete the simulated visits
8598     /* AHL_LTP_SIMUL_PLAN_PVT.delete_simul_visits
8599            (p_api_version      => l_api_version,
8600             p_init_msg_list    => p_init_msg_list,
8601             p_commit           => 'F',
8602             p_validation_level => p_validation_level,
8603             p_visit_id         => p_visit_id,
8604             x_return_status    => l_return_status,
8605             x_msg_count        => l_msg_count,
8606             x_msg_data         => l_msg_data);
8607 
8608     IF (l_log_statement >= l_log_current_level) THEN
8609        fnd_log.string(l_log_statement,
8610                       L_DEBUG_KEY,
8611                       'After calling DELETE_SIMUL_VISITS for visit id ' ||p_visit_id||'. Return Status = '|| l_return_status);
8612     END IF;
8613 
8614     IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
8615        x_msg_count := FND_MSG_PUB.count_msg;
8616        IF (l_log_statement >= l_log_current_level) THEN
8617            fnd_log.string(l_log_statement,
8618                           L_DEBUG_KEY,
8619                           'Errors from DELETE_SIMUL_TASKS. Message count: ' || x_msg_count);
8620        END IF;
8621        IF l_return_status = FND_API.G_RET_STS_ERROR THEN
8622           RAISE FND_API.G_EXC_ERROR;
8623        ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
8624           RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
8625        END IF;
8626     END IF;*/
8627 
8628     -- Standard check of p_commit
8629     IF FND_API.TO_BOOLEAN(p_commit) THEN
8630        COMMIT WORK;
8631     END IF;
8632 
8633     Fnd_Msg_Pub.count_and_get(
8634           p_encoded => Fnd_Api.g_false,
8635           p_count   => x_msg_count,
8636           p_data    => x_msg_data
8637     );
8638 
8639     IF (l_log_procedure >= l_log_current_level) THEN
8640         fnd_log.string(l_log_procedure,
8641                        L_DEBUG_KEY||'.end',
8642                        'At the end of PLSQL procedure. Return Status = ' || x_return_status);
8643     END IF;
8644 
8645   EXCEPTION
8646     WHEN  FND_API.G_EXC_ERROR THEN
8647        x_return_status := FND_API.G_RET_STS_ERROR;
8648        ROLLBACK TO Release_Tasks_Pvt;
8649        FND_MSG_PUB.count_and_get(p_count => x_msg_count,
8650                                p_data  => x_msg_data,
8651                                p_encoded => fnd_api.g_false);
8652 
8653     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
8654        x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
8655        ROLLBACK TO Release_Tasks_Pvt;
8656        Fnd_Msg_Pub.count_and_get (
8657              p_encoded => Fnd_Api.g_false,
8658              p_count   => x_msg_count,
8659              p_data    => x_msg_data);
8660 
8661     WHEN OTHERS THEN
8662        x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
8663        ROLLBACK TO Release_Tasks_Pvt;
8664        IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
8665           fnd_msg_pub.add_exc_msg(p_pkg_name       => G_PKG_NAME,
8666                                   p_procedure_name => 'Release_Tasks',
8667                                   p_error_text     => SUBSTR(SQLERRM,1,500));
8668        END IF;
8669        FND_MSG_PUB.count_and_get(p_count => x_msg_count,
8670                                  p_data  => x_msg_data,
8671                                  p_encoded => fnd_api.g_false);
8672 
8673 END Release_Tasks;
8674 
8675 ------------------------------------------------------------------
8676 --  Procedure name : Validate_tasks_bef_production
8677 --  Type           : Private
8678 --  Function       : Validate the tasks before pushing the tasks to prodn.
8679 --  Parameters     :
8680 --
8681 --  Standard OUT Parameters :
8682 --      x_return_status OUT  VARCHAR2      Required
8683 --      x_msg_count     OUT  NUMBER        Required
8684 --      x_msg_data      OUT  VARCHAR2      Required
8685 --
8686 --  Validate_tasks_bef_production Parameters:
8687 --       p_visit_id     IN   NUMBER        Required
8688 --       p_tasks_tbl    IN   Task_Tbl_Type Required
8689 --       x_tasks_tbl    OUT  Task_Tbl_Type Required
8690 --
8691 --  Version :
8692 --      30 November, 2007  RNAHATA  Initial Version - 1.0
8693 -------------------------------------------------------------------
8694 
8695 PROCEDURE Validate_tasks_bef_production(
8696     p_visit_id      IN         NUMBER,
8697     p_tasks_tbl     IN         Task_Tbl_Type,
8698     x_tasks_tbl     OUT NOCOPY Task_Tbl_Type,
8699     x_return_status OUT NOCOPY VARCHAR2,
8700     x_msg_count     OUT NOCOPY NUMBER,
8701     x_msg_data      OUT NOCOPY VARCHAR2
8702 ) IS
8703 
8704 --cursor to fetch the details of the tasks that have been pushe to production
8705 CURSOR c_task_dtls(x_vst_task_id IN NUMBER) IS
8706 SELECT  mr_id,visit_id,visit_task_id,status_code,task_type_code,nvl(originating_task_id,0) as originating_task_id,
8707         summary_task_flag, inventory_item_id,item_organization_id,visit_task_number,end_date_time
8708 FROM  ahl_visit_tasks_b
8709 WHERE visit_task_id = x_vst_task_id
8710 -- SKPATHAK :: 02-MAY-2011 :: VWPE:: Commented the below line since summary tasks may not be in planning
8711 --AND   NVL(status_code,'X') in ('PLANNING')
8712 order by visit_task_id;
8713 
8714 c_tsk_dtls_rec  c_task_dtls%ROWTYPE;
8715 
8716 --cursor to fetch the summary task id of the planned/unplanned task
8717 CURSOR c_summary_tsk_dtl (x_originating_tsk_id IN NUMBER) IS
8718  SELECT mr_id,visit_id,visit_task_id,status_code,task_type_code,nvl(originating_task_id,0) as originating_task_id,
8719          summary_task_flag, inventory_item_id,item_organization_id,visit_task_number,end_date_time
8720  FROM ahl_visit_tasks_b
8721 WHERE visit_task_id = x_originating_tsk_id
8722   AND   NVL(status_code,'X') = 'PLANNING'
8723   AND   task_type_code = 'SUMMARY';
8724 
8725 c_summary_tsk_rec c_summary_tsk_dtl%ROWTYPE;
8726 
8727 -- SKPATHAK :: 13-JUN-2011 :: VWPE:: START
8728 -- Fetch the summary tasks which are in partially released or released status
8729 CURSOR c_par_rel_sum_tsk_dtl (x_originating_tsk_id IN NUMBER) IS
8730  SELECT visit_task_id,nvl(originating_task_id,0) as originating_task_id,visit_task_number
8731  FROM ahl_visit_tasks_b
8732 WHERE visit_task_id = x_originating_tsk_id
8733   AND   NVL(status_code,'X') IN ( 'PARTIALLY RELEASED', 'RELEASED')
8734   AND   task_type_code = 'SUMMARY';
8735 c_par_rel_sum_tsk_rec c_par_rel_sum_tsk_dtl%ROWTYPE;
8736 
8737 CURSOR get_child_planning_tasks (c_task_id IN NUMBER)
8738 IS
8739 SELECT visit_task_id
8740 FROM ahl_visit_tasks_b
8741 WHERE originating_task_id = c_task_id
8742 AND status_code = 'PLANNING';
8743 
8744 l_is_all_tasks_rel VARCHAR2(1) := 'N';
8745 
8746 -- SKPATHAK :: 13-JUN-2011 :: VWPE:: END
8747 
8748 --cursor to fetch master work order for the visit
8749 CURSOR c_fet_master_wo  (x_visit_id IN NUMBER) IS
8750  SELECT wo.workorder_id, wo.status_code, wip.scheduled_start_date,wip.scheduled_completion_date
8751  FROM ahl_visits_b v, ahl_workorders wo, wip_discrete_jobs wip
8752 WHERE v.visit_id = x_visit_id
8753   AND NVL(v.status_code,'X') = 'PARTIALLY RELEASED'
8754   AND v.visit_id = wo.visit_id
8755   AND wo.visit_task_id IS NULL
8756   AND wo.master_workorder_flag = 'Y'
8757   AND wip.wip_entity_id = wo.wip_entity_id
8758   AND wo.STATUS_CODE not in ('22','7');
8759 
8760 c_mst_wo_visit_rec  c_fet_master_wo%ROWTYPE;
8761 
8762 -- Get all the Parent Task Dependencies.
8763 CURSOR get_parent_task_dependencies (x_vst_task_id IN NUMBER) IS
8764  SELECT P.visit_task_number , P.visit_task_id
8765  FROM   ahl_visit_tasks_b P,
8766         ahl_task_links L
8767  WHERE  P.visit_task_id = L.parent_task_id
8768 AND    L.visit_task_id = x_vst_task_id;
8769 
8770 -- Get all the Child Task Dependencies.
8771 CURSOR get_child_task_dependencies (x_vst_task_id IN NUMBER) IS
8772  SELECT C.visit_task_number ,C.visit_task_id
8773  FROM   ahl_visit_tasks_b C,
8774         ahl_task_links L
8775  WHERE  C.visit_task_id = L.visit_task_id
8776 AND    L.parent_task_id = x_vst_task_id;
8777 
8778 c_par_tech_dep_rec  get_parent_task_dependencies%ROWTYPE;
8779 c_ch_tech_dep_rec   get_child_task_dependencies%ROWTYPE;
8780 
8781 /*cursor to fetch all the child MR's/tasks for the summary MR to ensure all the dtl tasks are pushed to production*/
8782 CURSOR c_dtl_task_sum (x_vst_task_id IN NUMBER) IS
8783 select mr_id,visit_id,visit_task_id,status_code,task_type_code,nvl(originating_task_id,0) as originating_task_id,
8784         summary_task_flag, inventory_item_id,item_organization_id,visit_task_number,end_date_time
8785 FROM ahl_visit_tasks_b
8786 -- SKPATHAK :: 02-MAY-2011 :: VWPE: ER:12424063  :: Summary tasks may be in partially implemented status
8787 WHERE NVL(status_code,'X') in ('PLANNING','PARTIALLY RELEASED')
8788 START WITH visit_task_id = x_vst_task_id
8789 CONNECT BY originating_task_id = PRIOR visit_task_id
8790 order by visit_id,visit_task_id,mr_id;
8791 
8792 c_dtl_task_sum_rec    c_dtl_task_sum%ROWTYPE;
8793 
8794 --CHANGES by jrotich bug #13028686 begin
8795 CURSOR c_task_stage_details(c_vst_task_id IN NUMBER) IS
8796 SELECT TASKS.STAGE_ID,
8797   STAGES.STAGE_NAME,
8798   STAGE_TYPES.STAGE_TYPE_CODE
8799 FROM AHL_VISIT_TASKS_B TASKS,
8800   AHL_VISIT_STAGE_TYP_ASOC STAGE_TYPES,
8801   AHL_VWP_STAGES_VL STAGES
8802 WHERE
8803   TASKS.VISIT_TASK_ID= c_vst_task_id AND
8804   TASKS.STAGE_ID=STAGE_TYPES.STAGE_ID(+) AND
8805   TASKS.STAGE_ID = STAGES.STAGE_ID;
8806 
8807 l_task_stage_details c_task_stage_details%ROWTYPE;
8808 
8809 --CHANGES by jrotich bug #13028686 end
8810 
8811 
8812 
8813 
8814 
8815 j                      NUMBER := 0;
8816 K                      NUMBER := 0;
8817 m                      NUMBER := 0;
8818 L_API_NAME    CONSTANT VARCHAR2(30)  := 'Validate_tasks_bef_production';
8819 L_DEBUG_KEY   CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
8820 lp_originating_task_id ahl_visit_tasks_vl.originating_task_id%TYPE;
8821 curr_task              BOOLEAN := FALSE;
8822 parent_task            BOOLEAN := FALSE;
8823 parent_task_found_flag BOOLEAN := FALSE;
8824 child_task             BOOLEAN := FALSE;
8825 
8826 BEGIN
8827    IF (l_log_procedure >= l_log_current_level) THEN
8828        fnd_log.string(l_log_procedure,
8829                       L_DEBUG_KEY ||'.begin',
8830                       'At the start of PL SQL procedure. Visit Id = ' ||
8831                       p_visit_id || ', p_tasks_tbl.COUNT = ' || p_tasks_tbl.COUNT);
8832     END IF;
8833 
8834     -- Standard start of API savepoint
8835     SAVEPOINT Validate_tasks_bef_prodn_pvt;
8836 
8837     -- Initialize API return status to success
8838     x_return_status := FND_API.G_RET_STS_SUCCESS;
8839 
8840     --chk if the visit is released/partially released.
8841     OPEN c_fet_master_wo (p_visit_id);
8842     FETCH c_fet_master_wo INTO c_mst_wo_visit_rec;
8843     IF c_fet_master_wo%NOTFOUND THEN
8844        x_msg_count := FND_MSG_PUB.count_msg;
8845        IF (l_log_statement >= l_log_current_level) THEN
8846           fnd_log.string(l_log_statement,
8847                         L_DEBUG_KEY,
8848                         'Visit not released: ' || c_tsk_dtls_rec.visit_task_number);
8849        END IF;
8850     END IF;
8851     CLOSE c_fet_master_wo;
8852 
8853     FOR i IN p_tasks_tbl.FIRST..p_tasks_tbl.LAST
8854     LOOP
8855         OPEN c_task_dtls(p_tasks_tbl(i).visit_task_id);
8856         FETCH c_task_dtls INTO c_tsk_dtls_rec;
8857         IF c_task_dtls%NOTFOUND THEN
8858            x_msg_count := FND_MSG_PUB.count_msg;
8859            IF (l_log_statement >= l_log_current_level) THEN
8860               fnd_log.string(l_log_statement,
8861                              L_DEBUG_KEY,
8862                              'Task is either not in planning status or Invalid - ' ||
8863                              p_tasks_tbl(i).visit_task_id);
8864            END IF;
8865            CLOSE c_task_dtls;
8866            FND_MESSAGE.Set_Name(G_PM_PRODUCT_CODE,'AHL_VWP_INVALID_TSK_ID');
8867            Fnd_Message.SET_TOKEN('TASK_ID', p_tasks_tbl(i).visit_task_id);
8868            FND_MSG_PUB.ADD;
8869            RAISE FND_API.G_EXC_ERROR;
8870         END IF;
8871         CLOSE c_task_dtls;
8872 
8873 
8874         --CHANGES by jrotich bug #13028686 begin
8875         OPEN c_task_stage_details(c_tsk_dtls_rec.visit_task_id);
8876         FETCH c_task_stage_details INTO l_task_stage_details;
8877         CLOSE c_task_stage_details;
8878 
8879         IF (l_task_stage_details.stage_id IS NOT NULL) AND
8880           (l_task_stage_details.stage_type_code IS NULL) THEN
8881           IF (l_log_statement >= l_log_current_level) THEN
8882               fnd_log.string(l_log_statement,
8883                              L_DEBUG_KEY,
8884                              'Task has an associated stage that does not have a stage_type ' ||
8885                              c_tsk_dtls_rec.visit_task_id);
8886           END IF;
8887           FND_MESSAGE.SET_NAME('AHL', 'AHL_VWP_NO_STAGE_TYPE');
8888           FND_MESSAGE.SET_TOKEN('STAGE_NAME',l_task_stage_details.stage_name);
8889           FND_MSG_PUB.ADD;
8890           RAISE FND_API.G_EXC_ERROR;
8891         END IF;
8892         --CHANGES by jrotich bug #13028686 begin end;
8893 
8894 
8895 
8896         /* if the visit is partially released, then the planned end time for the wo should not be
8897         exceed the scheduled end time */
8898         IF (c_mst_wo_visit_rec.scheduled_completion_date IS NOT NULL) AND
8899             (c_tsk_dtls_rec.end_date_time > c_mst_wo_visit_rec.scheduled_completion_date) THEN
8900             x_msg_count := FND_MSG_PUB.count_msg;
8901             IF (l_log_statement >= l_log_current_level) THEN
8902                 fnd_log.string(l_log_statement,
8903                                L_DEBUG_KEY,
8904                                'Planned end time of the task is exceeding the scheduled completion time of the master WO: ' ||
8905                                c_tsk_dtls_rec.visit_task_number);
8906             END IF;
8907             FND_MESSAGE.SET_NAME(G_PM_PRODUCT_CODE,'AHL_VWP_PET_EXCD_SCT');
8908             FND_MSG_PUB.ADD;
8909             RAISE FND_API.G_EXC_ERROR;
8910           END IF;
8911 
8912         parent_task_found_flag := FALSE;
8913         /*when the summary task is selected then all child tasks/child mr's for the summary tasks/MR will be pushed to prodn.
8914         Fetches only summary tasks of MR's and not the manually added summary tasks.*/
8915 
8916         IF (c_tsk_dtls_rec.task_type_code IN ('SUMMARY') AND c_tsk_dtls_rec.summary_task_flag = 'N') THEN
8917 
8918            IF (x_tasks_tbl.COUNT > 0) THEN
8919               FOR m IN x_tasks_tbl.FIRST..x_tasks_tbl.LAST
8920               LOOP
8921                 IF x_tasks_tbl(m).visit_task_id = c_tsk_dtls_rec.visit_task_id THEN
8922                    parent_task_found_flag := TRUE;
8923                    EXIT;
8924                 END IF;
8925               END LOOP;
8926            END IF;
8927 
8928            --inserts only if the summary task is not inserted already.
8929            IF NOT(parent_task_found_flag) THEN
8930               --this cursor fetches entire family tree of the selected MR with its children to be inserted.
8931               OPEN  c_dtl_task_sum(c_tsk_dtls_rec.visit_task_id);
8932               LOOP
8933                  FETCH c_dtl_task_sum INTO c_dtl_task_sum_rec;
8934                  EXIT WHEN c_dtl_task_sum%NOTFOUND;
8935                  --populating the output table with all the child parent MR's/tasks
8936                  j := j + 1;
8937                  x_tasks_tbl(j).visit_id             := c_dtl_task_sum_rec.visit_id;
8938                  x_tasks_tbl(j).visit_task_id        := c_dtl_task_sum_rec.visit_task_id;
8939                  x_tasks_tbl(j).inventory_item_id    := c_dtl_task_sum_rec.inventory_item_id;
8940                  x_tasks_tbl(j).item_organization_id := c_dtl_task_sum_rec.item_organization_id;
8941                  x_tasks_tbl(j).mr_id                := c_dtl_task_sum_rec.mr_id;
8942                  x_tasks_tbl(j).task_type_code       := c_dtl_task_sum_rec.task_type_code;
8943                  x_tasks_tbl(j).task_status_code     := c_dtl_task_sum_rec.status_code;
8944                  x_tasks_tbl(j).originating_task_id  := c_dtl_task_sum_rec.originating_task_id;
8945                  x_tasks_tbl(j).visit_task_number    := c_dtl_task_sum_rec.visit_task_number;
8946               END LOOP;
8947               CLOSE c_dtl_task_sum;
8948            END IF;
8949         END IF;
8950 
8951       /*for each planned/unplanned/summary task ensure that the parent MR/task is selected.If not then throw
8952       an error message to the user asking him to select the parent MR*/
8953       IF (c_tsk_dtls_rec.task_type_code IN ('PLANNED','UNPLANNED', 'SUMMARY')) AND (c_tsk_dtls_rec.originating_task_id <> 0) THEN
8954 
8955         --loop back to the parent MR to ensure that the child tasks/MR is also selected
8956         lp_originating_task_id := c_tsk_dtls_rec.originating_task_id;
8957 
8958         LOOP
8959           parent_task_found_flag := FALSE;
8960 
8961           --this cursor fetches the parent for each task
8962           OPEN c_summary_tsk_dtl(lp_originating_task_id);
8963           FETCH c_summary_tsk_dtl INTO c_summary_tsk_rec;
8964           IF c_summary_tsk_dtl%FOUND THEN
8965             --locate the summary task from the selected task list
8966             FOR k IN p_tasks_tbl.FIRST..p_tasks_tbl.LAST
8967             LOOP
8968               --chk if the summary task for the task is also selected
8969               IF p_tasks_tbl(k).visit_task_id = c_summary_tsk_rec.visit_task_id THEN
8970                  parent_task_found_flag := TRUE;
8971                  EXIT;
8972               END IF;
8973             END LOOP;
8974 
8975             IF NOT(parent_task_found_flag) THEN --if summary task is not selected then throw an error
8976                   x_msg_count := FND_MSG_PUB.count_msg;
8977                   IF (l_log_statement >= l_log_current_level) THEN
8978                      fnd_log.string(l_log_statement,
8979                                     L_DEBUG_KEY,
8980                                     'Select the summary task for the task: ' ||
8981                                     c_tsk_dtls_rec.visit_task_number);
8982                   END IF;
8983                   FND_MESSAGE.Set_Name(G_PM_PRODUCT_CODE,'AHL_VWP_SEL_SUM_TSK');
8984                   Fnd_Message.SET_TOKEN('TASK_NUMBER', c_tsk_dtls_rec.visit_task_number);
8985                   FND_MSG_PUB.ADD;
8986                   RAISE FND_API.G_EXC_ERROR;
8987             END IF;
8988 
8989             lp_originating_task_id := c_summary_tsk_rec.originating_task_id;
8990 
8991           -- SKPATHAK :: 13-JUN-2011 :: VWPE:: START
8992           ELSE --c_summary_tsk_dtl%FOUND
8993             OPEN c_par_rel_sum_tsk_dtl(lp_originating_task_id);
8994             FETCH c_par_rel_sum_tsk_dtl INTO c_par_rel_sum_tsk_rec;
8995             IF c_par_rel_sum_tsk_dtl%FOUND THEN
8996 
8997               --The summary task of the selected task is in partially released status
8998               --So populating the output table with all the child parent MR's/tasks
8999               j := j + 1;
9000               x_tasks_tbl(j).visit_id             := c_tsk_dtls_rec.visit_id;
9001               x_tasks_tbl(j).visit_task_id        := c_tsk_dtls_rec.visit_task_id;
9002               x_tasks_tbl(j).inventory_item_id    := c_tsk_dtls_rec.inventory_item_id;
9003               x_tasks_tbl(j).item_organization_id := c_tsk_dtls_rec.item_organization_id;
9004               x_tasks_tbl(j).mr_id                := c_tsk_dtls_rec.mr_id;
9005               x_tasks_tbl(j).task_type_code       := c_tsk_dtls_rec.task_type_code;
9006               x_tasks_tbl(j).task_status_code     := c_tsk_dtls_rec.status_code;
9007               x_tasks_tbl(j).originating_task_id  := c_tsk_dtls_rec.originating_task_id;
9008               x_tasks_tbl(j).visit_task_number    := c_tsk_dtls_rec.visit_task_number;
9009 
9010               --Also update the summary task to Released status
9011               UPDATE ahl_visit_tasks_b
9012               SET  status_code = 'RELEASED',
9013                 OBJECT_VERSION_NUMBER = OBJECT_VERSION_NUMBER + 1,
9014                 LAST_UPDATE_DATE      = SYSDATE,
9015                 LAST_UPDATED_BY       = Fnd_Global.USER_ID,
9016                 LAST_UPDATE_LOGIN     = Fnd_Global.LOGIN_ID
9017               WHERE visit_task_id = lp_originating_task_id;
9018 
9019               FOR child_planning_tasks_rec IN get_child_planning_tasks (c_par_rel_sum_tsk_rec.visit_task_id) LOOP
9020                 IF (l_log_statement >= l_log_current_level) THEN
9021                    fnd_log.string(l_log_statement,
9022                                   L_DEBUG_KEY,
9023                                   'Inside loop for get_child_planning_tasks, child_planning_tasks_rec.visit_task_id: ' ||
9024                                   child_planning_tasks_rec.visit_task_id);
9025                 END IF;
9026                 FOR k IN p_tasks_tbl.FIRST..p_tasks_tbl.LAST
9027                 LOOP
9028                   IF (l_log_statement >= l_log_current_level) THEN
9029                      fnd_log.string(l_log_statement,
9030                                     L_DEBUG_KEY,
9031                                     'Inside loop for p_tasks_tbl, p_tasks_tbl('||k||').visit_task_id: ' ||
9032                                     p_tasks_tbl(k).visit_task_id);
9033                   END IF;
9034                   --Check if all the sub tasks of the summary task are selected, if not throw error
9035                   IF p_tasks_tbl(k).visit_task_id = child_planning_tasks_rec.visit_task_id THEN
9036                      l_is_all_tasks_rel := 'Y';
9037                      EXIT;
9038                   END IF;
9039                 END LOOP;
9040                 IF l_is_all_tasks_rel = 'N' AND p_tasks_tbl(i).unit_effectivity_id IS NOT NULL THEN
9041                   FND_MESSAGE.Set_Name(G_PM_PRODUCT_CODE,'AHL_VWP_CHILD_TASK_SEL');
9042                   Fnd_Message.SET_TOKEN('TASK_NUMBER', c_par_rel_sum_tsk_rec.visit_task_number);
9043                   FND_MSG_PUB.ADD;
9044                   RAISE FND_API.G_EXC_ERROR;
9045                 ELSE
9046                   l_is_all_tasks_rel := 'N';
9047                 END IF;
9048               END LOOP;
9049             END IF;
9050             lp_originating_task_id := c_par_rel_sum_tsk_rec.originating_task_id;
9051             CLOSE c_par_rel_sum_tsk_dtl;
9052           END IF; --c_summary_tsk_dtl%FOUND
9053           CLOSE c_summary_tsk_dtl;
9054           -- SKPATHAK :: 13-JUN-2011 :: VWPE:: END
9055 
9056           EXIT WHEN NVL(lp_originating_task_id,0) = 0;
9057         END LOOP;
9058 
9059       END IF; --planned/unplanned tasks
9060 
9061       IF ((c_tsk_dtls_rec.task_type_code = 'UNASSOCIATED') OR
9062           (c_tsk_dtls_rec.task_type_code = 'SUMMARY' AND c_tsk_dtls_rec.summary_task_flag = 'Y')) THEN
9063             j := j + 1;
9064             x_tasks_tbl(j).visit_id             := c_tsk_dtls_rec.visit_id;
9065             x_tasks_tbl(j).visit_task_id        := c_tsk_dtls_rec.visit_task_id;
9066             x_tasks_tbl(j).inventory_item_id    := c_tsk_dtls_rec.inventory_item_id;
9067             x_tasks_tbl(j).item_organization_id := c_tsk_dtls_rec.item_organization_id;
9068             x_tasks_tbl(j).mr_id                := c_tsk_dtls_rec.mr_id;
9069             x_tasks_tbl(j).task_type_code       := c_tsk_dtls_rec.task_type_code;
9070             x_tasks_tbl(j).task_status_code     := c_tsk_dtls_rec.status_code;
9071             x_tasks_tbl(j).originating_task_id  := c_tsk_dtls_rec.originating_task_id;
9072       END IF; --unassociated/summary
9073 
9074     END LOOP; --for all selected tasks
9075 
9076     -- chk for each task which has a technical dependency with other MR's or unassociated tasks
9077     FOR i IN x_tasks_tbl.FIRST..x_tasks_tbl.LAST
9078     LOOP
9079       parent_task := FALSE;
9080       child_task := FALSE;
9081 
9082       OPEN get_parent_task_dependencies (x_tasks_tbl(i).visit_task_id);
9083       LOOP
9084         FETCH get_parent_task_dependencies INTO c_par_tech_dep_rec;
9085         IF get_parent_task_dependencies%NOTFOUND THEN
9086           x_msg_count := FND_MSG_PUB.count_msg;
9087           IF (l_log_statement >= l_log_current_level) THEN
9088              fnd_log.string(l_log_statement,
9089                             L_DEBUG_KEY,
9090                             'Parent Technical task dependency not found for the task - ' ||
9091                             x_tasks_tbl(i).visit_task_number);
9092           END IF;
9093           EXIT;
9094         ELSE --when parent dependency is found chk if the associated MR/unassociated tasks are also selected.
9095           FOR j IN x_tasks_tbl.FIRST..x_tasks_tbl.LAST
9096           LOOP
9097             IF (x_tasks_tbl(j).visit_task_id = c_par_tech_dep_rec.visit_task_id) THEN
9098                parent_task := TRUE;
9099                EXIT;
9100             END IF;
9101           END LOOP;
9102 
9103           IF NOT(parent_task) THEN --parent task not selected
9104             x_msg_count := FND_MSG_PUB.count_msg;
9105             IF (l_log_statement >= l_log_current_level) THEN
9106                fnd_log.string(l_log_statement,
9107                               L_DEBUG_KEY,
9108                               'Parent tasks on which the task ' ||
9109                               x_tasks_tbl(i).visit_task_number ||
9110                               ' is technically dependent has not been selected.'||
9111                               'Please select the technically dependent tasks too');
9112             END IF;
9113             CLOSE get_parent_task_dependencies;
9114             FND_MESSAGE.Set_Name(G_PM_PRODUCT_CODE,'AHL_VWP_SEL_TECH_DEP');
9115             Fnd_Message.SET_TOKEN('TASK_NUMBER', x_tasks_tbl(i).visit_task_number);
9116             FND_MSG_PUB.ADD;
9117             RAISE FND_API.G_EXC_ERROR;
9118           END IF; --parent task not selected
9119         END IF;
9120       END LOOP; --loop through the parent dependent records
9121       CLOSE get_parent_task_dependencies;
9122 
9123       OPEN get_child_task_dependencies (x_tasks_tbl(i).visit_task_id);
9124       LOOP --loop through the child dependent records
9125         FETCH get_child_task_dependencies INTO c_ch_tech_dep_rec;
9126         IF get_child_task_dependencies%NOTFOUND THEN
9127            x_msg_count := FND_MSG_PUB.count_msg;
9128            IF (l_log_statement >= l_log_current_level) THEN
9129               fnd_log.string(l_log_statement,
9130                              L_DEBUG_KEY,
9131                              'Child Technical task dependency not found for the task - ' || x_tasks_tbl(i).visit_task_number);
9132            END IF;
9133            EXIT;
9134         ELSE --when child dependency is found chk if the associated MR/unassociated tasks are also selected.
9135            FOR j IN x_tasks_tbl.FIRST..x_tasks_tbl.LAST
9136            LOOP
9137              IF (x_tasks_tbl(j).visit_task_id = c_ch_tech_dep_rec.visit_task_id) THEN
9138                 child_task := TRUE;
9139                 EXIT;
9140              END IF;
9141            END LOOP;
9142 
9143            IF NOT(child_task) THEN
9144               x_msg_count := FND_MSG_PUB.count_msg;
9145               IF (l_log_statement >= l_log_current_level) THEN
9146                  fnd_log.string(l_log_statement,
9147                                 L_DEBUG_KEY,
9148                                 'Child tasks on which the task ' || x_tasks_tbl(i).visit_task_number || ' is technically dependent has not been selected.'||
9149                                 'Please select the technically dependent tasks too');
9150               END IF;
9151               CLOSE get_child_task_dependencies;
9152               FND_MESSAGE.Set_Name(G_PM_PRODUCT_CODE,'AHL_VWP_SEL_TECH_DEP');
9153               Fnd_Message.SET_TOKEN('TASK_NUMBER', x_tasks_tbl(i).visit_task_number);
9154               FND_MSG_PUB.ADD;
9155               RAISE FND_API.G_EXC_ERROR;
9156            END IF; --curr task not selected
9157         END IF;
9158       END LOOP; --loop through the child dependent records
9159       CLOSE get_child_task_dependencies;
9160 
9161     END LOOP;
9162 
9163    IF (l_log_procedure >= l_log_current_level) THEN
9164       fnd_log.string(l_log_procedure,
9165                      L_DEBUG_KEY ||'.end',
9166                      'At the end of PL SQL procedure. x_tasks_tbl.COUNT = ' || x_tasks_tbl.COUNT);
9167    END IF;
9168 
9169   EXCEPTION
9170   WHEN  FND_API.G_EXC_ERROR THEN
9171     x_return_status := FND_API.G_RET_STS_ERROR;
9172     ROLLBACK TO Validate_tasks_bef_prodn_pvt;
9173     FND_MSG_PUB.count_and_get(p_count => x_msg_count,
9174                               p_data  => x_msg_data,
9175                               p_encoded => fnd_api.g_false);
9176 
9177   WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
9178     x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
9179     ROLLBACK TO Validate_tasks_bef_prodn_pvt;
9180     Fnd_Msg_Pub.count_and_get (
9181             p_encoded => Fnd_Api.g_false,
9182             p_count   => x_msg_count,
9183             p_data    => x_msg_data);
9184 
9185   WHEN OTHERS THEN
9186     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
9187     ROLLBACK TO Validate_tasks_bef_prodn_pvt;
9188     IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
9189        fnd_msg_pub.add_exc_msg(p_pkg_name       => G_PKG_NAME,
9190                                p_procedure_name => 'Validate_tasks_bef_production',
9191                                p_error_text     => SUBSTR(SQLERRM,1,500));
9192     END IF;
9193     FND_MSG_PUB.count_and_get(p_count => x_msg_count,
9194                                p_data  => x_msg_data,
9195                                p_encoded => fnd_api.g_false);
9196 
9197 END Validate_tasks_bef_production;
9198 
9199 -------------------------------------------------------------------
9200 --  Procedure name    : Push_tasks_to_production
9201 --  Type              : Private
9202 --  Function          : Push the selected tasks to production.
9203 --  Parameters  :
9204 --
9205 --  Standard IN  Parameters :
9206 --      p_api_version      IN  NUMBER        Required
9207 --      p_init_msg_list    IN  VARCHAR2      Default  FND_API.G_FALSE
9208 --      p_validation_level IN  NUMBER        Default  FND_API.G_VALID_LEVEL_FULL
9209 --      p_module_type      IN  VARCHAR2      Default  Null
9210 --
9211 --  Standard OUT Parameters :
9212 --      x_return_status    OUT VARCHAR2      Required
9213 --      x_msg_count        OUT NUMBER        Required
9214 --      x_msg_data         OUT VARCHAR2      Required
9215 --
9216 --  Push_tasks_to_production Parameters:
9217 --       p_module_type     IN  VARCHAR2      Default = NULL
9218 --       p_visit_id        IN  NUMBER        Required
9219 --       p_tasks_tbl       IN  Task_Tbl_Type Required
9220 --       p_release_flag    IN  VARCHAR2      Default = 'N'
9221 --
9222 --  Version :
9223 --      30 November, 2007  RNAHATA  Initial Version - 1.0
9224 -------------------------------------------------------------------
9225 
9226 PROCEDURE Push_tasks_to_production(
9227     p_api_version      IN         NUMBER,
9228     p_init_msg_list    IN         VARCHAR2  := Fnd_Api.g_false,
9229     p_validation_level IN         NUMBER    := Fnd_Api.g_valid_level_full,
9230     p_module_type      IN         VARCHAR2  := Null,
9231     p_visit_id         IN         NUMBER,
9232     p_tasks_tbl        IN         Task_Tbl_Type,
9233     p_release_flag     IN         VARCHAR2  ,
9234     x_return_status    OUT NOCOPY VARCHAR2,
9235     x_msg_count        OUT NOCOPY NUMBER,
9236     x_msg_data         OUT NOCOPY VARCHAR2
9237 ) IS
9238 
9239 --check if the visit master wo exists
9240 CURSOR c_fet_master_wo  (x_visit_id IN NUMBER) IS
9241  SELECT 1 FROM ahl_workorders wo
9242  WHERE wo.visit_id = x_visit_id
9243   AND wo.visit_task_id IS NULL
9244   AND wo.master_workorder_flag = 'Y';
9245 
9246 --fetch master work order for the visit
9247 CURSOR c_visit_master_wo  (x_visit_id IN NUMBER) IS
9248  SELECT wo.workorder_id, wo.status_code, wip.scheduled_start_date,wip.scheduled_completion_date,wo.object_version_number
9249  FROM ahl_visits_b v, ahl_workorders wo, wip_discrete_jobs wip
9250  WHERE v.visit_id = x_visit_id
9251   AND v.visit_id = wo.visit_id
9252   AND wo.visit_task_id IS NULL
9253   AND wo.master_workorder_flag = 'Y'
9254   AND wip.wip_entity_id = wo.wip_entity_id
9255   AND wo.status_code not in ('22','7');
9256 
9257 c_mst_wo_visit_rec  c_visit_master_wo%ROWTYPE;
9258 
9259 --fetch visit details
9260 CURSOR c_visit_dtl (x_visit_id IN NUMBER) IS
9261  SELECT ahl_visits_vl.*,AHL_VWP_VISITS_PVT.Is_Old_Visit(VISIT_ID) IS_OLD_VISIT FROM ahl_visits_vl
9262  WHERE visit_id = x_visit_id;
9263 
9264 c_visit_dtl_rec c_visit_dtl%ROWTYPE;
9265 
9266 --fetch task details
9267 CURSOR c_visit_task_dtl (x_visit_task_id IN NUMBER) IS
9268  SELECT * FROM ahl_visit_tasks_vl
9269  WHERE visit_task_id = x_visit_task_id;
9270 
9271 c_visit_tsk_dtl_rec c_visit_task_dtl%ROWTYPE;
9272 
9273 --check if the task wo exists
9274 CURSOR c_fet_task_wo  (x_visit_id IN NUMBER, x_visit_task_id IN NUMBER) IS
9275 SELECT 1 FROM ahl_workorders wo
9276 WHERE wo.visit_id = x_visit_id
9277 AND wo.visit_task_id = x_visit_task_id
9278 AND wo.visit_task_id IS NOT NULL;
9279 
9280 --fetch work order for the task
9281 CURSOR c_task_wo  (x_visit_id IN NUMBER,x_visit_task_id IN NUMBER) IS
9282 SELECT v.visit_task_id, wo.workorder_id, wo.status_code, wip.scheduled_start_date,wip.scheduled_completion_date,wo.object_version_number
9283 FROM ahl_visit_tasks_b v, ahl_workorders wo, wip_discrete_jobs wip
9284 WHERE v.visit_id = x_visit_id
9285 AND v.visit_id = wo.visit_id
9286 AND wo.visit_task_id IS NOT NULL
9287 AND wo.visit_task_id = x_visit_task_id
9288 AND wip.wip_entity_id = wo.wip_entity_id
9289 AND wo.status_code not in ('22','7');
9290 
9291 c_task_wo_rec c_task_wo%ROWTYPE;
9292 
9293 --fetch summary task flag for the task
9294 CURSOR c_fet_sum_task_flg (x_visit_id IN NUMBER, x_visit_task_id IN NUMBER) IS
9295 SELECT summary_task_flag FROM ahl_visit_tasks_b
9296 WHERE visit_task_id = x_visit_task_id;
9297 
9298 --fetch all the tasks in the visit
9299 CURSOR c_all_task_dtl (x_visit_id IN NUMBER) IS
9300 SELECT count(visit_task_id) FROM ahl_visit_tasks_b
9301 WHERE visit_id = x_visit_id
9302 AND NVL(status_code,'X') IN ('PLANNING');
9303 
9304 --get summary task start, end time
9305 CURSOR get_summary_task_times_csr(x_task_id IN NUMBER)IS
9306 SELECT min(start_date_time), max(end_date_time)
9307 FROM ahl_visit_tasks_b  VST
9308 START WITH visit_task_id  = x_task_id
9309 AND NVL(VST.status_code, 'Y') <> 'DELETED'
9310     CONNECT BY originating_task_id = PRIOR visit_task_id;
9311 
9312 --find Route Id from MR Routes view
9313 CURSOR c_route (x_id IN NUMBER) IS
9314 SELECT Route_Id FROM AHL_MR_ROUTES_V
9315 WHERE MR_ROUTE_ID = x_id;
9316 
9317 --check if the visit master wo exists
9318 CURSOR c_fet_mas_wo_dtls  (x_visit_id IN NUMBER) IS
9319 SELECT actual_start_date,actual_end_date
9320 FROM ahl_workorders wo
9321 WHERE wo.visit_id = x_visit_id
9322 AND wo.visit_task_id IS NULL
9323 AND wo.master_workorder_flag = 'Y';
9324 
9325 c_fet_mas_wo_dtl_rec    c_fet_mas_wo_dtls%ROWTYPE;
9326 
9327 --Inventory item id and instance id to be defaulted when
9328 --the item and instance are not specified at the header level
9329 CURSOR default_task_inst_dtls(c_task_id IN NUMBER) IS
9330 SELECT inventory_item_id,instance_id
9331 FROM ahl_visit_tasks_b
9332 WHERE visit_task_id = c_task_id;
9333 
9334 def_task_inst_rec  default_task_inst_dtls%ROWTYPE;
9335 
9336 /*B5758813 - rnahata - fetches the route information for updating workorder
9337 description for tasks created from Routes */
9338 CURSOR get_wo_dtls_for_mrtasks_cur (p_task_id IN NUMBER) IS
9339 --TCHIMIRA::Bug 9149770 ::09-FEB-2010
9340 --use substrb and lengthb instead of substr and length respectively
9341 SELECT ar.route_no||'.'||substrb(ar.title,1,(240 - (lengthb(ar.route_no) + 1))) workorder_description
9342 FROM ahl_routes_vl ar,ahl_visit_tasks_b avt, ahl_mr_routes mrr
9343 WHERE avt.visit_task_id = p_task_id
9344 and nvl(avt.status_code,'Y') = 'PLANNING'
9345 and avt.mr_route_id = mrr.mr_route_id
9346 and mrr.route_id = ar.route_id;
9347 
9348 get_wo_dtls_for_mrtasks_rec    get_wo_dtls_for_mrtasks_cur%ROWTYPE;
9349 
9350 --get SR MWO details.
9351 CURSOR c_get_sr_mwo_dtls(p_sr_task_id IN NUMBER) IS
9352 SELECT WDJ.WIP_ENTITY_ID,
9353        AWO.WORKORDER_ID,
9354        AWO.OBJECT_VERSION_NUMBER,
9355        WDJ.SCHEDULED_START_DATE,
9356        WDJ.SCHEDULED_COMPLETION_DATE
9357 FROM AHL_WORKORDERS AWO,
9358      WIP_DISCRETE_JOBS WDJ
9359 WHERE WDJ.WIP_ENTITY_ID = AWO.WIP_ENTITY_ID
9360  AND AWO.VISIT_TASK_ID = p_sr_task_id
9361  AND AWO.MASTER_WORKORDER_FLAG = 'Y'
9362  AND AWO.STATUS_CODE <> 17;
9363 
9364 l_sr_mwo_rec  c_get_sr_mwo_dtls%ROWTYPE;
9365 
9366 --get SR task details
9367 CURSOR c_get_sr_task_dtls(p_sr_task_id IN NUMBER) IS
9368  SELECT * FROM AHL_VISIT_TASKS_B vst
9369  WHERE vst.TASK_TYPE_CODE = 'SUMMARY'
9370   AND vst.MR_ID IS NULL
9371   AND vst.SERVICE_REQUEST_ID =
9372       (SELECT vst1.SERVICE_REQUEST_ID
9373        FROM ahl_visit_tasks_b vst1
9374        WHERE vst1.visit_task_id = p_sr_task_id);
9375 
9376 --check if visit has planned tasks
9377 CURSOR c_visit_has_planned_tasks(p_visit_id IN NUMBER) IS
9378  SELECT 1 FROM ahl_visit_tasks_b
9379   WHERE visit_id = p_visit_id
9380   AND status_code = 'PLANNING'
9381   -- SATRAJEN :: Bug 13930098 :: Visit stays at PARTIALLY IMPLEMENTED status :: Do NOT consider the default stage task :: July 2012
9382    AND (TASK_TYPE_CODE <> 'STAGE'
9383          OR (STAGE_ID IS NOT NULL AND TASK_TYPE_CODE = 'STAGE'));
9384 
9385 CURSOR c_visit_time_matches_MWO_time(p_visit_id IN NUMBER) IS
9386  SELECT 1
9387  FROM ahl_visits_b vst, ahl_workorders wo, wip_discrete_jobs wdj
9388  WHERE vst.visit_id = p_visit_id
9389   AND wo.visit_id = vst.visit_id
9390   AND wo.MASTER_WORKORDER_FLAG = 'Y'
9391   AND wo.visit_task_id IS NULL
9392   AND wdj.wip_entity_id = wo.wip_entity_id
9393   AND vst.start_date_time = wdj.scheduled_start_date
9394   AND vst.close_date_time = wdj.scheduled_completion_date;
9395 
9396 -- MANESING::Bug 13713141, 16-Apr-2012, added following cursors
9397 -- Cursor to find out the Repair Batch for the given task
9398 CURSOR get_rpr_batch_for_task_csr (c_visit_task_id NUMBER) IS
9399     SELECT repair_batch_name
9400     FROM   AHL_VISIT_TASKS_B
9401     WHERE  cost_parent_id  IS NULL
9402     START WITH visit_task_id = c_visit_task_id
9403     CONNECT BY visit_task_id = Prior cost_parent_id;
9404 
9405 -- Cursor to check if Repair Batch has planned tasks
9406 CURSOR chk_rpr_batch_has_planed_tasks (c_repair_batch_name VARCHAR2) IS
9407     SELECT 'X'
9408     FROM   AHL_VISIT_TASKS_B
9409     WHERE  cost_parent_id  IS NOT NULL  -- to filter repair batch task
9410     AND    status_code     = 'PLANNING'
9411     START WITH repair_batch_name = c_repair_batch_name
9412     CONNECT BY cost_parent_id    = Prior visit_task_id;
9413 
9414 -- SKPATHAK :: 02-MAY-2011 :: VWPE: ER:12424063
9415 -- Get the stage id of the visit stages that are in planning and some of their tasks are released
9416 CURSOR get_stage_id (c_visit_id IN NUMBER) IS
9417   SELECT stage.stage_id
9418   FROM ahl_vwp_stages_b stage
9419   WHERE stage.visit_id = c_visit_id
9420   AND EXISTS (SELECT 1
9421               FROM ahl_visit_tasks_b task
9422               WHERE stage.stage_id = task.stage_id
9423               AND stage.stage_status_code = 'PLANNING'
9424               AND task.task_type_code <> 'STAGE'
9425               AND task.status_code = 'RELEASED');
9426 
9427 -- Get the workorder id and task type for a given task
9428 CURSOR get_task_dets (c_task_id IN NUMBER) IS
9429   SELECT task.task_type_code, wo.workorder_id
9430   FROM ahl_visit_tasks_b task, ahl_workorders wo
9431   WHERE task.visit_task_id = c_task_id
9432   AND task.visit_task_id = wo.visit_task_id;
9433   task_dets_rec get_task_dets%ROWTYPE;
9434 
9435 l_temp_num1             NUMBER := NULL;
9436 l_temp_num2             NUMBER := NULL;
9437 l_sr_task_dtls_rec      c_get_sr_task_dtls%ROWTYPE;
9438 l_wo_tbl_count          NUMBER  := 0;
9439 l_sch_start_date        DATE;
9440 l_sch_end_date          DATE;
9441 i                       NUMBER := 0;
9442 l_chk_mst_wo            NUMBER := 0;
9443 l_chk_task_wo           NUMBER := 0;
9444 L_API_NAME     CONSTANT VARCHAR2(30)  := 'Push_tasks_to_production';
9445 L_API_VERSION  CONSTANT NUMBER        := 1.0;
9446 L_DEBUG_KEY    CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
9447 l_msg_data              VARCHAR2(2000);
9448 l_return_status         VARCHAR2(1);
9449 l_msg_count             NUMBER;
9450 l_prd_workorder_tbl     AHL_PRD_WORKORDER_PVT.PRD_WORKORDER_TBL;
9451 idx                     NUMBER := 0;
9452 l_prd_workorder_rel_tbl AHL_PRD_WORKORDER_PVT.prd_workorder_rel_tbl;
9453 l_manual_summ_task_flag VARCHAR2(1) ;
9454 l_task_cnt              NUMBER := 0;
9455 l_firm_planned_flag     VARCHAR2(1) := FND_PROFILE.value('AHL_PRD_FIRM_PLANNED_FLAG');
9456 l_planned_order_flag    VARCHAR2(1); --added by skpathak for VWPE
9457 
9458 l_max_schedule_start_date DATE; --BUG 13373947 :: PRAKKUM :: 10/02/2012
9459 l_repair_batch_name     VARCHAR2(240);
9460 l_dummy                 VARCHAR2(1);
9461 
9462 BEGIN
9463     IF (l_log_procedure >= l_log_current_level) THEN
9464        fnd_log.string(l_log_procedure,
9465                       L_DEBUG_KEY ||'.begin',
9466                       'At the start of PL SQL procedure. Visit Id = ' ||
9467                       p_visit_id || ', p_tasks_tbl.COUNT = ' || p_tasks_tbl.COUNT);
9468     END IF;
9469 
9470     -- Standard start of API savepoint
9471     SAVEPOINT Push_tasks_to_prodn_pvt;
9472 
9473     -- Initialize message list if p_init_msg_list is set to TRUE
9474     IF FND_API.To_Boolean(p_init_msg_list) THEN
9475        FND_MSG_PUB.Initialize;
9476     END IF;
9477 
9478     -- Initialize API return status to success
9479     x_return_status := FND_API.G_RET_STS_SUCCESS;
9480 
9481     IF NOT FND_API.COMPATIBLE_API_CALL(l_api_version,
9482                                        p_api_version,
9483                                        l_api_name,G_PKG_NAME)
9484     THEN
9485       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
9486     END IF;
9487 
9488     IF (l_log_statement >= l_log_current_level) THEN
9489        fnd_log.string(l_log_statement,
9490                       L_DEBUG_KEY,
9491                       'Before calling INTEGRATE_TO_PROJECTS for Visit Id ' || p_visit_id);
9492     END IF;
9493 
9494     --create the project id for the visit.
9495     AHL_VWP_PROJ_PROD_PVT.Integrate_to_Projects
9496       (p_api_version       => l_api_version,
9497        p_init_msg_list     => p_init_msg_list,
9498        p_commit            => 'F',
9499        p_validation_level  => p_validation_level,
9500        p_module_type       => p_module_type,
9501        p_visit_id          => p_visit_id,
9502        x_return_status     => l_return_status,
9503        x_msg_count         => l_msg_count,
9504        x_msg_data          => x_msg_data);
9505 
9506     IF (l_log_statement >= l_log_current_level) THEN
9507        fnd_log.string(l_log_statement,
9508                       L_DEBUG_KEY,
9509                       'After calling Integrate_to_Projects. l_return_status = ' || l_return_status);
9510     END IF;
9511 
9512     IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
9513       x_msg_count := FND_MSG_PUB.count_msg;
9514       IF (l_log_statement >= l_log_current_level) THEN
9515          fnd_log.string(l_log_statement,
9516                         L_DEBUG_KEY,
9517                         'Errors from Integrate_to_Projects. Message count: ' || x_msg_count);
9518       END IF;
9519       IF l_return_status = FND_API.G_RET_STS_ERROR THEN
9520          RAISE FND_API.G_EXC_ERROR;
9521       ELSE
9522          RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
9523       END IF;
9524     END IF;
9525 
9526     -- SKPATHAK :: ER:12730539 :: 01-AUG-2011 :: START
9527     -- Need to update materials for this visit on P2P
9528     IF (l_log_statement >= l_log_current_level) THEN
9529        fnd_log.string(l_log_statement,
9530                       L_DEBUG_KEY,
9531                       'Before Calling AHL_LTP_REQST_MATRL_PUB.Process_Planned_Materials. p_visit_id = ' || p_visit_id );
9532     END IF;
9533 
9534     IF (p_visit_id IS NOT NULL) THEN
9535       AHL_LTP_REQST_MATRL_PUB.Process_Planned_Materials (
9536          p_api_version             => 1.0,
9537          p_init_msg_list           => FND_API.G_FALSE,
9538          p_commit                  => FND_API.G_FALSE,
9539          p_validation_level        => FND_API.G_VALID_LEVEL_FULL,
9540          p_visit_id                => p_visit_id,
9541          p_operation_flag          => 'U',
9542          x_planned_order_flag      => l_planned_order_flag,
9543          x_return_status           => l_return_status,
9544          x_msg_count               => l_msg_count,
9545          x_msg_data                => x_msg_data);
9546 
9547       IF (l_log_statement >= l_log_current_level) THEN
9548          fnd_log.string(l_log_statement,
9549                         L_DEBUG_KEY,
9550                         'After Calling AHL_LTP_REQST_MATRL_PUB.Process_Planned_Materials. Return Status = ' || l_return_status );
9551       END IF;
9552 
9553       IF NVL(l_return_status,'x') <> FND_API.G_RET_STS_SUCCESS THEN
9554         x_msg_count := l_msg_count;
9555         x_return_status := l_return_status;
9556         IF l_return_status = Fnd_Api.g_ret_sts_error THEN
9557           RAISE Fnd_Api.g_exc_error;
9558         ELSIF l_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
9559           RAISE Fnd_Api.g_exc_unexpected_error;
9560         END IF;
9561       END IF;
9562     END IF;
9563     -- SKPATHAK :: ER:12730539 :: 01-AUG-2011 :: END
9564 
9565     --chk if master wo for the visit already exists
9566     OPEN c_fet_master_wo(p_visit_id);
9567     FETCH c_fet_master_wo INTO l_chk_mst_wo;
9568     CLOSE c_fet_master_wo;
9569 
9570     OPEN c_visit_master_wo(p_visit_id);
9571     FETCH c_visit_master_wo INTO c_mst_wo_visit_rec;
9572     CLOSE c_visit_master_wo;
9573 
9574     --fetch the visit details
9575     OPEN c_visit_dtl(p_visit_id);
9576     FETCH c_visit_dtl INTO c_visit_dtl_rec;
9577     CLOSE c_visit_dtl;
9578 
9579     --VWPE :: tchimira :: 15-FEB -2011 :: start
9580     IF (l_log_statement >= l_log_current_level) THEN
9581        fnd_log.string(l_log_statement,
9582                              L_DEBUG_KEY,
9583                              'Past Dated Flag value is : ' || c_visit_dtl_rec.PAST_DATED_VISIT_FLAG);
9584     END IF;
9585 
9586     --Now if the value of the PAST_DATED_VISIT_FLAG is Y which means it is past dated visit.
9587     -- Create WOs as firm so that they will not be considered by PS schedule engine.
9588     IF(c_visit_dtl_rec.PAST_DATED_VISIT_FLAG = 'Y') THEN
9589         l_firm_planned_flag := 1; --Firm
9590     END IF;
9591     --VWPE :: tchimira :: 15-FEB -2011 :: end
9592 
9593 
9594     --fetch the count of tasks in planning status.
9595     OPEN c_all_task_dtl (p_visit_id);
9596     FETCH c_all_task_dtl INTO l_task_cnt;
9597     CLOSE c_all_task_dtl;
9598 
9599     idx := idx+1;
9600     l_prd_workorder_tbl(idx).SCHEDULED_START_DATE := c_visit_dtl_rec.start_date_time;
9601     l_prd_workorder_tbl(idx).SCHEDULED_END_DATE   := c_visit_dtl_rec.close_date_time;
9602     l_prd_workorder_tbl(idx).BATCH_ID             := c_visit_dtl_rec.VISIT_NUMBER;
9603     l_prd_workorder_tbl(idx).HEADER_ID            := 0; -- Visit
9604     IF (nvl(l_chk_mst_wo,0) = 1) THEN --Visit master wo already exists
9605        l_prd_workorder_tbl(idx).DML_OPERATION         := 'U';
9606        l_prd_workorder_tbl(idx).WORKORDER_ID          := c_mst_wo_visit_rec.workorder_id;
9607        l_prd_workorder_tbl(idx).OBJECT_VERSION_NUMBER := c_mst_wo_visit_rec.object_version_number;
9608        IF (c_mst_wo_visit_rec.status_code <> 3) THEN
9609           IF (p_release_flag = 'Y') THEN
9610              -- change status from UNRELEASED/DRAFT to RELEASED
9611              l_prd_workorder_tbl(idx).STATUS_CODE       := '3'; -- Released
9612              -- Visit Master Work Order should ALWAYS be FIRM (not dependent on profile)
9613              l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG := 1;   -- Firm
9614           ELSIF  c_mst_wo_visit_rec.status_code = '17' THEN
9615              -- Master workorder was in Draft status, make it UNRELEASED now
9616              l_prd_workorder_tbl(idx).STATUS_CODE       := '1'; -- Unreleased
9617              -- Visit Master Work Order should ALWAYS be FIRM (not dependent on profile)
9618              l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG := 1;   -- Firm
9619           END IF;
9620        END IF; --master work order status is not 3
9621     ELSE -- visit master workorder does not exist, create a master wo
9622        l_prd_workorder_tbl(idx).DML_OPERATION := 'C';
9623        -- Visit Master Work Order should ALWAYS be FIRM (not dependent on profile)
9624        l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG     := 1; -- Firm
9625        l_prd_workorder_tbl(idx).MASTER_WORKORDER_FLAG := 'Y';
9626        l_prd_workorder_tbl(idx).VISIT_ID              := p_visit_id;
9627        l_prd_workorder_tbl(idx).ORGANIZATION_ID       := c_visit_dtl_rec.organization_id;
9628        l_prd_workorder_tbl(idx).PROJECT_ID            := c_visit_dtl_rec.project_id;
9629        l_prd_workorder_tbl(idx).DEPARTMENT_ID         := c_visit_dtl_rec.department_id ;
9630        IF p_release_flag = 'Y' THEN
9631          l_prd_workorder_tbl(idx).STATUS_CODE  := '3';  -- Released
9632        ELSE
9633          l_prd_workorder_tbl(idx).STATUS_CODE  := '1';  -- Unreleased
9634        END IF;
9635        IF (c_visit_dtl_rec.inventory_item_id IS NULL AND c_visit_dtl_rec.item_instance_id IS NULL) THEN
9636           /*When the unit is not specified at the visit level, fetch the first task's inventory_item_id
9637           and the instance_id from the list of user selected tasks.This inventory_item_id/instance_id
9638           will be used in the creation of master wo for the visit.*/
9639           OPEN default_task_inst_dtls(p_tasks_tbl(p_tasks_tbl.FIRST).visit_task_id);
9640           FETCH default_task_inst_dtls INTO def_task_inst_rec;
9641           CLOSE default_task_inst_dtls;
9642           l_prd_workorder_tbl(idx).INVENTORY_ITEM_ID := def_task_inst_rec.inventory_item_id;
9643           l_prd_workorder_tbl(idx).ITEM_INSTANCE_ID  := def_task_inst_rec.instance_id;
9644        ELSE
9645           l_prd_workorder_tbl(idx).INVENTORY_ITEM_ID := c_visit_dtl_rec.inventory_item_id;
9646           l_prd_workorder_tbl(idx).ITEM_INSTANCE_ID  := c_visit_dtl_rec.item_instance_id;
9647        END IF;
9648        l_prd_workorder_tbl(idx).JOB_DESCRIPTION      := c_visit_dtl_rec.visit_name ;
9649     END IF; --visit master workorder exists or not
9650 
9651     FOR i in p_tasks_tbl.FIRST..p_tasks_tbl.LAST LOOP --for all tasks
9652 
9653         OPEN c_fet_sum_task_flg(p_visit_id, p_tasks_tbl(i).visit_task_id);
9654         FETCH c_fet_sum_task_flg INTO l_manual_summ_task_flag;
9655         CLOSE c_fet_sum_task_flg;
9656 
9657         IF (l_manual_summ_task_flag = 'Y') THEN
9658            -- No work order will be created for manually created summary task
9659            -- Just update the task status to Released.
9660            UPDATE ahl_visit_tasks_b
9661            SET  status_code = 'RELEASED',
9662                 --TCHIMIRA::BUG 9222622 ::15-DEC-2009::UPDATE OVN AND WHO COLUMNS
9663                 OBJECT_VERSION_NUMBER = OBJECT_VERSION_NUMBER + 1,
9664                 LAST_UPDATE_DATE      = SYSDATE,
9665                 LAST_UPDATED_BY       = Fnd_Global.USER_ID,
9666                 LAST_UPDATE_LOGIN     = Fnd_Global.LOGIN_ID
9667            WHERE visit_task_id = p_tasks_tbl(i).visit_task_id;
9668 
9669         ELSE
9670            --check if the wo exists for the task
9671            OPEN c_fet_task_wo(p_visit_id, p_tasks_tbl(i).visit_task_id);
9672            FETCH c_fet_task_wo INTO l_chk_task_wo;
9673            CLOSE c_fet_task_wo;
9674 
9675            --fetch the task details
9676            OPEN c_visit_task_dtl(p_tasks_tbl(i).visit_task_id);
9677            FETCH c_visit_task_dtl INTO c_visit_tsk_dtl_rec;
9678            CLOSE c_visit_task_dtl;
9679 
9680            --fetch the workorder details for the task
9681            OPEN c_task_wo(p_visit_id , p_tasks_tbl(i).visit_task_id);
9682            FETCH c_task_wo INTO c_task_wo_rec;
9683            CLOSE c_task_wo;
9684 
9685            IF (nvl(l_chk_task_wo,0) = 1) THEN --task wo for the visit already exists
9686               IF (c_task_wo_rec.status_code = 17) THEN  -- Status is Draft
9687                  idx := idx+1;
9688                  l_prd_workorder_tbl(idx).dml_operation := 'U';
9689                  l_prd_workorder_tbl(idx).workorder_id := c_task_wo_rec.workorder_id;
9690                  l_prd_workorder_tbl(idx).object_version_number := c_task_wo_rec.object_version_number;
9691                  l_prd_workorder_tbl(idx).item_instance_id  := c_visit_tsk_dtl_rec.instance_id ;
9692                  l_prd_workorder_tbl(idx).BATCH_ID := c_visit_dtl_rec.visit_number;
9693                  l_prd_workorder_tbl(idx).HEADER_ID := c_visit_tsk_dtl_rec.visit_task_number;
9694                  IF (p_release_flag = 'Y') THEN
9695                     l_prd_workorder_tbl(idx).status_code := '3'; -- Released
9696                  ELSE
9697                     l_prd_workorder_tbl(idx).status_code := '1'; -- UnReleased
9698                  END IF;
9699                  IF (l_firm_planned_flag IS NOT NULL AND
9700                  -- SKPATHAK :: ER: 9147951 :: 11-JAN-2010
9701                  -- For task with past task dates, WOs are always firm irrespective of the profile value
9702                  p_tasks_tbl(i).past_task_start_date IS NULL AND
9703                  l_firm_planned_flag = '2') THEN
9704                     l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG := 2; -- Planned
9705                  ELSE
9706                     l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG := 1; -- Firm
9707                  END IF;
9708                  -- If summary task, use the min,max of sub tasks
9709                  IF (c_visit_tsk_dtl_rec.task_type_code = 'SUMMARY') THEN
9710                     OPEN get_summary_task_times_csr(c_visit_tsk_dtl_rec.visit_task_id);
9711                     FETCH get_summary_task_times_csr
9712                           INTO l_prd_workorder_tbl(idx).SCHEDULED_START_DATE,
9713                                l_prd_workorder_tbl(idx).SCHEDULED_END_DATE;
9714                     CLOSE get_summary_task_times_csr;
9715                  ELSE
9716                     l_prd_workorder_tbl(idx).scheduled_start_date  := c_visit_tsk_dtl_rec.start_date_time;
9717                     l_prd_workorder_tbl(idx).scheduled_end_date    := c_visit_tsk_dtl_rec.end_date_time;
9718                  END IF;
9719                /*B5758813 - rnahata - For summary tasks (both manual and MR summary tasks)
9720                and unassociated tasks the task name is passed as the workorder description.
9721                And for the Route tasks, the route number concatenated with the route title is
9722                passed as workorder description.*/
9723                  IF (c_visit_tsk_dtl_rec.task_type_code IN ('SUMMARY','UNASSOCIATED')) THEN
9724                     l_prd_workorder_tbl(idx).JOB_DESCRIPTION   :=  c_visit_tsk_dtl_rec.visit_task_name;
9725                  ELSE
9726                     OPEN get_wo_dtls_for_mrtasks_cur(c_visit_tsk_dtl_rec.visit_task_id);
9727                     FETCH get_wo_dtls_for_mrtasks_cur INTO get_wo_dtls_for_mrtasks_rec;
9728                     --salogan added for bug 9754641 begin
9729                     IF get_wo_dtls_for_mrtasks_cur%NOTFOUND THEN
9730                         get_wo_dtls_for_mrtasks_rec.workorder_description := NULL;
9731                     END IF;
9732                     --salogan added for bug 9754641 begin
9733                     CLOSE get_wo_dtls_for_mrtasks_cur;
9734                     l_prd_workorder_tbl(idx).JOB_DESCRIPTION := get_wo_dtls_for_mrtasks_rec.workorder_description;
9735                  END IF;
9736               END IF;  -- WO Status is Draft
9737            ELSE --work order does not exist for this task
9738               -- Create a new work order
9739               idx := idx+1;
9740               l_prd_workorder_tbl(idx).DML_OPERATION := 'C';
9741               IF p_release_flag = 'Y' THEN
9742                  l_prd_workorder_tbl(idx).STATUS_CODE := '3';  -- Released
9743               ELSE
9744                  l_prd_workorder_tbl(idx).STATUS_CODE := '1';  -- Unreleased
9745               END IF;
9746               IF (l_firm_planned_flag IS NOT NULL AND
9747               -- SKPATHAK :: ER: 9147951 :: 11-JAN-2010
9748               -- For task with past task dates, WOs are always firm irrespective of the profile value
9749               p_tasks_tbl(i).past_task_start_date IS NULL AND
9750               l_firm_planned_flag = '2') THEN
9751                  l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG := 2; -- Planned
9752               ELSE
9753                  l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG := 1; -- Firm
9754               END IF;
9755               IF (c_visit_tsk_dtl_rec.task_type_code = 'SUMMARY') THEN
9756                  l_prd_workorder_tbl(idx).MASTER_WORKORDER_FLAG := 'Y';
9757               ELSE
9758                  l_prd_workorder_tbl(idx).MASTER_WORKORDER_FLAG := 'N';
9759               END IF;
9760 
9761               l_prd_workorder_tbl(idx).BATCH_ID          := c_visit_dtl_rec.visit_number;
9762               l_prd_workorder_tbl(idx).HEADER_ID         := c_visit_tsk_dtl_rec.visit_task_number;
9763               l_prd_workorder_tbl(idx).VISIT_ID          := p_visit_id;
9764               l_prd_workorder_tbl(idx).ORGANIZATION_ID   := c_visit_dtl_rec.organization_id;
9765               l_prd_workorder_tbl(idx).PROJECT_ID        := c_visit_dtl_rec.project_id;
9766               l_prd_workorder_tbl(idx).INVENTORY_ITEM_ID := c_visit_tsk_dtl_rec.inventory_item_id ;
9767               l_prd_workorder_tbl(idx).ITEM_INSTANCE_ID  := c_visit_tsk_dtl_rec.instance_id ;
9768               l_prd_workorder_tbl(idx).VISIT_TASK_ID     := c_visit_tsk_dtl_rec.visit_task_id ;
9769               l_prd_workorder_tbl(idx).VISIT_TASK_NUMBER := c_visit_tsk_dtl_rec.visit_task_number ;
9770               --l_prd_workorder_tbl(idx).PROJECT_TASK_ID   := c_visit_tsk_dtl_rec.project_task_id ;
9771               -- SKPATHAK :: PIE:FP :: 21-DEC-2010
9772               -- Pass the Project Task Id only for work orders that don't correspond to Summary Tasks
9773               IF ( c_visit_tsk_dtl_rec.task_type_code <> 'SUMMARY' ) THEN
9774                 l_prd_workorder_tbl(idx).PROJECT_TASK_ID   := c_visit_tsk_dtl_rec.project_task_id ;
9775                 l_prd_workorder_tbl(idx).PROJECT_ID        := c_visit_dtl_rec.project_id;
9776               END IF;
9777 
9778           /*B5758813 - rnahata - For summary tasks (both manual and MR summary tasks)
9779               and unassociated tasks, the task name is passed as the workorder description.
9780               And for the MR tasks, the route number concatenated with the route title is
9781               passed as workorder description.*/
9782               IF (c_visit_tsk_dtl_rec.task_type_code IN ('SUMMARY','UNASSOCIATED')) THEN
9783                  l_prd_workorder_tbl(idx).JOB_DESCRIPTION :=  c_visit_tsk_dtl_rec.visit_task_name;
9784               ELSE
9785                  OPEN get_wo_dtls_for_mrtasks_cur(c_visit_tsk_dtl_rec.visit_task_id);
9786                  FETCH get_wo_dtls_for_mrtasks_cur INTO get_wo_dtls_for_mrtasks_rec;
9787                  --salogan added for bug 9754641 begin
9788                  IF get_wo_dtls_for_mrtasks_cur%NOTFOUND THEN
9789                     get_wo_dtls_for_mrtasks_rec.workorder_description := NULL;
9790                  END IF;
9791                  --salogan added for bug 9754641 begin
9792                  CLOSE get_wo_dtls_for_mrtasks_cur;
9793                  l_prd_workorder_tbl(idx).JOB_DESCRIPTION := get_wo_dtls_for_mrtasks_rec.workorder_description;
9794               END IF;
9795 
9796               IF c_visit_tsk_dtl_rec.mr_route_id IS NOT NULL AND c_visit_tsk_dtl_rec.mr_route_id <> FND_API.g_miss_num THEN
9797                  OPEN c_route (c_visit_tsk_dtl_rec.mr_route_id);
9798                  FETCH c_route INTO l_prd_workorder_tbl(idx).ROUTE_ID;
9799                  CLOSE c_route;
9800               ELSE
9801                  l_prd_workorder_tbl(idx).ROUTE_ID := Null;
9802               END IF;
9803 
9804               IF c_visit_tsk_dtl_rec.department_id IS NOT NULL AND c_visit_tsk_dtl_rec.department_id <> FND_API.g_miss_num THEN
9805                  l_prd_workorder_tbl(idx).DEPARTMENT_ID := c_visit_tsk_dtl_rec.department_id ;
9806               ELSE
9807                  l_prd_workorder_tbl(idx).DEPARTMENT_ID := c_visit_dtl_rec.department_id ;
9808               END IF;
9809 
9810               -- If summary task, use the min,max of sub tasks
9811               IF (c_visit_tsk_dtl_rec.task_type_code = 'SUMMARY') THEN
9812                  OPEN get_summary_task_times_csr(c_visit_tsk_dtl_rec.visit_task_id);
9813                  FETCH get_summary_task_times_csr INTO l_prd_workorder_tbl(idx).SCHEDULED_START_DATE,
9814                                                        l_prd_workorder_tbl(idx).SCHEDULED_END_DATE;
9815                  CLOSE get_summary_task_times_csr;
9816               ELSE
9817                  l_prd_workorder_tbl(idx).SCHEDULED_START_DATE  := c_visit_tsk_dtl_rec.START_DATE_TIME;
9818                  l_prd_workorder_tbl(idx).SCHEDULED_END_DATE    := c_visit_tsk_dtl_rec.END_DATE_TIME;
9819               END IF;
9820            END IF; --work order exists or not for this task
9821 
9822            IF (l_log_statement >= l_log_current_level) THEN
9823               fnd_log.string(l_log_statement,
9824                              L_DEBUG_KEY,
9825                              'Before calling Get_Task_Relationships for task id: ' ||p_tasks_tbl(i).visit_task_id);
9826            END IF;
9827 
9828            AHL_VWP_PROJ_PROD_PVT.Get_Task_Relationships
9829                 ( p_visit_id            => p_visit_id,
9830                   p_visit_number        => c_visit_dtl_rec.visit_number,
9831                   p_visit_task_id       => c_visit_tsk_dtl_rec.visit_task_id,
9832                   p_x_relationship_tbl  => l_prd_workorder_rel_tbl
9833                 );
9834 
9835            IF (l_log_statement >= l_log_current_level) THEN
9836               fnd_log.string(l_log_statement,
9837                              L_DEBUG_KEY,
9838                              'After calling Get_Task_Relationships');
9839            END IF;
9840         END IF;  -- Task is Manually Created Summary Task or not
9841      END LOOP;  -- For all tasks in p_tasks_tbl
9842 
9843      -- Commented the below code by tchimira on 14-MAR-2012 as per the requirement stated in the bug 13695008
9844      --first get the task relationships for the tasks, then collect the dependencies.
9845      /*IF (l_log_statement >= l_log_current_level) THEN
9846          fnd_log.string(l_log_statement,
9847             L_DEBUG_KEY,
9848             'Before calling Get_Task_Dependencies for tasks');
9849      END IF;
9850 
9851      FOR i IN p_tasks_tbl.FIRST..p_tasks_tbl.LAST LOOP
9852        AHL_VWP_PROJ_PROD_PVT.Get_Task_Dependencies
9853             (
9854               p_visit_number       => c_visit_dtl_rec.visit_number,
9855               p_visit_task_id      => p_tasks_tbl(i).visit_task_id,
9856               p_visit_task_number  => p_tasks_tbl(i).visit_task_number,
9857               p_x_relationship_tbl => l_prd_workorder_rel_tbl
9858             );
9859 
9860        IF (l_log_statement >= l_log_current_level) THEN
9861           fnd_log.string(l_log_statement,
9862                          L_DEBUG_KEY,
9863                          'After calling Get_Task_Dependencies for task id: ' ||p_tasks_tbl(i).visit_task_id);
9864        END IF;
9865      END LOOP;*/  -- For all tasks in p_tasks_tbl
9866 
9867     -- SR master workorder dates need to be adjusted when new MRs are added.
9868     -- Scheduled start date and Scheduled end date of SR MWO will be derived as follows
9869     -- 1. Scheduled start date will be least of scheduled start date of all existing workorders
9870     -- and new workorders that will be added.
9871     -- 2. Scheduled end date will be greatest of scheduled start date of all existing workorders
9872     -- and new workorders that will be added.
9873 
9874     -- step 1. get sr summary tasks duration
9875     -- Note: Entire task table need be looped through. As in future
9876     -- requirement, we may need to accomodate cases were more than one
9877     -- Group task will be passed to this API.
9878     OPEN c_get_sr_task_dtls(p_tasks_tbl(p_tasks_tbl.FIRST).visit_task_id);
9879     FETCH c_get_sr_task_dtls INTO l_sr_task_dtls_rec;
9880     CLOSE c_get_sr_task_dtls;
9881 
9882     OPEN get_summary_task_times_csr(l_sr_task_dtls_rec.visit_task_id);
9883     FETCH get_summary_task_times_csr INTO l_sch_start_date, l_sch_end_date;
9884     CLOSE get_summary_task_times_csr;
9885 
9886     -- step 2. get sr mwo details including scheduled dates.
9887     OPEN c_get_sr_mwo_dtls(l_sr_task_dtls_rec.visit_task_id);
9888     FETCH c_get_sr_mwo_dtls INTO l_sr_mwo_rec;
9889     CLOSE c_get_sr_mwo_dtls;
9890 
9891     -- step 3. update sr mwo details with new scheduled dates.
9892     IF (l_sr_mwo_rec.wip_entity_id IS NOT NULL) THEN
9893 
9894        l_wo_tbl_count := l_prd_workorder_tbl.COUNT + 1;
9895 
9896        --l_prd_workorder_tbl(l_wo_tbl_count).wip_entity_id := l_sr_mwo_rec.wip_entity_id;
9897        l_prd_workorder_tbl(l_wo_tbl_count).object_version_number := l_sr_mwo_rec.object_version_number;
9898        l_prd_workorder_tbl(l_wo_tbl_count).workorder_id := l_sr_mwo_rec.workorder_id;
9899        l_prd_workorder_tbl(l_wo_tbl_count).dml_operation := 'U';
9900 
9901        l_prd_workorder_tbl(l_wo_tbl_count).scheduled_start_date := LEAST(l_sr_mwo_rec.scheduled_start_date,l_sch_start_date);
9902        l_prd_workorder_tbl(l_wo_tbl_count).scheduled_start_hr := TO_NUMBER(TO_CHAR(l_prd_workorder_tbl(l_wo_tbl_count).scheduled_start_date, 'HH24'));
9903        l_prd_workorder_tbl(l_wo_tbl_count).scheduled_start_mi := TO_NUMBER(TO_CHAR(l_prd_workorder_tbl(l_wo_tbl_count).scheduled_start_date, 'MI'));
9904 
9905        l_prd_workorder_tbl(l_wo_tbl_count).scheduled_end_date := GREATEST(l_sr_mwo_rec.scheduled_completion_date,l_sch_end_date);
9906        l_prd_workorder_tbl(l_wo_tbl_count).scheduled_end_hr := TO_NUMBER(TO_CHAR(l_prd_workorder_tbl(l_wo_tbl_count).scheduled_end_date, 'HH24'));
9907        l_prd_workorder_tbl(l_wo_tbl_count).scheduled_end_mi := TO_NUMBER(TO_CHAR(l_prd_workorder_tbl(l_wo_tbl_count).scheduled_end_date, 'MI'));
9908 
9909        l_prd_workorder_tbl(l_wo_tbl_count).batch_id := c_visit_dtl_rec.visit_number;
9910        l_prd_workorder_tbl(l_wo_tbl_count).header_id := l_sr_task_dtls_rec.visit_task_number;
9911 
9912        IF (l_log_statement >= l_log_current_level) THEN
9913           fnd_log.string(l_log_statement,
9914                          L_DEBUG_KEY,
9915                          'SR MWO Dates before updating...');
9916           fnd_log.string(l_log_statement,
9917                          L_DEBUG_KEY,
9918                          '----------------------------------------------');
9919           fnd_log.string(l_log_statement,
9920                          L_DEBUG_KEY,
9921                          'scheduled_start_time->'||TO_CHAR(l_sr_mwo_rec.scheduled_start_date,'DD-MON-YYYY HH24:MI:SS'));
9922           fnd_log.string(l_log_statement,
9923                          L_DEBUG_KEY,
9924                          'scheduled_end_time->'||TO_CHAR(l_sr_mwo_rec.scheduled_completion_date,'DD-MON-YYYY HH24:MI:SS'));
9925           fnd_log.string(l_log_statement,
9926                          L_DEBUG_KEY,
9927                          'SR MWO Dates after updating...');
9928           fnd_log.string(l_log_statement,
9929                          L_DEBUG_KEY,
9930                          '----------------------------------------------');
9931           fnd_log.string(l_log_statement,
9932                          L_DEBUG_KEY,
9933                          'scheduled_start_time->'||TO_CHAR(l_prd_workorder_tbl(l_wo_tbl_count).scheduled_start_date,'DD-MON-YYYY HH24:MI:SS'));
9934           fnd_log.string(l_log_statement,
9935                          L_DEBUG_KEY,
9936                          'scheduled_end_time->'||TO_CHAR(l_prd_workorder_tbl(l_wo_tbl_count).scheduled_end_date,'DD-MON-YYYY HH24:MI:SS'));
9937           fnd_log.string(l_log_statement,
9938                          L_DEBUG_KEY,
9939                          'SR Task scheduled_start_time->'||TO_CHAR(l_sch_start_date,'DD-MON-YYYY HH24:MI:SS'));
9940           fnd_log.string(l_log_statement,
9941                          L_DEBUG_KEY,
9942                          'SR Task scheduled_end_time->'||TO_CHAR(l_sch_end_date,'DD-MON-YYYY HH24:MI:SS'));
9943        END IF;  -- Statement Log Level
9944     END IF;  -- wip_entity_id IS NOT NULL
9945 
9946     --BUG 13373947 :: PRAKKUM :: 10/02/2012  :: START
9947     -- IF visit planned end date is in PAST and visit itself is not past dated then validate workorder shcedule start dates
9948     IF ( c_visit_dtl_rec.close_date_time IS NOT NULL AND c_visit_dtl_rec.close_date_time<SYSDATE ) AND NVL(c_visit_dtl_rec.PAST_DATED_VISIT_FLAG,'N')='N' THEN
9949 
9950             l_max_schedule_start_date := c_visit_dtl_rec.close_date_time;
9951             For loopvar IN l_prd_workorder_tbl.FIRST..l_prd_workorder_tbl.LAST
9952             LOOP
9953 
9954                IF (l_log_statement >= l_log_current_level) THEN
9955                    fnd_log.string(l_log_statement, L_DEBUG_KEY, 'l_prd_workorder_tbl(idx).SCHEDULED_START_DATE --@>'
9956                                                                  || TO_CHAR(l_prd_workorder_tbl(idx).SCHEDULED_START_DATE,'DD-MON-YYYY HH24:MI:SS'));
9957                     fnd_log.string(l_log_statement, L_DEBUG_KEY, 'get_vst_status_and_date_rec.close_date_time --@>'
9958                                                                  || TO_CHAR(c_visit_dtl_rec.close_date_time,'DD-MON-YYYY HH24:MI:SS'));
9959                END IF;
9960 
9961                IF l_prd_workorder_tbl(idx).SCHEDULED_START_DATE IS NOT NULL AND c_visit_dtl_rec.close_date_time IS NOT NULL THEN
9962                    IF l_prd_workorder_tbl(idx).SCHEDULED_START_DATE >  c_visit_dtl_rec.close_date_time THEN
9963                        -- Find max schedule start date
9964                        IF l_prd_workorder_tbl(idx).SCHEDULED_START_DATE > l_max_schedule_start_date THEN
9965                           l_max_schedule_start_date := l_prd_workorder_tbl(idx).SCHEDULED_START_DATE;
9966                        END IF;
9967                    END IF;
9968                 END IF;
9969             END LOOP;
9970 
9971             IF (l_log_statement >= l_log_current_level) THEN
9972                    fnd_log.string(l_log_statement, L_DEBUG_KEY, 'l_max_schedule_start_date --@>'
9973                                                                  || TO_CHAR(l_max_schedule_start_date,'DD-MON-YYYY HH24:MI:SS'));
9974             END IF;
9975 
9976             IF l_max_schedule_start_date > c_visit_dtl_rec.close_date_time THEN -- Validation Error
9977                Fnd_Message.SET_NAME('AHL','AHL_VWP_NON_PS_PLAN_ED_DATE');
9978                Fnd_Msg_Pub.ADD;
9979                RAISE Fnd_Api.G_EXC_ERROR;
9980             END IF;
9981 
9982     END IF;
9983     --BUG 13373947 :: PRAKKUM :: 10/02/2012  :: END
9984 
9985     IF (l_log_statement >= l_log_current_level) THEN
9986        fnd_log.string(l_log_statement,
9987                       L_DEBUG_KEY,
9988                       'Before calling PROCESS_JOBS for visit_id: ' || p_visit_id);
9989     END IF;
9990 
9991     -- Call Production API to create work orders
9992     AHL_PRD_WORKORDER_PVT.Process_Jobs
9993           (p_api_version           => l_api_version ,
9994            p_init_msg_list         => p_init_msg_list,
9995            p_commit                => 'F',
9996            p_validation_level      => p_validation_level,
9997            p_default               => FND_API.G_TRUE,
9998            p_module_type           => p_module_type,
9999            x_return_status         => l_return_status,
10000            x_msg_count             => l_msg_count,
10001            x_msg_data              => l_msg_data,
10002            p_x_prd_workorder_tbl   => l_prd_workorder_tbl,
10003            p_prd_workorder_rel_tbl => l_prd_workorder_rel_tbl
10004          );
10005 
10006     IF (l_log_statement >= l_log_current_level) THEN
10007        fnd_log.string(l_log_statement,
10008                       L_DEBUG_KEY,
10009                       'After calling PROCESS_JOBS for visit_id ' ||
10010                       p_visit_id||', l_return_status: '|| l_return_status);
10011     END IF;
10012 
10013     IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
10014        x_msg_count := FND_MSG_PUB.count_msg;
10015        IF (l_log_statement >= l_log_current_level) THEN
10016           fnd_log.string(l_log_statement,
10017                          L_DEBUG_KEY,
10018                          'Errors from PROCESS_JOBS. Message count: ' || x_msg_count);
10019        END IF;
10020        IF l_return_status = FND_API.G_RET_STS_ERROR THEN
10021           RAISE FND_API.G_EXC_ERROR;
10022        ELSE
10023           RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
10024        END IF;
10025     END IF;  -- Return Status is not Success
10026 
10027     IF (l_log_statement >= l_log_current_level) THEN
10028        For i IN l_prd_workorder_tbl.FIRST..l_prd_workorder_tbl.LAST LOOP
10029          fnd_log.string(l_log_statement,
10030                         L_DEBUG_KEY,
10031                         'WorkOrder Id('||i||'): '||l_prd_workorder_tbl(i).workorder_id);
10032        END LOOP;
10033     END IF;
10034 
10035     /*B5758813 - rnahata - starts*/
10036     /*The project start/end dates have to be updated with the workorder scheduled
10037     start/end dates.*/
10038     IF (l_log_statement >= l_log_current_level) THEN
10039        fnd_log.string(l_log_statement,
10040                       L_DEBUG_KEY,
10041                       'Before calling Update_Project_Task_Times.');
10042     END IF;
10043 
10044     Update_Project_Task_Times(
10045           p_prd_workorder_tbl => l_prd_workorder_tbl,
10046           p_commit            =>'F',
10047           x_return_status     => l_return_status,
10048           x_msg_count         => l_msg_count,
10049           x_msg_data          => l_msg_data);
10050 
10051     IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
10052        x_msg_count := FND_MSG_PUB.count_msg;
10053        IF (l_log_statement >= l_log_current_level) THEN
10054           fnd_log.string(l_log_statement,
10055                          L_DEBUG_KEY,
10056                          'Errors from Update_Project_Task_Times. Message count: ' || x_msg_count);
10057        END IF;
10058        IF l_return_status = FND_API.G_RET_STS_ERROR THEN
10059           RAISE FND_API.G_EXC_ERROR;
10060        ELSE
10061           RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
10062        END IF;
10063     ELSE
10064        IF (l_log_statement >= l_log_current_level) THEN
10065            fnd_log.string(l_log_statement,
10066                           L_DEBUG_KEY,
10067                           'Returned Success from Update_Project_Task_Times');
10068        END IF;
10069     END IF;  -- Return Status is Success or not
10070     /*B5758813 - rnahata - ends*/
10071 
10072     -- SKPATHAK :: 02-MAY-2011 :: VWPE: ER:12424063  :: STARTS
10073     -- If the task type is duplicate, cancel the WO, else change
10074     FOR i IN p_tasks_tbl.FIRST..p_tasks_tbl.LAST LOOP
10075       OPEN get_task_dets (p_tasks_tbl(i).visit_task_id);
10076       FETCH get_task_dets INTO task_dets_rec;
10077       CLOSE get_task_dets;
10078       IF task_dets_rec.task_type_code = 'DUPLICATE' THEN
10079         UPDATE ahl_visit_tasks_b
10080         SET   status_code = 'CANCELLED',
10081               OBJECT_VERSION_NUMBER = OBJECT_VERSION_NUMBER + 1,
10082               LAST_UPDATE_DATE      = SYSDATE,
10083               LAST_UPDATED_BY       = Fnd_Global.USER_ID,
10084               LAST_UPDATE_LOGIN     = Fnd_Global.LOGIN_ID
10085         WHERE visit_task_id = p_tasks_tbl(i).visit_task_id;
10086         AHL_PRD_WORKORDER_PVT.cancel_visit_jobs
10087                        (p_api_version      => 1.0,
10088                         p_init_msg_list    => FND_API.G_TRUE,
10089                         p_commit           => FND_API.G_FALSE,
10090                         p_validation_level => FND_API.G_VALID_LEVEL_FULL,
10091                         p_default          => FND_API.G_FALSE,
10092                         p_module_type      => NULL,
10093                         x_return_status    => l_return_status,
10094                         x_msg_count        => l_msg_count,
10095                         x_msg_data         => l_msg_data,
10096                         p_visit_id         => NULL,
10097                         p_unit_effectivity_id => NULL,
10098                         p_workorder_id        => task_dets_rec.workorder_id);
10099       ELSE
10100         UPDATE ahl_visit_tasks_b
10101         SET   status_code = 'RELEASED',
10102               OBJECT_VERSION_NUMBER = OBJECT_VERSION_NUMBER + 1,
10103               LAST_UPDATE_DATE      = SYSDATE,
10104               LAST_UPDATED_BY       = Fnd_Global.USER_ID,
10105               LAST_UPDATE_LOGIN     = Fnd_Global.LOGIN_ID
10106         WHERE visit_task_id = p_tasks_tbl(i).visit_task_id;
10107       END IF;
10108     END LOOP;
10109 
10110     -- If any of the tasks in a stage is in shop floor, modify the stage status to partially implemented
10111     IF (l_log_statement >= l_log_current_level) THEN
10112          fnd_log.string(l_log_statement,
10113                         L_DEBUG_KEY,'c_visit_dtl_rec.IS_OLD_VISIT = ' || c_visit_dtl_rec.IS_OLD_VISIT );
10114     END IF;
10115     IF c_visit_dtl_rec.IS_OLD_VISIT<>'Y' THEN --VWPE 12730539:: PRAKKUM :: 15-JUL-2011
10116             FOR l_stage_rec IN get_stage_id (p_visit_id) LOOP
10117                UPDATE ahl_vwp_stages_b
10118                SET stage_status_code = 'PARTIALLY RELEASED',
10119                    OBJECT_VERSION_NUMBER = OBJECT_VERSION_NUMBER + 1,
10120                    LAST_UPDATE_DATE      = SYSDATE,
10121                    LAST_UPDATED_BY       = Fnd_Global.USER_ID,
10122                    LAST_UPDATE_LOGIN     = Fnd_Global.LOGIN_ID
10123                WHERE stage_id = l_stage_rec.stage_id;
10124             END LOOP;
10125     END IF;
10126     -- SKPATHAK :: 02-MAY-2011 :: VWPE: ER:12424063  :: ENDS
10127 
10128     -- SOSAHNI :: BUG 16089700 :: FP base bug 15843414 :: 10/01/2013 :: Moved this code for changing repair batch status before updating visit status - Start
10129     /* MANESING::Bug 13713141, 16-Apr-2012, For Component Visits, Repair Batch status should also
10130      * change similar to the way Visit status changes as Repair Batches are like mini-visits.
10131      * So, if all tasks under the Repair Batch are P2P, then its status should be 'RELEASED',
10132      * otherwise 'PARTIALLY RELEASED'.
10133      */
10134     IF (AHL_CMP_UTIL_PKG.Is_Comp_Visit (p_visit_id) = 'Y') THEN
10135 
10136         -- find which Repair Batch, the selected tasks belongs to
10137         OPEN get_rpr_batch_for_task_csr (p_tasks_tbl(p_tasks_tbl.FIRST).visit_task_id);
10138         FETCH get_rpr_batch_for_task_csr INTO l_repair_batch_name;
10139         IF (get_rpr_batch_for_task_csr%FOUND) THEN
10140 
10141             -- change Repair Batch status as mentioned above
10142             OPEN chk_rpr_batch_has_planed_tasks (l_repair_batch_name);
10143             FETCH chk_rpr_batch_has_planed_tasks INTO l_dummy;
10144 
10145             -- if Repair Batch has planned tasks
10146             IF (chk_rpr_batch_has_planed_tasks%FOUND) THEN
10147                 IF (l_log_statement >= l_log_current_level) THEN
10148                     FND_LOG.string(l_log_statement, l_debug_key, 'Repair Batch ' || l_repair_batch_name || ' has atleast one planned task.');
10149                 END IF;
10150 
10151                 UPDATE AHL_VISIT_TASKS_B
10152                 SET    status_code           = 'PARTIALLY RELEASED',
10153                        object_version_number = object_version_number + 1,
10154                        last_update_date      = SYSDATE,
10155                        last_updated_by       = Fnd_Global.USER_ID,
10156                        last_update_login     = Fnd_Global.LOGIN_ID
10157                 WHERE  repair_batch_name = l_repair_batch_name;
10158 
10159             -- if Repair Batch has no planned tasks
10160             ELSE
10161                 IF (l_log_statement >= l_log_current_level) THEN
10162                     FND_LOG.string(l_log_statement, l_debug_key, 'Repair Batch ' || l_repair_batch_name || ' has no planned tasks.');
10163                 END IF;
10164 
10165                 UPDATE AHL_VISIT_TASKS_B
10166                 SET    status_code           = 'RELEASED',
10167                        object_version_number = object_version_number + 1,
10168                        last_update_date      = SYSDATE,
10169                        last_updated_by       = Fnd_Global.USER_ID,
10170                        last_update_login     = Fnd_Global.LOGIN_ID
10171                 WHERE  repair_batch_name = l_repair_batch_name;
10172             END IF;
10173             CLOSE chk_rpr_batch_has_planed_tasks;
10174 
10175         END IF;
10176         CLOSE get_rpr_batch_for_task_csr;
10177 
10178     END IF;  -- IF Component Visit
10179     -- End by SOSAHNI on 10/01/2013 for BUG 16089700 :: FP base bug 15843414
10180 
10181     /*Check if the user had selected all the tasks otherwise
10182     update the visit as Partially released.*/
10183     OPEN c_visit_has_planned_tasks(p_visit_id);
10184     FETCH c_visit_has_planned_tasks into l_temp_num1;
10185     CLOSE c_visit_has_planned_tasks;
10186 
10187     OPEN c_visit_time_matches_MWO_time(p_visit_id);
10188     FETCH c_visit_time_matches_MWO_time INTO l_temp_num2;
10189     CLOSE c_visit_time_matches_MWO_time;
10190 
10191     IF l_temp_num1 IS NOT NULL OR l_temp_num2 is NULL THEN
10192        IF (l_log_statement >= l_log_current_level) THEN
10193           IF l_temp_num1 IS NOT NULL THEN
10194              fnd_log.string(l_log_statement,
10195                             L_DEBUG_KEY,
10196                             'Visit has some tasks in planning status. Setting Visit status to PARTIALLY RELEASED.');
10197           END IF;
10198           IF l_temp_num2 IS NULL THEN
10199              fnd_log.string(l_log_statement,
10200                             L_DEBUG_KEY,
10201                             'Visit times and Master Work order times do not match. Setting Visit status to PARTIALLY RELEASED.');
10202           END IF;
10203        END IF;
10204 
10205        UPDATE ahl_visits_b
10206        SET status_code = 'PARTIALLY RELEASED',
10207             --TCHIMIRA::BUG 9222622 ::15-DEC-2009::UPDATE OVN AND WHO COLUMNS
10208             OBJECT_VERSION_NUMBER = OBJECT_VERSION_NUMBER + 1,
10209             LAST_UPDATE_DATE      = SYSDATE,
10210             LAST_UPDATED_BY       = Fnd_Global.USER_ID,
10211             LAST_UPDATE_LOGIN     = Fnd_Global.LOGIN_ID
10212        WHERE visit_id = p_visit_id;
10213     ELSE
10214        IF (l_log_statement >= l_log_current_level) THEN
10215          fnd_log.string(l_log_statement,
10216                         L_DEBUG_KEY,
10217                         'Setting Visit status to RELEASED.');
10218        END IF;
10219 
10220        UPDATE ahl_visits_b
10221        SET status_code = 'RELEASED',
10222            any_task_chg_flag ='N',
10223            --TCHIMIRA::BUG 9222622 ::15-DEC-2009::UPDATE OVN AND WHO COLUMNS
10224             OBJECT_VERSION_NUMBER = OBJECT_VERSION_NUMBER + 1,
10225             LAST_UPDATE_DATE      = SYSDATE,
10226             LAST_UPDATED_BY       = Fnd_Global.USER_ID,
10227             LAST_UPDATE_LOGIN     = Fnd_Global.LOGIN_ID
10228        WHERE visit_id = p_visit_id;
10229     END IF;
10230 
10231 
10232     IF (l_log_procedure >= l_log_current_level) THEN
10233        fnd_log.string(l_log_procedure,
10234                       L_DEBUG_KEY ||'.end',
10235                       'At the end of PL SQL procedure. Return Status = ' || x_return_status);
10236     END IF;
10237 
10238 EXCEPTION
10239   WHEN  FND_API.G_EXC_ERROR THEN
10240     x_return_status := FND_API.G_RET_STS_ERROR;
10241     ROLLBACK TO Push_tasks_to_prodn_pvt;
10242     FND_MSG_PUB.count_and_get(p_count => x_msg_count,
10243                               p_data  => x_msg_data,
10244                               p_encoded => fnd_api.g_false);
10245 
10246   WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
10247     x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
10248     ROLLBACK TO Push_tasks_to_prodn_pvt;
10249     Fnd_Msg_Pub.count_and_get (
10250             p_encoded => Fnd_Api.g_false,
10251             p_count   => x_msg_count,
10252             p_data    => x_msg_data);
10253 
10254   WHEN OTHERS THEN
10255     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
10256     ROLLBACK TO Push_tasks_to_prodn_pvt;
10257     IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
10258        fnd_msg_pub.add_exc_msg(p_pkg_name       => G_PKG_NAME,
10259                                p_procedure_name => 'Push_tasks_to_production',
10260                                p_error_text     => SUBSTR(SQLERRM,1,500));
10261     END IF;
10262     FND_MSG_PUB.count_and_get(p_count   => x_msg_count,
10263                               p_data    => x_msg_data,
10264                               p_encoded => fnd_api.g_false);
10265 
10266 END Push_tasks_to_production;
10267 
10268 -------------------------------------------------------------------
10269 --  Procedure name      : check_unit_quarantined
10270 --  Type                : Private
10271 --  Function            : To check whether the Unit is quarantined
10272 --  Parameters          : item_instance_id
10273 
10274 -- AnRaj added for R 12.0 ACL changes in VWP
10275 -- Bug number 4297066
10276 ----------------------------------------------------------------------
10277 PROCEDURE check_unit_quarantined(
10278       p_visit_id           IN  NUMBER,
10279       item_instance_id     IN  NUMBER
10280       )
10281 IS
10282    L_API_NAME  CONSTANT VARCHAR2(30) := 'check_unit_quarantined';
10283    L_DEBUG_KEY CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
10284    l_unit_name          VARCHAR2(80);
10285    l_quarantined        VARCHAR2(1);
10286    l_task_number        NUMBER(15);
10287    l_instance_id        NUMBER;
10288 
10289    /* MANESING::Component Maintenance Planning Project, 07-Aug-2011, added visit task CLOSED status
10290     * in cursor query to prevent fetching tasks that are Closed due to Repair Batch closure.
10291     */
10292    CURSOR c_get_tasknumbers (x_visit_id IN NUMBER) IS
10293     SELECT visit_task_number,instance_id
10294     FROM ahl_visit_tasks_vl
10295     WHERE visit_id = p_visit_id
10296      AND NVL(STATUS_CODE,'X') NOT IN ('DELETED','RELEASED','CLOSED')
10297      AND TASK_TYPE_CODE <> 'SUMMARY';
10298 BEGIN
10299 
10300    IF (l_log_procedure >= l_log_current_level) THEN
10301       fnd_log.string(l_log_procedure,L_DEBUG_KEY||'.begin', 'At the start of PL SQL procedure');
10302       fnd_log.string(l_log_procedure,L_DEBUG_KEY,'p_visit_id : '|| p_visit_id || 'item_instance_id : '|| item_instance_id);
10303    END IF;
10304 
10305    IF item_instance_id IS NOT NULL THEN
10306    -- If the Visit header has an instance id, check for the corresponding Unit
10307       l_quarantined := ahl_util_uc_pkg.is_unit_quarantined(null,item_instance_id);
10308       IF l_quarantined = FND_API.G_TRUE THEN
10309          l_unit_name := ahl_util_uc_pkg.get_unit_name(item_instance_id);
10310          Fnd_Message.SET_NAME('AHL','AHL_VWP_VLD_HDR_UNIT_QRNT');
10311          -- The Unit for this Visit (UNIT_NAME-1) is quarantined.
10312          Fnd_Message.Set_Token('UNIT_NAME',l_unit_name);
10313          Fnd_Msg_Pub.ADD;
10314 
10315          IF (l_log_statement >= l_log_current_level)THEN
10316             fnd_log.string (l_log_statement,L_DEBUG_KEY,'Unit : '||l_unit_name || ' is quarantined, Error message added');
10317          END IF;
10318       END IF;  -- l_quarantined not true
10319    ELSE -- instance id is null
10320    -- If the visit does not have a unit at the header , then check for the units of all tasks
10321       OPEN c_get_tasknumbers (p_visit_id);
10322       LOOP
10323          FETCH c_get_tasknumbers INTO l_task_number,l_instance_id;
10324          EXIT WHEN c_get_tasknumbers%NOTFOUND;
10325          l_quarantined := ahl_util_uc_pkg.is_unit_quarantined(null,l_instance_id);
10326          IF l_quarantined = FND_API.G_TRUE THEN
10327             Fnd_Message.SET_NAME('AHL','AHL_VWP_VLD_TSK_UNIT_QRNT');
10328             -- The Unit for the Task (UNIT_NAME-1) is quarantined.
10329             Fnd_Message.Set_Token('TASK_NUMBER',l_task_number);
10330             Fnd_Msg_Pub.ADD;
10331             IF (l_log_statement >= l_log_current_level)THEN
10332                fnd_log.string(l_log_statement,L_DEBUG_KEY,'Unit for this task: '||l_task_number||' is quarantined');
10333             END IF;
10334          END IF;  -- l_quarantined not true
10335       END LOOP;   --  c_get_tasknumbers
10336    END IF;
10337 
10338    IF (l_log_procedure >= l_log_current_level) THEN
10339       fnd_log.string(l_log_procedure,L_DEBUG_KEY ||'.end','At the end of PL SQL procedure ');
10340    END IF;
10341 END check_unit_quarantined;
10342 
10343 -------------------------------------------------------------------
10344 --  Procedure name    : Release_MR
10345 --  Type              : Private
10346 --
10347 --
10348 --  Function          :To release all MRs associated to a given UE and return
10349 --                     workorder ID for the root task. Requested by MEL/CDL.
10350 --                     If p_module_type is 'PROD' and Validate_Before_Production
10351 --                     fails, then no exception will be thrown and calling API is
10352 --                     responsible to check return status ('V') and read from error stack.
10353 --  Pre-reqs    :
10354 --  Parameters  :
10355 --
10356 --  Standard IN  Parameters :
10357 --      p_api_version                   IN      NUMBER       Required
10358 --      p_init_msg_list                 IN      VARCHAR2     Default  FND_API.G_FALSE
10359 --      p_commit                        IN      VARCHAR2     Default  FND_API.G_FALSE
10360 --      p_validation_level              IN      NUMBER       Default  FND_API.G_VALID_LEVEL_FULL
10361 --
10362 --  Standard OUT Parameters :
10363 --      x_return_status                 OUT     VARCHAR2               Required ='V' if validation fails
10364 --      x_msg_count                     OUT     NUMBER                 Required
10365 --      x_msg_data                      OUT     VARCHAR2               Required
10366 --      x_workorder_id                  OUT     NUMBER                 Required
10367 --
10368 --  Release visit Parameters:
10369 --       p_visit_id                     IN   NUMBER  Required
10370 --       p_unit_effectivity_id          IN   NUMBER  Required
10371 --       p_release_flag                 IN   VARCHAR2 optional
10372 --
10373 --  Version :
10374 --    07/21/2005     YAZHOU   Initial  Creation
10375 -------------------------------------------------------------------
10376 PROCEDURE Release_MR (
10377     p_api_version            IN            NUMBER,
10378     p_init_msg_list          IN            VARCHAR2  := Fnd_Api.G_FALSE,
10379     p_commit                 IN            VARCHAR2  := Fnd_Api.G_FALSE,
10380     p_validation_level       IN            NUMBER    := Fnd_Api.G_VALID_LEVEL_FULL,
10381     p_module_type            IN            VARCHAR2  := NULL,
10382     p_visit_id               IN            NUMBER,
10383     p_unit_effectivity_id    IN            NUMBER,
10384     p_release_flag           IN            VARCHAR2  := 'N',
10385     -- SKPATHAK :: Bug 8343599 :: 14-APR-2009
10386     -- Added an optional parameter to prevent date recalculation
10387     p_recalculate_dates      IN            VARCHAR2  := 'Y',
10388     --TCHIMIRA::ER 9368251 ::15-JUN-2010 :: Added to include firm-planned flag(1 is Firm and 2 is Planned)as entered by user
10389     p_firm_planned_flag      IN            NUMBER,
10390     x_workorder_id              OUT NOCOPY NUMBER,
10391     x_return_status             OUT NOCOPY VARCHAR2,
10392     x_msg_count                 OUT NOCOPY NUMBER,
10393     x_msg_data                  OUT NOCOPY VARCHAR2)
10394 IS
10395     --Standard local variables
10396     l_api_name       CONSTANT VARCHAR2(30)  := 'Release_MR';
10397     l_api_version    CONSTANT NUMBER        := 1.0;
10398     L_DEBUG_KEY      CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
10399     l_msg_data                VARCHAR2(2000);
10400     l_return_status           VARCHAR2(1);
10401     l_msg_count               NUMBER;
10402     l_Error_Tbl_Type          Error_Tbl_Type;
10403     l_error_msg               VARCHAR2(5000);
10404     l_error_count             NUMBER;
10405     l_commit                  VARCHAR2(1) := 'F';
10406     l_validate_error CONSTANT VARCHAR2(1) := 'V';
10407     l_MR_end_time             DATE;
10408     l_visit_end_time          DATE;
10409 
10410     -- To find visit related information
10411    CURSOR c_visit (x_id IN NUMBER) IS
10412     SELECT * FROM AHL_VISITS_VL
10413     WHERE VISIT_ID = x_id;
10414    c_visit_rec c_visit%ROWTYPE;
10415 
10416    CURSOR get_wo(c_visit_id NUMBER, c_unit_effectivity_id NUMBER) IS
10417    SELECT workorder_id
10418    FROM AHL_WORKORDERS
10419    WHERE VISIT_TASK_ID = (select visit_task_id from ahl_visit_tasks_b
10420                           where visit_id = c_visit_id
10421                           and unit_effectivity_id = c_unit_effectivity_id
10422                           AND NVL(status_code, 'Y') <> 'DELETED'
10423                           and originating_task_id is null)
10424      AND STATUS_CODE NOT IN ('7', '22');
10425 
10426    CURSOR c_get_wo_details(x_visit_id IN NUMBER)
10427    IS
10428    SELECT
10429         scheduled_start_date,
10430         SCHEDULED_COMPLETION_DATE
10431    FROM   wip_discrete_jobs
10432    WHERE wip_entity_id =
10433         (
10434          SELECT
10435          wip_entity_id
10436          FROM ahl_workorders
10437          WHERE
10438            master_workorder_flag = 'Y' AND
10439            visit_task_id IS null AND
10440            status_code not in (22,7) and
10441            visit_id=x_visit_id
10442           );
10443    c_get_wo_details_rec  c_get_wo_details%ROWTYPE;
10444 
10445   -- get end time of the root task for a given UE
10446    CURSOR get_summary_task_times_csr(x_visit_id IN NUMBER, x_unit_effectivity_id IN NUMBER)IS
10447       SELECT max(end_date_time)
10448       FROM ahl_visit_tasks_b VST
10449       where visit_id = x_visit_id
10450         AND NVL(VST.status_code, 'Y') <> 'DELETED'
10451       START WITH unit_effectivity_id = x_unit_effectivity_id
10452         and originating_task_id is null
10453       CONNECT BY originating_task_id = PRIOR visit_task_id;
10454 
10455 -- Get all the parent tasks for a given UE that start in a past date
10456 CURSOR get_independent_tasks(x_visit_id IN NUMBER, x_unit_effectivity_id IN NUMBER) IS
10457   select distinct t.visit_task_id
10458     from ahl_visit_tasks_b t,
10459          ahl_visits_b v
10460    where v.visit_id = x_visit_id
10461      and v.visit_id = t.visit_id
10462      --and v.status_code = 'PARTIALLY RELEASED'
10463      and v.status_code IN ('PLANNING', 'PARTIALLY RELEASED') -- PRAKKUM :: BUG Internal :: 19/01/2012  :: Task Time Adjustments
10464      and t.start_date_time < SYSDATE
10465      and t.status_code ='PLANNING'
10466      and t.task_type_code <>'SUMMARY'
10467      -- SKPATHAK :: ER: 9147951 :: 11-JAN-2010 :: Adjust task times only if past task start date is null
10468      and t.past_task_start_date IS NULL
10469      and (not exists (select 1 from ahl_task_links l0
10470                       where l0.parent_task_id = t.visit_task_id
10471                          or l0.visit_task_id = t.visit_task_id )
10472           or t.visit_task_id in (select l1.parent_task_id from ahl_task_links l1
10473                                   where not exists (select l2.visit_task_id from ahl_task_links l2
10474                                                      where l2.visit_task_id = l1.parent_task_id)))
10475     /*NR-MR Changes - For SR's created from non-routines have the originating wo as their originating task, hence they are not null.*/
10476     START WITH t.unit_effectivity_id  = x_unit_effectivity_id
10477         AND (( t.originating_task_id is null AND 'SR' <> p_module_type)
10478     -- SKPATHAK :: Bug #9410052 :: 25-FEB-2010 :: Removed the condition "originating_task_id is not null"
10479             OR ( 'SR' = p_module_type
10480                  and t.service_request_id is not null))
10481     CONNECT BY t.originating_task_id = PRIOR visit_task_id;
10482 
10483      --CHANGES by jrotich bug #13028686 begin
10484     CURSOR c_stages_without_types(c_visit_id IN NUMBER, c_unit_effectivity_id IN NUMBER ) IS
10485     SELECT DISTINCT STAGES.STAGE_ID ,
10486       STAGES.STAGE_NAME
10487     FROM AHL_VISIT_TASKS_B TASKS,
10488       AHL_VWP_STAGES_VL STAGES
10489     WHERE
10490       TASKS.VISIT_ID= c_visit_id AND
10491       TASKS.UNIT_EFFECTIVITY_ID = c_unit_effectivity_id AND
10492       STAGES.STAGE_ID=TASKS.STAGE_ID AND
10493       NOT EXISTS (
10494         SELECT STAGE_ID
10495         FROM AHL_VISIT_STAGE_TYP_ASOC
10496         WHERE STAGE_ID=STAGES.STAGE_ID);
10497   l_invalid_stage BOOLEAN;
10498 --CHANGES by jrotich bug #13028686 end
10499 
10500 BEGIN
10501 
10502     IF (l_log_procedure >= l_log_current_level) THEN
10503       fnd_log.string(l_log_procedure, L_DEBUG_KEY ||'.begin',
10504                      'At the start of PL SQL procedure. Visit Id = ' || p_visit_id ||
10505                      ', p_recalculate_dates = ' || p_recalculate_dates);
10506     END IF;
10507 
10508     -- Standard start of API savepoint
10509     SAVEPOINT Release_MR;
10510 
10511     -- Initialize message list if p_init_msg_list is set to TRUE
10512     IF FND_API.To_Boolean( p_init_msg_list) THEN
10513        FND_MSG_PUB.Initialize;
10514     END IF;
10515 
10516     -- Initialize API return status to success
10517     x_return_status := FND_API.G_RET_STS_SUCCESS;
10518 
10519     -- Standard call to check for call compatibility.
10520     IF NOT FND_API.COMPATIBLE_API_CALL(l_api_version,
10521                                       p_api_version,
10522                                       l_api_name,G_PKG_NAME)THEN
10523        RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
10524     END IF;
10525 
10526     IF (l_log_statement >= l_log_current_level) THEN
10527       fnd_log.string(l_log_statement,L_DEBUG_KEY,'Request for Release_MR Visit ID : ' || p_visit_id);
10528       fnd_log.string(l_log_statement,L_DEBUG_KEY,'Request for Release_MR UE ID : ' || p_unit_effectivity_id);
10529       fnd_log.string(l_log_statement,L_DEBUG_KEY,'Request for Release_MR Release Flag : ' || p_release_flag);
10530     END IF;
10531 
10532     -- Check for Required Parameters
10533     IF(p_visit_id IS NULL OR p_visit_id = FND_API.G_MISS_NUM) THEN
10534        FND_MESSAGE.Set_Name(G_PM_PRODUCT_CODE,'AHL_VWP_CST_INPUT_MISS');
10535        FND_MSG_PUB.ADD;
10536        IF (l_log_unexpected >= l_log_current_level)THEN
10537            fnd_log.string(l_log_unexpected,L_DEBUG_KEY,'Visit id is mandatory but found null in input');
10538        END IF;
10539        RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
10540     END IF;
10541 
10542     IF(p_unit_effectivity_id IS NULL OR p_unit_effectivity_id = FND_API.G_MISS_NUM) THEN
10543        FND_MESSAGE.Set_Name(G_PM_PRODUCT_CODE,'AHL_VWP_UE_INPUT_MISS');
10544        FND_MSG_PUB.ADD;
10545        IF (l_log_unexpected >= l_log_current_level)THEN
10546            fnd_log.string(l_log_unexpected,L_DEBUG_KEY,'Unit Effectivity id is mandatory but found null in input ');
10547        END IF;
10548        RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
10549     END IF;
10550 
10551     --CHANGES by jrotich bug #13028686 begin
10552     IF (l_log_statement >= l_log_current_level)THEN
10553          fnd_log.string (l_log_statement,L_DEBUG_KEY, 'Validating stage details ');
10554     END IF;
10555 
10556     l_invalid_stage :=FALSE;
10557     FOR stage_details_rec in c_stages_without_types(p_visit_id,p_unit_effectivity_id)
10558     LOOP
10559       l_invalid_stage :=TRUE;
10560       IF (l_log_statement >= l_log_current_level) THEN
10561         fnd_log.string(l_log_statement,
10562                        L_DEBUG_KEY,
10563                        'Stage does not have an associated stage type ' ||
10564                        stage_details_rec.stage_name);
10565       END IF;
10566       FND_MESSAGE.SET_NAME('AHL', 'AHL_VWP_NO_STAGE_TYPE');
10567       FND_MESSAGE.SET_TOKEN('STAGE_NAME',stage_details_rec.stage_name);
10568       FND_MSG_PUB.ADD;
10569 
10570     END LOOP;
10571 
10572     IF(l_invalid_stage=TRUE) THEN
10573       RAISE FND_API.G_EXC_ERROR;
10574     END IF;
10575 
10576     --CHANGES by jrotich bug #13028686 END
10577 
10578     IF (l_log_statement >= l_log_current_level)THEN
10579         fnd_log.string(l_log_statement,L_DEBUG_KEY,'Before Calling Validate Before Production for visit Id: ' ||p_visit_id);
10580     END IF;
10581 
10582     --Valdate before push to production happens
10583     Validate_Before_Production
10584               (p_api_version       => l_api_version,
10585                p_init_msg_list     => p_init_msg_list,
10586                p_commit            => l_commit,
10587                p_validation_level  => p_validation_level,
10588                p_module_type       => 'MR',
10589                p_visit_id          => p_visit_id,
10590                x_error_tbl         => l_error_tbl_type,
10591                x_return_status     => l_return_status,
10592                x_msg_count         => x_msg_count,
10593                x_msg_data          => x_msg_data);
10594 
10595     IF (l_log_statement >= l_log_current_level)THEN
10596       fnd_log.string(l_log_statement,L_DEBUG_KEY,'After Calling Validate Before Production - l_return_status : '|| l_return_status);
10597     END IF;
10598 
10599     IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
10600        -- Check Error Message stack.
10601        x_msg_count := FND_MSG_PUB.count_msg;
10602        IF (l_log_statement >= l_log_current_level)THEN
10603         fnd_log.string(l_log_statement,L_DEBUG_KEY,'Errors from Validate Before Production' || x_msg_count);
10604        END IF;
10605        RAISE Fnd_Api.g_exc_error;
10606     END IF;
10607 
10608     IF l_error_tbl_type.COUNT > 0 THEN
10609       x_return_status := l_validate_error;
10610     ELSE
10611       OPEN c_visit (p_visit_id);
10612       FETCH c_visit INTO c_visit_rec;
10613       CLOSE c_visit;
10614       -- Adjust Task Start/End time if visit start date is a past date
10615       -- ER #4552764
10616 
10617       --IF c_visit_rec.STATUS_CODE = 'PARTIALLY RELEASED' AND c_visit_rec.start_date_time < SYSDATE THEN
10618         -- PRAKKUM :: BUG Internal :: 19/01/2012 :: Task Time Adjustments
10619         IF ( c_visit_rec.STATUS_CODE = 'PLANNING' OR c_visit_rec.STATUS_CODE = 'PARTIALLY RELEASED' ) AND c_visit_rec.start_date_time < SYSDATE THEN
10620         -- SKPATHAK :: Bug 8343599 :: 14-APR-2009 :: Begin
10621         -- Recalculate the task times only if the user has not entered a start date for the NR
10622         -- If the user has entered a task start date, the callers should pass 'N'
10623         -- for the p_recalculate_dates parameter so that the original dates can be retained
10624         IF (NVL(p_recalculate_dates, 'Y') <> 'N') THEN
10625         FOR l_get_independent_tasks IN get_independent_tasks(c_visit_rec.visit_id,p_unit_effectivity_id)
10626         LOOP
10627           AHL_VWP_TIMES_PVT.adjust_task_times(
10628                                p_api_version           => 1.0,
10629                                p_init_msg_list         => Fnd_Api.G_FALSE,
10630                                p_commit                => Fnd_Api.G_FALSE,
10631                                p_validation_level      => Fnd_Api.G_VALID_LEVEL_FULL,
10632                                x_return_status         => l_return_status,
10633                                x_msg_count             => l_msg_count,
10634                                x_msg_data              => l_msg_data,
10635                                p_task_id               => l_get_independent_tasks.visit_task_id,
10636                                p_reset_sysdate_flag    => FND_API.G_TRUE);
10637         END LOOP;
10638         END IF;
10639         -- SKPATHAK :: Bug 8343599 :: 14-APR-2009 :: End
10640         l_visit_end_time := AHL_VWP_TIMES_PVT.get_visit_end_time(c_visit_rec.visit_id);
10641         IF l_visit_end_time > c_visit_rec.close_date_time THEN
10642           Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_TSK_STDT_ADJU');
10643           Fnd_Message.Set_Token('VISIT_END_DATE', l_visit_end_time);
10644           Fnd_Msg_Pub.ADD;
10645           x_return_status := l_validate_error;
10646         END IF;
10647       END IF;
10648     END IF;
10649 
10650     IF x_return_status = FND_API.G_RET_STS_SUCCESS THEN
10651       /* Check visit end date instead
10652            --The MR end date
10653            OPEN get_summary_task_times_csr(p_visit_id, p_unit_effectivity_id);
10654            FETCH get_summary_task_times_csr into l_MR_end_time;
10655            CLOSE get_summary_task_times_csr;
10656       */
10657      l_visit_end_time := AHL_VWP_TIMES_PVT.get_visit_end_time(c_visit_rec.visit_id);
10658 
10659      OPEN c_get_wo_details(c_visit_rec.visit_id);
10660      FETCH c_get_wo_details into c_get_wo_details_rec;
10661      -- Validate to check if derived visit end time now exceeds scheduled master work order completion time
10662      -- Note: since we are checking for derived visit end time here, if there are other task in planning
10663      -- status with end date exceeding visit master WO end date, then MR tasks cannot be created
10664      IF TRUNC(l_visit_end_time) > TRUNC(c_get_wo_details_rec.scheduled_completion_date) THEN
10665         x_return_status := l_validate_error;
10666         -- Error Message
10667         Fnd_Message.SET_NAME('AHL','AHL_VWP_DATE_EXCD_WO_DATE');
10668         Fnd_Message.Set_Token('VISIT_END_DATE', l_visit_end_time);
10669         FND_MSG_PUB.ADD;
10670      END IF;
10671     END IF;
10672 
10673     IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
10674       -- Per MEL/CDL requirement, if tasks are sucessfully created but fail to be pushed
10675       -- to production, then they will stay in 'PLANNING' status.
10676       IF p_module_type <>'PROD' THEN
10677         -- Check Error Message stack.
10678         x_msg_count := FND_MSG_PUB.count_msg;
10679         IF (l_log_statement >= l_log_current_level)THEN
10680           fnd_log.string(l_log_statement,L_DEBUG_KEY,'Errors from Validate Before Production'|| x_msg_count);
10681         END IF;
10682         RAISE Fnd_Api.g_exc_error;
10683       END IF;
10684     ELSE
10685       IF (l_log_statement >= l_log_current_level)THEN
10686          fnd_log.string(l_log_statement,L_DEBUG_KEY,'Before Calling Push_MR_to_Production for UE Id: ' ||p_unit_effectivity_id);
10687       END IF;
10688 
10689       Push_MR_to_Production
10690              (p_api_version        => l_api_version,
10691               p_init_msg_list      => p_init_msg_list,
10692               p_commit             => l_commit,
10693               p_validation_level   => p_validation_level,
10694               p_module_type        => p_module_type,
10695               p_visit_id           => p_visit_id,
10696               p_unit_effectivity_id => p_unit_effectivity_id,
10697               p_release_flag       => p_release_flag,
10698               --TCHIMIRA::ER 9368251 ::15-JUN-2010 :: Added to include firm-planned flag(1 is Firm and 2 is Planned)as entered by user
10699               p_firm_planned_flag  => p_firm_planned_flag,
10700               x_return_status      => l_return_status,
10701               x_msg_count          => l_msg_count,
10702               x_msg_data           => l_msg_data);
10703 
10704       IF (l_log_statement >= l_log_current_level)THEN
10705          fnd_log.string(l_log_statement,L_DEBUG_KEY,'After Calling Push_MR_to_Production - l_return_status : ' ||l_return_status);
10706       END IF;
10707 
10708       IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
10709        -- Check Error Message stack.
10710        x_msg_count := FND_MSG_PUB.count_msg;
10711        IF (l_log_statement >= l_log_current_level)THEN
10712         fnd_log.string(l_log_statement,L_DEBUG_KEY,'Errors from Push to Production: ' || x_msg_count);
10713        END IF;
10714        RAISE Fnd_Api.g_exc_error;
10715       END IF;
10716 
10717       /*Return root root workorder ID for the given UE*/
10718       OPEN get_wo(p_visit_id, p_unit_effectivity_id);
10719       FETCH get_wo INTO x_workorder_id;
10720       CLOSE get_wo;
10721     END IF;
10722 
10723     -- Standard check of p_commit
10724     IF FND_API.TO_BOOLEAN(p_commit) THEN
10725       COMMIT WORK;
10726     END IF;
10727 
10728     Fnd_Msg_Pub.count_and_get(
10729          p_encoded => Fnd_Api.g_false,
10730          p_count   => x_msg_count,
10731          p_data    => x_msg_data);
10732 
10733     IF (l_log_procedure >= l_log_current_level)THEN
10734         fnd_log.string(l_log_procedure,L_DEBUG_KEY||'.end','At the end of PLSQL procedure');
10735     END IF;
10736 
10737 EXCEPTION
10738  WHEN FND_API.G_EXC_ERROR THEN
10739    x_return_status := FND_API.G_RET_STS_ERROR;
10740    ROLLBACK TO Release_MR;
10741    FND_MSG_PUB.count_and_get( p_count => x_msg_count,
10742                               p_data  => x_msg_data,
10743                               p_encoded => fnd_api.g_false);
10744 
10745 
10746  WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
10747    x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
10748    ROLLBACK TO Release_MR;
10749    FND_MSG_PUB.count_and_get( p_count => x_msg_count,
10750                               p_data  => x_msg_data,
10751                               p_encoded => fnd_api.g_false);
10752 
10753 
10754  WHEN OTHERS THEN
10755     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
10756     ROLLBACK TO Release_MR;
10757     IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
10758        fnd_msg_pub.add_exc_msg(p_pkg_name       => G_PKG_NAME,
10759                                p_procedure_name => 'Release_MR',
10760                                p_error_text     => SUBSTR(SQLERRM,1,500));
10761     END IF;
10762     FND_MSG_PUB.count_and_get( p_count => x_msg_count,
10763                                p_data  => x_msg_data,
10764                                p_encoded => fnd_api.g_false);
10765 
10766 END Release_MR;
10767 
10768 --------------------------------------------------------------------
10769 -- PROCEDURE
10770 --    Get_MR_Dependencies
10771 --
10772 -- PURPOSE
10773 -- To get all the Technical Dependencies for the MR.
10774 --------------------------------------------------------------------
10775 
10776 PROCEDURE Get_MR_Dependencies
10777 (
10778   p_visit_id             IN            NUMBER,
10779   p_visit_number         IN            NUMBER,
10780   p_unit_effectivity_id  IN            NUMBER,
10781   p_module_type          IN            VARCHAR2  := Null, /*NR-MR Changes - sowsubra*/
10782   p_x_relationship_tbl   IN OUT NOCOPY AHL_PRD_WORKORDER_PVT.prd_workorder_rel_tbl
10783 )
10784 AS
10785 
10786 -- Get all the Task Dependencies for the given MR.
10787 CURSOR get_tech_dependencies( c_visit_id NUMBER, c_unit_effectivity_id NUMBER )
10788 IS
10789 SELECT distinct PARENT.visit_task_number parent_task_number,
10790        CHILD.visit_task_number child_task_number
10791 FROM   AHL_VISIT_TASKS_B PARENT,
10792        AHL_VISIT_TASKS_B CHILD,
10793        AHL_TASK_LINKS LINK
10794 WHERE  PARENT.visit_task_id = LINK.parent_task_id
10795 AND    CHILD.visit_task_id = LINK.visit_task_id
10796 AND    NVL(PARENT.STATUS_CODE,'X') = 'PLANNING' --Srini Bug #4075702
10797 AND    PARENT.visit_id = c_visit_id
10798 AND    CHILD.visit_id = c_visit_id
10799 AND PARENT.visit_task_id in (select visit_task_id from ahl_visit_tasks_b
10800                              where visit_id = c_visit_id
10801                               /*NR-MR Changes - For SR's created from non-routines have the originating wo as their originating task, hence they are not null.*/
10802                              START WITH unit_effectivity_id  = c_unit_effectivity_id
10803                                 AND (( originating_task_id is null AND 'SR' <> p_module_type)
10804                                 -- SKPATHAK :: Bug #9410052 :: 25-FEB-2010
10805                                 -- Removed the condition "originating_task_id is not null"
10806                                       OR ( 'SR' = p_module_type
10807                                             and service_request_id is not null))
10808                              CONNECT BY originating_task_id = PRIOR visit_task_id)
10809 AND CHILD.visit_task_id in ( select visit_task_id from ahl_visit_tasks_b
10810                              where visit_id = c_visit_id
10811                              /*NR-MR Changes - For SR's created from non-routines have the originating wo as their originating task, hence they are not null.*/
10812                              START WITH unit_effectivity_id  = c_unit_effectivity_id
10813                                 AND (( originating_task_id is null AND 'SR' <> p_module_type)
10814                                 -- SKPATHAK :: Bug #9410052 :: 25-FEB-2010
10815                                 -- Removed the condition "originating_task_id is not null"
10816                                       OR ( 'SR' = p_module_type
10817                                             and service_request_id is not null))
10818                              CONNECT BY originating_task_id = PRIOR visit_task_id);
10819 
10820 l_api_name CONSTANT VARCHAR2(30):= 'Get_MR_Dependencies';
10821 L_DEBUG_KEY    CONSTANT VARCHAR2(100):= 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
10822 rel_count           NUMBER;
10823 
10824 BEGIN
10825 
10826   IF (l_log_procedure >= l_log_current_level) THEN
10827     fnd_log.string(l_log_procedure,L_DEBUG_KEY||'.begin','At the start of the procedure');
10828   END IF;
10829 
10830   rel_count := p_x_relationship_tbl.COUNT;
10831 
10832   IF (l_log_statement >= l_log_current_level) THEN
10833     fnd_log.string(l_log_statement,L_DEBUG_KEY,'rel_count - '||rel_count);
10834   END IF;
10835 
10836   -- Get the Technical Dependencies between Visit Tasks for a Visit.
10837   FOR tsk_cursor IN get_tech_dependencies( p_visit_id , p_unit_effectivity_id) LOOP
10838     rel_count := rel_count + 1;
10839     p_x_relationship_tbl(rel_count).batch_id := p_visit_number;
10840     p_x_relationship_tbl(rel_count).parent_header_id := tsk_cursor.parent_task_number;
10841     p_x_relationship_tbl(rel_count).child_header_id := tsk_cursor.child_task_number;
10842     p_x_relationship_tbl(rel_count).relationship_type := 2;
10843     p_x_relationship_tbl(rel_count).dml_operation := 'C';
10844   END LOOP;
10845 
10846   IF (l_log_procedure >= l_log_current_level) THEN
10847     fnd_log.string(l_log_procedure,L_DEBUG_KEY,'Total Relationships : ' || p_x_relationship_tbl.COUNT);
10848     fnd_log.string(l_log_procedure,L_DEBUG_KEY||'.end','At the end of procedure');
10849   END IF;
10850 
10851 END Get_MR_Dependencies;
10852 
10853 --------------------------------------------------------------------
10854 -- PROCEDURE
10855 --    Get_MR_Relationships
10856 --
10857 -- PURPOSE
10858 -- To get all the Relationships for the MR. These include :
10859 -- 1.A record for Each MR to MR / Visit Relationship.
10860 -- 2.A record for Each Visit Task to MR Relationship.
10861 --------------------------------------------------------------------
10862 
10863 PROCEDURE Get_MR_Relationships
10864 (
10865   p_visit_id            IN            NUMBER,
10866   p_visit_number        IN            NUMBER,
10867   p_unit_effectivity_id IN            NUMBER,
10868   p_module_type         IN            VARCHAR2  := Null, /*NR-MR Changes - sowsubra*/
10869   p_x_relationship_tbl  IN OUT NOCOPY AHL_PRD_WORKORDER_PVT.prd_workorder_rel_tbl
10870 )
10871 AS
10872 -- Get all the MR tasks associated to the given UE.
10873 /*NR-MR Changes - sowsubra - modified the cursor to fetch the sr_id, mr_id and task type*/
10874 CURSOR   get_mrs_for_UE( c_visit_id NUMBER , c_unit_effectivity_id NUMBER)
10875 IS
10876 SELECT   distinct visit_task_id,
10877          visit_task_number,
10878          task_type_code,
10879          service_request_id,
10880          mr_id,
10881          NVL(originating_task_id, -1)
10882 FROM     AHL_VISIT_TASKS_B
10883 WHERE    visit_id = c_visit_id
10884 AND      task_type_code='SUMMARY'
10885 -- SKPATHAK :: Bug 9444849 :: 19-MAR-2010
10886 -- This condition is not needed, since after opening this cursor we have a check if the visit task id fetched by this cursor
10887 -- already has a corresponding WO. So only for tasks in planning we are building the relationships
10888 -- Also it is necessary to remove this condition to fix the bug 9444849, since the parent task can be implemented as well
10889 -- AND NVL(STATUS_CODE, 'X') = 'PLANNING'
10890 /*NR-MR Changes - For SR's created from non-routines have the originating wo as their originating task, hence they are not null.*/
10891 START WITH unit_effectivity_id  = c_unit_effectivity_id
10892    AND (( originating_task_id is null AND 'SR' <> p_module_type)
10893    -- SKPATHAK :: Bug #9410052 :: 25-FEB-2010 :: Removed the condition "originating_task_id is not null"
10894         OR ( 'SR' = p_module_type
10895              and service_request_id is not null))
10896 CONNECT BY originating_task_id = PRIOR visit_task_id
10897 order by 2;
10898 
10899 TYPE mr_task_rec_type IS RECORD
10900 (
10901   visit_task_id        NUMBER,
10902   visit_task_number    NUMBER,
10903   /*NR-MR Changes - sowsubra - begin*/
10904   task_type_code       VARCHAR2(30),
10905   service_request_id   NUMBER,
10906   mr_id                NUMBER,
10907   /*NR-MR Changes - sowsubra - end*/
10908   originating_task_id  NUMBER
10909 );
10910 
10911 TYPE mr_task_tbl_type IS TABLE OF mr_task_rec_type INDEX BY BINARY_INTEGER;
10912 
10913 l_mrs_for_UE  mr_task_tbl_type;
10914 
10915 -- Get all the Tasks associated to a MR.
10916 CURSOR get_tasks_for_mr( c_visit_id NUMBER, c_mr_task_id NUMBER )
10917 IS
10918 SELECT visit_task_number, visit_task_id
10919 FROM   AHL_VISIT_TASKS_B
10920 WHERE  visit_id = c_visit_id
10921 AND    originating_task_id = c_mr_task_id
10922 AND    task_type_code <> 'SUMMARY'
10923 AND NVL(STATUS_CODE, 'X') = 'PLANNING';
10924 
10925 CURSOR get_wo(c_visit_task_id NUMBER)
10926 IS
10927 SELECT wip_entity_id
10928 FROM AHL_WORKORDERS
10929 WHERE VISIT_TASK_ID = c_visit_task_id
10930       -- SKPATHAK :: Bug 9940275 :: 18-AUG-2010 :: Removed status '7' from below  condtn
10931       -- This cursor is used to check if a visit task has a corresponding WO and if not, WO relationship needs to be created
10932       -- So even if the status is 7 (cancelled),  cursor must fetch the result, since relationship need not be created in this case
10933       AND STATUS_CODE <>  '22';
10934 
10935 CURSOR get_parent_wo(c_visit_task_id NUMBER)
10936 IS
10937 SELECT wip_entity_id
10938 FROM AHL_WORKORDERS
10939 WHERE VISIT_TASK_ID = c_visit_task_id
10940 AND STATUS_CODE NOT IN ('7', '22');
10941 
10942 CURSOR get_mwo(c_visit_id NUMBER)
10943 IS
10944 SELECT wip_entity_id
10945 FROM AHL_WORKORDERS
10946 WHERE visit_id = c_visit_id
10947 AND VISIT_TASK_ID IS NULL
10948 AND MASTER_WORKORDER_FLAG = 'Y'
10949 AND STATUS_CODE NOT IN ('7', '22');
10950 
10951 l_api_name        CONSTANT    VARCHAR2(30):= 'Get_MR_Relationships';
10952 L_DEBUG_KEY           CONSTANT   VARCHAR2(100):= 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
10953 
10954 l_wip_entity_id      NUMBER;
10955 l_parent_wip_entity_id      NUMBER;
10956 /*NR-MR Changes - sowsubra - begin*/
10957 l_parent_wo_id      NUMBER := 0;
10958 /*NR-MR Changes - sowsubra - end*/
10959 
10960 rel_count    NUMBER := 0;
10961 mr_count     NUMBER := 0;
10962 
10963 BEGIN
10964 
10965   IF (l_log_procedure >= l_log_current_level) THEN
10966     fnd_log.string(l_log_procedure,L_DEBUG_KEY||'.begin','At the start of the procedure');
10967   END IF;
10968 
10969   rel_count := p_x_relationship_tbl.COUNT;
10970 
10971   IF (l_log_statement >= l_log_current_level) THEN
10972     fnd_log.string(l_log_statement,L_DEBUG_KEY,'rel_count - '||rel_count);
10973   END IF;
10974 
10975   -- Get all the Task Records corresponding to a MR for the given UE.
10976   OPEN get_mrs_for_UE( p_visit_id, p_unit_effectivity_id );
10977   LOOP
10978     EXIT WHEN get_mrs_for_UE%NOTFOUND;
10979     mr_count := mr_count + 1;
10980     FETCH get_mrs_for_UE
10981     INTO  l_mrs_for_UE(mr_count).visit_task_id,
10982           l_mrs_for_UE(mr_count).visit_task_number,
10983           /*NR-MR Changes - sowsubra - begin*/
10984           l_mrs_for_UE(mr_count).task_type_code,
10985           l_mrs_for_UE(mr_count).service_request_id,
10986           l_mrs_for_UE(mr_count).mr_id,
10987           /*NR-MR Changes - sowsubra - end*/
10988           l_mrs_for_UE(mr_count).originating_task_id;
10989   END LOOP;
10990   CLOSE get_mrs_for_UE;
10991 
10992   IF (l_log_statement >= l_log_current_level) THEN
10993     fnd_log.string(l_log_statement,L_DEBUG_KEY,'Total MRs for Visit : ' || l_mrs_for_UE.COUNT);
10994   END IF;
10995 
10996   OPEN get_mwo(p_visit_id);
10997   FETCH get_mwo INTO l_parent_wip_entity_id;
10998   CLOSE get_mwo;
10999 
11000   IF ( l_mrs_for_UE.COUNT > 0 ) THEN
11001     FOR i IN l_mrs_for_UE.FIRST..l_mrs_for_UE.LAST LOOP
11002     -- if the visit task already has a workorder then do not
11003     -- create a relationship for it
11004     OPEN get_wo(l_mrs_for_UE(i).visit_task_id);
11005     FETCH get_wo INTO l_wip_entity_id;
11006     IF get_wo%NOTFOUND THEN
11007         rel_count := rel_count + 1;
11008         p_x_relationship_tbl(rel_count).batch_id := p_visit_number;
11009         p_x_relationship_tbl(rel_count).child_header_id := l_mrs_for_UE(i).visit_task_number;
11010         p_x_relationship_tbl(rel_count).relationship_type := 1;
11011         p_x_relationship_tbl(rel_count).dml_operation := 'C';
11012 
11013         -- Loop to Find out Parent MRs
11014         IF ( l_mrs_for_UE(i).originating_task_id <> -1 ) THEN
11015           /*NR-MR Changes - sowsubra - begin*/
11016           /*MWO created for the SR Summary task should be child of visit MWO only.
11017           Hence the parent of the SR Summary task created from production will be visit.*/
11018           IF (l_mrs_for_UE(i).service_request_id IS NOT NULL) AND (l_mrs_for_UE(i).mr_id IS NULL) AND (NVL(p_module_type, 'NOT_SR') = 'SR') THEN
11019             /*OPEN get_mwo(p_visit_id);
11020             FETCH get_mwo INTO l_parent_wip_entity_id;
11021             CLOSE get_mwo;*/
11022             p_x_relationship_tbl(rel_count).parent_wip_entity_id := l_parent_wip_entity_id;
11023             p_x_relationship_tbl(rel_count).parent_header_id := 0;
11024           ELSE
11025             /*NR-MR Changes - sowsubra - end*/
11026             FOR j IN l_mrs_for_UE.FIRST..l_mrs_for_UE.LAST LOOP
11027               IF ( l_mrs_for_UE(i).originating_task_id = l_mrs_for_UE(j).visit_task_id ) THEN
11028                 p_x_relationship_tbl(rel_count).parent_header_id := l_mrs_for_UE(j).visit_task_number;
11029                 OPEN get_parent_wo(l_mrs_for_UE(j).visit_task_id);
11030                 FETCH get_parent_wo INTO l_parent_wo_id;
11031                 IF get_parent_wo%FOUND THEN
11032                   p_x_relationship_tbl(rel_count).parent_wip_entity_id := l_parent_wo_id;
11033                 END IF;
11034                 CLOSE get_parent_wo;
11035                 EXIT;
11036               END IF;
11037             END LOOP;
11038           END IF; /*NR-MR Changes - sowsubra*/
11039         END IF;
11040 
11041         -- If no Parent MR is found set the parent as the Visit
11042         IF ( p_x_relationship_tbl(rel_count).parent_header_id IS NULL ) THEN
11043           p_x_relationship_tbl(rel_count).parent_header_id := 0;
11044           /*OPEN get_mwo(p_visit_id);
11045           FETCH get_mwo INTO l_parent_wip_entity_id;
11046           IF get_mwo%FOUND THEN*/
11047           p_x_relationship_tbl(rel_count).parent_wip_entity_id := l_parent_wip_entity_id;
11048           /*END IF;
11049           CLOSE get_mwo;*/
11050         END IF;
11051     END IF;
11052     CLOSE get_wo;
11053 
11054     IF (l_log_statement >= l_log_current_level) THEN
11055       fnd_log.string(l_log_statement,L_DEBUG_KEY,'Total MRs for Visit : ' || l_mrs_for_UE.COUNT);
11056     END IF;
11057     END LOOP;
11058   END IF;
11059 
11060   IF (l_log_statement >= l_log_current_level) THEN
11061     fnd_log.string(l_log_statement,L_DEBUG_KEY,'Getting Tasks for MRs');
11062   END IF;
11063   -- Get all the Tasks for a MR.
11064   IF ( l_mrs_for_UE.COUNT > 0 ) THEN
11065     FOR i IN l_mrs_for_UE.FIRST..l_mrs_for_UE.LAST
11066     LOOP
11067       FOR mr_tasks_cursor IN get_tasks_for_mr( p_visit_id, l_mrs_for_UE(i).visit_task_id )
11068       LOOP
11069         OPEN get_wo(mr_tasks_cursor.visit_task_id);
11070         FETCH get_wo INTO l_wip_entity_id;
11071         IF get_wo%NOTFOUND THEN
11072            rel_count := rel_count + 1;
11073            p_x_relationship_tbl(rel_count).batch_id := p_visit_number;
11074            p_x_relationship_tbl(rel_count).parent_header_id := l_mrs_for_UE(i).visit_task_number;
11075            p_x_relationship_tbl(rel_count).child_header_id := mr_tasks_cursor.visit_task_number;
11076            p_x_relationship_tbl(rel_count).relationship_type := 1;
11077            p_x_relationship_tbl(rel_count).dml_operation := 'C';
11078 
11079            -- if this visit task is already in shop floor then get the wip_entity_id
11080            OPEN get_parent_wo(l_mrs_for_UE(i).visit_task_id);
11081            FETCH get_parent_wo INTO l_parent_wip_entity_id;
11082            IF get_parent_wo%FOUND THEN
11083                p_x_relationship_tbl(rel_count).parent_wip_entity_id := l_parent_wip_entity_id;
11084            END IF;
11085            CLOSE get_parent_wo;
11086         END IF;
11087         CLOSE get_wo;
11088       END LOOP;
11089     END LOOP;
11090   END IF;
11091 
11092   IF (l_log_procedure >= l_log_current_level) THEN
11093     fnd_log.string(l_log_procedure,L_DEBUG_KEY,'Total Relationships : ' || p_x_relationship_tbl.COUNT );
11094     fnd_log.string(l_log_procedure,L_DEBUG_KEY||'.end','At the end of the procedure');
11095   END IF;
11096 
11097 END Get_MR_Relationships;
11098 
11099 --------------------------------------------------------------------
11100 -- PROCEDURE
11101 --    Push_MR_to_Production
11102 --
11103 -- PURPOSE
11104 --    To push MR along with all its tasks to Production
11105 --------------------------------------------------------------------
11106 PROCEDURE Push_MR_to_Production
11107 (    p_api_version          IN  NUMBER,
11108      p_init_msg_list        IN  VARCHAR2  := Fnd_Api.g_false,
11109      p_commit               IN  VARCHAR2  := Fnd_Api.g_false,
11110      p_validation_level     IN  NUMBER    := Fnd_Api.g_valid_level_full,
11111      p_module_type          IN  VARCHAR2  := Null,
11112      p_visit_id             IN  NUMBER,
11113      p_unit_effectivity_id  IN  NUMBER,
11114      p_release_flag         IN  VARCHAR2  := 'N',
11115      --TCHIMIRA::ER 9368251 ::15-JUN-2010 :: Added to include firm-planned flag(1 is Firm and 2 is Planned)as entered by user
11116      p_firm_planned_flag    IN  NUMBER,
11117      x_return_status        OUT NOCOPY VARCHAR2,
11118      x_msg_count            OUT NOCOPY NUMBER,
11119      x_msg_data             OUT NOCOPY VARCHAR2
11120 )
11121 IS
11122    L_API_VERSION  CONSTANT NUMBER := 1.0;
11123    L_API_NAME     CONSTANT VARCHAR2(30) := 'Push_MR_to_Production';
11124    L_DEBUG_KEY    CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
11125    l_prd_workorder_tbl     AHL_PRD_WORKORDER_PVT.PRD_WORKORDER_TBL;
11126    l_prd_workorder_rel_tbl AHL_PRD_WORKORDER_PVT.PRD_WORKORDER_REL_TBL;
11127    --commented by tchimira to honor the firm_planned_flag entered by the user for the ER 9368251
11128    -- VWPE - tchimira.Uncommented the below to put the passed firm_planned_flag in local variable
11129    -- which may be over written based on visit firmed_flag or past_dated_flag
11130    l_firm_planned_flag     VARCHAR2(1) := p_firm_planned_flag;
11131    l_return_status         VARCHAR2(1);
11132    l_msg_count             NUMBER;
11133    l_msg_data              VARCHAR2(2000);
11134    l_init_msg_list         VARCHAR2(1) := 'F';
11135    l_commit                VARCHAR2(1) := 'F';
11136    idx                     NUMBER;
11137    l_count                 NUMBER;
11138    l_route_id              NUMBER;
11139    l_visit_end_time        DATE;
11140    l_dummy                 VARCHAR2(1);
11141    -- SKPATHAK :: Bug 9827320 :: 13-JUL-2010 :: Reverted back the changes done for bug 9827320
11142    --l_temp_msg_count       NUMBER:=0; -- Added by skpathak for bug #9445455 fix
11143 
11144    -- To find visit related information
11145    CURSOR c_visit (x_visit_id IN NUMBER) IS
11146     SELECT * FROM AHL_VISITS_VL
11147     WHERE VISIT_ID = x_visit_id;
11148 
11149    c_visit_rec c_visit%ROWTYPE;
11150 
11151    -- To get all the tasks for the given UE
11152    CURSOR c_task (x_visit_id IN NUMBER, x_unit_effectivity_id IN NUMBER) IS
11153 -- SKPATHAK :: Bug 8340436 :: 23-MAR-2009
11154     -- Fetch distinct rows to avoid duplicates
11155     -- Select individual cols instead of *
11156     --SELECT * FROM AHL_VISIT_TASKS_VL
11157     SELECT distinct visit_task_id, originating_task_id, visit_id, unit_effectivity_id,
11158            status_code, service_request_id, project_task_id, visit_task_number,
11159            visit_task_name, description, object_version_number, task_type_code,
11160            inventory_item_id, instance_id, mr_route_id, department_id, start_date_time,
11161            end_date_time, past_task_start_date -- SKPATHAK :: ER: 9147951 :: 11-JAN-2010 :: Fetch past date too
11162       FROM AHL_VISIT_TASKS_VL
11163       WHERE VISIT_ID = x_visit_id
11164     AND NVL( STATUS_CODE, 'X' ) = 'PLANNING'
11165     /*NR-MR Changes*/
11166     START WITH unit_effectivity_id  = x_unit_effectivity_id
11167         AND (( originating_task_id is null AND 'SR' <> p_module_type)
11168         -- SKPATHAK :: Bug #9410052 :: 25-FEB-2010 :: Removed the condition "originating_task_id is not null"
11169             OR ( 'SR' = p_module_type
11170                  and service_request_id is not null))
11171     CONNECT BY originating_task_id = PRIOR visit_task_id;
11172 
11173    c_task_rec c_task%ROWTYPE;
11174 
11175    -- To get the count of all the tasks for the given UE
11176    CURSOR c_task_ct (x_visit_id IN NUMBER, x_unit_effectivity_id IN NUMBER) IS
11177     -- SKPATHAK :: Bug 8340436 :: 23-MAR-2009
11178     -- Fetch distinct rows to avoid duplicates and select visit_task_id instead of *
11179     --SELECT count(*) FROM AHL_VISIT_TASKS_B
11180     SELECT count(distinct visit_task_id) FROM AHL_VISIT_TASKS_B
11181     WHERE VISIT_ID = x_visit_id
11182     AND NVL( STATUS_CODE, 'X' ) = 'PLANNING'
11183     /*NR-MR Changes*/
11184     START WITH unit_effectivity_id  = x_unit_effectivity_id
11185         AND (( originating_task_id is null AND 'SR' <> p_module_type)
11186         -- SKPATHAK :: Bug #9410052 :: 25-FEB-2010 :: Removed the condition "originating_task_id is not null"
11187             OR ( 'SR' = p_module_type
11188                  and service_request_id is not null))
11189     CONNECT BY originating_task_id = PRIOR visit_task_id;
11190 
11191    -- To find Route Id from MR Routes view
11192    CURSOR c_route (x_id IN NUMBER) IS
11193     SELECT Route_Id FROM AHL_MR_ROUTES_V
11194     WHERE MR_ROUTE_ID = x_id;
11195 
11196   --To get summary task start, end time
11197   CURSOR get_summary_task_times_csr(x_task_id IN NUMBER)IS
11198       SELECT min(start_date_time), max(end_date_time)
11199       --TCHIMIRA::19-FEB-2010::BUG 9384614
11200       -- Use the base table instead of the vl view
11201       FROM ahl_visit_tasks_b VST
11202       START WITH visit_task_id  = x_task_id
11203         AND NVL(VST.status_code, 'Y') <> 'DELETED'
11204       CONNECT BY originating_task_id = PRIOR visit_task_id;
11205 
11206   CURSOR c_visit_task_exists(x_visit_id IN NUMBER)
11207   IS
11208     SELECT 'x'
11209     FROM   ahl_visit_tasks_b
11210     WHERE  visit_id = x_visit_id
11211     AND  STATUS_CODE = 'PLANNING'
11212     -- SKPATHAK :: Bug 13930098 :: 20-APR-2012 :: Do NOT consider the default stage task
11213     AND (TASK_TYPE_CODE <> 'STAGE'
11214          OR (STAGE_ID IS NOT NULL AND TASK_TYPE_CODE = 'STAGE'));
11215 
11216   CURSOR c_get_wo_details(x_visit_id IN NUMBER)
11217   IS
11218     SELECT
11219         scheduled_start_date,
11220         SCHEDULED_COMPLETION_DATE
11221     FROM   wip_discrete_jobs
11222     WHERE wip_entity_id =
11223         (
11224          SELECT
11225          wip_entity_id
11226          FROM ahl_workorders
11227          WHERE
11228            master_workorder_flag = 'Y' AND
11229            visit_task_id IS null AND
11230            status_code not in (22,7) and
11231            visit_id=x_visit_id
11232           );
11233 
11234    c_get_wo_details_rec  c_get_wo_details%ROWTYPE;
11235    l_curr_task_id   NUMBER := 0;
11236 
11237   -- SATHAPLI::Bug 5758813, 04-Jun-2008
11238   -- Cursor to get the required format for the workorder description, given a visit task.
11239   CURSOR get_wo_dtls_for_mrtasks_cur (c_visit_task_id IN NUMBER) IS
11240   --TCHIMIRA::Bug 9149770 ::09-FEB-2010
11241   --use substrb and lengthb instead of substr and length respectively
11242   SELECT ar.route_no||'.'||SUBSTRB(ar.title, 1, (240 - (LENGTHB(ar.route_no) + 1))) workorder_description
11243     FROM ahl_routes_vl ar, ahl_visit_tasks_b avt,
11244          ahl_mr_routes mrr
11245    WHERE avt.visit_task_id         = c_visit_task_id
11246      AND NVL(avt.status_code, 'X') = 'PLANNING'
11247      AND avt.mr_route_id           = mrr.mr_route_id
11248      AND mrr.route_id              = ar.route_id;
11249 
11250   l_get_wo_dtls_rec get_wo_dtls_for_mrtasks_cur%ROWTYPE;
11251 
11252    --PRAKKUM :: PIE :: 13-OCT-2010 :: Added this cursor
11253    -- To find visit master workorder details
11254    CURSOR get_visit_mwo_details_csr (c_visit_id IN NUMBER) IS
11255     SELECT wo.workorder_id, wo.object_version_number, wo.status_code,
11256           WIP.SCHEDULED_START_DATE,
11257           WIP.SCHEDULED_COMPLETION_DATE
11258     FROM AHL_WORKORDERS WO,
11259          WIP_DISCRETE_JOBS WIP
11260     WHERE wo.VISIT_ID = c_visit_id
11261      AND   wo.VISIT_TASK_ID IS NULL
11262      AND   wo.MASTER_WORKORDER_FLAG = 'Y'
11263      AND   WIP.WIP_ENTITY_ID = WO.WIP_ENTITY_ID
11264      AND   wo.STATUS_CODE not in ('22','7'); --(22-Deleted, 7-Cancelled)
11265 
11266   get_visit_mwo_details_rec get_visit_mwo_details_csr%ROWTYPE;
11267 
11268 -- MANESING::Bug 13713141, 16-Apr-2012, added following cursors
11269 -- Cursor to find out the Repair Batch for the given task
11270 CURSOR get_rpr_batch_for_task_csr (c_visit_task_id NUMBER) IS
11271     SELECT repair_batch_name
11272     FROM   AHL_VISIT_TASKS_B
11273     WHERE  cost_parent_id  IS NULL
11274     START WITH visit_task_id = c_visit_task_id
11275     CONNECT BY visit_task_id = Prior cost_parent_id;
11276 
11277 -- Cursor to check if Repair Batch has planned tasks
11278 CURSOR chk_rpr_batch_has_planed_tasks (c_repair_batch_name VARCHAR2) IS
11279     SELECT 'X'
11280     FROM   AHL_VISIT_TASKS_B
11281     WHERE  cost_parent_id  IS NOT NULL  -- to filter repair batch task
11282     AND    status_code     = 'PLANNING'
11283     START WITH repair_batch_name = c_repair_batch_name
11284     CONNECT BY cost_parent_id    = Prior visit_task_id;
11285 
11286 l_visit_task_for_rpr_calc NUMBER;
11287 l_repair_batch_name       VARCHAR2(240);
11288 
11289 BEGIN
11290    --------------------- initialize -----------------------
11291 
11292   SAVEPOINT Push_MR_to_Production;
11293 
11294   IF (l_log_procedure >= l_log_current_level) THEN
11295     fnd_log.string(l_log_procedure,L_DEBUG_KEY||'.begin','At the begin of the procedure');
11296   END IF;
11297 
11298   -- Initialize message list if p_init_msg_list is set to TRUE.
11299   IF Fnd_Api.to_boolean(p_init_msg_list) THEN
11300     Fnd_Msg_Pub.initialize;
11301   END IF;
11302 
11303   --  Initialize API return status to success
11304   x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
11305 
11306   -- Standard call to check for call compatibility.
11307   IF NOT Fnd_Api.COMPATIBLE_API_CALL(l_api_version,
11308                                      p_api_version,
11309                                      l_api_name,G_PKG_NAME) THEN
11310     RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
11311   END IF;
11312 
11313   IF (l_log_statement >= l_log_current_level) THEN
11314     fnd_log.string(l_log_statement,L_DEBUG_KEY,'p_unit_effectivity_id : '||p_unit_effectivity_id||'Visit Id : ' || p_visit_id);
11315   END IF;
11316 
11317   -- SKPATHAK :: Bug 9827320 :: 13-JUL-2010 :: Reverted back the changes done for bug 9827320
11318   /*
11319   -- SKPATHAK :: Bug 9445455 :: 08-MAR-2010 :: START
11320   l_temp_msg_count := Fnd_Msg_Pub.count_msg;
11321 
11322   IF (l_log_statement >= l_log_current_level) THEN
11323      fnd_log.string(l_log_statement,
11324       L_DEBUG_KEY,
11325       'Before calling VALIDATE_MR_ROUTE_DATE. l_msg_count = ' || l_msg_count);
11326   END IF;
11327 
11328   OPEN c_task(p_visit_id, p_unit_effectivity_id);
11329   LOOP
11330       FETCH c_task INTO c_task_rec;
11331       EXIT WHEN c_task%NOTFOUND;
11332       Validate_MR_Route_Date
11333       (
11334           p_mr_route_id       => c_task_rec.mr_route_id,
11335           p_visit_task_number => c_task_rec.visit_task_number,
11336           p_start_date_time   => c_task_rec.start_date_time,
11337           p_end_date_time     => c_task_rec.end_date_time
11338       );
11339 
11340       IF (l_log_statement >= l_log_current_level) THEN
11341           fnd_log.string(l_log_statement,
11342           L_DEBUG_KEY,
11343           'After calling VALIDATE_MR_ROUTE_DATE for task Id: ' ||
11344           c_task_rec.visit_task_id ||', l_msg_count = ' || l_msg_count);
11345       END IF;
11346 
11347   END LOOP;
11348   CLOSE c_task;
11349 
11350   l_msg_count := Fnd_Msg_Pub.count_msg;
11351   IF (l_msg_count <> l_temp_msg_count) THEN
11352      IF (l_log_statement >= l_log_current_level) THEN
11353          fnd_log.string(l_log_statement,
11354          L_DEBUG_KEY,
11355          'Errors from VALIDATE_MR_ROUTE_DATE. Message count: ' || l_msg_count);
11356      END IF;
11357      RAISE FND_API.G_EXC_ERROR;
11358   END IF;
11359   -- SKPATHAK :: Bug 9445455 :: 08-MAR-2010 :: END
11360   */
11361 
11362   --Create project tasks for the given MR
11363   IF (l_log_statement >= l_log_current_level) THEN
11364     fnd_log.string(l_log_statement,L_DEBUG_KEY,'Before calling Add_MR_to_Projects');
11365   END IF;
11366 
11367   Add_MR_to_Project
11368         (p_api_version       => l_api_version,
11369          p_init_msg_list     => p_init_msg_list,
11370          p_commit            => l_commit,
11371          p_validation_level  => p_validation_level,
11372          p_module_type       => p_module_type,
11373          p_visit_id          => p_visit_id,
11374          p_unit_effectivity_id => p_unit_effectivity_id,
11375          x_return_status     => l_return_status,
11376          x_msg_count         => l_msg_count,
11377          x_msg_data          => x_msg_data);
11378 
11379   IF (l_log_statement >= l_log_current_level) THEN
11380     fnd_log.string(l_log_statement,L_DEBUG_KEY,'After calling Add_MR_to_Projects - l_return_status : '||l_return_status);
11381   END IF;
11382 
11383   IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
11384     -- Check Error Message stack.
11385     x_msg_count := FND_MSG_PUB.count_msg;
11386     RAISE Fnd_Api.g_exc_error;
11387   END IF;
11388 
11389   OPEN c_visit (p_visit_id);
11390   FETCH c_visit INTO c_visit_rec;
11391   CLOSE c_visit;
11392 
11393   -- Create Workorders for MR tasks
11394   OPEN c_task_ct(p_visit_id, p_unit_effectivity_id);
11395   FETCH c_task_ct INTO l_count;
11396   CLOSE c_task_ct;
11397 
11398   IF (l_log_statement >= l_log_current_level) THEN
11399     fnd_log.string(l_log_statement,L_DEBUG_KEY, 'Task Count: ' || l_count);
11400   END IF;
11401 
11402   --VWPE :: tchimira :: 15-FEB -2011 :: start
11403   IF (l_log_statement >= l_log_current_level) THEN
11404      fnd_log.string(l_log_statement,
11405                     L_DEBUG_KEY,
11406                     'Past Dated Flag value is : ' || c_visit_rec.PAST_DATED_VISIT_FLAG);
11407   END IF;
11408 
11409   --Now if the value of the PAST_DATED_VISIT_FLAG is Y which means it is past dated visit.
11410   -- Create WOs as firm so that they will not be considered by PS schedule engine.
11411   IF(c_visit_rec.PAST_DATED_VISIT_FLAG = 'Y') THEN
11412      l_firm_planned_flag := 1; --Firm
11413   END IF;
11414   --VWPE :: tchimira :: 15-FEB -2011 :: end
11415 
11416   -- PRAKKUM :: PIE :: 13-OCT-2010 :: START
11417   -- Get Master WO details
11418   OPEN get_visit_mwo_details_csr(p_visit_id);
11419   FETCH get_visit_mwo_details_csr INTO get_visit_mwo_details_rec;
11420   CLOSE get_visit_mwo_details_csr;
11421 
11422 
11423     idx := 1;
11424     l_prd_workorder_tbl(idx).SCHEDULED_START_DATE  := get_visit_mwo_details_rec.SCHEDULED_START_DATE;
11425     l_prd_workorder_tbl(idx).SCHEDULED_END_DATE    := get_visit_mwo_details_rec.SCHEDULED_COMPLETION_DATE;
11426     l_prd_workorder_tbl(idx).BATCH_ID              := c_visit_rec.VISIT_NUMBER;
11427     l_prd_workorder_tbl(idx).HEADER_ID             := 0; -- Visit
11428     l_prd_workorder_tbl(idx).DML_OPERATION         := 'U';
11429     l_prd_workorder_tbl(idx).WORKORDER_ID          := get_visit_mwo_details_rec.WORKORDER_ID;
11430     l_prd_workorder_tbl(idx).OBJECT_VERSION_NUMBER := get_visit_mwo_details_rec.OBJECT_VERSION_NUMBER;
11431     l_prd_workorder_tbl(idx).status_code           := get_visit_mwo_details_rec.STATUS_CODE;
11432     l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG     := 1; -- Firm
11433 
11434    --SKPATHAK :: PIE :: 14-SEP-2009 :: END
11435 
11436   IF l_count > 0 THEN
11437     idx := 0;
11438     OPEN c_task(p_visit_id, p_unit_effectivity_id);
11439     FETCH c_task INTO c_task_rec;
11440     WHILE c_task%FOUND LOOP
11441       IF (l_curr_task_id <> c_task_rec.visit_task_id) THEN
11442         idx := idx+1;
11443         l_prd_workorder_tbl(idx).DML_OPERATION     := 'C';
11444         IF p_release_flag = 'Y' THEN
11445           l_prd_workorder_tbl(idx).STATUS_CODE  := '3';  -- Released
11446         ELSE
11447           l_prd_workorder_tbl(idx).STATUS_CODE  := '1';  -- Unreleased
11448         END IF;
11449 
11450         --commented by tchimira to honor the firm_planned_flag entered by the user for the ER 9368251
11451         /*IF ( l_firm_planned_flag IS NOT NULL AND
11452         -- SKPATHAK :: ER: 9147951 :: 11-JAN-2010
11453         -- For task with past task dates, WOs are always firm irrespective of the profile value
11454         -- Also for the NRs which have user entered past dates, WOs should always be firm
11455         -- SKPATHAK :: 26-FEB-2010
11456         -- Reverted back the changes for making past dated NR WOs as firmed
11457         c_task_rec.past_task_start_date IS NULL AND
11458         l_firm_planned_flag = '2' ) THEN
11459           l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG     := 2; -- Planned
11460         ELSE
11461           l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG     := 1; -- Firm
11462         END IF; */
11463         --TCHIMIRA::ER 9368251 ::15-JUN-2010 :: Added to include firm-planned flag(1 is Firm and 2 is Planned)as entered by user
11464         -- If the passed firm flag is null get the value from profile.
11465         IF( l_firm_planned_flag IS NULL ) THEN
11466           l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG     :=  NVL(FND_PROFILE.value( 'AHL_PRD_FIRM_PLANNED_FLAG'), 1);
11467         ELSE
11468           l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG     := l_firm_planned_flag;
11469         END IF;
11470 
11471         IF ( c_task_rec.task_type_code = 'SUMMARY' ) THEN
11472           l_prd_workorder_tbl(idx).MASTER_WORKORDER_FLAG := 'Y';
11473         ELSE
11474           l_prd_workorder_tbl(idx).MASTER_WORKORDER_FLAG := 'N';
11475         END IF;
11476 
11477         l_prd_workorder_tbl(idx).BATCH_ID := c_visit_rec.visit_number;
11478         l_prd_workorder_tbl(idx).HEADER_ID := c_task_rec.visit_task_number;
11479         l_prd_workorder_tbl(idx).VISIT_ID          := p_visit_id;
11480         l_prd_workorder_tbl(idx).ORGANIZATION_ID   := c_visit_rec.organization_id;
11481         l_prd_workorder_tbl(idx).INVENTORY_ITEM_ID := c_task_rec.inventory_item_id ;
11482         l_prd_workorder_tbl(idx).ITEM_INSTANCE_ID  := c_task_rec.instance_id ;
11483         l_prd_workorder_tbl(idx).VISIT_TASK_ID     := c_task_rec.visit_task_id ;
11484         l_prd_workorder_tbl(idx).VISIT_TASK_NUMBER := c_task_rec.visit_task_number ;
11485         -- PRAKKUM :: PIE :: 13-OCT-2010
11486         -- Pass the Project Task Id only for work orders that don't correspond to Summary Tasks
11487         IF ( c_task_rec.task_type_code <> 'SUMMARY' ) THEN
11488           l_prd_workorder_tbl(idx).PROJECT_TASK_ID   := c_task_rec.project_task_id ;
11489           l_prd_workorder_tbl(idx).PROJECT_ID        := c_visit_rec.project_id;
11490         END IF;
11491 
11492         -- SATHAPLI::Bug 5758813, 04-Jun-2008, fix start
11493         -- For planned (route) tasks, set the workorder description  with the required format.
11494         -- l_prd_workorder_tbl(idx).JOB_DESCRIPTION   := c_task_rec.visit_task_name ;
11495         IF (c_task_rec.task_type_code IN ('SUMMARY','UNASSOCIATED')) THEN
11496           l_prd_workorder_tbl(idx).JOB_DESCRIPTION := c_task_rec.visit_task_name;
11497         ELSE
11498           -- Fetch the required format for the workorder description.
11499           OPEN get_wo_dtls_for_mrtasks_cur(c_task_rec.visit_task_id);
11500           FETCH get_wo_dtls_for_mrtasks_cur INTO l_get_wo_dtls_rec;
11501           --salogan added for bug 9754641 begin
11502           IF get_wo_dtls_for_mrtasks_cur%NOTFOUND THEN
11503                 l_get_wo_dtls_rec.workorder_description := NULL;
11504           END IF;
11505           --salogan added for bug 9754641 begin
11506           CLOSE get_wo_dtls_for_mrtasks_cur;
11507           l_prd_workorder_tbl(idx).JOB_DESCRIPTION := l_get_wo_dtls_rec.workorder_description;
11508         END IF;
11509         -- SATHAPLI::Bug 5758813, 04-Jun-2008, fix end
11510 
11511         IF c_task_rec.mr_route_id IS NOT NULL AND c_task_rec.mr_route_id <> FND_API.g_miss_num THEN
11512           OPEN c_route (c_task_rec.mr_route_id);
11513           FETCH c_route INTO l_route_id;
11514           CLOSE c_route;
11515           l_prd_workorder_tbl(idx).ROUTE_ID := l_route_id ;
11516         ELSE
11517           l_prd_workorder_tbl(idx).ROUTE_ID := Null;
11518         END IF;
11519 
11520         IF c_task_rec.department_id IS NOT NULL
11521         AND c_task_rec.department_id <> FND_API.g_miss_num THEN
11522           l_prd_workorder_tbl(idx).DEPARTMENT_ID   := c_task_rec.department_id ;
11523         ELSE
11524           l_prd_workorder_tbl(idx).DEPARTMENT_ID   := c_visit_rec.department_id ;
11525         END IF;
11526 
11527         --If summary task, use the min,max for sub tasks
11528         IF (c_task_rec.task_type_code = 'SUMMARY') THEN
11529           OPEN get_summary_task_times_csr(c_task_rec.visit_task_id);
11530           FETCH get_summary_task_times_csr INTO l_prd_workorder_tbl(idx).SCHEDULED_START_DATE,
11531                                                 l_prd_workorder_tbl(idx).SCHEDULED_END_DATE  ;
11532           CLOSE get_summary_task_times_csr;
11533         ELSE
11534           l_prd_workorder_tbl(idx).SCHEDULED_START_DATE  := c_task_rec.START_DATE_TIME;
11535           l_prd_workorder_tbl(idx).SCHEDULED_END_DATE    := c_task_rec.END_DATE_TIME;
11536         END IF;
11537         /*NR-MR Changes*/
11538         l_curr_task_id := c_task_rec.visit_task_id;
11539       END IF;
11540       FETCH c_task INTO c_task_rec;
11541     END LOOP;
11542     CLOSE c_task;
11543   END IF; -- l_count
11544 
11545   IF l_prd_workorder_tbl.COUNT > 0  THEN
11546     IF (l_log_statement >= l_log_current_level) THEN
11547       fnd_log.string(l_log_statement,L_DEBUG_KEY,'Before Getting MR Relationships ');
11548     END IF;
11549 
11550     Get_MR_Relationships
11551        (
11552          p_visit_id         => p_visit_id,
11553          p_visit_number     => c_visit_rec.visit_number,
11554          p_unit_effectivity_id  =>p_unit_effectivity_id,
11555          p_module_type       => p_module_type, /*NR-MR Changes - sowsubra*/
11556          p_x_relationship_tbl => l_prd_workorder_rel_tbl
11557        );
11558 
11559     IF (l_log_statement >= l_log_current_level) THEN
11560       fnd_log.string(l_log_statement,L_DEBUG_KEY,'After Getting MR Relationships ');
11561       --fnd_log.string(l_log_statement,L_DEBUG_KEY,'Before Getting MR Dependencies ');
11562     END IF;
11563 
11564     -- Commented the below code by tchimira on 14-MAR-2012 as per the requirement stated in the bug 13695008
11565     /*Get_MR_Dependencies
11566        (
11567          p_visit_id           => p_visit_id,
11568          p_visit_number       => c_visit_rec.visit_number,
11569          p_unit_effectivity_id  =>p_unit_effectivity_id,
11570          p_module_type       => p_module_type,
11571          p_x_relationship_tbl => l_prd_workorder_rel_tbl
11572        );*/
11573 
11574     IF (l_log_statement >= l_log_current_level) THEN
11575       --fnd_log.string(l_log_statement,L_DEBUG_KEY,'After Getting MR Dependencies ');
11576       fnd_log.string(l_log_statement,L_DEBUG_KEY,'Before calling AHL_PRD_WORKORDER_PVT.Process_Jobs ');
11577     END IF;
11578 
11579     AHL_PRD_WORKORDER_PVT.Process_Jobs
11580      (
11581           p_api_version          => p_api_version,
11582           p_init_msg_list        => p_init_msg_list,
11583           p_commit               => FND_API.G_FALSE,
11584           p_validation_level     => p_validation_level,
11585           p_default              => FND_API.G_TRUE,
11586           p_module_type          => p_module_type,
11587           x_return_status        => l_return_status,
11588           x_msg_count            => x_msg_count,
11589           x_msg_data             => x_msg_data,
11590           p_x_prd_workorder_tbl  => l_prd_workorder_tbl,
11591           p_prd_workorder_rel_tbl=> l_prd_workorder_rel_tbl
11592      );
11593 
11594     IF (l_log_statement >= l_log_current_level) THEN
11595       fnd_log.string(l_log_statement,L_DEBUG_KEY,'After calling AHL_PRD_WORKORDER_PVT.Process_Jobs - l_return_status : '||l_return_status);
11596     END IF;
11597 
11598     IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
11599       IF (l_log_statement >= l_log_current_level) THEN
11600         fnd_log.string(l_log_statement,L_DEBUG_KEY,'Errors from process_jobs API : ' || x_msg_count );
11601       END IF;
11602       RAISE Fnd_Api.g_exc_error;
11603     END IF;
11604 
11605     -- SATHAPLI::Bug 5758813, 04-Jun-2008, fix start
11606     -- Update the project tasks' (corresponding to the visit tasks) start and end date with those of the workorders' created above.
11607     IF (l_log_statement >= l_log_current_level) THEN
11608       fnd_log.string(l_log_statement, l_debug_key, 'Before calling Update_Project_Task_Times.');
11609     END IF;
11610 
11611     Update_Project_Task_Times(
11612       p_prd_workorder_tbl => l_prd_workorder_tbl,
11613       p_commit            => 'F',
11614       x_return_status     => l_return_status,
11615       x_msg_count         => x_msg_count,
11616       x_msg_data          => x_msg_data
11617     );
11618 
11619     IF (l_log_statement >= l_log_current_level) THEN
11620       fnd_log.string(l_log_statement, l_debug_key, 'After calling Update_Project_Task_Times. x_return_status => '||x_return_status);
11621     END IF;
11622 
11623     IF (l_return_status = FND_API.G_RET_STS_ERROR) THEN
11624       RAISE FND_API.G_EXC_ERROR;
11625     ELSIF (l_return_status = FND_API.G_RET_STS_UNEXP_ERROR) THEN
11626       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
11627     END IF;
11628     -- SATHAPLI::Bug 5758813, 04-Jun-2008, fix end
11629   END IF; -- To find if the visit has any tasks
11630 
11631   -- Update the status of all the tasks for this given UE to RELEASED
11632   OPEN c_task(p_visit_id, p_unit_effectivity_id);
11633   FETCH c_task INTO c_task_rec;
11634   WHILE c_task%FOUND
11635   LOOP
11636       UPDATE AHL_VISIT_TASKS_B
11637       SET STATUS_CODE = 'RELEASED',
11638           OBJECT_VERSION_NUMBER = OBJECT_VERSION_NUMBER + 1,
11639           --TCHIMIRA::BUG 9222622 ::15-DEC-2009::UPDATE WHO COLUMNS
11640           LAST_UPDATE_DATE      = SYSDATE,
11641           LAST_UPDATED_BY       = Fnd_Global.USER_ID,
11642           LAST_UPDATE_LOGIN     = Fnd_Global.LOGIN_ID
11643       WHERE VISIT_ID = p_visit_id
11644       AND VISIT_TASK_ID = c_task_rec.visit_task_id
11645       AND STATUS_CODE = 'PLANNING';
11646 
11647       l_visit_task_for_rpr_calc := c_task_rec.visit_task_id;
11648 
11649       FETCH c_task INTO c_task_rec;
11650   END LOOP;
11651   CLOSE c_task;
11652 
11653   -- Update visit status to RELEASED only if no other change of the visit
11654   -- needs to be pushed to production
11655   OPEN c_visit_task_exists(c_visit_rec.visit_id);
11656   FETCH c_visit_task_exists INTO l_dummy;
11657 
11658   OPEN c_get_wo_details(c_visit_rec.visit_id);
11659   FETCH c_get_wo_details into c_get_wo_details_rec;
11660   IF (c_visit_task_exists%NOTFOUND and
11661   c_visit_rec.start_date_time = c_get_wo_details_rec.scheduled_start_date and
11662   c_visit_rec.close_date_time = c_get_wo_details_rec.scheduled_completion_date) THEN
11663       UPDATE ahl_visits_b
11664       SET status_code = 'RELEASED',
11665           object_version_number = object_version_number + 1,
11666           --TCHIMIRA::BUG 9222622 ::15-DEC-2009::UPDATE WHO COLUMNS
11667           LAST_UPDATE_DATE      = SYSDATE,
11668           LAST_UPDATED_BY       = Fnd_Global.USER_ID,
11669           LAST_UPDATE_LOGIN     = Fnd_Global.LOGIN_ID
11670       WHERE visit_id = c_visit_rec.visit_id;
11671 
11672       IF (l_log_statement >= l_log_current_level) THEN
11673         fnd_log.string(l_log_statement,L_DEBUG_KEY,'Before AHL_VWP_RULES_PVT.Update_Visit_Task_Flag Call');
11674       END IF;
11675 
11676       IF c_visit_rec.any_task_chg_flag = 'Y' THEN
11677           AHL_VWP_RULES_PVT.Update_Visit_Task_Flag
11678                 (p_visit_id      => c_visit_rec.visit_id,
11679                  p_flag          => 'N',
11680                  x_return_status => x_return_status);
11681       END IF;
11682 
11683       IF (l_log_statement >= l_log_current_level) THEN
11684         fnd_log.string(l_log_statement,L_DEBUG_KEY,'After AHL_VWP_RULES_PVT.Update_Visit_Task_Flag Call');
11685       END IF;
11686   END IF;
11687 
11688   /* MANESING::Bug 13713141, 16-Apr-2012, For Component Visits, Repair Batch status should also
11689    * change similar to the way Visit status changes as Repair Batches are like mini-visits.
11690    * So, if all tasks under the Repair Batch are P2P, then its status should be changed to 'RELEASED'.
11691    */
11692   IF (AHL_CMP_UTIL_PKG.Is_Comp_Visit (c_visit_rec.visit_id) = 'Y') THEN
11693 
11694       -- find which Repair Batch, the selected tasks belongs to
11695       OPEN get_rpr_batch_for_task_csr (l_visit_task_for_rpr_calc);
11696       FETCH get_rpr_batch_for_task_csr INTO l_repair_batch_name;
11697       IF (get_rpr_batch_for_task_csr%FOUND) THEN
11698 
11699           -- change Repair Batch status as mentioned above
11700           OPEN chk_rpr_batch_has_planed_tasks (l_repair_batch_name);
11701           FETCH chk_rpr_batch_has_planed_tasks INTO l_dummy;
11702 
11703           -- if Repair Batch has planned tasks
11704           IF (chk_rpr_batch_has_planed_tasks%NOTFOUND) THEN
11705               IF (l_log_statement >= l_log_current_level) THEN
11706                   FND_LOG.string(l_log_statement, l_debug_key, 'Repair Batch ' || l_repair_batch_name || ' has no planned tasks.');
11707               END IF;
11708 
11709               UPDATE AHL_VISIT_TASKS_B
11710               SET    status_code           = 'RELEASED',
11711                      object_version_number = object_version_number + 1,
11712                      last_update_date      = SYSDATE,
11713                      last_updated_by       = Fnd_Global.USER_ID,
11714                      last_update_login     = Fnd_Global.LOGIN_ID
11715               WHERE  repair_batch_name = l_repair_batch_name;
11716 
11717           END IF;
11718           CLOSE chk_rpr_batch_has_planed_tasks;
11719 
11720       END IF;
11721       CLOSE get_rpr_batch_for_task_csr;
11722 
11723   END IF;  -- IF Component Visit
11724 
11725   ---------------------------End of Body-------------------------------------
11726   -- Standard check of p_commit.
11727   IF Fnd_Api.To_Boolean (p_commit) THEN
11728     COMMIT WORK;
11729   END IF;
11730 
11731   Fnd_Msg_Pub.count_and_get(
11732          p_encoded => Fnd_Api.g_false,
11733          p_count   => x_msg_count,
11734          p_data    => x_msg_data
11735    );
11736 
11737   IF (l_log_procedure >= l_log_current_level) THEN
11738     fnd_log.string(l_log_procedure,L_DEBUG_KEY||'.end','At the end of plsql procedure');
11739   END IF;
11740 
11741 EXCEPTION
11742    WHEN Fnd_Api.g_exc_error THEN
11743       ROLLBACK TO Push_MR_to_Production;
11744       x_return_status := Fnd_Api.g_ret_sts_error;
11745       Fnd_Msg_Pub.count_and_get (
11746             p_encoded => Fnd_Api.g_false,
11747             p_count   => x_msg_count,
11748             p_data    => x_msg_data
11749       );
11750    WHEN Fnd_Api.g_exc_unexpected_error THEN
11751       ROLLBACK TO Push_MR_to_Production;
11752       x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
11753       Fnd_Msg_Pub.count_and_get (
11754             p_encoded => Fnd_Api.g_false,
11755             p_count   => x_msg_count,
11756             p_data    => x_msg_data
11757       );
11758    WHEN OTHERS THEN
11759       ROLLBACK TO Push_MR_to_Production;
11760       x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
11761       IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_unexp_error)
11762     THEN
11763          Fnd_Msg_Pub.add_exc_msg (G_PKG_NAME, l_api_name);
11764       END IF;
11765       Fnd_Msg_Pub.count_and_get (
11766             p_encoded => Fnd_Api.g_false,
11767             p_count   => x_msg_count,
11768             p_data    => x_msg_data
11769       );
11770 END Push_MR_to_Production;
11771 
11772 --------------------------------------------------------------------
11773 -- PROCEDURE
11774 --    Add_MR_to_Project
11775 --
11776 -- PURPOSE
11777 --    To add Project Task for all the tasks for a given MR
11778 --    when SR tasks are created in prodution
11779 --------------------------------------------------------------------
11780 PROCEDURE Add_MR_to_Project(
11781    p_api_version         IN  NUMBER,
11782    p_init_msg_list       IN  VARCHAR2  := Fnd_Api.g_false,
11783    p_commit              IN  VARCHAR2  := Fnd_Api.g_false,
11784    p_validation_level    IN  NUMBER    := Fnd_Api.g_valid_level_full,
11785    p_module_type         IN  VARCHAR2  := Null,
11786    p_visit_id            IN  NUMBER,
11787    p_unit_effectivity_id IN  NUMBER,
11788    x_return_status       OUT NOCOPY VARCHAR2,
11789    x_msg_count           OUT NOCOPY NUMBER,
11790    x_msg_data            OUT NOCOPY VARCHAR2
11791   )
11792 IS
11793    L_API_VERSION  CONSTANT NUMBER := 1.0;
11794    L_API_NAME     CONSTANT VARCHAR2(30)  := 'Add_MR_to_Project';
11795    L_DEBUG_KEY    CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
11796    G_EXC_ERROR             EXCEPTION;
11797    l_msg_count             NUMBER;
11798    l_task_id               NUMBER;
11799    l_pa_project_id_out     NUMBER;
11800    l_msg_index_out         NUMBER;
11801    l_return_status         VARCHAR2(1);
11802    l_chk_project           VARCHAR2(1);
11803    l_proj_ref_flag         VARCHAR2(1);
11804    l_project_tsk_flag      VARCHAR2(1);
11805    l_msg_data              VARCHAR2(2000);
11806    l_pa_project_number_out VARCHAR2(25);
11807    l_commit                VARCHAR2(1) := 'F';
11808    l_init_msg_list         VARCHAR2(1) := 'F';
11809 
11810     -- To find visit related information
11811    CURSOR c_visit (x_id IN NUMBER) IS
11812     SELECT * FROM AHL_VISITS_VL
11813     WHERE VISIT_ID = x_id;
11814    c_visit_rec c_visit%ROWTYPE;
11815 
11816    -- To get all the tasks for the given UE
11817    CURSOR c_task (x_visit_id IN NUMBER, x_unit_effectivity_id IN NUMBER) IS
11818    -- SKPATHAK :: Bug 8340436 :: 23-MAR-2009
11819     -- Fetch distinct rows to avoid duplicates
11820     -- Select individual cols instead of *
11821     --SELECT * FROM AHL_VISIT_TASKS_VL
11822     SELECT distinct visit_task_id, originating_task_id, visit_id, unit_effectivity_id,
11823            status_code, service_request_id, project_task_id, visit_task_number,
11824            visit_task_name, description, object_version_number, start_date_time,
11825            end_date_time, task_type_code, cost_parent_id, service_type_code   --PRAKKUM :: PIE :: 13-OCT-2010 :: Added three more columns
11826       FROM AHL_VISIT_TASKS_VL
11827     WHERE VISIT_ID = x_visit_id
11828     AND NVL( STATUS_CODE, 'X' ) = 'PLANNING'
11829     START WITH unit_effectivity_id  = x_unit_effectivity_id
11830         AND (( originating_task_id is null AND 'SR' <> p_module_type)
11831         -- SKPATHAK :: Bug #9410052 :: 25-FEB-2010 :: Removed the condition "originating_task_id is not null"
11832             OR ( 'SR' = p_module_type
11833                  and service_request_id is not null))
11834     CONNECT BY originating_task_id = PRIOR visit_task_id
11835     ORDER by visit_task_number;  --PRAKKUM :: PIE :: 13-OCT-2010 :: Added ORDER BY clause
11836 
11837    c_task_rec c_task%ROWTYPE;
11838    l_curr_task_id   NUMBER := 0;
11839 
11840    -- PRAKKUM :: PIE :: 13-OCT-2010
11841    -- Added new cursors
11842    CURSOR get_task_number_csr (c_visit_task_id IN NUMBER) IS
11843     SELECT visit_task_number, task_type_code from ahl_visit_tasks_b
11844     where visit_task_id = c_visit_task_id;
11845 
11846    CURSOR top_task_ref_csr (c_top_project_task_id IN NUMBER) IS
11847     SELECT pm_task_reference from pa_tasks
11848     where task_id = c_top_project_task_id;
11849 
11850 
11851    -- SATHAPLI::Bug 5758813, 04-Jun-2008
11852    -- Cursor to get the required format used for the project task name and description, given a visit task.
11853    -- First part of the UNION is for the planned tasks (routes) attached to the NR.
11854    -- Second part is for the corresponding NR and MR summary tasks.
11855    CURSOR get_prj_task_dtls_cur (c_visit_task_id IN NUMBER) IS
11856    SELECT SUBSTR(NVL(ar.route_no, avt.visit_task_name), 1, 20) task_name,
11857           SUBSTR(NVL(ar.title, avt.visit_task_name), 1, 250) description
11858      FROM ahl_routes_vl ar, ahl_visit_tasks_vl avt,
11859           ahl_mr_routes mrr
11860     WHERE avt.visit_task_id         = c_visit_task_id
11861       AND NVL(avt.status_code, 'X') = 'PLANNING'
11862       AND avt.task_type_code        NOT IN ('SUMMARY', 'UNASSOCIATED')
11863       AND avt.mr_route_id           = mrr.mr_route_id (+)
11864       AND mrr.route_id              = ar.route_id (+)
11865    UNION ALL
11866    SELECT SUBSTR(NVL(amh.title, avt.visit_task_name), 1, 20) task_name,
11867           NVL(amh.title, avt.visit_task_name) description
11868      FROM ahl_mr_headers_v amh, ahl_visit_tasks_vl avt
11869     WHERE avt.visit_task_id         = c_visit_task_id
11870       AND NVL(avt.status_code, 'X') = 'PLANNING'
11871       AND avt.task_type_code        = 'SUMMARY'
11872       AND avt.summary_task_flag     = 'N'
11873       AND avt.mr_id                 = amh.mr_header_id (+);
11874 
11875    l_get_prj_task_dtls_cur_rec get_prj_task_dtls_cur%ROWTYPE;
11876 
11877    -- PRAKKUM :: PIE:FP :: 13-OCT-2010 ::
11878    -- Added local variables
11879    l_task_reference         VARCHAR2(25);
11880    l_top_task_reference     VARCHAR2(25) := NULL;
11881    l_task_num_prefix        VARCHAR2(25) := '';
11882    l_task_number            VARCHAR2(25);
11883    l_task_name              VARCHAR2(20);
11884    l_long_task_name         VARCHAR2(250);
11885    l_task_description       VARCHAR2(250);
11886    l_task_start_date        DATE;
11887    l_task_completion_date   DATE;
11888    l_parent_task_reference  VARCHAR2(25);
11889    l_service_type_code      VARCHAR2(30);
11890    l_temp_task_number       NUMBER;
11891    l_temp_task_type         VARCHAR2(30);
11892    l_new_structure_flag     VARCHAR2(1);
11893 
11894 
11895 BEGIN
11896    --------------------- initialize -----------------------
11897   SAVEPOINT Add_MR_to_Project;
11898 
11899   IF (l_log_procedure >= l_log_current_level) THEN
11900     fnd_log.string(l_log_procedure,L_DEBUG_KEY||'.begin','At the start of plsql procedure');
11901   END IF;
11902 
11903   -- Initialize message list if p_init_msg_list is set to TRUE.
11904   IF Fnd_Api.to_boolean(p_init_msg_list) THEN
11905     Fnd_Msg_Pub.initialize;
11906   END IF;
11907 
11908   --  Initialize API return status to success
11909   x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
11910 
11911   -- Standard call to check for call compatibility.
11912   IF NOT Fnd_Api.COMPATIBLE_API_CALL(l_api_version,
11913                                       p_api_version,
11914                                       l_api_name,G_PKG_NAME) THEN
11915     RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
11916   END IF;
11917 
11918   IF (l_log_statement >= l_log_current_level) THEN
11919     fnd_log.string(l_log_statement,L_DEBUG_KEY,'Unit Effectivity ID = ' || p_unit_effectivity_id);
11920   END IF;
11921 
11922   ----------------------------------------- Start of Body ----------------------------------
11923   -- To check Project responsibilites
11924 
11925   -- Begin changes by jaramana on Mar 4, 2008 for bug 6788115 (FP of 6759574)
11926   -- As per update from ravichandran.velusamy in Projects team in the bug 6759574,
11927   -- the call to PA_INTERFACE_UTILS_PUB.Set_Global_Info may be removed.
11928   -- AHL_VWP_RULES_PVT.Check_Proj_Responsibility calls PA_INTERFACE_UTILS_PUB.Set_Global_Info
11929 /***
11930   AHL_VWP_RULES_PVT.Check_Proj_Responsibility
11931            (x_check_project    => l_chk_project,
11932             x_return_status    => l_return_status);
11933 
11934   IF l_return_status <> Fnd_Api.G_RET_STS_SUCCESS THEN
11935     x_return_status := l_return_status;
11936     RAISE G_EXC_ERROR;
11937   END IF;
11938 
11939 ***/
11940   l_chk_project := 'Y';
11941   -- End changes by jaramana on Mar 4, 2008 for bug 6788115 (FP of 6759574)
11942 
11943   IF (l_log_statement >= l_log_current_level) THEN
11944     fnd_log.string(l_log_statement,L_DEBUG_KEY,'l_chk_project = ' || l_chk_project);
11945   END IF;
11946 
11947   IF l_chk_project = 'Y' THEN
11948     ----------------------------------------- Cursor ----------------------------------
11949     OPEN c_Visit(p_visit_id);
11950     FETCH c_visit INTO c_visit_rec;
11951     CLOSE c_Visit;
11952 
11953     -- PRAKKUM :: PIE Changes :: 13-OCT-2010 :: START
11954     IF (c_visit_rec.top_project_task_id is not null) THEN
11955       OPEN top_task_ref_csr(c_visit_rec.top_project_task_id);
11956       FETCH top_task_ref_csr INTO l_top_task_reference;
11957       CLOSE top_task_ref_csr;
11958       l_task_num_prefix := c_visit_rec.visit_number || '-';
11959     END IF;
11960 
11961     IF (l_log_statement >= l_log_current_level) THEN
11962       fnd_log.string(l_log_statement, L_DEBUG_KEY, 'Before calling Use_New_Task_Structure.');
11963     END IF;
11964 
11965     Use_New_Task_Structure
11966       ( p_visit_id            =>  p_visit_id,
11967         x_new_structure_flag  =>  l_new_structure_flag
11968        );
11969     IF (l_log_statement >= l_log_current_level) THEN
11970        fnd_log.string(l_log_statement, L_DEBUG_KEY, 'Returned Success from Use_New_Task_Structure.');
11971     END IF;
11972 
11973     IF l_new_structure_flag = 'Y' THEN
11974       OPEN c_task(p_visit_id, p_unit_effectivity_id);
11975       FETCH c_task INTO c_task_rec;
11976       WHILE c_task%FOUND
11977       LOOP
11978         IF (c_task_rec.PROJECT_TASK_ID IS NULL) THEN
11979           IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
11980             fnd_log.string(fnd_log.level_statement,  L_DEBUG_KEY, 'Inside Loop: c_task_rec.visit_task_number = ' || c_task_rec.visit_task_number ||
11981                 ', c_task_rec.visit_task_id = ' || c_task_rec.visit_task_id ||
11982                 ', c_task_rec.originating_task_id = ' || c_task_rec.originating_task_id ||
11983                 ', c_task_rec.unit_effectivity_id = ' || c_task_rec.unit_effectivity_id ||
11984                 ', c_task_rec.service_request_id = ' || c_task_rec.service_request_id);
11985           END IF;
11986 
11987           -- SATHAPLI::Bug 5758813, 04-Jun-2008 - Fetch the required format for the project task's name and description.
11988           OPEN get_prj_task_dtls_cur(c_task_rec.visit_task_id);
11989           FETCH get_prj_task_dtls_cur INTO l_get_prj_task_dtls_cur_rec;
11990           CLOSE get_prj_task_dtls_cur;
11991 
11992           IF c_task_rec.task_type_code <> 'SUMMARY' THEN
11993             -- Not a Summary task: First create a rollup task
11994             l_task_reference       := l_task_num_prefix || c_task_rec.visit_task_number || '-1';
11995             l_task_name            := SUBSTRB(l_get_prj_task_dtls_cur_rec.task_name,1,15) || '-1';
11996             l_long_task_name       := l_get_prj_task_dtls_cur_rec.task_name || '-1';
11997             l_task_number          := l_task_reference;
11998             --SKPATHAK :: FP:PIE :: 21-DEC-2010 :: Pass task dates itself for NR tasks so as to ensure that parent project task start date is not after child's
11999             l_task_start_date      := trunc(c_task_rec.start_date_time);
12000             --l_task_start_date      := trunc(c_visit_rec.start_date_time); -- Pass visit date for Rollup tasks
12001             l_task_completion_date := null;
12002             IF (c_task_rec.cost_parent_id IS NOT NULL) THEN
12003               OPEN get_task_number_csr(c_task_rec.cost_parent_id);
12004               FETCH get_task_number_csr INTO l_temp_task_number, l_temp_task_type;
12005               CLOSE get_task_number_csr;
12006               l_parent_task_reference := l_task_num_prefix || l_temp_task_number;
12007             ELSE
12008               l_parent_task_reference := l_top_task_reference;
12009             END IF;
12010             l_service_type_code    :=  null;
12011             -- Add the Rollup task to the project
12012             Add_Task_To_Project_Int(
12013               p_project_id            => c_visit_rec.PROJECT_ID,
12014               p_project_number        => c_visit_rec.visit_number,
12015               p_task_number           => l_task_number,
12016               p_task_reference        => l_task_reference,
12017               p_task_name             => l_task_name,
12018               p_long_task_name        => l_long_task_name,
12019               p_task_description      => null,
12020               p_task_start_date       => l_task_start_date,
12021               p_task_completion_date  => l_task_completion_date,
12022               p_parent_task_reference => l_parent_task_reference,
12023               p_service_type_code     => l_service_type_code,
12024               x_return_status         => l_return_status,
12025               x_msg_count             => l_msg_count,
12026               x_msg_data              => l_msg_data,
12027               x_task_id               => l_task_id);
12028 
12029 
12030             IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
12031               fnd_log.string(fnd_log.level_statement, L_DEBUG_KEY, 'After calling Add_Task_To_Project_Int: -  l_return_status: ' || l_return_status);
12032             END IF;
12033 
12034             IF (l_return_status <> 'S') THEN
12035               IF (fnd_msg_pub.count_msg > 0 ) THEN
12036                 FOR i IN 1..fnd_msg_pub.count_msg
12037                 LOOP
12038                   fnd_msg_pub.get(p_msg_index => i,
12039                                   p_encoded   => 'F',
12040                                   p_data      => l_msg_data,
12041                                   p_msg_index_out => l_msg_index_out);
12042                   IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
12043                     fnd_log.string(fnd_log.level_statement, L_DEBUG_KEY, 'Error: ' ||l_msg_data);
12044                   END IF;
12045                 END LOOP;
12046               ELSE
12047                 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
12048                   fnd_log.string(fnd_log.level_statement, L_DEBUG_KEY, 'Another Error: '||l_msg_data);
12049                 END IF;
12050               END IF;
12051               RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
12052             END IF;
12053 
12054             -- Then add the non-summary (Route or Unassociated) task under the rollup task
12055             l_task_reference        := l_task_num_prefix || c_task_rec.visit_task_number;
12056             l_task_name             := SUBSTRB(l_get_prj_task_dtls_cur_rec.task_name,1,15);
12057             l_long_task_name        := l_get_prj_task_dtls_cur_rec.task_name;
12058             l_task_number           := l_task_reference;
12059             l_task_start_date       := trunc(c_task_rec.start_date_time);
12060             l_task_completion_date  := null;
12061             l_task_description      := SUBSTRB(l_get_prj_task_dtls_cur_rec.description,1,250);
12062             l_parent_task_reference := l_task_num_prefix || c_task_rec.visit_task_number || '-1';  -- Set the rollup task as the parent for this task
12063 
12064           ELSE
12065               -- Summary Task
12066             l_task_reference        := l_task_num_prefix || c_task_rec.visit_task_number;
12067             l_task_name             := SUBSTRB(l_get_prj_task_dtls_cur_rec.task_name,1,15);
12068             l_long_task_name        := l_get_prj_task_dtls_cur_rec.task_name;
12069             l_task_number           := l_task_reference;
12070             --SKPATHAK :: FP:PIE :: 21-DEC-2010 :: Pass task dates itself for NR tasks so as to ensure that parent project task start date is not after child's
12071             --l_task_start_date       := trunc(c_visit_rec.start_date_time);--Pass visit start date to avoid error from Projects
12072             l_task_start_date      := trunc(c_task_rec.start_date_time);
12073             l_task_completion_date  := null;
12074             l_task_description      := SUBSTRB(l_get_prj_task_dtls_cur_rec.description,1,250);
12075             IF (c_task_rec.cost_parent_id IS NOT NULL) THEN
12076               OPEN get_task_number_csr(c_task_rec.cost_parent_id);
12077               FETCH get_task_number_csr INTO l_temp_task_number, l_temp_task_type;
12078               CLOSE get_task_number_csr;
12079               IF (l_temp_task_type IS NOT NULL AND l_temp_task_type <> 'SUMMARY') THEN
12080                 -- This is a SR: Make the rollup of the route/unassociated task as the parent
12081                 l_parent_task_reference := l_task_num_prefix || l_temp_task_number || '-1';
12082               ELSE
12083                 -- Set the parent
12084                 l_parent_task_reference := l_task_num_prefix || l_temp_task_number;
12085               END IF;
12086             ELSE
12087               l_parent_task_reference := l_top_task_reference;
12088             END IF;
12089           END IF;
12090 
12091           l_service_type_code    :=  c_task_rec.service_type_code;
12092           -- Now add the Route/Unassociated/Summary Task to the Project
12093           Add_Task_To_Project_Int(
12094               p_project_id            => c_visit_rec.PROJECT_ID,
12095               p_project_number        => c_visit_rec.visit_number,
12096               p_task_number           => l_task_number,
12097               p_task_reference        => l_task_reference,
12098               p_task_name             => l_task_name,
12099               p_long_task_name        => l_long_task_name,
12100               p_task_description      => l_task_description,
12101               p_task_start_date       => l_task_start_date,
12102               p_task_completion_date  => l_task_completion_date,
12103               p_parent_task_reference => l_parent_task_reference,
12104               p_service_type_code     => l_service_type_code,
12105               x_return_status         => l_return_status,
12106               x_msg_count             => l_msg_count,
12107               x_msg_data              => l_msg_data,
12108               x_task_id               => l_task_id);
12109           IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
12110             fnd_log.string(fnd_log.level_statement, L_DEBUG_KEY, 'After calling Add_Task_To_Project_Int: -  l_return_status: ' || l_return_status);
12111           END IF;
12112           IF (l_return_status <> 'S') THEN
12113             IF (fnd_msg_pub.count_msg > 0 ) THEN
12114               FOR i IN 1..fnd_msg_pub.count_msg
12115               LOOP
12116                 fnd_msg_pub.get(p_msg_index => i,
12117                                 p_encoded   => 'F',
12118                                 p_data      => l_msg_data,
12119                                 p_msg_index_out => l_msg_index_out);
12120                 IF (l_log_statement >= l_log_current_level) THEN
12121                   fnd_log.string(l_log_statement,L_DEBUG_KEY,': Error' ||l_msg_data);
12122                 END IF;
12123               END LOOP;
12124             ELSE
12125               IF (l_log_statement >= l_log_current_level) THEN
12126                 fnd_log.string(l_log_statement,L_DEBUG_KEY,': Another Error ='||l_msg_data);
12127               END IF;
12128             END IF;
12129             RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
12130           ELSE
12131             UPDATE AHL_VISIT_TASKS_B SET PROJECT_TASK_ID = l_task_id,
12132                    OBJECT_VERSION_NUMBER = c_task_rec.object_version_number + 1,
12133                    --TCHIMIRA::BUG 9222622 ::15-DEC-2009::UPDATE WHO COLUMNS
12134                    LAST_UPDATE_DATE      = SYSDATE,
12135                    LAST_UPDATED_BY       = Fnd_Global.USER_ID,
12136                    LAST_UPDATE_LOGIN     = Fnd_Global.LOGIN_ID
12137             WHERE VISIT_TASK_ID = c_task_rec.visit_task_id;
12138             IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
12139               fnd_log.string(l_log_statement,L_DEBUG_KEY,'Updated AHL_VISIT_TASKS_B: c_task_rec.visit_task_number = ' || c_task_rec.visit_task_number ||
12140                     ', c_task_rec.visit_task_id = ' || c_task_rec.visit_task_id ||
12141                     ', c_task_rec.originating_task_id = ' || c_task_rec.originating_task_id ||
12142                     ', c_task_rec.unit_effectivity_id = ' || c_task_rec.unit_effectivity_id ||
12143                     ', c_task_rec.service_request_id = ' || c_task_rec.service_request_id);
12144             END IF;
12145           END IF;
12146         END IF;  -- c_task_rec.PROJECT_TASK_ID is null
12147         FETCH c_task INTO c_task_rec;
12148       END LOOP;
12149       CLOSE c_task;
12150     ELSE -- if l_new_structure_flag = 'Y'
12151       OPEN c_task(p_visit_id, p_unit_effectivity_id);
12152       FETCH c_task INTO c_task_rec;
12153       WHILE c_task%FOUND
12154       LOOP
12155         IF (c_task_rec.PROJECT_TASK_ID IS NULL) THEN
12156           IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
12157             fnd_log.string(fnd_log.level_statement,  L_DEBUG_KEY, 'Inside Loop: c_task_rec.visit_task_number = ' || c_task_rec.visit_task_number ||
12158                 ', c_task_rec.visit_task_id = ' || c_task_rec.visit_task_id ||
12159                 ', c_task_rec.originating_task_id = ' || c_task_rec.originating_task_id ||
12160                 ', c_task_rec.unit_effectivity_id = ' || c_task_rec.unit_effectivity_id ||
12161                 ', c_task_rec.service_request_id = ' || c_task_rec.service_request_id);
12162           END IF;
12163 
12164           OPEN get_prj_task_dtls_cur(c_task_rec.visit_task_id);
12165           FETCH get_prj_task_dtls_cur INTO l_get_prj_task_dtls_cur_rec;
12166           CLOSE get_prj_task_dtls_cur;
12167 
12168           l_task_reference       := c_task_rec.visit_task_number;
12169           l_task_name            := SUBSTRB(l_get_prj_task_dtls_cur_rec.task_name,1,15);
12170           l_long_task_name       := l_get_prj_task_dtls_cur_rec.task_name;
12171           l_task_number          := l_task_reference;
12172           l_task_start_date      := trunc(c_task_rec.start_date_time);
12173           l_task_completion_date := trunc(c_task_rec.end_date_time);
12174           l_parent_task_reference:= null;
12175           l_task_description     := SUBSTRB(l_get_prj_task_dtls_cur_rec.description,1,250);
12176           l_service_type_code    := null;
12177 
12178           -- Now add the Route/Unassociated/Summary Task to the Project
12179           Add_Task_To_Project_Int(
12180               p_project_id            => c_visit_rec.PROJECT_ID,
12181               p_project_number        => c_visit_rec.visit_number,
12182               p_task_number           => l_task_number,
12183               p_task_reference        => l_task_reference,
12184               p_task_name             => l_task_name,
12185               p_long_task_name        => l_long_task_name,
12186               p_task_description      => l_task_description,
12187               p_task_start_date       => l_task_start_date,
12188               p_task_completion_date  => l_task_completion_date,
12189               p_parent_task_reference => l_parent_task_reference,
12190               p_service_type_code     => l_service_type_code,
12191               x_return_status         => l_return_status,
12192               x_msg_count             => l_msg_count,
12193               x_msg_data              => l_msg_data,
12194               x_task_id               => l_task_id);
12195 
12196           IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
12197             fnd_log.string(fnd_log.level_statement, L_DEBUG_KEY, 'After calling Add_Task_To_Project_Int: -  l_return_status: ' || l_return_status);
12198           END IF;
12199           IF (l_return_status <> 'S') THEN
12200             IF (fnd_msg_pub.count_msg > 0 ) THEN
12201               FOR i IN 1..fnd_msg_pub.count_msg
12202               LOOP
12203                 fnd_msg_pub.get(p_msg_index => i,
12204                                 p_encoded   => 'F',
12205                                 p_data      => l_msg_data,
12206                                 p_msg_index_out => l_msg_index_out);
12207                 IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
12208                   fnd_log.string(fnd_log.level_statement, L_DEBUG_KEY, 'Error: ' ||l_msg_data);
12209                 END IF;
12210               END LOOP;
12211             ELSE
12212               IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
12213                 fnd_log.string(fnd_log.level_statement, L_DEBUG_KEY, 'Another Error: '||l_msg_data);
12214               END IF;
12215             END IF;
12216             RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
12217           ELSE
12218             UPDATE AHL_VISIT_TASKS_B SET PROJECT_TASK_ID = l_task_id,
12219                    OBJECT_VERSION_NUMBER = c_task_rec.object_version_number + 1
12220             WHERE VISIT_TASK_ID = c_task_rec.visit_task_id;
12221             IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
12222               fnd_log.string(fnd_log.level_statement,  L_DEBUG_KEY, 'Updated AHL_VISIT_TASKS_B: c_task_rec.visit_task_number = ' || c_task_rec.visit_task_number ||
12223                     ', c_task_rec.visit_task_id = ' || c_task_rec.visit_task_id ||
12224                     ', c_task_rec.originating_task_id = ' || c_task_rec.originating_task_id ||
12225                     ', c_task_rec.unit_effectivity_id = ' || c_task_rec.unit_effectivity_id ||
12226                     ', c_task_rec.service_request_id = ' || c_task_rec.service_request_id);
12227             END IF;
12228           END IF;
12229         END IF;  -- c_task_rec.PROJECT_TASK_ID is null
12230         FETCH c_task INTO c_task_rec;
12231       END LOOP;
12232       CLOSE c_task;
12233     END IF; -- l_new_structure_flag = 'Y'
12234     -- PRAKKUM :: PIE Changes :: 13-OCT-2010 :: END
12235   END IF; -- l_chk_project
12236 
12237   ---------------------------End of Body-------------------------------------
12238   -- Standard check of p_commit.
12239 
12240   IF Fnd_Api.To_Boolean ( p_commit ) THEN
12241      COMMIT WORK;
12242   END IF;
12243 
12244   Fnd_Msg_Pub.count_and_get(
12245          p_encoded => Fnd_Api.g_false,
12246          p_count   => x_msg_count,
12247          p_data    => x_msg_data
12248    );
12249 
12250   IF (l_log_procedure >= l_log_current_level) THEN
12251     fnd_log.string(l_log_procedure,L_DEBUG_KEY||'.end','At the end of plsql procedure');
12252   END IF;
12253 
12254 EXCEPTION
12255    WHEN Fnd_Api.g_exc_error THEN
12256       ROLLBACK TO Add_MR_to_Project;
12257       x_return_status := Fnd_Api.g_ret_sts_error;
12258       Fnd_Msg_Pub.count_and_get (
12259             p_encoded => Fnd_Api.g_false,
12260             p_count   => x_msg_count,
12261             p_data    => x_msg_data
12262       );
12263    WHEN Fnd_Api.g_exc_unexpected_error THEN
12264       ROLLBACK TO Add_MR_to_Project;
12265       x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
12266       Fnd_Msg_Pub.count_and_get (
12267             p_encoded => Fnd_Api.g_false,
12268             p_count   => x_msg_count,
12269             p_data    => x_msg_data
12270       );
12271    WHEN OTHERS THEN
12272       ROLLBACK TO Add_MR_to_Project;
12273       x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
12274       IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_unexp_error)
12275     THEN
12276          Fnd_Msg_Pub.add_exc_msg (G_PKG_NAME, l_api_name);
12277       END IF;
12278       Fnd_Msg_Pub.count_and_get (
12279             p_encoded => Fnd_Api.g_false,
12280             p_count   => x_msg_count,
12281             p_data    => x_msg_data
12282       );
12283 END Add_MR_to_Project;
12284 
12285 -- AnRaj: Added as part of Material Requirement Aggrgation Enhancement, Bug#5303378
12286 -- Call aggregate_material_requirements for a visit
12287 -- If a visit task has more than one requirement for the same item, then this method will aggregate
12288 -- all those requirements into a single requirement
12289 PROCEDURE Aggregate_Material_Reqrs
12290           (p_api_version      IN         NUMBER,
12291            p_init_msg_list    IN         VARCHAR2,
12292            p_commit           IN         VARCHAR2,
12293            p_validation_level IN         NUMBER,
12294            p_module_type      IN         VARCHAR2,
12295            p_visit_id         IN         NUMBER,
12296            x_return_status    OUT NOCOPY VARCHAR2,
12297            x_msg_count        OUT NOCOPY NUMBER,
12298            x_msg_data         OUT NOCOPY VARCHAR2
12299           )
12300 IS
12301    -- get all tasks in planning status for a visit
12302    CURSOR   get_visit_tasks_cur(c_visit_id NUMBER) IS
12303     SELECT visit_task_id
12304     FROM ahl_visit_tasks_b
12305     WHERE visit_id = c_visit_id
12306      AND NVL(status_code,'X') = 'PLANNING';
12307 
12308    -- Declare local variables
12309    l_api_version  CONSTANT NUMBER        := 1.0;
12310    l_api_name     CONSTANT VARCHAR2(30)  := 'Aggregate_Material_Reqrs';
12311    L_DEBUG_KEY    CONSTANT VARCHAR2(100) := 'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name;
12312    l_init_msg_list         VARCHAR2(1)   := 'F';
12313    l_return_status         VARCHAR2(1);
12314    l_msg_count             NUMBER;
12315    l_msg_data              VARCHAR2(2000);
12316    l_visit_task_id         NUMBER;
12317    l_reservation_id        NUMBER;
12318    l_scheduled_matrial_id  NUMBER;
12319    l_previous_item         NUMBER := NULL;
12320 
12321 BEGIN
12322    -- Standard start of API savepoint
12323    SAVEPOINT AGGREGATE_MATERIAL_REQRS;
12324 
12325    -- Initialize return status to success before any code logic/validation
12326    x_return_status:= FND_API.G_RET_STS_SUCCESS;
12327 
12328    -- Standard call to check for call compatibility
12329    IF NOT FND_API.COMPATIBLE_API_CALL (l_api_version, p_api_version, l_api_name, G_PKG_NAME)
12330    THEN
12331       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
12332    END IF;
12333 
12334    -- Initialize message list if p_init_msg_list = FND_API.G_TRUE
12335    IF FND_API.TO_BOOLEAN(p_init_msg_list)
12336    THEN
12337       FND_MSG_PUB.INITIALIZE;
12338    END IF;
12339 
12340    IF (l_log_procedure >= l_log_current_level) THEN
12341       fnd_log.string(l_log_procedure,
12342                      L_DEBUG_KEY,
12343                      'At the start of PL SQL procedure. Visit Id = ' || p_visit_id);
12344    END IF;
12345 
12346    OPEN get_visit_tasks_cur(p_visit_id);
12347    LOOP
12348       FETCH get_visit_tasks_cur INTO l_visit_task_id;
12349       EXIT WHEN get_visit_tasks_cur%NOTFOUND;
12350       IF (l_log_statement >= l_log_current_level) THEN
12351          fnd_log.string(l_log_statement,
12352                         L_DEBUG_KEY,
12353                         'Before calling AGGREGATE_TASK_MATERIAL_REQRS for Visit Task Id: ' || l_visit_task_id);
12354       END IF;
12355 
12356       AHL_VWP_PROJ_PROD_PVT.Aggregate_Task_Material_Reqrs
12357         (p_api_version      => p_api_version,
12358          p_init_msg_list    => p_init_msg_list,
12359          p_commit           => p_commit,
12360          p_validation_level => p_validation_level,
12361          p_module_type      => p_module_type,
12362          p_task_id          => l_visit_task_id,
12363          p_rel_tsk_flag     => 'N',
12364          x_return_status    => l_return_status,
12365          x_msg_count        => l_msg_count,
12366          x_msg_data         => l_msg_data
12367         );
12368 
12369       IF (l_log_statement >= l_log_current_level) THEN
12370          fnd_log.string(l_log_statement,
12371                         L_DEBUG_KEY,
12372                         'After calling AGGREGATE_TASK_MATERIAL_REQRS for Visit Task Id: ' ||
12373                         l_visit_task_id || '. Return Status = '|| l_return_status);
12374       END IF;
12375 
12376       IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
12377          x_msg_count := FND_MSG_PUB.count_msg;
12378          IF (l_log_statement >= l_log_current_level) THEN
12379             fnd_log.string(l_log_statement,
12380                            L_DEBUG_KEY,
12381                            'Errors from AGGREGATE_TASK_MATERIAL_REQRS. Message count: ' || x_msg_count);
12382          END IF;
12383          IF l_return_status = FND_API.G_RET_STS_ERROR THEN
12384             RAISE FND_API.G_EXC_ERROR;
12385          ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
12386             RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
12387          END IF;
12388       END IF;
12389 
12390    END LOOP;
12391    CLOSE get_visit_tasks_cur;
12392 END Aggregate_Material_Reqrs;
12393 
12394 -------------------------------------------------------------------
12395 --  Procedure name : Aggregate_Task_Material_Reqrs
12396 --  Type           : Private
12397 --  Function       : Find the total requirment of a specific
12398 --                   item at the task level
12399 --  Parameters     :
12400 --
12401 --  Standard OUT Parameters :
12402 --      x_return_status OUT  VARCHAR2 Required
12403 --      x_msg_count     OUT  NUMBER   Required
12404 --      x_msg_data      OUT  VARCHAR2 Required
12405 --
12406 --  Aggregate_Task_Material_Reqrs Parameters:
12407 --      p_task_id       IN   NUMBER   Required
12408 --
12409 --  Version :
12410 --      30 November, 2007  RNAHATA  Initial Version - 1.0
12411 -------------------------------------------------------------------
12412 PROCEDURE Aggregate_Task_Material_Reqrs
12413     (p_api_version      IN         NUMBER,
12414      p_init_msg_list    IN         VARCHAR2,
12415      p_commit           IN         VARCHAR2,
12416      p_validation_level IN         NUMBER,
12417      p_module_type      IN         VARCHAR2,
12418      p_task_id          IN         NUMBER,
12419      p_rel_tsk_flag     IN         VARCHAR2 := 'Y',
12420      x_return_status    OUT NOCOPY VARCHAR2,
12421      x_msg_count        OUT NOCOPY NUMBER,
12422      x_msg_data         OUT NOCOPY VARCHAR2
12423     )
12424 IS
12425    -- Cursor to get the duplicate material requirements
12426    -- Modified by surrkuma for Service Bulletin on 07-Jun-2011
12427    -- Added mc_header_id null check to ignore Position based requirements
12428    CURSOR get_material_reqrs_cur(c_visit_task_id NUMBER) IS
12429     SELECT UNIQUE asmt1.scheduled_material_id,
12430            asmt1.visit_id,
12431            asmt1.visit_task_id,
12432            asmt1.inventory_item_id,
12433            asmt1.requested_quantity,
12434            asmt1.scheduled_quantity,
12435            asmt1.rt_oper_material_id,
12436            asmt1.item_group_id
12437     FROM ahl_schedule_materials asmt1,
12438          ahl_Schedule_materials asmt2
12439     WHERE asmt1.visit_id = asmt2.visit_id
12440      AND asmt1.visit_task_id = asmt2.visit_task_id
12441      AND asmt1.inventory_item_id = asmt2.inventory_item_id
12442      AND NVL(asmt1.operation_code,'X') = NVL(asmt2.operation_code,'X')
12443      AND asmt1.scheduled_material_id <> asmt2.scheduled_material_id
12444      AND NVL(asmt1.status,'X') = 'ACTIVE'
12445      AND NVL(asmt2.status,'X') = 'ACTIVE'
12446      AND asmt1.visit_task_id = c_visit_task_id
12447      AND asmt1.mc_header_id IS NULL
12448      AND asmt2.mc_header_id IS NULL
12449     ORDER BY asmt1.inventory_item_id;
12450    l_material_reqrs_rec       get_material_reqrs_cur%ROWTYPE;
12451 
12452    CURSOR check_reservation_exist (c_scheduled_material_id IN NUMBER) IS
12453     SELECT reservation_id
12454     FROM mtl_reservations
12455     WHERE demand_source_line_detail = c_scheduled_material_id
12456      AND external_source_code = 'AHL';
12457 
12458    -- Declare local variables
12459    L_API_NAME    CONSTANT VARCHAR2(30)  := 'Aggregate_Task_Material_Reqrs';
12460    l_api_version CONSTANT NUMBER        := 1.0;
12461    L_DEBUG_KEY   CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
12462    l_init_msg_list        VARCHAR2(1)   := 'F';
12463    l_reservation_id       NUMBER;
12464    l_scheduled_matrial_id NUMBER;
12465    l_previous_item        NUMBER := NULL;
12466 
12467 BEGIN
12468    -- Initialize return status to success before any code logic/validation
12469    x_return_status:= FND_API.G_RET_STS_SUCCESS;
12470 
12471    IF (l_log_procedure >= l_log_current_level) THEN
12472       fnd_log.string(l_log_procedure,
12473                      L_DEBUG_KEY ||'.begin',
12474                      'At the start of PL SQL procedure. Visit Task Id = ' || p_task_id);
12475    END IF;
12476 
12477    -- Standard call to check for call compatibility
12478    IF NOT FND_API.COMPATIBLE_API_CALL (l_api_version, p_api_version, l_api_name, G_PKG_NAME)
12479    THEN
12480       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
12481    END IF;
12482 
12483    -- Initialize message list if p_init_msg_list = FND_API.G_TRUE
12484    IF FND_API.TO_BOOLEAN(p_init_msg_list)
12485    THEN
12486       FND_MSG_PUB.INITIALIZE;
12487    END IF;
12488 
12489    -- initialize the counter
12490    l_previous_item := NULL;
12491 
12492    -- For each task in status planning, get details if there mutiple requirements for the same item
12493    OPEN  get_material_reqrs_cur(p_task_id);
12494    LOOP
12495        FETCH get_material_reqrs_cur INTO l_material_reqrs_rec;
12496        EXIT  WHEN get_material_reqrs_cur%NOTFOUND;
12497 
12498        IF (l_log_statement >= l_log_current_level) THEN
12499           fnd_log.string(l_log_statement,
12500                          L_DEBUG_KEY,
12501                          'Fetching Material Requirements for task.');
12502        END IF;
12503 
12504        IF l_previous_item IS NULL THEN
12505        -- if the first duplicate occurance for a task
12506           l_scheduled_matrial_id := l_material_reqrs_rec.scheduled_material_id;
12507           IF (l_log_statement >= l_log_current_level) THEN
12508              fnd_log.string(l_log_statement,
12509                             L_DEBUG_KEY,
12510                             'First Requirement Id: ' || l_scheduled_matrial_id);
12511           END IF;
12512        ELSIF l_previous_item = l_material_reqrs_rec.inventory_item_id THEN
12513        -- merge the records
12514           IF p_rel_tsk_flag = 'Y' THEN
12515              OPEN  check_reservation_exist(l_material_reqrs_rec.scheduled_material_id);
12516              FETCH check_reservation_exist INTO l_reservation_id;
12517              IF check_reservation_exist%FOUND THEN
12518 
12519                 IF (l_log_statement >= l_log_current_level) THEN
12520                    fnd_log.string(l_log_statement,
12521                                   L_DEBUG_KEY,
12522                                   'Before calling AHL_RSV_RESERVATIONS_PVT.TRNSFR_RSRV_FOR_MATRL_REQR');
12523                    fnd_log.string(l_log_statement,
12524                                   L_DEBUG_KEY,
12525                                   'l_material_reqrs_rec.scheduled_material_id->' || l_material_reqrs_rec.scheduled_material_id);
12526                    fnd_log.string(l_log_statement,
12527                                   L_DEBUG_KEY,'l_scheduled_matrial_id->' || l_scheduled_matrial_id);
12528                 END IF;
12529 
12530                 -- Call Transfer reservations
12531                 AHL_RSV_RESERVATIONS_PVT.TRNSFR_RSRV_FOR_MATRL_REQR
12532                   (p_api_version     => l_api_version,
12533                    p_init_msg_list   => l_init_msg_list,
12534                    p_module_type     => p_module_type,
12535                    x_msg_count       => x_msg_count,
12536                    x_msg_data        => x_msg_data,
12537                    x_return_status   => x_return_status,
12538                    p_visit_task_id   => p_task_id,
12539                    p_from_mat_req_id => l_material_reqrs_rec.scheduled_material_id,
12540                    p_to_mat_req_id   => l_scheduled_matrial_id
12541                   );
12542 
12543                 IF (l_log_statement >= l_log_current_level) THEN
12544                    fnd_log.string(l_log_statement,
12545                                   L_DEBUG_KEY,
12546                                   'After calling AHL_RSV_RESERVATIONS_PVT.TRNSFR_RSRV_FOR_MATRL_REQR. Return Status = '||
12547                                   x_return_status);
12548                 END IF;
12549 
12550                 IF (x_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
12551                    x_msg_count := FND_MSG_PUB.count_msg;
12552                    IF (l_log_statement >= l_log_current_level) THEN
12553                       fnd_log.string(l_log_statement,
12554                                      L_DEBUG_KEY,
12555                                      'Errors from AHL_RSV_RESERVATIONS_PVT.TRNSFR_RSRV_FOR_MATRL_REQR. Message count: ' || x_msg_count);
12556                    END IF;
12557                    IF x_return_status = FND_API.G_RET_STS_ERROR THEN
12558                       RAISE FND_API.G_EXC_ERROR;
12559                    ELSIF x_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
12560                       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
12561                    END IF;
12562                 END IF;
12563              END IF;
12564           END IF;
12565 
12566           IF (l_log_statement >= l_log_current_level) THEN
12567              fnd_log.string(l_log_statement,
12568                             L_DEBUG_KEY,
12569                             'Updating ahl_schedule_materials with new Material Requirements');
12570           END IF;
12571 
12572           -- Add the requirements into the first record
12573           UPDATE ahl_schedule_materials
12574           SET scheduled_quantity = NVL(scheduled_quantity,0) + NVL(l_material_reqrs_rec.scheduled_quantity,0),
12575               item_group_id = NVL(item_group_id,l_material_reqrs_rec.item_group_id),
12576               requested_quantity = NVL(requested_quantity,0) +  NVL(l_material_reqrs_rec.requested_quantity,0)
12577           WHERE scheduled_material_id = l_scheduled_matrial_id;
12578 
12579           IF (l_log_statement >= l_log_current_level) THEN
12580              fnd_log.string(l_log_statement,
12581                             L_DEBUG_KEY,
12582                             'Deleting the old material requirements from table ahl_schedule_materials ');
12583           END IF;
12584 
12585           -- Mark the current row as deleted
12586           UPDATE ahl_Schedule_materials
12587           SET status = 'DELETED',requested_quantity = 0
12588           WHERE scheduled_material_id = l_material_reqrs_rec.scheduled_material_id;
12589 
12590        ELSE -- New duplicate inventory item id as material req
12591           l_scheduled_matrial_id := l_material_reqrs_rec.scheduled_material_id;
12592           IF (l_log_statement >= l_log_current_level) THEN
12593              fnd_log.string(l_log_statement,
12594                             L_DEBUG_KEY,
12595                             'New Duplicate Inventory Item Id. Requirement Id: ' || l_scheduled_matrial_id ||
12596                             ', Item Id: ' || l_material_reqrs_rec.inventory_item_id);
12597           END IF;
12598        END IF; -- not the same item
12599        -- make the current item the previous item, before reading the next record
12600        l_previous_item := l_material_reqrs_rec.inventory_item_id;
12601    END LOOP;
12602    CLOSE get_material_reqrs_cur;
12603 
12604    IF (l_log_procedure >= l_log_current_level) THEN
12605       fnd_log.string(l_log_procedure,
12606                      L_DEBUG_KEY ||'.end',
12607                      'At the end of PL SQL procedure. Return Status =' || x_return_status);
12608    END IF;
12609 
12610 END Aggregate_Task_Material_Reqrs;
12611 
12612 -- PRAKKUM :: PIE:FP :: 13-OCT-2010 :: START :: Modified this procedure
12613 -------------------------------------------------------------------
12614 --  Procedure name    : Update_Project_Task_Times
12615 --  Type              : Private
12616 --  Function          : Update the project task start/end dates
12617 --                      with the workorder schedule start/end dates
12618 --  Parameters :
12619 --  Standard IN Parameters :
12620 --      p_commit                  IN      VARCHAR2 Fnd_Api.G_FALSE
12621 --
12622 --  Update_Project_Task_Times Parameters
12623 --      p_prd_workorder_tbl       IN      AHL_PRD_WORKORDER_PVT.PRD_WORKORDER_TBL Required
12624 --
12625 --  Standard OUT Parameters :
12626 --      x_return_status           OUT     VARCHAR2     Required
12627 --      x_msg_count               OUT     NUMBER       Required
12628 --      x_msg_data                OUT     VARCHAR2     Required
12629 --
12630 --  Version :
12631 --      04 January, 2007          Bug#5758813 SOWSUBRA  Initial Version - 1.0
12632 -------------------------------------------------------------------
12633 PROCEDURE Update_Project_Task_Times
12634 (   p_prd_workorder_tbl IN AHL_PRD_WORKORDER_PVT.PRD_WORKORDER_TBL,
12635     p_commit            IN VARCHAR2  := Fnd_Api.G_FALSE,
12636     x_return_status     OUT NOCOPY VARCHAR2,
12637     x_msg_count         OUT NOCOPY NUMBER,
12638     x_msg_data          OUT NOCOPY VARCHAR2
12639 )
12640 AS
12641 
12642 l_task_in_tbl      PA_PROJECT_PUB.TASK_IN_TBL_TYPE;
12643 task_index         NUMBER;
12644 idx                NUMBER;
12645 l_project_rec      PA_PROJECT_PUB.PROJECT_IN_REC_TYPE;
12646 L_API_NAME         CONSTANT VARCHAR2(30) := 'Update_Project_Task_Times';
12647 L_DEBUG_KEY        CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
12648 l_msg_count        NUMBER;
12649 l_msg_data         VARCHAR2(2000);
12650 l_return_status    VARCHAR2(1);
12651 l_task_out         PA_PROJECT_PUB.TASK_OUT_TBL_TYPE;
12652 l_workflow_started VARCHAR2(1);
12653 l_key_members      PA_PROJECT_PUB.PROJECT_ROLE_TBL_TYPE;
12654 l_class_categories PA_PROJECT_PUB.CLASS_CATEGORY_TBL_TYPE;
12655 l_project_out      PA_PROJECT_PUB.PROJECT_OUT_REC_TYPE;
12656 
12657 -- Added by jaramana on 23-OCT-2009 for the WBS ER 8674208
12658 -- and to fix the bug 9047048
12659 l_is_wp_separate_from_fn   VARCHAR2(1);
12660 l_is_wp_versioning_enabled VARCHAR2(1);
12661 l_pass_entire_structure    VARCHAR2(1) := 'N'; -- Default to 'N';
12662 TYPE Ref_Tbl_Type IS TABLE OF VARCHAR2(30) INDEX BY BINARY_INTEGER;
12663 TYPE Desc_Tbl_Type IS TABLE OF VARCHAR2(250) INDEX BY BINARY_INTEGER;
12664 TYPE Id_Tbl_Type IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
12665 l_task_ref_tbl             Ref_Tbl_Type;
12666 l_parent_task_ref_tbl      Ref_Tbl_Type;
12667 l_task_desc_tbl            Desc_Tbl_Type;
12668 l_task_id_tbl              Id_Tbl_Type;
12669 l_parent_task_id_tbl       Id_Tbl_Type;
12670 l_vst_task_id_tbl          Id_Tbl_Type;
12671 l_task_map_tbl             Id_Tbl_Type;
12672 l_temp_index               NUMBER;
12673 
12674 -- Added by jaramana on 23-OCT-2009 for the WBS ER 8674208
12675 -- This cursor gets the task details for all the tasks in the given project
12676 CURSOR get_all_prj_tsks_csr(c_project_id IN NUMBER, c_visit_id IN NUMBER) IS
12677  SELECT CURR.TASK_ID, CURR.DESCRIPTION, CURR.PM_TASK_REFERENCE, PARENT.PM_TASK_REFERENCE PARENT_TASK_REFERENCE, VTSK.VISIT_TASK_ID
12678    , CURR.PARENT_TASK_ID PARENT_TASK_ID -- PRAKKUM :: 08-JAN-2013 :: FPBug 16481709 for BaseBug 14828418 : In reference of bug 9047048
12679    FROM PA_TASKS CURR, PA_PROJ_ELEMENT_VERSIONS PPEV, PA_TASKS PARENT, AHL_VISIT_TASKS_B VTSK
12680   WHERE CURR.PROJECT_ID = c_project_id
12681     AND PPEV.PROJ_ELEMENT_ID = CURR.TASK_ID
12682     AND PPEV.PROJECT_ID = c_project_id
12683     AND PARENT.TASK_ID (+) = CURR.PARENT_TASK_ID
12684     AND VTSK.PROJECT_TASK_ID (+) = CURR.TASK_ID
12685     AND VTSK.VISIT_ID(+) = c_visit_id
12686   ORDER BY PPEV.DISPLAY_SEQUENCE;
12687 
12688 --fetches the schedule start and completion date of workorder
12689 CURSOR get_wo_schedule_dates_cur(p_wo_id IN NUMBER) IS
12690  SELECT WDJ.SCHEDULED_START_DATE, WDJ.SCHEDULED_COMPLETION_DATE
12691  FROM WIP_DISCRETE_JOBS WDJ, AHL_WORKORDERS WO
12692  WHERE WDJ.WIP_ENTITY_ID = WO.WIP_ENTITY_ID AND
12693        WO.WORKORDER_ID   = p_wo_id;
12694 get_wo_schedule_dates_rec  get_wo_schedule_dates_cur%ROWTYPE;
12695 
12696 --fetches project task id, the task start and end date of visit task
12697 CURSOR get_task_dates_cur(p_wo_id IN NUMBER) IS
12698  SELECT AVT.PROJECT_TASK_ID, AVT.START_DATE_TIME, AVT.END_DATE_TIME,
12699         PAT.DESCRIPTION  -- Pass the old description back again
12700  FROM AHL_VISIT_TASKS_B AVT, AHL_WORKORDERS WO,
12701       PA_TASKS PAT
12702  WHERE WO.VISIT_TASK_ID = AVT.VISIT_TASK_ID AND
12703        WO.WORKORDER_ID  = p_wo_id AND
12704        PAT.TASK_ID (+) = AVT.PROJECT_TASK_ID;
12705 get_task_dates_rec  get_task_dates_cur%ROWTYPE;
12706 
12707 --fetch the project id, visit start date and visit end date
12708 CURSOR get_visit_details_cur (p_wo_id IN NUMBER) IS
12709  --TCHIMIRA::BUG:9117467::23-NOV-2009
12710  --Removed the column wo.workorder_id from the select clause
12711  SELECT av.visit_id, av.project_id, av.start_date_time, av.close_date_time, av.top_project_task_id
12712  FROM ahl_workorders wo, ahl_visits_b av
12713  WHERE WO.WORKORDER_ID  = p_wo_id
12714   AND wo.visit_id = av.visit_id;
12715   -- Changed by jaramana on 11-NOV-2009 for bug 9109020
12716   --AND wo.visit_task_id IS NULL
12717   --AND wo.master_workorder_flag = 'Y';
12718 visit_details_rec get_visit_details_cur%ROWTYPE;
12719 
12720 --Fetch the project start date
12721 CURSOR get_prj_start_date_csr (c_project_id IN NUMBER) IS
12722  SELECT start_date
12723    from pa_projects_all
12724    where project_id = c_project_id;
12725 
12726 BEGIN
12727    -- Initialize return status to success before any code logic/validation
12728    SAVEPOINT Update_Project_Task_Times;
12729 
12730    x_return_status:= FND_API.G_RET_STS_SUCCESS;
12731 
12732    IF (l_log_procedure >= l_log_current_level) THEN
12733        fnd_log.string(l_log_procedure,
12734                       L_DEBUG_KEY ||'.begin',
12735                       'At the start of PL SQL procedure. p_prd_workorder_tbl.COUNT = ' || p_prd_workorder_tbl.COUNT);
12736     END IF;
12737    --for each workorder get the schduled start/end time
12738    IF p_prd_workorder_tbl.count > 0 THEN
12739       -- Changes by jaramana on 23-OCT-2009 for the WBS ER 8674208
12740       -- and to fix the bug 9047048
12741       -- Check if using Shared Workplan Structure
12742       OPEN get_visit_details_cur(p_prd_workorder_tbl(p_prd_workorder_tbl.FIRST).workorder_id);
12743       FETCH get_visit_details_cur INTO visit_details_rec;
12744       CLOSE get_visit_details_cur;
12745       IF visit_details_rec.project_id IS NOT NULL THEN
12746         l_is_wp_separate_from_fn   := PA_PROJ_TASK_STRUC_PUB.IS_WP_SEPARATE_FROM_FN(visit_details_rec.PROJECT_ID);
12747         l_is_wp_versioning_enabled := PA_PROJ_TASK_STRUC_PUB.IS_WP_VERSIONING_ENABLED(visit_details_rec.PROJECT_ID);
12748         IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
12749           FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'visit_details_rec.project_id = ' || visit_details_rec.project_id ||
12750                         ', l_is_wp_separate_from_fn = ' || l_is_wp_separate_from_fn ||
12751                         ' and l_is_wp_versioning_enabled = ' || l_is_wp_versioning_enabled);
12752         END IF;
12753         IF (l_is_wp_separate_from_fn = 'N') THEN
12754           -- Workplan is enabled, Using Shared Structure
12755           -- In order to avoid the error with updating projects with Work Plan Structure enabled,
12756           -- just pass the task reference and the parent task reference for all existing tasks even if there is no change
12757           l_pass_entire_structure := 'Y';
12758         END IF;
12759       END IF;
12760       IF (l_pass_entire_structure = 'Y') THEN
12761         -- Need to pass ALL the tasks on account of Projects restriction
12762         -- For better performance, do bulk collect of all project task details
12763         OPEN get_all_prj_tsks_csr(c_project_id => visit_details_rec.PROJECT_ID, c_visit_id => visit_details_rec.VISIT_ID);
12764         -- PRAKKUM :: 08-JAN-2013 :: FPBug 16481709 for BaseBug 14828418 : In reference of bug 9047048
12765         FETCH get_all_prj_tsks_csr BULK COLLECT INTO l_task_id_tbl, l_task_desc_tbl, l_task_ref_tbl, l_parent_task_ref_tbl, l_vst_task_id_tbl, l_parent_task_id_tbl;
12766         CLOSE get_all_prj_tsks_csr;
12767         IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
12768           FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'Collected all Project Tasks. l_task_id_tbl.count = ' || l_task_id_tbl.count);
12769         END IF;
12770 
12771         -- For better performance, create a mapping table to get the index from p_prd_workorder_tbl given the visit_task_id
12772         FOR idx IN p_prd_workorder_tbl.FIRST..p_prd_workorder_tbl.LAST
12773         LOOP
12774           IF p_prd_workorder_tbl(idx).VISIT_TASK_ID IS NOT NULL THEN
12775             l_task_map_tbl(p_prd_workorder_tbl(idx).VISIT_TASK_ID) := idx;
12776           END IF;
12777         END LOOP;
12778         IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
12779           FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'Created Mapping Table l_task_map_tbl. l_task_map_tbl.count = ' || l_task_map_tbl.COUNT);
12780         END IF;
12781 
12782         -- Now process all Project Tasks
12783         IF l_task_id_tbl.count > 0 THEN
12784           FOR k IN 1..l_task_ref_tbl.LAST LOOP
12785             IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
12786               FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, L_DEBUG_KEY, 'k = ' || k ||
12787                  ', PA_TASK_ID = ' || l_task_id_tbl(k) ||
12788                  ', PA_PARENT_TASK_ID = ' || l_parent_task_id_tbl(k) ||
12789                  ', PM_TASK_REFERENCE = ' || l_task_ref_tbl(k) ||
12790                  ', PM_PARENT_TASK_REFERENCE = ' || l_parent_task_ref_tbl(k));
12791             END IF;
12792             l_task_in_tbl(k).PA_TASK_ID               := l_task_id_tbl(k);
12793             l_task_in_tbl(k).TASK_DESCRIPTION         := l_task_desc_tbl(k);
12794             -- PRAKKUM :: 08-JAN-2013 :: FPBug 16481709 for BaseBug 14828418 : In reference of bug 9047048
12795             IF l_task_ref_tbl(k) IS NOT NULL THEN --Project tasks created from Projects UI, wont have task_reference
12796                l_task_in_tbl(k).PM_TASK_REFERENCE        := l_task_ref_tbl(k);
12797                l_task_in_tbl(k).PM_PARENT_TASK_REFERENCE := l_parent_task_ref_tbl(k);
12798             ELSE -- Only project tasks created from Projects UI will come to this block
12799                l_task_in_tbl(k).PA_PARENT_TASK_ID        := l_parent_task_id_tbl(k);
12800             END IF;
12801 
12802             -- Check if the work order start time has been changed by EAM and if so, pass this too
12803             IF (l_vst_task_id_tbl(k) IS NOT NULL) THEN
12804               -- This project task belongs to the current visit
12805               IF (l_task_map_tbl.EXISTS(l_vst_task_id_tbl(k)) AND l_task_map_tbl(l_vst_task_id_tbl(k)) IS NOT NULL) THEN
12806                 -- The visit task exists in p_prd_workorder_tbl
12807                 l_temp_index := l_task_map_tbl(l_vst_task_id_tbl(k));
12808                 OPEN get_wo_schedule_dates_cur(p_prd_workorder_tbl(l_temp_index).workorder_id);
12809                 FETCH get_wo_schedule_dates_cur INTO get_wo_schedule_dates_rec;
12810                 CLOSE get_wo_schedule_dates_cur;
12811 
12812                 OPEN get_task_dates_cur(p_prd_workorder_tbl(l_temp_index).workorder_id);
12813                 FETCH get_task_dates_cur INTO get_task_dates_rec;
12814                 CLOSE get_task_dates_cur;
12815 
12816                 -- If different, update the task start with workorder scheduled start dates
12817                 IF (get_wo_schedule_dates_rec.scheduled_start_date <> get_task_dates_rec.start_date_time) THEN
12818                   l_task_in_tbl(k).task_start_date := trunc(get_wo_schedule_dates_rec.scheduled_start_date);
12819                 END IF;
12820                 -- PRAKKUM :: Bug 9281476 :: 25-NOV-2010
12821                 -- Populate scheduled dates also
12822                 l_task_in_tbl(k).scheduled_start_date  := trunc(get_wo_schedule_dates_rec.scheduled_start_date);
12823                 l_task_in_tbl(k).scheduled_finish_date := trunc(get_wo_schedule_dates_rec.scheduled_completion_date);
12824               END IF;  -- l_task_map_tbl check
12825             END IF;  -- l_vst_task_id_tbl NOT NULL Check
12826           END LOOP;  -- Loop on k (l_task_ref_tbl)
12827         END IF;  -- l_task_id_tbl.count > 0
12828       ELSE
12829         -- l_pass_entire_structure is 'N'
12830         task_index := 1;
12831         FOR idx IN p_prd_workorder_tbl.FIRST..p_prd_workorder_tbl.LAST
12832         LOOP
12833            IF (l_log_statement >= l_log_current_level) THEN
12834               fnd_log.string(l_log_statement,
12835                              L_DEBUG_KEY,
12836                              'Workorder Id(' || idx || '): ' || p_prd_workorder_tbl(idx).workorder_id);
12837            END IF;
12838 
12839            OPEN get_wo_schedule_dates_cur(p_prd_workorder_tbl(idx).workorder_id);
12840            FETCH get_wo_schedule_dates_cur INTO get_wo_schedule_dates_rec;
12841            CLOSE get_wo_schedule_dates_cur;
12842 
12843            OPEN get_task_dates_cur(p_prd_workorder_tbl(idx).workorder_id);
12844            FETCH get_task_dates_cur INTO get_task_dates_rec;
12845            CLOSE get_task_dates_cur;
12846 
12847            --update the task start and end dates with workorder scheduled start/end dates.
12848            -- PRAKKUM :: Bug 9281476 :: 25-NOV-2010
12849            -- Commented out the below if condition
12850            -- Pass the scheduled dates also
12851            /*IF ((get_wo_schedule_dates_rec.scheduled_start_date <> get_task_dates_rec.start_date_time) OR
12852                (get_wo_schedule_dates_rec.scheduled_completion_date <> get_task_dates_rec.end_date_time)) THEN*/
12853              -- Do NOT pass visit master WO details (for which project task id is null) for the project tasks
12854              IF get_task_dates_rec.project_task_id IS NOT NULL THEN
12855               l_task_in_tbl(task_index).scheduled_start_date  := trunc(get_wo_schedule_dates_rec.scheduled_start_date);
12856               l_task_in_tbl(task_index).scheduled_finish_date := trunc(get_wo_schedule_dates_rec.scheduled_completion_date);
12857               l_task_in_tbl(task_index).pa_task_id           := get_task_dates_rec.project_task_id;
12858               l_task_in_tbl(task_index).task_start_date      := trunc(get_wo_schedule_dates_rec.scheduled_start_date);
12859               l_task_in_tbl(task_index).task_completion_date := null;
12860               l_task_in_tbl(task_index).TASK_DESCRIPTION     := get_task_dates_rec.description;
12861 
12862               IF (l_log_statement >= l_log_current_level) THEN
12863                  fnd_log.string(l_log_statement,
12864                                 L_DEBUG_KEY,
12865                                 'task_index = ' || task_index);
12866                  fnd_log.string(l_log_statement,
12867                                 L_DEBUG_KEY,
12868                                 'pa_task_id = '|| l_task_in_tbl(task_index).pa_task_id);
12869                  fnd_log.string(l_log_statement,
12870                                 L_DEBUG_KEY,
12871                                 'task_start_date = ' || l_task_in_tbl(task_index).task_start_date);
12872                  fnd_log.string(l_log_statement,
12873                                 L_DEBUG_KEY,
12874                                 'task_completion_date = ' || l_task_in_tbl(task_index).task_completion_date);
12875               END IF;
12876               task_index := task_index + 1;
12877              END IF; -- project task id is not null
12878            --END IF;  -- Dates are not same
12879         END LOOP;  -- LOOP on p_prd_workorder_tbl
12880       END IF;  -- l_pass_entire_structure  Check
12881       -- End changes by jaramana on 23-SEP-2009 for the WBS ER 8674208 and the bug 9047048
12882    END IF;  -- p_prd_workorder_tbl.count > 0
12883 
12884    IF (l_log_statement >= l_log_current_level) THEN
12885       fnd_log.string(l_log_statement,
12886                      L_DEBUG_KEY,
12887                      'l_task_in_tbl.count = ' || l_task_in_tbl.count);
12888    END IF;
12889    --update the master visit wo also with the visit start/end times.
12890    IF l_task_in_tbl.count > 0 THEN
12891 
12892       l_project_rec.PA_PROJECT_ID        := visit_details_rec.project_id;
12893       --Fix for the Bug 7009212; rnahata truncated the task times
12894       IF visit_details_rec.top_project_task_id IS NULL THEN
12895         l_project_rec.START_DATE           := trunc(visit_details_rec.start_date_time);
12896       ELSE
12897         OPEN get_prj_start_date_csr(visit_details_rec.project_id);
12898         FETCH get_prj_start_date_csr INTO l_project_rec.START_DATE;
12899         CLOSE get_prj_start_date_csr;
12900       END IF;
12901       l_project_rec.COMPLETION_DATE      := null;--trunc(visit_details_rec.close_date_time);
12902       l_project_rec.SCHEDULED_START_DATE := trunc(visit_details_rec.start_date_time);
12903       --rnahata End
12904       IF (l_log_statement >= l_log_current_level) THEN
12905          fnd_log.string(l_log_statement,
12906                         L_DEBUG_KEY,
12907                         'Before calling PA_PROJECT_PUB.update_project');
12908       END IF;
12909 
12910       --Now call update_project api to update the values in projects table
12911       PA_PROJECT_PUB.UPDATE_PROJECT(
12912             p_api_version_number => 1,
12913             p_commit             => p_commit,
12914             p_msg_count          => l_msg_count,
12915             p_msg_data           => l_msg_data,
12916             p_return_status      => l_return_status,
12917             p_workflow_started   => l_workflow_started,
12918             p_pm_product_code    => G_PM_PRODUCT_CODE,
12919             p_project_in         => l_project_rec,
12920             p_project_out        => l_project_out,
12921             p_key_members        => l_key_members,
12922             p_class_categories   => l_class_categories,
12923             p_tasks_in           => l_task_in_tbl,
12924             -- Added by jaramana on 23-OCT-2009 for the WBS ER 8674208
12925             p_pass_entire_structure  => l_pass_entire_structure,
12926             p_tasks_out          => l_task_out);
12927 
12928       IF (l_log_statement >= l_log_current_level) THEN
12929          fnd_log.string(l_log_statement,
12930                         L_DEBUG_KEY,
12931                         'After calling PA_PROJECT_PUB.update_project. Return Status = ' || l_return_status);
12932       END IF;
12933       x_return_status := l_return_status;
12934 
12935       IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
12936          IF (l_log_statement >= l_log_current_level) THEN
12937             fnd_log.string(l_log_statement,
12938                           L_DEBUG_KEY,
12939                           'Errors from PA_PROJECT_PUB.update_project. Message count: ' ||
12940                           l_msg_count || ', message data: ' || l_msg_data);
12941          END IF;
12942          IF l_return_status = FND_API.G_RET_STS_ERROR THEN
12943             RAISE FND_API.G_EXC_ERROR;
12944          ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
12945             RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
12946          END IF;
12947       END IF;  -- Return Status is not success
12948    END IF;  -- l_task_in_tbl.count > 0
12949 
12950    IF (l_log_procedure >= l_log_current_level) THEN
12951       fnd_log.string(l_log_procedure,
12952                      L_DEBUG_KEY ||'.end',
12953                      'At the end of PL SQL procedure. Return Status = ' || x_return_status);
12954    END IF;
12955 
12956    EXCEPTION
12957      WHEN FND_API.G_EXC_ERROR THEN
12958        x_return_status := FND_API.G_RET_STS_ERROR;
12959        ROLLBACK TO Update_Project_Task_Times;
12960        FND_MSG_PUB.count_and_get(p_count => x_msg_count,
12961                                  p_data  => x_msg_data,
12962                                  p_encoded => fnd_api.g_false);
12963 
12964      WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
12965        x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
12966        ROLLBACK TO Update_Project_Task_Times;
12967        FND_MSG_PUB.count_and_get(p_count => x_msg_count,
12968                                  p_data  => x_msg_data,
12969                                  p_encoded => fnd_api.g_false);
12970 
12971      WHEN OTHERS THEN
12972        x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
12973        ROLLBACK TO Update_Project_Task_Times;
12974        IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
12975           fnd_msg_pub.add_exc_msg(p_pkg_name       => G_PKG_NAME,
12976                                   p_procedure_name => 'Update_Project',
12977                                   p_error_text     => SUBSTR(SQLERRM,1,500));
12978        END IF;
12979        FND_MSG_PUB.count_and_get(p_count => x_msg_count,
12980                                  p_data  => x_msg_data,
12981                                  p_encoded => fnd_api.g_false);
12982 
12983 END Update_Project_Task_Times;
12984 -- PRAKKUM :: PIE:FP :: 13-OCT-2010 :: END :: Modified this procedure
12985 
12986 -- SATHAPLI, 05-Jun-2008 - Cursory analysis shows that this API Create_Job_Tasks is not in use anymore.
12987 -- Retaining the API code in the end of the package for any future references.
12988 --------------------------------------------------------------------
12989 -- PROCEDURE
12990 --    Create_Job_Tasks
12991 --
12992 -- PURPOSE
12993 --
12994 --
12995 --------------------------------------------------------------------
12996 PROCEDURE Create_Job_Tasks(
12997    p_api_version      IN            NUMBER    :=1.0,
12998    p_init_msg_list    IN            VARCHAR2  := Fnd_Api.g_false,
12999    p_commit           IN            VARCHAR2  := Fnd_Api.g_false,
13000    p_validation_level IN            NUMBER    := Fnd_Api.g_valid_level_full,
13001    p_module_type      IN            VARCHAR2  := Null,
13002    p_x_task_Tbl       IN OUT NOCOPY Task_Tbl_Type,
13003    x_return_status       OUT NOCOPY VARCHAR2,
13004    x_msg_count           OUT NOCOPY NUMBER,
13005    x_msg_data            OUT NOCOPY VARCHAR2
13006  )
13007 IS
13008    L_API_VERSION  CONSTANT NUMBER := 1.0;
13009    L_API_NAME     CONSTANT VARCHAR2(30) := 'Create_Job_Tasks';
13010    L_DEBUG_KEY    CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
13011    l_msg_count             NUMBER;
13012    l_route_id              NUMBER;
13013    l_job_ct                NUMBER;
13014    i                       NUMBER;
13015    j                       NUMBER;
13016    z                       NUMBER;
13017    idx                     NUMBER;
13018    z_return_status         VARCHAR2(1);
13019    l_return_status         VARCHAR2(1);
13020    y_return_status         VARCHAR2(1);
13021    l_flag                  VARCHAR2(1);
13022    l_status_flag           VARCHAR2(1);
13023    l_msg_data              VARCHAR2(2000);
13024    l_prd_workorder_tbl     AHL_PRD_WORKORDER_PVT.PRD_WORKORDER_TBL;
13025    /* Begin Changes by Shkalyan */
13026    l_prd_workorder_rel_tbl AHL_PRD_WORKORDER_PVT.PRD_WORKORDER_REL_TBL;
13027    l_firm_planned_flag     VARCHAR2(1) := FND_PROFILE.value('AHL_PRD_FIRM_PLANNED_FLAG');
13028    l_visit_wo_id           NUMBER;
13029    l_visit_wo_ovn          NUMBER;
13030    /* End Changes by Shkalyan */
13031    l_visit_end_time        DATE;
13032 --
13033    -- To find count for tasks for visit
13034    CURSOR c_route (x_id IN NUMBER) IS
13035     SELECT Route_Id FROM AHL_MR_ROUTES_V
13036     WHERE MR_ROUTE_ID = x_id;
13037 
13038    -- To find visit related information
13039    CURSOR c_visit (x_id IN NUMBER) IS
13040     SELECT * FROM AHL_VISITS_VL
13041     WHERE VISIT_ID = x_id;
13042    c_visit_rec c_visit%ROWTYPE;
13043 
13044    -- To find task related information
13045    CURSOR c_task (x_id IN NUMBER) IS
13046     SELECT * FROM AHL_VISIT_TASKS_VL
13047     WHERE VISIT_TASK_ID = x_id ;
13048    c_task_rec c_task%ROWTYPE;
13049 
13050    -- To find count for jobs tasks
13051    CURSOR c_job (x_id IN NUMBER) IS
13052     SELECT count(*) FROM AHL_WORKORDERS
13053     WHERE VISIT_TASK_ID = x_id
13054     AND STATUS_CODE not in ('22','7');
13055 
13056    CURSOR c_chk_job (x_id IN NUMBER) IS
13057     SELECT * FROM AHL_WORKORDERS
13058     WHERE VISIT_TASK_ID = x_id
13059     AND STATUS_CODE not in ('22','7');
13060    c_chk_job_rec c_chk_job%ROWTYPE;
13061 
13062    -- To find job for Visit
13063    CURSOR c_visit_job (x_id IN NUMBER) IS
13064     SELECT workorder_id, object_version_number
13065     FROM AHL_WORKORDERS
13066     WHERE VISIT_ID = x_id
13067      AND VISIT_TASK_ID IS NULL
13068      AND MASTER_WORKORDER_FLAG = 'Y'
13069      AND STATUS_CODE not in ('22','7');
13070 
13071    --Post11510. Added to get summary task start, end time
13072    CURSOR get_summary_task_times_csr(p_task_id IN NUMBER)IS
13073     SELECT min(start_date_time), max(end_date_time)
13074       --TCHIMIRA::19-FEB-2010::BUG 9384614
13075       -- Use the base table instead of the vl view
13076       FROM ahl_visit_tasks_b VST
13077     START WITH visit_task_id = p_task_id
13078     AND NVL(VST.status_code, 'Y') <> NVL ('DELETED', 'X')
13079     CONNECT BY originating_task_id = PRIOR visit_task_id;
13080 
13081 -- post 11.5.10
13082 -- yazhou Jul-20-2005 start
13083   CURSOR c_visit_task_exists(x_visit_id IN NUMBER)
13084   IS
13085     SELECT 'x'
13086     FROM   ahl_visit_tasks_b
13087     WHERE  visit_id = x_visit_id
13088     AND  STATUS_CODE = 'PLANNING';
13089 
13090    CURSOR c_get_wo_details(x_visit_id IN NUMBER)
13091     IS
13092     SELECT scheduled_start_date,
13093            SCHEDULED_COMPLETION_DATE
13094     FROM wip_discrete_jobs
13095     WHERE wip_entity_id =
13096           (
13097            SELECT
13098            wip_entity_id
13099            FROM ahl_workorders
13100            WHERE
13101              master_workorder_flag = 'Y' AND
13102              visit_task_id IS null AND
13103              status_code not in (22,7) and
13104              visit_id=x_visit_id
13105           );
13106       c_get_wo_details_rec  c_get_wo_details%ROWTYPE;
13107 
13108    l_dummy VARCHAR2(1);
13109 -- yazhou Jul-20-2005 end
13110 BEGIN
13111    --------------------- initialize -----------------------
13112   SAVEPOINT Create_Job_Tasks;
13113 
13114   IF (l_log_procedure >= l_log_current_level) THEN
13115     fnd_log.string(l_log_procedure,L_DEBUG_KEY||'.begin','At the start of the PLSQL procedure');
13116   END IF;
13117 
13118   -- Initialize message list if p_init_msg_list is set to TRUE.
13119   IF Fnd_Api.to_boolean(p_init_msg_list) THEN
13120      Fnd_Msg_Pub.initialize;
13121   END IF;
13122 
13123   --  Initialize API return status to success
13124   x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
13125 
13126   -- Standard call to check for call compatibility.
13127   IF NOT Fnd_Api.COMPATIBLE_API_CALL(l_api_version,
13128                                       p_api_version,
13129                                       l_api_name,G_PKG_NAME) THEN
13130     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
13131   END IF;
13132 
13133   --------------------------- Start of Body -------------------------------------
13134   IF (l_log_statement >= l_log_current_level) THEN
13135     fnd_log.string(l_log_statement,L_DEBUG_KEY,'Task table count = '||p_x_task_Tbl.COUNT);
13136   END IF;
13137 
13138   IF (p_x_task_Tbl.COUNT > 0) THEN
13139       i := p_x_task_Tbl.FIRST;
13140 
13141       IF (l_log_statement >= l_log_current_level) THEN
13142         fnd_log.string(l_log_statement,L_DEBUG_KEY,'Visit Id= ' || p_x_task_Tbl(i).visit_id);
13143         fnd_log.string(l_log_statement,L_DEBUG_KEY,'Task table value of Index i=' || i);
13144       END IF;
13145 
13146       WHILE i IS NOT NULL LOOP
13147         p_x_task_Tbl(i).operation_flag := 'C';
13148 
13149         OPEN c_visit (p_x_task_Tbl(i).visit_id);
13150         FETCH c_visit INTO c_visit_rec;
13151         CLOSE c_visit;
13152 
13153         --IF c_task_rec.department_id IS NULL THEN
13154         IF c_visit_rec.department_id IS NOT NULL THEN
13155           p_x_task_Tbl(i).department_id  := c_visit_rec.department_id ;
13156         ELSE
13157           p_x_task_Tbl(i).department_id  := NULL ;
13158         END IF;
13159         --END IF;
13160 
13161         IF (l_log_statement >= l_log_current_level) THEN
13162           fnd_log.string(l_log_statement,L_DEBUG_KEY,'Before calling AHL_VWP_TASKS_PVT.Create_Task');
13163         END IF;
13164 
13165         -- Call create Visit Task API
13166         AHL_VWP_TASKS_PVT.Create_Task (
13167           p_api_version      => p_api_version,
13168           p_init_msg_list    => Fnd_Api.g_false,
13169           p_validation_level => p_validation_level,
13170           p_module_type      => 'SR', --p_module_type,
13171           p_x_task_rec       => p_x_task_Tbl(i),
13172           x_return_status    => x_return_status,
13173           x_msg_count        => x_msg_count,
13174           x_msg_data         => x_msg_data);
13175 
13176         IF (l_log_statement >= l_log_current_level) THEN
13177           fnd_log.string(l_log_statement,L_DEBUG_KEY,'After calling AHL_VWP_TASKS_PVT.Create_Task - x_return_status = '|| x_return_status);
13178         END IF;
13179         EXIT WHEN x_return_status <> 'S';
13180         i:= p_x_task_Tbl.NEXT(i);
13181       END LOOP;
13182   END IF;
13183 
13184   IF x_return_status <> 'S' THEN
13185     RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
13186   END IF;
13187 
13188   IF (p_x_task_Tbl.COUNT > 0) THEN
13189     i := p_x_task_Tbl.FIRST;
13190     -- yazhou 15Aug2005 starts
13191     -- Bug# 4552764 fix
13192     OPEN c_visit (p_x_task_Tbl(i).visit_id);
13193     FETCH c_visit INTO c_visit_rec;
13194     CLOSE c_visit;
13195 
13196     IF (l_log_statement >= l_log_current_level) THEN
13197       fnd_log.string(l_log_statement,L_DEBUG_KEY,'Before calling AHL_VWP_TIMES_PVT.adjust_task_times');
13198     END IF;
13199 
13200     IF c_visit_rec.start_date_time < SYSDATE THEN
13201       WHILE i IS NOT NULL
13202       LOOP
13203           AHL_VWP_TIMES_PVT.adjust_task_times(
13204                   p_api_version        => 1.0,
13205                   p_init_msg_list      => Fnd_Api.G_FALSE,
13206                   p_commit             => Fnd_Api.G_FALSE,
13207                   p_validation_level   => Fnd_Api.G_VALID_LEVEL_FULL,
13208                   x_return_status      => l_return_status,
13209                   x_msg_count          => l_msg_count,
13210                   x_msg_data           => l_msg_data,
13211                   p_task_id            => p_x_task_Tbl(i).visit_task_id,
13212                   p_reset_sysdate_flag => FND_API.G_TRUE);
13213 
13214           i:= p_x_task_Tbl.NEXT(i);
13215        END LOOP;
13216      END IF;
13217      --The visit end date
13218      l_visit_end_time := AHL_VWP_TIMES_PVT.get_visit_end_time(c_visit_rec.visit_id);
13219 
13220      IF (l_log_statement >= l_log_current_level) THEN
13221       fnd_log.string(l_log_statement,L_DEBUG_KEY,'After calling AHL_VWP_TIMES_PVT.adjust_task_times - l_visit_end_time = '||l_visit_end_time);
13222      END IF;
13223      -- yazhou 15Aug2005 ends
13224   END IF;
13225 
13226   -- yazhou 06Oct2005 starts
13227   -- bug fix #4658861
13228   OPEN c_get_wo_details(c_visit_rec.visit_id);
13229   FETCH c_get_wo_details into c_get_wo_details_rec;
13230   CLOSE c_get_wo_details;
13231   -- yazhou 06Oct2005 ends
13232   -- Post 11.5.10
13233   -- RROY
13234 
13235   -- Yazhou Note: since we are checking for derived visit end time here, if there are other task in planning
13236   -- status with end date exceeding visit planned end date, then non-routine cannot be created
13237   IF TRUNC(l_visit_end_time) > TRUNC(c_visit_rec.close_date_time) THEN
13238     --yazhou Jul-20-2005 start
13239     -- Set visit status to partially released
13240     -- UPDATE AHL_VISITS_B SET STATUS_CODE = 'PARTIALLY RELEASED',
13241     -- OBJECT_VERSION_NUMBER = c_visit_rec.object_version_number + 1
13242     -- WHERE VISIT_ID = c_visit_rec.visit_id;
13243     --yazhou Jul-20-2005 end
13244 
13245     -- yazhou Sep-15-2005 starts
13246     -- bug fix 4613220
13247     IF (p_x_task_Tbl.COUNT > 0) THEN
13248       i := p_x_task_Tbl.FIRST;
13249     END IF;
13250     -- Error Message
13251     FND_MESSAGE.Set_Name('AHL','AHL_VWP_CRT_JOB_ERR');
13252     Fnd_Message.Set_Token('TASK_NUMBER', p_x_task_tbl(i).visit_task_number);
13253     Fnd_Message.Set_Token('END_DATE', TRUNC(l_visit_end_time));
13254     -- yazhou Sep-15-2005 ends
13255     FND_MSG_PUB.ADD;
13256     -- yazhou 06Oct2005 starts
13257     -- bug fix #4658861
13258     -- Note: since we are checking for derived end time here, if there are other task in planning
13259     -- status with end date exceeding visit master WO end date, then non-routine cannot be created
13260 
13261   ELSIF TRUNC(l_visit_end_time) > TRUNC(c_get_wo_details_rec.scheduled_completion_date) THEN
13262     -- Error Message
13263     Fnd_Message.SET_NAME('AHL','AHL_VWP_DATE_EXCD_WO_DATE');
13264     Fnd_Message.Set_Token('VISIT_END_DATE', l_visit_end_time);
13265     FND_MSG_PUB.ADD;
13266     -- yazhou 06Oct2005 ends
13267   ELSE
13268     -- Start for 11.5.10 release
13269     -- By shbhanda 05-Jun-03
13270     -- For creating/updating Master Workorder in production for the visit in VWP
13271     idx := 1;
13272     /* Begin Changes by Shkalyan */
13273     l_prd_workorder_tbl(idx).MASTER_WORKORDER_FLAG := 'Y';
13274     l_prd_workorder_tbl(idx).BATCH_ID := c_visit_rec.visit_number;
13275     l_prd_workorder_tbl(idx).HEADER_ID := 0; -- Visit
13276 
13277     OPEN c_visit_job (c_visit_rec.visit_id);
13278     FETCH c_visit_job INTO l_visit_wo_id, l_visit_wo_ovn;
13279     CLOSE c_visit_job;
13280 
13281     IF l_visit_wo_id IS NOT NULL THEN
13282       l_prd_workorder_tbl(idx).DML_OPERATION := 'U';
13283       l_prd_workorder_tbl(idx).WORKORDER_ID := l_visit_wo_id;
13284       l_prd_workorder_tbl(idx).OBJECT_VERSION_NUMBER := l_visit_wo_ovn;
13285     ELSE
13286       l_prd_workorder_tbl(idx).DML_OPERATION := 'C';
13287       l_prd_workorder_tbl(idx).STATUS_CODE           := '1';
13288       l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG     := 1; -- Firm
13289     END IF;
13290     /* End Changes by Shkalyan */
13291 
13292     l_prd_workorder_tbl(idx).VISIT_ID              := c_visit_rec.visit_id;
13293     l_prd_workorder_tbl(idx).ORGANIZATION_ID       := c_visit_rec.organization_id;
13294     l_prd_workorder_tbl(idx).PROJECT_ID            := c_visit_rec.project_id;
13295     l_prd_workorder_tbl(idx).DEPARTMENT_ID         := c_visit_rec.department_id ;
13296     l_prd_workorder_tbl(idx).INVENTORY_ITEM_ID     := c_visit_rec.inventory_item_id ;
13297     l_prd_workorder_tbl(idx).ITEM_INSTANCE_ID      := c_visit_rec.item_instance_id ;
13298     l_prd_workorder_tbl(idx).SCHEDULED_START_DATE  := c_visit_rec.start_date_time;
13299     --l_prd_workorder_tbl(idx).SCHEDULED_END_DATE  := l_visit_end_time;
13300     -- Changed by Shbhanda on 30th Jan 04
13301     l_prd_workorder_tbl(idx).SCHEDULED_END_DATE    := c_visit_rec.close_date_time;
13302     l_prd_workorder_tbl(idx).JOB_DESCRIPTION       := c_visit_rec.visit_name ;
13303 
13304     idx := idx + 1;
13305 
13306     IF (p_x_task_Tbl.COUNT > 0) THEN
13307       i := p_x_task_Tbl.FIRST;
13308       j := 0;
13309 
13310       WHILE i IS NOT NULL LOOP
13311         -- Call create WIP Job API
13312         OPEN c_job(p_x_task_Tbl(i).visit_task_id);
13313         FETCH c_job INTO l_job_ct;
13314         CLOSE c_job;
13315 
13316         IF (l_log_statement >= l_log_current_level) THEN
13317           fnd_log.string(l_log_statement,L_DEBUG_KEY,'For job count = ' || l_job_ct);
13318         END IF;
13319 
13320         IF l_job_ct > 0 THEN
13321           i := i + 1;
13322         ELSE
13323           OPEN c_task(p_x_task_Tbl(i).visit_task_id);
13324           FETCH c_task INTO c_task_rec;
13325           CLOSE c_task;
13326 
13327           /* Begin Changes by Shkalyan */
13328           -- Form the Workorder Relationship Parenting to the Visit
13329           l_prd_workorder_rel_tbl(idx-1).DML_OPERATION := 'C';
13330           l_prd_workorder_rel_tbl(idx-1).PARENT_HEADER_ID := 0; -- Visit
13331           l_prd_workorder_rel_tbl(idx-1).CHILD_HEADER_ID := c_task_rec.visit_task_number;
13332           l_prd_workorder_rel_tbl(idx-1).BATCH_ID := c_visit_rec.visit_number;
13333           l_prd_workorder_rel_tbl(idx-1).RELATIONSHIP_TYPE := 1;
13334 
13335           -- Form the Workorder Record
13336           l_prd_workorder_tbl(idx).DML_OPERATION     := 'C';
13337           l_prd_workorder_tbl(idx).MASTER_WORKORDER_FLAG := 'N';
13338           l_prd_workorder_tbl(idx).BATCH_ID := c_visit_rec.visit_number;
13339           l_prd_workorder_tbl(idx).HEADER_ID := c_task_rec.visit_task_number;
13340           /* End Changes by Shkalyan */
13341 
13342           l_prd_workorder_tbl(idx).VISIT_ID          := c_visit_rec.visit_id;
13343           l_prd_workorder_tbl(idx).ORGANIZATION_ID   := c_visit_rec.organization_id;
13344           l_prd_workorder_tbl(idx).PROJECT_ID        := c_visit_rec.project_id;
13345           l_prd_workorder_tbl(idx).STATUS_CODE       := '1';
13346           l_prd_workorder_tbl(idx).INVENTORY_ITEM_ID := c_task_rec.inventory_item_id ;
13347           l_prd_workorder_tbl(idx).ITEM_INSTANCE_ID  := c_task_rec.instance_id ;
13348           l_prd_workorder_tbl(idx).VISIT_TASK_ID     := c_task_rec.visit_task_id ;
13349           l_prd_workorder_tbl(idx).VISIT_TASK_NUMBER := c_task_rec.visit_task_number ;
13350           l_prd_workorder_tbl(idx).PROJECT_TASK_ID   := c_task_rec.project_task_id ;
13351           l_prd_workorder_tbl(idx).JOB_DESCRIPTION   := c_task_rec.visit_task_name ;
13352 
13353           IF c_task_rec.department_id IS NOT NULL AND c_task_rec.department_id <> FND_API.g_miss_num THEN
13354             l_prd_workorder_tbl(idx).DEPARTMENT_ID   := c_task_rec.department_id ;
13355           ELSE
13356             l_prd_workorder_tbl(idx).DEPARTMENT_ID   := c_visit_rec.department_id ;
13357           END IF;
13358 
13359           IF c_task_rec.mr_route_id IS NOT NULL AND c_task_rec.mr_route_id <> FND_API.g_miss_num THEN
13360             OPEN c_route (c_task_rec.mr_route_id);
13361             FETCH c_route INTO l_route_id;
13362             CLOSE c_route;
13363             l_prd_workorder_tbl(idx).ROUTE_ID := l_route_id ;
13364           ELSE
13365             l_prd_workorder_tbl(idx).ROUTE_ID := Null;
13366           END IF;
13367 
13368           --POST11510 cxcheng. If summary task, use the min,max for sub tasks
13369           IF (c_task_rec.task_type_code = 'SUMMARY') THEN
13370             OPEN get_summary_task_times_csr(c_task_rec.visit_task_id);
13371             FETCH get_summary_task_times_csr INTO l_prd_workorder_tbl(idx).SCHEDULED_START_DATE,
13372                                                   l_prd_workorder_tbl(idx).SCHEDULED_END_DATE  ;
13373             CLOSE get_summary_task_times_csr;
13374           ELSE
13375             l_prd_workorder_tbl(idx).SCHEDULED_START_DATE  := c_task_rec.start_date_time;
13376             l_prd_workorder_tbl(idx).SCHEDULED_END_DATE    := c_task_rec.end_date_time;
13377           END IF;
13378 
13379           /* Begin Changes by Shkalyan */
13380           IF (l_firm_planned_flag IS NOT NULL AND
13381           -- SKPATHAK :: ER: 9147951 :: 11-JAN-2010
13382           -- For task with past task dates, WOs are always firm irrespective of the profile value
13383           c_task_rec.past_task_start_date IS NULL AND
13384           l_firm_planned_flag = '2') THEN
13385             l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG     := 2; -- Planned
13386           ELSE
13387             l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG     := 1; -- Firm
13388           END IF;
13389           /* End Changes by Shkalyan */
13390           idx := idx + 1;
13391           i := p_x_task_Tbl.NEXT(i);
13392         END IF;
13393       END LOOP;
13394     END IF;
13395 
13396     IF l_prd_workorder_tbl.COUNT > 0  THEN
13397       IF (l_log_statement >= l_log_current_level) THEN
13398         fnd_log.string(l_log_statement,L_DEBUG_KEY,'Before calling AHL_PRD_WORKORDER_PVT.Process_Jobs');
13399       END IF;
13400 
13401       /* Begin Changes by Shkalyan */
13402       AHL_PRD_WORKORDER_PVT.Process_Jobs
13403                  (p_api_version           => p_api_version,
13404                   p_init_msg_list         => p_init_msg_list,
13405                   p_commit                => Fnd_Api.g_false,
13406                   p_validation_level      => p_validation_level,
13407                   p_default               => FND_API.G_TRUE,
13408                   p_module_type           => p_module_type,
13409                   x_return_status         => x_return_status,
13410                   x_msg_count             => x_msg_count,
13411                   x_msg_data              => x_msg_data,
13412                   p_x_prd_workorder_tbl   => l_prd_workorder_tbl,
13413                   p_prd_workorder_rel_tbl => l_prd_workorder_rel_tbl
13414                   );
13415       /* End Changes by Shkalyan */
13416       IF (l_log_statement >= l_log_current_level) THEN
13417         fnd_log.string(l_log_statement,L_DEBUG_KEY,'After calling AHL_PRD_WORKORDER_PVT.Process_Jobs - x_return_status = '||x_return_status);
13418       END IF;
13419 
13420       IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
13421          RAISE Fnd_Api.G_EXC_ERROR;
13422       END IF;
13423     END IF; -- To find if the visit has any tasks
13424 
13425     IF (p_x_task_Tbl.COUNT > 0) THEN
13426         i := p_x_task_Tbl.FIRST;
13427          WHILE i IS NOT NULL LOOP
13428             OPEN c_chk_job(p_x_task_Tbl(i).visit_task_id);
13429             FETCH c_chk_job INTO c_chk_job_rec;
13430             CLOSE c_chk_job;
13431 
13432             p_x_task_Tbl(i).workorder_id  := c_chk_job_rec.workorder_id;
13433 
13434             --yazhou Jul-18-2005 start
13435             -- Fix for bug # 4078095
13436             UPDATE AHL_VISIT_TASKS_B
13437             SET STATUS_CODE = 'RELEASED',
13438                 OBJECT_VERSION_NUMBER = OBJECT_VERSION_NUMBER + 1
13439             WHERE VISIT_TASK_ID = p_x_task_Tbl(i).visit_task_id
13440             AND STATUS_CODE = 'PLANNING';
13441             --yazhou Jul-18-2005 end
13442             i := p_x_task_Tbl.NEXT(i);
13443          END LOOP;
13444     END IF;
13445 
13446     IF (l_log_statement >= l_log_current_level) THEN
13447         fnd_log.string(l_log_statement,L_DEBUG_KEY,'Updated visit to Released..');
13448     END IF;
13449     --yazhou Jul-20-2005 start
13450 
13451     OPEN c_visit_task_exists(c_visit_rec.visit_id);
13452     FETCH c_visit_task_exists INTO l_dummy;
13453 
13454     OPEN c_get_wo_details(c_visit_rec.visit_id);
13455     FETCH c_get_wo_details into c_get_wo_details_rec;
13456     IF (c_visit_task_exists%NOTFOUND and
13457         c_visit_rec.start_date_time = c_get_wo_details_rec.scheduled_start_date and
13458         c_visit_rec.close_date_time = c_get_wo_details_rec.scheduled_completion_date) THEN
13459           UPDATE ahl_visits_b
13460           SET status_code = 'RELEASED',
13461               object_version_number = object_version_number + 1
13462           WHERE visit_id = c_visit_rec.visit_id;
13463 
13464           IF (l_log_statement >= l_log_current_level) THEN
13465               fnd_log.string(l_log_statement,L_DEBUG_KEY,'Before updating the task flag');
13466           END IF;
13467 
13468           IF c_visit_rec.any_task_chg_flag = 'Y' THEN
13469              AHL_VWP_RULES_PVT.Update_Visit_Task_Flag
13470                          (p_visit_id      => c_visit_rec.visit_id,
13471                           p_flag          => 'N',
13472                           x_return_status => x_return_status);
13473           END IF;
13474       END IF;
13475       CLOSE c_visit_task_exists;
13476       CLOSE c_get_wo_details;
13477   END IF;
13478   -- yazhou Jul-20-2005 end
13479   -- RROY
13480   ---------------------------End of Body-------------------------------------
13481   -- END of API body.
13482   -- Standard check of p_commit.
13483 
13484   IF Fnd_Api.To_Boolean (p_commit) THEN
13485      COMMIT WORK;
13486   END IF;
13487 
13488   Fnd_Msg_Pub.count_and_get(
13489          p_encoded => Fnd_Api.g_false,
13490          p_count   => x_msg_count,
13491          p_data    => x_msg_data);
13492 
13493   IF (l_log_procedure >= l_log_current_level) THEN
13494     fnd_log.string(l_log_procedure,L_DEBUG_KEY||'.end','At the end of the PLSQL procedure');
13495   END IF;
13496 
13497 EXCEPTION
13498    WHEN Fnd_Api.g_exc_error THEN
13499       ROLLBACK TO Create_Job_Tasks;
13500       x_return_status := Fnd_Api.g_ret_sts_error;
13501       Fnd_Msg_Pub.count_and_get (
13502             p_encoded => Fnd_Api.g_false,
13503             p_count   => x_msg_count,
13504             p_data    => x_msg_data
13505      );
13506    WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
13507       ROLLBACK TO Create_Job_Tasks;
13508       x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
13509       Fnd_Msg_Pub.count_and_get (
13510             p_encoded => Fnd_Api.g_false,
13511             p_count   => x_msg_count,
13512             p_data    => x_msg_data
13513      );
13514    WHEN OTHERS THEN
13515       ROLLBACK TO Create_Job_Tasks;
13516       x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
13517       IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_unexp_error)
13518     THEN
13519          Fnd_Msg_Pub.add_exc_msg (G_PKG_NAME, l_api_name);
13520       END IF;
13521       Fnd_Msg_Pub.count_and_get (
13522             p_encoded => Fnd_Api.g_false,
13523             p_count   => x_msg_count,
13524             p_data    => x_msg_data
13525      );
13526 END Create_Job_Tasks;
13527 
13528 --PRAKKUM :: PIE :: 13-OCT-2010 :: START
13529 -------------------------------------------------------------------
13530 --  Procedure name    : Add_Task_To_Project_Int
13531 --  Type              : Private
13532 --  Function          : New helper function to call from Add_MR_to_Project
13533 --  Parameters :
13534 --  Add_Task_To_Project_Int Parameters
13535 --      p_project_id            IN NUMBER              Required
13536 --      p_project_number        IN VARCHAR2            Required
13537 --      p_task_number           IN VARCHAR2            Required
13538 --      p_task_reference        IN VARCHAR2            Required
13539 --      p_task_name             IN VARCHAR2            Required
13540 --      p_task_description      IN VARCHAR2            Required
13541 --      p_task_start_date       IN DATE                Required
13542 --      p_task_completion_date  IN DATE                Required
13543 --      p_parent_task_reference IN VARCHAR2            Required
13544 --      x_task_id               OUT NOCOPY NUMBER      Required
13545 --
13546 --  Standard OUT Parameters :
13547 --      x_return_status           OUT     VARCHAR2     Required
13548 --      x_msg_count               OUT     NUMBER       Required
13549 --      x_msg_data                OUT     VARCHAR2     Required
13550 --
13551 --  Version :
13552 -------------------------------------------------------------------
13553 PROCEDURE Add_Task_To_Project_Int(
13554    p_project_id            IN NUMBER,
13555    p_project_number        IN VARCHAR2,
13556    p_task_number           IN VARCHAR2,
13557    p_task_reference        IN VARCHAR2,
13558    p_task_name             IN VARCHAR2,
13559    p_long_task_name        IN VARCHAR2,
13560    p_task_description      IN VARCHAR2,
13561    p_task_start_date       IN DATE,
13562    p_task_completion_date  IN DATE,
13563    p_parent_task_reference IN VARCHAR2,
13564    p_service_type_code     IN VARCHAR2,
13565    x_return_status     OUT NOCOPY VARCHAR2,
13566    x_msg_count         OUT NOCOPY NUMBER,
13567    x_msg_data          OUT NOCOPY VARCHAR2,
13568    x_task_id           OUT NOCOPY NUMBER
13569 )
13570 IS
13571    L_API_NAME         CONSTANT VARCHAR2(30)  := 'Add_Task_To_Project_Int';
13572    L_FULL_NAME        CONSTANT VARCHAR2(60)  := G_PKG_NAME || '.' || L_API_NAME;
13573    L_DEBUG_KEY        CONSTANT VARCHAR2(100) := 'ahl.plsql.' || L_FULL_NAME;
13574 
13575    l_msg_count          NUMBER;
13576    l_msg_data           VARCHAR2(2000);
13577    l_return_status      VARCHAR2(1);
13578    l_project_tsk_flag   VARCHAR2(1);
13579    l_proj_ref_flag      VARCHAR2(1);
13580    l_pa_project_number_out  VARCHAR2(25);
13581    l_pa_project_id_out  NUMBER;
13582    l_task_id            NUMBER;
13583    l_msg_index_out      NUMBER;
13584 
13585 BEGIN
13586 
13587   IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level) THEN
13588     fnd_log.string(fnd_log.level_procedure,L_DEBUG_KEY||'.begin', 'At the start of plsql procedure.');
13589   END IF;
13590 
13591   PA_PROJECT_PUB.Check_Unique_Task_Number(
13592       p_api_version_number      => 1,
13593       p_init_msg_list           => 'F',
13594       p_return_status           => l_return_status,
13595       p_msg_count               => l_msg_count,
13596       p_msg_data                => l_msg_data,
13597       p_project_id              => p_project_id,
13598       p_pm_project_reference    => p_project_number,
13599       p_task_number             => p_task_number,
13600       p_unique_task_number_flag => l_project_tsk_flag) ;
13601 
13602   IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
13603     fnd_log.string(fnd_log.level_statement, L_DEBUG_KEY, 'After calling PA_PROJECT_PUB.Check_Unique_Task_Number - l_project_tsk_flag : '|| l_project_tsk_flag);
13604     fnd_log.string(fnd_log.level_statement, L_DEBUG_KEY, 'Before calling PA_PROJECT_PUB.Check_Unique_Task_Reference');
13605   END IF;
13606 
13607   PA_PROJECT_PUB.Check_Unique_Task_Reference(
13608       p_api_version_number    => 1,
13609       p_init_msg_list         => 'F',
13610       p_return_status         => l_return_status,
13611       p_msg_count             => l_msg_count,
13612       p_msg_data              => l_msg_data,
13613       p_project_id            => p_project_id,
13614       p_pm_project_reference  => p_project_number,
13615       p_pm_task_reference     => p_task_reference,
13616       p_unique_task_ref_flag  => l_proj_ref_flag);
13617 
13618   IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
13619     fnd_log.string(fnd_log.level_statement, L_DEBUG_KEY, 'After calling PA_PROJECT_PUB.Check_Unique_Task_Reference  - l_proj_ref_flag = ' || l_proj_ref_flag);
13620   END IF;
13621 
13622   IF l_project_tsk_flag = 'Y' AND l_proj_ref_flag = 'Y' THEN
13623     IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
13624       fnd_log.string(fnd_log.level_statement, L_DEBUG_KEY, 'Before calling PA_PROJECT_PUB.ADD_TASK:');
13625       fnd_log.string(fnd_log.level_statement, L_DEBUG_KEY, 'p_project_id: ' || p_project_id);
13626       fnd_log.string(fnd_log.level_statement, L_DEBUG_KEY, 'p_project_number :' || p_project_number);
13627       fnd_log.string(fnd_log.level_statement, L_DEBUG_KEY, 'p_task_number: ' || p_task_number);
13628       fnd_log.string(fnd_log.level_statement, L_DEBUG_KEY, 'p_task_name: ' || p_task_name);
13629       fnd_log.string(fnd_log.level_statement, L_DEBUG_KEY, 'p_task_description: ' || p_task_description);
13630       fnd_log.string(fnd_log.level_statement, L_DEBUG_KEY, 'p_parent_task_reference: ' || p_parent_task_reference);
13631     END IF;
13632 
13633     PA_PROJECT_PUB.ADD_TASK(
13634        p_api_version_number       => 1
13635       ,p_commit                   => 'F'
13636       ,p_init_msg_list            => 'F'
13637       ,p_msg_count                => l_msg_count
13638       ,p_msg_data                 => l_msg_data
13639       ,p_return_status            => l_return_status
13640       ,p_pm_product_code          => G_PM_PRODUCT_CODE
13641       ,p_pa_project_id            => p_project_id
13642       ,p_pm_task_reference        => p_task_reference
13643       ,p_pa_task_number           => p_task_number
13644       ,p_task_name                => p_task_name
13645       ,p_long_task_name           => p_long_task_name
13646       ,p_task_description         => p_task_description
13647       ,p_task_start_date          => p_task_start_date
13648       ,p_task_completion_date     => null--p_task_completion_date
13649       ,p_pm_parent_task_reference => p_parent_task_reference
13650       ,p_service_type_code        => p_service_type_code
13651       ,p_pa_project_id_out        => l_pa_project_id_out
13652       ,p_pa_project_number_out    => l_pa_project_number_out
13653       ,p_task_id                  => l_task_id);
13654 
13655     IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
13656       fnd_log.string(fnd_log.level_statement, L_DEBUG_KEY, 'After calling PA_PROJECT_PUB.ADD_TASK, l_return_status: ' || l_return_status ||
13657                      ', Returned Task Id: ' || l_task_id);
13658     END IF;
13659     x_return_status := l_return_status ;
13660 
13661     IF (l_return_status = 'S') THEN
13662       x_task_id := l_task_id;  -- Assign the OUT paramater
13663     END IF;
13664   ELSIF l_project_tsk_flag = 'N' AND l_proj_ref_flag = 'Y' THEN
13665     x_return_status := Fnd_Api.g_ret_sts_error;
13666     IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_error) THEN
13667       Fnd_Message.set_name ('AHL', 'AHL_VWP_PROJ_TSK_NUM_NOT_UNIQ');
13668       Fnd_Msg_Pub.ADD;
13669     END IF;
13670   ELSIF l_project_tsk_flag = 'Y' AND l_proj_ref_flag = 'N' THEN
13671     x_return_status := Fnd_Api.g_ret_sts_error;
13672     IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_error) THEN
13673       Fnd_Message.set_name ('AHL', 'AHL_VWP_PROJ_TSK_REF_NOT_UNIQ');
13674       Fnd_Msg_Pub.ADD;
13675     END IF;
13676   ELSE
13677     x_return_status := Fnd_Api.g_ret_sts_error;
13678     IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_error) THEN
13679       Fnd_Message.set_name ('AHL', 'AHL_VWP_PROJ_TASK_NOT_UNIQUE');
13680       Fnd_Msg_Pub.ADD;
13681     END IF;
13682   END IF;
13683   IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level) THEN
13684     fnd_log.string(fnd_log.level_procedure,L_DEBUG_KEY||'.end','At the end of plsql procedure');
13685   END IF;
13686 
13687 
13688 END Add_Task_To_Project_Int;
13689 
13690 
13691 
13692 -------------------------------------------------------------------
13693 --  Procedure name    : Update_Project_Task
13694 --  Type              : Private
13695 --  Function          : To update the project tasks hierarchy
13696 --                      whenever visit task's cost parent is updated.
13697 --  Parameters :
13698 --  Update_Project_Task_Times Parameters
13699 --      p_task_id               IN NUMBER              Required
13700 --
13701 --  Standard OUT Parameters :
13702 --      x_return_status           OUT     VARCHAR2     Required
13703 --      x_msg_count               OUT     NUMBER       Required
13704 --      x_msg_data                OUT     VARCHAR2     Required
13705 --
13706 --  Version :
13707 -------------------------------------------------------------------
13708 PROCEDURE Update_Project_Task(
13709    p_task_id           IN NUMBER,
13710    x_return_status     OUT NOCOPY VARCHAR2,
13711    x_msg_count         OUT NOCOPY NUMBER,
13712    x_msg_data          OUT NOCOPY VARCHAR2
13713 )
13714 IS
13715    L_API_NAME         CONSTANT VARCHAR2(30)  := 'Update_Project_Task';
13716    L_FULL_NAME        CONSTANT VARCHAR2(60)  := G_PKG_NAME || '.' || L_API_NAME;
13717    L_DEBUG_KEY            CONSTANT VARCHAR2(100) := 'ahl.plsql.' || L_FULL_NAME;
13718 
13719    l_msg_count                  NUMBER;
13720    l_msg_data                   VARCHAR2(2000);
13721    l_return_status              VARCHAR2(1);
13722    l_project_id                 NUMBER;
13723    l_project_task_id            NUMBER;
13724    l_pm_product_code            VARCHAR2(3) := 'AHL';
13725    l_pm_parent_task_reference   VARCHAR2(30);
13726    l_project_parent_task_id     NUMBER;
13727    l_out_pa_task_id             NUMBER;
13728    l_out_pm_task_reference      VARCHAR2(30);
13729    l_update_task_structure      VARCHAR2(1) := 'N';
13730    l_dummy                      VARCHAR2(1);
13731 
13732 
13733 --To validate visit task id
13734 Cursor validate_vst_tsk_id_csr (c_task_id IN NUMBER) IS
13735   SELECT 'X'
13736   FROM ahl_visit_tasks_b
13737   WHERE visit_task_id =  c_task_id
13738     AND status_code <> 'DELETED';
13739 
13740 --To find the project task details
13741 CURSOR get_prj_tsk_details_csr (c_task_id IN NUMBER) IS
13742   SELECT avt.project_task_id, avt.task_type_code,
13743          avt.cost_parent_id, pt.project_id, pt.top_task_id
13744   FROM ahl_visit_tasks_b avt, pa_tasks pt
13745   WHERE avt.project_task_id = pt.task_id
13746     AND avt.visit_task_id = c_task_id ;
13747 get_prj_tsk_details_csr_rec get_prj_tsk_details_csr%ROWTYPE;
13748 
13749 --To find the project task id and visit task type of the cost parent
13750 CURSOR get_cost_parent_details_csr (cost_parent_task_id IN NUMBER) IS
13751   SELECT project_task_id, task_type_code
13752   FROM ahl_visit_tasks_b
13753   WHERE visit_task_id = cost_parent_task_id ;
13754 get_cost_parent_details_rec get_cost_parent_details_csr%ROWTYPE;
13755 
13756 
13757 --To find the project parent roll-up task of a project transaction task
13758 CURSOR get_prj_parent_tsk_csr (c_project_task_id IN NUMBER) IS
13759   SELECT parent_task_id
13760   FROM pa_tasks
13761   WHERE task_id = c_project_task_id;
13762 
13763 BEGIN
13764 
13765   SAVEPOINT Update_Project_Task;
13766 
13767   IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level) THEN
13768     fnd_log.string(fnd_log.level_procedure,L_DEBUG_KEY||'.begin', 'At the start of plsql procedure.');
13769   END IF;
13770 
13771   OPEN validate_vst_tsk_id_csr(p_task_id);
13772   FETCH validate_vst_tsk_id_csr INTO l_dummy;
13773    IF validate_vst_tsk_id_csr%NOTFOUND THEN
13774      Fnd_Message.SET_NAME('AHL', 'AHL_VWP_TASK_ID_INVALID');
13775      Fnd_Message.SET_TOKEN('VISIT_TASK_ID', p_task_id);
13776      Fnd_Msg_Pub.ADD;
13777      CLOSE validate_vst_tsk_id_csr;
13778      RAISE Fnd_Api.G_EXC_ERROR;
13779    END IF;
13780   CLOSE validate_vst_tsk_id_csr;
13781 
13782   OPEN get_prj_tsk_details_csr(p_task_id);
13783   FETCH get_prj_tsk_details_csr INTO get_prj_tsk_details_csr_rec;
13784     l_project_id  :=  get_prj_tsk_details_csr_rec.project_id;
13785     IF get_prj_tsk_details_csr_rec.task_type_code <> 'SUMMARY' THEN
13786       -- If the visit task is a non-summary task,
13787       -- change the parent of its roll-up task corresponding to this non-summary project task
13788       OPEN get_prj_parent_tsk_csr(get_prj_tsk_details_csr_rec.project_task_id);
13789       FETCH get_prj_parent_tsk_csr INTO l_project_task_id;
13790       CLOSE get_prj_parent_tsk_csr;
13791     ELSE --task_type_code <> 'SUMMARY'
13792       l_project_task_id   :=  get_prj_tsk_details_csr_rec.project_task_id;
13793     END IF; --task_type_code <> 'SUMMARY'
13794     IF get_prj_tsk_details_csr_rec.cost_parent_id IS NULL THEN
13795       IF get_prj_tsk_details_csr_rec.top_task_id IS NULL THEN
13796         l_project_parent_task_id      :=  NULL;
13797       ELSE
13798         l_project_parent_task_id      :=  get_prj_tsk_details_csr_rec.top_task_id;
13799       END IF;
13800     ELSE --cost parent is null
13801       OPEN get_cost_parent_details_csr(get_prj_tsk_details_csr_rec.cost_parent_id);
13802       FETCH get_cost_parent_details_csr INTO get_cost_parent_details_rec;
13803       CLOSE get_cost_parent_details_csr;
13804       IF get_cost_parent_details_rec.task_type_code <> 'SUMMARY' THEN
13805         -- If the cost parent is a non-summary task,
13806         -- make the parent roll-up task corresponding to this task as the parent
13807         OPEN get_prj_parent_tsk_csr(get_cost_parent_details_rec.project_task_id);
13808         FETCH get_prj_parent_tsk_csr INTO l_project_parent_task_id;
13809         CLOSE get_prj_parent_tsk_csr;
13810       ELSE
13811         l_project_parent_task_id := get_cost_parent_details_rec.project_task_id;
13812       END IF;
13813     END IF; --cost parent is null
13814   CLOSE get_prj_tsk_details_csr;
13815 
13816 
13817   PA_PROJECT_PUB.UPDATE_TASK(
13818       p_api_version_number         =>     1,
13819       p_commit                     =>     'F',
13820       p_init_msg_list              =>     'F',
13821       p_msg_count                  =>     l_msg_count,
13822       p_msg_data                   =>     l_msg_data,
13823       p_return_status              =>     l_return_status,
13824       p_pa_project_id              =>     l_project_id,
13825       p_pa_task_id                 =>     l_project_task_id,
13826       p_pm_product_code            =>     l_pm_product_code,
13827       p_pa_parent_task_id          =>     l_project_parent_task_id,
13828       p_out_pa_task_id             =>     l_out_pa_task_id,
13829       p_out_pm_task_reference      =>     l_out_pm_task_reference,
13830       p_update_task_structure      =>     l_update_task_structure);
13831 
13832 
13833    IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
13834      fnd_log.string(fnd_log.level_statement, L_DEBUG_KEY, 'After calling PA_PROJECT_PUB.ADD_TASK, l_return_status: ' || l_return_status ||
13835                     ', Returned Task Id: ' || l_out_pa_task_id ||
13836                     ', Returned Task Reference: ' || l_out_pm_task_reference);
13837    END IF;
13838    x_return_status := l_return_status ;
13839 
13840    IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
13841      IF (l_log_statement >= l_log_current_level) THEN
13842         fnd_log.string(l_log_statement,
13843                       L_DEBUG_KEY,
13844                       'Errors from PA_PROJECT_PUB.update_project. Message count: ' ||
13845                       l_msg_count || ', message data: ' || l_msg_data);
13846      END IF;
13847      IF l_return_status = FND_API.G_RET_STS_ERROR THEN
13848         RAISE FND_API.G_EXC_ERROR;
13849      ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
13850         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
13851      END IF;
13852   END IF;  -- Return Status is not success
13853   IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level) THEN
13854     fnd_log.string(fnd_log.level_procedure,L_DEBUG_KEY||'.end','At the end of plsql procedure');
13855   END IF;
13856 
13857 
13858 
13859 EXCEPTION
13860  WHEN FND_API.G_EXC_ERROR THEN
13861    x_return_status := FND_API.G_RET_STS_ERROR;
13862    ROLLBACK TO Update_Project_Task;
13863    FND_MSG_PUB.count_and_get(p_count => x_msg_count,
13864                               p_data  => x_msg_data,
13865                               p_encoded => fnd_api.g_false);
13866 
13867  WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
13868    x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
13869    ROLLBACK TO Update_Project_Task;
13870    FND_MSG_PUB.count_and_get(p_count => x_msg_count,
13871                               p_data  => x_msg_data,
13872                               p_encoded => fnd_api.g_false);
13873 
13874  WHEN OTHERS THEN
13875     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
13876     ROLLBACK TO Update_Project_Task;
13877     IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
13878        fnd_msg_pub.add_exc_msg(p_pkg_name       => G_PKG_NAME,
13879                                p_procedure_name => 'Update_Project',
13880                                p_error_text     => SUBSTR(SQLERRM,1,500));
13881     END IF;
13882     FND_MSG_PUB.count_and_get(p_count => x_msg_count,
13883                                p_data  => x_msg_data,
13884                                p_encoded => fnd_api.g_false);
13885 
13886 END Update_Project_Task;
13887 
13888 
13889 -------------------------------------------------------------------
13890 --  Procedure name    : Use_New_Task_Structure
13891 --  Type              : Private
13892 --  Function          : To determine whether the new structure should be used for
13893 --                      the project tasks. It is a helper function that will be
13894 --                      used by other APIs in this package.
13895 --  Parameters :
13896 --  Standard IN Parameters :
13897 --  p_commit      IN    VARCHAR2  Fnd_Api.G_FALSE
13898 --
13899 --  Update_Project_Task_Times Parameters  :
13900 --  p_visit_id   IN    NUMBER Required
13901 --
13902 --  Standard OUT Parameters :
13903 --      x_return_status    OUT   VARCHAR2   Required
13904 --      x_msg_count        OUT   NUMBER     Required
13905 --      x_msg_data         OUT   VARCHAR2   Required
13906 --
13907 --  Version :
13908 -------------------------------------------------------------------
13909 PROCEDURE Use_New_Task_Structure
13910 ( p_visit_id            IN         NUMBER,
13911   x_new_structure_flag  OUT NOCOPY VARCHAR2
13912 )
13913 IS
13914    L_API_NAME         CONSTANT VARCHAR2(30)  := 'Use_New_Task_Structure';
13915    L_FULL_NAME        CONSTANT VARCHAR2(60)  := G_PKG_NAME || '.' || L_API_NAME;
13916    L_DEBUG_KEY        CONSTANT VARCHAR2(100) := 'ahl.plsql.' || L_FULL_NAME;
13917 
13918    l_msg_count                  NUMBER;
13919    l_msg_data                   VARCHAR2(2000);
13920    l_return_status              VARCHAR2(1);
13921    l_project_parent_task_id     NUMBER;
13922    l_is_comp_visit              VARCHAR2(1);
13923 
13924 
13925 --To find the visit details
13926 CURSOR get_vst_prj_details_csr (c_visit_id IN NUMBER) IS
13927   SELECT project_id, project_template_id
13928   FROM ahl_visits_b
13929   WHERE visit_id = c_visit_id ;
13930 get_vst_prj_details_csr_rec get_vst_prj_details_csr%ROWTYPE;
13931 
13932 -- PRAKKUM :: FPBug 16481709 for BaseBug 14828418 :: 07/11/2012 :: START
13933 -- Changed query to get count of visit tasks that have parent (discarding project tasks that not associated to visit task)
13934 --To find the parent task ids of the project tasks
13935 /*CURSOR get_parent_prj_tsk_id_csr (x_project_id IN NUMBER) IS
13936   SELECT parent_task_id
13937   FROM pa_tasks
13938   WHERE project_id = x_project_id ;*/
13939 
13940   CURSOR get_parent_prj_tsk_id_csr (c_project_id IN NUMBER) IS
13941   SELECT count(PTSK.parent_task_id)
13942   FROM pa_tasks PTSK, AHL_VISIT_TASKS_B VTSK
13943   WHERE
13944   VTSK.PROJECT_TASK_ID = PTSK.TASK_ID
13945   AND VTSK.VISIT_ID = p_visit_id
13946   AND PTSK.project_id = c_project_id ;
13947 
13948   l_tasks_with_parent NUMBER := 0;
13949 -- PRAKKUM :: FPBug 16481709 for BaseBug 14828418 :: 07/11/2012 :: END
13950 
13951 -- SKPATHAK :: 07-OCT-2011 :: VWPE ER: 12856858
13952 --To find the count of the project tasks
13953 CURSOR get_project_task_count (x_project_id IN NUMBER) IS
13954   SELECT count(*)
13955   FROM pa_tasks
13956   WHERE project_id = x_project_id ;
13957 l_count NUMBER;
13958 
13959 -- SKPATHAK :: Bug 14016007 :: 03-MAY-2012 ::
13960 -- To find if the visit has a STAGE task
13961 CURSOR get_stage_task_count (c_visit_id IN NUMBER) IS
13962   SELECT count(visit_task_id)
13963   FROM ahl_visit_tasks_b
13964   WHERE task_type_code = 'STAGE'
13965   AND status_code <> 'DELETED'
13966   AND visit_id = c_visit_id;
13967 
13968 l_stage_task_count NUMBER;
13969 
13970 
13971 BEGIN
13972 
13973   IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level) THEN
13974     fnd_log.string(fnd_log.level_procedure,L_DEBUG_KEY||'.begin', 'At the start of plsql procedure.');
13975   END IF;
13976 
13977   -- SKPATHAK :: Bug 14016007 :: 03-MAY-2012 :: START
13978   -- Component Visits always have new structure and similarly visits with stage tasks will always have new structure
13979   l_is_comp_visit := AHL_CMP_UTIL_PKG.Is_Comp_Visit (p_visit_id);
13980   IF (l_log_statement >= l_log_current_level) THEN
13981     fnd_log.string(l_log_statement,L_DEBUG_KEY,'p_visit_id ** l_is_comp_visit--@> '||p_visit_id||' ** '||l_is_comp_visit);
13982   END IF;
13983 
13984   OPEN get_stage_task_count(p_visit_id);
13985   FETCH get_stage_task_count INTO l_stage_task_count;
13986   CLOSE get_stage_task_count;
13987 
13988   IF (l_log_statement >= l_log_current_level) THEN
13989     fnd_log.string(l_log_statement,L_DEBUG_KEY,'l_is_comp_visit ** l_stage_task_count--@> '||l_is_comp_visit||' ** '||l_stage_task_count);
13990   END IF;
13991   IF ((l_is_comp_visit = 'Y') OR (l_stage_task_count > 0)) THEN
13992      x_new_structure_flag  := 'Y';
13993      RETURN;
13994   END IF;
13995   -- SKPATHAK :: Bug 14016007 :: 03-MAY-2012 :: END
13996 
13997   OPEN get_vst_prj_details_csr(p_visit_id);
13998   FETCH get_vst_prj_details_csr INTO get_vst_prj_details_csr_rec;
13999     -- SKPATHAK :: 07-SEP-2011 :: VWPE ER: 12856858
14000     -- If there are no project tasks in the project, it necessarily is a new visit
14001     OPEN get_project_task_count(get_vst_prj_details_csr_rec.project_id);
14002     FETCH get_project_task_count INTO l_count;
14003     IF l_count = 0 THEN
14004       x_new_structure_flag  := 'Y';
14005       CLOSE get_project_task_count;
14006       RETURN;
14007     END IF;
14008     CLOSE get_project_task_count;
14009 
14010     IF ((get_vst_prj_details_csr_rec.project_id IS NOT NULL)
14011        AND (get_vst_prj_details_csr_rec.project_template_id IS NOT NULL))
14012        THEN
14013          x_new_structure_flag  := 'N';
14014          -- PRAKKUM :: FPBug 16481709 for BaseBug 14828418 :: 07/11/2012 :: START
14015          /*OPEN get_parent_prj_tsk_id_csr(get_vst_prj_details_csr_rec.project_id);
14016          LOOP
14017            FETCH get_parent_prj_tsk_id_csr INTO l_project_parent_task_id;
14018            EXIT WHEN get_parent_prj_tsk_id_csr%NOTFOUND;
14019            IF l_project_parent_task_id IS NOT NULL THEN
14020              x_new_structure_flag  := 'Y';
14021            END IF;
14022          END LOOP;
14023          CLOSE get_parent_prj_tsk_id_csr;*/
14024 
14025          -- As we are not passing any project task details which are not associated to any visit task
14026          -- to Projects API while handling Update Project in Type 4 mode, set new structure flag to 'Y'
14027          -- only if any visit project task have parent relationship
14028          OPEN get_parent_prj_tsk_id_csr(get_vst_prj_details_csr_rec.project_id);
14029          FETCH get_parent_prj_tsk_id_csr INTO l_tasks_with_parent;
14030          CLOSE get_parent_prj_tsk_id_csr;
14031 
14032          IF (l_log_statement >= l_log_current_level) THEN
14033             fnd_log.string(l_log_statement,L_DEBUG_KEY,'project_id ** l_tasks_with_parent--@> '||get_vst_prj_details_csr_rec.project_id||' ** '||l_tasks_with_parent);
14034          END IF;
14035 
14036          IF l_tasks_with_parent >0  THEN
14037              x_new_structure_flag  := 'Y';
14038          END IF;
14039          -- PRAKKUM :: FPBug 16481709 for BaseBug 14828418 :: 07/11/2012 :: END
14040 
14041     ELSE
14042       x_new_structure_flag  := 'Y';
14043     END IF;
14044   CLOSE get_vst_prj_details_csr;
14045 
14046   IF (l_log_statement >= l_log_current_level) THEN
14047       fnd_log.string(l_log_statement,L_DEBUG_KEY,'x_new_structure_flag--@> '||x_new_structure_flag);
14048   END IF;
14049 
14050   IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level) THEN
14051     fnd_log.string(fnd_log.level_procedure,L_DEBUG_KEY||'.end','At the end of plsql procedure');
14052   END IF;
14053 
14054 END Use_New_Task_Structure;
14055 
14056 -- To sort a table of Project Tasks by their display_sequence. Nulls are treated as 99999999.
14057 PROCEDURE Sort_Task_Table (p_x_task_tbl IN OUT NOCOPY PA_PROJECT_PUB.TASK_IN_TBL_TYPE) IS
14058    L_API_NAME         CONSTANT VARCHAR2(30)  := 'Sort_Task_Table';
14059    L_FULL_NAME        CONSTANT VARCHAR2(60)  := G_PKG_NAME || '.' || L_API_NAME;
14060    L_DEBUG            CONSTANT VARCHAR2(100) := 'ahl.plsql.' || L_FULL_NAME;
14061   l_temp_rec          PA_PROJECT_PUB.TASK_IN_REC_TYPE;
14062 BEGIN
14063   IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level) THEN
14064     fnd_log.string(fnd_log.level_procedure, L_DEBUG||'.begin', 'At the start of plsql procedure. p_x_task_tbl.COUNT = ' || p_x_task_tbl.COUNT);
14065   END IF;
14066   IF p_x_task_tbl.COUNT > 0 THEN
14067     FOR i in p_x_task_tbl.FIRST .. p_x_task_tbl.LAST LOOP
14068       FOR j in p_x_task_tbl.FIRST .. p_x_task_tbl.LAST - 1 LOOP
14069         IF NVL(p_x_task_tbl(j).display_sequence, 99999999) > NVL(p_x_task_tbl(j+1).display_sequence, 99999999) THEN
14070           -- Swap
14071           l_temp_rec := p_x_task_tbl(j+1);
14072           p_x_task_tbl(j+1) := p_x_task_tbl(j);
14073           p_x_task_tbl(j) := l_temp_rec;
14074         END IF;
14075       END LOOP; -- j loop
14076     END LOOP;  -- i loop
14077   END IF;
14078 
14079   IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
14080     IF p_x_task_tbl.COUNT > 0 THEN
14081       fnd_log.string(fnd_log.level_statement, L_DEBUG, 'List of Project Tasks after sorting');
14082       FOR i in p_x_task_tbl.FIRST .. p_x_task_tbl.LAST LOOP
14083         fnd_log.string(fnd_log.level_statement, L_DEBUG, ' PA_TASK_ID --@>'||p_x_task_tbl(i).PA_TASK_ID ||
14084                                                          ' PA_PARENT_TASK_ID --@>'||p_x_task_tbl(i).PA_PARENT_TASK_ID ||
14085                                                          ' PM_TASK_REFERENCE --@>'||p_x_task_tbl(i).PM_TASK_REFERENCE ||
14086                                                          ' PM_PARENT_TASK_REFERENCE --@>'||p_x_task_tbl(i).PM_PARENT_TASK_REFERENCE ||
14087                                                          ' TASK_NAME --@>'||p_x_task_tbl(i).TASK_NAME ||
14088                                                          ' LONG_TASK_NAME --@>'||p_x_task_tbl(i).LONG_TASK_NAME ||
14089                                                          ' PA_TASK_NUMBER --@>'||p_x_task_tbl(i).PA_TASK_NUMBER ||
14090                                                          ' TASK_START_DATE --@>'||p_x_task_tbl(i).TASK_START_DATE ||
14091                                                          ' TASK_COMPLETION_DATE --@>'||p_x_task_tbl(i).TASK_COMPLETION_DATE ||
14092                                                          ' DISPLAY_SEQUENCE --@>'||p_x_task_tbl(i).DISPLAY_SEQUENCE);
14093       END LOOP;  -- i loop
14094           fnd_log.string(fnd_log.level_statement, L_DEBUG, 'End of Project Tasks');
14095     END IF;
14096   END IF;
14097 
14098   IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level) THEN
14099     fnd_log.string(fnd_log.level_procedure, L_DEBUG||'.end', 'Exiting Procedure.');
14100   END IF;
14101 END Sort_Task_Table;
14102 
14103 --PRAKKUM :: PIE :: 13-OCT-2010 :: END
14104 
14105 -- salogan added for supplier warranty starts
14106 ------------------------------------------------------------------------------------
14107 -- Start of Comments
14108 --  Procedure name    : Get_Entl_rec_for_Delete
14109 --  Type              : Private
14110 --  Function          : To delete the corresponding entitlement record of the Visit Task.
14111 --                      If for an sr id in entitlement record, the corresponding visit task id is null,
14112 --                      that means there was an MR attached to the NR.
14113 --                      So we need to delete only such entitlement records
14114 --  Pre-reqs          :
14115 --  Parameters        : p_visit_id      IN  NUMBER
14116 --                    : x_warranty_entl_tbl OUT AHL_WARRANTY_ENTL_PVT.Warranty_Entl_Tbl_Type
14117 --
14118 --  End of Comments
14119 
14120 PROCEDURE Get_Entl_rec_for_delete(
14121         p_visit_id          IN         NUMBER,
14122         x_warranty_entl_tbl OUT NOCOPY AHL_WARRANTY_ENTL_PVT.Warranty_Entl_Tbl_Type
14123 ) IS
14124 
14125    -- Standard variables
14126    L_API_NAME  CONSTANT VARCHAR2(30)  := 'Get_Entl_rec_for_Delete';
14127    L_DEBUG_KEY CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
14128    -- Local variables defined for the procedure
14129    l_warranty_entl_id     NUMBER      := null;
14130    l_task_id              NUMBER      := null;
14131    l_sr_incident_id       NUMBER      := null;
14132    i                      NUMBER      :=0;
14133    l_entitlement_rec      AHL_WARRANTY_ENTL_PVT.Warranty_Entl_Rec_Type;
14134 
14135    --Cursors defined for the procedure
14136    --Cursor to fetch entitlement details based on Sr Incident Id
14137    CURSOR c_get_entl_details (c_sr_incident_id IN NUMBER) IS
14138     SELECT AWSE.WARRANTY_ENTITLEMENT_ID, AWSE.VISIT_TASK_ID
14139     FROM AHL_WARRANTY_ENTITLEMENTS AWSE
14140     WHERE AWSE.SR_INCIDENT_ID = c_sr_incident_id;
14141 
14142    --Cursor to fetch SR Id's of Visit
14143    CURSOR get_sr_ids (c_visit_id IN NUMBER) IS
14144     SELECT DISTINCT service_request_id
14145     FROM ahl_visit_tasks_b
14146     WHERE visit_id = c_visit_id;
14147 
14148 
14149 BEGIN
14150    --------------------Start of API Body-----------------------------------
14151    IF(l_log_procedure >= l_log_current_level) THEN
14152       fnd_log.string(l_log_procedure,
14153                       L_DEBUG_KEY ||'.begin',
14154                       'At the start of PL SQL procedure.');
14155    END IF;
14156 
14157    --------------------Get Entitlements Record For Update-------------------
14158    IF(p_visit_id is null) THEN
14159     IF(l_log_statement >= l_log_current_level) THEN
14160        fnd_log.string(l_log_statement,
14161                        L_DEBUG_KEY,
14162                        'Passed visit id is null');
14163     END IF;
14164     FND_MSG_PUB.add;
14165    END IF;
14166 
14167    OPEN get_sr_ids(p_visit_id);
14168    LOOP
14169     FETCH get_sr_ids into l_sr_incident_id;
14170         EXIT WHEN get_sr_ids%NOTFOUND;
14171         OPEN c_get_entl_details(l_sr_incident_id);
14172         FETCH c_get_entl_details into l_warranty_entl_id, l_task_id;
14173         IF(c_get_entl_details%FOUND AND l_task_id IS NULL) THEN --warranty entitlement exists
14174            l_entitlement_rec.warranty_entitlement_id := l_warranty_entl_id;
14175            l_entitlement_rec.operation_flag          := AHL_WARRANTY_ENTL_PVT.G_OP_DELETE;
14176            x_warranty_entl_tbl(i) := l_entitlement_rec;
14177         END IF;
14178         CLOSE c_get_entl_details;
14179         i := i+1;
14180    END LOOP;
14181    CLOSE get_sr_ids;
14182 
14183    IF(l_log_procedure >= l_log_current_level) THEN
14184       fnd_log.string(l_log_procedure,
14185                      L_DEBUG_KEY ||'.End',
14186                      'End of API.');
14187    END IF;
14188 
14189 END Get_Entl_rec_for_Delete;
14190 -- salogan added for supplier warranty ends
14191 
14192 -- SKPATHAK :: 02-MAY-2011 :: VWPE: ER:12424063  :: STARTS
14193 -------------------------------------------------------------------
14194 --  Procedure name    : Plan_visit
14195 --  Type              : Private
14196 --  Function          : Procedure to plan a visit i.e. to move the visit from draft to planning status
14197 --                      and create draft WOs for all its tasks
14198 --  Parameters  :
14199 --
14200 --  Standard IN  Parameters :
14201 --      p_api_version      IN  NUMBER        Required
14202 --      p_init_msg_list    IN  VARCHAR2      Default  FND_API.G_FALSE
14203 --      p_validation_level IN  NUMBER        Default  FND_API.G_VALID_LEVEL_FULL
14204 --
14205 --  Standard OUT Parameters :
14206 --      x_return_status    OUT VARCHAR2      Required
14207 --      x_msg_count        OUT NUMBER        Required
14208 --      x_msg_data         OUT VARCHAR2      Required
14209 --
14210 --  plan_visit Parameters:
14211 --       p_visit_id        IN  NUMBER        Required
14212 --       p_caller      IN  VARCHAR2      Default  Null
14213 --       P_caller can be either JAVA or FORMS depending on whether this API i called from JAVA layer orthrough forms
14214 --------------------------------------------------------------------------------------------------------------------
14215 PROCEDURE plan_visit (
14216     p_api_version           IN             NUMBER    := 1.0,
14217     p_init_msg_list         IN             VARCHAR2  := FND_API.G_FALSE,
14218     p_commit                IN             VARCHAR2  := FND_API.G_FALSE,
14219     p_validation_level      IN             NUMBER    := FND_API.G_VALID_LEVEL_FULL,
14220     p_caller                IN             VARCHAR2  := NULL,
14221     p_visit_id              IN             NUMBER,
14222     x_return_status         OUT NOCOPY     VARCHAR2,
14223     x_msg_count             OUT NOCOPY     NUMBER,
14224     x_msg_data              OUT NOCOPY     VARCHAR2)IS
14225 
14226 -- Local Variables
14227 
14228 -- Standard in/out parameters
14229 l_api_name                    VARCHAR2(30) := 'PLAN_VISIT';
14230 l_api_version                 NUMBER       := 1.0;
14231 l_msg_count                   NUMBER;
14232 l_msg_data                    VARCHAR2(2000);
14233 l_return_status               VARCHAR2(1);
14234 l_init_msg_list               VARCHAR2(10):= p_init_msg_list;
14235 
14236 l_release_visit_required      VARCHAR2(1) :='N';
14237 l_status_code                 VARCHAR2(80);
14238 l_dummy                       VARCHAR2(1);
14239 l_visit_number                NUMBER;
14240 l_release_flag                VARCHAR2(1) :='N';
14241 
14242 Cursor get_visit_status (x_visit_id IN NUMBER)
14243 IS
14244 SELECT status_code, visit_number
14245 FROM ahl_visits_b
14246 WHERE visit_id = x_visit_id;
14247 
14248 BEGIN
14249 
14250     IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level)THEN
14251       fnd_log.string
14252       (
14253         fnd_log.level_procedure,
14254        'ahl.plsql.AHL_VWP_PROJ_PROD_PVT.plan_visit.begin',
14255        'At the start of PLSQL procedure, Visit ID : ' || p_visit_id
14256       );
14257     END IF;
14258 
14259     -- Standard start of API savepoint
14260      SAVEPOINT plan_visit_pvt;
14261 
14262     -- Initialize message list if p_init_msg_list is set to TRUE
14263 
14264      IF FND_API.To_Boolean( p_init_msg_list) THEN
14265         FND_MSG_PUB.Initialize;
14266      END IF;
14267 
14268      -- Initialize API return status to success
14269      x_return_status := FND_API.G_RET_STS_SUCCESS;
14270 
14271      -- Standard call to check for call compatibility.
14272      IF NOT Fnd_Api.COMPATIBLE_API_CALL(l_api_version,
14273                                       p_api_version,
14274                                       l_api_name,G_PKG_NAME)
14275      THEN
14276        RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
14277      END IF;
14278 
14279      -- make sure that visit id is present in the input
14280      IF(p_visit_id IS NULL OR p_visit_id = FND_API.G_MISS_NUM) THEN
14281         FND_MESSAGE.Set_Name(G_PM_PRODUCT_CODE,'AHL_VWP_CST_INPUT_MISS');
14282         FND_MSG_PUB.ADD;
14283 
14284         IF (fnd_log.level_exception >= fnd_log.g_current_runtime_level)THEN
14285         fnd_log.string
14286         (
14287           fnd_log.level_exception,
14288           'ahl.plsql.AHL_VWP_PROJ_PROD_PVT.plan_visit',
14289           'Visit id is mandatory but found null in input '
14290         );
14291         END IF;
14292         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
14293      END IF;
14294 
14295      OPEN get_visit_status(p_visit_id);
14296      FETCH get_visit_status INTO l_status_code, l_visit_number;
14297      CLOSE get_visit_status;
14298 
14299      IF(l_status_code IS NULL ) THEN
14300         FND_MESSAGE.Set_Name(G_PM_PRODUCT_CODE,'AHL_VISIT_ID_INVALID');
14301         FND_MSG_PUB.ADD;
14302 
14303         IF (fnd_log.level_exception >= fnd_log.g_current_runtime_level)THEN
14304         fnd_log.string
14305         (
14306           fnd_log.level_exception,
14307           'ahl.plsql.AHL_VWP_PROJ_PROD_PVT.plan_visit',
14308           'Input Visit id is INVALID '
14309         );
14310         END IF;
14311         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
14312      END IF;
14313 
14314      -- We need to call release_visit only if all the visit tasks already do NOT have corresponding WOs
14315      -- If they already have WOs, just updating the visit status is sufficient
14316      AHL_VWP_VISIT_CST_PR_PVT.check_for_release_visit
14317      (
14318           p_visit_id                    =>p_visit_id,
14319           x_release_visit_required      =>l_release_visit_required
14320      );
14321 
14322     -- If the caller is JAVA, this is called from bg_release_visit and validation has already been done
14323     -- So pass release flag as 'U' so as not to do the validation again in Release_visit
14324     IF p_caller = 'JAVA' THEN
14325       l_release_flag := 'U';
14326     END IF;
14327 
14328     -- Release visit if required
14329     -- SKPATHAK :: 20-JUN-2011 :: VWPE: ER:12673125
14330     -- If caller is create stage task API, then necessarily call RELEASE_VISIT
14331     IF l_release_visit_required ='Y' OR p_caller IN ('STG','UNA') THEN
14332 
14333       IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level) THEN
14334           fnd_log.string
14335         (
14336           fnd_log.level_procedure,
14337           'ahl.plsql.'||g_pkg_name||'.'||l_api_name||':',
14338           'Before calling ahl vwp proj prod pvt.release visit'
14339         );
14340       END IF;
14341 
14342       AHL_VWP_PROJ_PROD_PVT.RELEASE_VISIT (
14343              p_api_version => l_api_version,
14344              p_init_msg_list => Fnd_Api.g_false,
14345              p_commit => Fnd_Api.g_false,
14346              p_validation_level => p_validation_level,
14347              p_module_type => 'CST',
14348              p_visit_id => p_visit_id,
14349              p_release_flag => l_release_flag,
14350              x_return_status => l_return_status,
14351              x_msg_count => l_msg_count,
14352              x_msg_data => l_msg_data);
14353 
14354       IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level) THEN
14355         fnd_log.string
14356         (
14357           fnd_log.level_procedure,
14358            'ahl.plsql.'||g_pkg_name||'.'||l_api_name||': End API',
14359            'After calling ahl vwp proj prod pvt.Release Visit : '|| l_return_status
14360         );
14361       END IF;
14362 
14363     END IF;  -- released required flag
14364 
14365     IF l_return_status = 'V' THEN
14366        x_return_status := l_return_status;
14367        -- Check Error Message stack.
14368     ELSIF (l_return_status <>  FND_API.G_RET_STS_SUCCESS) THEN
14369        x_msg_count := l_msg_count;
14370        x_return_status := l_return_status;
14371        IF l_return_status = Fnd_Api.g_ret_sts_error THEN
14372           RAISE Fnd_Api.g_exc_error;
14373        ELSIF l_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
14374           RAISE Fnd_Api.g_exc_unexpected_error;
14375        END IF;
14376     ELSE
14377       IF l_status_code = 'DRAFT' THEN
14378         UPDATE AHL_VISITS_B
14379         SET    STATUS_CODE = 'PLANNING',
14380                OBJECT_VERSION_NUMBER = OBJECT_VERSION_NUMBER + 1,
14381                LAST_UPDATE_DATE      = SYSDATE,
14382                LAST_UPDATED_BY       = Fnd_Global.USER_ID,
14383                LAST_UPDATE_LOGIN     = Fnd_Global.LOGIN_ID
14384         WHERE  VISIT_ID = p_visit_id;
14385       END IF;
14386 
14387     END IF;
14388 
14389      -- PRAKKUM :: 13-FEB-2011 :: Bug 13711800 :: START
14390      IF (l_log_statement >= l_log_current_level) THEN
14391           fnd_log.string(l_log_statement,'ahl.plsql.'||g_pkg_name||'.'||l_api_name||': End API','Before calling AHL_VWP_VISITS_STAGES_PVT.VALIDATE_STAGE_DATES ');
14392      END IF;
14393 
14394      AHL_VWP_VISITS_STAGES_PVT.VALIDATE_STAGE_DATES( p_visit_id          => p_visit_id,
14395                                                      x_return_status     => l_return_status,
14396                                                      x_msg_count         => l_msg_count,
14397                                                      x_msg_data          => l_msg_data);
14398 
14399      IF (l_log_statement >= l_log_current_level) THEN
14400           fnd_log.string(l_log_statement,'ahl.plsql.'||g_pkg_name||'.'||l_api_name||': End API','After calling AHL_VWP_VISITS_STAGES_PVT.VALIDATE_STAGE_DATES - l_return_status : '||l_return_status);
14401      END IF;
14402 
14403      IF l_msg_count > 0 OR NVL(l_return_status,'x') <> FND_API.G_RET_STS_SUCCESS THEN
14404           x_msg_count := l_msg_count;
14405           x_return_status := l_return_status;
14406           IF l_return_status = Fnd_Api.g_ret_sts_error THEN
14407              RAISE Fnd_Api.g_exc_error;
14408           ELSIF l_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
14409              RAISE Fnd_Api.g_exc_unexpected_error;
14410           END IF;
14411      END IF;
14412      -- PRAKKUM :: 13-FEB-2011 :: Bug 13711800 :: END
14413 
14414      IF Fnd_Api.To_Boolean (p_commit) THEN
14415          COMMIT WORK;
14416       END IF;
14417 
14418       Fnd_Msg_Pub.count_and_get(
14419             p_encoded => Fnd_Api.g_false,
14420             p_count   => x_msg_count,
14421             p_data    => x_msg_data
14422       );
14423 
14424     IF (fnd_log.level_procedure >= fnd_log.g_current_runtime_level)THEN
14425       fnd_log.string
14426       (
14427         fnd_log.level_procedure,
14428         'ahl.plsql.AHL_VWP_PROJ_PROD_PVT.plan_visit.end',
14429         'At the end of PLSQL procedure'
14430       );
14431     END IF;
14432 
14433 EXCEPTION
14434 
14435  WHEN FND_API.G_EXC_ERROR THEN
14436 
14437    x_return_status := FND_API.G_RET_STS_ERROR;
14438    ROLLBACK TO plan_visit_pvt;
14439    FND_MSG_PUB.count_and_get( p_count => x_msg_count,
14440                               p_data  => x_msg_data,
14441                               p_encoded => fnd_api.g_false);
14442 
14443  WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
14444    x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
14445    ROLLBACK TO plan_visit_pvt;
14446    FND_MSG_PUB.count_and_get( p_count => x_msg_count,
14447                               p_data  => x_msg_data,
14448                               p_encoded => fnd_api.g_false);
14449 
14450  WHEN OTHERS THEN
14451     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
14452     ROLLBACK TO plan_visit_pvt;
14453 
14454     IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
14455        fnd_msg_pub.add_exc_msg(p_pkg_name       => G_PKG_NAME,
14456                                p_procedure_name => 'plan_visit',
14457                                p_error_text     => SUBSTR(SQLERRM,1,500));
14458     END IF;
14459 
14460     FND_MSG_PUB.count_and_get( p_count => x_msg_count,
14461                                p_data  => x_msg_data,
14462                                p_encoded => fnd_api.g_false);
14463 END Plan_visit;
14464 
14465 -------------------------------------------------------------------
14466 --  Procedure name    : Push_stages_to_production
14467 --  Type              : Private
14468 --  Function          : Push the selected stages to production.
14469 --  Parameters  :
14470 --
14471 --  Standard IN  Parameters :
14472 --      p_api_version      IN  NUMBER        Required
14473 --      p_init_msg_list    IN  VARCHAR2      Default  FND_API.G_FALSE
14474 --      p_validation_level IN  NUMBER        Default  FND_API.G_VALID_LEVEL_FULL
14475 --      p_module_type      IN  VARCHAR2      Default  Null
14476 --
14477 --  Standard OUT Parameters :
14478 --      x_return_status    OUT VARCHAR2      Required
14479 --      x_msg_count        OUT NUMBER        Required
14480 --      x_msg_data         OUT VARCHAR2      Required
14481 --
14482 --  Push_stages_to_production Parameters:
14483 --       p_module_type     IN  VARCHAR2      Default = NULL
14484 --       p_visit_id        IN  NUMBER        Required
14485 --       p_stages_tbl      IN  Visit_Stages_Tbl_Type Required
14486 --       p_release_flag    IN  VARCHAR2      Default = 'N'
14487 --
14488 -------------------------------------------------------------------
14489 
14490 PROCEDURE Push_stages_to_production(
14491     p_api_version      IN         NUMBER,
14492     p_init_msg_list    IN         VARCHAR2  := Fnd_Api.g_false,
14493     p_commit           IN         VARCHAR2  := FND_API.G_FALSE,
14494     p_validation_level IN         NUMBER    := Fnd_Api.g_valid_level_full,
14495     p_module_type      IN         VARCHAR2  := Null,
14496     p_visit_id         IN         NUMBER,
14497     p_stages_tbl       IN         AHL_VWP_VISITS_STAGES_PVT.Visit_Stages_Tbl_Type,
14498     p_release_flag     IN         VARCHAR2  ,
14499     x_return_status    OUT NOCOPY VARCHAR2,
14500     x_msg_count        OUT NOCOPY NUMBER,
14501     x_msg_data         OUT NOCOPY VARCHAR2
14502 ) IS
14503 
14504 --fetch master work order for the visit
14505 CURSOR c_visit_master_wo  (c_visit_id IN NUMBER) IS
14506  SELECT wo.workorder_id, wo.status_code, wip.scheduled_start_date,wip.scheduled_completion_date,wo.object_version_number
14507  FROM ahl_visits_b v, ahl_workorders wo, wip_discrete_jobs wip
14508  WHERE v.visit_id = c_visit_id
14509   AND v.visit_id = wo.visit_id
14510   AND wo.visit_task_id IS NULL
14511   AND wo.master_workorder_flag = 'Y'
14512   AND wip.wip_entity_id = wo.wip_entity_id
14513   AND wo.status_code not in ('22','7');
14514 
14515 l_mst_wo_visit_rec  c_visit_master_wo%ROWTYPE;
14516 
14517 --fetch visit details
14518 CURSOR c_visit_dtl (c_visit_id IN NUMBER) IS
14519  SELECT * FROM ahl_visits_vl
14520  WHERE visit_id = c_visit_id;
14521 
14522 l_visit_dtl_rec c_visit_dtl%ROWTYPE;
14523 
14524 --fetch work order for the task
14525 CURSOR c_task_wo  (c_visit_id IN NUMBER,c_visit_task_id IN NUMBER) IS
14526 SELECT wo.visit_task_id, wo.workorder_id, wo.status_code, wip.scheduled_start_date,wip.scheduled_completion_date,wo.object_version_number
14527 FROM ahl_workorders wo, wip_discrete_jobs wip
14528 WHERE wo.visit_id = c_visit_id
14529 AND wo.visit_task_id = c_visit_task_id
14530 AND wip.wip_entity_id = wo.wip_entity_id
14531 AND wo.status_code not in ('22','7');
14532 l_task_wo_rec c_task_wo%ROWTYPE;
14533 
14534 --fetch summary task flag for the task
14535 CURSOR c_fet_sum_task_flg (c_visit_id IN NUMBER, c_visit_task_id IN NUMBER) IS
14536 SELECT summary_task_flag FROM ahl_visit_tasks_b
14537 WHERE visit_task_id = c_visit_task_id;
14538 
14539 --get summary task start, end time
14540 CURSOR get_summary_task_times_csr(c_task_id IN NUMBER)IS
14541 SELECT min(start_date_time), max(end_date_time)
14542 FROM ahl_visit_tasks_b  VST
14543 START WITH visit_task_id  = c_task_id
14544 AND NVL(VST.status_code, 'Y') <> 'DELETED'
14545     CONNECT BY originating_task_id = PRIOR visit_task_id;
14546 
14547 --find Route Id from MR Routes view
14548 CURSOR c_route (c_mr_route_id IN NUMBER) IS
14549 SELECT Route_Id FROM AHL_MR_ROUTES_V
14550 WHERE MR_ROUTE_ID = c_mr_route_id;
14551 
14552 --Inventory item id and instance id to be defaulted when
14553 --the item and instance are not specified at the header level
14554 CURSOR default_task_inst_dtls(c_task_id IN NUMBER) IS
14555 SELECT inventory_item_id,instance_id
14556 FROM ahl_visit_tasks_b
14557 WHERE visit_task_id = c_task_id;
14558 def_task_inst_rec  default_task_inst_dtls%ROWTYPE;
14559 
14560 --Fetches the route information for updating workorder
14561 --description for tasks created from Routes
14562 CURSOR get_wo_dtls_for_mrtasks_cur (p_task_id IN NUMBER) IS
14563 SELECT ar.route_no||'.'||substrb(ar.title,1,(240 - (lengthb(ar.route_no) + 1))) workorder_description
14564 FROM ahl_routes_vl ar,ahl_visit_tasks_b avt, ahl_mr_routes mrr
14565 WHERE avt.visit_task_id = p_task_id
14566 and nvl(avt.status_code,'Y') = 'PLANNING'
14567 and avt.mr_route_id = mrr.mr_route_id
14568 and mrr.route_id = ar.route_id;
14569 l_wo_dtls_for_mrtasks_rec    get_wo_dtls_for_mrtasks_cur%ROWTYPE;
14570 
14571 --check if all the children of a summary task are in released/unreleased status
14572 CURSOR chk_summary_task_child(c_task_id IN NUMBER) IS
14573  SELECT 'PARTIALLY RELEASED' FROM ahl_visit_tasks_b
14574  WHERE task_type_code IN ('PLANNED','UNPLANNED')
14575  AND status_code = 'PLANNING'
14576  START WITH visit_task_id = c_task_id
14577  CONNECT BY PRIOR visit_task_id = originating_task_id;
14578  l_chk_status_code VARCHAR2(80);
14579 
14580 
14581 --check if visit has planned tasks
14582 CURSOR c_visit_has_planned_tasks(p_visit_id IN NUMBER) IS
14583  SELECT 1 FROM ahl_visit_tasks_b
14584  WHERE visit_id = p_visit_id
14585   AND status_code = 'PLANNING'
14586   -- SATRAJEN :: Bug 13930098 :: Visit stays at PARTIALLY IMPLEMENTED status :: Do NOT consider the default stage task :: July 2012
14587    AND (TASK_TYPE_CODE <> 'STAGE'
14588          OR (STAGE_ID IS NOT NULL AND TASK_TYPE_CODE = 'STAGE'));
14589 
14590 CURSOR c_visit_time_matches_MWO_time(p_visit_id IN NUMBER) IS
14591  SELECT 1
14592  FROM ahl_visits_b vst, ahl_workorders wo, wip_discrete_jobs wdj
14593  WHERE vst.visit_id = p_visit_id
14594   AND wo.visit_id = vst.visit_id
14595   AND wo.MASTER_WORKORDER_FLAG = 'Y'
14596   AND wo.visit_task_id IS NULL
14597   AND wdj.wip_entity_id = wo.wip_entity_id
14598   AND vst.start_date_time = wdj.scheduled_start_date
14599   AND vst.close_date_time = wdj.scheduled_completion_date;
14600 
14601 --get the non-summary tasks in the stage and all of their summary tasks as well
14602 CURSOR get_stage_tasks (c_stage_id IN NUMBER)
14603 IS
14604   SELECT * FROM
14605     --For non-summary tasks
14606     (SELECT * FROM ahl_visit_tasks_vl
14607     WHERE stage_id = c_stage_id
14608     AND task_type_code <> 'STAGE'
14609     UNION ALL
14610     --For summary tasks
14611     SELECT DISTINCT * FROM ahl_visit_tasks_vl
14612     WHERE task_type_code = 'SUMMARY'
14613     START WITH visit_task_id IN (SELECT originating_task_id
14614                                 FROM ahl_visit_tasks_b
14615                                 WHERE stage_id = c_stage_id )
14616     CONNECT BY PRIOR originating_task_id = visit_task_id)
14617   WHERE status_code NOT IN ('CANCELLED','DELETED')
14618   ORDER BY visit_task_number;
14619 
14620 l_task_rec get_stage_tasks%ROWTYPE;
14621 
14622 --SKPATHAK :: VWPE ER-12424063 :: 09-JUN-2011 :: Get the stage and duplicate tasks as well
14623 CURSOR get_non_summary_stage_tasks (c_stage_id IN NUMBER)
14624 IS
14625     --For non-summary tasks
14626     SELECT * FROM ahl_visit_tasks_b
14627     WHERE stage_id = c_stage_id
14628     AND status_code NOT IN ('CANCELLED','DELETED')
14629   ORDER BY visit_task_number;
14630 
14631 l_non_summ_task_rec get_non_summary_stage_tasks%ROWTYPE;
14632 
14633 --SKPATHAK :: VWPE ER-12424063 :: 13-JUN-2011 :: Get only the summary tasks
14634 CURSOR get_summary_stage_tasks (c_stage_id IN NUMBER)
14635 IS
14636     --For summary tasks
14637     SELECT DISTINCT * FROM ahl_visit_tasks_b
14638     WHERE task_type_code = 'SUMMARY'
14639     START WITH visit_task_id IN (SELECT originating_task_id
14640                                 FROM ahl_visit_tasks_b
14641                                 WHERE stage_id = c_stage_id )
14642     CONNECT BY PRIOR originating_task_id = visit_task_id
14643   ORDER BY visit_task_number;
14644 
14645 l_summary_task_rec get_summary_stage_tasks%ROWTYPE;
14646 
14647 
14648 Cursor get_task_wo (c_task_id IN NUMBER) IS
14649 SELECT wo.workorder_id
14650 FROM ahl_workorders wo
14651 WHERE wo.visit_task_id = c_task_id;
14652 
14653 l_temp_num1             NUMBER := NULL;
14654 l_temp_num2             NUMBER := NULL;
14655 l_wo_tbl_count          NUMBER  := 0;
14656 l_sch_start_date        DATE;
14657 l_sch_end_date          DATE;
14658 i                       NUMBER := 0;
14659 L_API_NAME     CONSTANT VARCHAR2(30)  := 'Push_stages_to_production';
14660 L_API_VERSION  CONSTANT NUMBER        := 1.0;
14661 L_DEBUG_KEY    CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
14662 l_msg_data              VARCHAR2(2000);
14663 l_return_status         VARCHAR2(1);
14664 l_msg_count             NUMBER;
14665 l_prd_workorder_tbl     AHL_PRD_WORKORDER_PVT.PRD_WORKORDER_TBL;
14666 idx                     NUMBER := 0;
14667 l_prd_workorder_rel_tbl AHL_PRD_WORKORDER_PVT.prd_workorder_rel_tbl;
14668 l_manual_summ_task_flag VARCHAR2(1) ;
14669 l_firm_planned_flag     VARCHAR2(1) := FND_PROFILE.value('AHL_PRD_FIRM_PLANNED_FLAG');
14670 l_workorder_id          NUMBER;
14671 --SKPATHAK :: VWPE: ER:12424063 :: 26-MAY-2011
14672 l_count_val             NUMBER := 0;
14673 l_task_tbl_in          Task_Tbl_Type;
14674 l_task_tbl_out          Task_Tbl_Type;
14675 l_is_task_already_added VARCHAR2(1) := 'N';
14676 l_val_task_tbl              AHL_VWP_RULES_PVT.Task_Tbl_Type;  --added by skpathak for VWPE
14677 l_planned_order_flag   VARCHAR2(1); --added by skpathak for VWPE
14678 l_has_pre_in_planning             VARCHAR2(1);
14679 
14680    -- PRAKKUM :: VWPE: ER:12673125  :: 23-JUN-2011 :: Upgrade Changes - To find visit is old or new
14681    CURSOR c_is_old_visit(p_visit_id IN NUMBER) IS
14682      select AHL_VWP_VISITS_PVT.Is_Old_Visit(p_visit_id) IS_OLD_VISIT FROM DUAL;
14683 
14684    l_is_old_visit_dets   c_is_old_visit%RowType;
14685 
14686 l_max_schedule_start_date DATE; --BUG 13373947 :: PRAKKUM :: 10/02/2012
14687 
14688 BEGIN
14689     IF (l_log_procedure >= l_log_current_level) THEN
14690        fnd_log.string(l_log_procedure,
14691                       L_DEBUG_KEY ||'.begin',
14692                       'At the start of PL SQL procedure. Visit Id = ' ||
14693                       p_visit_id || ', p_stages_tbl.COUNT = ' || p_stages_tbl.COUNT);
14694     END IF;
14695 
14696     -- Standard start of API savepoint
14697     SAVEPOINT Push_stages_to_prodn_pvt;
14698 
14699     -- Initialize message list if p_init_msg_list is set to TRUE
14700     IF FND_API.To_Boolean(p_init_msg_list) THEN
14701        FND_MSG_PUB.Initialize;
14702     END IF;
14703 
14704     -- Initialize API return status to success
14705     x_return_status := FND_API.G_RET_STS_SUCCESS;
14706 
14707     IF NOT FND_API.COMPATIBLE_API_CALL(l_api_version,
14708                                        p_api_version,
14709                                        l_api_name,G_PKG_NAME)
14710     THEN
14711       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
14712     END IF;
14713 
14714 -- PRAKKUM :: VWPE: ER:12673125  :: 23-JUN-2011 :: Upgrade Changes
14715     OPEN c_is_old_visit(p_visit_id);
14716     FETCH c_is_old_visit INTO l_is_old_visit_dets;
14717     CLOSE c_is_old_visit;
14718 
14719     IF l_is_old_visit_dets.IS_OLD_VISIT = 'Y' THEN
14720       Fnd_Message.SET_NAME('AHL','AHL_VWP_OVST_SP2P_INV');
14721       Fnd_Msg_Pub.ADD;
14722       RAISE Fnd_Api.G_EXC_ERROR;
14723     END IF;
14724 
14725     -- SKPATHAK :: VWPE: ER:12424063 :: 26-MAY-2011 :: STARTS
14726     -- Validate all the Tasks in the stages being P2Ped
14727     FOR i in p_stages_tbl.FIRST..p_stages_tbl.LAST LOOP --for stages
14728       FOR l_task_rec IN get_stage_tasks( p_stages_tbl(i).stage_id ) LOOP --for all the tasks in this stage
14729         l_count_val := l_count_val + 1;
14730         l_task_tbl_in(l_count_val).visit_task_id :=  l_task_rec.visit_task_id;
14731       END LOOP;
14732     END LOOP;
14733     IF (l_log_statement >= l_log_current_level) THEN
14734        fnd_log.string(l_log_statement,
14735                       L_DEBUG_KEY,
14736                       'Before calling Validate_tasks_bef_production l_task_tbl_in.count '||l_task_tbl_in.count);
14737     END IF;
14738     IF l_count_val > 0 THEN
14739       --Validate tasks before push to production happens
14740       AHL_VWP_PROJ_PROD_PVT.Validate_tasks_bef_production(
14741               p_visit_id        => p_visit_id,
14742               p_tasks_tbl       => l_task_tbl_in,
14743               x_tasks_tbl       => l_task_tbl_out,
14744               x_return_status   => l_return_status,
14745               x_msg_count       => l_msg_count,
14746               x_msg_data        => x_msg_data);
14747       IF (l_log_statement >= l_log_current_level) THEN
14748          fnd_log.string(l_log_statement,
14749                         L_DEBUG_KEY,
14750                         'After calling Validate_tasks_bef_production l_return_status= '||l_return_status);
14751       END IF;
14752 
14753       IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
14754          x_msg_count := FND_MSG_PUB.count_msg;
14755          IF (l_log_statement >= l_log_current_level) THEN
14756             fnd_log.string(l_log_statement,
14757                            L_DEBUG_KEY,
14758                            'Errors from PROCESS_JOBS. Message count: ' || x_msg_count);
14759          END IF;
14760          IF l_return_status = FND_API.G_RET_STS_ERROR THEN
14761             RAISE FND_API.G_EXC_ERROR;
14762          ELSE
14763             RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
14764          END IF;
14765       END IF;  -- Return Status is not Success
14766       -- SKPATHAK :: VWPE: ER:12424063 :: 26-MAY-2011 :: ENDS
14767 
14768       -- SKPATHAK :: ER:12730539 :: 01-AUG-2011 :: START :: Validate Return to Supply Flags
14769       -- SKPATHAK:: Moved this API call from after AHL_PRD_WORKORDER_PVT.Process_Jobs call to before AHL_PRD_WORKORDER_PVT.Process_Jobs call
14770       FOR i IN l_task_tbl_in.FIRST..l_task_tbl_in.LAST LOOP
14771         l_val_task_tbl(i)  := l_task_tbl_in(i);
14772       END LOOP;
14773 
14774       IF (l_log_statement >= l_log_current_level) THEN
14775          fnd_log.string(l_log_statement,
14776                         L_DEBUG_KEY,
14777                         'Before Calling AHL_VWP_RULES_PVT.Validate_Return_To_Supply. l_task_tbl_in.count = ' || l_task_tbl_in.count );
14778       END IF;
14779 
14780       IF (p_visit_id IS NOT NULL) THEN
14781         AHL_VWP_RULES_PVT.Validate_Return_To_Supply
14782         (
14783            p_api_version           => 1.0,
14784            p_init_msg_list         => FND_API.G_FALSE,
14785            p_commit                => FND_API.G_FALSE,
14786            p_validation_level      => FND_API.G_VALID_LEVEL_FULL,
14787            p_module_type           => null,
14788            p_visit_id              => null,
14789            p_tasks_tbl             => l_val_task_tbl,
14790            x_return_status         => l_return_status,
14791            x_msg_count             => l_msg_count,
14792            x_msg_data              => l_msg_data
14793        );
14794 
14795         IF (l_log_statement >= l_log_current_level) THEN
14796          fnd_log.string(l_log_statement,
14797                         L_DEBUG_KEY,
14798                         'After Calling AHL_VWP_RULES_PVT.Validate_Return_To_Supply. Return Status = ' || l_return_status );
14799         END IF;
14800 
14801         IF NVL(l_return_status,'x') <> FND_API.G_RET_STS_SUCCESS THEN
14802           x_msg_count := l_msg_count;
14803           x_return_status := l_return_status;
14804           IF l_return_status = Fnd_Api.g_ret_sts_error THEN
14805             RAISE Fnd_Api.g_exc_error;
14806           ELSIF l_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
14807             RAISE Fnd_Api.g_exc_unexpected_error;
14808           END IF;
14809         END IF;
14810       END IF;
14811       -- SKPATHAK :: ER:12730539 :: 01-AUG-2011 :: END
14812 
14813     END IF; --l_count_val > 0 --SKPATHAK::13-OCT-2011::Bug 13043533::Shifted the END IF position
14814 
14815     IF (l_log_statement >= l_log_current_level) THEN
14816        fnd_log.string(l_log_statement,
14817                       L_DEBUG_KEY,
14818                       'Before calling INTEGRATE_TO_PROJECTS for Visit Id ' || p_visit_id);
14819     END IF;
14820 
14821     --update the project for the visit.
14822     AHL_VWP_PROJ_PROD_PVT.Integrate_to_Projects
14823       (p_api_version       => l_api_version,
14824        p_init_msg_list     => FND_API.G_FALSE,
14825        p_commit            => FND_API.G_FALSE,
14826        p_validation_level  => p_validation_level,
14827        p_module_type       => p_module_type,
14828        p_visit_id          => p_visit_id,
14829        x_return_status     => l_return_status,
14830        x_msg_count         => l_msg_count,
14831        x_msg_data          => x_msg_data);
14832 
14833     IF (l_log_statement >= l_log_current_level) THEN
14834        fnd_log.string(l_log_statement,
14835                       L_DEBUG_KEY,
14836                       'After calling Integrate_to_Projects. l_return_status = ' || l_return_status);
14837     END IF;
14838 
14839     IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
14840       x_msg_count := FND_MSG_PUB.count_msg;
14841       IF (l_log_statement >= l_log_current_level) THEN
14842          fnd_log.string(l_log_statement,
14843                         L_DEBUG_KEY,
14844                         'Errors from Integrate_to_Projects. Message count: ' || x_msg_count);
14845       END IF;
14846       IF l_return_status = FND_API.G_RET_STS_ERROR THEN
14847          RAISE FND_API.G_EXC_ERROR;
14848       ELSE
14849          RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
14850       END IF;
14851     END IF;
14852 
14853     -- SKPATHAK :: ER:12730539 :: 01-AUG-2011 :: START
14854     -- Need to update materials for this visit on P2P
14855     IF (l_log_statement >= l_log_current_level) THEN
14856        fnd_log.string(l_log_statement,
14857                       L_DEBUG_KEY,
14858                       'Before Calling AHL_LTP_REQST_MATRL_PUB.Process_Planned_Materials. p_visit_id = ' || p_visit_id );
14859     END IF;
14860 
14861     IF (p_visit_id IS NOT NULL) THEN
14862       AHL_LTP_REQST_MATRL_PUB.Process_Planned_Materials (
14863          p_api_version             => 1.0,
14864          p_init_msg_list           => FND_API.G_FALSE,
14865          p_commit                  => FND_API.G_FALSE,
14866          p_validation_level        => FND_API.G_VALID_LEVEL_FULL,
14867          p_visit_id                => p_visit_id,
14868          p_operation_flag          => 'U',
14869          x_planned_order_flag      => l_planned_order_flag,
14870          x_return_status           => l_return_status,
14871          x_msg_count               => l_msg_count,
14872          x_msg_data                => x_msg_data);
14873 
14874       IF (l_log_statement >= l_log_current_level) THEN
14875          fnd_log.string(l_log_statement,
14876                         L_DEBUG_KEY,
14877                         'After Calling AHL_LTP_REQST_MATRL_PUB.Process_Planned_Materials. Return Status = ' || l_return_status );
14878       END IF;
14879 
14880       IF NVL(l_return_status,'x') <> FND_API.G_RET_STS_SUCCESS THEN
14881         x_msg_count := l_msg_count;
14882         x_return_status := l_return_status;
14883         IF l_return_status = Fnd_Api.g_ret_sts_error THEN
14884           RAISE Fnd_Api.g_exc_error;
14885         ELSIF l_return_status = Fnd_Api.g_ret_sts_unexp_error THEN
14886           RAISE Fnd_Api.g_exc_unexpected_error;
14887         END IF;
14888       END IF;
14889     END IF;
14890     -- SKPATHAK :: ER:12730539 :: 01-AUG-2011 :: END
14891 
14892     --fetch the MWO details
14893     OPEN c_visit_master_wo(p_visit_id);
14894     FETCH c_visit_master_wo INTO l_mst_wo_visit_rec;
14895     CLOSE c_visit_master_wo;
14896 
14897     --fetch the visit details
14898     OPEN c_visit_dtl(p_visit_id);
14899     FETCH c_visit_dtl INTO l_visit_dtl_rec;
14900     CLOSE c_visit_dtl;
14901 
14902     --If the value of the PAST_DATED_VISIT_FLAG is Y, create WOs as firm
14903     IF(l_visit_dtl_rec.PAST_DATED_VISIT_FLAG = 'Y') THEN
14904        l_firm_planned_flag := 1; --Firm
14905     END IF;
14906 
14907     /**Visit Master Workorder Start**/
14908     idx := idx+1;
14909     l_prd_workorder_tbl(idx).SCHEDULED_START_DATE := l_visit_dtl_rec.start_date_time;
14910     l_prd_workorder_tbl(idx).SCHEDULED_END_DATE   := l_visit_dtl_rec.close_date_time;
14911     l_prd_workorder_tbl(idx).BATCH_ID             := l_visit_dtl_rec.VISIT_NUMBER;
14912     l_prd_workorder_tbl(idx).HEADER_ID            := 0; -- Visit
14913     IF (l_mst_wo_visit_rec.workorder_id IS NOT NULL) THEN --Visit master wo already exists
14914        l_prd_workorder_tbl(idx).DML_OPERATION         := 'U';
14915        l_prd_workorder_tbl(idx).WORKORDER_ID          := l_mst_wo_visit_rec.workorder_id;
14916        l_prd_workorder_tbl(idx).OBJECT_VERSION_NUMBER := l_mst_wo_visit_rec.object_version_number;
14917        IF (l_mst_wo_visit_rec.status_code <> 3) THEN
14918           IF (p_release_flag = 'Y') THEN
14919              -- change status from UNRELEASED/DRAFT to RELEASED
14920              l_prd_workorder_tbl(idx).STATUS_CODE       := '3'; -- Released
14921              -- Visit Master Work Order should ALWAYS be FIRM (not dependent on profile)
14922              l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG := 1;   -- Firm
14923           ELSIF  l_mst_wo_visit_rec.status_code = '17' THEN
14924              -- Master workorder was in Draft status, make it UNRELEASED now
14925              l_prd_workorder_tbl(idx).STATUS_CODE       := '1'; -- Unreleased
14926              -- Visit Master Work Order should ALWAYS be FIRM (not dependent on profile)
14927              l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG := 1;   -- Firm
14928           END IF;
14929        END IF; --master work order status is not 3
14930     ELSE -- visit master workorder does not exist, create a master wo
14931       --Going forward after VWP Enhancements, tasks/stages cannot be P2Ped if the visit is in draft status
14932       --And if the visit is in any other status then MWO must exist,
14933       --hence thow an error if this API is invoked and Master WO does not exist for this visit
14934       IF (l_log_statement >= l_log_current_level) THEN
14935          fnd_log.string(l_log_statement,
14936                         L_DEBUG_KEY,
14937                         'Error: a stage can only be P2Ped if the Visit Mater WO already exists');
14938       END IF;
14939       Fnd_Message.SET_NAME('AHL','AHL_VWP_NO_WO_CANOT_P2P');
14940       Fnd_Msg_Pub.ADD;
14941       RAISE Fnd_Api.G_EXC_ERROR;
14942     END IF; --visit master workorder exists or not
14943     /**Visit Master Workorder Ends**/
14944 
14945     FOR i in p_stages_tbl.FIRST..p_stages_tbl.LAST LOOP --for stages
14946       IF (l_log_statement >= l_log_current_level) THEN
14947           fnd_log.string(l_log_statement,
14948                          L_DEBUG_KEY,
14949                          'Inside stage loop  p_stages_tbl(i).stage_id= ' || p_stages_tbl(i).stage_id);
14950       END IF;
14951 
14952       FOR l_task_rec IN get_stage_tasks( p_stages_tbl(i).stage_id ) LOOP --for all the tasks in this stage
14953            IF (l_log_statement >= l_log_current_level) THEN
14954               fnd_log.string(l_log_statement,
14955                              L_DEBUG_KEY,
14956                              'Inside tasks in a stage loop  l_task_rec.visit_task_id= ' || l_task_rec.visit_task_id);
14957            END IF;
14958 
14959            --fetch the workorder details for the task
14960            OPEN c_task_wo(p_visit_id , l_task_rec.visit_task_id);
14961            FETCH c_task_wo INTO l_task_wo_rec;
14962            CLOSE c_task_wo;
14963 
14964            IF (l_task_rec.task_type_code = 'SUMMARY') THEN
14965              IF l_prd_workorder_tbl.count > 0 THEN
14966                For i IN l_prd_workorder_tbl.FIRST..l_prd_workorder_tbl.LAST LOOP
14967                  IF l_prd_workorder_tbl(i).workorder_id = l_task_wo_rec.workorder_id THEN
14968                    l_is_task_already_added := 'Y';
14969                  END IF;
14970                END LOOP;
14971              END IF;
14972            END IF;
14973 
14974            --Task wo for the visit already exists but has not been added to l_prd_workorder_tbl
14975            IF (l_task_wo_rec.workorder_id IS NOT NULL AND l_is_task_already_added = 'N') THEN
14976               IF (l_task_wo_rec.status_code = 17) THEN  -- Status is Draft
14977                  idx := idx+1;
14978                  l_prd_workorder_tbl(idx).dml_operation := 'U';
14979                  l_prd_workorder_tbl(idx).workorder_id := l_task_wo_rec.workorder_id;
14980                  l_prd_workorder_tbl(idx).object_version_number := l_task_wo_rec.object_version_number;
14981                  l_prd_workorder_tbl(idx).item_instance_id  := l_task_rec.instance_id ;
14982                  l_prd_workorder_tbl(idx).BATCH_ID := l_visit_dtl_rec.visit_number;
14983                  l_prd_workorder_tbl(idx).HEADER_ID := l_task_rec.visit_task_number;
14984                  IF (p_release_flag = 'Y') THEN
14985                     l_prd_workorder_tbl(idx).status_code := '3'; -- Released
14986                  ELSE
14987                     l_prd_workorder_tbl(idx).status_code := '1'; -- UnReleased
14988                  END IF;
14989                  IF (-- For task with past task dates, WOs are always firm irrespective of the profile value
14990                  l_task_rec.past_task_start_date IS NULL AND
14991                  l_firm_planned_flag = '2') THEN
14992                     l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG := 2; -- Planned
14993                  ELSE
14994                     l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG := 1; -- Firm
14995                  END IF;
14996                  -- If summary task, use the min,max of sub tasks
14997                  IF (l_task_rec.task_type_code = 'SUMMARY') THEN
14998                     OPEN get_summary_task_times_csr(l_task_rec.visit_task_id);
14999                     FETCH get_summary_task_times_csr
15000                           INTO l_prd_workorder_tbl(idx).SCHEDULED_START_DATE,
15001                                l_prd_workorder_tbl(idx).SCHEDULED_END_DATE;
15002                     CLOSE get_summary_task_times_csr;
15003                  ELSE
15004                     l_prd_workorder_tbl(idx).scheduled_start_date  := l_task_rec.start_date_time;
15005                     l_prd_workorder_tbl(idx).scheduled_end_date    := l_task_rec.end_date_time;
15006                  END IF;
15007                /*For summary tasks and unassociated tasks the task name is passed as the workorder description.
15008                And for the Route tasks, the route number concatenated with the route title is
15009                passed as workorder description.*/
15010                  IF (l_task_rec.task_type_code IN ('SUMMARY','UNASSOCIATED')) THEN
15011                     l_prd_workorder_tbl(idx).JOB_DESCRIPTION   :=  l_task_rec.visit_task_name;
15012                  ELSE
15013                     OPEN get_wo_dtls_for_mrtasks_cur(l_task_rec.visit_task_id);
15014                     FETCH get_wo_dtls_for_mrtasks_cur INTO l_wo_dtls_for_mrtasks_rec;
15015                     IF get_wo_dtls_for_mrtasks_cur%NOTFOUND THEN
15016                         l_wo_dtls_for_mrtasks_rec.workorder_description := NULL;
15017                     END IF;
15018                     CLOSE get_wo_dtls_for_mrtasks_cur;
15019                     l_prd_workorder_tbl(idx).JOB_DESCRIPTION := l_wo_dtls_for_mrtasks_rec.workorder_description;
15020                  END IF;
15021               END IF;  -- WO Status is Draft
15022            ELSIF (l_task_wo_rec.workorder_id IS NULL) THEN --work order does not exist for this task
15023              IF (l_log_statement >= l_log_current_level) THEN
15024                fnd_log.string(l_log_statement,
15025                L_DEBUG_KEY,
15026                'Error: Stage cannot be P2Ped since WO does not exist for the task_id: '||l_task_rec.visit_task_id);
15027              END IF;
15028              Fnd_Message.SET_NAME('AHL','AHL_VWP_NO_WO_CANOT_P2P');
15029              Fnd_Msg_Pub.ADD;
15030              RAISE Fnd_Api.G_EXC_ERROR;
15031            END IF; --work order exists or not for this task
15032 
15033            IF (l_log_statement >= l_log_current_level) THEN
15034               fnd_log.string(l_log_statement,
15035                              L_DEBUG_KEY,
15036                              'Before calling Get_Task_Relationships for task id: ' ||l_task_rec.visit_task_id);
15037            END IF;
15038 
15039            AHL_VWP_PROJ_PROD_PVT.Get_Task_Relationships
15040                 ( p_visit_id            => p_visit_id,
15041                   p_visit_number        => l_visit_dtl_rec.visit_number,
15042                   p_visit_task_id       => l_task_rec.visit_task_id,
15043                   p_x_relationship_tbl  => l_prd_workorder_rel_tbl
15044                 );
15045 
15046            IF (l_log_statement >= l_log_current_level) THEN
15047               fnd_log.string(l_log_statement,
15048                              L_DEBUG_KEY,
15049                              'After calling Get_Task_Relationships');
15050            END IF;
15051        END LOOP;  -- For all tasks in this stage
15052      END LOOP;  -- For all stages in p_stages_tbl
15053 
15054      -- Commented the below code by tchimira on 14-MAR-2012 as per the requirement stated in the bug 13695008
15055      --first get the task relationships for the tasks, then collect the dependencies.
15056      /*IF (l_log_statement >= l_log_current_level) THEN
15057          fnd_log.string(l_log_statement,
15058             L_DEBUG_KEY,
15059             'Before calling Get_Task_Dependencies for tasks');
15060      END IF;
15061 
15062       FOR i in p_stages_tbl.FIRST..p_stages_tbl.LAST LOOP --for stages
15063         FOR l_task_rec IN get_stage_tasks( p_stages_tbl(i).stage_id ) LOOP
15064          AHL_VWP_PROJ_PROD_PVT.Get_Task_Dependencies
15065               (
15066                 p_visit_number       => l_visit_dtl_rec.visit_number,
15067                 p_visit_task_id      => l_task_rec.visit_task_id,
15068                 p_visit_task_number  => l_task_rec.visit_task_number,
15069                 p_x_relationship_tbl => l_prd_workorder_rel_tbl
15070               );
15071 
15072          IF (l_log_statement >= l_log_current_level) THEN
15073             fnd_log.string(l_log_statement,
15074                            L_DEBUG_KEY,
15075                            'After calling Get_Task_Dependencies for task id: ' ||l_task_rec.visit_task_id);
15076          END IF;
15077        END LOOP;  -- For all tasks in a stage
15078      END LOOP;*/  -- For all stages in p_stages_tbl
15079 
15080     --BUG 13373947 :: PRAKKUM :: 10/02/2012  :: START
15081     -- IF visit planned end date is in PAST and visit itself is not past dated then validate workorder shcedule start dates
15082     IF ( l_visit_dtl_rec.close_date_time IS NOT NULL AND l_visit_dtl_rec.close_date_time<SYSDATE ) AND NVL(l_visit_dtl_rec.PAST_DATED_VISIT_FLAG,'N')='N' THEN
15083 
15084             l_max_schedule_start_date := l_visit_dtl_rec.close_date_time;
15085             For loopvar IN l_prd_workorder_tbl.FIRST..l_prd_workorder_tbl.LAST
15086             LOOP
15087 
15088                IF (l_log_statement >= l_log_current_level) THEN
15089                    fnd_log.string(l_log_statement, L_DEBUG_KEY, 'l_prd_workorder_tbl(idx).SCHEDULED_START_DATE --@>'
15090                                                                  || TO_CHAR(l_prd_workorder_tbl(idx).SCHEDULED_START_DATE,'DD-MON-YYYY HH24:MI:SS'));
15091                     fnd_log.string(l_log_statement, L_DEBUG_KEY, 'get_vst_status_and_date_rec.close_date_time --@>'
15092                                                                  || TO_CHAR(l_visit_dtl_rec.close_date_time,'DD-MON-YYYY HH24:MI:SS'));
15093                END IF;
15094 
15095                IF l_prd_workorder_tbl(idx).SCHEDULED_START_DATE IS NOT NULL AND l_visit_dtl_rec.close_date_time IS NOT NULL THEN
15096                    IF l_prd_workorder_tbl(idx).SCHEDULED_START_DATE >  l_visit_dtl_rec.close_date_time THEN
15097                        -- Find max schedule start date
15098                        IF l_prd_workorder_tbl(idx).SCHEDULED_START_DATE > l_max_schedule_start_date THEN
15099                           l_max_schedule_start_date := l_prd_workorder_tbl(idx).SCHEDULED_START_DATE;
15100                        END IF;
15101                    END IF;
15102                 END IF;
15103             END LOOP;
15104 
15105 
15106             IF (l_log_statement >= l_log_current_level) THEN
15107                 fnd_log.string(l_log_statement, L_DEBUG_KEY, 'l_max_schedule_start_date --@>'
15108                                                               || TO_CHAR(l_max_schedule_start_date,'DD-MON-YYYY HH24:MI:SS'));
15109             END IF;
15110 
15111             IF l_max_schedule_start_date > l_visit_dtl_rec.close_date_time THEN -- Validation Error
15112                Fnd_Message.SET_NAME('AHL','AHL_VWP_NON_PS_PLAN_ED_DATE');
15113                Fnd_Msg_Pub.ADD;
15114                RAISE Fnd_Api.G_EXC_ERROR;
15115             END IF;
15116     END IF;
15117     --BUG 13373947 :: PRAKKUM :: 10/02/2012  :: END
15118 
15119     IF (l_log_statement >= l_log_current_level) THEN
15120        fnd_log.string(l_log_statement,
15121                       L_DEBUG_KEY,
15122                       'Before calling PROCESS_JOBS for visit_id: ' || p_visit_id
15123                       ||' ,l_prd_workorder_tbl.count: ' || l_prd_workorder_tbl.count || ' ,l_prd_workorder_rel_tbl.count: ' || l_prd_workorder_rel_tbl.count);
15124     END IF;
15125 
15126     -- Call Production API to create work orders
15127     AHL_PRD_WORKORDER_PVT.Process_Jobs
15128           (p_api_version           => l_api_version ,
15129            p_init_msg_list         => FND_API.G_FALSE,
15130            p_commit                => FND_API.G_FALSE,
15131            p_validation_level      => p_validation_level,
15132            p_default               => FND_API.G_TRUE,
15133            p_module_type           => p_module_type,
15134            x_return_status         => l_return_status,
15135            x_msg_count             => l_msg_count,
15136            x_msg_data              => l_msg_data,
15137            p_x_prd_workorder_tbl   => l_prd_workorder_tbl,
15138            p_prd_workorder_rel_tbl => l_prd_workorder_rel_tbl
15139          );
15140 
15141     IF (l_log_statement >= l_log_current_level) THEN
15142        fnd_log.string(l_log_statement,
15143                       L_DEBUG_KEY,
15144                       'After calling PROCESS_JOBS for visit_id ' ||
15145                       p_visit_id||', l_return_status: '|| l_return_status);
15146     END IF;
15147 
15148     IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
15149        x_msg_count := FND_MSG_PUB.count_msg;
15150        IF (l_log_statement >= l_log_current_level) THEN
15151           fnd_log.string(l_log_statement,
15152                          L_DEBUG_KEY,
15153                          'Errors from PROCESS_JOBS. Message count: ' || x_msg_count);
15154        END IF;
15155        IF l_return_status = FND_API.G_RET_STS_ERROR THEN
15156           RAISE FND_API.G_EXC_ERROR;
15157        ELSE
15158           RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
15159        END IF;
15160     END IF;  -- Return Status is not Success
15161 
15162     IF (l_log_statement >= l_log_current_level) THEN
15163        For i IN l_prd_workorder_tbl.FIRST..l_prd_workorder_tbl.LAST LOOP
15164          fnd_log.string(l_log_statement,
15165                         L_DEBUG_KEY,
15166                         'WorkOrder Id('||i||'): '||l_prd_workorder_tbl(i).workorder_id);
15167        END LOOP;
15168     END IF;
15169 
15170     --Now update the stage status to released
15171     FOR i in p_stages_tbl.FIRST..p_stages_tbl.LAST LOOP --for stages
15172 
15173       UPDATE ahl_vwp_stages_b
15174       SET STAGE_STATUS_CODE = 'RELEASED',
15175           OBJECT_VERSION_NUMBER = OBJECT_VERSION_NUMBER + 1,
15176           LAST_UPDATE_DATE      = SYSDATE,
15177           LAST_UPDATED_BY       = Fnd_Global.USER_ID,
15178           LAST_UPDATE_LOGIN     = Fnd_Global.LOGIN_ID
15179       WHERE STAGE_ID = p_stages_tbl(i).stage_id;
15180 
15181     END LOOP;
15182 
15183     IF (l_log_statement >= l_log_current_level) THEN
15184        fnd_log.string(l_log_statement,
15185                       L_DEBUG_KEY,
15186                       'Before calling Update_Project_Task_Times.');
15187     END IF;
15188 
15189     /*The project start/end dates have to be updated with the workorder scheduled
15190     start/end dates.*/
15191     Update_Project_Task_Times(
15192           p_prd_workorder_tbl => l_prd_workorder_tbl,
15193           p_commit            =>'F',
15194           x_return_status     => l_return_status,
15195           x_msg_count         => l_msg_count,
15196           x_msg_data          => l_msg_data);
15197 
15198     IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
15199        x_msg_count := FND_MSG_PUB.count_msg;
15200        IF (l_log_statement >= l_log_current_level) THEN
15201           fnd_log.string(l_log_statement,
15202                          L_DEBUG_KEY,
15203                          'Errors from Update_Project_Task_Times. Message count: ' || x_msg_count);
15204        END IF;
15205        IF l_return_status = FND_API.G_RET_STS_ERROR THEN
15206           RAISE FND_API.G_EXC_ERROR;
15207        ELSE
15208           RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
15209        END IF;
15210     ELSE
15211        IF (l_log_statement >= l_log_current_level) THEN
15212            fnd_log.string(l_log_statement,
15213                           L_DEBUG_KEY,
15214                           'Returned Success from Update_Project_Task_Times');
15215        END IF;
15216     END IF;  -- Return Status is Success or not
15217 
15218     -- Now change all stage tasks'(non-summary) statuses
15219     FOR i in p_stages_tbl.FIRST..p_stages_tbl.LAST LOOP --for stages
15220       FOR l_non_summ_task_rec IN get_non_summary_stage_tasks( p_stages_tbl(i).stage_id ) LOOP --for all the tasks in this stage
15221         --SKPATHAK :: VWPE ER-12424063 :: 09-JUN-2011 :: Need not to update the status of stage and duplicate tasks to RELEASED
15222         IF l_non_summ_task_rec.task_type_code IN ('STAGE','DUPLICATE') THEN
15223 
15224           OPEN get_task_wo (l_non_summ_task_rec.visit_task_id);
15225           FETCH get_task_wo INTO l_workorder_id;
15226           CLOSE get_task_wo;
15227 
15228           IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
15229             fnd_log.string(fnd_log.level_statement,L_DEBUG_KEY,'Before calling AHL_PRD_WORKORDER_PVT.cancel_visit_jobs l_workorder_id= '||l_workorder_id);
15230           END IF;
15231 
15232           AHL_PRD_WORKORDER_PVT.cancel_visit_jobs
15233                    (p_api_version      => 1.0,
15234                     p_init_msg_list    => FND_API.G_FALSE,
15235                     p_commit           => FND_API.G_FALSE,
15236                     p_validation_level => FND_API.G_VALID_LEVEL_FULL,
15237                     p_default          => FND_API.G_FALSE,
15238                     p_module_type      => NULL,
15239                     x_return_status    => l_return_status,
15240                     x_msg_count        => l_msg_count,
15241                     x_msg_data         => l_msg_data,
15242                     p_visit_id         => NULL,
15243                     p_unit_effectivity_id => NULL,
15244                     p_workorder_id        => l_workorder_id);
15245 
15246           IF (fnd_log.level_statement >= fnd_log.g_current_runtime_level) THEN
15247             fnd_log.string(fnd_log.level_statement,L_DEBUG_KEY,'After calling AHL_PRD_WORKORDER_PVT.cancel_visit_jobs - l_return_status : '||l_return_status);
15248           END IF;
15249 
15250           IF l_return_status <> 'S' THEN
15251             RAISE Fnd_Api.G_EXC_ERROR;
15252           END IF;
15253 
15254           UPDATE ahl_visit_tasks_b
15255           SET   status_code = 'CANCELLED',
15256                 OBJECT_VERSION_NUMBER = OBJECT_VERSION_NUMBER + 1,
15257                 LAST_UPDATE_DATE      = SYSDATE,
15258                 LAST_UPDATED_BY       = Fnd_Global.USER_ID,
15259                 LAST_UPDATE_LOGIN     = Fnd_Global.LOGIN_ID
15260           WHERE visit_task_id = l_non_summ_task_rec.visit_task_id;
15261         ELSIF l_non_summ_task_rec.task_type_code <> 'SUMMARY' THEN
15262           UPDATE ahl_visit_tasks_b
15263           SET   status_code = 'RELEASED',
15264                 OBJECT_VERSION_NUMBER = OBJECT_VERSION_NUMBER + 1,
15265                 LAST_UPDATE_DATE      = SYSDATE,
15266                 LAST_UPDATED_BY       = Fnd_Global.USER_ID,
15267                 LAST_UPDATE_LOGIN     = Fnd_Global.LOGIN_ID
15268           WHERE visit_task_id = l_non_summ_task_rec.visit_task_id;
15269         END IF;
15270       END LOOP;
15271     END LOOP;
15272 
15273     --SKPATHAK :: VWPE ER-12424063 :: 13-JUN-2011 :: Get only the summary tasks
15274     -- Now change all stage tasks'(summary) statuses
15275     -- Summary tasks' statuses can only be changed once the statuses for non-summary tasks have been changed
15276     FOR i in p_stages_tbl.FIRST..p_stages_tbl.LAST LOOP --for stages
15277       FOR l_summary_task_rec IN get_summary_stage_tasks( p_stages_tbl(i).stage_id ) LOOP --for all the tasks in this stage
15278           OPEN chk_summary_task_child (l_summary_task_rec.visit_task_id);
15279           FETCH chk_summary_task_child INTO l_chk_status_code;
15280           IF (chk_summary_task_child%NOTFOUND) THEN
15281             l_chk_status_code := 'RELEASED';
15282           END IF;
15283           CLOSE chk_summary_task_child;
15284           UPDATE ahl_visit_tasks_b
15285           SET   status_code = l_chk_status_code,
15286                 OBJECT_VERSION_NUMBER = OBJECT_VERSION_NUMBER + 1,
15287                 LAST_UPDATE_DATE      = SYSDATE,
15288                 LAST_UPDATED_BY       = Fnd_Global.USER_ID,
15289                 LAST_UPDATE_LOGIN     = Fnd_Global.LOGIN_ID
15290           WHERE visit_task_id = l_summary_task_rec.visit_task_id;
15291       END LOOP;
15292     END LOOP;
15293 
15294     /*Check if the user had selected all the tasks otherwise
15295     update the visit as Partially released.*/
15296     OPEN c_visit_has_planned_tasks(p_visit_id);
15297     FETCH c_visit_has_planned_tasks into l_temp_num1;
15298     CLOSE c_visit_has_planned_tasks;
15299 
15300     OPEN c_visit_time_matches_MWO_time(p_visit_id);
15301     FETCH c_visit_time_matches_MWO_time INTO l_temp_num2;
15302     CLOSE c_visit_time_matches_MWO_time;
15303 
15304     IF l_temp_num1 IS NOT NULL OR l_temp_num2 is NULL THEN
15305        IF (l_log_statement >= l_log_current_level) THEN
15306           IF l_temp_num1 IS NOT NULL THEN
15307              fnd_log.string(l_log_statement,
15308                             L_DEBUG_KEY,
15309                             'Visit has some tasks in planning status. Setting Visit status to PARTIALLY RELEASED.');
15310           END IF;
15311           IF l_temp_num2 IS NULL THEN
15312              fnd_log.string(l_log_statement,
15313                             L_DEBUG_KEY,
15314                             'Visit times and Master Work order times do not match. Setting Visit status to PARTIALLY RELEASED.');
15315           END IF;
15316        END IF;
15317 
15318        UPDATE ahl_visits_b
15319        SET status_code = 'PARTIALLY RELEASED',
15320             OBJECT_VERSION_NUMBER = OBJECT_VERSION_NUMBER + 1,
15321             LAST_UPDATE_DATE      = SYSDATE,
15322             LAST_UPDATED_BY       = Fnd_Global.USER_ID,
15323             LAST_UPDATE_LOGIN     = Fnd_Global.LOGIN_ID
15324        WHERE visit_id = p_visit_id;
15325     ELSE
15326        IF (l_log_statement >= l_log_current_level) THEN
15327          fnd_log.string(l_log_statement,
15328                         L_DEBUG_KEY,
15329                         'Setting Visit status to RELEASED.');
15330        END IF;
15331 
15332        UPDATE ahl_visits_b
15333        SET status_code = 'RELEASED',
15334            any_task_chg_flag ='N',
15335             OBJECT_VERSION_NUMBER = OBJECT_VERSION_NUMBER + 1,
15336             LAST_UPDATE_DATE      = SYSDATE,
15337             LAST_UPDATED_BY       = Fnd_Global.USER_ID,
15338             LAST_UPDATE_LOGIN     = Fnd_Global.LOGIN_ID
15339        WHERE visit_id = p_visit_id;
15340     END IF;
15341 
15342     -- SKPATHAK :: ER:12730539 :: 01-AUG-2011
15343     -- Validate if any of the stages being P2Ped has its predessor in planning status
15344     Validate_Stage_Predecessors (p_visit_id => p_visit_id,
15345                                  p_stages_tbl => p_stages_tbl,
15346                                  x_has_pre_in_planning   => l_has_pre_in_planning);
15347     IF l_has_pre_in_planning = 'Y' THEN
15348        x_return_status := 'V';
15349     END IF;
15350 
15351     ---------------------------End of Body-------------------------------------
15352     -- END of API body.
15353     -- Standard check of p_commit.
15354 
15355      IF Fnd_Api.To_Boolean (p_commit) THEN
15356         COMMIT WORK;
15357      END IF;
15358 
15359      Fnd_Msg_Pub.count_and_get(
15360            p_encoded => Fnd_Api.g_false,
15361            p_count   => x_msg_count,
15362            p_data    => x_msg_data
15363     );
15364 
15365 
15366     IF (l_log_procedure >= l_log_current_level) THEN
15367        fnd_log.string(l_log_procedure,
15368                       L_DEBUG_KEY ||'.end',
15369                       'At the end of PL SQL procedure. Return Status = ' || x_return_status);
15370     END IF;
15371 
15372 EXCEPTION
15373   WHEN  FND_API.G_EXC_ERROR THEN
15374     x_return_status := FND_API.G_RET_STS_ERROR;
15375     ROLLBACK TO Push_stages_to_prodn_pvt;
15376     FND_MSG_PUB.count_and_get(p_count => x_msg_count,
15377                               p_data  => x_msg_data,
15378                               p_encoded => fnd_api.g_false);
15379 
15380   WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
15381     x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
15382     ROLLBACK TO Push_stages_to_prodn_pvt;
15383     Fnd_Msg_Pub.count_and_get (
15384             p_encoded => Fnd_Api.g_false,
15385             p_count   => x_msg_count,
15386             p_data    => x_msg_data);
15387 
15388   WHEN OTHERS THEN
15389     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
15390     ROLLBACK TO Push_stages_to_prodn_pvt;
15391     IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
15392        fnd_msg_pub.add_exc_msg(p_pkg_name       => G_PKG_NAME,
15393                                p_procedure_name => 'Push_stages_to_production',
15394                                p_error_text     => SUBSTR(SQLERRM,1,500));
15395     END IF;
15396     FND_MSG_PUB.count_and_get(p_count   => x_msg_count,
15397                               p_data    => x_msg_data,
15398                               p_encoded => fnd_api.g_false);
15399 
15400 END Push_stages_to_production;
15401 
15402 -- SKPATHAK :: 02-MAY-2011 :: VWPE: ER:12424063  :: ENDS
15403 
15404 -- SKPATHAK :: ER:12730539 :: 01-AUG-2011 :: START
15405 -- API to validate whether any of the stages passed to it is in planning
15406 -- This API is not fool-proof as it does not consider parallel rules when
15407 -- in the hierarchy, the object_id of the parallel rule is treated as parent and subject_id as child
15408 -- Ideally, for parallel rules, object_id can be treated as child and subject_id as parent OR vice-versa
15409 PROCEDURE Validate_Stage_Predecessors ( p_visit_id               IN         NUMBER,
15410                                         p_stages_tbl             IN         AHL_VWP_VISITS_STAGES_PVT.Visit_Stages_Tbl_Type,
15411                                         x_has_pre_in_planning    OUT NOCOPY VARCHAR2)
15412 IS
15413 
15414   L_API_NAME         CONSTANT VARCHAR2(30)  := 'BG_Release_Visit';
15415   L_API_VERSION      CONSTANT NUMBER        := 1.0;
15416   L_DEBUG_KEY        CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
15417 
15418 
15419   -- Get the passed stage child id and all its successive child stages
15420   CURSOR  c_get_child_stages(p_subject_id IN NUMBER)
15421   IS
15422    SELECT 'X' FROM ahl_stage_links link
15423    WHERE EXISTS (SELECT 'X' FROM ahl_vwp_stages_b WHERE stage_id = link.object_id and stage_status_code = 'PLANNING')
15424    START WITH link.subject_id = p_subject_id
15425    CONNECT BY PRIOR link.object_id = link.subject_id;
15426   l_dummy      VARCHAR2(1);
15427 
15428 BEGIN
15429     IF (l_log_procedure >= l_log_current_level) THEN
15430        fnd_log.string(l_log_procedure,
15431                       L_DEBUG_KEY ||'.begin',
15432                       'At the start of PL SQL procedure. Visit Id = ' ||
15433                       p_visit_id || ', p_stages_tbl.COUNT = ' || p_stages_tbl.COUNT);
15434     END IF;
15435 
15436 IF p_stages_tbl.COUNT > 0 THEN
15437    FOR i in p_stages_tbl.FIRST..p_stages_tbl.LAST LOOP --for stages
15438      OPEN c_get_child_stages (p_stages_tbl(i).stage_id);
15439      FETCH c_get_child_stages INTO l_dummy;
15440      IF c_get_child_stages%FOUND THEN
15441         x_has_pre_in_planning := 'Y'; --stage has a predessor stage in planning status
15442      END IF;
15443      CLOSE c_get_child_stages; --SKPATHAK :: 13-OCT-2011 :: Bug 13043533
15444    END LOOP;
15445 END IF;
15446 
15447 x_has_pre_in_planning := 'N';
15448 
15449 END Validate_Stage_Predecessors;
15450 
15451 -- SKPATHAK :: ER:12730539 :: 01-AUG-2011 :: END
15452 
15453 --------------------------------------------------------------------
15454 --  Function name    : Get_RB_Transaction_Task
15455 --  Type             : Public
15456 --  Purpose          : Fetches project transaction task id through given
15457 --                     given repair batch task id and project id
15458 --
15459 --  Parameters  :
15460 --        p_project_id
15461 --        p_repair_batch_task_id
15462 --        p_visit_id
15463 --
15464 --  Version :
15465 --     12 June, 2012   PRAKKUM  Initial Version - 1.0
15466 --
15467 --  Added for Bug 14068468
15468 --------------------------------------------------------------------
15469 
15470 FUNCTION Get_RB_Transaction_Task(p_project_id IN NUMBER,p_repair_batch_task_id IN NUMBER,p_visit_id IN NUMBER)
15471 RETURN NUMBER
15472 IS
15473 
15474   CURSOR c_get_trans_task_id (c_project_id IN NUMBER,c_repair_batch_task_id IN NUMBER, c_visit_id IN NUMBER, c_task_trail_name IN VARCHAR2)
15475   IS
15476   SELECT pt.task_id
15477   FROM PA_TASKS pt
15478   WHERE
15479   pt.task_name LIKE c_task_trail_name /* Filter only project tasks whose name ends with -G_TRANS_TSK_TRAIL_NAME */
15480   AND pt.project_id=c_project_id
15481   AND pt.parent_task_id=c_repair_batch_task_id
15482   AND NOT EXISTS (
15483      select 1 from AHL_VISIT_TASKS_B tsk where tsk.visit_id = c_visit_id AND tsk.project_task_id = pt.task_id
15484   );
15485 
15486   l_transaction_tsk_id NUMBER :=NULL;
15487 
15488   L_API_NAME         CONSTANT VARCHAR2(30)  := 'Get_RB_Transaction_Task';
15489   L_API_VERSION      CONSTANT NUMBER        := 1.0;
15490   L_DEBUG_KEY        CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
15491 
15492 BEGIN
15493 
15494   IF (l_log_statement >= l_log_current_level) THEN
15495      fnd_log.string(l_log_statement, L_DEBUG_KEY ,'Params--@>p_project_id ** p_repair_batch_task_id ** p_visit_id--@> '||
15496                                                   p_project_id || ' ** '|| p_repair_batch_task_id||' ** '||p_visit_id);
15497   END IF;
15498 
15499   OPEN c_get_trans_task_id (p_project_id, p_repair_batch_task_id, p_visit_id, '%-'||G_TRANS_TSK_TRAIL_NAME );
15500   FETCH c_get_trans_task_id INTO l_transaction_tsk_id;
15501   CLOSE c_get_trans_task_id;
15502 
15503   IF (l_log_statement >= l_log_current_level) THEN
15504      fnd_log.string(l_log_statement, L_DEBUG_KEY ,'Project transaction task id (repair batch child task)--@> '||l_transaction_tsk_id);
15505   END IF;
15506 
15507   -- Return repair batch task id, if child task not found, this fix is to support old visits where trasnsactions done over repair batch task
15508   IF l_transaction_tsk_id IS NULL THEN
15509 
15510      l_transaction_tsk_id := p_repair_batch_task_id;
15511 
15512      IF (l_log_statement >= l_log_current_level) THEN
15513         fnd_log.string(l_log_statement, L_DEBUG_KEY ,'Project transaction task id (repair batch task)--@> '||l_transaction_tsk_id);
15514      END IF;
15515   END IF;
15516 
15517   RETURN l_transaction_tsk_id;
15518 
15519 END Get_RB_Transaction_Task;
15520 
15521 END AHL_VWP_PROJ_PROD_PVT;