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.50 2008/06/05 07:09:32 sathapli ship $ */
3 
4 -- Global CONSTANTS
5 G_PKG_NAME             CONSTANT VARCHAR2(30) := 'AHL_VWP_PROJ_PROD_PVT';
6 --G_DEBUG     VARCHAR2(1):= FND_PROFILE.VALUE('AHL_API_FILE_DEBUG_ON');
7 G_DEBUG                VARCHAR2(1)   := AHL_DEBUG_PUB.is_log_enabled;
8 
9 G_PM_PRODUCT_CODE      CONSTANT VARCHAR2(30) := 'AHL';
10 
11 ------------------------------------
12 -- Common constants and variables --
13 ------------------------------------
14 l_log_current_level     NUMBER      := fnd_log.g_current_runtime_level;
15 l_log_statement         NUMBER      := fnd_log.level_statement;
16 l_log_procedure         NUMBER      := fnd_log.level_procedure;
17 l_log_error             NUMBER      := fnd_log.level_error;
18 l_log_unexpected        NUMBER      := fnd_log.level_unexpected;
19 -----------------------------------------------------------------
20 
21 --  Record Type for track on tasks for which jobs has been created
22 TYPE Job_Rec_Type IS RECORD
23    (TASK_ID              NUMBER,
24     WORKORDER_ID         NUMBER,
25     RETURN_STATUS        VARCHAR2(30));
26 
27 --  Table Type for Unit config check on SerialId
28 TYPE Job_Tbl_Type IS TABLE OF Job_Rec_Type
29    INDEX BY BINARY_INTEGER;
30 
31 --  Table Type for Dept for Tasks
32 TYPE Dept_Tbl_Type IS TABLE OF NUMBER
33    INDEX BY BINARY_INTEGER;
34 
35 -------------------------------------------------------------------
36 --  Procedure name : Push_to_Production
37 --  Type           : Private
38 --  Function       : To push a visit to production
39 --  Parameters     :
40 --
41 --  Standard IN  Parameters :
42 --      p_api_version      IN  NUMBER   Required
43 --      p_init_msg_list    IN  VARCHAR2 Default  FND_API.G_FALSE
44 --      p_commit           IN  VARCHAR2 Default  FND_API.G_FALSE
45 --      p_validation_level IN  NUMBER   Default  FND_API.G_VALID_LEVEL_FULL
46 --      p_default          IN  VARCHAR2 Default  FND_API.G_TRUE
47 --      p_module_type      IN  VARCHAR2 Default  NULL.
48 --
49 --  Standard OUT Parameters :
50 --      x_return_status    OUT VARCHAR2 Required
51 --      x_msg_count        OUT NUMBER   Required
52 --      x_msg_data         OUT VARCHAR2 Required
53 --
54 --  Push_to_Production Parameters:
55 --      p_visit_id         IN  NUMBER   Required
56 --      p_release_flag     IN  VARCHAR2 Required
57 --         The visit id which is to be pushed to production.
58 --
59 --  Version :
60 --      Initial Version   1.0
61 -------------------------------------------------------------------
62 PROCEDURE Push_to_Production
63     (p_api_version       IN  NUMBER,
64      p_init_msg_list     IN  VARCHAR2  := Fnd_Api.g_false,
65      p_commit            IN  VARCHAR2  := Fnd_Api.g_false,
66      p_validation_level  IN  NUMBER    := Fnd_Api.g_valid_level_full,
67      p_module_type       IN  VARCHAR2  := Null,
68      p_visit_id          IN  NUMBER,
69      p_release_flag      IN  VARCHAR2  := 'N',
70      p_orig_visit_id     IN  NUMBER    := NULL, -- By yazhou   08/06/04 for TC changes
71      x_return_status     OUT NOCOPY VARCHAR2,
72      x_msg_count         OUT NOCOPY NUMBER,
73      x_msg_data          OUT NOCOPY VARCHAR2
74     );
75 
76 -------------------------------------------------------------------
77 --  Procedure name : Push_MR_to_Production
78 --  Type           : Private
79 --  Function       : To push a MR to production
80 --  Parameters     :
81 --
82 --  Standard IN  Parameters :
83 --      p_api_version          IN  NUMBER   Required
84 --      p_init_msg_list        IN  VARCHAR2 Default  FND_API.G_FALSE
85 --      p_commit               IN  VARCHAR2 Default  FND_API.G_FALSE
86 --      p_validation_level     IN  NUMBER   Default  FND_API.G_VALID_LEVEL_FULL
87 --      p_module_type          IN  VARCHAR2 Default  NULL.
88 --
89 --  Standard OUT Parameters :
90 --      x_return_status        OUT VARCHAR2 Required
91 --      x_msg_count            OUT NUMBER   Required
92 --      x_msg_data             OUT VARCHAR2 Required
93 --
94 --  Push_to_Production Parameters:
95 --      p_visit_id             IN  NUMBER   Required
96 --      p_unit_effectivity_id  IN  NUMBER   Required
97 --      p_release_flag         IN  VARCHAR2 optional
98 --
99 --  Version :
100 --      Initial Version   1.0 Created by Yazhou
101 -------------------------------------------------------------------
102 PROCEDURE Push_MR_to_Production
103     (p_api_version          IN  NUMBER,
104      p_init_msg_list        IN  VARCHAR2  := Fnd_Api.g_false,
105      p_commit               IN  VARCHAR2  := Fnd_Api.g_false,
106      p_validation_level     IN  NUMBER    := Fnd_Api.g_valid_level_full,
107      p_module_type          IN  VARCHAR2  := Null,
108      p_visit_id             IN  NUMBER,
109      p_unit_effectivity_id  IN  NUMBER,
110      p_release_flag         IN  VARCHAR2  := 'N',
111      x_return_status        OUT NOCOPY VARCHAR2,
112      x_msg_count            OUT NOCOPY NUMBER,
113      x_msg_data             OUT NOCOPY VARCHAR2
114      );
115 
116 -------------------------------------------------------------------
117 --  Procedure name : Add_MR_to_Project
118 --  Type           : Private
119 --  Function       : To add Project Task for all the tasks for a given MR
120 --                  when SR tasks are created in prodution
121 --  Parameters     :
122 --
123 --  Standard IN  Parameters :
124 --      p_api_version         IN  NUMBER   Required
125 --      p_init_msg_list       IN  VARCHAR2 Default  FND_API.G_FALSE
126 --      p_commit              IN  VARCHAR2 Default  FND_API.G_FALSE
127 --      p_validation_level    IN  NUMBER   Default  FND_API.G_VALID_LEVEL_FULL
128 --      p_default             IN  VARCHAR2 Default  FND_API.G_TRUE
129 --      p_module_type         IN  VARCHAR2 Default  NULL.
130 --
131 --  Standard OUT Parameters :
132 --      x_return_status       OUT VARCHAR2 Required
133 --      x_msg_count           OUT NUMBER   Required
134 --      x_msg_data            OUT VARCHAR2 Required
135 --
136 --  Add_Task_to_Project Parameters:
137 --      p_visit_id            IN  NUMBER   Required
138 --      p_unit_effectivity_id IN  NUMBER   Required
139 --
140 --  Version :
141 --      Initial Version   1.0 29-Jul-2005 Yazhou
142 -------------------------------------------------------------------
143 PROCEDURE Add_MR_to_Project(
144    p_api_version         IN  NUMBER,
145    p_init_msg_list       IN  VARCHAR2  := Fnd_Api.g_false,
146    p_commit              IN  VARCHAR2  := Fnd_Api.g_false,
147    p_validation_level    IN  NUMBER    := Fnd_Api.g_valid_level_full,
148    p_module_type         IN  VARCHAR2  := Null,
149    p_visit_id            IN  NUMBER,
150    p_unit_effectivity_id IN  NUMBER,
151    x_return_status       OUT NOCOPY VARCHAR2,
152    x_msg_count           OUT NOCOPY NUMBER,
153    x_msg_data            OUT NOCOPY VARCHAR2
154   );
155 
156 -------------------------------------------------------------------
157 --  Procedure name : Create_Project
158 --  Type           : Private
159 --  Function       : To create Project when visit is pushed to projects
160 --  Parameters     :
161 --
162 --------------------------------------------------------------------
163 PROCEDURE Create_Project(
164    p_visit_id      IN  NUMBER,
165    x_return_status OUT NOCOPY VARCHAR2
166    );
167 
168 ------------------------------------------------------------------
169 --  Procedure name : Validate_tasks_bef_production
170 --  Type           : Private
171 --  Function       : Validate the tasks before pushing the tasks to prodn.
172 --  Parameters     :
173 --
174 --  Standard OUT Parameters :
175 --      x_return_status OUT VARCHAR2      Required
176 --      x_msg_count     OUT NUMBER        Required
177 --      x_msg_data      OUT VARCHAR2      Required
178 --
179 --  Validate_tasks_bef_production Parameters:
180 --      p_visit_id      IN  NUMBER        Required
181 --      p_tasks_tbl     IN  Task_Tbl_Type Required
182 --      x_tasks_tbl     OUT Task_Tbl_Type Required
183 --
184 --  Version :
185 --      30 November, 2007  RNAHATA  Initial Version - 1.0
186 -------------------------------------------------------------------
187 
188 PROCEDURE Validate_tasks_bef_production(
189     p_visit_id       IN         NUMBER,
190     p_tasks_tbl      IN         Task_Tbl_Type,
191     x_tasks_tbl      OUT NOCOPY Task_Tbl_Type,
192     x_return_status  OUT NOCOPY VARCHAR2,
193     x_msg_count      OUT NOCOPY NUMBER,
194     x_msg_data       OUT NOCOPY VARCHAR2
195 );
196 
197 -------------------------------------------------------------------
198 --  Procedure name : Push_tasks_to_production
199 --  Type           : Private
200 --  Function       : Push the selected tasks to production.
201 --  Parameters     :
202 --
203 --  Standard IN  Parameters :
204 --      p_api_version      IN  NUMBER        Required
205 --      p_init_msg_list    IN  VARCHAR2      Default  FND_API.G_FALSE
206 --      p_commit           IN  VARCHAR2      Default  FND_API.G_FALSE
207 --      p_validation_level IN  NUMBER        Default  FND_API.G_VALID_LEVEL_FULL
208 --      p_module_type      IN  VARCHAR2      Default  Null
209 --
210 --  Standard OUT Parameters :
211 --      x_return_status    OUT VARCHAR2      Required
212 --      x_msg_count        OUT NUMBER        Required
213 --      x_msg_data         OUT VARCHAR2      Required
214 --
215 --  Push_tasks_to_production Parameters:
216 --       p_visit_id        IN  NUMBER        Required
217 --       p_tasks_tbl       IN  Task_Tbl_Type Required
218 --       p_release_flag    IN  VARCHAR2      Default = 'N'
219 --
220 --  Version :
221 --      30 November, 2007  RNAHATA  Initial Version - 1.0
222 -------------------------------------------------------------------
223 
224 PROCEDURE Push_tasks_to_production(
225     p_api_version      IN         NUMBER,
226     p_init_msg_list    IN         VARCHAR2  := Fnd_Api.g_false,
227     p_validation_level IN         NUMBER    := Fnd_Api.g_valid_level_full,
228     p_module_type      IN         VARCHAR2  := Null,
229     p_visit_id         IN         NUMBER,
230     p_tasks_tbl        IN         Task_Tbl_Type,
231     p_release_flag     IN         VARCHAR2  := 'N',
232     x_return_status    OUT NOCOPY VARCHAR2,
233     x_msg_count        OUT NOCOPY NUMBER,
234     x_msg_data         OUT NOCOPY VARCHAR2
235 );
236 
237 -- AnRaj added for ACL changes in VWP
238 -- Bug number 4297066
239 -------------------------------------------------------------------
240 --  Procedure name      : check_unit_quarantined
241 --  Type                : Private
242 --  Function            : To check whether the Unit is quarantined
243 --  Parameters          : p_visit_id
244 --  Parameters          : item_instance_id
245 ----------------------------------------------------------------------
246 PROCEDURE check_unit_quarantined(
247       p_visit_id       IN  NUMBER,
248       item_instance_id IN  NUMBER
249   );
250 
251 -------------------------------------------------------------------
252 --  Procedure name : Aggregate_Task_Material_Reqrs
253 --  Type           : Private
254 --  Function       : Find the total requirment of a specific
255 --                   item at the task level
256 --  Parameters     :
257 --
258 --  Standard OUT Parameters :
259 --      x_return_status OUT  VARCHAR2 Required
260 --      x_msg_count     OUT  NUMBER   Required
261 --      x_msg_data      OUT  VARCHAR2 Required
262 --
263 --  Aggregate_Task_Material_Reqrs Parameters:
264 --      p_task_id       IN   NUMBER   Required
265 --
266 --  Version :
267 --      30 November, 2007  RNAHATA  Initial Version - 1.0
268 -------------------------------------------------------------------
269 PROCEDURE Aggregate_Task_Material_Reqrs
270     (p_api_version      IN         NUMBER,
271      p_init_msg_list    IN         VARCHAR2,
272      p_commit           IN         VARCHAR2,
273      p_validation_level IN         NUMBER,
274      p_module_type      IN         VARCHAR2,
275      p_task_id          IN         NUMBER,
276      p_rel_tsk_flag     IN         VARCHAR2 := 'Y',
277      x_return_status    OUT NOCOPY VARCHAR2,
278      x_msg_count        OUT NOCOPY NUMBER,
279      x_msg_data         OUT NOCOPY VARCHAR2
280     );
281 
282 PROCEDURE Aggregate_Material_Reqrs
283     (p_api_version      IN          NUMBER,
284      p_init_msg_list    IN          VARCHAR2,
285      p_commit           IN          VARCHAR2,
286      p_validation_level IN          NUMBER,
287      p_module_type      IN          VARCHAR2,
288      p_visit_id         IN          NUMBER,
289      x_return_status    OUT NOCOPY  VARCHAR2,
290      x_msg_count        OUT NOCOPY  NUMBER,
291      x_msg_data         OUT NOCOPY  VARCHAR2
292     );
293 
294 -- Added by rnahata for Bug 5758813
295 -------------------------------------------------------------------
296 --  Procedure name    : Update_Project_Task_Times
297 --  Type              : Private
298 --  Function          : Update the project task start/end dates
299 --      with the workorder schedule start/end dates
300 --  Parameters :
301 --  Standard IN Parameters :
302 --  p_commit      IN    VARCHAR2  Fnd_Api.G_FALSE
303 --
304 --  Update_Project_Task_Times Parameters  :
305 --  p_prd_workorder_tbl   IN    AHL_PRD_WORKORDER_PVT.PRD_WORKORDER_TBL Required
306 --
307 --  Standard OUT Parameters :
308 --      x_return_status    OUT   VARCHAR2   Required
309 --      x_msg_count        OUT   NUMBER     Required
310 --      x_msg_data         OUT   VARCHAR2   Required
311 --
312 --  Version :
313 --      17 April, 2008    Bug#5758813  RNAHATA  Initial Version - 1.0
314 -------------------------------------------------------------------
315 PROCEDURE Update_Project_Task_Times
316 ( p_prd_workorder_tbl IN         AHL_PRD_WORKORDER_PVT.PRD_WORKORDER_TBL,
317   p_commit            IN         VARCHAR2 := Fnd_Api.G_FALSE,
318   x_return_status     OUT NOCOPY VARCHAR2,
319   x_msg_count         OUT NOCOPY NUMBER,
320   x_msg_data          OUT NOCOPY VARCHAR2
321 ) ;
322 -- End changes by rnahata for Bug 5758813
323 --****************************************************************--
324 --------------------------------------------------------------------
325 --              VWP INTEGRATION WITH PROJECTS                     --
326 --------------------------------------------------------------------
327 --****************************************************************--
328 
329 --------------------------------------------------------------------
330 -- PROCEDURE
331 --    Integrate_to_Projects
332 --
333 -- PURPOSE
334 --    To Integrate with Projects i.e creating projects for
335 --    visits and project tasks for all associated visit task
336 --------------------------------------------------------------------
337 PROCEDURE Integrate_to_Projects (
338    p_api_version      IN         NUMBER,
339    p_init_msg_list    IN         VARCHAR2 := Fnd_Api.g_false,
340    p_commit           IN         VARCHAR2 := Fnd_Api.g_false,
341    p_validation_level IN         NUMBER   := Fnd_Api.g_valid_level_full,
342    p_module_type      IN         VARCHAR2 := Null,
343    p_visit_id         IN         NUMBER,
344    x_return_status    OUT NOCOPY VARCHAR2,
345    x_msg_count        OUT NOCOPY NUMBER,
346    x_msg_data         OUT NOCOPY VARCHAR2)
347 
348 IS
349    L_API_VERSION CONSTANT NUMBER        := 1.0;
350    L_API_NAME    CONSTANT VARCHAR2(30)  := 'Integrate_to_Projects';
351    L_DEBUG_KEY   CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
352 
353    -- To find visit related information
354    CURSOR c_visit (x_id IN NUMBER) IS
355     SELECT * FROM AHL_VISITS_VL
356     WHERE VISIT_ID = x_id;
357    c_visit_rec c_visit%ROWTYPE;
358 
359 BEGIN
360    --------------------- initialize -----------------------
361    SAVEPOINT Integrate_to_Projects;
362 
363    IF (l_log_procedure >= l_log_current_level) THEN
364       fnd_log.string(l_log_procedure,
365                      L_DEBUG_KEY ||'.begin',
366                      'At the start of PL SQL procedure. Visit Id = ' || p_visit_id);
367    END IF;
368 
369    -- Initialize message list if p_init_msg_list is set to TRUE.
370    IF Fnd_Api.to_boolean(p_init_msg_list) THEN
371       Fnd_Msg_Pub.initialize;
372    END IF;
373 
374    --  Initialize API return status to success
375    x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
376 
377    -- Standard call to check for call compatibility.
378    IF NOT Fnd_Api.COMPATIBLE_API_CALL(l_api_version,
379                                       p_api_version,
380                                       l_api_name,G_PKG_NAME)
381    THEN
382        RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
383    END IF;
384 
385    IF (l_log_statement >= l_log_current_level) THEN
386        fnd_log.string(l_log_statement,L_DEBUG_KEY,'Visit Id= '|| p_visit_id);
387    END IF;
388 
389    OPEN c_visit (p_visit_id);
390    FETCH c_visit INTO c_visit_rec;
391    CLOSE c_visit;
392 
393    IF (l_log_statement >= l_log_current_level) THEN
394        fnd_log.string(l_log_statement,L_DEBUG_KEY,'Visits Project Id = '|| c_visit_rec.PROJECT_ID);
395    END IF;
396 
397    IF c_visit_rec.PROJECT_ID IS NULL THEN
398        IF (l_log_statement >= l_log_current_level) THEN
399            fnd_log.string(l_log_statement,L_DEBUG_KEY,'Before calling Create_Project');
400        END IF;
401 
402       -- Call Create_Project local procedure to create project  tasks
403          Create_Project (
404                 p_visit_id      => p_visit_id,
405                 x_return_status => x_return_status);
406 
407        IF (l_log_statement >= l_log_current_level) THEN
408              fnd_log.string(l_log_statement,L_DEBUG_KEY,'After calling Create_Project - '||x_return_status);
409        END IF;
410    ELSE
411        IF (l_log_statement >= l_log_current_level) THEN
412            fnd_log.string(l_log_statement,L_DEBUG_KEY,'Before calling Update_Project');
413        END IF;
414 
415       -- Call Update_Project local procedure to update project tasks
416       Update_Project (
417              p_api_version      => p_api_version,
418              p_init_msg_list    => p_init_msg_list,
419              p_commit           => p_commit,
420              p_validation_level => p_validation_level,
421              p_module_type      => p_module_type,
422              p_visit_id         => p_visit_id,
423              x_return_status    => x_return_status,
424              x_msg_count        => x_msg_count,
425              x_msg_data         => x_msg_data);
426 
427        IF (l_log_statement >= l_log_current_level) THEN
428              fnd_log.string(l_log_statement,L_DEBUG_KEY,'After calling Update_Project - '||x_return_status);
429        END IF;
430    END IF;
431 
432  ---------------------------End of Body-------------------------------------
433   --
434   -- END of API body.
435   --
436   -- Standard check of p_commit.
437    IF Fnd_Api.To_Boolean ( p_commit ) THEN
438       COMMIT WORK;
439    END IF;
440 
441    Fnd_Msg_Pub.count_and_get(
442          p_encoded => Fnd_Api.g_false,
443          p_count   => x_msg_count,
444          p_data    => x_msg_data
445   );
446 
447    IF (l_log_procedure >= l_log_current_level) THEN
448        fnd_log.string(l_log_procedure,L_DEBUG_KEY ||'.end','End of PL/SQL procedure');
449    END IF;
450 
451 EXCEPTION
452    WHEN Fnd_Api.g_exc_error THEN
453       ROLLBACK TO Integrate_to_Projects;
454       x_return_status := Fnd_Api.g_ret_sts_error;
455       Fnd_Msg_Pub.count_and_get (
456             p_encoded => Fnd_Api.g_false,
457             p_count   => x_msg_count,
458             p_data    => x_msg_data
459      );
460    WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
461       ROLLBACK TO Integrate_to_Projects;
462       x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
463       Fnd_Msg_Pub.count_and_get (
464             p_encoded => Fnd_Api.g_false,
465             p_count   => x_msg_count,
466             p_data    => x_msg_data
467      );
468    WHEN OTHERS THEN
469       ROLLBACK TO Integrate_to_Projects;
470       x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
471       IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_unexp_error) THEN
472          Fnd_Msg_Pub.add_exc_msg (G_PKG_NAME, L_API_NAME);
473       END IF;
474       Fnd_Msg_Pub.count_and_get (
475             p_encoded => Fnd_Api.g_false,
476             p_count   => x_msg_count,
477             p_data    => x_msg_data
478      );
479 END Integrate_to_Projects;
480 
481 --------------------------------------------------------------------
482 -- PROCEDURE
483 --    Add_Task_to_Project
484 --
485 -- PURPOSE
486 --
487 --
488 --------------------------------------------------------------------
489 PROCEDURE Add_Task_to_Project(
490    p_api_version      IN         NUMBER,
491    p_init_msg_list    IN         VARCHAR2  := Fnd_Api.g_false,
492    p_commit           IN         VARCHAR2  := Fnd_Api.g_false,
493    p_validation_level IN         NUMBER    := Fnd_Api.g_valid_level_full,
494    p_module_type      IN         VARCHAR2  := Null,
495    p_visit_task_id    IN         NUMBER,
496 
497    x_return_status    OUT NOCOPY VARCHAR2,
498    x_msg_count        OUT NOCOPY NUMBER,
499    x_msg_data         OUT NOCOPY VARCHAR2
500  )
501 IS
502    L_API_VERSION  CONSTANT NUMBER := 1.0;
503    L_API_NAME     CONSTANT VARCHAR2(30)  := 'Add_Task_to_Project';
504    L_DEBUG_KEY    CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
505 
506    G_EXC_ERROR             EXCEPTION;
507    l_msg_count             NUMBER;
508    l_task_id               NUMBER;
509    l_pa_project_id_out     NUMBER;
510    l_msg_index_out         NUMBER;
511    l_return_status         VARCHAR2(1);
512    l_chk_project           VARCHAR2(1);
513    l_proj_ref_flag         VARCHAR2(1);
514    l_project_tsk_flag      VARCHAR2(1);
515    l_default               VARCHAR2(30);
516    l_msg_data              VARCHAR2(2000);
517    l_pa_project_number_out VARCHAR2(25);
518    l_commit                VARCHAR2(1) := 'F';
519    l_init_msg_list         VARCHAR2(1) := 'F';
520 
521     -- To find visit related information
522    CURSOR c_visit (x_id IN NUMBER) IS
523     SELECT * FROM AHL_VISITS_VL
524     WHERE VISIT_ID = x_id;
525    c_visit_rec c_visit%ROWTYPE;
526 
527    -- To find tasks information for visit
528    CURSOR c_task (x_id IN NUMBER) IS
529     SELECT T1.PROJECT_ID, T1.VISIT_NUMBER, T2.*
530     FROM  AHL_VISITS_VL T1, AHL_VISIT_TASKS_VL T2
531     WHERE VISIT_TASK_ID = x_id
532     AND T1.VISIT_ID = T2.VISIT_ID;
533 
534    c_task_rec c_task%ROWTYPE;
535 
536 BEGIN
537    --------------------- initialize -----------------------
538    SAVEPOINT Add_Task_to_Project;
539 
540    -- Debug info.
541    IF (l_log_procedure >= l_log_current_level) THEN
542        fnd_log.string(l_log_procedure,L_DEBUG_KEY ||'.begin','At the start of PLSQL procedure');
543    END IF;
544 
545    -- Initialize message list if p_init_msg_list is set to TRUE.
546    IF Fnd_Api.to_boolean(p_init_msg_list) THEN
547       Fnd_Msg_Pub.initialize;
548    END IF;
549 
550    --  Initialize API return status to success
551    x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
552 
553    -- Standard call to check for call compatibility.
554    IF NOT Fnd_Api.COMPATIBLE_API_CALL(l_api_version,
555                                       p_api_version,
556                                       L_API_NAME,G_PKG_NAME) THEN
557       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
558    END IF;
559 
560    IF (l_log_statement >= l_log_current_level) THEN
561       fnd_log.string(l_log_statement,L_DEBUG_KEY,'Visit Task Id = '|| p_visit_task_id);
562    END IF;
563 
564    ----------------------------------------- Cursor ----------------------------------
565    OPEN c_task (p_visit_task_id);
566    FETCH c_task INTO c_task_rec;
567    CLOSE c_task;
568 
569    OPEN c_Visit(c_task_rec.visit_id);
570    FETCH c_visit INTO c_visit_rec;
571    CLOSE c_Visit;
572    ----------------------------------------- Start of Body ----------------------------------
573    -- To check Project responsibilites
574    -- post 11.5.10 change                                                  -- Post 11.5.10
575    -- change start
576 
577    -- RROY
578    IF (l_log_statement >= l_log_current_level) THEN
579       fnd_log.string(l_log_statement,
580                      L_DEBUG_KEY,
581                      'Before calling AHL_VWP_RULES_PVT.Check_Proj_Responsibility.');
582    END IF;
583 
584    AHL_VWP_RULES_PVT.Check_Proj_Responsibility
585            (x_check_project    => l_chk_project,
586             x_return_status    => l_return_status);
587 
588    IF (l_log_statement >= l_log_current_level) THEN
589       fnd_log.string(l_log_statement,
590                      L_DEBUG_KEY,
591                      'After calling AHL_VWP_RULES_PVT.Check_Proj_Responsibility. Return Status = ' ||
592                      l_return_status);
593    END IF;
594 
595    IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
596       IF (l_log_statement >= l_log_current_level) THEN
597          fnd_log.string(l_log_statement,
598                         L_DEBUG_KEY,
599                         'Errors from AHL_VWP_RULES_PVT.Check_Proj_Responsibility.');
600       END IF;
601       IF l_return_status = FND_API.G_RET_STS_ERROR THEN
602          RAISE FND_API.G_EXC_ERROR;
603       ELSE
604          RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
605       END IF;
606    END IF;
607 
608    IF l_chk_project = 'Y' THEN
609      IF c_task_rec.PROJECT_TASK_ID IS NULL THEN
610      -- change end
611        IF (l_log_statement >= l_log_current_level) THEN
612           fnd_log.string(l_log_statement,
613                          L_DEBUG_KEY,
614                          'Before calling PA_PROJECT_PUB.CHECK_UNIQUE_TASK_NUMBER.');
615           fnd_log.string(l_log_statement,
616                          L_DEBUG_KEY,
617                          'p_project_id = ' || c_visit_rec.project_id);
618           fnd_log.string(l_log_statement,
619                          L_DEBUG_KEY,
620                          'p_pm_project_reference = ' || c_visit_rec.visit_number);
621           fnd_log.string(l_log_statement,
622                          L_DEBUG_KEY,
623                          'p_task_number = ' || c_task_rec.visit_task_number);
624        END IF;
625 
626         PA_PROJECT_PUB.Check_Unique_Task_Number
627         ( p_api_version_number      => 1,
628           p_init_msg_list           => l_init_msg_list,
629           p_return_status           => l_return_status,
630           p_msg_count               => l_msg_count,
631           p_msg_data                => l_msg_data,
632           p_project_id              => c_visit_rec.project_id,
633           p_pm_project_reference    => c_visit_rec.visit_number,
634           p_task_number             => c_task_rec.visit_task_number,
635           p_unique_task_number_flag => l_project_tsk_flag
636         );
637 
638        IF (l_log_statement >= l_log_current_level) THEN
639           fnd_log.string(l_log_statement,
640                          L_DEBUG_KEY,
641                          'After calling PA_PROJECT_PUB.check_unique_task_number. p_unique_task_number_flag = ' ||
642                          l_project_tsk_flag || ' Return Status = ' || l_return_status);
643           IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
644              fnd_log.string(l_log_statement,
645                             L_DEBUG_KEY,
646                             'Errors from PA_PROJECT_PUB.check_unique_task_number. Message count: ' ||
647                             l_msg_count || ', message data: ' || l_msg_data);
648           END IF;
649           fnd_log.string(l_log_statement,
650                          L_DEBUG_KEY,
651                          'Before calling PA_PROJECT_PUB.check_unique_task_reference.');
652        END IF;
653 
654        PA_PROJECT_PUB.Check_Unique_Task_Reference
655           (p_api_version_number    => 1,
656            p_init_msg_list         => l_init_msg_list,
657            p_return_status         => l_return_status,
658            p_msg_count             => l_msg_count,
659            p_msg_data              => l_msg_data,
660            p_project_id            => c_visit_rec.project_id,
661            p_pm_project_reference  => c_visit_rec.visit_number,
662            p_pm_task_reference     => c_task_rec.visit_task_number,
663            p_unique_task_ref_flag  => l_proj_ref_flag
664       );
665 
666        IF (l_log_statement >= l_log_current_level) THEN
667           fnd_log.string(l_log_statement,L_DEBUG_KEY,'After calling -- Check_Unique_Task_Reference l_proj_ref_flag = ' || l_proj_ref_flag);
668        END IF;
669 
670       IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
671          IF (l_log_statement >= l_log_current_level) THEN
672             fnd_log.string(l_log_statement,
673                            L_DEBUG_KEY,
674                            'Errors from PA_PROJECT_PUB.check_unique_task_number. Message count: ' ||
675                             l_msg_count || ', message data: ' || l_msg_data);
676          END IF;
677          IF (l_return_status = FND_API.G_RET_STS_ERROR) THEN
678             RAISE FND_API.G_EXC_ERROR;
679          ELSE
680             RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
681          END IF;
682       END IF;
683 
684        IF l_project_tsk_flag = 'Y' AND l_proj_ref_flag = 'Y' THEN
685           IF (l_log_statement >= l_log_current_level) THEN
686             fnd_log.string(l_log_statement,L_DEBUG_KEY,'Before calling PA_PROJECT_PUB.ADD_TASK..');
687             fnd_log.string(l_log_statement,L_DEBUG_KEY,'c_task_rec.PROJECT_ID=: ' || c_task_rec.PROJECT_ID);
688             fnd_log.string(l_log_statement,L_DEBUG_KEY,'c_task_rec.VISIT_NUMBER=: ' || c_task_rec.VISIT_NUMBER);
689             fnd_log.string(l_log_statement,L_DEBUG_KEY,'c_task_rec.VISIT_TASK_NUMBER=: ' || c_task_rec.VISIT_TASK_NUMBER);
690             fnd_log.string(l_log_statement,L_DEBUG_KEY,'c_task_rec.VISIT_TASK_NAME=: ' || c_task_rec.VISIT_TASK_NAME);
691             fnd_log.string(l_log_statement,L_DEBUG_KEY,'c_task_rec.DESCRIPTION=: ' || c_task_rec.DESCRIPTION);
692           END IF;
693 
694           PA_PROJECT_PUB.ADD_TASK
695                (p_api_version_number      => 1
696                ,p_commit            => l_commit
697                ,p_init_msg_list          => l_init_msg_list
698                ,p_msg_count            => l_msg_count
699                ,p_msg_data            => l_msg_data
700                ,p_return_status          => l_return_status
701                ,p_pm_product_code        => G_PM_PRODUCT_CODE
702                ,p_pm_project_reference      => c_task_rec.VISIT_NUMBER
703                ,p_pa_project_id          => c_task_rec.PROJECT_ID
704                ,p_pm_task_reference        => c_task_rec.VISIT_TASK_NUMBER
705                ,p_pa_task_number            => c_task_rec.VISIT_TASK_NUMBER
706                ,p_task_name            => SUBSTR( c_task_rec.VISIT_TASK_NAME , 1,15)
707                -- AnRaj: Changed for Bug#5069540
708                 /** Begin changes by rnahata for Bug 5758813 **/
709                 -- ,p_task_description   => SUBSTR(c_task_rec.DESCRIPTION,1,250)
710                 ,p_task_description      => c_task_rec.visit_task_name
711                --Fix for the Bug 7009212. rnahata truncated the dates
712                ,p_task_start_date       => trunc(c_task_rec.start_date_time)
713                ,p_task_completion_date  => trunc(c_task_rec.end_date_time)
714                 /** End changes by rnahata for Bug 5758813 **/
715                ,p_pa_project_id_out      => l_pa_project_id_out
716                ,p_pa_project_number_out    => l_pa_project_number_out
717                ,p_task_id            => l_task_id
718                 );
719 
720           IF (l_log_statement >= l_log_current_level) THEN
721             fnd_log.string(l_log_statement,L_DEBUG_KEY,'After calling PA_PROJECT_PUB.ADD_TASK - l_return_status = '||l_return_status);
722           END IF;
723 
724           IF (l_return_status <> 'S') THEN
725             IF (fnd_msg_pub.count_msg > 0 ) THEN
726               FOR i IN 1..fnd_msg_pub.count_msg
727               LOOP
728                 fnd_msg_pub.get( p_msg_index => i,
729                                  p_encoded   => 'F',
730                                  p_data      => l_msg_data,
731                                  p_msg_index_out => l_msg_index_out);
732 
733                 IF (l_log_statement >= l_log_current_level) THEN
734                   fnd_log.string(l_log_statement,L_DEBUG_KEY,'Error - '||l_msg_data);
735                 END IF;
736               END LOOP;
737             ELSE
738               IF (l_log_statement >= l_log_current_level) THEN
739                   fnd_log.string(l_log_statement,L_DEBUG_KEY,'Another Error - '||l_msg_data);
740               END IF;
741             END IF;
742             RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
743           END IF;
744 
745           IF l_return_status = 'S' THEN
746             UPDATE AHL_VISIT_TASKS_B
747             SET PROJECT_TASK_ID = l_task_id,
748                 OBJECT_VERSION_NUMBER = c_task_rec.object_version_number + 1
749             WHERE VISIT_TASK_ID = p_visit_task_id;
750           END IF;
751 
752         ELSIF l_project_tsk_flag = 'N' AND l_proj_ref_flag = 'Y' THEN
753           x_return_status := Fnd_Api.g_ret_sts_error;
754           IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_error) THEN
755              Fnd_Message.set_name ('AHL', 'AHL_VWP_PROJ_TSK_REF_NOT_UNIQ');
756              Fnd_Msg_Pub.ADD;
757           END IF;
758         ELSIF l_project_tsk_flag = 'Y' AND l_proj_ref_flag = 'N' THEN
759           x_return_status := Fnd_Api.g_ret_sts_error;
760           IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_error) THEN
761              Fnd_Message.set_name ('AHL', 'AHL_VWP_PROJ_TSK_NUM_NOT_UNIQ');
762              Fnd_Msg_Pub.ADD;
763           END IF;
764         ELSE
765           x_return_status := Fnd_Api.g_ret_sts_error;
766           IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_error) THEN
767              Fnd_Message.set_name ('AHL', 'AHL_VWP_PROJ_TASK_NOT_UNIQUE');
768              Fnd_Msg_Pub.ADD;
769           END IF;
770         END IF;
771    END IF;
772 
773  END IF; -- l_chk_project
774  ---------------------------End of Body-------------------------------------
775   --
776   -- END of API body.
777   --
778   -- Standard check of p_commit.
779 
780    IF Fnd_Api.To_Boolean (p_commit) THEN
781       COMMIT WORK;
782    END IF;
783 
784    Fnd_Msg_Pub.count_and_get(
785          p_encoded => Fnd_Api.g_false,
786          p_count   => x_msg_count,
787          p_data    => x_msg_data
788   );
789 
790    IF (l_log_procedure >= l_log_current_level) THEN
791        fnd_log.string(l_log_procedure,L_DEBUG_KEY ||'.end','End of the procedure');
792    END IF;
793 
794 EXCEPTION
795    WHEN Fnd_Api.g_exc_error THEN
796       ROLLBACK TO Add_Task_to_Project;
797       x_return_status := Fnd_Api.g_ret_sts_error;
798       Fnd_Msg_Pub.count_and_get (
799             p_encoded => Fnd_Api.g_false,
800             p_count   => x_msg_count,
801             p_data    => x_msg_data
802      );
803    WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
804       ROLLBACK TO Add_Task_to_Project;
805       x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
806       Fnd_Msg_Pub.count_and_get (
807             p_encoded => Fnd_Api.g_false,
808             p_count   => x_msg_count,
809             p_data    => x_msg_data
810      );
811    WHEN OTHERS THEN
812       ROLLBACK TO Add_Task_to_Project;
813       x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
814       IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_unexp_error) THEN
815          Fnd_Msg_Pub.add_exc_msg (G_PKG_NAME, L_API_NAME);
816       END IF;
817       Fnd_Msg_Pub.count_and_get (
818             p_encoded => Fnd_Api.g_false,
819             p_count   => x_msg_count,
820             p_data    => x_msg_data
821      );
822 END Add_Task_to_Project;
823 
824 --------------------------------------------------------------------
825 -- PROCEDURE
826 --    Delete_Task_to_Project
827 --
828 -- PURPOSE
829 --    To delete Project and its tasks if visit in VWP is deleted
830 --------------------------------------------------------------------
831 PROCEDURE Delete_Task_to_Project(
832    p_visit_task_id   IN  NUMBER,
833    x_return_status   OUT NOCOPY VARCHAR2)
834 AS
835   -- Define local Variables
836    L_API_NAME      CONSTANT VARCHAR2(30) := 'Delete_Task_to_Project';
837    L_DEBUG_KEY         CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
838 
839    l_count           NUMBER;
840    l_msg_count       NUMBER;
841    l_project_id      NUMBER;
842    l_task_id         NUMBER;
843    i                 NUMBER;
844 
845    l_return_status   VARCHAR2(1);
846    l_chk_project     VARCHAR2(1);
847    l_del_task_flag   VARCHAR2(1);
848    l_commit          VARCHAR2(1) := 'F';
849    l_init_msg_list   VARCHAR2(1) := 'F';
850    l_default         VARCHAR2(30);
851    l_msg_data        VARCHAR2(2000);
852    G_EXC_ERROR       EXCEPTION;
853 
854  -- Define local Cursors
855    -- To find all tasks related information
856    CURSOR c_Task (x_id IN NUMBER) IS
857       SELECT * FROM Ahl_Visit_Tasks_VL
858       WHERE Visit_Task_ID = x_id;
859       c_task_rec    c_Task%ROWTYPE;
860 
861     -- To find visit related information
862    CURSOR c_visit (x_id IN NUMBER) IS
863     SELECT * FROM AHL_VISITS_VL
864     WHERE VISIT_ID = x_id;
865    c_visit_rec c_visit%ROWTYPE;
866 
867 BEGIN
868 
869     x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
870 
871     IF (l_log_procedure >= l_log_current_level) THEN
872        fnd_log.string(l_log_procedure,L_DEBUG_KEY ||'.begin','At the start of the procedure');
873     END IF;
874 
875     OPEN c_task (p_visit_task_id);
876     FETCH c_task INTO c_task_rec;
877     CLOSE c_task;
878 
879     OPEN c_visit (c_task_rec.visit_id);
880     FETCH c_visit INTO c_visit_rec;
881     CLOSE c_visit;
882 
883     -- To check Project responsibilites
884     -- Post 11.5.10
885     -- RROY
886    IF (l_log_statement >= l_log_current_level) THEN
887       fnd_log.string(l_log_statement,
888                      L_DEBUG_KEY,
889                      'Before calling AHL_VWP_RULES_PVT.Check_Proj_Responsibility');
890    END IF;
891     AHL_VWP_RULES_PVT.Check_Proj_Responsibility
892           ( x_check_project    => l_chk_project,
893             x_return_status    => l_return_status);
894 
895      IF (l_log_statement >= l_log_current_level) THEN
896         fnd_log.string(l_log_statement,
897                        L_DEBUG_KEY,
898                        'After calling AHL_VWP_RULES_PVT.Check_Proj_Responsibility. Return Status = ' || l_return_status);
899      END IF;
900 
901      IF (l_return_status <> Fnd_Api.G_RET_STS_SUCCESS) THEN
902         IF (l_log_statement >= l_log_current_level) THEN
903            fnd_log.string(l_log_statement,
904                           L_DEBUG_KEY,
905                           'Errors from AHL_VWP_RULES_PVT.Check_Proj_Responsibility');
906         END IF;
907         x_return_status := l_return_status;
908         IF l_return_status = FND_API.G_RET_STS_ERROR THEN
909            RAISE FND_API.G_EXC_ERROR;
910         ELSE
911            RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
912         END IF;
913      END IF;
914 
915     IF l_chk_project = 'Y' THEN
916         IF (l_log_statement >= l_log_current_level) THEN
917            fnd_log.string(l_log_statement,L_DEBUG_KEY,'Before calling PA_PROJECT_PUB.CHECK_DELETE_TASK_OK');
918            fnd_log.string(l_log_statement,L_DEBUG_KEY,'c_visit_rec.PROJECT_ID - '|| c_visit_rec.PROJECT_ID);
919            fnd_log.string(l_log_statement,L_DEBUG_KEY,'c_visit_rec.visit_number - '|| c_visit_rec.visit_number);
920            fnd_log.string(l_log_statement,L_DEBUG_KEY,'c_task_rec.PROJECT_TASK_ID - '|| c_task_rec.PROJECT_TASK_ID);
921            fnd_log.string(l_log_statement,L_DEBUG_KEY,'c_task_rec.VISIT_TASK_NUMBER - '|| c_task_rec.VISIT_TASK_NUMBER);
922            fnd_log.string(l_log_statement,L_DEBUG_KEY,'l_del_task_flag - '|| l_del_task_flag);
923         END IF;
924 
925         PA_PROJECT_PUB.CHECK_DELETE_TASK_OK
926                 ( p_api_version_number     => 1
927                   , p_init_msg_list         =>  l_init_msg_list
928                   , p_return_status         => l_return_status
929                   , p_msg_count           => l_msg_count
930                   , p_msg_data           => l_msg_data
931                   , p_project_id       => c_visit_rec.PROJECT_ID
932                   , p_pm_project_reference   =>  c_visit_rec.visit_number
933                   , p_task_id           =>  c_task_rec.PROJECT_TASK_ID
934                   , p_pm_task_reference     =>  c_task_rec.VISIT_TASK_NUMBER
935                   , p_delete_task_ok_flag   => l_del_task_flag
936                 );
937 
938       IF (l_log_statement >= l_log_current_level) THEN
939          fnd_log.string(l_log_statement,
940                         L_DEBUG_KEY,
941                         'After calling PA_PROJECT_PUB.check_delete_task_ok. Return Status = ' ||
942                         l_return_status || ', delete task flag = ' || l_del_task_flag);
943       END IF;
944 
945       IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
946          IF (l_log_statement >= l_log_current_level) THEN
947             fnd_log.string(l_log_statement,
948                            L_DEBUG_KEY,
949                            'Errors from PA_PROJECT_PUB.check_delete_task_ok. Message count: ' ||
950                             l_msg_count || ', message data: ' || l_msg_data);
951          END IF;
952          x_return_status := l_return_status;
953          RAISE FND_API.G_EXC_ERROR;
954       ELSE
955          IF l_del_task_flag = 'Y' THEN
956             IF (l_log_statement >= l_log_current_level) THEN
957                fnd_log.string(l_log_statement,
958                               L_DEBUG_KEY,
959                               'Before calling PA_PROJECT_PUB.delete_task.');
960             END IF;
961 
962             PA_PROJECT_PUB.DELETE_TASK
963                     ( p_api_version_number    =>   1
964                      ,p_commit              =>   l_commit
965                      ,p_init_msg_list        =>   l_init_msg_list
966                      ,p_msg_count          =>  l_msg_count
967                      ,p_msg_data          =>  l_msg_data
968                      ,p_return_status        =>  l_return_status
969                      ,p_pm_product_code        =>  G_PM_PRODUCT_CODE
970                      ,p_pm_project_reference  =>   c_visit_rec.visit_number
971                      ,p_pa_project_id        =>  c_visit_rec.PROJECT_ID
972                      ,p_pm_task_reference    =>  c_task_rec.VISIT_TASK_NUMBER
973                      ,p_pa_task_id          =>  c_task_rec.PROJECT_TASK_ID
974                      ,p_cascaded_delete_flag  =>  'N'
975                      ,p_project_id          =>  l_project_id
976                      ,p_task_id              =>  l_task_id
977                     );
978 
979             IF (l_log_statement >= l_log_current_level) THEN
980                fnd_log.string(l_log_statement,
981                               L_DEBUG_KEY,
982                               'After calling PA_PROJECT_PUB.delete_task. Return Status = ' ||
983                               l_return_status);
984             END IF;
985 
986             IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
987                IF (l_log_statement >= l_log_current_level) THEN
988                   fnd_log.string(l_log_statement,
989                                  L_DEBUG_KEY,
990                                  'Errors from PA_PROJECT_PUB.delete_task. Message count: ' ||
991                                  l_msg_count || ', message data: ' || l_msg_data);
992                END IF;
993                x_return_status := Fnd_Api.g_ret_sts_error;
994                RAISE FND_API.G_EXC_ERROR;
995             END IF;
996           END IF;
997         END IF;
998     END IF;
999 
1000    IF (l_log_procedure >= l_log_current_level) THEN
1001       fnd_log.string(l_log_procedure,
1002                      L_DEBUG_KEY ||'.end',
1003                      'At the end of PL SQL procedure. Return Status = ' || x_return_status);
1004    END IF;
1005 
1006 END Delete_Task_to_Project;
1007 
1008 --------------------------------------------------------------------
1009 -- PROCEDURE
1010 --    Create_Project
1011 --
1012 -- PURPOSE
1013 --    To create Project and project tasks for the visit and its tasks
1014 --------------------------------------------------------------------
1015 PROCEDURE Create_Project(
1016    p_visit_id        IN  NUMBER,
1017    x_return_status   OUT NOCOPY VARCHAR2)
1018 AS
1019 --
1020   -- Define local Variables
1021    L_API_NAME     CONSTANT VARCHAR2(30) := 'Create_Project';
1022    L_DEBUG_KEY    CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
1023    l_count                 NUMBER;
1024    l_msg_count             NUMBER;
1025    l_obj_version           NUMBER;
1026    l_created_project_id    NUMBER;
1027    l_msg_index_out         NUMBER;
1028    i                       NUMBER;
1029    Z                       NUMBER;
1030    CREATED_FROM_PROJECT_ID NUMBER;
1031    l_return_status         VARCHAR2(1);
1032    l_chk_project           VARCHAR2(1);
1033    l_workflow_started      VARCHAR2(1);
1034    l_valid_flag            VARCHAR2(1):= 'N';
1035    l_commit                VARCHAR2(1) := 'F';
1036    l_init_msg_list         VARCHAR2(1) := 'F';
1037    l_project_flag          VARCHAR2(1):= 'N';
1038    l_default               VARCHAR2(30);
1039    l_msg_data              VARCHAR2(2000);
1040    G_EXC_ERROR             EXCEPTION;
1041 
1042    -- Define local table and record datatypes
1043    l_project_rec        PA_PROJECT_PUB.PROJECT_IN_REC_TYPE;
1044    l_project_out        PA_PROJECT_PUB.PROJECT_OUT_REC_TYPE;
1045    l_task_in            PA_PROJECT_PUB.TASK_IN_TBL_TYPE;
1046    l_task_out           PA_PROJECT_PUB.TASK_OUT_TBL_TYPE;
1047    l_key_members        PA_PROJECT_PUB.PROJECT_ROLE_TBL_TYPE;
1048    l_class_categories   PA_PROJECT_PUB.CLASS_CATEGORY_TBL_TYPE;
1049    -- Post 11.5.10
1050    -- RROY
1051    l_param_data         PJM_PROJECT_PARAM_PUB.ParamRecType;
1052    -- yazhou 26Sept2005 starts
1053    -- ER#4618348
1054    -- l_project_name_prefix  VARCHAR2(10);
1055    l_project_num_prefix      VARCHAR2(10);
1056    l_visit_name_len          NUMBER;
1057    -- yazhou 26Sept2005 ends
1058    --Bug#5587893
1059    /*sowsubra - Added a new profile that enables user to specify project status
1060    when a visit is pushed to prodn.*/
1061    l_project_status_code   VARCHAR2(30);
1062    l_new_txns_flag         VARCHAR2(1):= 'N'; -- Added by rnahata for Bug 6334682
1063 
1064    -- Define local Cursors
1065    -- To find visit related information
1066    CURSOR c_visit (x_id IN NUMBER) IS
1067     SELECT * FROM AHL_VISITS_VL
1068     WHERE VISIT_ID = x_id;
1069    c_visit_rec c_visit%ROWTYPE;
1070 
1071    -- To find count for tasks for visit
1072    CURSOR c_task_ct (x_id IN NUMBER) IS
1073     SELECT count(*) FROM AHL_VISIT_TASKS_VL
1074     WHERE VISIT_ID = x_id
1075      AND NVL(status_code, 'Y') <> NVL ('DELETED', 'X')    ;
1076 
1077    -- To find tasks information for visit
1078    CURSOR c_task (x_id IN NUMBER) IS
1079     SELECT * FROM AHL_VISIT_TASKS_VL
1080     WHERE VISIT_ID = x_id
1081      AND NVL(status_code, 'Y') <> NVL ('DELETED', 'X')    ;
1082    c_task_rec c_task%ROWTYPE;
1083 
1084    -- To find tasks information for visit
1085    CURSOR c_task_OVN (x_id IN NUMBER, x_task_num IN NUMBER) IS
1086     SELECT OBJECT_VERSION_NUMBER FROM AHL_VISIT_TASKS_VL
1087     WHERE VISIT_ID = x_id AND VISIT_TASK_NUMBER = x_task_num;
1088 
1089    -- To get the cost group for the Org
1090    CURSOR c_cost_group(p_org_id IN NUMBER) IS
1091    SELECT default_cost_group_id
1092    FROM mtl_parameters
1093     WHERE organization_id = p_org_id;
1094 
1095    -- Added by rnahata for Bug 6334682
1096    CURSOR c_new_txns_flag(c_project_status_code IN VARCHAR) IS
1097     SELECT ENABLED_FLAG FROM PA_PROJECT_STATUS_CONTROLS
1098     WHERE PROJECT_STATUS_CODE LIKE c_project_status_code
1099      AND ACTION_CODE LIKE 'NEW_TXNS';
1100 
1101    /*Added by rnahata for Bug 5758813 - fetches the task details for all the tasks in the visit
1102     The first part of the union fetches task details for all the Planned and Unplanned tasks.
1103     The second part fetches task details of all the MR/NR/SR Summary tasks.
1104     The third part fetches task details of all the manually created Summary and Unassociated tasks.
1105     */
1106    CURSOR get_prj_route_dtls_cur (p_visit_id IN NUMBER) IS
1107     SELECT SUBSTR(NVL(ar.route_no,avt.visit_task_name),1,20) task_name,
1108     SUBSTR(NVL(ar.title,avt.visit_task_name),1,250) description,
1109     avt.visit_task_name, avt.visit_task_number, avt.start_date_time task_start_date,
1110     avt.end_date_time task_end_date
1111     FROM ahl_routes_vl ar,ahl_visit_tasks_vl avt, ahl_mr_routes mrr
1112     WHERE avt.visit_id = p_visit_id
1113      AND NVL(avt.status_code,'Y') = 'PLANNING'
1114      AND avt.task_type_code NOT IN ('SUMMARY','UNASSOCIATED')
1115      AND avt.mr_route_id = mrr.mr_route_id (+)
1116      AND mrr.route_id = ar.route_id (+)
1117     UNION ALL
1118     SELECT SUBSTR(NVL(amh.title,avt.visit_task_name),1,20) task_name, NVL(amh.title,avt.visit_task_name) description,
1119     avt.visit_task_name, avt.visit_task_number, avt.start_date_time task_start_date,
1120     avt.end_date_time task_end_date
1121     FROM ahl_mr_headers_v amh,ahl_visit_tasks_vl avt
1122     WHERE avt.visit_id = p_visit_id
1123      AND NVL(avt.status_code,'Y') = 'PLANNING'
1124      AND avt.task_type_code = 'SUMMARY'
1125      AND avt.summary_task_flag = 'N'
1126      AND avt.mr_id = amh.mr_header_id (+)
1127     UNION ALL
1128     SELECT SUBSTR(avt.visit_task_name,1,20) task_name, avt.visit_task_name description,
1129     avt.visit_task_name, avt.visit_task_number, avt.start_date_time task_start_date,
1130     avt.end_date_time task_end_date
1131     FROM ahl_visit_tasks_vl avt
1132     WHERE avt.visit_id = p_visit_id
1133      AND NVL(avt.status_code,'Y') = 'PLANNING'
1134      AND ((avt.task_type_code = 'SUMMARY' AND avt.summary_task_flag = 'Y')
1135           OR (avt.task_type_code ='UNASSOCIATED'))
1136     ORDER BY 4;
1137    -- End changes by rnahata for Bug 5758813
1138 
1139     get_prj_route_dtls_rec  get_prj_route_dtls_cur%ROWTYPE;
1140 
1141 BEGIN
1142    --  Initialize API return status to success
1143     x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
1144 
1145    IF (l_log_procedure >= l_log_current_level) THEN
1146       fnd_log.string(l_log_procedure,
1147                      L_DEBUG_KEY ||'.begin',
1148                      'At the start of PL SQL procedure. Visit Id = ' || p_visit_id);
1149    END IF;
1150 
1151     --Bug#5587893
1152     /*sowsubra - starts */
1153     l_project_status_code := nvl(FND_PROFILE.VALUE('AHL_INITIAL_PROJECT_STATUS'),'SUBMITTED');
1154 
1155     /*
1156     IF (l_project_status_code IS NULL) THEN
1157       IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_error) THEN
1158          Fnd_Message.set_name ('AHL', 'AHL_PROJECT_STATUS_NOT_SET');
1159          Fnd_Msg_Pub.ADD;
1160       END IF;
1161       RAISE FND_API.G_EXC_ERROR;
1162    END IF;
1163     */
1164    /*sowsubra - ends */
1165 
1166     -- Begin changes by rnahata for Bug 6334682
1167     IF (l_log_statement >= l_log_current_level) THEN
1168        fnd_log.string(l_log_statement,
1169                       L_DEBUG_KEY,
1170                       'Initial project status code is: ' || l_project_status_code);
1171     END IF;
1172     OPEN c_new_txns_flag(l_project_status_code);
1173     FETCH c_new_txns_flag INTO l_new_txns_flag;
1174     CLOSE c_new_txns_flag;
1175     IF (l_log_statement >= l_log_current_level) THEN
1176        fnd_log.string(l_log_statement,
1177                       L_DEBUG_KEY,
1178                       'Create New Transaction Flag = ' || l_new_txns_flag);
1179     END IF;
1180     IF (l_new_txns_flag =  'N') THEN
1181        IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_error) THEN
1182           Fnd_Message.SET_NAME('AHL','AHL_PRJ_NEW_TXN_DISABLED');
1183           Fnd_Message.SET_TOKEN('PRJ_STATUS', l_project_status_code);
1184           Fnd_Msg_Pub.ADD;
1185        END IF;
1186        RAISE Fnd_Api.G_EXC_ERROR;
1187     END IF;
1188     -- End changes by rnahata for Bug 6334682
1189 
1190    OPEN c_Visit(p_visit_id);
1191    FETCH c_visit INTO c_visit_rec;
1192    CLOSE c_Visit;
1193 
1194    IF (c_visit_rec.START_DATE_TIME IS NOT NULL
1195        AND c_visit_rec.START_DATE_TIME <> Fnd_Api.G_MISS_DATE
1196        AND c_visit_rec.DEPARTMENT_ID IS NOT NULL
1197        AND c_visit_rec.DEPARTMENT_ID <> FND_API.G_MISS_NUM) THEN
1198 
1199       -- Post 11.5.10
1200       -- RROY
1201       IF c_visit_rec.project_template_id IS NOT NULL THEN
1202          CREATED_FROM_PROJECT_ID := c_visit_rec.project_template_id;
1203       ELSE
1204          CREATED_FROM_PROJECT_ID := nvl(FND_PROFILE.VALUE('AHL_DEFAULT_PA_TEMPLATE_ID'),0);
1205       END IF;
1206 
1207       IF (l_log_statement >= l_log_current_level) THEN
1208         fnd_log.string(l_log_statement,L_DEBUG_KEY,'CREATED_FROM_PROJECT_ID = '||CREATED_FROM_PROJECT_ID);
1209       END IF;
1210 
1211       -- yazhou 26Sept2005 starts
1212       -- ER#4618348
1213 
1214       --l_project_name_prefix := SUBSTR(FND_PROFILE.VALUE('AHL_PROJECT_PREFIX'),1,10);
1215       l_project_num_prefix := SUBSTR(FND_PROFILE.VALUE('AHL_PROJECT_NUM_PREFIX'),1,10);
1216 
1217       IF (l_log_statement >= l_log_current_level) THEN
1218         fnd_log.string(l_log_statement,L_DEBUG_KEY,'l_project_num_prefix = '||l_project_num_prefix);
1219       END IF;
1220 
1221       --l_visit_name_len := 30 - nvl(length(SubStr(l_project_name_prefix,1,255)),0);
1222 
1223       -- TO CREATE PROJECT IN PROJECTS
1224       l_Project_rec.PM_PROJECT_REFERENCE      := l_project_num_prefix || to_char(c_visit_rec.visit_number);
1225 --    l_Project_rec.PROJECT_NAME              := l_project_name_prefix|| SUBSTR(c_visit_rec.visit_name,1,l_visit_name_len);
1226       l_Project_rec.PROJECT_NAME              := l_project_num_prefix || to_char(c_visit_rec.visit_number);
1227 -- yazhou 26Sept2005 ends
1228       l_Project_rec.CREATED_FROM_PROJECT_ID   := CREATED_FROM_PROJECT_ID;
1229 -- yazhou 08Nov2005 starts
1230 -- Changed by jaramana on April 28, 2005 to fix Bug 4273892
1231 --    l_Project_rec.PROJECT_STATUS_CODE       := 'ACTIVE';
1232 -- Changed by sowsubra to fix Bug#5587893
1233 --    l_Project_rec.PROJECT_STATUS_CODE       := 'SUBMITTED';
1234       l_Project_rec.PROJECT_STATUS_CODE       := l_project_status_code ;
1235 -- yazhou 08Nov2005 ends
1236 
1237 -- AnRaj: Changed for Bug#5069540
1238       l_Project_rec.DESCRIPTION               := SUBSTR(c_visit_rec.description,1,250);
1239       --Fix for the Bug 7009212. rnahata truncated the time components
1240       l_Project_rec.START_DATE              := trunc(c_visit_rec.start_date_time);
1241       l_Project_rec.COMPLETION_DATE         := trunc(c_visit_rec.close_date_time);
1242       l_Project_rec.SCHEDULED_START_DATE    := trunc(c_visit_rec.start_date_time);
1243       --rnahata End
1244 
1245       OPEN c_task_ct(p_visit_id);
1246       FETCH c_task_ct INTO l_count;
1247       CLOSE c_task_ct;
1248 
1249       IF (l_log_statement >= l_log_current_level) THEN
1250         fnd_log.string(l_log_statement,L_DEBUG_KEY,'Tasks Count = '||l_count);
1251       END IF;
1252 
1253       IF l_count > 0 THEN
1254         IF (l_log_statement >= l_log_current_level) THEN
1255           fnd_log.string(l_log_statement,L_DEBUG_KEY,'Inside Tasks as Count more than zero');
1256         END IF;
1257         -- Begin changes by rnahata for Bug 5758813
1258         OPEN get_prj_route_dtls_cur(p_visit_id);
1259         i:=1;
1260         LOOP
1261              FETCH get_prj_route_dtls_cur INTO get_prj_route_dtls_rec;
1262              EXIT WHEN get_prj_route_dtls_cur%NOTFOUND;
1263              l_task_in(i).PM_TASK_REFERENCE         := get_prj_route_dtls_rec.visit_task_number;
1264              l_task_in(i).TASK_NAME                 := get_prj_route_dtls_rec.task_name;
1265              l_task_in(i).PA_TASK_NUMBER            := get_prj_route_dtls_rec.visit_task_number;
1266              l_task_in(i).TASK_DESCRIPTION          := get_prj_route_dtls_rec.description;
1267              --Fix for the Bug 7009212. rnahata truncated the time components
1268              l_task_in(i).TASK_START_DATE           := trunc(get_prj_route_dtls_rec.task_start_date);
1269              l_task_in(i).TASK_COMPLETION_DATE      := trunc(get_prj_route_dtls_rec.task_end_date);
1270              --rnahata End
1271              i := i + 1;
1272          END LOOP;
1273          CLOSE get_prj_route_dtls_cur;
1274          -- End changes by rnahata for Bug 5758813
1275       END IF; -- End of l_count
1276 
1277       IF l_task_in.COUNT > 0 THEN
1278         i := l_task_in.FIRST;
1279         LOOP
1280           IF (l_log_statement >= l_log_current_level) THEN
1281             fnd_log.string(l_log_statement,L_DEBUG_KEY,'TASK REFERENCE - '|| l_task_in(i).PM_TASK_REFERENCE);
1282             fnd_log.string(l_log_statement,L_DEBUG_KEY,'TASK NAME - '|| l_task_in(i).TASK_NAME);
1283             fnd_log.string(l_log_statement,L_DEBUG_KEY,'TASK NUMBER - '|| l_task_in(i).PA_TASK_NUMBER);
1284           END IF;
1285             EXIT WHEN i = l_task_in.LAST ;
1286             i := l_task_in.NEXT(i);
1287          END LOOP;
1288       END IF;  -- End of l_task_in
1289 
1290       -- To check Project responsibilites
1291       -- Post 11.5.10
1292       -- RROY
1293 
1294       IF (l_log_statement >= l_log_current_level) THEN
1295          fnd_log.string(l_log_statement,
1296                         L_DEBUG_KEY,
1297                         'Before calling AHL_VWP_RULES_PVT.Check_Proj_Responsibility');
1298       END IF;
1299 
1300       AHL_VWP_RULES_PVT.Check_Proj_Responsibility
1301       (x_check_project => l_chk_project,
1302        x_return_status => l_return_status);
1303 
1304       IF (l_log_statement >= l_log_current_level) THEN
1305          fnd_log.string(l_log_statement,
1306                         L_DEBUG_KEY,
1307                         'After calling AHL_VWP_RULES_PVT.Check_Proj_Responsibility. Return Status = ' || l_return_status);
1308       END IF;
1309 
1310       IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
1311          IF (l_log_statement >= l_log_current_level) THEN
1312             fnd_log.string(l_log_statement,
1313                            L_DEBUG_KEY,
1314                            'Errors from AHL_VWP_RULES_PVT.Check_Proj_Responsibility');
1315          END IF;
1316          x_return_status := l_return_status;
1317          IF l_return_status = FND_API.G_RET_STS_ERROR THEN
1318             RAISE FND_API.G_EXC_ERROR;
1319          ELSE
1320             RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1321          END IF;
1322       END IF;
1323 
1324       IF l_chk_project = 'Y' THEN
1325          IF (l_log_statement >= l_log_current_level) THEN
1326             fnd_log.string(l_log_statement,
1327                            L_DEBUG_KEY,
1328                            'Before calling PA_PROJECT_PUB.check_unique_project_reference to check for ' || l_project_num_prefix || c_visit_rec.visit_number);
1329          END IF;
1330 
1331          PA_PROJECT_PUB.Check_Unique_Project_Reference(
1332             p_api_version_number      => 1,
1333             p_init_msg_list           => l_init_msg_list,
1334             p_return_status           => l_return_status,
1335             p_msg_count               => l_msg_count,
1336             p_msg_data                => l_msg_data,
1337             -- Modified by rnahata on February 19, 2008 for Bug 6685071
1338             -- by prepending the l_project_num_prefix
1339             p_pm_project_reference    => l_project_num_prefix || c_visit_rec.visit_number,
1340             p_unique_project_ref_flag => l_project_flag);
1341 
1342          IF (l_log_statement >= l_log_current_level) THEN
1343             fnd_log.string(l_log_statement,
1344                            L_DEBUG_KEY,
1345                            'Returned from PA_PROJECT_PUB.check_unique_project_reference: p_unique_project_ref_flag = ' || l_project_flag || ', Return Status = ' || l_return_status );
1346          END IF;
1347 
1348          IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
1349             IF (l_log_statement >= l_log_current_level) THEN
1350                fnd_log.string(l_log_statement,
1351                               L_DEBUG_KEY,
1352                               'Errors from PA_PROJECT_PUB.check_unique_project_reference. Message count: ' ||
1353                               l_msg_count || ', message data: ' || l_msg_data);
1354             END IF;
1355             IF l_return_status = FND_API.G_RET_STS_ERROR THEN
1356                RAISE FND_API.G_EXC_ERROR;
1357             ELSE
1358                RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1359             END IF;
1360          END IF;
1361 
1362          IF l_project_flag = 'Y' THEN
1363             IF (l_log_statement >= l_log_current_level) THEN
1364                fnd_log.string(l_log_statement,
1365                               L_DEBUG_KEY,
1366                               'Before calling PA_PROJECT_PUB.create_project');
1367             END IF;
1368 
1369             PA_PROJECT_PUB.CREATE_PROJECT
1370             (p_api_version_number => 1,
1371              p_commit             => l_commit,
1372              p_init_msg_list      => l_init_msg_list,
1373              p_msg_count          => l_msg_count,
1374              p_msg_data           => l_msg_data,
1375              p_return_status      => x_return_status,
1376              p_workflow_started   => l_workflow_started,
1377              p_pm_product_code    => G_PM_PRODUCT_CODE,
1378              p_project_in         => l_project_rec,
1379              p_project_out        => l_project_out,
1380              p_key_members        => l_key_members,
1381              p_class_categories   => l_class_categories,
1382              p_tasks_in           => l_task_in,
1383              p_tasks_out          => l_task_out
1384             );
1385 
1386             IF (l_log_statement >= l_log_current_level) THEN
1387                fnd_log.string(l_log_statement,
1388                               L_DEBUG_KEY,
1389                               'After calling PA_PROJECT_PUB.create_project. Project_Id = ' ||
1390                               l_project_out.pa_project_id || ' Return Status = ' || x_return_status);
1391             END IF;
1392 
1393             IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
1394                IF (l_log_statement >= l_log_current_level) THEN
1395                   fnd_log.string(l_log_statement,
1396                                  L_DEBUG_KEY,
1397                                  'Errors from PA_PROJECT_PUB.create_project. Message count: ' ||
1398                                  l_msg_count || ', message data: ' || l_msg_data);
1399                END IF;
1400                IF l_return_status = FND_API.G_RET_STS_ERROR THEN
1401                   RAISE FND_API.G_EXC_ERROR;
1402                ELSE
1403                   RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1404                END IF;
1405             END IF;
1406 
1407             IF x_return_status = 'S' THEN
1408                UPDATE AHL_VISITS_B
1409                SET PROJECT_ID = l_project_out.pa_project_id,
1410                    OBJECT_VERSION_NUMBER = c_visit_rec.object_version_number + 1
1411                WHERE VISIT_ID = p_visit_id;
1412                -- RROY
1413                -- Post 11.5.10
1414                -- Call Create_Project_Parameter API
1415                -- RROY
1416                -- Confirm the parameters
1417                -- Other parameters are not mandatory
1418 
1419                OPEN c_cost_group(c_visit_rec.organization_id);
1420                FETCH c_cost_group INTO l_param_data.cost_group_id;
1421                CLOSE c_cost_group;
1422 
1423                l_param_data.project_id := l_project_out.pa_project_id;
1424                l_param_data.organization_id := c_visit_rec.organization_id;
1425                --l_param_data.cost_group_id := NVL(l_param_data.cost_group_id,1);
1426                l_param_data.wip_acct_class_code := NULL;
1427                l_param_data.eam_acct_class_code := NULL;
1428                l_param_data.ipv_expenditure_type := NULL;
1429                l_param_data.erv_expenditure_type := NULL;
1430                l_param_data.freight_expenditure_type := NULL;
1431                l_param_data.tax_expenditure_type := NULL;
1432                l_param_data.misc_expenditure_type := NULL;
1433                l_param_data.ppv_expenditure_type := NULL;
1434                l_param_data.dir_item_expenditure_type := 'Machine Usage';
1435                -- yazhou 06Oct2005 starts
1436                -- Bug fix #4658861
1437                --l_param_data.start_date_active := c_visit_rec.start_date_time;
1438                --l_param_data.end_date_active := c_visit_rec.close_date_time;
1439                l_param_data.start_date_active := NULL;
1440                l_param_data.end_date_active := NULL;
1441                -- yazhou 06Oct2005 ends
1442                -- Changes made by jaramana on May 5, 2006 to accommodate PJM Bug 5197977/5194650
1443                IF (l_log_statement >= l_log_current_level) THEN
1444                    FND_LOG.STRING(l_log_statement, L_DEBUG_KEY, 'About to set MFG_ORGANIZATION_ID Profile with ' || c_visit_rec.organization_id);
1445                END IF;
1446                FND_PROFILE.PUT('MFG_ORGANIZATION_ID', TO_CHAR(c_visit_rec.organization_id));
1447 
1448                PJM_PROJECT_PARAM_PUB.Create_Project_Parameter(
1449                     p_api_version   => 1.0,
1450                     p_init_msg_list => l_init_msg_list,
1451                     p_commit        => l_commit,
1452                     x_return_status => l_return_status,
1453                     x_msg_count     => l_msg_count,
1454                     x_msg_data      => l_msg_data,
1455                     p_param_data    => l_param_data);
1456 
1457                IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
1458                   IF (l_log_statement >= l_log_current_level) THEN
1459                      fnd_log.string(l_log_statement,
1460                                     L_DEBUG_KEY,
1461                                     'Errors from PJM_PROJECT_PARAM_PUB.Create_Project_Parameter. Message count: ' ||
1462                                     l_msg_count || ', message data: ' || l_msg_data);
1463                   END IF;
1464 
1465                   IF l_return_status = FND_API.G_RET_STS_ERROR THEN
1466                     RAISE FND_API.G_EXC_ERROR;
1467                   ELSE
1468                     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1469                   END IF;
1470                END IF;
1471                -- RROY
1472                IF l_task_out.COUNT > 0 THEN
1473                   z := l_task_out.FIRST;
1474                   LOOP
1475                      IF (l_log_statement >= l_log_current_level) THEN
1476                         fnd_log.string(l_log_statement,
1477                                        L_DEBUG_KEY,
1478                                        'Updating all tasks project_task_id = ' ||
1479                                        l_task_out(z).pa_task_id);
1480                      END IF;
1481 
1482                      OPEN c_Task_OVN(p_visit_id,l_task_in(z).PA_TASK_NUMBER);
1483                      FETCH c_Task_OVN INTO l_obj_version;
1484                      CLOSE c_Task_OVN;
1485 
1486                      UPDATE AHL_VISIT_TASKS_B
1487                      SET PROJECT_TASK_ID = l_task_out(z).pa_task_id,
1488                          OBJECT_VERSION_NUMBER = l_obj_version + 1
1489                      WHERE VISIT_ID = p_visit_id AND VISIT_TASK_NUMBER = l_task_in(z).PA_TASK_NUMBER;
1490 
1491                      EXIT WHEN z = l_task_out.LAST ;
1492                      z := l_task_out.NEXT(z);
1493                   END LOOP;
1494                END IF; -- End of l_task_out.COUNT
1495             END IF; -- End of x_return_status = 'S'
1496          ELSE -- Else of l_project_flag = 'Y'
1497             x_return_status := Fnd_Api.g_ret_sts_error;
1498             IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_error) THEN
1499               Fnd_Message.set_name ('AHL', 'AHL_VWP_PROJECT_NOT_UNIQUE');
1500               Fnd_Msg_Pub.ADD;
1501             END IF;
1502          END IF; -- End of l_project_flag = 'Y'
1503       END IF;  --- End of l_chk_project = 'Y'
1504    ELSIF c_visit_rec.START_DATE_TIME IS NULL or c_visit_rec.START_DATE_TIME = Fnd_Api.G_MISS_DATE THEN
1505       x_return_status := Fnd_Api.g_ret_sts_error;
1506       IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_error) THEN
1507          Fnd_Message.set_name ('AHL', 'AHL_VWP_VISIT_ST_DT_MISSING');
1508          Fnd_Msg_Pub.ADD;
1509       END IF;
1510    END IF;  -- End of Start Time and Department null Check
1511 
1512    IF (l_log_procedure >= l_log_current_level) THEN
1513       fnd_log.string(l_log_procedure,
1514                      L_DEBUG_KEY ||'.end',
1515                      'At the end of PL SQL procedure. Return Status = ' || x_return_status);
1516    END IF;
1517 END Create_Project;
1518 
1519 --------------------------------------------------------------------
1520 -- PROCEDURE
1521 --    Update_Project
1522 --
1523 -- PURPOSE
1524 --    To update Project status to CLOSED when visit is set as Closed/Canceled
1525 --------------------------------------------------------------------
1526 PROCEDURE Update_Project(
1527    p_api_version       IN  NUMBER,
1528    p_init_msg_list     IN  VARCHAR2  := Fnd_Api.g_false,
1529    p_commit            IN  VARCHAR2  := Fnd_Api.g_false,
1530    p_validation_level  IN  NUMBER    := Fnd_Api.g_valid_level_full,
1531    p_module_type       IN  VARCHAR2  := Null,
1532    p_visit_id          IN  NUMBER,
1533 
1534    x_return_status     OUT NOCOPY VARCHAR2,
1535    x_msg_count         OUT NOCOPY NUMBER,
1536    x_msg_data          OUT NOCOPY VARCHAR2)
1537 AS
1538   -- Define local Variables
1539    L_API_NAME     CONSTANT VARCHAR2(30)  := 'Update_Project';
1540    L_API_VERSION  CONSTANT NUMBER := 1.0;
1541    L_DEBUG_KEY    CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
1542    l_count                 NUMBER;
1543    l_msg_count             NUMBER;
1544    l_created_project_id    NUMBER;
1545    i                       NUMBER;
1546    l_msg_index_out         NUMBER;
1547    CREATED_FROM_PROJECT_ID NUMBER;
1548    l_return_status         VARCHAR2(1);
1549    l_chk_project           VARCHAR2(1);
1550    l_workflow_started      VARCHAR2(1);
1551    l_valid_flag            VARCHAR2(1):= 'N';
1552    l_commit                VARCHAR2(1) := 'F';
1553    l_init_msg_list         VARCHAR2(1) := 'F';
1554    l_default               VARCHAR2(30);
1555    l_msg_data              VARCHAR2(2000);
1556    G_EXC_ERROR             EXCEPTION;
1557 
1558   -- Define local table and record datatypes
1559    l_project_rec       PA_PROJECT_PUB.PROJECT_IN_REC_TYPE;
1560    l_project_out       PA_PROJECT_PUB.PROJECT_OUT_REC_TYPE;
1561    l_param_data        PJM_PROJECT_PARAM_PUB.ParamRecType;
1562    l_task_in           PA_PROJECT_PUB.TASK_IN_TBL_TYPE;
1563    l_task_out          PA_PROJECT_PUB.TASK_OUT_TBL_TYPE;
1564    l_key_members       PA_PROJECT_PUB.PROJECT_ROLE_TBL_TYPE;
1565    l_class_categories  PA_PROJECT_PUB.CLASS_CATEGORY_TBL_TYPE;
1566 
1567    -- yazhou 26Sept2005 starts
1568    -- ER#4618348
1569    -- l_project_name_prefix  VARCHAR2(10);
1570    l_project_num_prefix      VARCHAR2(10);
1571    l_visit_name_len          NUMBER;
1572    -- yazhou 26Sept2005 ends
1573 
1574  -- Define local Cursors
1575     -- To find visit related information
1576    CURSOR c_visit (x_id IN NUMBER) IS
1577     SELECT * FROM AHL_VISITS_VL
1578     WHERE VISIT_ID = x_id;
1579    c_visit_rec c_visit%ROWTYPE;
1580 
1581   -- To find count for tasks for visit
1582    CURSOR c_task_ct (x_id IN NUMBER) IS
1583     SELECT count(*) FROM AHL_VISIT_TASKS_VL
1584     WHERE VISIT_ID = x_id
1585      AND NVL(status_code, 'Y') <> NVL ('DELETED', 'X')    ;
1586 
1587    -- To find tasks information for visit
1588    CURSOR c_task (x_id IN NUMBER) IS
1589     SELECT * FROM AHL_VISIT_TASKS_VL
1590     WHERE VISIT_ID = x_id
1591      AND NVL(status_code, 'Y') <> NVL ('DELETED', 'X')    ;
1592    c_task_rec c_task%ROWTYPE;
1593 
1594   -- To find tasks information for visit
1595    CURSOR c_task_proj (x_id IN NUMBER) IS
1596     SELECT TASK_ID, TASK_NUMBER
1597     FROM PA_TASKS
1598     WHERE PROJECT_ID = x_id;
1599    c_task_proj_rec c_task_proj%ROWTYPE;
1600 
1601   CURSOR c_pjm_param(x_proj_id IN NUMBER,x_org_id IN NUMBER) IS
1602   SELECT 'x'
1603   FROM   pjm_project_parameters_v
1604   WHERE  project_id = x_proj_id
1605   AND    organization_id = x_org_id;
1606 
1607   l_dummy VARCHAR2(1);
1608 
1609   -- To get the cost group for the Org
1610   CURSOR c_cost_group(p_org_id IN NUMBER) IS
1611   SELECT default_cost_group_id
1612   FROM mtl_parameters
1613   WHERE organization_id = p_org_id;
1614 
1615   --Bug#5587893
1616   /*sowsubra - starts*/
1617   -- To get the project status for visit updation
1618   CURSOR c_proj_status_code(x_id IN NUMBER) IS
1619   SELECT ppa.project_status_code
1620   FROM ahl_visits_b avb, pa_projects_all ppa
1621   WHERE avb.visit_id = x_id
1622   AND avb.project_id = ppa.project_id;
1623 
1624   l_prj_status_code_fdb   pa_projects_all.project_status_code%TYPE;
1625   /*sowsubra - ends*/
1626 
1627   /*
1628   Modified by rnahata for Bug 5758813
1629   Fetches the task details for all the tasks in the visit
1630   The first part of the union fetches task details for all the Planned and Unplanned tasks.
1631   The second part fetches task details of all the MR/NR/SR Summary tasks.
1632   The third part fetches task details of all the manually created Summary and Unassociated tasks.
1633   */
1634   CURSOR get_prj_route_dtls_cur (p_visit_id IN NUMBER) IS
1635    SELECT SUBSTR(NVL(ar.route_no,avt.visit_task_name),1,20) task_name,
1636    SUBSTR(NVL(ar.title,avt.visit_task_name),1,250) description,
1637    avt.visit_task_name, avt.visit_task_number, avt.start_date_time task_start_date,
1638    avt.end_date_time task_end_date, avt.project_Task_id project_task_id
1639    FROM ahl_routes_vl ar,ahl_visit_tasks_vl avt, ahl_mr_routes mrr
1640    WHERE avt.visit_id = p_visit_id
1641     AND NVL(avt.status_code,'Y') = 'PLANNING'
1642     AND avt.task_type_code NOT IN ('SUMMARY','UNASSOCIATED')
1643     AND avt.mr_route_id = mrr.mr_route_id (+)
1644     AND mrr.route_id = ar.route_id (+)
1645    UNION ALL
1646    SELECT SUBSTR(NVL(amh.title,avt.visit_task_name),1,20) task_name, NVL(amh.title,avt.visit_task_name) description,
1647    avt.visit_task_name, avt.visit_task_number, avt.start_date_time task_start_date,
1648    avt.end_date_time task_end_date, avt.project_Task_id project_task_id
1649    FROM ahl_mr_headers_v amh,ahl_visit_tasks_vl avt
1650    WHERE avt.visit_id = p_visit_id
1651     AND NVL(avt.status_code,'Y') = 'PLANNING'
1652     AND avt.task_type_code = 'SUMMARY'
1653     AND avt.summary_task_flag = 'N'
1654     AND avt.mr_id = amh.mr_header_id (+)
1655    UNION ALL
1656    SELECT SUBSTR(avt.visit_task_name,1,20) task_name, avt.visit_task_name description,
1657    avt.visit_task_name, avt.visit_task_number, avt.start_date_time task_start_date,
1658    avt.end_date_time task_end_date, avt.project_Task_id project_task_id
1659    FROM ahl_visit_tasks_vl avt
1660    WHERE avt.visit_id = p_visit_id
1661     AND NVL(avt.status_code,'Y') = 'PLANNING'
1662     AND ((avt.task_type_code = 'SUMMARY' AND avt.summary_task_flag = 'Y')
1663      OR (avt.task_type_code ='UNASSOCIATED'))
1664    ORDER BY 4;
1665   -- End changes by rnahata for Bug 5758813
1666 
1667   get_prj_route_dtls_rec  get_prj_route_dtls_cur%ROWTYPE;
1668 
1669 BEGIN
1670     SAVEPOINT Update_project;
1671 
1672    IF (l_log_procedure >= l_log_current_level) THEN
1673       fnd_log.string(l_log_procedure,
1674                      L_DEBUG_KEY ||'.begin',
1675                      'At the start of PL SQL procedure. Visit Id = ' || p_visit_id);
1676    END IF;
1677 
1678     -- Initialize message list if p_init_msg_list is set to TRUE.
1679     IF Fnd_Api.to_boolean(p_init_msg_list) THEN
1680       Fnd_Msg_Pub.initialize;
1681     END IF;
1682 
1683     --  Initialize API return status to success
1684     x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
1685 
1686     -- Standard call to check for call compatibility.
1687     IF NOT Fnd_Api.COMPATIBLE_API_CALL(l_api_version,
1688                                       p_api_version,
1689                                       l_api_name,G_PKG_NAME)
1690     THEN
1691        RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
1692     END IF;
1693 
1694     -- To check Project responsibilites
1695     -- Post 11.5.10
1696     -- RROY
1697    IF (l_log_statement >= l_log_current_level) THEN
1698       fnd_log.string(l_log_statement,
1699                      L_DEBUG_KEY,
1700                      'Before calling AHL_VWP_RULES_PVT.Check_Proj_Responsibility');
1701    END IF;
1702     AHL_VWP_RULES_PVT.Check_Proj_Responsibility
1703           ( x_check_project    => l_chk_project,
1704             x_return_status    => l_return_status);
1705 
1706    IF (l_log_statement >= l_log_current_level) THEN
1707       fnd_log.string(l_log_statement,
1708                      L_DEBUG_KEY,
1709                      'After calling AHL_VWP_RULES_PVT.Check_Proj_Responsibility. Return Status = ' || l_return_status);
1710    END IF;
1711 
1712    IF (l_return_status <> Fnd_Api.G_RET_STS_SUCCESS) THEN
1713       IF (l_log_statement >= l_log_current_level) THEN
1714          fnd_log.string(l_log_statement,
1715                         L_DEBUG_KEY,
1716                         'Errors from AHL_VWP_RULES_PVT.Check_Proj_Responsibility');
1717       END IF;
1718       x_return_status := l_return_status;
1719       IF l_return_status = FND_API.G_RET_STS_ERROR THEN
1720          RAISE FND_API.G_EXC_ERROR;
1721       ELSE
1722          RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1723       END IF;
1724    END IF;
1725 
1726     IF l_chk_project = 'Y' THEN
1727       OPEN c_Visit(p_visit_id);
1728       FETCH c_visit INTO c_visit_rec;
1729       CLOSE c_Visit;
1730 
1731       --Bug#5587893
1732       OPEN c_proj_status_code(p_visit_id);
1733       FETCH c_proj_status_code INTO l_prj_status_code_fdb;
1734       CLOSE c_proj_status_code;
1735 
1736       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
1737         c_visit_rec.start_date_time := SYSDATE;
1738       END IF;
1739 
1740       IF (c_visit_rec.START_DATE_TIME IS NOT NULL
1741         AND c_visit_rec.START_DATE_TIME <> Fnd_Api.G_MISS_DATE
1742         AND c_visit_rec.DEPARTMENT_ID IS NOT NULL
1743         AND c_visit_rec.DEPARTMENT_ID <> FND_API.G_MISS_NUM) THEN
1744 
1745         IF c_visit_rec.project_template_id IS NOT NULL THEN
1746           CREATED_FROM_PROJECT_ID := c_visit_rec.project_template_id;
1747         ELSE
1748           CREATED_FROM_PROJECT_ID := nvl(FND_PROFILE.VALUE('AHL_DEFAULT_PA_TEMPLATE_ID'),0);
1749         END IF;
1750 
1751         -- yazhou 26Sept2005 starts
1752         -- ER#4618348
1753 
1754         --l_project_name_prefix := SUBSTR(FND_PROFILE.VALUE('AHL_PROJECT_PREFIX'),1,10);
1755         l_project_num_prefix := SUBSTR(FND_PROFILE.VALUE('AHL_PROJECT_NUM_PREFIX'),1,10);
1756 
1757         IF (l_log_statement >= l_log_current_level) THEN
1758            fnd_log.string(l_log_statement,L_DEBUG_KEY,'l_project_num_prefix = ' || l_project_num_prefix);
1759         END IF;
1760 
1761         --l_visit_name_len := 30 - nvl(length(SubStr(l_project_name_prefix,1,255)),0);
1762 
1763         -- TO UPDATE PROJECT IN PROJECTS
1764         l_Project_rec.PM_PROJECT_REFERENCE      := l_project_num_prefix || to_char(c_visit_rec.visit_number);
1765         --l_Project_rec.PROJECT_NAME            := l_project_name_prefix|| SUBSTR(c_visit_rec.visit_name,1,l_visit_name_len);
1766         l_Project_rec.PROJECT_NAME              := l_project_num_prefix || to_char(c_visit_rec.visit_number);
1767         -- yazhou 26Sept2005 ends
1768         l_Project_rec.CREATED_FROM_PROJECT_ID   := CREATED_FROM_PROJECT_ID;
1769         -- AnRaj: Changed for Bug#5069540
1770         l_Project_rec.DESCRIPTION               := SUBSTR(c_visit_rec.description,1,250);
1771         --Fix for the Bug 7009212; rnahata truncated the dates
1772         l_Project_rec.START_DATE                := trunc(c_visit_rec.start_date_time);
1773         l_Project_rec.COMPLETION_DATE           := trunc(c_visit_rec.close_date_time);
1774         l_Project_rec.SCHEDULED_START_DATE      := trunc(c_visit_rec.start_date_time);
1775         --rnahata End
1776         l_Project_rec.PA_PROJECT_ID             := c_visit_rec.PROJECT_ID;
1777         /*-- Post 11.5.10
1778         -- RROY
1779         IF c_visit_rec.status_code = 'CLOSED' OR c_visit_rec.status_code = 'CANCELLED' THEN
1780                l_Project_rec.PROJECT_STATUS_CODE := 'CLOSED';
1781              ELSIF p_module_type = 'UPT' OR p_module_type = 'DEL' THEN
1782                l_Project_rec.PROJECT_STATUS_CODE := 'REJECTED';
1783              END IF;
1784         -- RROY*/
1785         -- Merge process for 11.5 10 bug fix on CMRDV10P env.
1786         -- Start
1787         IF c_visit_rec.status_code = 'CLOSED' OR c_visit_rec.status_code = 'CANCELLED' THEN
1788           l_Project_rec.PROJECT_STATUS_CODE := 'CLOSED';
1789         ELSIF p_module_type = 'UPT' OR p_module_type = 'DEL' THEN
1790           l_Project_rec.PROJECT_STATUS_CODE := 'REJECTED';
1791         ELSE
1792         -- yazhou 08Nov2005 starts
1793         -- Changed by jaramana on April 28, 2005 to fix Bug 4273892
1794         --l_Project_rec.PROJECT_STATUS_CODE       := 'ACTIVE';
1795         --l_Project_rec.PROJECT_STATUS_CODE := 'SUBMITTED';
1796         --Bug#5587893
1797         l_Project_rec.PROJECT_STATUS_CODE := l_prj_status_code_fdb;
1798         -- yazhou 08Nov2005 ends
1799       END IF;
1800       -- End
1801 
1802       IF (l_log_statement >= l_log_current_level) THEN
1803         fnd_log.string(l_log_statement,L_DEBUG_KEY,'After assigning all values to project record type');
1804       END IF;
1805 
1806       OPEN c_task_ct(p_visit_id);
1807       FETCH c_task_ct INTO l_count;
1808       CLOSE c_task_ct;
1809 
1810       IF (l_log_statement >= l_log_current_level) THEN
1811         fnd_log.string(l_log_statement,L_DEBUG_KEY,'Number of tasks = ' || l_count);
1812       END IF;
1813 
1814       IF l_count > 0 THEN
1815          -- Begin changes by rnahata for Bug 5758813
1816          OPEN get_prj_route_dtls_cur(p_visit_id);
1817          i := 1;
1818          LOOP
1819             FETCH get_prj_route_dtls_cur INTO get_prj_route_dtls_rec;
1820             EXIT WHEN get_prj_route_dtls_cur%NOTFOUND;
1821             l_task_in(i).PM_TASK_REFERENCE         := get_prj_route_dtls_rec.visit_task_number;
1822             l_task_in(i).TASK_NAME                 := get_prj_route_dtls_rec.task_name;
1823             l_task_in(i).PA_TASK_NUMBER            := get_prj_route_dtls_rec.visit_task_number;
1824             l_task_in(i).TASK_DESCRIPTION          := get_prj_route_dtls_rec.description;
1825             --Fix for the Bug 7009212; rnahata truncated the dates
1826             l_task_in(i).TASK_START_DATE           := trunc(get_prj_route_dtls_rec.task_start_date);
1827             l_task_in(i).TASK_COMPLETION_DATE      := trunc(get_prj_route_dtls_rec.task_end_date);
1828             --rnahata End
1829             l_task_in(i).PA_TASK_ID                := get_prj_route_dtls_rec.project_task_id;
1830             IF (l_log_statement >= l_log_current_level) THEN
1831                fnd_log.string(l_log_statement,
1832                               L_DEBUG_KEY,
1833                               'Visit Task ' || i || ': Name = ' || l_task_in(i).TASK_NAME);
1834             END IF;
1835             i := i + 1;
1836          END LOOP;
1837          CLOSE get_prj_route_dtls_cur;
1838          -- End changes by rnahata for Bug 5758813
1839       END IF;
1840 
1841       -- Need to update proejct for
1842       IF c_visit_rec.PROJECT_ID IS NOT NULL THEN
1843         IF (l_log_statement >= l_log_current_level) THEN
1844           fnd_log.string(l_log_statement,L_DEBUG_KEY,'Visit Project ID = ' || c_visit_rec.PROJECT_ID);
1845           fnd_log.string(l_log_statement,L_DEBUG_KEY,'Before calling PA_PROJECT_PUB.UPDATE_PROJECT');
1846         END IF;
1847 
1848         PA_PROJECT_PUB.UPDATE_PROJECT
1849                    (p_api_version_number     => 1,
1850                     p_commit                 => l_commit,
1851                     p_init_msg_list          => l_init_msg_list,
1852                     p_msg_count              => l_msg_count,
1853                     p_msg_data               => l_msg_data,
1854                     p_return_status          => l_return_status,
1855                     p_workflow_started       => l_workflow_started,
1856                     p_pm_product_code        => G_PM_PRODUCT_CODE,
1857                     p_project_in             => l_project_rec,
1858                     p_project_out            => l_project_out,
1859                     p_key_members            => l_key_members,
1860                     p_class_categories       => l_class_categories,
1861                     p_tasks_in                => l_task_in,
1862                     p_tasks_out               => l_task_out
1863                    );
1864 
1865         IF (l_log_statement >= l_log_current_level) THEN
1866             fnd_log.string(l_log_statement,L_DEBUG_KEY,'After calling PA_PROJECT_PUB.UPDATE_PROJECT - l_return_status = '||l_return_status);
1867         END IF;
1868 
1869         IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
1870           IF (l_log_statement >= l_log_current_level) THEN
1871               fnd_log.string(l_log_statement,L_DEBUG_KEY,'Errors from PA_PROJECT_PUB.UPDATE_PROJECT - l_msg_count = '||l_msg_count);
1872           END IF;
1873           RAISE Fnd_Api.g_exc_error;
1874         END IF;
1875 
1876         -- If the Visit Organisation is chnaged after costing
1877         -- need to set pjm paramters for the new org if it doesnot exist.
1878         OPEN c_pjm_param(c_visit_rec.project_id, c_visit_rec.organization_id);
1879         FETCH c_pjm_param INTO l_dummy;
1880         IF c_pjm_param%NOTFOUND THEN -- need to create for new org
1881 
1882             OPEN c_cost_group(c_visit_rec.organization_id);
1883             FETCH c_cost_group INTO l_param_data.cost_group_id;
1884             CLOSE c_cost_group;
1885 
1886             l_param_data.project_id := c_visit_rec.project_id;
1887             l_param_data.organization_id := c_visit_rec.organization_id;
1888             -- l_param_data.cost_group_id := NVL(l_param_data.cost_group_id,1);
1889             l_param_data.wip_acct_class_code := NULL;
1890             l_param_data.eam_acct_class_code := NULL;
1891             l_param_data.ipv_expenditure_type := NULL;
1892             l_param_data.erv_expenditure_type := NULL;
1893             l_param_data.freight_expenditure_type := NULL;
1894             l_param_data.tax_expenditure_type := NULL;
1895             l_param_data.misc_expenditure_type := NULL;
1896             l_param_data.ppv_expenditure_type := NULL;
1897             l_param_data.dir_item_expenditure_type := 'Machine Usage';
1898             -- yazhou 06Oct2005 starts
1899             -- Bug fix #4658861
1900             -- l_param_data.start_date_active := c_visit_rec.start_date_time;
1901             -- l_param_data.end_date_active := c_visit_rec.close_date_time;
1902             l_param_data.start_date_active := NULL;
1903             l_param_data.end_date_active := NULL;
1904             -- yazhou 06Oct2005 ends
1905 
1906             PJM_PROJECT_PARAM_PUB.CREATE_PROJECT_PARAMETER(
1907               p_api_version => 1.0,
1908               p_init_msg_list => p_init_msg_list,
1909               p_commit => l_commit,
1910               x_return_status => l_return_status,
1911               x_msg_count => l_msg_count,
1912               x_msg_data => l_msg_data,
1913               p_param_data => l_param_data);
1914 
1915             IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
1916                CLOSE c_pjm_param;
1917                RAISE FND_API.G_EXC_ERROR;
1918             END IF;
1919             -- RROY
1920          END IF;
1921          CLOSE c_pjm_param;
1922 
1923          -- Merge process fro 11.5 10 bug fix on cmrdv10p env.
1924          -- Bug# 3594083 fix by shbhanda on 04/23
1925          -- To update all tasks without project task with project task id
1926          OPEN c_task_proj(c_visit_rec.PROJECT_ID);
1927          LOOP
1928              FETCH c_task_proj INTO c_task_proj_rec;
1929              EXIT WHEN c_task_proj%NOTFOUND;
1930 
1931              UPDATE AHL_VISIT_TASKS_B SET
1932              PROJECT_TASK_ID = c_task_proj_rec.task_id,
1933              OBJECT_VERSION_NUMBER = OBJECT_VERSION_NUMBER + 1
1934              /*B6436358 - sowsubra - Visit task number is of type number and task number in projects
1935              is of type char. Hence the invalid number error. And so added a to_char function to convert
1936              the visit task number to character*/
1937              WHERE VISIT_ID = p_visit_id AND TO_CHAR(VISIT_TASK_NUMBER) = c_task_proj_rec.task_number
1938              AND PROJECT_TASK_ID is NULL;
1939          END LOOP;
1940          CLOSE c_task_proj;
1941       END IF;
1942    ELSIF c_visit_rec.START_DATE_TIME IS NULL or c_visit_rec.START_DATE_TIME = Fnd_Api.G_MISS_DATE THEN
1943       x_return_status := Fnd_Api.g_ret_sts_error;
1944       IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_error) THEN
1945          Fnd_Message.set_name ('AHL', 'AHL_VWP_VISIT_ST_DT_MISSING');
1946          Fnd_Msg_Pub.ADD;
1947       END IF;
1948    END IF; -- check for visit's start date time
1949 END IF; -- l_chk_project
1950 
1951 ---------------------------End of API Body---------------------------------------
1952 --Standard check to count messages
1953 l_msg_count := Fnd_Msg_Pub.count_msg;
1954 
1955 IF l_msg_count > 0 THEN
1956    X_msg_count := l_msg_count;
1957    X_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
1958    RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
1959 END IF;
1960 
1961 IF (l_log_procedure >= l_log_current_level) THEN
1962     fnd_log.string(l_log_procedure,L_DEBUG_KEY ||'.end','End of the procedure');
1963 END IF;
1964 
1965 EXCEPTION
1966  WHEN FND_API.G_EXC_ERROR THEN
1967    x_return_status := FND_API.G_RET_STS_ERROR;
1968    ROLLBACK TO Update_Project;
1969    FND_MSG_PUB.count_and_get(p_count => x_msg_count,
1970                               p_data  => x_msg_data,
1971                               p_encoded => fnd_api.g_false);
1972 
1973  WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
1974    x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1975    ROLLBACK TO Update_Project;
1976    FND_MSG_PUB.count_and_get(p_count => x_msg_count,
1977                               p_data  => x_msg_data,
1978                               p_encoded => fnd_api.g_false);
1979 
1980  WHEN OTHERS THEN
1981     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1982     ROLLBACK TO Update_Project;
1983     IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
1984        fnd_msg_pub.add_exc_msg(p_pkg_name       => G_PKG_NAME,
1985                                p_procedure_name => 'Update_Project',
1986                                p_error_text     => SUBSTR(SQLERRM,1,500));
1987     END IF;
1988     FND_MSG_PUB.count_and_get(p_count => x_msg_count,
1989                                p_data  => x_msg_data,
1990                                p_encoded => fnd_api.g_false);
1991 
1992 END Update_Project;
1993 
1994 --------------------------------------------------------------------
1995 -- PROCEDURE
1996 --    Delete_Project
1997 --
1998 -- PURPOSE
1999 --    To delete Project and its tasks if visit in VWP is deleted
2000 --------------------------------------------------------------------
2001 PROCEDURE Delete_Project(
2002    p_api_version       IN  NUMBER,
2003    p_init_msg_list     IN  VARCHAR2  := Fnd_Api.g_false,
2004    p_commit            IN  VARCHAR2  := Fnd_Api.g_false,
2005    p_validation_level  IN  NUMBER    := Fnd_Api.g_valid_level_full,
2006    p_module_type       IN  VARCHAR2  := Null,
2007    p_visit_id          IN  NUMBER,
2008    x_return_status     OUT NOCOPY VARCHAR2,
2009    x_msg_count         OUT NOCOPY NUMBER,
2010    x_msg_data          OUT NOCOPY VARCHAR2  )
2011 AS
2012   -- Define local Variables
2013    L_API_NAME    CONSTANT VARCHAR2(30)  := 'Delete_Project';
2014    L_DEBUG_KEY   CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
2015    L_API_VERSION CONSTANT NUMBER := 1.0;
2016    l_count                NUMBER;
2017    l_msg_count            NUMBER;
2018    l_created_project_id   NUMBER;
2019    i                      NUMBER;
2020    l_return_status        VARCHAR2(1);
2021    l_chk_project          VARCHAR2(1);
2022    l_del_proj_flag        VARCHAR2(1);
2023    l_valid_flag           VARCHAR2(1):= 'N';
2024    l_commit               VARCHAR2(1) := 'F';
2025    l_init_msg_list        VARCHAR2(1) := 'F';
2026    l_default              VARCHAR2(30);
2027    l_msg_data             VARCHAR2(2000);
2028    G_EXC_ERROR            EXCEPTION;
2029 
2030  -- Define local Cursors
2031     -- To find visit related information
2032    CURSOR c_visit (x_id IN NUMBER) IS
2033     SELECT * FROM AHL_VISITS_VL
2034     WHERE VISIT_ID = x_id;
2035    c_visit_rec c_visit%ROWTYPE;
2036 
2037    -- To find whether the visit project occurs in PJM_PROJECT_PARAMETERS table
2038     CURSOR c_Project(x_proj_id IN NUMBER) IS
2039        SELECT count(*) FROM PJM_PROJECT_PARAMETERS
2040          WHERE Project_ID = x_proj_id;
2041 BEGIN
2042 
2043   SAVEPOINT Delete_project;
2044 
2045   IF (l_log_procedure >= l_log_current_level) THEN
2046     fnd_log.string(l_log_procedure,L_DEBUG_KEY ||'.begin','At the start of the procedure');
2047   END IF;
2048 
2049   -- Initialize message list if p_init_msg_list is set to TRUE.
2050   IF Fnd_Api.to_boolean(p_init_msg_list)THEN
2051      Fnd_Msg_Pub.initialize;
2052   END IF;
2053 
2054   --  Initialize API return status to success
2055   x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
2056 
2057   -- Standard call to check for call compatibility.
2058   IF NOT Fnd_Api.COMPATIBLE_API_CALL(l_api_version,
2059                                       p_api_version,
2060                                       L_API_NAME,G_PKG_NAME) THEN
2061        RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2062   END IF;
2063 
2064   IF (l_log_statement >= l_log_current_level) THEN
2065     fnd_log.string(l_log_statement,L_DEBUG_KEY,'Visit Id=' || p_visit_id);
2066   END IF;
2067 
2068   OPEN c_visit (p_visit_id);
2069   FETCH c_visit INTO c_visit_rec;
2070   CLOSE c_visit;
2071 
2072   -- To check Project responsibilites
2073   -- Post 11.5.10
2074   -- RROY
2075   AHL_VWP_RULES_PVT.Check_Proj_Responsibility
2076    (x_check_project    => l_chk_project,
2077     x_return_status    => l_return_status);
2078 
2079   IF l_return_status <> Fnd_Api.G_RET_STS_SUCCESS THEN
2080     x_return_status := l_return_status;
2081     RAISE G_EXC_ERROR;
2082   END IF;
2083 
2084   IF l_chk_project = 'Y' THEN
2085     OPEN  c_Project(c_visit_rec.PROJECT_ID);
2086     FETCH c_Project INTO l_count;
2087     CLOSE c_Project;
2088 
2089     IF l_count > 0 THEN -- merge process for 11.5 10 bug# 3470801 fix on CMRDV10P
2090       Fnd_Message.SET_NAME('AHL','AHL_VWP_PROJ_PJM_PARA');
2091       Fnd_Message.SET_TOKEN('VISIT_NUMBER', c_visit_rec.Visit_Number);
2092       Fnd_Msg_Pub.ADD;
2093       RAISE Fnd_Api.G_EXC_ERROR;
2094     ELSE
2095       IF (l_log_statement >= l_log_current_level) THEN
2096         fnd_log.string(l_log_statement,L_DEBUG_KEY,'Before calling :  PA_PROJECT_PUB.CHECK_DELETE_PROJECT_OK');
2097       END IF;
2098 
2099       PA_PROJECT_PUB.CHECK_DELETE_PROJECT_OK
2100                 ( p_api_version_number     => 1
2101                   , p_init_msg_list         =>  l_init_msg_list
2102                   , p_return_status         => l_return_status
2103                   , p_msg_count           => l_msg_count
2104                   , p_msg_data           => l_msg_data
2105                   , p_project_id       => c_visit_rec.PROJECT_ID
2106                   , p_pm_project_reference   =>  c_visit_rec.visit_number
2107                   , p_delete_project_ok_flag => l_del_proj_flag
2108                 );
2109 
2110       IF (l_log_statement >= l_log_current_level) THEN
2111         fnd_log.string(l_log_statement,L_DEBUG_KEY,'After calling PA_PROJECT_PUB.CHECK_DELETE_PROJECT_OK - l_return_status = '||l_return_status);
2112       END IF;
2113 
2114       IF l_return_status <> 'S' THEN
2115         RAISE G_EXC_ERROR;
2116       END IF;
2117 
2118       IF (l_log_statement >= l_log_current_level) THEN
2119         fnd_log.string(l_log_statement,L_DEBUG_KEY,'l_del_proj_flag = '||l_del_proj_flag);
2120       END IF;
2121 
2122       IF l_del_proj_flag = 'Y' THEN
2123           IF (l_log_statement >= l_log_current_level) THEN
2124             fnd_log.string(l_log_statement,L_DEBUG_KEY,'Before calling PA_PROJECT_PUB.DELETE_PROJECT');
2125           END IF;
2126 
2127           PA_PROJECT_PUB.DELETE_PROJECT
2128                  ( p_api_version_number  =>  1
2129                  ,p_commit               =>  l_commit
2130                  ,p_init_msg_list        =>  l_init_msg_list
2131                  ,p_msg_count            =>  l_msg_count
2132                  ,p_msg_data             =>  l_msg_data
2133                  ,p_return_status        =>  l_return_status
2134                  ,p_pm_product_code      =>  G_PM_PRODUCT_CODE
2135                  ,p_pm_project_reference =>  c_visit_rec.visit_number
2136                  ,p_pa_project_id        =>  c_visit_rec.PROJECT_ID
2137                 );
2138 
2139           IF (l_log_statement >= l_log_current_level) THEN
2140             fnd_log.string(l_log_statement,L_DEBUG_KEY,'After calling PA_PROJECT_PUB.DELETE_PROJECT - l_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,L_DEBUG_KEY,'Errors from PA_PROJECT_PUB.DELETE_PROJECT API : '|| x_msg_count );
2146             END IF;
2147             RAISE Fnd_Api.g_exc_error;
2148           END IF;
2149       END IF;
2150     END IF;
2151   END IF;
2152 
2153 ---------------------------End of API Body---------------------------------------
2154   --Standard check to count messages
2155   l_msg_count := Fnd_Msg_Pub.count_msg;
2156 
2157   IF l_msg_count > 0 THEN
2158      X_msg_count := l_msg_count;
2159      X_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
2160      RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
2161   END IF;
2162 
2163   IF (l_log_procedure >= l_log_current_level) THEN
2164     fnd_log.string(l_log_procedure,L_DEBUG_KEY ||'.end','End of the procedure');
2165   END IF;
2166 
2167 EXCEPTION
2168  WHEN FND_API.G_EXC_ERROR THEN
2169    x_return_status := FND_API.G_RET_STS_ERROR;
2170    ROLLBACK TO Delete_Project;
2171    FND_MSG_PUB.count_and_get(p_count => x_msg_count,
2172                              p_data  => x_msg_data,
2173                              p_encoded => fnd_api.g_false);
2174 
2175  WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
2176    x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2177    ROLLBACK TO Delete_Project;
2178    FND_MSG_PUB.count_and_get(p_count => x_msg_count,
2179                              p_data  => x_msg_data,
2180                              p_encoded => fnd_api.g_false);
2181 
2182  WHEN OTHERS THEN
2183     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2184     ROLLBACK TO Delete_Project;
2185     IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
2186        fnd_msg_pub.add_exc_msg(p_pkg_name       => G_PKG_NAME,
2187                                p_procedure_name => 'Delete_Project',
2188                                p_error_text     => SUBSTR(SQLERRM,1,500));
2189     END IF;
2190     FND_MSG_PUB.count_and_get(p_count => x_msg_count,
2191                                p_data  => x_msg_data,
2192                                p_encoded => fnd_api.g_false);
2193 END Delete_Project;
2194 
2195 --****************************************************************--
2196 --------------------------------------------------------------------
2197 --              VWP INTEGRATION WITH PRODUCTION                   --
2198 --------------------------------------------------------------------
2199 --****************************************************************--
2200 
2201 ------------------------------------------------------------------
2202 --  Procedure name    : Validate_MR_Route_Date
2203 --  Type              : Private
2204 --  Function          : Validate if the tasks associated to MR Route Id
2205 --                      have an expired MR Id / Route Id.
2206 --  Parameters  :
2207 --
2208 --  Validate_MR_Route_Date Parameters:
2209 --       p_mr_route_id            IN     NUMBER     Required
2210 --       p_visit_task_number      IN     NUMBER     Required
2211 --       p_start_date_time        IN     DATE       Required
2212 --       p_end_date_time          IN     DATE       Required
2213 --
2214 --  Version :
2215 --      28 Sep, 2007                    RNAHATA  Initial Version - 1.0
2216 --                                      Added for Bug 6448678
2217 -------------------------------------------------------------------
2218 
2219 PROCEDURE Validate_MR_Route_Date(
2220    p_mr_route_id       IN  NUMBER,
2221    p_visit_task_number IN  NUMBER,
2222    p_start_date_time   IN  DATE,
2223    p_end_date_time     IN  DATE
2224   )
2225 AS
2226    -- Define local Variables
2227    L_API_NAME     CONSTANT VARCHAR2(30)  := 'Validate_MR_Route_Date';
2228    L_DEBUG_KEY    CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
2229 
2230    -- To find MR related Information
2231    CURSOR c_mr_header (c_id IN NUMBER) IS
2232      SELECT mrh1.effective_from,mrh1.effective_to
2233      FROM AHL_MR_HEADERS_APP_V mrh1, AHL_MR_ROUTES mrr
2234      WHERE mrh1.mr_status_code = 'COMPLETE' AND
2235            trunc(mrh1.effective_from) <= trunc(sysdate) AND
2236            trunc(nvl(mrh1.effective_to,sysdate)) >= trunc(sysdate) AND
2237            mrr.mr_route_id = c_id  AND
2238            mrh1.mr_header_id = mrr.mr_header_id AND
2239            mrh1.version_number = (select max(version_number)
2240                                  from AHL_MR_HEADERS_APP_V mrh2
2241                                  where mrh2.title = mrh1.title
2242                                  and mrh2.mr_status_code = 'COMPLETE'
2243                                  and trunc(effective_from) <= trunc(sysdate) AND
2244                                  trunc(nvl(effective_to,sysdate)) >= trunc(sysdate));
2245 
2246    c_mr_header_rec c_mr_header%ROWTYPE;
2247 
2248    -- To find Route related Information
2249    CURSOR c_route (c_id IN NUMBER) IS
2250      SELECT ra.*
2251      FROM AHL_ROUTES_APP_V ra, AHL_MR_ROUTES mrr
2252      WHERE ra.route_id = mrr.route_id AND
2253            mrr.mr_route_id = c_id AND
2254            ra.revision_status_code = 'COMPLETE';
2255 
2256    c_route_rec c_route%ROWTYPE;
2257 
2258 BEGIN
2259 
2260    -- Log API Entry Point
2261    IF (l_log_procedure >= l_log_current_level) THEN
2262        fnd_log.string(l_log_procedure,
2263                       L_DEBUG_KEY ||'.begin',
2264                       'At the start of PL SQL procedure.');
2265        fnd_log.string(l_log_procedure,
2266                       L_DEBUG_KEY,
2267                       'MR Route Id = ' || p_mr_route_id || 'Visit Task Number = ' || p_visit_task_number ||
2268                       'Start Date = ' || p_start_date_time || 'End Date = ' || p_end_date_time);
2269     END IF;
2270 
2271    IF p_mr_route_id IS NOT NULL THEN
2272       OPEN c_route (p_mr_route_id);
2273       FETCH c_route INTO c_route_rec;
2274 
2275       IF c_route%FOUND THEN
2276          CLOSE c_route;
2277 
2278          IF (l_log_statement >= l_log_current_level) THEN
2279             fnd_log.string(l_log_statement,
2280                            L_DEBUG_KEY,
2281                            'Checking Route Start and End Dates');
2282          END IF;
2283 
2284          IF TRUNC(c_route_rec.start_date_active) > p_start_date_time THEN
2285 
2286             Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_TSK_STDT_ROUT_STDT');
2287             Fnd_Message.Set_Token('TASK_NUMBER', p_visit_task_number);
2288             Fnd_Msg_Pub.ADD;
2289 
2290          END IF;
2291 
2292          IF TRUNC(c_route_rec.end_date_active) IS NOT NULL THEN
2293             IF TRUNC(c_route_rec.end_date_active) < p_end_date_time THEN
2294 
2295                Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_TSK_ENDT_ROUT_ENDT');
2296                Fnd_Message.Set_Token('TASK_NUMBER', p_visit_task_number);
2297                Fnd_Msg_Pub.ADD;
2298 
2299             END IF;
2300          END IF;
2301 
2302       ELSE  -- Else of c_route%FOUND check
2303 
2304          CLOSE c_route;
2305 
2306          Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_TSK_NO_ROUTE');
2307          Fnd_Message.Set_Token('TASK_NUMBER', p_visit_task_number);
2308          Fnd_Msg_Pub.ADD;
2309 
2310       END IF; -- End of c_route%FOUND check
2311 
2312      -- If the tasks associated to MR Route Id have an expired MR Id
2313      -- then it cannot be pushed into Production Planning.
2314      OPEN c_mr_header (p_mr_route_id);
2315      FETCH c_mr_header INTO c_mr_header_rec;
2316 
2317      IF c_mr_header%FOUND THEN
2318         CLOSE c_mr_header;
2319 
2320         IF (l_log_statement >= l_log_current_level) THEN
2321            fnd_log.string(l_log_statement,
2322                           L_DEBUG_KEY,
2323                           'Checking MR Start and End Dates');
2324         END IF;
2325 
2326         IF TRUNC(c_mr_header_rec.effective_from) > p_start_date_time THEN
2327            Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_NO_TS_SD_LT_MR');
2328            Fnd_Message.Set_Token('TASK_NUMBER', p_visit_task_number);
2329            Fnd_Msg_Pub.ADD;
2330 
2331         END IF;
2332         IF TRUNC(c_mr_header_rec.effective_to) IS NOT NULL THEN
2333            IF TRUNC(c_mr_header_rec.effective_to) < p_end_date_time THEN
2334 
2335               Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_NO_TS_ED_GT_MR');
2336               Fnd_Message.Set_Token('TASK_NUMBER', p_visit_task_number);
2337               Fnd_Msg_Pub.ADD;
2338 
2339            END IF;
2340         END IF;
2341 
2342      ELSE -- Else for c_mr_header%FOUND check
2343        CLOSE c_mr_header;
2344 
2345        Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_NO_MR_ID');
2346        Fnd_Message.Set_Token('TASK_NUMBER', p_visit_task_number);
2347        Fnd_Msg_Pub.ADD;
2348 
2349       END IF; -- End of c_mr_header%FOUND check
2350    END IF; -- End of p_mr_route_id IS NOT NULL check
2351 
2352    ---------------------------End of API Body---------------------------------------
2353    IF (l_log_procedure >= l_log_current_level) THEN
2354       fnd_log.string(l_log_procedure,
2355                      L_DEBUG_KEY ||'.end',
2356                      'At the end of PL SQL procedure.');
2357    END IF;
2358 
2359 END Validate_MR_Route_Date;
2360 
2361 --------------------------------------------------------------------
2362 -- PROCEDURE
2363 --    Validate_Before_Production
2364 --
2365 -- PURPOSE
2366 --    To validate Visit and all its Tasks before the push to production
2367 --------------------------------------------------------------------
2368 PROCEDURE Validate_Before_Production
2369   (
2370    p_api_version       IN         NUMBER,
2371    p_init_msg_list     IN         VARCHAR2  := Fnd_Api.g_false,
2372    p_commit            IN         VARCHAR2  := Fnd_Api.g_false,
2373    p_validation_level  IN         NUMBER    := Fnd_Api.g_valid_level_full,
2374    p_module_type       IN         VARCHAR2  := 'JSP',
2375    p_visit_id          IN         NUMBER,
2376 
2377    x_error_tbl         OUT NOCOPY Error_Tbl_Type,
2378    x_return_status     OUT NOCOPY VARCHAR2,
2379    x_msg_count         OUT NOCOPY NUMBER,
2380    x_msg_data          OUT NOCOPY VARCHAR2
2381  )
2382 IS
2383    L_API_VERSION  CONSTANT NUMBER := 1.0;
2384    L_API_NAME     CONSTANT VARCHAR2(30) := 'Validate_Before_Production';
2385    --part-chgER - sowsubra
2386    L_DEBUG_KEY    CONSTANT VARCHAR2(90) := 'ahl.plsql.'||G_PKG_NAME||'.'||L_API_NAME;
2387    l_dept_Tbl              Dept_Tbl_Type;
2388    l_error_tbl             Error_Tbl_Type;
2389    l_visit_end_time        DATE;
2390    -- l_flag               VARCHAR2(1):= 'N';
2391    l_return_status         VARCHAR2(1);
2392    l_chk_flag              VARCHAR2(1);
2393    l_check_flag            VARCHAR2(1);
2394    l_proj_task_flag        VARCHAR2(1);
2395    -- Post 11.5.10
2396    -- RROY
2397    l_hierarchy_flag        VARCHAR2(1);
2398    l_job_released_flag     VARCHAR2(1);
2399    l_task_invalid_flag     VARCHAR2(1);
2400    -- RROY
2401    l_default               VARCHAR2(30);
2402    l_temp                  VARCHAR2(2000);
2403    l_msg_data              VARCHAR2(2000);
2404    l_plan_end_hour         NUMBER;
2405    -- Post 11.5.10
2406    -- RROY
2407    l_start_from_hour       NUMBER;
2408    l_visit_task_id         NUMBER;
2409    -- RROY
2410    l_end_hour              NUMBER;
2411    l_visit_task_id         NUMBER;
2412    l_count                 NUMBER;
2413    l_msg_count             NUMBER :=0;
2414    l_data                  VARCHAR2(2000);
2415    l_count1                NUMBER;
2416    l_count2                NUMBER;
2417    i                       NUMBER:=0;
2418    j                       NUMBER:=0;
2419    x                       NUMBER:=0;
2420    l_dept_flag             VARCHAR2(1):= 'N';
2421    l_dept                  NUMBER;
2422    l_dummy_i               NUMBER;
2423 
2424    -- To find visit related information
2425    -- Added where condition for checking DELETED status in 11.5.10
2426    CURSOR c_visit (x_id IN NUMBER) IS
2427     SELECT * FROM AHL_VISITS_VL
2428     WHERE VISIT_ID = x_id
2429     AND NVL(STATUS_CODE,'X') <> 'DELETED';
2430    c_visit_rec c_visit%ROWTYPE;
2431 
2432    -- To find visit dept has any dept shifts
2433     CURSOR c_dept (x_id IN NUMBER) IS
2434     SELECT COUNT(*) FROM AHL_DEPARTMENT_SHIFTS
2435     WHERE DEPARTMENT_ID = x_id;
2436 
2437 /* Begin Changes by Shkalyan */
2438      -- To find count for tasks for visit
2439      -- Added where condition for checking DELETED status in 11.5.10
2440    CURSOR c_task_count (x_id IN NUMBER) IS
2441     SELECT count(*) FROM AHL_VISIT_TASKS_VL
2442     WHERE VISIT_ID = x_id
2443     AND NVL(STATUS_CODE,'X') <> 'DELETED'
2444     AND (TASK_TYPE_CODE <> 'SUMMARY' OR
2445           (TASK_TYPE_CODE = 'SUMMARY' AND
2446             MR_ID IS NOT NULL));
2447 /* End Changes by Shkalyan */
2448 
2449 /* Begin Changes by Shkalyan */
2450     -- To find task related information
2451     -- Added where condition for checking DELETED status in 11.5.10
2452    CURSOR c_task (x_visit_id IN NUMBER) IS
2453     SELECT * FROM AHL_VISIT_TASKS_VL
2454     WHERE VISIT_ID = x_visit_id
2455          AND NVL(STATUS_CODE,'X') not in ('DELETED','RELEASED')
2456     AND (TASK_TYPE_CODE <> 'SUMMARY' OR
2457           (TASK_TYPE_CODE = 'SUMMARY' AND
2458             MR_ID IS NOT NULL));
2459 /* End Changes by Shkalyan */
2460    c_task_rec c_task%ROWTYPE;
2461 
2462   -- VWP11.5.10 Enhancements
2463   -- To find whether any visit which is in a primaryplan has any simulation plans
2464    CURSOR c_simulation (x_id IN NUMBER) IS
2465     SELECT COUNT(*) FROM AHL_SIMULATION_PLANS_VL
2466     WHERE SIMULATION_PLAN_ID = x_id
2467     AND PRIMARY_PLAN_FLAG = 'Y';
2468 
2469 -- AnRaj: Following two cursors have been changed due to  performnace issues
2470 -- Bug Number 4919291
2471   -- To find MR header related information
2472  /*  CURSOR c_mr_header (x_id IN NUMBER) IS
2473       SELECT T1.* FROM AHL_MR_HEADERS_APP_V T1, AHL_MR_ROUTES_V T2
2474         WHERE T1.MR_HEADER_ID = T2.MR_HEADER_ID
2475         AND T2.MR_ROUTE_ID = x_id;
2476 */
2477 
2478 -- yazhou 02-Jun-2006 starts
2479 -- bug fix#5209826
2480 /*
2481   CURSOR c_mr_header (x_id IN NUMBER) IS
2482     SELECT   T1.EFFECTIVE_FROM,T1.EFFECTIVE_TO
2483     FROM     AHL_MR_HEADERS_APP_V T1, AHL_MR_ROUTES_V T2
2484     WHERE    T1.MR_HEADER_ID = T2.MR_HEADER_ID
2485     AND      T2.MR_ROUTE_ID = x_id;
2486 */
2487   CURSOR c_mr_header (x_id IN NUMBER) IS
2488      SELECT T1.EFFECTIVE_FROM,T1.EFFECTIVE_TO
2489      FROM ahl_mr_headers_app_v T1, AHL_MR_ROUTES_V T2
2490      WHERE T1.mr_status_code = 'COMPLETE' AND
2491            trunc(T1.effective_from) <= trunc(sysdate) AND
2492            trunc(nvl(T1.effective_to,sysdate)) >= trunc(sysdate) AND
2493            T2.MR_ROUTE_ID = x_id  AND
2494            T1.MR_HEADER_ID = T2.MR_HEADER_ID AND
2495            T1.version_number = (select max(version_number)
2496                              from ahl_mr_headers_app_v mr1
2497                              where mr1.title = T1.title
2498                              and mr1.mr_status_code = 'COMPLETE'
2499                              and trunc(effective_from) <= trunc(sysdate) AND
2500                              trunc(nvl(effective_to,sysdate)) >= trunc(sysdate));
2501 
2502 -- yazhou 02-Jun-2006 ends
2503 
2504    c_mr_header_rec c_mr_header%ROWTYPE;
2505 
2506   -- To find route related information
2507   /* CURSOR c_route (x_id IN NUMBER) IS
2508       SELECT T1.* FROM AHL_ROUTES_APP_V T1, AHL_MR_ROUTES_V T2
2509         WHERE T1.ROUTE_ID = T2.ROUTE_ID
2510         AND T2.MR_ROUTE_ID = x_id
2511         AND T1.REVISION_STATUS_CODE = 'COMPLETE';
2512   */
2513   CURSOR c_route (x_id IN NUMBER) IS
2514     SELECT   T1.START_DATE_ACTIVE,T1.END_DATE_ACTIVE
2515     FROM     AHL_ROUTES_APP_V T1, AHL_MR_ROUTES_V T2
2516     WHERE    T1.ROUTE_ID = T2.ROUTE_ID
2517     AND      T2.MR_ROUTE_ID = x_id
2518     AND      T1.REVISION_STATUS_CODE = 'COMPLETE';
2519    c_route_rec c_route%ROWTYPE;
2520   -- End of Fix for 4919291
2521 
2522   -- To find only those routes which are there in tasks table but not in route table for a visit
2523   -- Added where condition for checking DELETED status in 11.5.10
2524     CURSOR c_route_chk (x_id IN NUMBER) IS
2525      SELECT VT.MR_ROUTE_ID
2526      FROM AHL_VISIT_TASKS_B VT
2527      WHERE VT.VISIT_ID = x_id
2528            AND NVL(STATUS_CODE,'X') not in ('DELETED','RELEASED')
2529        AND VT.MR_Route_ID IS NOT NULL
2530        AND NOT EXISTS (
2531        SELECT 1
2532         FROM AHL_MR_ROUTES T1, AHL_ROUTES_APP_V T2, AHL_MR_HEADERS_APP_V B
2533         WHERE T1.MR_ROUTE_ID = VT.MR_ROUTE_ID
2534           AND T1.MR_HEADER_ID = B.MR_HEADER_ID
2535           AND T1.ROUTE_ID = T2.ROUTE_ID
2536           AND T2.REVISION_STATUS_CODE = 'COMPLETE');
2537     c_route_chk_rec c_route_chk%ROWTYPE;
2538 
2539  -- To find visit task id for the non-summary tasks which have no MR Routes
2540  -- Added where condition for checking DELETED status in 11.5.10
2541     CURSOR c_route_tsk (x_id IN NUMBER) IS
2542        SELECT VISIT_TASK_ID, VISIT_TASK_NUMBER FROM AHL_VISIT_TASKS_B
2543            WHERE VISIT_ID = x_id
2544                        AND NVL(STATUS_CODE,'X') not in ('DELETED','RELEASED')
2545            AND MR_Route_ID IS NULL
2546            AND TASK_TYPE_CODE <> 'SUMMARY';
2547 
2548 /* commented out for bug fix 4081044
2549  yazhou 03-Jan-2005
2550  -- To find count for Item and MR Header ID
2551    CURSOR c_check (x_item_id IN NUMBER, x_mr_route_id IN NUMBER) IS
2552       SELECT count(*) FROM Ahl_MR_Items_V T1, AHL_MR_ROUTES_APP_V T2
2553          WHERE T1.Inventory_Item_ID = x_item_id
2554          AND T1.MR_HEADER_ID = T2.MR_HEADER_ID
2555          AND MR_ROUTE_ID = x_mr_route_id;
2556 */
2557 
2558  -- To find all departments from a visit's tasks table
2559  -- Added where condition for checking DELETED status in 11.5.10
2560    CURSOR c_dept_task (x_id IN NUMBER) IS
2561     SELECT DEPARTMENT_ID FROM AHL_VISIT_TASKS_B
2562       WHERE VISIT_ID = x_id
2563             AND NVL(STATUS_CODE,'X') not in ('DELETED','RELEASED')
2564     AND DEPARTMENT_ID IS NOT NULL;
2565     c_dept_task_rec c_dept_task%ROWTYPE;
2566 
2567  -- To find all departments from a visit's tasks table
2568  -- Added where condition for checking DELETED status in 11.5.10
2569    CURSOR c_dept_tsk (x_id IN NUMBER) IS
2570     SELECT DEPARTMENT_ID, VISIT_TASK_NUMBER FROM AHL_VISIT_TASKS_B
2571      WHERE VISIT_ID = x_id
2572           AND NVL(STATUS_CODE,'X') not in ('DELETED','RELEASED')
2573     AND DEPARTMENT_ID IS NOT NULL;
2574     c_dept_tsk_rec c_dept_tsk%ROWTYPE;
2575 
2576     /*sowsubra - part-chgER - 18 July, 2007 - start*/
2577    CURSOR c_get_inst_item (c_instance_id IN NUMBER) IS
2578     SELECT INVENTORY_ITEM_ID, INSTANCE_NUMBER FROM CSI_ITEM_INSTANCES
2579     WHERE  instance_id = c_instance_id;
2580 
2581    c_inst_item_rec    c_get_inst_item%ROWTYPE;
2582    /*sowsubra - part-chgER - end*/
2583 
2584  -- To find out if the item instances associated to a visit or task is still active
2585  -- CURSOR c_serial (p_serial_id IN NUMBER, p_item_id IN NUMBER, p_org_id IN NUMBER) IS
2586  -- part-chgER - changed the name of the cusror.
2587   CURSOR c_instance (c_instance_id IN NUMBER, c_item_id IN NUMBER, c_org_id IN NUMBER) IS
2588     SELECT count(*)FROM CSI_ITEM_INSTANCES
2589       WHERE Instance_Id  = c_instance_id
2590     AND Inventory_Item_Id = c_item_id
2591     AND Inv_Master_Organization_Id = c_org_id
2592     AND ACTIVE_START_DATE <= sysdate
2593     AND (ACTIVE_END_DATE >= sysdate OR ACTIVE_END_DATE IS NULL);
2594 
2595 -- RROY
2596 
2597  -- bug fix 4077103 -yazhou
2598  -- To check the current status of the Unit
2599    CURSOR c_uc_status (p_instance_id IN NUMBER) IS
2600     SELECT name, AHL_UTIL_UC_PKG.GET_UC_STATUS_CODE(UNIT_CONFIG_HEADER_ID) uc_status
2601     FROM  ahl_unit_config_headers uc,
2602           csi_item_instances csis
2603     WHERE uc.csi_item_instance_id=csis.instance_id
2604     AND (uc.active_end_date IS NULL OR uc.active_end_date > SYSDATE)
2605     AND csis.instance_id = p_instance_id;
2606 
2607     c_uc_status_rec c_uc_status%ROWTYPE;
2608 
2609 BEGIN
2610    --------------------- initialize -----------------------
2611    SAVEPOINT Validate_Before_Production;
2612 
2613    IF (l_log_procedure >= l_log_current_level) THEN
2614       fnd_log.string(l_log_procedure,
2615                      L_DEBUG_KEY ||'.begin',
2616                      'At the start of PL SQL procedure. Visit Id = ' || p_visit_id);
2617    END IF;
2618 
2619    -- Initialize message list if p_init_msg_list is set to TRUE.
2620    IF Fnd_Api.to_boolean(p_init_msg_list) THEN
2621       Fnd_Msg_Pub.initialize;
2622    END IF;
2623 
2624    --  Initialize API return status to success
2625    x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
2626 
2627    -- Standard call to check for call compatibility.
2628    IF NOT Fnd_Api.COMPATIBLE_API_CALL(l_api_version,
2629                                       p_api_version,
2630                                       l_api_name,G_PKG_NAME) THEN
2631       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2632    END IF;
2633 
2634    OPEN c_visit (p_visit_id);
2635    FETCH c_visit INTO c_visit_rec;
2636    CLOSE c_visit;
2637 
2638    -- To check if the unit is quarantined
2639    -- AnRaj added for R 12.0 ACL changes in VWP, Start
2640    check_unit_quarantined(p_visit_id,c_visit_rec.Item_Instance_Id);
2641    -- AnRaj added for R 12.0 ACL changes in VWP, End
2642    IF c_visit_rec.TEMPLATE_FLAG = 'N' THEN
2643    -- To check visit's start date is not null
2644       IF c_visit_rec.START_DATE_TIME IS NULL THEN
2645          IF (l_log_statement >= l_log_current_level) THEN
2646             fnd_log.string(l_log_statement,
2647                            L_DEBUG_KEY,
2648                            'Visit Start Date is null.');
2649          END IF;
2650          -- By shbhanda 05/21/04 for TC changes
2651          Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_NO_ST_DATE');
2652          Fnd_Message.Set_Token('VISIT_NUMBER', c_visit_rec.VISIT_NUMBER);
2653          Fnd_Msg_Pub.ADD;
2654       END IF;
2655 
2656      -- To check visit's status is not null and it should be only planning or partially released
2657      IF c_visit_rec.STATUS_CODE IS NOT NULL THEN
2658         IF c_visit_rec.STATUS_CODE <> 'PLANNING' and c_visit_rec.STATUS_CODE <> 'PARTIALLY RELEASED' THEN
2659            IF (l_log_statement >= l_log_current_level) THEN
2660               fnd_log.string(l_log_statement,
2661                              L_DEBUG_KEY,
2662                              'Visit Status Code is not Planning/Partially Released.');
2663            END IF;
2664            Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_NOT_PLANNING'); -- **** IMPortant uPDATE FOR PARTIALLY RELEASED
2665            Fnd_Message.Set_Token('VISIT_NUMBER', c_visit_rec.VISIT_NUMBER);
2666            Fnd_Msg_Pub.ADD;
2667            /* l_temp := 'ERROR: Visit Number ' || c_visit_rec.VISIT_NUMBER || ' : Status Code is not Planning or Partially Released' ;
2668            l_error_tbl(j).Msg_Index := j;
2669            l_error_tbl(j).Msg_Data  := l_temp;
2670            j := j + 1;*/
2671 
2672            -- POst 11.5.10 Changes by Senthil.
2673         ELSIF TRUNC(c_visit_rec.start_date_time) < TRUNC(SYSDATE) AND c_visit_rec.STATUS_CODE <> 'PARTIALLY RELEASED'
2674         THEN
2675            IF (l_log_statement >= l_log_current_level) THEN
2676               fnd_log.string(l_log_statement,
2677                              L_DEBUG_KEY,
2678                              'Visit Status Code is Planning and Visit Start Date is less than sysdate. ');
2679            END IF;
2680            Fnd_Message.SET_NAME('AHL','AHL_VWP_START_DATE_LT_SYS');
2681            Fnd_Message.Set_Token('VISIT_NUMBER', c_visit_rec.VISIT_NUMBER);
2682            Fnd_Msg_Pub.ADD;
2683            /* l_error_tbl(j).Msg_Index := j;
2684            l_error_tbl(j).Msg_Data  := REPLACE(FND_MESSAGE.GET_STRING(APPIN => 'AHL',
2685            NAMEIN => 'AHL_VWP_START_DATE_LT_SYS')
2686            ,'VISIT_NUMBER',c_visit_rec.VISIT_NUMBER);
2687            j := j + 1; */
2688         END IF;
2689      -- visit's status is null
2690      ELSE
2691         IF (l_log_statement >= l_log_current_level) THEN
2692            fnd_log.string(l_log_statement,
2693                           L_DEBUG_KEY,
2694                           'Visit Status Code is null.');
2695         END IF;
2696         Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_NO_STATUS');
2697         Fnd_Message.Set_Token('VISIT_NUMBER', c_visit_rec.VISIT_NUMBER);
2698         Fnd_Msg_Pub.ADD;
2699 
2700         /*l_temp := 'ERROR: Visit Number ' || c_visit_rec.VISIT_NUMBER || ' : Status Code Missing' ;
2701         l_error_tbl(j).Msg_Index := j;
2702         l_error_tbl(j).Msg_Data  := l_temp;
2703         j := j + 1; */
2704      END IF;
2705 
2706      -- To check visit's organization is not null
2707      IF c_visit_rec.ORGANIZATION_ID IS NULL THEN
2708         IF (l_log_statement >= l_log_current_level) THEN
2709            fnd_log.string(l_log_statement,
2710                           L_DEBUG_KEY,
2711                           'Visit Organization is null.');
2712         END IF;
2713 
2714         Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_NO_ORG');
2715         Fnd_Message.Set_Token('VISIT_NUMBER', c_visit_rec.VISIT_NUMBER);
2716         Fnd_Msg_Pub.ADD;
2717 
2718         /* l_temp := 'ERROR: Visit Number ' || c_visit_rec.VISIT_NUMBER || ' : Organization Missing' ;
2719         l_error_tbl(j).Msg_Index := j;
2720         l_error_tbl(j).Msg_Data  := l_temp;
2721         j := j + 1; */
2722      END IF;
2723 
2724      -- To check visit's department is not null
2725      IF c_visit_rec.DEPARTMENT_ID IS NULL THEN
2726         IF (l_log_statement >= l_log_current_level) THEN
2727            fnd_log.string(l_log_statement,
2728                           L_DEBUG_KEY,
2729                           'Visit Department is null.');
2730         END IF;
2731 
2732         Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_NO_DEPT');
2733         Fnd_Message.Set_Token('VISIT_NUMBER', c_visit_rec.VISIT_NUMBER);
2734         Fnd_Msg_Pub.ADD;
2735 
2736         /* l_temp := 'ERROR: Visit Number ' || c_visit_rec.VISIT_NUMBER || ' : Department Missing';
2737         l_error_tbl(j).Msg_Index := j;
2738         l_error_tbl(j).Msg_Data  := l_temp;
2739         j := j + 1; */
2740      END IF;
2741 
2742      -- Start by shbhanda on 29-Jan-04
2743      -- To check visit's close date time i.e planned end date is not null
2744      IF c_visit_rec.CLOSE_DATE_TIME IS NULL THEN
2745         IF (l_log_statement >= l_log_current_level) THEN
2746            fnd_log.string(l_log_statement,
2747                           L_DEBUG_KEY,
2748                           'Visit Plan End Date is null.');
2749         END IF;
2750 
2751         Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_NO_PLN_END_DT');
2752         Fnd_Message.Set_Token('VISIT_NUMBER', c_visit_rec.VISIT_NUMBER);
2753         Fnd_Msg_Pub.ADD;
2754 
2755         /* l_temp := 'ERROR: Visit Number ' || c_visit_rec.VISIT_NUMBER || ' : Planned end date missing' ;
2756         l_error_tbl(j).Msg_Index := j;
2757         l_error_tbl(j).Msg_Data  := l_temp;
2758         j := j + 1; */
2759      END IF;
2760      -- End by shbhanda on 29-Jan-04
2761 
2762      -- To check visit's simulation plan lies in primary plan
2763      IF c_visit_rec.SIMULATION_PLAN_ID IS NOT NULL THEN
2764         OPEN c_simulation (c_visit_rec.SIMULATION_PLAN_ID);
2765         FETCH c_simulation INTO l_count;
2766         CLOSE c_simulation;
2767         IF l_count = 0 THEN
2768            IF (l_log_statement >= l_log_current_level) THEN
2769               fnd_log.string(l_log_statement,
2770                              L_DEBUG_KEY,
2771                              'Visit has 0 Simulations.');
2772            END IF;
2773 
2774            Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_NO_PRIM_PLAN');
2775            Fnd_Message.Set_Token('VISIT_NUMBER', c_visit_rec.VISIT_NUMBER);
2776            Fnd_Msg_Pub.ADD;
2777         END IF;
2778      END IF;
2779 
2780      --sowsubra FP:Bug#5758829
2781      /*When the visit type code is not null, then validate the type code to see if
2782      the visit type is enabled and not end-dated.*/
2783      IF c_visit_rec.visit_type_code IS NOT NULL THEN
2784         IF (l_log_statement >= l_log_current_level) THEN
2785            fnd_log.string(l_log_statement,
2786                           L_DEBUG_KEY,
2787                           'Before calling AHL_VWP_RULES_PVT.CHECK_LOOKUP_NAME_OR_ID.');
2788         END IF;
2789 
2790         AHL_VWP_RULES_PVT.CHECK_LOOKUP_NAME_OR_ID (
2791              p_lookup_type  => 'AHL_PLANNING_VISIT_TYPE',
2792              p_lookup_code  => trim(c_visit_rec.visit_type_code),
2793              p_meaning      => NULL,
2794              p_check_id_flag => 'Y',
2795              x_lookup_code   => c_visit_rec.visit_type_code,
2796              x_return_status => l_return_status);
2797 
2798         IF (l_log_statement >= l_log_current_level) THEN
2799            fnd_log.string(l_log_statement,
2800                           L_DEBUG_KEY,
2801                           'After calling AHL_VWP_RULES_PVT.CHECK_LOOKUP_NAME_OR_ID.');
2802         END IF;
2803 
2804         IF NVL(l_return_status, 'X') <> 'S' THEN
2805            Fnd_Message.SET_NAME('AHL','AHL_VWP_TYPE_CODE_NOT_EXISTS');
2806            Fnd_Msg_Pub.ADD;
2807            RAISE Fnd_Api.G_EXC_ERROR;
2808         END IF;
2809      END IF;
2810 
2811      /*sowsubra - part-chgER - 18 July, 2007- start*/
2812      -- only when unit is associated with the visit then check if the item-instance
2813      IF (c_visit_rec.item_instance_id IS NOT NULL) THEN
2814        OPEN c_get_inst_item(c_visit_rec.item_instance_id);
2815        FETCH c_get_inst_item INTO c_inst_item_rec;
2816        CLOSE c_get_inst_item;
2817 
2818        IF (l_log_statement >= l_log_current_level) THEN
2819           fnd_log.string(l_log_statement,
2820                          L_DEBUG_KEY,
2821                          'Item Id from csi instances = ' || c_inst_item_rec.inventory_item_id);
2822           fnd_log.string(l_log_statement,
2823                          L_DEBUG_KEY,
2824                          'Instance number from csi instances = ' || c_inst_item_rec.instance_number);
2825           fnd_log.string(l_log_statement,
2826                          L_DEBUG_KEY,
2827                          'Visit Item Id = ' || c_visit_rec.Inventory_Item_Id);
2828        END IF;
2829 
2830        IF c_inst_item_rec.inventory_item_id = c_visit_rec.Inventory_Item_Id THEN
2831           /*sowsubra - part-chgER - end*/
2832           -- To check visit must be associated to an Active Item Instance.
2833           -- To find out if the item instances associated to the visit is still active
2834           IF c_visit_rec.Item_Instance_Id IS NOT NULL THEN
2835               OPEN c_instance (c_visit_rec.Item_Instance_Id, c_visit_rec.Inventory_Item_Id, c_visit_rec.Item_Organization_Id);
2836               FETCH c_instance INTO l_count;
2837               CLOSE c_instance;
2838               IF l_count = 0 THEN
2839 
2840                  Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_INST_NO_ACTIVE');
2841                  Fnd_Message.Set_Token('VISIT_NUMBER', c_visit_rec.VISIT_NUMBER);
2842                  Fnd_Msg_Pub.ADD;
2843               END IF;
2844           END IF;
2845           /*sowsubra - part-chgER - 18 July, 2007 - start*/
2846        ELSE
2847          IF (l_log_statement >= l_log_current_level) THEN
2848           fnd_log.string(l_log_statement,
2849                          L_DEBUG_KEY,
2850                          'Instance is no longer associated with this item, please check..');
2851          END IF;
2852          FND_MESSAGE.Set_Name('AHL','AHL_VWP_VST_INST_ITM_CHNGD');
2853          Fnd_Message.Set_Token('INST_NUM', c_inst_item_rec.instance_number);
2854          Fnd_Msg_Pub.ADD;
2855       END IF;
2856       /*sowsubra - part-chgER - end*/
2857    END IF; --c_visit_rec.item_instance_id IS NOT NULL
2858 
2859    -- bug fix 4077103 -yazhou
2860    -- To check visit must be associated to an Active Unit.
2861    -- Also the unit must be in Complete or Incomplete status
2862    IF c_visit_rec.Item_Instance_Id IS NOT NULL THEN
2863        OPEN c_uc_status (c_visit_rec.Item_Instance_Id);
2864        FETCH c_uc_status INTO c_uc_status_rec;
2865        CLOSE c_uc_status;
2866 
2867          IF c_uc_status_rec.uc_status not in ('COMPLETE','INCOMPLETE') THEN
2868 
2869             IF (l_log_statement >= l_log_current_level) THEN
2870                fnd_log.string(l_log_statement,
2871                               L_DEBUG_KEY,
2872                               c_uc_status_rec.name || ' UC status is invalid: '|| c_uc_status_rec.uc_status);
2873             END IF;
2874 
2875             Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_INVALID_UC');
2876             Fnd_Message.Set_Token('VISIT_NUMBER', c_visit_rec.VISIT_NUMBER);
2877             Fnd_Message.Set_Token('UNIT_NAME', c_uc_status_rec.name);
2878             Fnd_Msg_Pub.ADD;
2879          END IF;
2880    END IF;
2881 
2882    -- To check tasks must be associated to Active Item Instances.
2883    -- To find out if the item instances associated to the tasks are still active
2884 
2885    OPEN c_task (p_visit_id);
2886    LOOP
2887       FETCH c_task INTO c_task_rec;
2888       EXIT WHEN c_task%NOTFOUND;
2889 
2890         /*commented out by sowsubra as a visit can be created without a unit, then the tasks
2891         present in the visit should be still validated.*/
2892         --IF c_visit_rec.Item_Instance_Id IS NOT NULL THEN
2893 
2894       /*sowsubra - part-chgER - 18 July, 2007 - start*/
2895       IF (c_task_rec.instance_id IS NOT NULL) THEN
2896          OPEN c_get_inst_item(c_task_rec.instance_id);
2897          FETCH c_get_inst_item INTO c_inst_item_rec;
2898          CLOSE c_get_inst_item;
2899 
2900          IF (l_log_statement >= l_log_current_level) THEN
2901             fnd_log.string(l_log_statement,
2902                            L_DEBUG_KEY,
2903                            'Item Id from csi instances - ' || c_inst_item_rec.inventory_item_id);
2904             fnd_log.string(l_log_statement,
2905                            L_DEBUG_KEY,
2906                            'Visit Item Id - ' || c_task_rec.Inventory_Item_Id);
2907          END IF;
2908 
2909          IF c_inst_item_rec.inventory_item_id = c_task_rec.Inventory_Item_Id THEN
2910             IF c_task_rec.INSTANCE_ID IS NOT NULL THEN
2911                OPEN c_instance (c_task_rec.INSTANCE_ID, c_task_rec.Inventory_Item_Id, c_task_rec.Item_Organization_Id);
2912                FETCH c_instance INTO l_count;
2913                CLOSE c_instance;
2914 
2915                IF l_count = 0 THEN
2916                  Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_TSK_INST_NO_ACTIVE');
2917                  Fnd_Message.Set_Token('TASK_NUMBER', c_task_rec.VISIT_TASK_NUMBER);
2918                  Fnd_Msg_Pub.ADD;
2919                END IF;
2920             END IF;
2921          ELSE
2922             IF (l_log_statement >= l_log_current_level) THEN
2923              fnd_log.string(l_log_statement,
2924                             L_DEBUG_KEY,
2925                             'Instance is no longer associated with this item, please check..');
2926             END IF;
2927             FND_MESSAGE.Set_Name('AHL','AHL_VWP_TSK_INST_ITM_CHNGD');
2928             Fnd_Message.Set_Token('INST_NUM', c_inst_item_rec.instance_number);
2929             Fnd_Message.Set_Token('TASK_NUMBER', c_task_rec.VISIT_TASK_NUMBER);
2930             FND_MSG_PUB.ADD;
2931          END IF;
2932       END IF; -- c_task_rec.instance_id is not null
2933       /*sowsubra - part-chgER - end*/
2934    END LOOP;
2935    CLOSE c_task;
2936    --END IF; -- End for Check Instance Id presence
2937 
2938    -- NR-MR Changes - sowsubra - Begin comment
2939    /* The check for instance_in_config_tree for the visit instance is redundant since
2940      in instance_in_config_tree, the visit instance is compared against itself.*/
2941    /***
2942 
2943    -- To check visit must be associated to an Item Instance.
2944    -- To check all task's serial number are still active
2945    IF c_visit_rec.Item_Instance_Id IS NOT NULL THEN
2946 
2947        --BEGIN: jeli added for bug 3777720
2948        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
2949        --END: jeli added for bug 3777720
2950          Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_INST_NO_FOUND');
2951          Fnd_Message.Set_Token('VISIT_NUMBER',c_visit_rec.VISIT_NUMBER);
2952          Fnd_Msg_Pub.ADD;
2953        END IF;
2954    END IF;
2955 
2956    IF c_visit_rec.Item_Instance_Id IS NOT NULL THEN
2957 
2958        OPEN c_task (p_visit_id);
2959        LOOP
2960        FETCH c_task INTO c_task_rec;
2961           EXIT WHEN c_task%NOTFOUND;
2962          IF c_task_rec.INSTANCE_ID IS NOT NULL THEN
2963 --             IF l_check_flag = 'N' THEN
2964            --BEGIN: jeli added for bug 3777720
2965            IF (AHL_VWP_RULES_PVT.instance_in_config_tree(p_visit_id, c_task_rec.instance_id) = FND_API.G_RET_STS_ERROR) THEN
2966            --END: jeli added for bug 3777720
2967               Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_INST_NO_FOUND');
2968               Fnd_Message.Set_Token('VISIT_NUMBER', c_visit_rec.VISIT_NUMBER);
2969               Fnd_Msg_Pub.ADD;
2970                   END IF;
2971               END IF;
2972            END LOOP;
2973            CLOSE c_task;
2974 
2975 --   Removed for POst 11.5.10 Changes by Senthil.
2976 --     ELSE
2977 --         IF (l_log_statement >= l_log_current_level) THEN
2978 --            fnd_log.string(l_log_statement,
2979 --                          L_DEBUG_KEY,
2980 --                          'Check Visit Serial Number');
2981 --         END IF;
2982 --         l_temp := 'ERROR: Visit Number ' || c_visit_rec.VISIT_NUMBER || ' : Serial Number Missing' ;
2983 --         l_error_tbl(j).Msg_Index := j;
2984 --         l_error_tbl(j).Msg_Data  := l_temp;
2985 --              j := j + 1;
2986 
2987       END IF; -- End for Check Instance Id presence
2988       ***/
2989       -- NR-MR Changes - sowsubra - end comment
2990 
2991       -- To check visit must be associated to a Project ID
2992       -- Check for the proejct id presence in PJM_PROJECT_PARAMETER table
2993       -- Post 11.5.10
2994       -- RROY
2995       /*
2996       IF c_visit_rec.Project_Id IS NOT NULL THEN
2997           OPEN c_Project(c_visit_rec.Project_Id);
2998           FETCH c_Project INTO l_count;
2999           CLOSE c_Project;
3000           IF l_count = 0 THEN
3001               l_temp := 'ERROR: Visit Number ' || c_visit_rec.VISIT_NUMBER || ' :  This project should be included in PJM_PROJECT_PARAMETERS from PA' ;
3002               l_error_tbl(j).Msg_Index := j;
3003               l_error_tbl(j).Msg_Data  := l_temp;
3004               j := j + 1;
3005           END IF;
3006       ELSE
3007           l_temp := 'ERROR: Visit Number ' || c_visit_rec.VISIT_NUMBER || ' : No Project is associated to this Visit' ;
3008           l_error_tbl(j).Msg_Index := j;
3009           l_error_tbl(j).Msg_Data  := l_temp;
3010           j := j + 1;
3011       END IF;
3012       */
3013       -- Post 11.5.10
3014       -- RROY
3015 
3016    -- To check all routes for visit's tasks must exists
3017    IF (l_log_statement >= l_log_current_level) THEN
3018       fnd_log.string(l_log_statement,
3019                      L_DEBUG_KEY,
3020                      'Initially, FLAG = ' || l_chk_flag);
3021    END IF;
3022 
3023    OPEN c_route_chk (p_visit_id);
3024    l_chk_flag := 'N';
3025    LOOP
3026        FETCH c_route_chk INTO c_route_chk_rec;
3027        EXIT WHEN c_route_chk%NOTFOUND;
3028        IF c_route_chk%FOUND THEN
3029          l_chk_flag := 'Y';
3030        END IF;
3031    END LOOP;
3032    CLOSE c_route_chk;
3033 
3034    IF (l_log_statement >= l_log_current_level) THEN
3035       fnd_log.string(l_log_statement,
3036                      L_DEBUG_KEY,
3037                      'After Route Check, FLAG = ' || l_chk_flag);
3038    END IF;
3039 
3040    -- To check visit's department should have dept shifts defined
3041    OPEN c_dept (c_visit_rec.department_id);
3042    FETCH c_dept INTO l_count;
3043    CLOSE c_dept;
3044 
3045    -- To find if the all visit tasks dept has department shifts defined
3046    OPEN c_dept_task (p_visit_id);
3047    i:=0;
3048    LOOP
3049        FETCH c_dept_task INTO c_dept_task_rec;
3050        EXIT WHEN c_dept_task%NOTFOUND;
3051        IF c_dept_task%FOUND THEN
3052           IF (l_log_statement >= l_log_current_level) THEN
3053              fnd_log.string(l_log_statement,
3054                             L_DEBUG_KEY,
3055                             'task dept' || c_dept_task_rec.department_id);
3056           END IF;
3057           OPEN c_dept (c_dept_task_rec.department_id);
3058           FETCH c_dept INTO l_dept;
3059           l_dept_Tbl(i) := l_dept;
3060           IF (l_log_statement >= l_log_current_level) THEN
3061              fnd_log.string(l_log_statement,
3062                             L_DEBUG_KEY,
3063                             'task dept count ' || l_dept);
3064           END IF;
3065           i := i + 1;
3066           CLOSE c_dept;
3067        END IF;
3068    END LOOP;
3069    CLOSE c_dept_task;
3070 
3071    IF (l_log_statement >= l_log_current_level) THEN
3072       fnd_log.string(l_log_statement,
3073                      L_DEBUG_KEY,
3074                      'task dept table count ' || l_dept_Tbl.COUNT);
3075    END IF;
3076 
3077    IF l_dept_Tbl.COUNT > 0 THEN
3078       l_dept_flag := 'N';
3079       x := l_dept_Tbl.FIRST;
3080       LOOP
3081       IF (l_log_statement >= l_log_current_level) THEN
3082          fnd_log.string(l_log_statement,
3083                         L_DEBUG_KEY,
3084                         'task dept table values ' || l_dept_Tbl(x));
3085       END IF;
3086       IF l_dept_Tbl(x) = 0 THEN
3087          l_dept_flag := 'Y';
3088          EXIT WHEN l_dept_flag = 'Y';
3089       END IF;
3090          EXIT WHEN x = l_dept_Tbl.LAST ;
3091          x := l_dept_Tbl.NEXT(x);
3092       END LOOP;
3093    END IF;
3094 
3095       IF (c_visit_rec.START_DATE_TIME IS NOT NULL
3096           AND c_visit_rec.START_DATE_TIME <> Fnd_Api.g_miss_date)
3097           AND (c_visit_rec.DEPARTMENT_ID IS NOT NULL
3098           AND c_visit_rec.DEPARTMENT_ID <> Fnd_Api.g_miss_num)
3099           AND l_count > 0 AND l_chk_flag = 'N' AND l_dept_flag = 'N' THEN
3100 
3101          --The visit end date
3102          l_visit_end_time := AHL_VWP_TIMES_PVT.get_visit_end_time(p_visit_id);
3103 
3104          -- Start by shbhanda on Feb03,2004 for 11.5.10 release--
3105          -- If visit actual end date exceeds planned end date,
3106          -- then an error message will be displayed and the visit cannot be released.
3107 
3108          IF c_visit_rec.close_date_time IS NOT NULL THEN
3109 
3110             IF TRUNC(l_visit_end_time) > TRUNC(c_visit_rec.close_date_time) THEN
3111                IF (l_log_statement >= l_log_current_level) THEN
3112                   fnd_log.string(l_log_statement,
3113                                  L_DEBUG_KEY,
3114                                  'Check visit end time and plan end time');
3115                END IF;
3116                Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_ACTDT_GT_PLNDT');
3117                Fnd_Message.Set_Token('VISIT_NUMBER', c_visit_rec.VISIT_NUMBER);
3118                Fnd_Msg_Pub.ADD;
3119                /* l_temp := 'ERROR: Visit Number ' || c_visit_rec.VISIT_NUMBER || ' : Actual end date exceeds planned end date.' ;
3120                 l_error_tbl(j).Msg_Index := j;
3121                 l_error_tbl(j).Msg_Data  := l_temp;
3122                 j := j + 1; */
3123 
3124             ELSIF TRUNC(l_visit_end_time) = TRUNC(c_visit_rec.close_date_time) THEN
3125 
3126                l_plan_end_hour := TO_NUMBER(TO_CHAR(c_visit_rec.CLOSE_DATE_TIME , 'HH24'));
3127                l_end_hour := TO_NUMBER(TO_CHAR(l_visit_end_time , 'HH24'));
3128 
3129                IF l_end_hour > l_plan_end_hour THEN
3130                   IF (l_log_statement >= l_log_current_level) THEN
3131                      fnd_log.string(l_log_statement,
3132                                     L_DEBUG_KEY,
3133                                     'Check visit end hour and plan end hour');
3134                   END IF;
3135                   -- By shbhanda 08/04/04 for TC changes
3136                   Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_ACTHR_GT_PLNHR');
3137                   Fnd_Message.Set_Token('VISIT_NUMBER', c_visit_rec.VISIT_NUMBER);
3138                   Fnd_Msg_Pub.ADD;
3139                  /* l_temp := 'ERROR: Visit Number ' || c_visit_rec.VISIT_NUMBER || ' : Actual end date hour exceeds planned end date hour.' ;
3140                   l_error_tbl(j).Msg_Index := j;
3141                   l_error_tbl(j).Msg_Data  := l_temp;
3142                   j := j + 1; */
3143                END IF;
3144             END IF;
3145          -- Post 11.5.10 Changes by Senthil.
3146          ELSE
3147             Fnd_Message.SET_NAME('AHL','AHL_VWP_PLN_END_DATE_NULL');
3148             Fnd_Message.Set_Token('VISIT_NUMBER',
3149                             c_visit_rec.VISIT_NUMBER);
3150             Fnd_Msg_Pub.ADD;
3151 
3152          END IF;
3153          -- End by shbhanda on Feb03,2004 for 11.5.10 release--
3154 
3155          -- To find any visit task if Tasks associated to a route/MR, must be associated to the item as set up in FMP
3156          OPEN c_task(p_visit_id);
3157          LOOP
3158          FETCH c_task INTO c_task_rec;
3159          EXIT WHEN c_task%NOTFOUND;
3160 
3161          IF c_task_rec.task_type_code IS NOT NULL THEN
3162             IF UPPER(c_task_rec.task_type_code) = 'PLANNED' THEN
3163                --- Changes made by VSUNDARA for Production - SR Integration
3164                IF c_task_rec.mr_route_id is null THEN
3165 
3166                   /* commented out for bug fix 4081044
3167                   yazhou 03-Jan-2005
3168                   OPEN c_check (c_task_rec.inventory_item_id, c_task_rec.mr_route_id);
3169                   FETCH c_check INTO l_count;
3170                   CLOSE c_check;
3171                    IF l_count = 0 THEN
3172                      Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_NO_ITEM_MR_RT'); --***** change this
3173                      Fnd_Message.Set_Token('VISIT_NUMBER', c_visit_rec.VISIT_NUMBER);
3174                      Fnd_Msg_Pub.ADD;
3175                    END IF;
3176                    ELSE */
3177                   IF c_task_rec.SERVICE_REQUEST_ID is null OR c_task_rec.UNIT_EFFECTIVITY_ID is null THEN
3178                      Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_NO_SR_UE'); --***** change this
3179                      Fnd_Message.Set_Token('VISIT_NUMBER', c_visit_rec.VISIT_NUMBER);
3180                      Fnd_Msg_Pub.ADD;
3181                   END IF; --Added by jeli on 07/26/04 when merging code otherwise it couldn't pass compilation
3182                END IF; --- End Changes made by VSUNDARA for Production - SR Integration
3183             END IF;
3184          END IF;
3185 
3186          IF UPPER(c_task_rec.task_type_code) = 'UNASSOCIATED' AND c_task_rec.DURATION IS NULL THEN
3187 
3188             IF (l_log_statement >= l_log_current_level) THEN
3189                fnd_log.string(l_log_statement,
3190                               L_DEBUG_KEY,
3191                               'Unassociated Task. Task Duration is null');
3192             END IF;
3193             Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_TSK_NO_DURATION');
3194             Fnd_Message.Set_Token('TASK_NUMBER', c_task_rec.VISIT_TASK_NUMBER);
3195             Fnd_Msg_Pub.ADD;
3196          END IF; -- End for c_task_rec.task_type_code check
3197 
3198          -- To find all visit tasks must be associated to an item and item instance.
3199          IF c_task_rec.instance_id IS NULL THEN
3200             IF (l_log_statement >= l_log_current_level) THEN
3201                fnd_log.string(l_log_statement,
3202                               L_DEBUG_KEY,
3203                               'Check Task Serial');
3204             END IF;
3205             Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_TSK_NO_SERIAL');
3206             Fnd_Message.Set_Token('TASK_NUMBER', c_task_rec.VISIT_TASK_NUMBER);
3207             Fnd_Msg_Pub.ADD;
3208          END IF;
3209 
3210          IF c_task_rec.inventory_item_id IS NULL THEN
3211             IF (l_log_statement >= l_log_current_level) THEN
3212                fnd_log.string(l_log_statement,
3213                               L_DEBUG_KEY,
3214                               'Task Inventory Item is null.');
3215             END IF;
3216             Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_TSK_NO_ITEM');
3217             Fnd_Message.Set_Token('TASK_NUMBER', c_task_rec.VISIT_TASK_NUMBER);
3218             Fnd_Msg_Pub.ADD;
3219          END IF;
3220 
3221       -- Begin changes by rnahata for Bug 6448678
3222       IF (l_log_statement >= l_log_current_level) THEN
3223          fnd_log.string(l_log_statement,
3224                         L_DEBUG_KEY,
3225                         'Before calling Validate_MR_Route_Date. l_msg_count = ' || l_msg_count);
3226       END IF;
3227 
3228       Validate_MR_Route_Date(
3229         p_mr_route_id       => c_task_rec.mr_route_id,
3230         p_visit_task_number => c_task_rec.visit_task_number,
3231         p_start_date_time   => sysdate,
3232         p_end_date_time     => sysdate);
3233 
3234       IF (l_log_statement >= l_log_current_level) THEN
3235          fnd_log.string(l_log_statement,
3236                         L_DEBUG_KEY,
3237                         'After calling Validate_MR_Route_Date for Task Id: ' ||
3238                         c_task_rec.visit_task_id || ' and l_msg_count = ' || l_msg_count);
3239       END IF;
3240       -- End changes by rnahata for Bug 6448678
3241 
3242       END LOOP; -- End of loop to check c_task cursor
3243       CLOSE c_task;
3244 
3245    ELSE
3246 
3247       IF l_count = 0 THEN
3248          Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_NO_DEPT_SHIFT');
3249          Fnd_Message.Set_Token('VISIT_NUMBER', c_visit_rec.VISIT_NUMBER);
3250          Fnd_Msg_Pub.ADD;
3251       END IF;
3252 
3253       IF l_chk_flag = 'Y' THEN
3254          Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_RT_EXISTS');
3255          Fnd_Message.Set_Token('VISIT_NUMBER', c_visit_rec.VISIT_NUMBER);
3256          Fnd_Msg_Pub.ADD;
3257       END IF;
3258 
3259       IF l_dept_flag = 'Y' THEN
3260          OPEN c_dept_tsk (p_visit_id);
3261          LOOP
3262             FETCH c_dept_tsk INTO c_dept_tsk_rec;
3263             EXIT WHEN c_dept_tsk%NOTFOUND;
3264             IF c_dept_tsk%FOUND THEN
3265                IF (l_log_statement >= l_log_current_level) THEN
3266                    fnd_log.string(l_log_statement,
3267                            L_DEBUG_KEY,
3268                            'Task Dept' || c_dept_tsk_rec.department_id);
3269                END IF;
3270                OPEN c_dept (c_dept_tsk_rec.department_id);
3271                FETCH c_dept INTO l_dept;
3272                IF l_dept = 0 THEN
3273                   IF (l_log_statement >= l_log_current_level) THEN
3274                      fnd_log.string(l_log_statement,
3275                                     L_DEBUG_KEY,
3276                                     'Task Dept Count ' || l_dept);
3277                   END IF;
3278                   Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_NO_DEPT_SHIFT');
3279                   Fnd_Message.Set_Token('TASK_NUMBER', c_dept_tsk_rec.VISIT_TASK_NUMBER);
3280                   Fnd_Msg_Pub.ADD;
3281                END IF;
3282                CLOSE c_dept;
3283             END IF;
3284          END LOOP;
3285          CLOSE c_dept_tsk;
3286       END IF;
3287    END IF;
3288 
3289       IF c_task_rec.visit_task_id IS NULL AND c_visit_rec.STATUS_CODE = 'PLANNING' THEN
3290 
3291          IF (l_log_statement >= l_log_current_level) THEN
3292             fnd_log.string(l_log_statement,
3293                            L_DEBUG_KEY,
3294                            'No Task Found for the Visit');
3295          END IF;
3296 
3297          Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_TASK_NULL');
3298          Fnd_Message.Set_Token('VISIT_NUMBER', c_visit_rec.VISIT_NUMBER);
3299          Fnd_Msg_Pub.ADD;
3300 
3301       END IF;
3302    END IF;
3303 
3304    l_msg_count := Fnd_Msg_Pub.count_msg;
3305 
3306    IF (l_log_statement >= l_log_current_level) THEN
3307       fnd_log.string(l_log_statement,
3308                      L_DEBUG_KEY,
3309                      'After calling *count_msg* l_count = ' || l_msg_count);
3310       fnd_log.string(l_log_statement,
3311                      L_DEBUG_KEY,
3312                      'Start calling Fnd_Msg_Pub.GET');
3313    END IF;
3314 
3315    j := 1;
3316 
3317    FOR i IN 1..l_msg_count LOOP
3318 
3319         IF (l_log_statement >= l_log_current_level) THEN
3320            fnd_log.string(l_log_statement,
3321                           L_DEBUG_KEY,
3322                           '------------------------------------------------');
3323         END IF;
3324 
3325         FND_MSG_PUB.get (
3326            p_encoded        => FND_API.G_FALSE,
3327            p_data           => l_data,
3328            p_msg_index_out  => l_msg_count);
3329         IF (l_log_statement >= l_log_current_level) THEN
3330            fnd_log.string(l_log_statement,
3331                           L_DEBUG_KEY,
3332                           'Error Message : '||l_data);
3333         END IF;
3334         l_error_tbl(j).Msg_Index := j;
3335         l_error_tbl(j).Msg_Data  := l_data;
3336         j := j + 1;
3337 
3338    END LOOP;
3339    IF (l_log_statement >= l_log_current_level) THEN
3340       fnd_log.string(l_log_statement,
3341                      L_DEBUG_KEY,
3342                      'End calling Fnd_Msg_Pub.GET');
3343    END IF;
3344 
3345 x_error_tbl :=  l_error_tbl;
3346 
3347  -------------------- finish --------------------------
3348   -- END of API body.
3349   -- Standard check of p_commit.
3350 
3351    IF Fnd_Api.To_Boolean (p_commit) THEN
3352       COMMIT WORK;
3353    END IF;
3354 
3355    Fnd_Msg_Pub.count_and_get(
3356          p_encoded => Fnd_Api.g_false,
3357          p_count   => x_msg_count,
3358          p_data    => x_msg_data
3359   );
3360 
3361    IF (l_log_procedure >= l_log_current_level) THEN
3362       fnd_log.string(l_log_procedure,
3363                      L_DEBUG_KEY ||'.end',
3364                      'At the end of PL SQL procedure. Return Status = ' || x_return_status);
3365    END IF;
3366 
3367 EXCEPTION
3368    WHEN Fnd_Api.g_exc_error THEN
3369       ROLLBACK TO Validate_Before_Production;
3370       x_return_status := Fnd_Api.g_ret_sts_error;
3371       Fnd_Msg_Pub.count_and_get (
3372             p_encoded => Fnd_Api.g_false,
3373             p_count   => x_msg_count,
3374             p_data    => x_msg_data
3375      );
3376    WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
3377       ROLLBACK TO Validate_Before_Production;
3378       x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
3379       Fnd_Msg_Pub.count_and_get (
3380             p_encoded => Fnd_Api.g_false,
3381             p_count   => x_msg_count,
3382             p_data    => x_msg_data
3383      );
3384    WHEN OTHERS THEN
3385       ROLLBACK TO Validate_Before_Production;
3386       x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
3387       IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_unexp_error)
3388     THEN
3389          Fnd_Msg_Pub.add_exc_msg (G_PKG_NAME, l_api_name);
3390       END IF;
3391       Fnd_Msg_Pub.count_and_get (
3392             p_encoded => Fnd_Api.g_false,
3393             p_count   => x_msg_count,
3394             p_data    => x_msg_data
3395      );
3396 END Validate_Before_Production;
3397 
3398 --------------------------------------------------------------------
3399 -- PROCEDURE
3400 --    Get_Task_Relationships
3401 --
3402 -- PURPOSE
3403 -- To get all the Relationships for the Visit Task.
3404 --------------------------------------------------------------------
3405 
3406 PROCEDURE Get_Task_Relationships
3407 ( p_visit_id           IN            NUMBER,
3408   p_visit_number       IN            NUMBER,
3409   p_visit_task_id      IN            NUMBER,
3410   p_x_relationship_tbl IN OUT NOCOPY AHL_PRD_WORKORDER_PVT.prd_workorder_rel_tbl
3411 ) IS
3412 
3413 CURSOR get_mwo_wip_entity_id(x_visit_id IN NUMBER) IS
3414  SELECT wip_entity_id
3415  FROM AHL_WORKORDERS
3416 WHERE visit_id = x_visit_id
3417   AND VISIT_TASK_ID IS NULL
3418   AND MASTER_WORKORDER_FLAG = 'Y';
3419 
3420 CURSOR get_task_dtls(c_visit_task_id IN NUMBER) IS
3421  SELECT visit_task_number, task_type_code, SERVICE_REQUEST_ID, MR_ID, originating_task_id
3422  FROM AHL_VISIT_TASKS_B
3423  WHERE visit_task_id = c_visit_task_id;
3424 
3425 -- Get all the Parent Task Records For the Visit Task
3426 CURSOR get_parent_task_dtls(c_visit_task_id NUMBER) IS
3427  SELECT PARENT.visit_task_number, PARENT.visit_task_id
3428  FROM AHL_VISIT_TASKS_B PARENT, AHL_VISIT_TASKS_B CHILD
3429  WHERE PARENT.visit_task_id = CHILD.originating_task_id
3430   AND CHILD.visit_task_id = c_visit_task_id;
3431 
3432 CURSOR does_wo_exist_csr(c_visit_task_id NUMBER) IS
3433  SELECT 1 FROM AHL_WORKORDERS
3434  WHERE VISIT_TASK_ID = c_visit_task_id;
3435 
3436 CURSOR get_wip_entity_id(c_visit_task_id NUMBER) IS
3437  SELECT wip_entity_id FROM AHL_WORKORDERS
3438  WHERE VISIT_TASK_ID = c_visit_task_id;
3439 
3440 L_API_NAME     CONSTANT VARCHAR2(30)  := 'Get_Task_Relationships';
3441 L_DEBUG_KEY    CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
3442 rel_count               NUMBER;
3443 l_task_wip_id           NUMBER := 0;
3444 l_visit_task_no         NUMBER;
3445 l_visit_task_type       VARCHAR2(30);
3446 l_orig_task_id          NUMBER := 0;
3447 l_parent_task_number    NUMBER;
3448 l_parent_visit_task_id  NUMBER;
3449 l_mwo_wip_entity_id     NUMBER;
3450 l_parent_task_wip_id    NUMBER := 0;
3451 l_sr_id                 NUMBER := 0;
3452 l_mr_id                 NUMBER := 0;
3453 
3454 BEGIN
3455 
3456  IF (l_log_procedure >= l_log_current_level) THEN
3457     fnd_log.string(l_log_procedure,
3458                    L_DEBUG_KEY ||'.begin',
3459                    'At the start of PL SQL procedure.');
3460     fnd_log.string(l_log_procedure,
3461                    L_DEBUG_KEY,
3462                    'Visit Id = ' || p_visit_id ||
3463                    ', Visit Number = ' || p_visit_number ||
3464                    ', Visit Task Id = ' || p_visit_task_id);
3465  END IF;
3466 
3467  rel_count := p_x_relationship_tbl.COUNT;
3468 
3469  -- Create relationship only if WO doesn't exist for p_task_id
3470  OPEN does_wo_exist_csr(p_visit_task_id);
3471  FETCH does_wo_exist_csr INTO l_task_wip_id;
3472  IF does_wo_exist_csr%FOUND THEN
3473     CLOSE does_wo_exist_csr;
3474     RETURN;
3475  END IF;
3476  CLOSE does_wo_exist_csr;
3477 
3478  OPEN get_task_dtls(p_visit_task_id);
3479  FETCH get_task_dtls into l_visit_task_no, l_visit_task_type, l_sr_id, l_mr_id, l_orig_task_id;
3480  CLOSE get_task_dtls;
3481 
3482  OPEN  get_parent_task_dtls(p_visit_task_id);
3483  FETCH get_parent_task_dtls INTO l_parent_task_number, l_parent_visit_task_id;
3484  CLOSE get_parent_task_dtls;
3485 
3486  OPEN get_mwo_wip_entity_id(p_visit_id);
3487  FETCH get_mwo_wip_entity_id INTO l_mwo_wip_entity_id;
3488  CLOSE get_mwo_wip_entity_id;
3489 
3490  OPEN get_wip_entity_id(l_parent_visit_task_id);
3491  FETCH get_wip_entity_id INTO l_parent_task_wip_id;
3492  CLOSE get_wip_entity_id;
3493 
3494  IF (l_log_statement >= l_log_current_level) THEN
3495     fnd_log.string(l_log_statement,
3496                    L_DEBUG_KEY,
3497                    'Total Relationships : ' || rel_count);
3498     fnd_log.string(l_log_statement,
3499                    L_DEBUG_KEY,
3500                    'Getting Parent Tasks for task : ' || l_visit_task_no);
3501  END IF;
3502 
3503  rel_count := rel_count + 1;
3504  p_x_relationship_tbl(rel_count).batch_id := p_visit_number;
3505  p_x_relationship_tbl(rel_count).dml_operation := 'C';
3506  p_x_relationship_tbl(rel_count).relationship_type := 1;
3507  p_x_relationship_tbl(rel_count).child_header_id := l_visit_task_no;
3508 
3509  IF (l_orig_task_id IS NOT NULL) THEN
3510        p_x_relationship_tbl(rel_count).parent_wip_entity_id := l_parent_task_wip_id;
3511        p_x_relationship_tbl(rel_count).parent_header_id := l_parent_task_number;
3512  ELSE
3513     -- If the Originating Task is null, make the the Visit's MWO as the parent of this task's WO
3514     p_x_relationship_tbl(rel_count).parent_wip_entity_id := l_mwo_wip_entity_id;
3515     p_x_relationship_tbl(rel_count).parent_header_id := 0;
3516  END IF;
3517 
3518  IF (l_log_statement >= l_log_current_level) THEN
3519     fnd_log.string(l_log_statement,
3520                    L_DEBUG_KEY,
3521                    'Total Relationships : ' || rel_count);
3522     fnd_log.string(l_log_statement,
3523                    L_DEBUG_KEY,
3524                    'All tasks obtained for task : ' || l_visit_task_no);
3525  END IF;
3526 
3527  IF (l_log_procedure >= l_log_current_level) THEN
3528     fnd_log.string(l_log_procedure,
3529                    L_DEBUG_KEY ||'.end',
3530                    'At the end of PL SQL procedure. p_x_relationship_tbl.COUNT = ' ||
3531                    p_x_relationship_tbl.COUNT);
3532  END IF;
3533 
3534 END Get_Task_Relationships;
3535 
3536 --------------------------------------------------------------------
3537 -- PROCEDURE
3538 --    Get_Visit_Relationships
3539 --
3540 -- PURPOSE
3541 -- To get all the Relationships for the Visit. These include :
3542 -- 1.A record for Each MR to MR / Visit Relationship.
3543 -- 2.A record for Each Visit Task to MR Relationship.
3544 -- 3.A record for Each Visit Task to Visit Relationship for Unassociated Tasks.
3545 --------------------------------------------------------------------
3546 
3547 PROCEDURE Get_Visit_Relationships
3548 (
3549   p_visit_id           IN            NUMBER,
3550   p_visit_number       IN            NUMBER,
3551   p_x_relationship_tbl IN OUT NOCOPY AHL_PRD_WORKORDER_PVT.prd_workorder_rel_tbl
3552 )
3553 AS
3554   L_API_VERSION CONSTANT NUMBER        := 1.0;
3555   L_API_NAME    CONSTANT VARCHAR2(30)  := 'Get_Visit_Relationships';
3556   L_DEBUG_KEY   CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
3557   l_wip_entity_id        NUMBER;
3558   l_parent_wip_entity_id NUMBER;
3559   rel_count              NUMBER := 0;
3560   mr_count               NUMBER := 0;
3561 
3562 /*-- Get all the Task Records corresponding to a MR.
3563 CURSOR   get_mrs_for_visit(c_visit_id NUMBER)
3564 IS
3565 SELECT   visit_task_id,
3566          visit_task_number,
3567          NVL(originating_task_id, -1)
3568 FROM     AHL_VISIT_TASKS_B
3569 WHERE    visit_id = c_visit_id
3570 AND      task_type_code='SUMMARY'
3571 AND      mr_id IS NOT NULL
3572 ORDER BY 3;*/
3573 
3574 /* Changes made by VSUNDARA for SR INTEGRATION*/
3575 -- Get all the Task Records corresponding to a MR.
3576 CURSOR get_mrs_for_visit(c_visit_id NUMBER)
3577 IS
3578  SELECT visit_task_id,
3579         visit_task_number,
3580         NVL(originating_task_id, -1)
3581  FROM AHL_VISIT_TASKS_B
3582  WHERE visit_id = c_visit_id
3583   AND task_type_code='SUMMARY'
3584   AND (mr_id IS NOT NULL OR unit_effectivity_id IS NOT NULL)
3585   AND NVL(STATUS_CODE, 'X') <> 'DELETED'
3586   AND NVL(STATUS_CODE, 'X') = 'PLANNING'  --Srini Bug #4075702
3587  ORDER BY 3;
3588 /* End */
3589 
3590 TYPE mr_task_rec_type IS RECORD
3591 (
3592   visit_task_id        NUMBER,
3593   visit_task_number    NUMBER,
3594   originating_task_id  NUMBER
3595 );
3596 
3597 TYPE mr_task_tbl_type IS TABLE OF mr_task_rec_type INDEX BY BINARY_INTEGER;
3598 
3599 l_mrs_for_visit  mr_task_tbl_type;
3600 
3601 -- Get all the Tasks associated to a MR.
3602 CURSOR get_tasks_for_mr(c_visit_id NUMBER, c_mr_task_id NUMBER)
3603 IS
3604 SELECT visit_task_number, visit_task_id
3605 FROM   AHL_VISIT_TASKS_B
3606 WHERE  visit_id = c_visit_id
3607 AND    originating_task_id = c_mr_task_id
3608 AND    task_type_code <> 'SUMMARY'
3609 AND NVL(STATUS_CODE, 'X') = 'PLANNING'  --Srini Bug #4075702
3610 AND NVL(STATUS_CODE, 'X') <> 'DELETED';
3611 
3612 -- Get all the Unassociated Tasks.
3613 CURSOR get_un_associated_tasks(c_visit_id NUMBER)
3614 IS
3615 SELECT visit_task_number, visit_task_id
3616 FROM   AHL_VISIT_TASKS_B
3617 WHERE  visit_id = c_visit_id
3618 AND NVL(STATUS_CODE, 'X') = 'PLANNING'  --Srini Bug #4075702
3619 AND    task_type_code='UNASSOCIATED';
3620 
3621 -- yazhou 27-Jun-2006 starts
3622 -- fix along with bug#5377347, should get the active job for the task only
3623 
3624 CURSOR get_wo(c_visit_task_id NUMBER)
3625 IS
3626 SELECT wip_entity_id
3627 FROM AHL_WORKORDERS
3628 WHERE VISIT_TASK_ID = c_visit_task_id
3629       AND STATUS_CODE NOT IN ('22','7');
3630 
3631 CURSOR get_parent_wo(c_visit_task_id NUMBER)
3632 IS
3633 SELECT wip_entity_id
3634 FROM AHL_WORKORDERS
3635 WHERE VISIT_TASK_ID = c_visit_task_id
3636       AND STATUS_CODE NOT IN ('22','7');
3637 -- yazhou 27-Jun-2006 ends
3638 
3639 CURSOR get_mwo(c_visit_id NUMBER)
3640 IS
3641 SELECT wip_entity_id
3642 FROM AHL_WORKORDERS
3643 WHERE visit_id = c_visit_id
3644 AND VISIT_TASK_ID IS NULL
3645 AND MASTER_WORKORDER_FLAG = 'Y'
3646 AND STATUS_CODE NOT IN ('7', '22');
3647 
3648 BEGIN
3649 
3650   IF (l_log_procedure >= l_log_current_level) THEN
3651    fnd_log.string(l_log_procedure,L_DEBUG_KEY||'.begin','At the start of PLSQL procedure');
3652   END IF;
3653 
3654   rel_count := p_x_relationship_tbl.COUNT;
3655   -- Get all the Task Records corresponding to a MR for the Visit.
3656   OPEN get_mrs_for_visit(p_visit_id);
3657   LOOP
3658      EXIT WHEN get_mrs_for_visit%NOTFOUND;
3659      mr_count := mr_count + 1;
3660      FETCH get_mrs_for_visit
3661      INTO  l_mrs_for_visit(mr_count).visit_task_id,
3662             l_mrs_for_visit(mr_count).visit_task_number,
3663             l_mrs_for_visit(mr_count).originating_task_id;
3664    END LOOP;
3665    CLOSE get_mrs_for_visit;
3666 
3667    IF (l_log_statement >= l_log_current_level) THEN
3668     fnd_log.string(l_log_statement,L_DEBUG_KEY,'Total MRs for Visit : '||l_mrs_for_visit.COUNT);
3669    END IF;
3670 
3671    IF (l_mrs_for_visit.COUNT > 0) THEN
3672       FOR i IN l_mrs_for_visit.FIRST..l_mrs_for_visit.LAST LOOP
3673           -- if the visit task already has a workorder then do not
3674           -- create a relationship for it
3675           OPEN get_wo(l_mrs_for_visit(i).visit_task_id);
3676           FETCH get_wo INTO l_wip_entity_id;
3677           IF get_wo%NOTFOUND THEN
3678              rel_count := rel_count + 1;
3679              p_x_relationship_tbl(rel_count).batch_id := p_visit_number;
3680              p_x_relationship_tbl(rel_count).child_header_id := l_mrs_for_visit(i).visit_task_number;
3681              p_x_relationship_tbl(rel_count).relationship_type := 1;
3682              p_x_relationship_tbl(rel_count).dml_operation := 'C';
3683              -- Loop to Find out Parent MRs
3684              IF (l_mrs_for_visit(i).originating_task_id <> -1) THEN
3685                 FOR j IN l_mrs_for_visit.FIRST..l_mrs_for_visit.LAST LOOP
3686                     IF (l_mrs_for_visit(i).originating_task_id = l_mrs_for_visit(j).visit_task_id) THEN
3687                        p_x_relationship_tbl(rel_count).parent_header_id := l_mrs_for_visit(j).visit_task_number;
3688                        OPEN get_parent_wo(l_mrs_for_visit(j).visit_task_id);
3689                        FETCH get_parent_wo INTO l_parent_wip_entity_id;
3690                        IF get_parent_wo%FOUND THEN
3691                           p_x_relationship_tbl(rel_count).parent_wip_entity_id := l_parent_wip_entity_id;
3692                        END IF;
3693                        CLOSE get_parent_wo;
3694                       EXIT;
3695                     END IF;
3696                 END LOOP;
3697              END IF;
3698              -- If no Parent MR is found set the parent as the Visit
3699              IF (p_x_relationship_tbl(rel_count).parent_header_id IS NULL) THEN
3700                 p_x_relationship_tbl(rel_count).parent_header_id := 0;
3701                 OPEN get_mwo(p_visit_id);
3702                 FETCH get_mwo INTO l_parent_wip_entity_id;
3703                 IF get_mwo%FOUND THEN
3704                    p_x_relationship_tbl(rel_count).parent_wip_entity_id := l_parent_wip_entity_id;
3705                 END IF;
3706                 CLOSE get_mwo;
3707              END IF;
3708           END IF;
3709           CLOSE get_wo;
3710       END LOOP;
3711    END IF;
3712 
3713    IF (l_log_statement >= l_log_current_level) THEN
3714     fnd_log.string(l_log_statement,L_DEBUG_KEY,'Getting Tasks for MRs');
3715    END IF;
3716    -- Get all the Tasks for a MR.
3717    IF (l_mrs_for_visit.COUNT > 0) THEN
3718      FOR i IN l_mrs_for_visit.FIRST..l_mrs_for_visit.LAST LOOP
3719        FOR mr_tasks_cursor IN get_tasks_for_mr(p_visit_id, l_mrs_for_visit(i).visit_task_id) LOOP
3720            OPEN get_wo(mr_tasks_cursor.visit_task_id);
3721            FETCH get_wo INTO l_wip_entity_id;
3722            IF get_wo%NOTFOUND THEN
3723               rel_count := rel_count + 1;
3724               p_x_relationship_tbl(rel_count).batch_id := p_visit_number;
3725               p_x_relationship_tbl(rel_count).parent_header_id := l_mrs_for_visit(i).visit_task_number;
3726               p_x_relationship_tbl(rel_count).child_header_id := mr_tasks_cursor.visit_task_number;
3727               p_x_relationship_tbl(rel_count).relationship_type := 1;
3728               p_x_relationship_tbl(rel_count).dml_operation := 'C';
3729               -- if this visit task is already in shop floor then get the wip_entity_id
3730               OPEN get_parent_wo(l_mrs_for_visit(i).visit_task_id);
3731               FETCH get_parent_wo INTO l_parent_wip_entity_id;
3732               IF get_parent_wo%FOUND THEN
3733                 p_x_relationship_tbl(rel_count).parent_wip_entity_id := l_parent_wip_entity_id;
3734               END IF;
3735               CLOSE get_parent_wo;
3736           END IF;
3737           CLOSE get_wo;
3738        END LOOP;
3739      END LOOP;
3740    END IF;
3741 
3742    IF (l_log_statement >= l_log_current_level) THEN
3743     fnd_log.string(l_log_statement,L_DEBUG_KEY,'Getting Unassociated Tasks for Visit');
3744    END IF;
3745 
3746    -- Get all Un-associated Tasks for a Visit.
3747    OPEN get_mwo(p_visit_id);
3748    FETCH get_mwo INTO l_parent_wip_entity_id;
3749    IF get_mwo%NOTFOUND THEN
3750       l_parent_wip_entity_id := 0;
3751    END IF;
3752    CLOSE get_mwo;
3753 
3754    FOR tsk_cursor IN get_un_associated_tasks(p_visit_id) LOOP
3755        OPEN get_wo(tsk_cursor.visit_task_id);
3756        FETCH get_wo INTO l_wip_entity_id;
3757        IF get_wo%NOTFOUND THEN
3758           rel_count := rel_count + 1;
3759           p_x_relationship_tbl(rel_count).batch_id := p_visit_number;
3760           p_x_relationship_tbl(rel_count).parent_header_id := 0; -- Visit
3761           p_x_relationship_tbl(rel_count).child_header_id := tsk_cursor.visit_task_number;
3762           p_x_relationship_tbl(rel_count).relationship_type := 1;
3763           p_x_relationship_tbl(rel_count).dml_operation := 'C';
3764           p_x_relationship_tbl(rel_count).parent_wip_entity_id := l_parent_wip_entity_id;
3765        END IF;
3766        CLOSE get_wo;
3767    END LOOP;
3768 
3769    IF (l_log_procedure >= l_log_current_level) THEN
3770     fnd_log.string(l_log_procedure,L_DEBUG_KEY,'Total Relationships : ' || p_x_relationship_tbl.COUNT );
3771     fnd_log.string(l_log_procedure,L_DEBUG_KEY||'.end','At the end of PLSQL procedure');
3772    END IF;
3773 
3774 END Get_Visit_Relationships;
3775 
3776 --------------------------------------------------------------------
3777 -- PROCEDURE
3778 --    Get_Task_Dependencies
3779 --
3780 -- PURPOSE
3781 -- To get all the Technical Dependencies for the Visit Task.
3782 --------------------------------------------------------------------
3783 
3784 PROCEDURE Get_Task_Dependencies
3785 (
3786   p_visit_number       IN            NUMBER,
3787   p_visit_task_id      IN            NUMBER,
3788   p_visit_task_number  IN            NUMBER,
3789   p_x_relationship_tbl IN OUT NOCOPY AHL_PRD_WORKORDER_PVT.prd_workorder_rel_tbl
3790 )
3791 AS
3792    L_API_VERSION   CONSTANT NUMBER        := 1.0;
3793    L_API_NAME      CONSTANT VARCHAR2(30)  := 'Get_Task_Dependencies';
3794    L_DEBUG_KEY     CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
3795 
3796 -- Get all the Task Dependencies.
3797 CURSOR get_tech_dependencies(c_visit_task_id NUMBER)
3798 IS
3799  SELECT PARENT.visit_task_number parent_task_number,
3800         CHILD.visit_task_number child_task_number
3801  FROM AHL_VISIT_TASKS_B PARENT,
3802       AHL_VISIT_TASKS_B CHILD,
3803       AHL_TASK_LINKS LINK
3804  WHERE PARENT.visit_task_id = LINK.parent_task_id
3805   AND CHILD.visit_task_id = LINK.visit_task_id
3806   AND NVL(PARENT.STATUS_CODE,'X') = 'PLANNING'
3807   AND NVL(CHILD.STATUS_CODE,'X') = 'PLANNING'
3808   AND (PARENT.visit_task_id = c_visit_task_id
3809        OR  CHILD.visit_task_id = c_visit_task_id);
3810 
3811 l_visit_task_number NUMBER;
3812 rel_count           NUMBER;
3813 dup_found           BOOLEAN;
3814 
3815 BEGIN
3816 
3817    IF (l_log_procedure >= l_log_current_level) THEN
3818       fnd_log.string(l_log_procedure,
3819                  L_DEBUG_KEY ||'.begin',
3820                  'At the start of PL SQL procedure.');
3821       fnd_log.string(l_log_procedure,
3822                  L_DEBUG_KEY,
3823                  'Visit Number = ' || p_visit_number ||
3824                  ', Visit Task Id = ' || p_visit_task_id ||
3825                  ', Visit Task Number = ' || p_visit_task_number);
3826    END IF;
3827 
3828    rel_count := p_x_relationship_tbl.COUNT;
3829 
3830    IF (l_log_statement >= l_log_current_level) THEN
3831       fnd_log.string(l_log_statement,
3832                      L_DEBUG_KEY,
3833                      'Total dependencies = ' || rel_count);
3834    END IF;
3835 
3836    -- Get the Technical Dependencies between Visit Tasks for a Visit.
3837    FOR tsk_cursor IN get_tech_dependencies(p_visit_task_id) LOOP
3838 
3839        dup_found := FALSE;
3840        --Do not insert the row if it already exists in relationship table.
3841        FOR i IN p_x_relationship_tbl.FIRST..p_x_relationship_tbl.LAST LOOP
3842            IF (p_x_relationship_tbl(i).relationship_type = 2 AND
3843                 p_x_relationship_tbl(i).parent_header_id = tsk_cursor.parent_task_number AND
3844                 p_x_relationship_tbl(i).child_header_id = tsk_cursor.child_task_number) THEN
3845              dup_found := TRUE;
3846              EXIT;
3847            END IF;
3848        END LOOP;
3849 
3850        IF (dup_found = FALSE) THEN
3851           rel_count := rel_count + 1;
3852           p_x_relationship_tbl(rel_count).batch_id := p_visit_number;
3853           p_x_relationship_tbl(rel_count).parent_header_id := tsk_cursor.parent_task_number;
3854           p_x_relationship_tbl(rel_count).child_header_id := tsk_cursor.child_task_number;
3855           p_x_relationship_tbl(rel_count).relationship_type := 2;
3856           p_x_relationship_tbl(rel_count).dml_operation := 'C';
3857        END IF;
3858 
3859    END LOOP;
3860 
3861    IF (l_log_procedure >= l_log_current_level ) THEN
3862       fnd_log.string(l_log_procedure,
3863                      L_DEBUG_KEY,
3864                      'Total dependencies for Visit Task ' || p_visit_task_number ||
3865                      'is: '|| rel_count);
3866       fnd_log.string(l_log_procedure,
3867                      L_DEBUG_KEY ||'.end',
3868                      'At the end of PL SQL procedure.');
3869    END IF;
3870 
3871 END Get_Task_Dependencies;
3872 
3873 --------------------------------------------------------------------
3874 -- PROCEDURE
3875 --    Get_Visit_Dependencies
3876 --
3877 -- PURPOSE
3878 -- To get all the Technical Dependencies for the Visit.
3879 --------------------------------------------------------------------
3880 
3881 PROCEDURE Get_Visit_Dependencies
3882 (
3883   p_visit_id           IN            NUMBER,
3884   p_visit_number       IN            NUMBER,
3885   p_x_relationship_tbl IN OUT NOCOPY AHL_PRD_WORKORDER_PVT.prd_workorder_rel_tbl
3886 )
3887 AS
3888   L_API_VERSION  CONSTANT NUMBER        := 1.0;
3889   L_API_NAME     CONSTANT VARCHAR2(30)  := 'Get_Visit_Dependencies';
3890   L_DEBUG_KEY    CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
3891   rel_count               NUMBER;
3892 
3893 -- Get all the Task Dependencies.
3894 CURSOR get_tech_dependencies(c_visit_id NUMBER)
3895 IS
3896 SELECT PARENT.visit_task_number parent_task_number,
3897        CHILD.visit_task_number child_task_number
3898 FROM   AHL_VISIT_TASKS_B PARENT,
3899        AHL_VISIT_TASKS_B CHILD,
3900        AHL_TASK_LINKS LINK
3901 WHERE  PARENT.visit_task_id = LINK.parent_task_id
3902  AND    CHILD.visit_task_id = LINK.visit_task_id
3903  AND    NVL(PARENT.STATUS_CODE,'X') = 'PLANNING' --Srini Bug #4075702
3904  AND    PARENT.visit_id = c_visit_id
3905  AND    CHILD.visit_id = c_visit_id;
3906 
3907 BEGIN
3908 
3909    IF (l_log_procedure >= l_log_current_level) THEN
3910       fnd_log.string(l_log_procedure,
3911                      L_DEBUG_KEY ||'.begin',
3912                      'At the start of PL SQL procedure.');
3913    END IF;
3914 
3915    rel_count := p_x_relationship_tbl.COUNT;
3916 
3917    -- Get the Technical Dependencies between Visit Tasks for a Visit.
3918    FOR tsk_cursor IN get_tech_dependencies(p_visit_id) LOOP
3919      rel_count := rel_count + 1;
3920      p_x_relationship_tbl(rel_count).batch_id := p_visit_number;
3921      p_x_relationship_tbl(rel_count).parent_header_id := tsk_cursor.parent_task_number;
3922      p_x_relationship_tbl(rel_count).child_header_id := tsk_cursor.child_task_number;
3923      p_x_relationship_tbl(rel_count).relationship_type := 2;
3924      p_x_relationship_tbl(rel_count).dml_operation := 'C';
3925    END LOOP;
3926 
3927    IF (l_log_procedure >= l_log_current_level ) THEN
3928       fnd_log.string(l_log_procedure,
3929                      L_DEBUG_KEY,
3930                      'Total Relationships : ' || p_x_relationship_tbl.COUNT);
3931       fnd_log.string(l_log_procedure,
3932                      L_DEBUG_KEY ||'.end',
3933                      'At the end of PL SQL procedure.');
3934    END IF;
3935 
3936 END Get_Visit_Dependencies;
3937 
3938 /* End Changes by Shkalyan */
3939 
3940 --------------------------------------------------------------------
3941 -- PROCEDURE
3942 --    Push_to_Production
3943 --
3944 -- PURPOSE
3945 --    To push visit along with all its tasks to Production for create jobs
3946 --------------------------------------------------------------------
3947 PROCEDURE Push_to_Production
3948 (   p_api_version       IN  NUMBER,
3949     p_init_msg_list     IN  VARCHAR2 := Fnd_Api.g_false,
3950     p_commit            IN  VARCHAR2 := Fnd_Api.g_false,
3951     p_validation_level  IN  NUMBER   := Fnd_Api.g_valid_level_full,
3952     p_module_type       IN  VARCHAR2 := Null,
3953     p_visit_id          IN  NUMBER,
3954     p_release_flag      IN  VARCHAR2 := 'N', -- By shbhanda 05/21/04 for TC changes
3955     p_orig_visit_id     IN  NUMBER   := NULL, -- By yazhou  08/06/04 for TC changes
3956     x_return_status     OUT NOCOPY VARCHAR2,
3957     x_msg_count         OUT NOCOPY NUMBER,
3958     x_msg_data          OUT NOCOPY VARCHAR2
3959 )
3960 IS
3961    L_API_VERSION   CONSTANT NUMBER       := 1.0;
3962    L_API_NAME      CONSTANT VARCHAR2(30) := 'Push_to_Production';
3963    L_DEBUG_KEY     CONSTANT VARCHAR2(100):= 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
3964    l_prd_workorder_tbl  AHL_PRD_WORKORDER_PVT.PRD_WORKORDER_TBL;
3965    /* Begin Changes by Shkalyan */
3966    l_prd_workorder_rel_tbl  AHL_PRD_WORKORDER_PVT.PRD_WORKORDER_REL_TBL;
3967    l_firm_planned_flag    VARCHAR2(1) := FND_PROFILE.value('AHL_PRD_FIRM_PLANNED_FLAG');
3968    l_visit_wo_id          NUMBER;
3969    l_visit_wo_ovn         NUMBER;
3970    l_visit_wo_status      VARCHAR2(30);
3971    l_visit_wo_start_time  DATE;
3972    l_visit_wo_end_time    DATE;
3973    l_orig_visit_status    VARCHAR2(30);
3974    l_orig_task_status     VARCHAR2(30);
3975    l_workorder_id         NUMBER;
3976    l_workorder_ovn        NUMBER;
3977    l_workorder_status     VARCHAR2(30);
3978    /* End Changes by Shkalyan */
3979    l_return_status        VARCHAR2(1);
3980    l_msg_count            NUMBER;
3981    l_msg_data             VARCHAR2(2000);
3982    idx                    NUMBER;
3983    l_count                NUMBER;
3984    l_route_id             NUMBER;
3985    l_commit               VARCHAR2(1) := 'F';
3986    l_visit_end_time       DATE;
3987    l_temp_msg_count       NUMBER:=0; --rnahata
3988    l_init_msg_list        VARCHAR2(1) := 'F';
3989 
3990    -- To find visit related information
3991    CURSOR c_visit (x_id IN NUMBER) IS
3992     SELECT * FROM AHL_VISITS_VL
3993     WHERE VISIT_ID = x_id;
3994 
3995    c_visit_rec c_visit%ROWTYPE;
3996    c_orig_visit_rec c_visit%ROWTYPE;
3997 
3998    /* Begin Changes by VSUNDARA For SR Integration*/
3999    -- To find task related information
4000    CURSOR c_task (x_id IN NUMBER) IS
4001     SELECT * FROM AHL_VISIT_TASKS_VL
4002     WHERE VISIT_ID = x_id
4003      AND NVL(STATUS_CODE, 'X') = 'PLANNING'
4004      AND (TASK_TYPE_CODE <> 'SUMMARY' OR
4005            (TASK_TYPE_CODE = 'SUMMARY' AND
4006              (MR_ID IS NOT NULL OR UNIT_EFFECTIVITY_ID IS NOT NULL)));
4007    /* End */
4008 
4009    c_task_rec c_task%ROWTYPE;
4010    c_orig_task_rec c_task%ROWTYPE;
4011 
4012    /* Begin Changes by Shkalyan */
4013      -- To find count for tasks for visit
4014    CURSOR c_task_ct (x_id IN NUMBER) IS
4015     SELECT count(*) FROM AHL_VISIT_TASKS_VL
4016     WHERE VISIT_ID = x_id
4017      AND NVL(STATUS_CODE, 'X') = 'PLANNING'
4018      AND (TASK_TYPE_CODE <> 'SUMMARY' OR
4019            (TASK_TYPE_CODE = 'SUMMARY' AND
4020              MR_ID IS NOT NULL OR UNIT_EFFECTIVITY_ID IS NOT NULL));
4021    /* End Changes by Shkalyan */
4022 
4023    -- To find Route Id from MR Routes view
4024    CURSOR c_route (x_id IN NUMBER) IS
4025     SELECT Route_Id FROM AHL_MR_ROUTES_V
4026     WHERE MR_ROUTE_ID = x_id;
4027 
4028    /* Begin Changes by Shkalyan */
4029     -- To find job for task
4030    CURSOR c_job (x_id IN NUMBER) IS
4031     SELECT workorder_id, object_version_number, status_code
4032     FROM AHL_WORKORDERS
4033     WHERE VISIT_TASK_ID = x_id
4034      AND STATUS_CODE not in ('22','7'); --(22-Deleted, 7-Cancelled)
4035 
4036    --transit check visit change
4037    --yazhou start
4038    -- To find master workorder for Visit
4039    CURSOR c_visit_job (x_visit_id IN NUMBER) IS
4040     SELECT wo.workorder_id, wo.object_version_number, wo.status_code,
4041           WIP.SCHEDULED_START_DATE,
4042           WIP.SCHEDULED_COMPLETION_DATE
4043     FROM AHL_WORKORDERS WO,
4044          WIP_DISCRETE_JOBS WIP
4045     WHERE wo.VISIT_ID = x_visit_id
4046      AND   wo.VISIT_TASK_ID IS NULL
4047      AND   wo.MASTER_WORKORDER_FLAG = 'Y'
4048      AND   WIP.WIP_ENTITY_ID = WO.WIP_ENTITY_ID
4049      AND   wo.STATUS_CODE not in ('22','7'); --(22-Deleted, 7-Cancelled)
4050 
4051    CURSOR c_visit_wo_status (x_visit_id IN NUMBER) IS
4052     SELECT wo.status_code
4053     FROM AHL_WORKORDERS WO
4054     WHERE wo.VISIT_ID = x_visit_id
4055      AND   wo.VISIT_TASK_ID IS NULL
4056      AND   wo.MASTER_WORKORDER_FLAG = 'Y'
4057      AND   wo.STATUS_CODE not in ('22','7'); --(22-Deleted, 7-Cancelled)
4058 
4059    -- Get workorder status for the coresponding job in originating visit
4060    CURSOR c_wo_status (x_orig_visit_id IN NUMBER, x_visit_task_id IN NUMBER) IS
4061     SELECT wo.status_code
4062     FROM AHL_WORKORDERS WO,
4063          AHL_VISIT_TASKS_B t
4064     WHERE wo.VISIT_ID = x_orig_visit_id
4065      AND   wo.visit_task_id = t.visit_task_id
4066      AND   t.visit_task_number = (Select visit_task_number
4067                                   from ahl_visit_tasks_b
4068                                  where visit_task_id = x_visit_task_id)
4069      AND   wo.STATUS_CODE not in ('22','7'); --(22-Deleted, 7-Cancelled)
4070    -- yazhou end
4071 
4072   /* End Changes by Shkalyan */
4073 
4074    --Post11510. Added to get summary task start, end time
4075    CURSOR get_summary_task_times_csr(x_task_id IN NUMBER)IS
4076          SELECT min(start_date_time), max(end_date_time)
4077       FROM ahl_visit_tasks_vl VST
4078          START WITH visit_task_id  = x_task_id
4079        -- anraj changed coz the nvl on the RHS is not required
4080          -- AND NVL(VST.status_code, 'Y') <> NVL ('DELETED', 'X')
4081        AND NVL(VST.status_code, 'Y') <> 'DELETED'
4082          CONNECT BY originating_task_id = PRIOR visit_task_id;
4083 
4084 -- Added by Jerry on 08/13/2004 per Yan and Alex's request
4085 -- Yan added the condition to filter out summary tasks on 08/31/2005
4086 CURSOR get_independent_tasks(c_visit_id IN NUMBER) IS
4087   select t.visit_task_id
4088     from ahl_visit_tasks_b t,
4089          ahl_visits_b v
4090    where v.visit_id = c_visit_id
4091      and v.visit_id = t.visit_id
4092      and v.status_code = 'PARTIALLY RELEASED'
4093      and t.start_date_time < SYSDATE
4094      and t.status_code ='PLANNING'
4095      and t.task_type_code <>'SUMMARY'
4096      and (not exists (select 1 from ahl_task_links l0
4097                       where l0.parent_task_id = t.visit_task_id
4098                          or l0.visit_task_id = t.visit_task_id)
4099           or t.visit_task_id in (select l1.parent_task_id from ahl_task_links l1
4100                                   where not exists (select l2.visit_task_id from ahl_task_links l2
4101                                                      where l2.visit_task_id = l1.parent_task_id)));
4102 --Modified by Srini Nov08, 2004 to create master workorder not having an asset
4103 
4104 -- anraj: Modified the cursor definition to exclude the tasks in status DELETED
4105 CURSOR get_task_inst_dtls(c_visit_id IN NUMBER)
4106 IS
4107   SELECT inventory_item_id,instance_id
4108   FROM ahl_visit_tasks_vl
4109   WHERE visit_id = c_visit_id
4110   AND NVL(status_code, 'Y') <> 'DELETED'
4111   AND ROWNUM = 1;
4112 get_task_inst_rec  get_task_inst_dtls%ROWTYPE;
4113 
4114 /* Added by rnahata for Bug 6447196 */
4115 CURSOR c_get_vst_status_and_date (c_visit_id IN NUMBER) IS
4116  SELECT status_code, close_date_time
4117  FROM ahl_visits_b
4118  WHERE visit_id = c_visit_id;
4119 get_vst_status_and_date_rec   c_get_vst_status_and_date%ROWTYPE;
4120 
4121 /* Added by rnahata for Bug 5758813
4122    Fetches the route information for updating workorder
4123    description for tasks created from Routes */
4124 CURSOR get_wo_dtls_for_mrtasks_cur (p_task_id IN NUMBER) IS
4125  SELECT ar.route_no||'.'||substr(ar.title,1,(240 - (length(ar.route_no) + 1))) workorder_description
4126  FROM ahl_routes_vl ar,ahl_visit_tasks_b avt, ahl_mr_routes mrr
4127  WHERE avt.visit_task_id = p_task_id
4128   AND nvl(avt.status_code,'Y') = 'PLANNING'
4129   AND avt.mr_route_id = mrr.mr_route_id
4130   AND mrr.route_id = ar.route_id;
4131   get_wo_dtls_for_mrtasks_rec    get_wo_dtls_for_mrtasks_cur%ROWTYPE;
4132 
4133 BEGIN
4134    --------------------- initialize -----------------------
4135 
4136    SAVEPOINT Push_to_Production;
4137    IF (l_log_procedure >= l_log_current_level) THEN
4138       fnd_log.string(l_log_procedure,
4139                      L_DEBUG_KEY ||'.begin',
4140                      'At the start of PL SQL procedure. Visit Id = ' || p_visit_id);
4141    END IF;
4142 
4143    -- Initialize message list if p_init_msg_list is set to TRUE.
4144    IF Fnd_Api.to_boolean(p_init_msg_list)
4145    THEN
4146       Fnd_Msg_Pub.initialize;
4147    END IF;
4148 
4149    --  Initialize API return status to success
4150     x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
4151 
4152    -- Standard call to check for call compatibility.
4153    IF NOT Fnd_Api.COMPATIBLE_API_CALL(l_api_version,
4154                                       p_api_version,
4155                                       l_api_name,G_PKG_NAME)
4156    THEN
4157        RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4158    END IF;
4159 
4160    IF (l_log_statement >= l_log_current_level) THEN
4161       fnd_log.string(l_log_statement,
4162                      L_DEBUG_KEY,
4163                      'Before calling AHL_VWP_TIMES_PVT.Calculate_Task_Times');
4164    END IF;
4165 
4166    -- Calculate Task Start/End time
4167    AHL_VWP_TIMES_PVT.CALCULATE_TASK_TIMES(
4168            p_api_version      => 1.0,
4169            p_init_msg_list    => Fnd_Api.G_FALSE,
4170            p_commit           => Fnd_Api.G_FALSE,
4171            p_validation_level => Fnd_Api.G_VALID_LEVEL_FULL,
4172            x_return_status    => l_return_status,
4173            x_msg_count        => l_msg_count,
4174            x_msg_data         => l_msg_data,
4175            p_visit_id         => p_visit_id);
4176 
4177    IF (l_log_statement >= l_log_current_level) THEN
4178       fnd_log.string(l_log_statement,
4179                      L_DEBUG_KEY,
4180                      'After calling AHL_VWP_TIMES_PVT.Calculate_Task_Times. Return Status = ' || l_return_status);
4181    END IF;
4182 
4183    IF (l_return_status <> Fnd_Api.G_RET_STS_SUCCESS) THEN
4184       IF (l_log_statement >= l_log_current_level) THEN
4185          fnd_log.string(l_log_statement,
4186                         L_DEBUG_KEY,
4187                         'Errors from AHL_VWP_TIMES_PVT.Calculate_Task_Times. Message count: ' ||
4188                         l_msg_count || ', message data: ' || l_msg_data);
4189       END IF;
4190    END IF;
4191 
4192    /*rnahata - B6447196 - start*/
4193    /*c_visit_rec fetch has been moved after the project details are updated for the visit. Hence
4194    moved the cursor after integrate_to_projects*/
4195    OPEN c_get_vst_status_and_date (p_visit_id);
4196    FETCH c_get_vst_status_and_date INTO get_vst_status_and_date_rec;
4197    CLOSE c_get_vst_status_and_date;
4198    /*rnahata - B6447196 - end*/
4199 
4200    --Jerry updated on 08/13/2004 after discussion with Yan and Alex for adjusting task start date
4201    IF get_vst_status_and_date_rec.STATUS_CODE = 'PARTIALLY RELEASED' THEN
4202       IF (l_log_statement >= l_log_current_level) THEN
4203          fnd_log.string(l_log_statement,
4204                         L_DEBUG_KEY,
4205                         'Before calling AHL_VWP_TIMES_PVT.adjust_task_times');
4206       END IF;
4207       FOR l_get_independent_tasks IN get_independent_tasks(p_visit_id) LOOP
4208           AHL_VWP_TIMES_PVT.adjust_task_times(
4209                  p_api_version         => 1.0,
4210                  p_init_msg_list       => Fnd_Api.G_FALSE,
4211                  p_commit              => Fnd_Api.G_FALSE,
4212                  p_validation_level    => Fnd_Api.G_VALID_LEVEL_FULL,
4213                  x_return_status       => l_return_status,
4214                  x_msg_count           => l_msg_count,
4215                  x_msg_data            => l_msg_data,
4216                  p_task_id             => l_get_independent_tasks.visit_task_id,
4217                  p_reset_sysdate_flag  => FND_API.G_TRUE);
4218       END LOOP;
4219 
4220       IF (l_log_statement >= l_log_current_level) THEN
4221          fnd_log.string(l_log_statement,
4222                         L_DEBUG_KEY,
4223                         'After calling AHL_VWP_TIMES_PVT.adjust_task_times. Return Status = ' || l_return_status);
4224       END IF;
4225 
4226       IF (l_return_status <> Fnd_Api.G_RET_STS_SUCCESS) THEN
4227          IF (l_log_statement >= l_log_current_level) THEN
4228             fnd_log.string(l_log_statement,
4229                            L_DEBUG_KEY,
4230                            'Errors from AHL_VWP_TIMES_PVT.adjust_task_times. Message count: ' ||
4231                            l_msg_count || ', message data: ' || l_msg_data);
4232          END IF;
4233       END IF;
4234 
4235       l_visit_end_time := AHL_VWP_TIMES_PVT.get_visit_end_time(p_visit_id);
4236       IF l_visit_end_time > get_vst_status_and_date_rec.close_date_time THEN
4237          Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_TSK_STDT_ADJU');
4238          Fnd_Message.Set_Token('VISIT_END_DATE', l_visit_end_time);
4239          Fnd_Msg_Pub.ADD;
4240          RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4241       END IF;
4242    END IF;
4243 
4244    /*rnahata - B6447196 - start*/
4245    /*moved the call to integrate to projects after task times gets updated
4246    esp in case of visits that is partially implemented*/
4247    idx := idx + 1;
4248    --Call prrojects
4249    -- Post 11.5.10
4250    -- RROY
4251 
4252    IF (l_log_statement >= l_log_current_level) THEN
4253       fnd_log.string(l_log_statement,
4254                      L_DEBUG_KEY,
4255                      'Before calling INTEGRATE_TO_PROJECTS');
4256    END IF;
4257 
4258    AHL_VWP_PROJ_PROD_PVT.Integrate_to_Projects
4259               (p_api_version       => l_api_version,
4260                p_init_msg_list     => p_init_msg_list,
4261                p_commit            => l_commit,
4262                p_validation_level  => p_validation_level,
4263                p_module_type       => p_module_type,
4264                p_visit_id          => p_visit_id,
4265                x_return_status     => l_return_status,
4266                x_msg_count         => l_msg_count,
4267                x_msg_data          => x_msg_data);
4268 
4269    IF (l_log_statement >= l_log_current_level) THEN
4270       fnd_log.string(l_log_statement,
4271                      L_DEBUG_KEY,
4272                      'After calling INTEGRATE_TO_PROJECTS. l_return_status '||l_return_status);
4273    END IF;
4274 
4275    IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
4276      -- Check Error Message stack.
4277      x_msg_count := FND_MSG_PUB.count_msg;
4278      RAISE FND_API.G_EXC_ERROR;
4279    END IF;
4280 
4281    -- Post 11.5.10
4282    -- RROY
4283    OPEN c_visit (p_visit_id);
4284    FETCH c_visit INTO c_visit_rec;
4285    CLOSE c_visit;
4286    /*rnahata - B6447196 - end*/
4287 
4288    -- Begin changes by rnahata for Bug 6448678
4289    l_temp_msg_count := Fnd_Msg_Pub.count_msg;
4290 
4291    IF (l_log_statement >= l_log_current_level) THEN
4292       fnd_log.string(l_log_statement,
4293        L_DEBUG_KEY,
4294        'Before calling VALIDATE_MR_ROUTE_DATE. l_msg_count = ' || l_msg_count);
4295    END IF;
4296 
4297    OPEN c_task (p_visit_id);
4298    LOOP
4299        FETCH c_task INTO c_task_rec;
4300        EXIT WHEN c_task%NOTFOUND;
4301        Validate_MR_Route_Date
4302        (
4303           p_mr_route_id       => c_task_rec.mr_route_id,
4304           p_visit_task_number => c_task_rec.visit_task_number,
4305           p_start_date_time   => c_task_rec.start_date_time,
4306           p_end_date_time     => c_task_rec.end_date_time
4307       );
4308 
4309        IF (l_log_statement >= l_log_current_level) THEN
4310           fnd_log.string(l_log_statement,
4311           L_DEBUG_KEY,
4312           'After calling VALIDATE_MR_ROUTE_DATE for task Id: ' ||
4313           c_task_rec.visit_task_id ||', l_msg_count = ' || l_msg_count);
4314        END IF;
4315 
4316    END LOOP;
4317    CLOSE c_task;
4318 
4319    l_msg_count := Fnd_Msg_Pub.count_msg;
4320    IF (l_msg_count <> l_temp_msg_count) THEN
4321       IF (l_log_statement >= l_log_current_level) THEN
4322          fnd_log.string(l_log_statement,
4323          L_DEBUG_KEY,
4324          'Errors from VALIDATE_MR_ROUTE_DATE. Message count: ' || l_msg_count);
4325       END IF;
4326       RAISE FND_API.G_EXC_ERROR;
4327    END IF;
4328    -- End changes by rnahata for Bug 6448678
4329 
4330   -- transit check visit Change
4331   -- yazhou start
4332    IF  p_orig_visit_id IS NOT NULL THEN
4333 
4334       OPEN c_visit (p_orig_visit_id);
4335       FETCH c_visit INTO c_orig_visit_rec;
4336       CLOSE c_visit;
4337 
4338       OPEN c_visit_wo_status (p_orig_visit_id);
4339       FETCH c_visit_wo_status INTO l_orig_visit_status;
4340       CLOSE c_visit_wo_status;
4341    END IF;
4342    -- yazhou end
4343 
4344    -- Start for 11.5.10 release
4345    -- By shbhanda 05-Jun-03
4346    -- For creating/updating Master Workorder in production for the visit in VWP
4347 
4348    /* Begin Changes by Shkalyan */
4349 
4350    idx := 0;
4351 
4352    OPEN c_visit_job (p_visit_id);
4353    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;
4354    CLOSE c_visit_job;
4355    --
4356    OPEN get_task_inst_dtls(p_visit_id);
4357    FETCH get_task_inst_dtls INTO get_task_inst_rec;
4358    CLOSE get_task_inst_dtls;
4359    --
4360    -- master workorder for visit already exists
4361    IF l_visit_wo_id IS NOT NULL THEN
4362 
4363       -- If visit dates changed then reschedule the jobs
4364       IF (l_visit_wo_start_time <> c_visit_rec.START_DATE_TIME
4365           OR l_visit_wo_end_time <> c_visit_rec.CLOSE_DATE_TIME) THEN
4366 
4367          IF (l_log_statement >= l_log_current_level) THEN
4368             fnd_log.string(l_log_statement,
4369              L_DEBUG_KEY,
4370              'Before calling AHL_PRD_WORKORDER_PVT.reschedule_visit_jobs');
4371          END IF;
4372 
4373          AHL_PRD_WORKORDER_PVT.reschedule_visit_jobs(
4374               P_API_VERSION                  => 1.0,
4375               x_return_status                => l_return_status,
4376               x_msg_count                    => l_msg_count,
4377               x_msg_data                     => l_msg_data,
4378               P_VISIT_ID                     => p_visit_id,
4379               p_x_scheduled_start_date       => c_visit_rec.START_DATE_TIME,
4380               p_x_scheduled_end_date         => c_visit_rec.CLOSE_DATE_TIME);
4381 
4382          IF (l_log_statement >= l_log_current_level) THEN
4383             fnd_log.string(l_log_statement,
4384                            L_DEBUG_KEY,
4385                            'After calling AHL_PRD_WORKORDER_PVT.reschedule_visit_jobs. Return Status = ' || l_return_status);
4386          END IF;
4387 
4388          IF (l_return_status <> Fnd_Api.G_RET_STS_SUCCESS) THEN
4389             IF (l_log_statement >= l_log_current_level) THEN
4390                fnd_log.string(l_log_statement,
4391                               L_DEBUG_KEY,
4392                               'Errors from AHL_PRD_WORKORDER_PVT.reschedule_visit_jobs. Message count: ' ||
4393                               l_msg_count || ', message data: ' || l_msg_data);
4394             END IF;
4395             IF l_return_status = FND_API.G_RET_STS_ERROR THEN
4396                RAISE FND_API.G_EXC_ERROR;
4397             ELSE
4398                RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4399             END IF;
4400          END IF;
4401 
4402       END IF; --reschedule visit jobs
4403 
4404       -- If p_module_type is 'CST' then master workorder status should stay as DRAFT
4405       -- Update only workorder time
4406 
4407       -- Re-Query the OVN for the workorder again since its been updated by
4408       -- AHL_PRD_WORKORDER_PVT.RESCHEDULE_VISIT_JOBS API.
4409       -- Balaji added this fix as a part of BAE OVN bug fix for workorders.
4410       OPEN c_visit_job (p_visit_id);
4411       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;
4412       CLOSE c_visit_job;
4413 
4414       IF p_module_type = 'CST' THEN
4415          idx := idx+1;
4416          l_prd_workorder_tbl(idx).DML_OPERATION := 'U';
4417          l_prd_workorder_tbl(idx).WORKORDER_ID := l_visit_wo_id;
4418          l_prd_workorder_tbl(idx).OBJECT_VERSION_NUMBER := l_visit_wo_ovn;
4419          l_prd_workorder_tbl(idx).SCHEDULED_START_DATE  := c_visit_rec.start_date_time;
4420          l_prd_workorder_tbl(idx).SCHEDULED_END_DATE    := c_visit_rec.close_date_time;
4421       END IF;
4422 
4423       -- If visit master workorder status is already RELEASED, the no change should be made
4424 
4425       IF p_module_type <> 'CST' AND l_visit_wo_status <> '3' THEN
4426 
4427          IF p_release_flag = 'Y' THEN
4428             -- change status from UNRELEASED/DRAFT to RELEASED
4429             idx := idx+1;
4430             l_prd_workorder_tbl(idx).DML_OPERATION := 'U';
4431             l_prd_workorder_tbl(idx).WORKORDER_ID := l_visit_wo_id;
4432             l_prd_workorder_tbl(idx).OBJECT_VERSION_NUMBER := l_visit_wo_ovn;
4433             l_prd_workorder_tbl(idx).STATUS_CODE  := '3';   -- Released
4434             l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG     := 1; -- Firm
4435             -- l_prd_workorder_tbl(idx).VALIDATE_STRUCTURE := 'Y'; -- rroy - TC - validate entire structure
4436             l_prd_workorder_tbl(idx).SCHEDULED_START_DATE  := c_visit_rec.start_date_time;
4437             l_prd_workorder_tbl(idx).SCHEDULED_END_DATE    := c_visit_rec.close_date_time;
4438          ELSIF l_visit_wo_status = '17' THEN
4439             -- Master workorder was in Draft status
4440             -- Need to make it UNRELEASED now
4441             idx := idx+1;
4442             l_prd_workorder_tbl(idx).DML_OPERATION := 'U';
4443             l_prd_workorder_tbl(idx).WORKORDER_ID := l_visit_wo_id;
4444             l_prd_workorder_tbl(idx).OBJECT_VERSION_NUMBER := l_visit_wo_ovn;
4445             l_prd_workorder_tbl(idx).SCHEDULED_START_DATE  := c_visit_rec.start_date_time;
4446             l_prd_workorder_tbl(idx).SCHEDULED_END_DATE    := c_visit_rec.close_date_time;
4447             l_prd_workorder_tbl(idx).STATUS_CODE           := '1';   -- Unreleased
4448             l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG     := 1; -- Firm
4449          END IF;
4450       ELSIF p_module_type <> 'CST' THEN
4451          idx := idx+1;
4452          l_prd_workorder_tbl(idx).DML_OPERATION := 'U';
4453          l_prd_workorder_tbl(idx).WORKORDER_ID := l_visit_wo_id;
4454          l_prd_workorder_tbl(idx).OBJECT_VERSION_NUMBER := l_visit_wo_ovn;
4455          --l_prd_workorder_tbl(idx).STATUS_CODE  := '3';   -- Released
4456          --l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG     := 1; -- Firm
4457          --l_prd_workorder_tbl(idx).VALIDATE_STRUCTURE := 'Y'; -- rroy - TC - validate entire structure
4458          l_prd_workorder_tbl(idx).SCHEDULED_START_DATE  := c_visit_rec.start_date_time;
4459          l_prd_workorder_tbl(idx).SCHEDULED_END_DATE    := c_visit_rec.close_date_time;
4460       END IF;
4461       l_prd_workorder_tbl(idx).BATCH_ID := c_visit_rec.VISIT_NUMBER;
4462       l_prd_workorder_tbl(idx).HEADER_ID := 0; -- Visit
4463 
4464    ELSE  -- Visit Master Workorder doesn't exist
4465 
4466       idx := idx+1;
4467 
4468       l_prd_workorder_tbl(idx).DML_OPERATION := 'C';
4469 
4470       IF (p_module_type = 'CST') THEN
4471          l_prd_workorder_tbl(idx).STATUS_CODE           := '17';  -- draft
4472 
4473          -- sracha 27Jul05. Create Draft WO as firm to avoid scheduling by EAM.
4474          --l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG     := 2; -- Planned
4475          l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG     := 1; -- Firm
4476 
4477      ELSE
4478          IF p_orig_visit_id IS NOT NULL THEN
4479             -- Create master workorder in same status as that of the originating visit
4480             l_prd_workorder_tbl(idx).STATUS_CODE           := l_orig_visit_status;
4481          ELSE
4482             IF p_release_flag = 'Y' THEN
4483                l_prd_workorder_tbl(idx).STATUS_CODE           := '3';  -- Released
4484             ELSE
4485                l_prd_workorder_tbl(idx).STATUS_CODE           := '1';  -- Unreleased
4486             END IF;
4487          END IF;
4488 
4489          l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG     := 1; -- Firm
4490 
4491      END IF;
4492      -- Post 11.5.10 Changes by senthil
4493      l_prd_workorder_tbl(idx).SCHEDULED_START_DATE  := c_visit_rec.start_date_time;
4494      -- Changed by Shbhanda on 30th Jan 04
4495      l_prd_workorder_tbl(idx).SCHEDULED_END_DATE  := c_visit_rec.close_date_time;
4496 
4497      l_prd_workorder_tbl(idx).MASTER_WORKORDER_FLAG := 'Y';
4498      l_prd_workorder_tbl(idx).BATCH_ID := c_visit_rec.VISIT_NUMBER;
4499      l_prd_workorder_tbl(idx).HEADER_ID := 0; -- Visit
4500      /* End Changes by Shkalyan */
4501      l_prd_workorder_tbl(idx).VISIT_ID              := p_visit_id;
4502      l_prd_workorder_tbl(idx).ORGANIZATION_ID       := c_visit_rec.organization_id;
4503      l_prd_workorder_tbl(idx).PROJECT_ID            := c_visit_rec.project_id;
4504      l_prd_workorder_tbl(idx).DEPARTMENT_ID         := c_visit_rec.department_id ;
4505      l_prd_workorder_tbl(idx).INVENTORY_ITEM_ID     := NVL(c_visit_rec.inventory_item_id,get_task_inst_rec.inventory_item_id);
4506      l_prd_workorder_tbl(idx).ITEM_INSTANCE_ID      := NVL(c_visit_rec.item_instance_id,get_task_inst_rec.instance_id);
4507      l_prd_workorder_tbl(idx).JOB_DESCRIPTION       := c_visit_rec.visit_name ;
4508   END IF; --visit master workorder exist
4509 
4510   -- Create Workorders for tasks that have no workorder in production
4511   -- Update workorder only if the previous status is DRAFT
4512 
4513   OPEN c_task_ct(p_visit_id);
4514   FETCH c_task_ct INTO l_count;
4515   CLOSE c_task_ct;
4516 
4517   IF (l_log_statement >= l_log_current_level) THEN
4518      fnd_log.string(l_log_statement,
4519                     L_DEBUG_KEY,
4520                     'Task Count' || l_count);
4521   END IF;
4522 
4523   IF l_count > 0 THEN
4524      OPEN c_task(p_visit_id);
4525      FETCH c_task INTO c_task_rec;
4526      WHILE c_task%FOUND LOOP
4527 
4528      /* Begin Changes by Shkalyan */
4529      IF p_orig_visit_id is not NULL THEN
4530         -- Check the workorder status for the coresponding task in originating visit
4531 
4532         l_orig_task_status := null;
4533 
4534         OPEN c_wo_status(p_orig_visit_id,c_task_rec.visit_task_id);
4535         FETCH c_wo_status INTO l_orig_task_status;
4536         CLOSE c_wo_status;
4537      END IF;
4538 
4539      IF p_orig_visit_id is NULL OR l_orig_task_status is not null THEN
4540 
4541         -- Merge process for 11.5.10 bug fix on CMRDV10P
4542         -- Fix for Bug 3549573
4543         l_workorder_id := NULL;
4544         l_workorder_ovn := NULL;
4545         l_workorder_status := NULL;
4546 
4547         -- To get the Workorder for Visit Task
4548         OPEN c_job(c_task_rec.visit_task_id);
4549         FETCH c_job INTO l_workorder_id, l_workorder_ovn, l_workorder_status;
4550         CLOSE c_job;
4551 
4552         -- if workorder exists for the task
4553         IF l_workorder_id IS NOT NULL THEN
4554            IF (l_log_statement >= l_log_current_level) THEN
4555               fnd_log.string(l_log_statement,
4556                              L_DEBUG_KEY,
4557                              'Workorder Id for Task = ' || l_workorder_id);
4558               END IF;
4559                -- If p_module_type is 'CST' then workorder status should stay as DRAFT
4560                -- Update only workorder time
4561 
4562               IF p_module_type = 'CST' THEN
4563                    idx := idx+1;
4564                    l_prd_workorder_tbl(idx).DML_OPERATION := 'U';
4565                    l_prd_workorder_tbl(idx).WORKORDER_ID := l_workorder_id;
4566                    l_prd_workorder_tbl(idx).OBJECT_VERSION_NUMBER := l_workorder_ovn;
4567 
4568               --POST11510 cxcheng. If summary task, use the min,max for sub tasks
4569               IF (c_task_rec.task_type_code = 'SUMMARY') THEN
4570                  OPEN get_summary_task_times_csr(c_task_rec.visit_task_id);
4571                  FETCH get_summary_task_times_csr INTO l_prd_workorder_tbl(idx).SCHEDULED_START_DATE,
4572                                                     l_prd_workorder_tbl(idx).SCHEDULED_END_DATE;
4573                  CLOSE get_summary_task_times_csr;
4574               ELSE
4575                  l_prd_workorder_tbl(idx).SCHEDULED_START_DATE := c_task_rec.START_DATE_TIME;
4576                  l_prd_workorder_tbl(idx).SCHEDULED_END_DATE   := c_task_rec.END_DATE_TIME;
4577               END IF;
4578 
4579                   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;
4580             l_prd_workorder_tbl(idx).HEADER_ID := c_task_rec.visit_task_number;
4581 
4582               END IF;
4583               -- Only update task if previous status is DRAFT
4584               IF ( p_module_type <> 'CST' AND l_workorder_status = '17' ) THEN
4585                    idx := idx+1;
4586                    IF p_release_flag = 'Y' THEN
4587                       l_prd_workorder_tbl(idx).STATUS_CODE := '3';  -- Released
4588                    ELSE
4589                       l_prd_workorder_tbl(idx).STATUS_CODE := '1';  -- Unreleased
4590                    END IF;
4591                    l_prd_workorder_tbl(idx).DML_OPERATION := 'U';
4592                    l_prd_workorder_tbl(idx).WORKORDER_ID := l_workorder_id;
4593                    l_prd_workorder_tbl(idx).OBJECT_VERSION_NUMBER := l_workorder_ovn;
4594                    IF ( l_firm_planned_flag IS NOT NULL AND
4595                         l_firm_planned_flag = '2' ) THEN
4596                         l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG := 2; -- Planned
4597                    ELSE
4598                         l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG := 1; -- Firm
4599                    END IF;
4600                   --POST11510 cxcheng. If summary task, use the min,max for sub tasks
4601                   IF (c_task_rec.task_type_code = 'SUMMARY') THEN
4602                   OPEN get_summary_task_times_csr(c_task_rec.visit_task_id);
4603                   FETCH get_summary_task_times_csr INTO l_prd_workorder_tbl(idx).SCHEDULED_START_DATE,
4604                                                   l_prd_workorder_tbl(idx).SCHEDULED_END_DATE  ;
4605                   CLOSE get_summary_task_times_csr;
4606                   ELSE
4607                        l_prd_workorder_tbl(idx).SCHEDULED_START_DATE := c_task_rec.START_DATE_TIME;
4608                        l_prd_workorder_tbl(idx).SCHEDULED_END_DATE := c_task_rec.END_DATE_TIME;
4609                   END IF;
4610 
4611               /* Begin changes by rnahata for Bug 5758813 - For summary tasks (both manual and MR summary tasks)
4612               and unassociated tasks the task name is passed as the workorder description.
4613               And for the Route tasks, the route number concatenated with the route title is
4614               passed as workorder description.*/
4615 
4616               IF (c_task_rec.task_type_code IN ('SUMMARY','UNASSOCIATED')) THEN
4617                  l_prd_workorder_tbl(idx).JOB_DESCRIPTION   :=  c_task_rec.visit_task_name;
4618               ELSE
4619                  OPEN get_wo_dtls_for_mrtasks_cur(c_task_rec.visit_task_id);
4620                  FETCH get_wo_dtls_for_mrtasks_cur INTO get_wo_dtls_for_mrtasks_rec;
4621                  CLOSE get_wo_dtls_for_mrtasks_cur;
4622                  l_prd_workorder_tbl(idx).JOB_DESCRIPTION := get_wo_dtls_for_mrtasks_rec.workorder_description;
4623               END IF;
4624               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;
4625               l_prd_workorder_tbl(idx).BATCH_ID := c_visit_rec.visit_number;
4626               l_prd_workorder_tbl(idx).HEADER_ID := c_task_rec.visit_task_number;
4627            END IF;
4628            /* End Changes by Shkalyan */
4629 
4630            --l_prd_workorder_tbl(idx).VISIT_ID          := p_visit_id;
4631            --l_prd_workorder_tbl(idx).ORGANIZATION_ID   := c_visit_rec.organization_id;
4632            --l_prd_workorder_tbl(idx).PROJECT_ID        := c_visit_rec.project_id;
4633            --l_prd_workorder_tbl(idx).INVENTORY_ITEM_ID := c_task_rec.inventory_item_id ;
4634            --l_prd_workorder_tbl(idx).ITEM_INSTANCE_ID  := c_task_rec.instance_id ;
4635            --l_prd_workorder_tbl(idx).VISIT_TASK_ID     := c_task_rec.visit_task_id ;
4636            --l_prd_workorder_tbl(idx).VISIT_TASK_NUMBER := c_task_rec.visit_task_number ;
4637            --l_prd_workorder_tbl(idx).PROJECT_TASK_ID   := c_task_rec.project_task_id ;
4638            --l_prd_workorder_tbl(idx).JOB_DESCRIPTION   := c_task_rec.visit_task_name ;
4639 
4640            ELSE  -- workorder doesn't exist
4641               idx := idx+1;
4642               l_prd_workorder_tbl(idx).DML_OPERATION     := 'C';
4643               IF (p_module_type = 'CST') THEN
4644                  l_prd_workorder_tbl(idx).STATUS_CODE           := '17';  -- Draft
4645                  -- sracha 27Jul05. Create Draft WO as firm to avoid scheduling by EAM.
4646                  --l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG     := 2; -- Planned
4647                  l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG     := 1; -- Firm
4648 
4649                ELSE
4650                   IF p_orig_visit_id IS NOT NULL THEN
4651                      -- Create master workorder in same status as that of the originating visit
4652                      l_prd_workorder_tbl(idx).STATUS_CODE     := l_orig_task_status;
4653                   ELSE
4654                      IF p_release_flag = 'Y' THEN
4655                         l_prd_workorder_tbl(idx).STATUS_CODE  := '3';  -- Released
4656                                                                                     ELSE
4657                         l_prd_workorder_tbl(idx).STATUS_CODE  := '1';  -- Unreleased
4658                      END IF;
4659                   END IF;
4660 
4661                   IF ( l_firm_planned_flag IS NOT NULL AND
4662                        l_firm_planned_flag = '2' ) THEN
4663                       l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG     := 2; -- Planned
4664                   ELSE
4665                       l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG     := 1; -- Firm
4666                   END IF;
4667 
4668                /*
4669                Get_Task_Dependencies
4670                (
4671                  p_visit_number       => c_visit_rec.visit_number,
4672                  p_visit_task_id      => c_task_rec.visit_task_id,
4673                  p_visit_task_number  => c_task_rec.visit_task_number,
4674                  p_x_relationship_tbl => l_prd_workorder_rel_tbl
4675                );
4676                */
4677               END IF; -- 'CST'
4678               IF (c_task_rec.task_type_code = 'SUMMARY') THEN
4679                  l_prd_workorder_tbl(idx).MASTER_WORKORDER_FLAG := 'Y';
4680               ELSE
4681                  l_prd_workorder_tbl(idx).MASTER_WORKORDER_FLAG := 'N';
4682               END IF;
4683 
4684               l_prd_workorder_tbl(idx).BATCH_ID := c_visit_rec.visit_number;
4685               l_prd_workorder_tbl(idx).HEADER_ID := c_task_rec.visit_task_number;
4686               /* End Changes by Shkalyan */
4687               l_prd_workorder_tbl(idx).VISIT_ID          := p_visit_id;
4688               l_prd_workorder_tbl(idx).ORGANIZATION_ID   := c_visit_rec.organization_id;
4689               l_prd_workorder_tbl(idx).PROJECT_ID        := c_visit_rec.project_id;
4690               l_prd_workorder_tbl(idx).INVENTORY_ITEM_ID := c_task_rec.inventory_item_id ;
4691               l_prd_workorder_tbl(idx).ITEM_INSTANCE_ID  := c_task_rec.instance_id ;
4692               l_prd_workorder_tbl(idx).VISIT_TASK_ID     := c_task_rec.visit_task_id ;
4693               l_prd_workorder_tbl(idx).VISIT_TASK_NUMBER := c_task_rec.visit_task_number ;
4694               l_prd_workorder_tbl(idx).PROJECT_TASK_ID   := c_task_rec.project_task_id ;
4695 
4696               /*B5758813 - rnahata - For summary tasks (both manual and MR summary tasks)
4697               and unassociated tasks the task name is passed as the workorder description.
4698               And for the MR tasks, the route number concatenated with the route title is
4699               passed as workorder description.*/
4700               IF (c_task_rec.task_type_code IN ('SUMMARY','UNASSOCIATED')) THEN
4701                  l_prd_workorder_tbl(idx).JOB_DESCRIPTION   :=  c_task_rec.visit_task_name;
4702               ELSE
4703                  OPEN get_wo_dtls_for_mrtasks_cur(c_task_rec.visit_task_id);
4704                  FETCH get_wo_dtls_for_mrtasks_cur INTO get_wo_dtls_for_mrtasks_rec;
4705                  CLOSE get_wo_dtls_for_mrtasks_cur;
4706                  l_prd_workorder_tbl(idx).JOB_DESCRIPTION := get_wo_dtls_for_mrtasks_rec.workorder_description;
4707               END IF;
4708 
4709               IF c_task_rec.mr_route_id IS NOT NULL AND c_task_rec.mr_route_id <> FND_API.g_miss_num THEN
4710                  OPEN c_route (c_task_rec.mr_route_id);
4711                  FETCH c_route INTO l_route_id;
4712                  CLOSE c_route;
4713                  l_prd_workorder_tbl(idx).ROUTE_ID := l_route_id ;
4714               ELSE
4715                  l_prd_workorder_tbl(idx).ROUTE_ID := Null;
4716               END IF;
4717 
4718               IF c_task_rec.department_id IS NOT NULL
4719                  AND c_task_rec.department_id <> FND_API.g_miss_num THEN
4720                  l_prd_workorder_tbl(idx).DEPARTMENT_ID   := c_task_rec.department_id ;
4721               ELSE
4722                  l_prd_workorder_tbl(idx).DEPARTMENT_ID   := c_visit_rec.department_id ;
4723               END IF;
4724 
4725               --POST11510 cxcheng. If summary task, use the min,max for sub tasks
4726               IF (c_task_rec.task_type_code = 'SUMMARY') THEN
4727                  OPEN get_summary_task_times_csr(c_task_rec.visit_task_id);
4728                  FETCH get_summary_task_times_csr INTO l_prd_workorder_tbl(idx).SCHEDULED_START_DATE,
4729                                                        l_prd_workorder_tbl(idx).SCHEDULED_END_DATE  ;
4730                  CLOSE get_summary_task_times_csr;
4731               ELSE
4732                  l_prd_workorder_tbl(idx).SCHEDULED_START_DATE  := c_task_rec.START_DATE_TIME;
4733                  l_prd_workorder_tbl(idx).SCHEDULED_END_DATE    := c_task_rec.END_DATE_TIME;
4734               END IF;
4735 
4736            END IF;  -- workorder exist
4737 
4738         END IF;  -- p_orig_visit null or orig_task_status null
4739 
4740         FETCH c_task INTO c_task_rec;
4741         END LOOP;
4742 
4743         CLOSE c_task;
4744 
4745      END IF; -- l_count
4746      -- yazhou end
4747 
4748    IF l_prd_workorder_tbl.COUNT > 0  THEN
4749 
4750       /* Begin Changes by Shkalyan */
4751       IF (l_log_statement >= l_log_current_level) THEN
4752          fnd_log.string(l_log_statement,
4753                         L_DEBUG_KEY,
4754                         'Before calling GET_VISIT_RELATIONSHIPS.');
4755       END IF;
4756       -- yazhou starts
4757       -- IF l_visit_wo_id IS NULL THEN
4758       Get_Visit_Relationships
4759       (
4760         p_visit_id           => p_visit_id,
4761         p_visit_number       => c_visit_rec.visit_number,
4762         p_x_relationship_tbl => l_prd_workorder_rel_tbl
4763       );
4764 
4765       IF (l_log_statement >= l_log_current_level) THEN
4766          fnd_log.string(l_log_statement,
4767                         L_DEBUG_KEY,
4768                         'After calling GET_VISIT_RELATIONSHIPS.');
4769       END IF;
4770       --     END IF;
4771       -- yazhou ends
4772 
4773       IF (l_log_statement >= l_log_current_level) THEN
4774          fnd_log.string(l_log_statement,
4775                         L_DEBUG_KEY,
4776                         'Before calling GET_VISIT_DEPENDENCIES.');
4777       END IF;
4778 
4779       IF (p_module_type <> 'CST') THEN
4780         Get_Visit_Dependencies
4781         (
4782           p_visit_id           => p_visit_id,
4783           p_visit_number       => c_visit_rec.visit_number,
4784           p_x_relationship_tbl => l_prd_workorder_rel_tbl
4785        );
4786       END IF;
4787 
4788       IF (l_log_statement >= l_log_current_level) THEN
4789          fnd_log.string(l_log_statement,
4790                         L_DEBUG_KEY,
4791                         'After calling GET_VISIT_DEPENDENCIES.');
4792       END IF;
4793 
4794       IF (l_log_statement >= l_log_current_level) THEN
4795          fnd_log.string(l_log_statement,
4796                         L_DEBUG_KEY,
4797                         'Before calling AHL_PRD_WORKORDER_PVT.Process_Jobs.');
4798       END IF;
4799 
4800       AHL_PRD_WORKORDER_PVT.Process_Jobs
4801       (    p_api_version           => p_api_version,
4802            p_init_msg_list         => p_init_msg_list,
4803            p_commit                => FND_API.G_FALSE,
4804            p_validation_level      => p_validation_level,
4805            p_default               => FND_API.G_TRUE,
4806            p_module_type           => p_module_type,
4807            x_return_status         => l_return_status,
4808            x_msg_count             => x_msg_count,
4809            x_msg_data              => x_msg_data,
4810            p_x_prd_workorder_tbl   => l_prd_workorder_tbl,
4811            p_prd_workorder_rel_tbl => l_prd_workorder_rel_tbl
4812       );
4813       /* End Changes by Shkalyan */
4814 
4815       IF (l_log_statement >= l_log_current_level) THEN
4816          fnd_log.string(l_log_statement,
4817                         L_DEBUG_KEY,
4818                         'After calling AHL_PRD_WORKORDER_PVT.Process_Jobs. Return Status = ' || l_return_status);
4819       END IF;
4820 
4821       IF (l_return_status <> Fnd_Api.G_RET_STS_SUCCESS) THEN
4822          IF (l_log_statement >= l_log_current_level) THEN
4823             fnd_log.string(l_log_statement,
4824                            L_DEBUG_KEY,
4825                            'Errors from AHL_PRD_WORKORDER_PVT.Process_Jobs. Message count: ' ||
4826                            l_msg_count || ', message data: ' || l_msg_data);
4827          END IF;
4828          IF l_return_status = FND_API.G_RET_STS_ERROR THEN
4829             RAISE FND_API.G_EXC_ERROR;
4830          ELSE
4831             RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4832          END IF;
4833       END IF;
4834 
4835       -- Begin changes by rnahata for Bug 5758813
4836       /*The project start/end dates have to be updated with the workorder scheduled
4837       start/end dates.*/
4838 
4839       IF (l_log_statement >= l_log_current_level) THEN
4840          For i IN l_prd_workorder_tbl.FIRST..l_prd_workorder_tbl.LAST
4841          LOOP
4842            fnd_log.string(l_log_statement,
4843            L_DEBUG_KEY,
4844            'WorkOrder Id ('||i||'): '||l_prd_workorder_tbl(i).workorder_id);
4845          END LOOP;
4846       END IF;
4847 
4848       IF (l_log_statement >= l_log_current_level) THEN
4849          fnd_log.string(l_log_statement,
4850                         L_DEBUG_KEY,
4851                         'Before calling Update_Project_Task_Times.');
4852       END IF;
4853 
4854       Update_Project_Task_Times(p_prd_workorder_tbl => l_prd_workorder_tbl,
4855                                  p_commit            =>'F',
4856                                  x_return_status     => l_return_status,
4857                                  x_msg_count         => l_msg_count,
4858                                  x_msg_data          => l_msg_data);
4859 
4860       IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
4861          x_msg_count := FND_MSG_PUB.count_msg;
4862          IF (l_log_statement >= l_log_current_level) THEN
4863            fnd_log.string(l_log_statement,
4864                           L_DEBUG_KEY,
4865                           'Errors from Update_Project_Task_Times. Message count: ' || x_msg_count);
4866          END IF;
4867          IF l_return_status = FND_API.G_RET_STS_ERROR THEN
4868             RAISE FND_API.G_EXC_ERROR;
4869          ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
4870             RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4871          END IF;
4872       ELSE
4873          IF (l_log_statement >= l_log_current_level) THEN
4874            fnd_log.string(l_log_statement,
4875                           L_DEBUG_KEY,
4876                           'Returned Success from Update_Project_Task_Times');
4877          END IF;
4878       END IF;
4879       -- End changes by rnahata for Bug 5758813
4880    END IF; -- To find if the visit has any tasks
4881 
4882    IF (l_log_statement >= l_log_current_level) THEN
4883       fnd_log.string(l_log_statement,
4884                      L_DEBUG_KEY,
4885                      'Update Visit -- Released');
4886    END IF;
4887 --transit check visit change
4888 -- yazhou start
4889    IF (p_module_type <> 'CST') THEN
4890       IF p_orig_visit_id is null THEN
4891         --------------------------------- R12 changes For Serial Number Reservations Start----------------------------------
4892         ----------------------------------AnRaj added on 15th June 2005-----------------------------------------------------
4893         -- When a visit is pushed to production, all the material reservations that were
4894         -- created will have to be transferred with the WIP details
4895 
4896         IF (l_log_statement >= l_log_current_level) THEN
4897           fnd_log.string(l_log_statement,L_DEBUG_KEY,'Before calling AHL_RSV_RESERVATIONS_PVT.TRANSFER_RESERVATION');
4898         END IF;
4899 
4900         AHL_RSV_RESERVATIONS_PVT.TRANSFER_RESERVATION
4901         (
4902             p_api_version   => l_api_version,
4903             p_init_msg_list => l_init_msg_list,
4904             x_return_status => l_return_status,
4905             p_module_type   => p_module_type,
4906             x_msg_count     => l_msg_count,
4907             x_msg_data      => l_msg_data,
4908             p_visit_id      => p_visit_id
4909         );
4910 
4911         IF (l_log_statement >= l_log_current_level) THEN
4912           fnd_log.string(l_log_statement,L_DEBUG_KEY,'After calling AHL_RSV_RESERVATIONS_PVT.TRANSFER_RESERVATION - l_return_status : '||l_return_status);
4913         END IF;
4914 
4915         -- handle the exceptions, if any
4916         IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
4917            IF (l_log_statement >= l_log_current_level) THEN
4918               fnd_log.string(l_log_statement,
4919                              L_DEBUG_KEY,
4920                              ':Errors from AHL_RSV_RESERVATIONS_PVT.TRANSFER_RESERVATION API : ' || x_msg_count );
4921             END IF;
4922             RAISE Fnd_Api.g_exc_error;
4923         END IF;
4924         --------------------------------- R12 changes For Serial Number Reservations End----------------------------------
4925 
4926          UPDATE AHL_VISITS_B
4927          SET    STATUS_CODE = 'RELEASED',
4928                 OBJECT_VERSION_NUMBER = OBJECT_VERSION_NUMBER + 1
4929          WHERE  VISIT_ID = p_visit_id;
4930 
4931       ELSE
4932          UPDATE AHL_VISITS_B
4933          SET    STATUS_CODE = c_orig_visit_rec.STATUS_CODE,
4934                 OBJECT_VERSION_NUMBER = OBJECT_VERSION_NUMBER + 1
4935          WHERE  VISIT_ID = p_visit_id;
4936     END IF;
4937 
4938    END IF;
4939 
4940    IF ( p_module_type <> 'CST' ) THEN
4941      IF p_orig_visit_id is null THEN
4942 
4943          UPDATE AHL_VISIT_TASKS_B
4944          SET STATUS_CODE = 'RELEASED',
4945              OBJECT_VERSION_NUMBER = OBJECT_VERSION_NUMBER + 1
4946          WHERE VISIT_ID = p_visit_id
4947         AND STATUS_CODE = 'PLANNING';
4948 
4949     ELSE
4950        UPDATE AHL_VISIT_TASKS_B
4951        SET STATUS_CODE = 'RELEASED',
4952            OBJECT_VERSION_NUMBER = OBJECT_VERSION_NUMBER + 1
4953        WHERE VISIT_ID = p_visit_id
4954          AND STATUS_CODE = 'PLANNING'
4955          AND VISIT_TASK_NUMBER in (Select VISIT_TASK_NUMBER
4956                                    FROM ahl_visit_tasks_b
4957                                    where visit_id = p_orig_visit_id
4958                                    AND STATUS_CODE = 'RELEASED');
4959       END IF;
4960    END IF;
4961    -- yazhou end
4962 
4963    -- Start By Shbhanda 16th Feb 2004 --
4964    -- Earlier this code was in Release_Visit procedure
4965    -- was moved here as whenever the visit is pushed to production
4966    -- 'any_task_chg_flag' in Visit should always be 'N'
4967    -----------------------------------------------
4968    -- To call AHL_VWP_RULES_PVT.Update_Visit_Task_Flag to update any_task_chg_flag as 'N'
4969    IF (l_log_statement >= l_log_current_level) THEN
4970       fnd_log.string(l_log_statement,
4971                      L_DEBUG_KEY,
4972                      'Before calling AHL_VWP_RULES_PVT.Update_Visit_Task_Flag.');
4973    END IF;
4974 
4975    IF c_visit_rec.any_task_chg_flag = 'Y' THEN
4976       AHL_VWP_RULES_PVT.Update_Visit_Task_Flag
4977           (p_visit_id      => p_visit_id,
4978            p_flag          => 'N',
4979            x_return_status => x_return_status);
4980    END IF;
4981 
4982    IF (l_log_statement >= l_log_current_level) THEN
4983       fnd_log.string(l_log_statement,
4984                      L_DEBUG_KEY,
4985                      'After calling AHL_VWP_RULES_PVT.Update_Visit_Task_Flag');
4986    END IF;
4987    -- End By Shbhanda 16th Feb 2004 -------------
4988 
4989   ---------------------------End of Body-------------------------------------
4990   -- END of API body.
4991   -- Standard check of p_commit.
4992 
4993    IF Fnd_Api.To_Boolean (p_commit) THEN
4994       COMMIT WORK;
4995    END IF;
4996 
4997    Fnd_Msg_Pub.count_and_get(
4998          p_encoded => Fnd_Api.g_false,
4999          p_count   => x_msg_count,
5000          p_data    => x_msg_data
5001   );
5002 
5003    IF (l_log_procedure >= l_log_current_level) THEN
5004       fnd_log.string(l_log_procedure,
5005                      L_DEBUG_KEY ||'.end',
5006                      'At the end of PL SQL procedure. Return Status = ' || x_return_status);
5007    END IF;
5008 
5009 EXCEPTION
5010    WHEN Fnd_Api.g_exc_error THEN
5011       ROLLBACK TO Push_to_Production;
5012       x_return_status := Fnd_Api.g_ret_sts_error;
5013       Fnd_Msg_Pub.count_and_get (
5014             p_encoded => Fnd_Api.g_false,
5015             p_count   => x_msg_count,
5016             p_data    => x_msg_data
5017      );
5018    WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
5019       ROLLBACK TO Push_to_Production;
5020       x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
5021       Fnd_Msg_Pub.count_and_get (
5022             p_encoded => Fnd_Api.g_false,
5023             p_count   => x_msg_count,
5024             p_data    => x_msg_data
5025      );
5026    WHEN OTHERS THEN
5027       ROLLBACK TO Push_to_Production;
5028       x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
5029       IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_unexp_error)
5030       THEN
5031          Fnd_Msg_Pub.add_exc_msg (G_PKG_NAME, l_api_name);
5032       END IF;
5033       Fnd_Msg_Pub.count_and_get (
5034             p_encoded => Fnd_Api.g_false,
5035             p_count   => x_msg_count,
5036             p_data    => x_msg_data
5037      );
5038 END Push_to_Production;
5039 
5040 -------------------------------------------------------------------
5041 --  Procedure name    : Release_Visit
5042 --  Type              : Private
5043 --
5044 --
5045 --  Function          :To Validate before pushing visit and its tasks to production
5046 --
5047 --
5048 --  Pre-reqs    :
5049 --  Parameters  :
5050 --
5051 --  Standard IN  Parameters :
5052 --      p_api_version      IN  NUMBER   Required
5053 --      p_init_msg_list    IN  VARCHAR2 Default  FND_API.G_FALSE
5054 --      p_commit           IN  VARCHAR2 Default  FND_API.G_FALSE
5055 --      p_validation_level IN  NUMBER   Default  FND_API.G_VALID_LEVEL_FULL
5056 --
5057 --  Standard OUT Parameters :
5058 --      x_return_status    OUT VARCHAR2 Required
5059 --      x_msg_count        OUT NUMBER   Required
5060 --      x_msg_data         OUT VARCHAR2 Required
5061 --
5062 --  Release visit Parameters:
5063 --       p_visit_id             IN   NUMBER  Required
5064 --
5065 --  Version :
5066 --    09/09/2003     SSURAPAN   Initial  Creation
5067 -------------------------------------------------------------------
5068 PROCEDURE Release_Visit (
5069     p_api_version      IN         NUMBER,
5070     p_init_msg_list    IN         VARCHAR2 := Fnd_Api.G_FALSE,
5071     p_commit           IN         VARCHAR2 := Fnd_Api.G_FALSE,
5072     p_validation_level IN         NUMBER   := Fnd_Api.G_VALID_LEVEL_FULL,
5073     p_module_type      IN         VARCHAR2 := NULL,
5074     p_visit_id         IN         NUMBER,
5075     p_release_flag     IN         VARCHAR2 := 'N', -- By shbhanda 05/21/04 fro TC changes
5076     p_orig_visit_id    IN         NUMBER   := NULL, -- By yazhou   08/06/04 for TC changes
5077     x_return_status    OUT NOCOPY VARCHAR2,
5078     x_msg_count        OUT NOCOPY NUMBER,
5079     x_msg_data         OUT NOCOPY VARCHAR2)
5080  IS
5081     --Standard local variables
5082     L_API_NAME         CONSTANT VARCHAR2(30)  := 'Release_Visit';
5083     L_API_VERSION      CONSTANT NUMBER        := 1.0;
5084     L_DEBUG_KEY        CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
5085     l_msg_data                  VARCHAR2(2000);
5086     l_return_status             VARCHAR2(1);
5087     l_msg_count                 NUMBER;
5088     l_Error_Tbl_Type            Error_Tbl_Type;
5089     l_error_msg                 VARCHAR2(5000);
5090     l_error_count               NUMBER;
5091     l_commit                    VARCHAR2(1) := 'F';
5092     --Post 11.5.10
5093     -- RROY
5094     l_validate_error   CONSTANT VARCHAR2(1) := 'V';
5095     --l_projects_error CONSTANT VARCHAR2(1) := 'R';
5096     l_push_error       CONSTANT VARCHAR2(1) := 'P';
5097     -- RROY
5098 
5099     -- To find visit related information
5100    CURSOR c_visit (x_id IN NUMBER) IS
5101     SELECT * FROM AHL_VISITS_VL
5102     WHERE VISIT_ID = x_id;
5103    c_visit_rec c_visit%ROWTYPE;
5104   BEGIN
5105 
5106     IF (l_log_procedure >= l_log_current_level) THEN
5107       fnd_log.string(l_log_procedure,L_DEBUG_KEY||'.begin','At the start of the PLSQL procedure');
5108     END IF;
5109 
5110     -- Standard start of API savepoint
5111     SAVEPOINT Release_Visit_Pvt;
5112 
5113      -- Initialize message list if p_init_msg_list is set to TRUE
5114     IF FND_API.To_Boolean(p_init_msg_list) THEN
5115        FND_MSG_PUB.Initialize;
5116     END IF;
5117     -- Initialize API return status to success
5118     x_return_status := FND_API.G_RET_STS_SUCCESS;
5119 
5120     -- Standard call to check for call compatibility.
5121     IF NOT FND_API.COMPATIBLE_API_CALL(l_api_version,
5122                                        p_api_version,
5123                                        l_api_name,G_PKG_NAME) THEN
5124       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5125     END IF;
5126     --
5127 
5128     IF (l_log_statement >= l_log_current_level) THEN
5129       fnd_log.string(l_log_statement,L_DEBUG_KEY,'Visit ID : '||p_visit_id);
5130     END IF;
5131 
5132     -- Check for Required Parameters
5133     IF(p_visit_id IS NULL OR p_visit_id = FND_API.G_MISS_NUM) THEN
5134         FND_MESSAGE.Set_Name(G_PM_PRODUCT_CODE,'AHL_VWP_CST_INPUT_MISS');
5135         FND_MSG_PUB.ADD;
5136         IF (l_log_unexpected >= l_log_current_level)THEN
5137             fnd_log.string
5138             (
5139                 l_log_unexpected,
5140                 'ahl.plsql.AHL_VWP_CST_WO_PVT.Release_Visit',
5141                 'Visit id is mandatory but found null in input '
5142             );
5143         END IF;
5144         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5145      END IF;
5146 
5147      IF (l_log_statement >= l_log_current_level)THEN
5148          fnd_log.string (l_log_statement,L_DEBUG_KEY, 'Before Calling Validate Before Production');
5149      END IF;
5150 
5151      --Valdate before push to production happens
5152      AHL_VWP_PROJ_PROD_PVT.Validate_Before_Production
5153               (p_api_version      => l_api_version,
5154                p_init_msg_list    => p_init_msg_list,
5155                p_commit           => l_commit,
5156                p_validation_level => p_validation_level,
5157                p_module_type      => p_module_type,
5158                p_visit_id         => p_visit_id,
5159                x_error_tbl        => l_error_tbl_type,
5160                x_return_status    => l_return_status,
5161                x_msg_count        => l_msg_count,
5162                x_msg_data         => l_msg_data);
5163 
5164      IF (l_log_statement >= l_log_current_level)THEN
5165       fnd_log.string (l_log_statement, L_DEBUG_KEY, 'After Calling Validate Before Production - l_return_status = '||l_return_status);
5166      END IF;
5167 
5168      -- Post 11.5.10
5169      -- RROY
5170      IF l_error_tbl_type.COUNT > 0 THEN
5171        l_return_status := l_validate_error;
5172        x_return_status := l_validate_error;
5173      ELSIF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
5174       -- Check Error Message stack.
5175        x_msg_count := FND_MSG_PUB.count_msg;
5176 
5177        IF (l_log_statement >= l_log_current_level)THEN
5178           fnd_log.string ( l_log_statement, L_DEBUG_KEY,'Errors from Validate Before Production - '||x_msg_count);
5179        END IF;
5180        RAISE Fnd_Api.g_exc_error;
5181      ELSE
5182        IF (l_log_statement >= l_log_current_level)THEN
5183           fnd_log.string(l_log_statement,L_DEBUG_KEY, 'Before Calling aggregate_material_requirements');
5184        END IF;
5185 
5186        -- AnRaj: Added as part of Material Requirement Aggrgation Enhancement, Bug#5303378
5187        -- Call aggregate_material_requirements for a visit
5188        -- If a visit task has more than one requirement for the same item, then this method will aggregate
5189        -- all those requirements into a single requirement
5190        Aggregate_Material_Reqrs
5191             (  p_api_version      => l_api_version,
5192                p_init_msg_list    => p_init_msg_list,
5193                p_commit           => l_commit,
5194                p_validation_level => p_validation_level,
5195                p_module_type      => p_module_type,
5196                p_visit_id         => p_visit_id,
5197                x_return_status    => l_return_status,
5198                x_msg_count        => l_msg_count,
5199                x_msg_data         => l_msg_data
5200             );
5201        IF (l_log_statement >= l_log_current_level)THEN
5202           fnd_log.string(l_log_statement,L_DEBUG_KEY, 'After Calling aggregate_material_requirements - l_return_status = '||l_return_status);
5203        END IF;
5204 
5205        IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
5206           x_msg_count := FND_MSG_PUB.count_msg;
5207           IF (l_log_statement >= l_log_current_level)THEN
5208               fnd_log.string(   l_log_statement,L_DEBUG_KEY,'Errors from aggregate_material_requirements: ' || x_msg_count);
5209           END IF;
5210           RAISE Fnd_Api.g_exc_error;
5211        END IF;
5212 
5213        IF (l_log_statement >= l_log_current_level)THEN
5214          fnd_log.string(l_log_statement,L_DEBUG_KEY, 'Before calling Push_to_Production');
5215        END IF;
5216 
5217        --Call push to production with module type 'CST'
5218        AHL_VWP_PROJ_PROD_PVT.Push_to_Production
5219              (p_api_version      => l_api_version,
5220               p_init_msg_list    => p_init_msg_list,
5221               p_commit           => l_commit,
5222               p_validation_level => p_validation_level,
5223               p_module_type      => p_module_type, --'JSP', -- earlier 'CST'
5224               p_visit_id         => p_visit_id,
5225               p_release_flag     => p_release_flag,
5226               p_orig_visit_id    => p_orig_visit_id,
5227               x_return_status    => l_return_status,
5228               x_msg_count        => l_msg_count,
5229               x_msg_data         => l_msg_data);
5230 
5231        IF (l_log_statement >= l_log_current_level)THEN
5232          fnd_log.string(l_log_statement,L_DEBUG_KEY, 'After calling Push_to_Production - l_return_status = '||l_return_status);
5233        END IF;
5234 
5235        IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
5236        -- Check Error Message stack.
5237          x_msg_count := FND_MSG_PUB.count_msg;
5238          IF (l_log_statement >= l_log_current_level)THEN
5239           fnd_log.string( l_log_statement,L_DEBUG_KEY, 'Errors from Push to Production: ' || x_msg_count );
5240          END IF;
5241          RAISE Fnd_Api.g_exc_error;
5242        END IF;
5243 
5244        IF (l_log_statement >= l_log_current_level)THEN
5245          fnd_log.string(l_log_statement,L_DEBUG_KEY, 'Before calling AHL_LTP_SIMUL_PLAN_PVT.delete_simul_visits');
5246        END IF;
5247 
5248        -- Delete simulated visits associated to this visit
5249        AHL_LTP_SIMUL_PLAN_PVT.delete_simul_visits
5250              (p_api_version        => l_api_version,
5251               p_init_msg_list      => p_init_msg_list,
5252               p_commit             => l_commit,
5253               p_validation_level   => p_validation_level,
5254               p_visit_id           => p_visit_id,
5255               x_return_status      => l_return_status,
5256               x_msg_count          => l_msg_count,
5257               x_msg_data           => l_msg_data);
5258 
5259        IF (l_log_statement >= l_log_current_level)THEN
5260          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);
5261        END IF;
5262 
5263        IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
5264        -- Check Error Message stack.
5265          x_msg_count := FND_MSG_PUB.count_msg;
5266          IF (l_log_statement >= l_log_current_level)THEN
5267           fnd_log.string( l_log_statement,L_DEBUG_KEY,'Errors from delete_simul_visits: '||x_msg_count);
5268          END IF;
5269          RAISE Fnd_Api.g_exc_error;
5270        END IF;
5271      END IF;
5272      -- Post 11.5.10
5273      -- RROY
5274      -- Standard check of p_commit
5275      IF FND_API.TO_BOOLEAN(p_commit) THEN
5276         COMMIT WORK;
5277      END IF;
5278 
5279      IF (l_log_procedure >= l_log_current_level)THEN
5280         fnd_log.string ( l_log_procedure,L_DEBUG_KEY ||'.end','At the end of PLSQL procedure');
5281      END IF;
5282 
5283 EXCEPTION
5284  WHEN FND_API.G_EXC_ERROR THEN
5285    x_return_status := FND_API.G_RET_STS_ERROR;
5286    ROLLBACK TO Release_Visit_Pvt;
5287    FND_MSG_PUB.count_and_get(p_count => x_msg_count,
5288                               p_data  => x_msg_data,
5289                               p_encoded => fnd_api.g_false);
5290 
5291 
5292  WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
5293    x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5294    ROLLBACK TO Release_Visit_Pvt;
5295    FND_MSG_PUB.count_and_get(p_count => x_msg_count,
5296                               p_data  => x_msg_data,
5297                               p_encoded => fnd_api.g_false);
5298 
5299 
5300  WHEN OTHERS THEN
5301     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5302     ROLLBACK TO Release_Visit_Pvt;
5303     IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
5304        fnd_msg_pub.add_exc_msg(p_pkg_name       => G_PKG_NAME,
5305                                p_procedure_name => 'Release_Visit',
5306                                p_error_text     => SUBSTR(SQLERRM,1,500));
5307     END IF;
5308     FND_MSG_PUB.count_and_get(p_count => x_msg_count,
5309                               p_data  => x_msg_data,
5310                               p_encoded => fnd_api.g_false);
5311 
5312 END Release_Visit;
5313 
5314 -------------------------------------------------------------------
5315 --  Procedure name    : Release_Tasks
5316 --  Type              : Private
5317 --  Function          : Validate the tasks and then push tasks to production
5318 --  Parameters  :
5319 --
5320 --  Standard IN  Parameters :
5321 --      p_api_version      IN  NUMBER        Required
5322 --      p_init_msg_list    IN  VARCHAR2      Default  FND_API.G_FALSE
5323 --      p_commit           IN  VARCHAR2      Default  FND_API.G_FALSE
5324 --      p_validation_level IN  NUMBER        Default  FND_API.G_VALID_LEVEL_FULL
5325 --
5326 --  Standard OUT Parameters :
5327 --      x_return_status    OUT VARCHAR2      Required
5328 --      x_msg_count        OUT NUMBER        Required
5329 --      x_msg_data         OUT VARCHAR2      Required
5330 --
5331 --  Parameters:
5332 --      p_visit_id         IN  NUMBER        Required
5333 --      p_release_flag     IN  VARCHAR2      Default  'N'
5334 --      p_tasks_tbl        IN  Task_Tbl_Type Required
5335 --
5336 --  Version :
5337 --      30 November, 2007  RNAHATA  Initial Version - 1.0
5338 -------------------------------------------------------------------
5339 PROCEDURE Release_Tasks(
5340     p_api_version      IN         NUMBER,
5341     p_init_msg_list    IN         VARCHAR2  := Fnd_Api.G_FALSE,
5342     p_commit           IN         VARCHAR2  := Fnd_Api.G_FALSE,
5343     p_validation_level IN         NUMBER    := Fnd_Api.G_VALID_LEVEL_FULL,
5344     p_module_type      IN         VARCHAR2  := Null,
5345     p_visit_id         IN         NUMBER,
5346     p_tasks_tbl        IN         Task_Tbl_Type,
5347     p_release_flag     IN         VARCHAR2  := 'N',
5348     x_return_status    OUT NOCOPY VARCHAR2,
5349     x_msg_count        OUT NOCOPY NUMBER,
5350     x_msg_data         OUT NOCOPY VARCHAR2)
5351 IS
5352     L_API_NAME           CONSTANT VARCHAR2(30)  := 'Release_Tasks';
5353     L_API_VERSION        CONSTANT NUMBER        := 1.0;
5354     L_DEBUG_KEY          CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
5355     l_msg_data                    VARCHAR2(2000);
5356     l_return_status               VARCHAR2(1);
5357     l_msg_count                   NUMBER;
5358     l_Error_Tbl_Type              Error_Tbl_Type;
5359     l_tasks_tbl                   Task_Tbl_Type;
5360     l_validate_visit              NUMBER:= 0;
5361     l_temp_msg_count              NUMBER:=0; --rnahata
5362 
5363     -- chk if the visit is valid
5364     CURSOR c_validate_visit (x_id IN NUMBER) IS
5365      SELECT 1 FROM AHL_VISITS_B
5366      WHERE VISIT_ID = x_id;
5367 
5368     -- chk if the visit is in partially released or planning status
5369     CURSOR c_visit_info (x_id IN NUMBER) IS
5370      SELECT start_date_time,status_code FROM AHL_VISITS_B
5371      WHERE VISIT_ID = x_id
5372      AND NVL(STATUS_CODE,'X') IN ('PARTIALLY RELEASED', 'PLANNING');
5373 
5374     c_visit_info_rec    c_visit_info%ROWTYPE;
5375 
5376   BEGIN
5377 
5378     IF (l_log_procedure >= l_log_current_level) THEN
5379       fnd_log.string(l_log_procedure,
5380                      L_DEBUG_KEY ||'.begin',
5381                      'At the start of PL SQL procedure. Visit Id = ' || p_visit_id ||
5382                      'p_tasks_tbl.COUNT = ' || p_tasks_tbl.COUNT);
5383     END IF;
5384 
5385     -- Standard start of API savepoint
5386     SAVEPOINT Release_Tasks_Pvt;
5387 
5388     -- Initialize message list if p_init_msg_list is set to TRUE
5389     IF FND_API.To_Boolean(p_init_msg_list) THEN
5390       FND_MSG_PUB.Initialize;
5391     END IF;
5392 
5393     -- Initialize API return status to success
5394     x_return_status := FND_API.G_RET_STS_SUCCESS;
5395 
5396     -- Standard call to check for call compatibility.
5397     IF NOT FND_API.COMPATIBLE_API_CALL(l_api_version,
5398                                        p_api_version,
5399                                        l_api_name,G_PKG_NAME)
5400     THEN
5401       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5402     END IF;
5403 
5404     --Check for required parameters
5405     IF (p_visit_id IS NOT NULL) THEN
5406 
5407        OPEN c_validate_visit(p_visit_id);
5408        FETCH c_validate_visit INTO l_validate_visit;
5409        CLOSE c_validate_visit;
5410 
5411        --Validate visit
5412        IF (nvl(l_validate_visit,0) = 0) THEN
5413           IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_error) THEN
5414              FND_MESSAGE.Set_Name(G_PM_PRODUCT_CODE,'AHL_VWP_INVALID_VST');
5415              FND_MESSAGE.SET_TOKEN('VISIT_ID', p_visit_id);
5416              FND_MSG_PUB.ADD;
5417           END IF;
5418           RAISE FND_API.G_EXC_ERROR;
5419        END IF;
5420 
5421        --Check if the visit is in planning or partially released status
5422        OPEN c_visit_info(p_visit_id);
5423        FETCH c_visit_info INTO c_visit_info_rec;
5424        IF c_visit_info%NOTFOUND THEN
5425           IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_error) THEN
5426              FND_MESSAGE.Set_Name(G_PM_PRODUCT_CODE,'AHL_VWP_VST_STATUS_INVALID');
5427              FND_MSG_PUB.ADD;
5428           END IF;
5429           CLOSE c_visit_info;
5430           RAISE FND_API.G_EXC_ERROR;
5431        END IF;
5432        CLOSE c_visit_info;
5433     --If visit_id is null
5434     ELSE
5435        IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_error) THEN
5436           FND_MESSAGE.Set_Name(G_PM_PRODUCT_CODE,'AHL_VWP_VISIT_NULL');
5437           FND_MSG_PUB.ADD;
5438        END IF;
5439        RAISE FND_API.G_EXC_ERROR;
5440     END IF;
5441 
5442     --No tasks selected
5443     IF (p_tasks_tbl.COUNT = 0) THEN
5444        IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_error) THEN
5445           FND_MESSAGE.Set_Name(G_PM_PRODUCT_CODE,'AHL_VWP_NO_TASK_SEL');
5446           FND_MSG_PUB.ADD;
5447        END IF;
5448        RAISE FND_API.G_EXC_ERROR;
5449     END IF;
5450 
5451     IF (l_log_statement >= l_log_current_level) THEN
5452        fnd_log.string(l_log_statement,
5453                       L_DEBUG_KEY,
5454                       'Before calling VALIDATE_BEFORE_PRODUCTION');
5455     END IF;
5456 
5457     --Validate visit before pushing the tasks to production
5458     AHL_VWP_PROJ_PROD_PVT.Validate_Before_Production
5459               (p_api_version      => l_api_version,
5460                p_init_msg_list    => p_init_msg_list,
5461                p_commit           => 'F',
5462                p_validation_level => p_validation_level,
5463                p_module_type      => p_module_type,
5464                p_visit_id         => p_visit_id,
5465                x_error_tbl        => l_error_tbl_type,
5466                x_return_status    => l_return_status,
5467                x_msg_count        => l_msg_count,
5468                x_msg_data         => l_msg_data);
5469 
5470     IF (l_log_statement >= l_log_current_level) THEN
5471        fnd_log.string(l_log_statement,
5472                       L_DEBUG_KEY,
5473                       'After calling VALIDATE_BEFORE_PRODUCTION, Return Status = ' ||
5474                       l_return_status);
5475     END IF;
5476 
5477     IF (l_return_status <> FND_API.G_RET_STS_SUCCESS OR l_error_tbl_type.COUNT > 0) THEN
5478        -- Check Error Message stack.
5479        x_msg_count := FND_MSG_PUB.count_msg;
5480        IF (l_log_statement >= l_log_current_level) THEN
5481           fnd_log.string(l_log_statement,
5482                          L_DEBUG_KEY,
5483                          'Errors from VALIDATE_BEFORE_PRODUCTION. Message count: ' || x_msg_count);
5484        END IF;
5485        IF l_return_status = FND_API.G_RET_STS_ERROR THEN
5486           RAISE FND_API.G_EXC_ERROR;
5487        ELSE
5488           RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5489        END IF;
5490     END IF;
5491 
5492     IF (l_log_statement >= l_log_current_level) THEN
5493        fnd_log.string(l_log_statement,
5494                       L_DEBUG_KEY,
5495                       'Before calling VALIDATE_TASKS_BEF_PRODUCTION. p_module_type = ' || p_module_type);
5496     END IF;
5497 
5498     --Validate tasks before push to production happens
5499     AHL_VWP_PROJ_PROD_PVT.Validate_tasks_bef_production(
5500               p_visit_id        => p_visit_id,
5501               p_tasks_tbl       => p_tasks_tbl,
5502               x_tasks_tbl       => l_tasks_tbl,
5503               x_return_status   => l_return_status,
5504               x_msg_count       => l_msg_count,
5505               x_msg_data        => l_msg_data);
5506 
5507     IF (l_log_statement >= l_log_current_level) THEN
5508        fnd_log.string(l_log_statement,
5509                       L_DEBUG_KEY,
5510                       'After calling VALIDATE_TASKS_BEF_PRODUCTION. Records in l_tasks_tbl: ' ||
5511                       l_tasks_tbl.COUNT|| ', Return Status = ' || l_return_status);
5512     END IF;
5513 
5514     IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
5515        -- Check Error Message stack.
5516        x_msg_count := FND_MSG_PUB.count_msg;
5517 
5518        IF (l_log_statement >= l_log_current_level) THEN
5519           fnd_log.string(l_log_statement,
5520                          L_DEBUG_KEY,
5521                          'Errors from VALIDATE_TASKS_BEF_PRODUCTION. Message count: ' || x_msg_count);
5522        END IF;
5523 
5524        IF l_return_status = FND_API.G_RET_STS_ERROR THEN
5525           RAISE FND_API.G_EXC_ERROR;
5526        ELSE
5527           RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5528        END IF;
5529     END IF;  -- l_return_status <> FND_API.G_RET_STS_SUCCESS
5530 
5531     IF (l_log_statement >= l_log_current_level) THEN
5532         fnd_log.string(l_log_statement,
5533                        L_DEBUG_KEY,
5534                        'Before calling AGGREGATE_TASK_MATERIAL_REQRS ');
5535     END IF;
5536 
5537     --Total the material requirements for a specific item at task level
5538     FOR i IN l_tasks_tbl.FIRST..l_tasks_tbl.LAST
5539     LOOP
5540        AHL_VWP_PROJ_PROD_PVT.Aggregate_Task_Material_Reqrs
5541            (  p_api_version      => p_api_version,
5542               p_init_msg_list    => p_init_msg_list,
5543               p_commit           => p_commit,
5544               p_validation_level => p_validation_level,
5545               p_module_type      => p_module_type,
5546               p_task_id          => l_tasks_tbl(i).visit_task_id,
5547               p_rel_tsk_flag     => 'Y',
5548               x_return_status    => l_return_status,
5549               x_msg_count        => l_msg_count,
5550               x_msg_data         => l_msg_data
5551            );
5552 
5553        IF (l_log_statement >= l_log_current_level) THEN
5554           fnd_log.string(l_log_statement,
5555                          L_DEBUG_KEY,
5556                          'After calling AGGREGATE_TASK_MATERIAL_REQRS for Task Id: ' ||
5557                          l_tasks_tbl(i).visit_task_id || '. Return Status = '|| l_return_status);
5558        END IF;
5559 
5560        IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
5561           x_msg_count := FND_MSG_PUB.count_msg;
5562           IF (l_log_statement >= l_log_current_level) THEN
5563              fnd_log.string(l_log_statement,
5564                             L_DEBUG_KEY,
5565                             'Errors from AGGREGATE_TASK_MATERIAL_REQRS. Message count: ' || x_msg_count);
5566           END IF;
5567           IF l_return_status = FND_API.G_RET_STS_ERROR THEN
5568              RAISE FND_API.G_EXC_ERROR;
5569           ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
5570              RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5571           END IF;
5572        END IF;
5573     END LOOP;
5574 
5575     --for paritally implemented visits adjust the task times
5576     IF (c_visit_info_rec.start_date_time < SYSDATE and c_visit_info_rec.status_code = 'PARTIALLY RELEASED') THEN
5577 
5578       IF (l_log_statement >= l_log_current_level) THEN
5579          fnd_log.string(l_log_statement,
5580                         L_DEBUG_KEY,
5581                         'Before calling ADJUST_TASK_TIMES ');
5582       END IF;
5583 
5584       FOR i IN l_tasks_tbl.FIRST..l_tasks_tbl.LAST
5585       LOOP
5586           AHL_VWP_TIMES_PVT.adjust_task_times
5587              (p_api_version        => l_api_version,
5588               p_init_msg_list      => p_init_msg_list,
5589               p_commit             => 'F',
5590               p_validation_level   => p_validation_level,
5591               p_task_id            => l_tasks_tbl(i).visit_task_id,
5592               p_reset_sysdate_flag => FND_API.G_TRUE,
5593               x_return_status      => l_return_status,
5594               x_msg_count          => l_msg_count,
5595               x_msg_data           => l_msg_data
5596            );
5597 
5598           IF (l_log_statement >= l_log_current_level) THEN
5599              fnd_log.string(l_log_statement,
5600                             L_DEBUG_KEY,
5601                             'After calling ADJUST_TASK_TIMES for task Id ' ||
5602                             l_tasks_tbl(i).visit_task_id ||'. Return Status = '|| l_return_status);
5603           END IF;
5604 
5605           IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
5606              x_msg_count := FND_MSG_PUB.count_msg;
5607              IF (l_log_statement >= l_log_current_level) THEN
5608                fnd_log.string(l_log_statement,
5609                               L_DEBUG_KEY,
5610                               'Errors from ADJUST_TASK_TIMES. Message count: ' || x_msg_count);
5611              END IF;
5612              IF l_return_status = FND_API.G_RET_STS_ERROR THEN
5613                 RAISE FND_API.G_EXC_ERROR;
5614              ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
5615                 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5616              END IF;
5617           END IF;
5618         END LOOP;
5619     END IF; --partially released
5620 
5621     l_temp_msg_count := Fnd_Msg_Pub.count_msg;
5622 
5623     --Validate the MR/Route dates for all the tasks
5624     FOR i IN l_tasks_tbl.FIRST..l_tasks_tbl.LAST
5625     LOOP
5626         IF (l_log_statement >= l_log_current_level) THEN
5627            fnd_log.string(l_log_statement,
5628                           L_DEBUG_KEY,
5629                           'Before calling VALIDATE_MR_ROUTE_DATE. l_msg_count = ' || l_msg_count);
5630         END IF;
5631 
5632         Validate_MR_Route_Date
5633         (
5634            p_mr_route_id       => l_tasks_tbl(i).MR_Route_Id,
5635            p_visit_task_number => l_tasks_tbl(i).VISIT_TASK_NUMBER,
5636            p_start_date_time   => l_tasks_tbl(i).TASK_START_DATE,
5637            p_end_date_time     => l_tasks_tbl(i).TASK_END_DATE
5638         );
5639 
5640         IF (l_log_statement >= l_log_current_level) THEN
5641            fnd_log.string(l_log_statement,L_DEBUG_KEY,
5642            'After calling VALIDATE_MR_ROUTE_DATE for task Id: ' ||l_tasks_tbl(i).visit_task_id || ' and l_msg_count - ' || l_msg_count);
5643         END IF;
5644     END LOOP;
5645 
5646     l_msg_count := Fnd_Msg_Pub.count_msg;
5647     IF (l_msg_count <> l_temp_msg_count) THEN
5648        IF (l_log_statement >= l_log_current_level) THEN
5649           fnd_log.string(l_log_statement,L_DEBUG_KEY,
5650                          'Errors from VALIDATE_MR_ROUTE_DATE. Message count: ' || l_msg_count);
5651        END IF;
5652        RAISE FND_API.G_EXC_ERROR;
5653     END IF;
5654 
5655     IF (l_log_statement >= l_log_current_level) THEN
5656        fnd_log.string(l_log_statement,
5657                       L_DEBUG_KEY,
5658                       'Before calling PUSH_TASKS_TO_PRODUCTION for visit id: ' ||p_visit_id);
5659     END IF;
5660 
5661     --push the selected tasks to production
5662     AHL_VWP_PROJ_PROD_PVT.Push_tasks_to_production
5663     ( p_api_version      => l_api_version,
5664       p_init_msg_list    => p_init_msg_list,
5665       p_validation_level => p_validation_level,
5666       p_module_type      => p_module_type,
5667       p_visit_id         => p_visit_id,
5668       p_tasks_tbl        => l_tasks_tbl,
5669       p_release_flag     => p_release_flag,
5670       x_return_status    => l_return_status,
5671       x_msg_count        => l_msg_count,
5672       x_msg_data         => l_msg_data
5673     );
5674 
5675     IF (l_log_statement >= l_log_current_level) THEN
5676        fnd_log.string(l_log_statement,
5677                       L_DEBUG_KEY,
5678                       'After calling PUSH_TASKS_TO_PRODUCTION. Return Status = '|| l_return_status);
5679     END IF;
5680 
5681     IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
5682        x_msg_count := FND_MSG_PUB.count_msg;
5683        IF (l_log_statement >= l_log_current_level) THEN
5684           fnd_log.string(l_log_statement,
5685                          L_DEBUG_KEY,
5686                          'Errors from PUSH_TASKS_TO_PRODUCTION. Message count: ' || x_msg_count);
5687        END IF;
5688        IF l_return_status = FND_API.G_RET_STS_ERROR THEN
5689           RAISE FND_API.G_EXC_ERROR;
5690        ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
5691           RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5692        END IF;
5693     END IF;
5694 
5695     IF (l_log_statement >= l_log_current_level) THEN
5696        fnd_log.string(l_log_statement,
5697                       L_DEBUG_KEY,
5698                       'Before calling DELETE_SIMUL_VISITS for visit id: ' ||p_visit_id);
5699     END IF;
5700 
5701     -- Delete the simulated visits
5702      AHL_LTP_SIMUL_PLAN_PVT.delete_simul_visits
5703            (p_api_version      => l_api_version,
5704             p_init_msg_list    => p_init_msg_list,
5705             p_commit           => 'F',
5706             p_validation_level => p_validation_level,
5707             p_visit_id         => p_visit_id,
5708             x_return_status    => l_return_status,
5709             x_msg_count        => l_msg_count,
5710             x_msg_data         => l_msg_data);
5711 
5712     IF (l_log_statement >= l_log_current_level) THEN
5713        fnd_log.string(l_log_statement,
5714                       L_DEBUG_KEY,
5715                       'After calling DELETE_SIMUL_VISITS for visit id ' ||p_visit_id||'. Return Status = '|| l_return_status);
5716     END IF;
5717 
5718     IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
5719        x_msg_count := FND_MSG_PUB.count_msg;
5720        IF (l_log_statement >= l_log_current_level) THEN
5721            fnd_log.string(l_log_statement,
5722                           L_DEBUG_KEY,
5723                           'Errors from DELETE_SIMUL_TASKS. Message count: ' || x_msg_count);
5724        END IF;
5725        IF l_return_status = FND_API.G_RET_STS_ERROR THEN
5726           RAISE FND_API.G_EXC_ERROR;
5727        ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
5728           RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5729        END IF;
5730     END IF;
5731 
5732     -- Standard check of p_commit
5733     IF FND_API.TO_BOOLEAN(p_commit) THEN
5734        COMMIT WORK;
5735     END IF;
5736 
5737     Fnd_Msg_Pub.count_and_get(
5738           p_encoded => Fnd_Api.g_false,
5739           p_count   => x_msg_count,
5740           p_data    => x_msg_data
5741     );
5742 
5743     IF (l_log_procedure >= l_log_current_level) THEN
5744         fnd_log.string(l_log_procedure,
5745                        L_DEBUG_KEY||'.end',
5746                        'At the end of PLSQL procedure. Return Status = ' || x_return_status);
5747     END IF;
5748 
5749   EXCEPTION
5750     WHEN  FND_API.G_EXC_ERROR THEN
5751        x_return_status := FND_API.G_RET_STS_ERROR;
5752        ROLLBACK TO Release_Tasks_Pvt;
5753        FND_MSG_PUB.count_and_get(p_count => x_msg_count,
5754                                p_data  => x_msg_data,
5755                                p_encoded => fnd_api.g_false);
5756 
5757     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
5758        x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
5759        ROLLBACK TO Release_Tasks_Pvt;
5760        Fnd_Msg_Pub.count_and_get (
5761              p_encoded => Fnd_Api.g_false,
5762              p_count   => x_msg_count,
5763              p_data    => x_msg_data);
5764 
5765     WHEN OTHERS THEN
5766        x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5767        ROLLBACK TO Release_Tasks_Pvt;
5768        IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
5769           fnd_msg_pub.add_exc_msg(p_pkg_name       => G_PKG_NAME,
5770                                   p_procedure_name => 'Release_Tasks',
5771                                   p_error_text     => SUBSTR(SQLERRM,1,500));
5772        END IF;
5773        FND_MSG_PUB.count_and_get(p_count => x_msg_count,
5774                                  p_data  => x_msg_data,
5775                                  p_encoded => fnd_api.g_false);
5776 
5777 END Release_Tasks;
5778 
5779 ------------------------------------------------------------------
5780 --  Procedure name : Validate_tasks_bef_production
5781 --  Type           : Private
5782 --  Function       : Validate the tasks before pushing the tasks to prodn.
5783 --  Parameters     :
5784 --
5785 --  Standard OUT Parameters :
5786 --      x_return_status OUT  VARCHAR2      Required
5787 --      x_msg_count     OUT  NUMBER        Required
5788 --      x_msg_data      OUT  VARCHAR2      Required
5789 --
5790 --  Validate_tasks_bef_production Parameters:
5791 --       p_visit_id     IN   NUMBER        Required
5792 --       p_tasks_tbl    IN   Task_Tbl_Type Required
5793 --       x_tasks_tbl    OUT  Task_Tbl_Type Required
5794 --
5795 --  Version :
5796 --      30 November, 2007  RNAHATA  Initial Version - 1.0
5797 -------------------------------------------------------------------
5798 
5799 PROCEDURE Validate_tasks_bef_production(
5800     p_visit_id      IN         NUMBER,
5801     p_tasks_tbl     IN         Task_Tbl_Type,
5802     x_tasks_tbl     OUT NOCOPY Task_Tbl_Type,
5803     x_return_status OUT NOCOPY VARCHAR2,
5804     x_msg_count     OUT NOCOPY NUMBER,
5805     x_msg_data      OUT NOCOPY VARCHAR2
5806 ) IS
5807 
5808 --cursor to fetch the details of the tasks that have been pushe to production
5809 CURSOR c_task_dtls(x_vst_task_id IN NUMBER) IS
5810 SELECT  mr_id,visit_id,visit_task_id,status_code,task_type_code,nvl(originating_task_id,0) as originating_task_id,
5811         summary_task_flag, inventory_item_id,item_organization_id,visit_task_number,end_date_time
5812 FROM  ahl_visit_tasks_b
5813 WHERE visit_task_id = x_vst_task_id
5814 AND   NVL(status_code,'X') in ('PLANNING')
5815 order by visit_task_id;
5816 
5817 c_tsk_dtls_rec  c_task_dtls%ROWTYPE;
5818 
5819 --cursor to fetch the summary task id of the planned/unplanned task
5820 CURSOR c_summary_tsk_dtl (x_originating_tsk_id IN NUMBER) IS
5821  SELECT mr_id,visit_id,visit_task_id,status_code,task_type_code,nvl(originating_task_id,0) as originating_task_id,
5822          summary_task_flag, inventory_item_id,item_organization_id,visit_task_number,end_date_time
5823  FROM ahl_visit_tasks_b
5824 WHERE visit_task_id = x_originating_tsk_id
5825   AND   NVL(status_code,'X') in ('PLANNING')
5826   AND   task_type_code = 'SUMMARY';
5827 
5828 c_summary_tsk_rec c_summary_tsk_dtl%ROWTYPE;
5829 
5830 --cursor to fetch master work order for the visit
5831 CURSOR c_fet_master_wo  (x_visit_id IN NUMBER) IS
5832  SELECT wo.workorder_id, wo.status_code, wip.scheduled_start_date,wip.scheduled_completion_date
5833  FROM ahl_visits_b v, ahl_workorders wo, wip_discrete_jobs wip
5834 WHERE v.visit_id = x_visit_id
5835   AND NVL(v.status_code,'X') = 'PARTIALLY RELEASED'
5836   AND v.visit_id = wo.visit_id
5837   AND wo.visit_task_id IS NULL
5838   AND wo.master_workorder_flag = 'Y'
5839   AND wip.wip_entity_id = wo.wip_entity_id
5840   AND wo.STATUS_CODE not in ('22','7');
5841 
5842 c_mst_wo_visit_rec  c_fet_master_wo%ROWTYPE;
5843 
5844 -- Get all the Parent Task Dependencies.
5845 CURSOR get_parent_task_dependencies (x_vst_task_id IN NUMBER) IS
5846  SELECT P.visit_task_number , P.visit_task_id
5847  FROM   ahl_visit_tasks_b P,
5848         ahl_task_links L
5849  WHERE  P.visit_task_id = L.parent_task_id
5850 AND    L.visit_task_id = x_vst_task_id;
5851 
5852 -- Get all the Child Task Dependencies.
5853 CURSOR get_child_task_dependencies (x_vst_task_id IN NUMBER) IS
5854  SELECT C.visit_task_number ,C.visit_task_id
5855  FROM   ahl_visit_tasks_b C,
5856         ahl_task_links L
5857  WHERE  C.visit_task_id = L.visit_task_id
5858 AND    L.parent_task_id = x_vst_task_id;
5859 
5860 c_par_tech_dep_rec  get_parent_task_dependencies%ROWTYPE;
5861 c_ch_tech_dep_rec   get_child_task_dependencies%ROWTYPE;
5862 
5863 /*cursor to fetch all the child MR's/tasks for the summary MR to ensure all the dtl tasks are pushed to production*/
5864 CURSOR c_dtl_task_sum (x_vst_task_id IN NUMBER) IS
5865 select mr_id,visit_id,visit_task_id,status_code,task_type_code,nvl(originating_task_id,0) as originating_task_id,
5866         summary_task_flag, inventory_item_id,item_organization_id,visit_task_number,end_date_time
5867 FROM ahl_visit_tasks_b
5868 WHERE NVL(status_code,'X') in ('PLANNING')
5869 START WITH visit_task_id = x_vst_task_id
5870 CONNECT BY originating_task_id = PRIOR visit_task_id
5871 order by visit_id,visit_task_id,mr_id;
5872 
5873 c_dtl_task_sum_rec    c_dtl_task_sum%ROWTYPE;
5874 
5875 j                      NUMBER := 0;
5876 K                      NUMBER := 0;
5877 m                      NUMBER := 0;
5878 L_API_NAME    CONSTANT VARCHAR2(30)  := 'Validate_tasks_bef_production';
5879 L_DEBUG_KEY   CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
5880 lp_originating_task_id ahl_visit_tasks_vl.originating_task_id%TYPE;
5881 curr_task              BOOLEAN := FALSE;
5882 parent_task            BOOLEAN := FALSE;
5883 parent_task_found_flag BOOLEAN := FALSE;
5884 child_task             BOOLEAN := FALSE;
5885 
5886 BEGIN
5887    IF (l_log_procedure >= l_log_current_level) THEN
5888        fnd_log.string(l_log_procedure,
5889                       L_DEBUG_KEY ||'.begin',
5890                       'At the start of PL SQL procedure. Visit Id = ' ||
5891                       p_visit_id || ', p_tasks_tbl.COUNT = ' || p_tasks_tbl.COUNT);
5892     END IF;
5893 
5894     -- Standard start of API savepoint
5895     SAVEPOINT Validate_tasks_bef_prodn_pvt;
5896 
5897     -- Initialize API return status to success
5898     x_return_status := FND_API.G_RET_STS_SUCCESS;
5899 
5900     --chk if the visit is released/partially released.
5901     OPEN c_fet_master_wo (p_visit_id);
5902     FETCH c_fet_master_wo INTO c_mst_wo_visit_rec;
5903     IF c_fet_master_wo%NOTFOUND THEN
5904        x_msg_count := FND_MSG_PUB.count_msg;
5905        IF (l_log_statement >= l_log_current_level) THEN
5906           fnd_log.string(l_log_statement,
5907                         L_DEBUG_KEY,
5908                         'Visit not released: ' || c_tsk_dtls_rec.visit_task_number);
5909        END IF;
5910     END IF;
5911     CLOSE c_fet_master_wo;
5912 
5913     FOR i IN p_tasks_tbl.FIRST..p_tasks_tbl.LAST
5914     LOOP
5915         OPEN c_task_dtls(p_tasks_tbl(i).visit_task_id);
5916         FETCH c_task_dtls INTO c_tsk_dtls_rec;
5917         IF c_task_dtls%NOTFOUND THEN
5918            x_msg_count := FND_MSG_PUB.count_msg;
5919            IF (l_log_statement >= l_log_current_level) THEN
5920               fnd_log.string(l_log_statement,
5921                              L_DEBUG_KEY,
5922                              'Task is either not in planning status or Invalid - ' ||
5923                              p_tasks_tbl(i).visit_task_id);
5924            END IF;
5925            CLOSE c_task_dtls;
5926            FND_MESSAGE.Set_Name(G_PM_PRODUCT_CODE,'AHL_VWP_INVALID_TSK_ID');
5927            Fnd_Message.SET_TOKEN('TASK_ID', p_tasks_tbl(i).visit_task_id);
5928            FND_MSG_PUB.ADD;
5929            RAISE FND_API.G_EXC_ERROR;
5930         END IF;
5931         CLOSE c_task_dtls;
5932 
5933         /* if the visit is partially released, then the planned end time for the wo should not be
5934         exceed the scheduled end time */
5935         IF (c_mst_wo_visit_rec.scheduled_completion_date IS NOT NULL) AND
5936             (c_tsk_dtls_rec.end_date_time > c_mst_wo_visit_rec.scheduled_completion_date) THEN
5937             x_msg_count := FND_MSG_PUB.count_msg;
5938             IF (l_log_statement >= l_log_current_level) THEN
5939                 fnd_log.string(l_log_statement,
5940                                L_DEBUG_KEY,
5941                                'Planned end time of the task is exceeding the scheduled completion time of the master WO: ' ||
5942                                c_tsk_dtls_rec.visit_task_number);
5943             END IF;
5944             FND_MESSAGE.SET_NAME(G_PM_PRODUCT_CODE,'AHL_VWP_PET_EXCD_SCT');
5945             FND_MSG_PUB.ADD;
5946             RAISE FND_API.G_EXC_ERROR;
5947           END IF;
5948 
5949         parent_task_found_flag := FALSE;
5950         /*when the summary task is selected then all child tasks/child mr's for the summary tasks/MR will be pushed to prodn.
5951         Fetches only summary tasks of MR's and not the manually added summary tasks.*/
5952 
5953         IF (c_tsk_dtls_rec.task_type_code IN ('SUMMARY') AND c_tsk_dtls_rec.summary_task_flag = 'N') THEN
5954 
5955            IF (x_tasks_tbl.COUNT > 0) THEN
5956               FOR m IN x_tasks_tbl.FIRST..x_tasks_tbl.LAST
5957               LOOP
5958                 IF x_tasks_tbl(m).visit_task_id = c_tsk_dtls_rec.visit_task_id THEN
5959                    parent_task_found_flag := TRUE;
5960                    EXIT;
5961                 END IF;
5962               END LOOP;
5963            END IF;
5964 
5965            --inserts only if the summary task is not inserted already.
5966            IF NOT(parent_task_found_flag) THEN
5967               --this cursor fetches entire family tree of the selected MR with its children to be inserted.
5968               OPEN  c_dtl_task_sum(c_tsk_dtls_rec.visit_task_id);
5969               LOOP
5970                  FETCH c_dtl_task_sum INTO c_dtl_task_sum_rec;
5971                  EXIT WHEN c_dtl_task_sum%NOTFOUND;
5972                  --populating the output table with all the child parent MR's/tasks
5973                  j := j + 1;
5974                  x_tasks_tbl(j).visit_id             := c_dtl_task_sum_rec.visit_id;
5975                  x_tasks_tbl(j).visit_task_id        := c_dtl_task_sum_rec.visit_task_id;
5976                  x_tasks_tbl(j).inventory_item_id    := c_dtl_task_sum_rec.inventory_item_id;
5977                  x_tasks_tbl(j).item_organization_id := c_dtl_task_sum_rec.item_organization_id;
5978                  x_tasks_tbl(j).mr_id                := c_dtl_task_sum_rec.mr_id;
5979                  x_tasks_tbl(j).task_type_code       := c_dtl_task_sum_rec.task_type_code;
5980                  x_tasks_tbl(j).task_status_code     := c_dtl_task_sum_rec.status_code;
5981                  x_tasks_tbl(j).originating_task_id  := c_dtl_task_sum_rec.originating_task_id;
5982                  x_tasks_tbl(j).visit_task_number    := c_dtl_task_sum_rec.visit_task_number;
5983               END LOOP;
5984               CLOSE c_dtl_task_sum;
5985            END IF;
5986         END IF;
5987 
5988       /*for each planned/unplanned/summary task ensure that the parent MR/task is selected.If not then throw
5989       an error message to the user asking him to select the parent MR*/
5990       IF (c_tsk_dtls_rec.task_type_code IN ('PLANNED','UNPLANNED', 'SUMMARY')) AND (c_tsk_dtls_rec.originating_task_id <> 0) THEN
5991 
5992         --loop back to the parent MR to ensure that the child tasks/MR is also selected
5993         lp_originating_task_id := c_tsk_dtls_rec.originating_task_id;
5994 
5995         LOOP
5996           parent_task_found_flag := FALSE;
5997 
5998           --this cursor fetches the parent for each task
5999           OPEN c_summary_tsk_dtl(lp_originating_task_id);
6000           FETCH c_summary_tsk_dtl INTO c_summary_tsk_rec;
6001           CLOSE c_summary_tsk_dtl;
6002 
6003           --locate the summary task from the selected task list
6004           FOR k IN p_tasks_tbl.FIRST..p_tasks_tbl.LAST
6005           LOOP
6006             --chk if the summary task for the task is also selected
6007             IF p_tasks_tbl(k).visit_task_id = c_summary_tsk_rec.visit_task_id THEN
6008                parent_task_found_flag := TRUE;
6009                EXIT;
6010             END IF;
6011           END LOOP;
6012 
6013           IF NOT(parent_task_found_flag) THEN --if summary task is not selected then throw an error
6014                 x_msg_count := FND_MSG_PUB.count_msg;
6015                 IF (l_log_statement >= l_log_current_level) THEN
6016                    fnd_log.string(l_log_statement,
6017                                   L_DEBUG_KEY,
6018                                   'Select the summary task for the task: ' ||
6019                                   c_tsk_dtls_rec.visit_task_number);
6020                 END IF;
6021                 FND_MESSAGE.Set_Name(G_PM_PRODUCT_CODE,'AHL_VWP_SEL_SUM_TSK');
6022                 Fnd_Message.SET_TOKEN('TASK_NUMBER', c_tsk_dtls_rec.visit_task_number);
6023                 FND_MSG_PUB.ADD;
6024                 RAISE FND_API.G_EXC_ERROR;
6025           END IF;
6026 
6027           lp_originating_task_id := c_summary_tsk_rec.originating_task_id;
6028 
6029           EXIT WHEN NVL(lp_originating_task_id,0) = 0;
6030         END LOOP;
6031 
6032       END IF; --planned/unplanned tasks
6033 
6034       IF ((c_tsk_dtls_rec.task_type_code = 'UNASSOCIATED') OR
6035           (c_tsk_dtls_rec.task_type_code = 'SUMMARY' AND c_tsk_dtls_rec.summary_task_flag = 'Y')) THEN
6036             j := j + 1;
6037             x_tasks_tbl(j).visit_id             := c_tsk_dtls_rec.visit_id;
6038             x_tasks_tbl(j).visit_task_id        := c_tsk_dtls_rec.visit_task_id;
6039             x_tasks_tbl(j).inventory_item_id    := c_tsk_dtls_rec.inventory_item_id;
6040             x_tasks_tbl(j).item_organization_id := c_tsk_dtls_rec.item_organization_id;
6041             x_tasks_tbl(j).mr_id                := c_tsk_dtls_rec.mr_id;
6042             x_tasks_tbl(j).task_type_code       := c_tsk_dtls_rec.task_type_code;
6043             x_tasks_tbl(j).task_status_code     := c_tsk_dtls_rec.status_code;
6044             x_tasks_tbl(j).originating_task_id  := c_tsk_dtls_rec.originating_task_id;
6045       END IF; --unassociated/summary
6046 
6047     END LOOP; --for all selected tasks
6048 
6049     -- chk for each task which has a technical dependency with other MR's or unassociated tasks
6050     FOR i IN x_tasks_tbl.FIRST..x_tasks_tbl.LAST
6051     LOOP
6052       parent_task := FALSE;
6053       child_task := FALSE;
6054 
6055       OPEN get_parent_task_dependencies (x_tasks_tbl(i).visit_task_id);
6056       LOOP
6057         FETCH get_parent_task_dependencies INTO c_par_tech_dep_rec;
6058         IF get_parent_task_dependencies%NOTFOUND THEN
6059           x_msg_count := FND_MSG_PUB.count_msg;
6060           IF (l_log_statement >= l_log_current_level) THEN
6061              fnd_log.string(l_log_statement,
6062                             L_DEBUG_KEY,
6063                             'Parent Technical task dependency not found for the task - ' ||
6064                             x_tasks_tbl(i).visit_task_number);
6065           END IF;
6066           EXIT;
6067         ELSE --when parent dependency is found chk if the associated MR/unassociated tasks are also selected.
6068           FOR j IN x_tasks_tbl.FIRST..x_tasks_tbl.LAST
6069           LOOP
6070             IF (x_tasks_tbl(j).visit_task_id = c_par_tech_dep_rec.visit_task_id) THEN
6071                parent_task := TRUE;
6072                EXIT;
6073             END IF;
6074           END LOOP;
6075 
6076           IF NOT(parent_task) THEN --parent task not selected
6077             x_msg_count := FND_MSG_PUB.count_msg;
6078             IF (l_log_statement >= l_log_current_level) THEN
6079                fnd_log.string(l_log_statement,
6080                               L_DEBUG_KEY,
6081                               'Parent tasks on which the task ' ||
6082                               x_tasks_tbl(i).visit_task_number ||
6083                               ' is technically dependent has not been selected.'||
6084                               'Please select the technically dependent tasks too');
6085             END IF;
6086             CLOSE get_parent_task_dependencies;
6087             FND_MESSAGE.Set_Name(G_PM_PRODUCT_CODE,'AHL_VWP_SEL_TECH_DEP');
6088             Fnd_Message.SET_TOKEN('TASK_NUMBER', x_tasks_tbl(i).visit_task_number);
6089             FND_MSG_PUB.ADD;
6090             RAISE FND_API.G_EXC_ERROR;
6091           END IF; --parent task not selected
6092         END IF;
6093       END LOOP; --loop through the parent dependent records
6094       CLOSE get_parent_task_dependencies;
6095 
6096       OPEN get_child_task_dependencies (x_tasks_tbl(i).visit_task_id);
6097       LOOP --loop through the child dependent records
6098         FETCH get_child_task_dependencies INTO c_ch_tech_dep_rec;
6099         IF get_child_task_dependencies%NOTFOUND THEN
6100            x_msg_count := FND_MSG_PUB.count_msg;
6101            IF (l_log_statement >= l_log_current_level) THEN
6102               fnd_log.string(l_log_statement,
6103                              L_DEBUG_KEY,
6104                              'Child Technical task dependency not found for the task - ' || x_tasks_tbl(i).visit_task_number);
6105            END IF;
6106            EXIT;
6107         ELSE --when child dependency is found chk if the associated MR/unassociated tasks are also selected.
6108            FOR j IN x_tasks_tbl.FIRST..x_tasks_tbl.LAST
6109            LOOP
6110              IF (x_tasks_tbl(j).visit_task_id = c_ch_tech_dep_rec.visit_task_id) THEN
6111                 child_task := TRUE;
6112                 EXIT;
6113              END IF;
6114            END LOOP;
6115 
6116            IF NOT(child_task) THEN
6117               x_msg_count := FND_MSG_PUB.count_msg;
6118               IF (l_log_statement >= l_log_current_level) THEN
6119                  fnd_log.string(l_log_statement,
6120                                 L_DEBUG_KEY,
6121                                 'Child tasks on which the task ' || x_tasks_tbl(i).visit_task_number || ' is technically dependent has not been selected.'||
6122                                 'Please select the technically dependent tasks too');
6123               END IF;
6124               CLOSE get_child_task_dependencies;
6125               FND_MESSAGE.Set_Name(G_PM_PRODUCT_CODE,'AHL_VWP_SEL_TECH_DEP');
6126               Fnd_Message.SET_TOKEN('TASK_NUMBER', x_tasks_tbl(i).visit_task_number);
6127               FND_MSG_PUB.ADD;
6128               RAISE FND_API.G_EXC_ERROR;
6129            END IF; --curr task not selected
6130         END IF;
6131       END LOOP; --loop through the child dependent records
6132       CLOSE get_child_task_dependencies;
6133 
6134     END LOOP;
6135 
6136    IF (l_log_procedure >= l_log_current_level) THEN
6137       fnd_log.string(l_log_procedure,
6138                      L_DEBUG_KEY ||'.end',
6139                      'At the end of PL SQL procedure. x_tasks_tbl.COUNT = ' || x_tasks_tbl.COUNT);
6140    END IF;
6141 
6142   EXCEPTION
6143   WHEN  FND_API.G_EXC_ERROR THEN
6144     x_return_status := FND_API.G_RET_STS_ERROR;
6145     ROLLBACK TO Validate_tasks_bef_prodn_pvt;
6146     FND_MSG_PUB.count_and_get(p_count => x_msg_count,
6147                               p_data  => x_msg_data,
6148                               p_encoded => fnd_api.g_false);
6149 
6150   WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
6151     x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
6152     ROLLBACK TO Validate_tasks_bef_prodn_pvt;
6153     Fnd_Msg_Pub.count_and_get (
6154             p_encoded => Fnd_Api.g_false,
6155             p_count   => x_msg_count,
6156             p_data    => x_msg_data);
6157 
6158   WHEN OTHERS THEN
6159     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6160     ROLLBACK TO Validate_tasks_bef_prodn_pvt;
6161     IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
6162        fnd_msg_pub.add_exc_msg(p_pkg_name       => G_PKG_NAME,
6163                                p_procedure_name => 'Validate_tasks_bef_production',
6164                                p_error_text     => SUBSTR(SQLERRM,1,500));
6165     END IF;
6166     FND_MSG_PUB.count_and_get(p_count => x_msg_count,
6167                                p_data  => x_msg_data,
6168                                p_encoded => fnd_api.g_false);
6169 
6170 END Validate_tasks_bef_production;
6171 
6172 -------------------------------------------------------------------
6173 --  Procedure name    : Push_tasks_to_production
6174 --  Type              : Private
6175 --  Function          : Push the selected tasks to production.
6176 --  Parameters  :
6177 --
6178 --  Standard IN  Parameters :
6179 --      p_api_version      IN  NUMBER        Required
6180 --      p_init_msg_list    IN  VARCHAR2      Default  FND_API.G_FALSE
6181 --      p_validation_level IN  NUMBER        Default  FND_API.G_VALID_LEVEL_FULL
6182 --      p_module_type      IN  VARCHAR2      Default  Null
6183 --
6184 --  Standard OUT Parameters :
6185 --      x_return_status    OUT VARCHAR2      Required
6186 --      x_msg_count        OUT NUMBER        Required
6187 --      x_msg_data         OUT VARCHAR2      Required
6188 --
6189 --  Push_tasks_to_production Parameters:
6190 --       p_module_type     IN  VARCHAR2      Default = NULL
6191 --       p_visit_id        IN  NUMBER        Required
6192 --       p_tasks_tbl       IN  Task_Tbl_Type Required
6193 --       p_release_flag    IN  VARCHAR2      Default = 'N'
6194 --
6195 --  Version :
6196 --      30 November, 2007  RNAHATA  Initial Version - 1.0
6197 -------------------------------------------------------------------
6198 
6199 PROCEDURE Push_tasks_to_production(
6200     p_api_version      IN         NUMBER,
6201     p_init_msg_list    IN         VARCHAR2  := Fnd_Api.g_false,
6202     p_validation_level IN         NUMBER    := Fnd_Api.g_valid_level_full,
6203     p_module_type      IN         VARCHAR2  := Null,
6204     p_visit_id         IN         NUMBER,
6205     p_tasks_tbl        IN         Task_Tbl_Type,
6206     p_release_flag     IN         VARCHAR2  ,
6207     x_return_status    OUT NOCOPY VARCHAR2,
6208     x_msg_count        OUT NOCOPY NUMBER,
6209     x_msg_data         OUT NOCOPY VARCHAR2
6210 ) IS
6211 
6212 --check if the visit master wo exists
6213 CURSOR c_fet_master_wo  (x_visit_id IN NUMBER) IS
6214  SELECT 1 FROM ahl_workorders wo
6215  WHERE wo.visit_id = x_visit_id
6216   AND wo.visit_task_id IS NULL
6217   AND wo.master_workorder_flag = 'Y';
6218 
6219 --fetch master work order for the visit
6220 CURSOR c_visit_master_wo  (x_visit_id IN NUMBER) IS
6221  SELECT wo.workorder_id, wo.status_code, wip.scheduled_start_date,wip.scheduled_completion_date,wo.object_version_number
6222  FROM ahl_visits_b v, ahl_workorders wo, wip_discrete_jobs wip
6223  WHERE v.visit_id = x_visit_id
6224   AND v.visit_id = wo.visit_id
6225   AND wo.visit_task_id IS NULL
6226   AND wo.master_workorder_flag = 'Y'
6227   AND wip.wip_entity_id = wo.wip_entity_id
6228   AND wo.status_code not in ('22','7');
6229 
6230 c_mst_wo_visit_rec  c_visit_master_wo%ROWTYPE;
6231 
6232 --fetch visit details
6233 CURSOR c_visit_dtl (x_visit_id IN NUMBER) IS
6234  SELECT * FROM ahl_visits_vl
6235  WHERE visit_id = x_visit_id;
6236 
6237 c_visit_dtl_rec c_visit_dtl%ROWTYPE;
6238 
6239 --fetch task details
6240 CURSOR c_visit_task_dtl (x_visit_task_id IN NUMBER) IS
6241  SELECT * FROM ahl_visit_tasks_vl
6242  WHERE visit_task_id = x_visit_task_id;
6243 
6244 c_visit_tsk_dtl_rec c_visit_task_dtl%ROWTYPE;
6245 
6246 --check if the task wo exists
6247 CURSOR c_fet_task_wo  (x_visit_id IN NUMBER, x_visit_task_id IN NUMBER) IS
6248 SELECT 1 FROM ahl_workorders wo
6249 WHERE wo.visit_id = x_visit_id
6250 AND wo.visit_task_id = x_visit_task_id
6251 AND wo.visit_task_id IS NOT NULL;
6252 
6253 --fetch work order for the task
6254 CURSOR c_task_wo  (x_visit_id IN NUMBER,x_visit_task_id IN NUMBER) IS
6255 SELECT v.visit_task_id, wo.workorder_id, wo.status_code, wip.scheduled_start_date,wip.scheduled_completion_date,wo.object_version_number
6256 FROM ahl_visit_tasks_b v, ahl_workorders wo, wip_discrete_jobs wip
6257 WHERE v.visit_id = x_visit_id
6258 AND v.visit_id = wo.visit_id
6259 AND wo.visit_task_id IS NOT NULL
6260 AND wo.visit_task_id = x_visit_task_id
6261 AND wip.wip_entity_id = wo.wip_entity_id
6262 AND wo.status_code not in ('22','7');
6263 
6264 c_task_wo_rec c_task_wo%ROWTYPE;
6265 
6266 --fetch summary task flag for the task
6267 CURSOR c_fet_sum_task_flg (x_visit_id IN NUMBER, x_visit_task_id IN NUMBER) IS
6268 SELECT summary_task_flag FROM ahl_visit_tasks_b
6269 WHERE visit_task_id = x_visit_task_id;
6270 
6271 --fetch all the tasks in the visit
6272 CURSOR c_all_task_dtl (x_visit_id IN NUMBER) IS
6273 SELECT count(visit_task_id) FROM ahl_visit_tasks_b
6274 WHERE visit_id = x_visit_id
6275 AND NVL(status_code,'X') IN ('PLANNING');
6276 
6277 --get summary task start, end time
6278 CURSOR get_summary_task_times_csr(x_task_id IN NUMBER)IS
6279 SELECT min(start_date_time), max(end_date_time)
6280 FROM ahl_visit_tasks_b  VST
6281 START WITH visit_task_id  = x_task_id
6282 AND NVL(VST.status_code, 'Y') <> 'DELETED'
6283     CONNECT BY originating_task_id = PRIOR visit_task_id;
6284 
6285 --find Route Id from MR Routes view
6286 CURSOR c_route (x_id IN NUMBER) IS
6287 SELECT Route_Id FROM AHL_MR_ROUTES_V
6288 WHERE MR_ROUTE_ID = x_id;
6289 
6290 --check if the visit master wo exists
6291 CURSOR c_fet_mas_wo_dtls  (x_visit_id IN NUMBER) IS
6292 SELECT actual_start_date,actual_end_date
6293 FROM ahl_workorders wo
6294 WHERE wo.visit_id = x_visit_id
6295 AND wo.visit_task_id IS NULL
6296 AND wo.master_workorder_flag = 'Y';
6297 
6298 c_fet_mas_wo_dtl_rec    c_fet_mas_wo_dtls%ROWTYPE;
6299 
6300 --Inventory item id and instance id to be defaulted when
6301 --the item and instance are not specified at the header level
6302 CURSOR default_task_inst_dtls(c_task_id IN NUMBER) IS
6303 SELECT inventory_item_id,instance_id
6304 FROM ahl_visit_tasks_b
6305 WHERE visit_task_id = c_task_id;
6306 
6307 def_task_inst_rec  default_task_inst_dtls%ROWTYPE;
6308 
6309 /*B5758813 - rnahata - fetches the route information for updating workorder
6310 description for tasks created from Routes */
6311 CURSOR get_wo_dtls_for_mrtasks_cur (p_task_id IN NUMBER) IS
6312 SELECT ar.route_no||'.'||substr(ar.title,1,(240 - (length(ar.route_no) + 1))) workorder_description
6313 FROM ahl_routes_vl ar,ahl_visit_tasks_b avt, ahl_mr_routes mrr
6314 WHERE avt.visit_task_id = p_task_id
6315 and nvl(avt.status_code,'Y') = 'PLANNING'
6316 and avt.mr_route_id = mrr.mr_route_id
6317 and mrr.route_id = ar.route_id;
6318 
6319 get_wo_dtls_for_mrtasks_rec    get_wo_dtls_for_mrtasks_cur%ROWTYPE;
6320 
6321 --get SR MWO details.
6322 CURSOR c_get_sr_mwo_dtls(p_sr_task_id IN NUMBER) IS
6323 SELECT WDJ.WIP_ENTITY_ID,
6324        AWO.WORKORDER_ID,
6325        AWO.OBJECT_VERSION_NUMBER,
6326        WDJ.SCHEDULED_START_DATE,
6327        WDJ.SCHEDULED_COMPLETION_DATE
6328 FROM AHL_WORKORDERS AWO,
6329      WIP_DISCRETE_JOBS WDJ
6330 WHERE WDJ.WIP_ENTITY_ID = AWO.WIP_ENTITY_ID
6331  AND AWO.VISIT_TASK_ID = p_sr_task_id
6332  AND AWO.MASTER_WORKORDER_FLAG = 'Y'
6333  AND AWO.STATUS_CODE <> 17;
6334 
6335 l_sr_mwo_rec  c_get_sr_mwo_dtls%ROWTYPE;
6336 
6337 --get SR task details
6338 CURSOR c_get_sr_task_dtls(p_sr_task_id IN NUMBER) IS
6339  SELECT * FROM AHL_VISIT_TASKS_B vst
6340  WHERE vst.TASK_TYPE_CODE = 'SUMMARY'
6341   AND vst.MR_ID IS NULL
6342   AND vst.SERVICE_REQUEST_ID =
6343       (SELECT vst1.SERVICE_REQUEST_ID
6344        FROM ahl_visit_tasks_b vst1
6345        WHERE vst1.visit_task_id = p_sr_task_id);
6346 
6347 --check if visit has planned tasks
6348 CURSOR c_visit_has_planned_tasks(p_visit_id IN NUMBER) IS
6349  SELECT 1 FROM ahl_visit_tasks_b
6350  WHERE visit_id = p_visit_id
6351   AND status_code = 'PLANNING';
6352 
6353 CURSOR c_visit_time_matches_MWO_time(p_visit_id IN NUMBER) IS
6354  SELECT 1
6355  FROM ahl_visits_b vst, ahl_workorders wo, wip_discrete_jobs wdj
6356  WHERE vst.visit_id = p_visit_id
6357   AND wo.visit_id = vst.visit_id
6358   AND wo.MASTER_WORKORDER_FLAG = 'Y'
6359   AND wo.visit_task_id IS NULL
6360   AND wdj.wip_entity_id = wo.wip_entity_id
6361   AND vst.start_date_time = wdj.scheduled_start_date
6362   AND vst.close_date_time = wdj.scheduled_completion_date;
6363 
6364 l_temp_num1             NUMBER := NULL;
6365 l_temp_num2             NUMBER := NULL;
6366 l_sr_task_dtls_rec      c_get_sr_task_dtls%ROWTYPE;
6367 l_wo_tbl_count          NUMBER  := 0;
6368 l_sch_start_date        DATE;
6369 l_sch_end_date          DATE;
6370 i                       NUMBER := 0;
6371 l_chk_mst_wo            NUMBER := 0;
6372 l_chk_task_wo           NUMBER := 0;
6373 L_API_NAME     CONSTANT VARCHAR2(30)  := 'Push_tasks_to_production';
6374 L_API_VERSION  CONSTANT NUMBER        := 1.0;
6375 L_DEBUG_KEY    CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
6376 l_msg_data              VARCHAR2(2000);
6377 l_return_status         VARCHAR2(1);
6378 l_msg_count             NUMBER;
6379 l_prd_workorder_tbl     AHL_PRD_WORKORDER_PVT.PRD_WORKORDER_TBL;
6380 idx                     NUMBER := 0;
6381 l_prd_workorder_rel_tbl AHL_PRD_WORKORDER_PVT.prd_workorder_rel_tbl;
6382 l_manual_summ_task_flag VARCHAR2(1) ;
6383 l_task_cnt              NUMBER := 0;
6384 l_firm_planned_flag     VARCHAR2(1) := FND_PROFILE.value('AHL_PRD_FIRM_PLANNED_FLAG');
6385 
6386 BEGIN
6387     IF (l_log_procedure >= l_log_current_level) THEN
6388        fnd_log.string(l_log_procedure,
6389                       L_DEBUG_KEY ||'.begin',
6390                       'At the start of PL SQL procedure. Visit Id = ' ||
6391                       p_visit_id || ', p_tasks_tbl.COUNT = ' || p_tasks_tbl.COUNT);
6392     END IF;
6393 
6394     -- Standard start of API savepoint
6395     SAVEPOINT Push_tasks_to_prodn_pvt;
6396 
6397     -- Initialize message list if p_init_msg_list is set to TRUE
6398     IF FND_API.To_Boolean(p_init_msg_list) THEN
6399        FND_MSG_PUB.Initialize;
6400     END IF;
6401 
6402     -- Initialize API return status to success
6403     x_return_status := FND_API.G_RET_STS_SUCCESS;
6404 
6405     IF NOT FND_API.COMPATIBLE_API_CALL(l_api_version,
6406                                        p_api_version,
6407                                        l_api_name,G_PKG_NAME)
6408     THEN
6409       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
6410     END IF;
6411 
6412     IF (l_log_statement >= l_log_current_level) THEN
6413        fnd_log.string(l_log_statement,
6414                       L_DEBUG_KEY,
6415                       'Before calling INTEGRATE_TO_PROJECTS for Visit Id ' || p_visit_id);
6416     END IF;
6417 
6418     --create the project id for the visit.
6419     AHL_VWP_PROJ_PROD_PVT.Integrate_to_Projects
6420       (p_api_version       => l_api_version,
6421        p_init_msg_list     => p_init_msg_list,
6422        p_commit            => 'F',
6423        p_validation_level  => p_validation_level,
6424        p_module_type       => p_module_type,
6425        p_visit_id          => p_visit_id,
6426        x_return_status     => l_return_status,
6427        x_msg_count         => l_msg_count,
6428        x_msg_data          => x_msg_data);
6429 
6430     IF (l_log_statement >= l_log_current_level) THEN
6431        fnd_log.string(l_log_statement,
6432                       L_DEBUG_KEY,
6433                       'After calling Integrate_to_Projects. l_return_status = ' || l_return_status);
6434     END IF;
6435 
6436     IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
6437       x_msg_count := FND_MSG_PUB.count_msg;
6438       IF (l_log_statement >= l_log_current_level) THEN
6439          fnd_log.string(l_log_statement,
6440                         L_DEBUG_KEY,
6441                         'Errors from Integrate_to_Projects. Message count: ' || x_msg_count);
6442       END IF;
6443       IF l_return_status = FND_API.G_RET_STS_ERROR THEN
6444          RAISE FND_API.G_EXC_ERROR;
6445       ELSE
6446          RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
6447       END IF;
6448     END IF;
6449 
6450     --chk if master wo for the visit already exists
6451     OPEN c_fet_master_wo(p_visit_id);
6452     FETCH c_fet_master_wo INTO l_chk_mst_wo;
6453     CLOSE c_fet_master_wo;
6454 
6455     OPEN c_visit_master_wo(p_visit_id);
6456     FETCH c_visit_master_wo INTO c_mst_wo_visit_rec;
6457     CLOSE c_visit_master_wo;
6458 
6459     --fetch the visit details
6460     OPEN c_visit_dtl(p_visit_id);
6461     FETCH c_visit_dtl INTO c_visit_dtl_rec;
6462     CLOSE c_visit_dtl;
6463 
6464     --fetch the count of tasks in planning status.
6465     OPEN c_all_task_dtl (p_visit_id);
6466     FETCH c_all_task_dtl INTO l_task_cnt;
6467     CLOSE c_all_task_dtl;
6468 
6469     idx := idx+1;
6470     l_prd_workorder_tbl(idx).SCHEDULED_START_DATE := c_visit_dtl_rec.start_date_time;
6471     l_prd_workorder_tbl(idx).SCHEDULED_END_DATE   := c_visit_dtl_rec.close_date_time;
6472     l_prd_workorder_tbl(idx).BATCH_ID             := c_visit_dtl_rec.VISIT_NUMBER;
6473     l_prd_workorder_tbl(idx).HEADER_ID            := 0; -- Visit
6474     IF (nvl(l_chk_mst_wo,0) = 1) THEN --Visit master wo already exists
6475        l_prd_workorder_tbl(idx).DML_OPERATION         := 'U';
6476        l_prd_workorder_tbl(idx).WORKORDER_ID          := c_mst_wo_visit_rec.workorder_id;
6477        l_prd_workorder_tbl(idx).OBJECT_VERSION_NUMBER := c_mst_wo_visit_rec.object_version_number;
6478        IF (c_mst_wo_visit_rec.status_code <> 3) THEN
6479           IF (p_release_flag = 'Y') THEN
6480              -- change status from UNRELEASED/DRAFT to RELEASED
6481              l_prd_workorder_tbl(idx).STATUS_CODE       := '3'; -- Released
6482              -- Visit Master Work Order should ALWAYS be FIRM (not dependent on profile)
6483              l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG := 1;   -- Firm
6484           ELSIF  c_mst_wo_visit_rec.status_code = '17' THEN
6485              -- Master workorder was in Draft status, make it UNRELEASED now
6486              l_prd_workorder_tbl(idx).STATUS_CODE       := '1'; -- Unreleased
6487              -- Visit Master Work Order should ALWAYS be FIRM (not dependent on profile)
6488              l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG := 1;   -- Firm
6489           END IF;
6490        END IF; --master work order status is not 3
6491     ELSE -- visit master workorder does not exist, create a master wo
6492        l_prd_workorder_tbl(idx).DML_OPERATION := 'C';
6493        -- Visit Master Work Order should ALWAYS be FIRM (not dependent on profile)
6494        l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG     := 1; -- Firm
6495        l_prd_workorder_tbl(idx).MASTER_WORKORDER_FLAG := 'Y';
6496        l_prd_workorder_tbl(idx).VISIT_ID              := p_visit_id;
6497        l_prd_workorder_tbl(idx).ORGANIZATION_ID       := c_visit_dtl_rec.organization_id;
6498        l_prd_workorder_tbl(idx).PROJECT_ID            := c_visit_dtl_rec.project_id;
6499        l_prd_workorder_tbl(idx).DEPARTMENT_ID         := c_visit_dtl_rec.department_id ;
6500        IF p_release_flag = 'Y' THEN
6501          l_prd_workorder_tbl(idx).STATUS_CODE  := '3';  -- Released
6502        ELSE
6503          l_prd_workorder_tbl(idx).STATUS_CODE  := '1';  -- Unreleased
6504        END IF;
6505        IF (c_visit_dtl_rec.inventory_item_id IS NULL AND c_visit_dtl_rec.item_instance_id IS NULL) THEN
6506           /*When the unit is not specified at the visit level, fetch the first task's inventory_item_id
6507           and the instance_id from the list of user selected tasks.This inventory_item_id/instance_id
6508           will be used in the creation of master wo for the visit.*/
6509           OPEN default_task_inst_dtls(p_tasks_tbl(p_tasks_tbl.FIRST).visit_task_id);
6510           FETCH default_task_inst_dtls INTO def_task_inst_rec;
6511           CLOSE default_task_inst_dtls;
6512           l_prd_workorder_tbl(idx).INVENTORY_ITEM_ID := def_task_inst_rec.inventory_item_id;
6513           l_prd_workorder_tbl(idx).ITEM_INSTANCE_ID  := def_task_inst_rec.instance_id;
6514        ELSE
6515           l_prd_workorder_tbl(idx).INVENTORY_ITEM_ID := c_visit_dtl_rec.inventory_item_id;
6516           l_prd_workorder_tbl(idx).ITEM_INSTANCE_ID  := c_visit_dtl_rec.item_instance_id;
6517        END IF;
6518        l_prd_workorder_tbl(idx).JOB_DESCRIPTION      := c_visit_dtl_rec.visit_name ;
6519     END IF; --visit master workorder exists or not
6520 
6521     FOR i in p_tasks_tbl.FIRST..p_tasks_tbl.LAST LOOP --for all tasks
6522 
6523         OPEN c_fet_sum_task_flg(p_visit_id, p_tasks_tbl(i).visit_task_id);
6524         FETCH c_fet_sum_task_flg INTO l_manual_summ_task_flag;
6525         CLOSE c_fet_sum_task_flg;
6526 
6527         IF (l_manual_summ_task_flag = 'Y') THEN
6528            -- No work order will be created for manually created summary task
6529            -- Just update the task status to Released.
6530            UPDATE ahl_visit_tasks_b
6531            SET status_code = 'RELEASED'
6532            WHERE visit_task_id = p_tasks_tbl(i).visit_task_id;
6533 
6534         ELSE
6535            --check if the wo exists for the task
6536            OPEN c_fet_task_wo(p_visit_id, p_tasks_tbl(i).visit_task_id);
6537            FETCH c_fet_task_wo INTO l_chk_task_wo;
6538            CLOSE c_fet_task_wo;
6539 
6540            --fetch the task details
6541            OPEN c_visit_task_dtl(p_tasks_tbl(i).visit_task_id);
6542            FETCH c_visit_task_dtl INTO c_visit_tsk_dtl_rec;
6543            CLOSE c_visit_task_dtl;
6544 
6545            --fetch the workorder details for the task
6546            OPEN c_task_wo(p_visit_id , p_tasks_tbl(i).visit_task_id);
6547            FETCH c_task_wo INTO c_task_wo_rec;
6548            CLOSE c_task_wo;
6549 
6550            IF (nvl(l_chk_task_wo,0) = 1) THEN --task wo for the visit already exists
6551               IF (c_task_wo_rec.status_code = 17) THEN  -- Status is Draft
6552                  idx := idx+1;
6553                  l_prd_workorder_tbl(idx).dml_operation := 'U';
6554                  l_prd_workorder_tbl(idx).workorder_id := c_task_wo_rec.workorder_id;
6555                  l_prd_workorder_tbl(idx).object_version_number := c_task_wo_rec.object_version_number;
6556                  l_prd_workorder_tbl(idx).item_instance_id  := c_visit_tsk_dtl_rec.instance_id ;
6557                  l_prd_workorder_tbl(idx).BATCH_ID := c_visit_dtl_rec.visit_number;
6558                  l_prd_workorder_tbl(idx).HEADER_ID := c_visit_tsk_dtl_rec.visit_task_number;
6559                  IF (p_release_flag = 'Y') THEN
6560                     l_prd_workorder_tbl(idx).status_code := '3'; -- Released
6561                  ELSE
6562                     l_prd_workorder_tbl(idx).status_code := '1'; -- UnReleased
6563                  END IF;
6564                  IF (l_firm_planned_flag IS NOT NULL AND l_firm_planned_flag = '2') THEN
6565                     l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG := 2; -- Planned
6566                  ELSE
6567                     l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG := 1; -- Firm
6568                  END IF;
6569                  -- If summary task, use the min,max of sub tasks
6570                  IF (c_visit_tsk_dtl_rec.task_type_code = 'SUMMARY') THEN
6571                     OPEN get_summary_task_times_csr(c_visit_tsk_dtl_rec.visit_task_id);
6572                     FETCH get_summary_task_times_csr
6573                           INTO l_prd_workorder_tbl(idx).SCHEDULED_START_DATE,
6574                                l_prd_workorder_tbl(idx).SCHEDULED_END_DATE;
6575                     CLOSE get_summary_task_times_csr;
6576                  ELSE
6577                     l_prd_workorder_tbl(idx).scheduled_start_date  := c_visit_tsk_dtl_rec.start_date_time;
6578                     l_prd_workorder_tbl(idx).scheduled_end_date    := c_visit_tsk_dtl_rec.end_date_time;
6579                  END IF;
6580                /*B5758813 - rnahata - For summary tasks (both manual and MR summary tasks)
6581                and unassociated tasks the task name is passed as the workorder description.
6582                And for the Route tasks, the route number concatenated with the route title is
6583                passed as workorder description.*/
6584                  IF (c_visit_tsk_dtl_rec.task_type_code IN ('SUMMARY','UNASSOCIATED')) THEN
6585                     l_prd_workorder_tbl(idx).JOB_DESCRIPTION   :=  c_visit_tsk_dtl_rec.visit_task_name;
6586                  ELSE
6587                     OPEN get_wo_dtls_for_mrtasks_cur(c_visit_tsk_dtl_rec.visit_task_id);
6588                     FETCH get_wo_dtls_for_mrtasks_cur INTO get_wo_dtls_for_mrtasks_rec;
6589                     CLOSE get_wo_dtls_for_mrtasks_cur;
6590                     l_prd_workorder_tbl(idx).JOB_DESCRIPTION := get_wo_dtls_for_mrtasks_rec.workorder_description;
6591                  END IF;
6592               END IF;  -- WO Status is Draft
6593            ELSE --work order does not exist for this task
6594               -- Create a new work order
6595               idx := idx+1;
6596               l_prd_workorder_tbl(idx).DML_OPERATION := 'C';
6597               IF p_release_flag = 'Y' THEN
6598                  l_prd_workorder_tbl(idx).STATUS_CODE := '3';  -- Released
6599               ELSE
6600                  l_prd_workorder_tbl(idx).STATUS_CODE := '1';  -- Unreleased
6601               END IF;
6602               IF (l_firm_planned_flag IS NOT NULL AND l_firm_planned_flag = '2') THEN
6603                  l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG := 2; -- Planned
6604               ELSE
6605                  l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG := 1; -- Firm
6606               END IF;
6607               IF (c_visit_tsk_dtl_rec.task_type_code = 'SUMMARY') THEN
6608                  l_prd_workorder_tbl(idx).MASTER_WORKORDER_FLAG := 'Y';
6609               ELSE
6610                  l_prd_workorder_tbl(idx).MASTER_WORKORDER_FLAG := 'N';
6611               END IF;
6612 
6613               l_prd_workorder_tbl(idx).BATCH_ID          := c_visit_dtl_rec.visit_number;
6614               l_prd_workorder_tbl(idx).HEADER_ID         := c_visit_tsk_dtl_rec.visit_task_number;
6615               l_prd_workorder_tbl(idx).VISIT_ID          := p_visit_id;
6616               l_prd_workorder_tbl(idx).ORGANIZATION_ID   := c_visit_dtl_rec.organization_id;
6617               l_prd_workorder_tbl(idx).PROJECT_ID        := c_visit_dtl_rec.project_id;
6618               l_prd_workorder_tbl(idx).INVENTORY_ITEM_ID := c_visit_tsk_dtl_rec.inventory_item_id ;
6619               l_prd_workorder_tbl(idx).ITEM_INSTANCE_ID  := c_visit_tsk_dtl_rec.instance_id ;
6620               l_prd_workorder_tbl(idx).VISIT_TASK_ID     := c_visit_tsk_dtl_rec.visit_task_id ;
6621               l_prd_workorder_tbl(idx).VISIT_TASK_NUMBER := c_visit_tsk_dtl_rec.visit_task_number ;
6622               l_prd_workorder_tbl(idx).PROJECT_TASK_ID   := c_visit_tsk_dtl_rec.project_task_id ;
6623 
6624           /*B5758813 - rnahata - For summary tasks (both manual and MR summary tasks)
6625               and unassociated tasks, the task name is passed as the workorder description.
6626               And for the MR tasks, the route number concatenated with the route title is
6627               passed as workorder description.*/
6628               IF (c_visit_tsk_dtl_rec.task_type_code IN ('SUMMARY','UNASSOCIATED')) THEN
6629                  l_prd_workorder_tbl(idx).JOB_DESCRIPTION :=  c_visit_tsk_dtl_rec.visit_task_name;
6630               ELSE
6631                  OPEN get_wo_dtls_for_mrtasks_cur(c_visit_tsk_dtl_rec.visit_task_id);
6632                  FETCH get_wo_dtls_for_mrtasks_cur INTO get_wo_dtls_for_mrtasks_rec;
6633                  CLOSE get_wo_dtls_for_mrtasks_cur;
6634                  l_prd_workorder_tbl(idx).JOB_DESCRIPTION := get_wo_dtls_for_mrtasks_rec.workorder_description;
6635               END IF;
6636 
6637               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
6638                  OPEN c_route (c_visit_tsk_dtl_rec.mr_route_id);
6639                  FETCH c_route INTO l_prd_workorder_tbl(idx).ROUTE_ID;
6640                  CLOSE c_route;
6641               ELSE
6642                  l_prd_workorder_tbl(idx).ROUTE_ID := Null;
6643               END IF;
6644 
6645               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
6646                  l_prd_workorder_tbl(idx).DEPARTMENT_ID := c_visit_tsk_dtl_rec.department_id ;
6647               ELSE
6648                  l_prd_workorder_tbl(idx).DEPARTMENT_ID := c_visit_dtl_rec.department_id ;
6649               END IF;
6650 
6651               -- If summary task, use the min,max of sub tasks
6652               IF (c_visit_tsk_dtl_rec.task_type_code = 'SUMMARY') THEN
6653                  OPEN get_summary_task_times_csr(c_visit_tsk_dtl_rec.visit_task_id);
6654                  FETCH get_summary_task_times_csr INTO l_prd_workorder_tbl(idx).SCHEDULED_START_DATE,
6655                                                        l_prd_workorder_tbl(idx).SCHEDULED_END_DATE;
6656                  CLOSE get_summary_task_times_csr;
6657               ELSE
6658                  l_prd_workorder_tbl(idx).SCHEDULED_START_DATE  := c_visit_tsk_dtl_rec.START_DATE_TIME;
6659                  l_prd_workorder_tbl(idx).SCHEDULED_END_DATE    := c_visit_tsk_dtl_rec.END_DATE_TIME;
6660               END IF;
6661            END IF; --work order exists or not for this task
6662 
6663            IF (l_log_statement >= l_log_current_level) THEN
6664               fnd_log.string(l_log_statement,
6665                              L_DEBUG_KEY,
6666                              'Before calling Get_Task_Relationships for task id: ' ||p_tasks_tbl(i).visit_task_id);
6667            END IF;
6668 
6669            AHL_VWP_PROJ_PROD_PVT.Get_Task_Relationships
6670                 ( p_visit_id            => p_visit_id,
6671                   p_visit_number        => c_visit_dtl_rec.visit_number,
6672                   p_visit_task_id       => c_visit_tsk_dtl_rec.visit_task_id,
6673                   p_x_relationship_tbl  => l_prd_workorder_rel_tbl
6674                 );
6675 
6676            IF (l_log_statement >= l_log_current_level) THEN
6677               fnd_log.string(l_log_statement,
6678                              L_DEBUG_KEY,
6679                              'After calling Get_Task_Relationships');
6680            END IF;
6681         END IF;  -- Task is Manually Created Summary Task or not
6682      END LOOP;  -- For all tasks in p_tasks_tbl
6683 
6684      --first get the task relationships for the tasks, then collect the dependencies.
6685      IF (l_log_statement >= l_log_current_level) THEN
6686          fnd_log.string(l_log_statement,
6687             L_DEBUG_KEY,
6688             'Before calling Get_Task_Dependencies for tasks');
6689      END IF;
6690 
6691      FOR i IN p_tasks_tbl.FIRST..p_tasks_tbl.LAST LOOP
6692        AHL_VWP_PROJ_PROD_PVT.Get_Task_Dependencies
6693             (
6694               p_visit_number       => c_visit_dtl_rec.visit_number,
6695               p_visit_task_id      => p_tasks_tbl(i).visit_task_id,
6696               p_visit_task_number  => p_tasks_tbl(i).visit_task_number,
6697               p_x_relationship_tbl => l_prd_workorder_rel_tbl
6698             );
6699 
6700        IF (l_log_statement >= l_log_current_level) THEN
6701           fnd_log.string(l_log_statement,
6702                          L_DEBUG_KEY,
6703                          'After calling Get_Task_Dependencies for task id: ' ||p_tasks_tbl(i).visit_task_id);
6704        END IF;
6705      END LOOP;  -- For all tasks in p_tasks_tbl
6706 
6707     -- SR master workorder dates need to be adjusted when new MRs are added.
6708     -- Scheduled start date and Scheduled end date of SR MWO will be derived as follows
6709     -- 1. Scheduled start date will be least of scheduled start date of all existing workorders
6710     -- and new workorders that will be added.
6711     -- 2. Scheduled end date will be greatest of scheduled start date of all existing workorders
6712     -- and new workorders that will be added.
6713 
6714     -- step 1. get sr summary tasks duration
6715     -- Note: Entire task table need be looped through. As in future
6716     -- requirement, we may need to accomodate cases were more than one
6717     -- Group task will be passed to this API.
6718     OPEN c_get_sr_task_dtls(p_tasks_tbl(p_tasks_tbl.FIRST).visit_task_id);
6719     FETCH c_get_sr_task_dtls INTO l_sr_task_dtls_rec;
6720     CLOSE c_get_sr_task_dtls;
6721 
6722     OPEN get_summary_task_times_csr(l_sr_task_dtls_rec.visit_task_id);
6723     FETCH get_summary_task_times_csr INTO l_sch_start_date, l_sch_end_date;
6724     CLOSE get_summary_task_times_csr;
6725 
6726     -- step 2. get sr mwo details including scheduled dates.
6727     OPEN c_get_sr_mwo_dtls(l_sr_task_dtls_rec.visit_task_id);
6728     FETCH c_get_sr_mwo_dtls INTO l_sr_mwo_rec;
6729     CLOSE c_get_sr_mwo_dtls;
6730 
6731     -- step 3. update sr mwo details with new scheduled dates.
6732     IF (l_sr_mwo_rec.wip_entity_id IS NOT NULL) THEN
6733 
6734        l_wo_tbl_count := l_prd_workorder_tbl.COUNT + 1;
6735 
6736        --l_prd_workorder_tbl(l_wo_tbl_count).wip_entity_id := l_sr_mwo_rec.wip_entity_id;
6737        l_prd_workorder_tbl(l_wo_tbl_count).object_version_number := l_sr_mwo_rec.object_version_number;
6738        l_prd_workorder_tbl(l_wo_tbl_count).workorder_id := l_sr_mwo_rec.workorder_id;
6739        l_prd_workorder_tbl(l_wo_tbl_count).dml_operation := 'U';
6740 
6741        l_prd_workorder_tbl(l_wo_tbl_count).scheduled_start_date := LEAST(l_sr_mwo_rec.scheduled_start_date,l_sch_start_date);
6742        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'));
6743        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'));
6744 
6745        l_prd_workorder_tbl(l_wo_tbl_count).scheduled_end_date := GREATEST(l_sr_mwo_rec.scheduled_completion_date,l_sch_end_date);
6746        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'));
6747        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'));
6748 
6749        l_prd_workorder_tbl(l_wo_tbl_count).batch_id := c_visit_dtl_rec.visit_number;
6750        l_prd_workorder_tbl(l_wo_tbl_count).header_id := l_sr_task_dtls_rec.visit_task_number;
6751 
6752        IF (l_log_statement >= l_log_current_level) THEN
6753           fnd_log.string(l_log_statement,
6754                          L_DEBUG_KEY,
6755                          'SR MWO Dates before updating...');
6756           fnd_log.string(l_log_statement,
6757                          L_DEBUG_KEY,
6758                          '----------------------------------------------');
6759           fnd_log.string(l_log_statement,
6760                          L_DEBUG_KEY,
6761                          'scheduled_start_time->'||TO_CHAR(l_sr_mwo_rec.scheduled_start_date,'DD-MON-YYYY HH24:MI:SS'));
6762           fnd_log.string(l_log_statement,
6763                          L_DEBUG_KEY,
6764                          'scheduled_end_time->'||TO_CHAR(l_sr_mwo_rec.scheduled_completion_date,'DD-MON-YYYY HH24:MI:SS'));
6765           fnd_log.string(l_log_statement,
6766                          L_DEBUG_KEY,
6767                          'SR MWO Dates after updating...');
6768           fnd_log.string(l_log_statement,
6769                          L_DEBUG_KEY,
6770                          '----------------------------------------------');
6771           fnd_log.string(l_log_statement,
6772                          L_DEBUG_KEY,
6773                          'scheduled_start_time->'||TO_CHAR(l_prd_workorder_tbl(l_wo_tbl_count).scheduled_start_date,'DD-MON-YYYY HH24:MI:SS'));
6774           fnd_log.string(l_log_statement,
6775                          L_DEBUG_KEY,
6776                          'scheduled_end_time->'||TO_CHAR(l_prd_workorder_tbl(l_wo_tbl_count).scheduled_end_date,'DD-MON-YYYY HH24:MI:SS'));
6777           fnd_log.string(l_log_statement,
6778                          L_DEBUG_KEY,
6779                          'SR Task scheduled_start_time->'||TO_CHAR(l_sch_start_date,'DD-MON-YYYY HH24:MI:SS'));
6780           fnd_log.string(l_log_statement,
6781                          L_DEBUG_KEY,
6782                          'SR Task scheduled_end_time->'||TO_CHAR(l_sch_end_date,'DD-MON-YYYY HH24:MI:SS'));
6783        END IF;  -- Statement Log Level
6784     END IF;  -- wip_entity_id IS NOT NULL
6785 
6786     IF (l_log_statement >= l_log_current_level) THEN
6787        fnd_log.string(l_log_statement,
6788                       L_DEBUG_KEY,
6789                       'Before calling PROCESS_JOBS for visit_id: ' || p_visit_id);
6790     END IF;
6791 
6792     -- Call Production API to create work orders
6793     AHL_PRD_WORKORDER_PVT.Process_Jobs
6794           (p_api_version           => l_api_version ,
6795            p_init_msg_list         => p_init_msg_list,
6796            p_commit                => 'F',
6797            p_validation_level      => p_validation_level,
6798            p_default               => FND_API.G_TRUE,
6799            p_module_type           => p_module_type,
6800            x_return_status         => l_return_status,
6801            x_msg_count             => l_msg_count,
6802            x_msg_data              => l_msg_data,
6803            p_x_prd_workorder_tbl   => l_prd_workorder_tbl,
6804            p_prd_workorder_rel_tbl => l_prd_workorder_rel_tbl
6805          );
6806 
6807     IF (l_log_statement >= l_log_current_level) THEN
6808        fnd_log.string(l_log_statement,
6809                       L_DEBUG_KEY,
6810                       'After calling PROCESS_JOBS for visit_id ' ||
6811                       p_visit_id||', l_return_status: '|| l_return_status);
6812     END IF;
6813 
6814     IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
6815        x_msg_count := FND_MSG_PUB.count_msg;
6816        IF (l_log_statement >= l_log_current_level) THEN
6817           fnd_log.string(l_log_statement,
6818                          L_DEBUG_KEY,
6819                          'Errors from PROCESS_JOBS. Message count: ' || x_msg_count);
6820        END IF;
6821        IF l_return_status = FND_API.G_RET_STS_ERROR THEN
6822           RAISE FND_API.G_EXC_ERROR;
6823        ELSE
6824           RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
6825        END IF;
6826     END IF;  -- Return Status is not Success
6827 
6828     IF (l_log_statement >= l_log_current_level) THEN
6829        For i IN l_prd_workorder_tbl.FIRST..l_prd_workorder_tbl.LAST LOOP
6830          fnd_log.string(l_log_statement,
6831                         L_DEBUG_KEY,
6832                         'WorkOrder Id('||i||'): '||l_prd_workorder_tbl(i).workorder_id);
6833        END LOOP;
6834     END IF;
6835 
6836     /*B5758813 - rnahata - starts*/
6837     /*The project start/end dates have to be updated with the workorder scheduled
6838     start/end dates.*/
6839     IF (l_log_statement >= l_log_current_level) THEN
6840        fnd_log.string(l_log_statement,
6841                       L_DEBUG_KEY,
6842                       'Before calling Update_Project_Task_Times.');
6843     END IF;
6844 
6845     Update_Project_Task_Times(
6846           p_prd_workorder_tbl => l_prd_workorder_tbl,
6847           p_commit            =>'F',
6848           x_return_status     => l_return_status,
6849           x_msg_count         => l_msg_count,
6850           x_msg_data          => l_msg_data);
6851 
6852     IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
6853        x_msg_count := FND_MSG_PUB.count_msg;
6854        IF (l_log_statement >= l_log_current_level) THEN
6855           fnd_log.string(l_log_statement,
6856                          L_DEBUG_KEY,
6857                          'Errors from Update_Project_Task_Times. Message count: ' || x_msg_count);
6858        END IF;
6859        IF l_return_status = FND_API.G_RET_STS_ERROR THEN
6860           RAISE FND_API.G_EXC_ERROR;
6861        ELSE
6862           RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
6863        END IF;
6864     ELSE
6865        IF (l_log_statement >= l_log_current_level) THEN
6866            fnd_log.string(l_log_statement,
6867                           L_DEBUG_KEY,
6868                           'Returned Success from Update_Project_Task_Times');
6869        END IF;
6870     END IF;  -- Return Status is Success or not
6871     /*B5758813 - rnahata - ends*/
6872 
6873     FOR i IN p_tasks_tbl.FIRST..p_tasks_tbl.LAST LOOP
6874       UPDATE ahl_visit_tasks_b
6875       SET   status_code = 'RELEASED'
6876       WHERE visit_task_id = p_tasks_tbl(i).visit_task_id;
6877     END LOOP;
6878 
6879     /*Check if the user had selected all the tasks otherwise
6880     update the visit as Partially released.*/
6881     OPEN c_visit_has_planned_tasks(p_visit_id);
6882     FETCH c_visit_has_planned_tasks into l_temp_num1;
6883     CLOSE c_visit_has_planned_tasks;
6884 
6885     OPEN c_visit_time_matches_MWO_time(p_visit_id);
6886     FETCH c_visit_time_matches_MWO_time INTO l_temp_num2;
6887     CLOSE c_visit_time_matches_MWO_time;
6888 
6889     IF l_temp_num1 IS NOT NULL OR l_temp_num2 is NULL THEN
6890        IF (l_log_statement >= l_log_current_level) THEN
6891           IF l_temp_num1 IS NOT NULL THEN
6892              fnd_log.string(l_log_statement,
6893                             L_DEBUG_KEY,
6894                             'Visit has some tasks in planning status. Setting Visit status to PARTIALLY RELEASED.');
6895           END IF;
6896           IF l_temp_num2 IS NULL THEN
6897              fnd_log.string(l_log_statement,
6898                             L_DEBUG_KEY,
6899                             'Visit times and Master Work order times do not match. Setting Visit status to PARTIALLY RELEASED.');
6900           END IF;
6901        END IF;
6902 
6903        UPDATE ahl_visits_b
6904        SET status_code = 'PARTIALLY RELEASED'
6905        WHERE visit_id = p_visit_id;
6906     ELSE
6907        IF (l_log_statement >= l_log_current_level) THEN
6908          fnd_log.string(l_log_statement,
6909                         L_DEBUG_KEY,
6910                         'Setting Visit status to RELEASED.');
6911        END IF;
6912 
6913        UPDATE ahl_visits_b
6914        SET status_code = 'RELEASED',
6915            any_task_chg_flag ='N'
6916        WHERE visit_id = p_visit_id;
6917     END IF;
6918 
6919     IF (l_log_procedure >= l_log_current_level) THEN
6920        fnd_log.string(l_log_procedure,
6921                       L_DEBUG_KEY ||'.end',
6922                       'At the end of PL SQL procedure. Return Status = ' || x_return_status);
6923     END IF;
6924 
6925 EXCEPTION
6926   WHEN  FND_API.G_EXC_ERROR THEN
6927     x_return_status := FND_API.G_RET_STS_ERROR;
6928     ROLLBACK TO Push_tasks_to_prodn_pvt;
6929     FND_MSG_PUB.count_and_get(p_count => x_msg_count,
6930                               p_data  => x_msg_data,
6931                               p_encoded => fnd_api.g_false);
6932 
6933   WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
6934     x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
6935     ROLLBACK TO Push_tasks_to_prodn_pvt;
6936     Fnd_Msg_Pub.count_and_get (
6937             p_encoded => Fnd_Api.g_false,
6938             p_count   => x_msg_count,
6939             p_data    => x_msg_data);
6940 
6941   WHEN OTHERS THEN
6942     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6943     ROLLBACK TO Push_tasks_to_prodn_pvt;
6944     IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
6945        fnd_msg_pub.add_exc_msg(p_pkg_name       => G_PKG_NAME,
6946                                p_procedure_name => 'Push_tasks_to_production',
6947                                p_error_text     => SUBSTR(SQLERRM,1,500));
6948     END IF;
6949     FND_MSG_PUB.count_and_get(p_count   => x_msg_count,
6950                               p_data    => x_msg_data,
6951                               p_encoded => fnd_api.g_false);
6952 
6953 END Push_tasks_to_production;
6954 
6955 -------------------------------------------------------------------
6956 --  Procedure name      : check_unit_quarantined
6957 --  Type                : Private
6958 --  Function            : To check whether the Unit is quarantined
6959 --  Parameters          : item_instance_id
6960 
6961 -- AnRaj added for R 12.0 ACL changes in VWP
6962 -- Bug number 4297066
6963 ----------------------------------------------------------------------
6964 PROCEDURE check_unit_quarantined(
6965       p_visit_id           IN  NUMBER,
6966       item_instance_id     IN  NUMBER
6967       )
6968 IS
6969    L_API_NAME  CONSTANT VARCHAR2(30) := 'check_unit_quarantined';
6970    L_DEBUG_KEY CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
6971    l_unit_name          VARCHAR2(80);
6972    l_quarantined        VARCHAR2(1);
6973    l_task_number        NUMBER(15);
6974    l_instance_id        NUMBER;
6975 
6976    CURSOR c_get_tasknumbers (x_visit_id IN NUMBER) IS
6977     SELECT visit_task_number,instance_id
6978     FROM ahl_visit_tasks_vl
6979     WHERE visit_id = p_visit_id
6980      AND NVL(STATUS_CODE,'X') NOT IN ('DELETED','RELEASED')
6981      AND TASK_TYPE_CODE <> 'SUMMARY';
6982 BEGIN
6983 
6984    IF (l_log_procedure >= l_log_current_level) THEN
6985       fnd_log.string(l_log_procedure,L_DEBUG_KEY||'.begin', 'At the start of PL SQL procedure');
6986       fnd_log.string(l_log_procedure,L_DEBUG_KEY,'p_visit_id : '|| p_visit_id || 'item_instance_id : '|| item_instance_id);
6987    END IF;
6988 
6989    IF item_instance_id IS NOT NULL THEN
6990    -- If the Visit header has an instance id, check for the corresponding Unit
6991       l_quarantined := ahl_util_uc_pkg.is_unit_quarantined(null,item_instance_id);
6992       IF l_quarantined = FND_API.G_TRUE THEN
6993          l_unit_name := ahl_util_uc_pkg.get_unit_name(item_instance_id);
6994          Fnd_Message.SET_NAME('AHL','AHL_VWP_VLD_HDR_UNIT_QRNT');
6995          -- The Unit for this Visit (UNIT_NAME-1) is quarantined.
6996          Fnd_Message.Set_Token('UNIT_NAME',l_unit_name);
6997          Fnd_Msg_Pub.ADD;
6998 
6999          IF (l_log_statement >= l_log_current_level)THEN
7000             fnd_log.string (l_log_statement,L_DEBUG_KEY,'Unit : '||l_unit_name || ' is quarantined, Error message added');
7001          END IF;
7002       END IF;  -- l_quarantined not true
7003    ELSE -- instance id is null
7004    -- If the visit does not have a unit at the header , then check for the units of all tasks
7005       OPEN c_get_tasknumbers (p_visit_id);
7006       LOOP
7007          FETCH c_get_tasknumbers INTO l_task_number,l_instance_id;
7008          EXIT WHEN c_get_tasknumbers%NOTFOUND;
7009          l_quarantined := ahl_util_uc_pkg.is_unit_quarantined(null,l_instance_id);
7010          IF l_quarantined = FND_API.G_TRUE THEN
7011             Fnd_Message.SET_NAME('AHL','AHL_VWP_VLD_TSK_UNIT_QRNT');
7012             -- The Unit for the Task (UNIT_NAME-1) is quarantined.
7013             Fnd_Message.Set_Token('TASK_NUMBER',l_task_number);
7014             Fnd_Msg_Pub.ADD;
7015             IF (l_log_statement >= l_log_current_level)THEN
7016                fnd_log.string(l_log_statement,L_DEBUG_KEY,'Unit for this task: '||l_task_number||' is quarantined');
7017             END IF;
7018          END IF;  -- l_quarantined not true
7019       END LOOP;   --  c_get_tasknumbers
7020    END IF;
7021 
7022    IF (l_log_procedure >= l_log_current_level) THEN
7023       fnd_log.string(l_log_procedure,L_DEBUG_KEY ||'.end','At the end of PL SQL procedure ');
7024    END IF;
7025 END check_unit_quarantined;
7026 
7027 -------------------------------------------------------------------
7028 --  Procedure name    : Release_MR
7029 --  Type              : Private
7030 --
7031 --
7032 --  Function          :To release all MRs associated to a given UE and return
7033 --                     workorder ID for the root task. Requested by MEL/CDL.
7034 --                     If p_module_type is 'PROD' and Validate_Before_Production
7035 --                     fails, then no exception will be thrown and calling API is
7036 --                     responsible to check return status ('V') and read from error stack.
7037 --  Pre-reqs    :
7038 --  Parameters  :
7039 --
7040 --  Standard IN  Parameters :
7041 --      p_api_version                   IN      NUMBER       Required
7042 --      p_init_msg_list                 IN      VARCHAR2     Default  FND_API.G_FALSE
7043 --      p_commit                        IN      VARCHAR2     Default  FND_API.G_FALSE
7044 --      p_validation_level              IN      NUMBER       Default  FND_API.G_VALID_LEVEL_FULL
7045 --
7046 --  Standard OUT Parameters :
7047 --      x_return_status                 OUT     VARCHAR2               Required ='V' if validation fails
7048 --      x_msg_count                     OUT     NUMBER                 Required
7049 --      x_msg_data                      OUT     VARCHAR2               Required
7050 --      x_workorder_id                  OUT     NUMBER                 Required
7051 --
7052 --  Release visit Parameters:
7053 --       p_visit_id                     IN   NUMBER  Required
7054 --       p_unit_effectivity_id          IN   NUMBER  Required
7055 --       p_release_flag                 IN   VARCHAR2 optional
7056 --
7057 --  Version :
7058 --    07/21/2005     YAZHOU   Initial  Creation
7059 -------------------------------------------------------------------
7060 PROCEDURE Release_MR (
7061     p_api_version            IN            NUMBER,
7062     p_init_msg_list          IN            VARCHAR2  := Fnd_Api.G_FALSE,
7063     p_commit                 IN            VARCHAR2  := Fnd_Api.G_FALSE,
7064     p_validation_level       IN            NUMBER    := Fnd_Api.G_VALID_LEVEL_FULL,
7065     p_module_type            IN            VARCHAR2  := NULL,
7066     p_visit_id               IN            NUMBER,
7067     p_unit_effectivity_id    IN            NUMBER,
7068     p_release_flag           IN            VARCHAR2  := 'N',
7069     x_workorder_id              OUT NOCOPY NUMBER,
7070     x_return_status             OUT NOCOPY VARCHAR2,
7071     x_msg_count                 OUT NOCOPY NUMBER,
7072     x_msg_data                  OUT NOCOPY VARCHAR2)
7073 IS
7074     --Standard local variables
7075     l_api_name       CONSTANT VARCHAR2(30)  := 'Release_MR';
7076     l_api_version    CONSTANT NUMBER        := 1.0;
7077     L_DEBUG_KEY      CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
7078     l_msg_data                VARCHAR2(2000);
7079     l_return_status           VARCHAR2(1);
7080     l_msg_count               NUMBER;
7081     l_Error_Tbl_Type          Error_Tbl_Type;
7082     l_error_msg               VARCHAR2(5000);
7083     l_error_count             NUMBER;
7084     l_commit                  VARCHAR2(1) := 'F';
7085     l_validate_error CONSTANT VARCHAR2(1) := 'V';
7086     l_MR_end_time             DATE;
7087     l_visit_end_time          DATE;
7088 
7089     -- To find visit related information
7090    CURSOR c_visit (x_id IN NUMBER) IS
7091     SELECT * FROM AHL_VISITS_VL
7092     WHERE VISIT_ID = x_id;
7093    c_visit_rec c_visit%ROWTYPE;
7094 
7095    CURSOR get_wo(c_visit_id NUMBER, c_unit_effectivity_id NUMBER) IS
7096    SELECT workorder_id
7097    FROM AHL_WORKORDERS
7098    WHERE VISIT_TASK_ID = (select visit_task_id from ahl_visit_tasks_b
7099                           where visit_id = c_visit_id
7100                           and unit_effectivity_id = c_unit_effectivity_id
7101                           AND NVL(status_code, 'Y') <> 'DELETED'
7102                           and originating_task_id is null)
7103      AND STATUS_CODE NOT IN ('7', '22');
7104 
7105    CURSOR c_get_wo_details(x_visit_id IN NUMBER)
7106    IS
7107    SELECT
7108         scheduled_start_date,
7109         SCHEDULED_COMPLETION_DATE
7110    FROM   wip_discrete_jobs
7111    WHERE wip_entity_id =
7112         (
7113          SELECT
7114          wip_entity_id
7115          FROM ahl_workorders
7116          WHERE
7117            master_workorder_flag = 'Y' AND
7118            visit_task_id IS null AND
7119            status_code not in (22,7) and
7120            visit_id=x_visit_id
7121           );
7122    c_get_wo_details_rec  c_get_wo_details%ROWTYPE;
7123 
7124   -- get end time of the root task for a given UE
7125    CURSOR get_summary_task_times_csr(x_visit_id IN NUMBER, x_unit_effectivity_id IN NUMBER)IS
7126       SELECT max(end_date_time)
7127       FROM ahl_visit_tasks_b VST
7128       where visit_id = x_visit_id
7129         AND NVL(VST.status_code, 'Y') <> 'DELETED'
7130       START WITH unit_effectivity_id = x_unit_effectivity_id
7131         and originating_task_id is null
7132       CONNECT BY originating_task_id = PRIOR visit_task_id;
7133 
7134 -- Get all the parent tasks for a given UE that start in a past date
7135 CURSOR get_independent_tasks(x_visit_id IN NUMBER, x_unit_effectivity_id IN NUMBER) IS
7136   select distinct t.visit_task_id
7137     from ahl_visit_tasks_b t,
7138          ahl_visits_b v
7139    where v.visit_id = x_visit_id
7140      and v.visit_id = t.visit_id
7141      and v.status_code = 'PARTIALLY RELEASED'
7142      and t.start_date_time < SYSDATE
7143      and t.status_code ='PLANNING'
7144      and t.task_type_code <>'SUMMARY'
7145      and (not exists (select 1 from ahl_task_links l0
7146                       where l0.parent_task_id = t.visit_task_id
7147                          or l0.visit_task_id = t.visit_task_id )
7148           or t.visit_task_id in (select l1.parent_task_id from ahl_task_links l1
7149                                   where not exists (select l2.visit_task_id from ahl_task_links l2
7150                                                      where l2.visit_task_id = l1.parent_task_id)))
7151     /*NR-MR Changes - For SR's created from non-routines have the originating wo as their originating task, hence they are not null.*/
7152     START WITH t.unit_effectivity_id  = x_unit_effectivity_id
7153         AND (( t.originating_task_id is null AND 'SR' <> p_module_type)
7154             OR ( t.originating_task_id is not null AND 'SR' = p_module_type
7155                  and t.service_request_id is not null))
7156     CONNECT BY t.originating_task_id = PRIOR visit_task_id;
7157 
7158 BEGIN
7159 
7160     IF (l_log_procedure >= l_log_current_level) THEN
7161       fnd_log.string(l_log_procedure,L_DEBUG_KEY ||'.begin','At the start of PL SQL procedure. Visit Id = ' || p_visit_id);
7162     END IF;
7163 
7164     -- Standard start of API savepoint
7165     SAVEPOINT Release_MR;
7166 
7167     -- Initialize message list if p_init_msg_list is set to TRUE
7168     IF FND_API.To_Boolean( p_init_msg_list) THEN
7169        FND_MSG_PUB.Initialize;
7170     END IF;
7171 
7172     -- Initialize API return status to success
7173     x_return_status := FND_API.G_RET_STS_SUCCESS;
7174 
7175     -- Standard call to check for call compatibility.
7176     IF NOT FND_API.COMPATIBLE_API_CALL(l_api_version,
7177                                       p_api_version,
7178                                       l_api_name,G_PKG_NAME)THEN
7179        RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
7180     END IF;
7181 
7182     IF (l_log_statement >= l_log_current_level) THEN
7183       fnd_log.string(l_log_statement,L_DEBUG_KEY,'Request for Release_MR Visit ID : ' || p_visit_id);
7184       fnd_log.string(l_log_statement,L_DEBUG_KEY,'Request for Release_MR UE ID : ' || p_unit_effectivity_id);
7185       fnd_log.string(l_log_statement,L_DEBUG_KEY,'Request for Release_MR Release Flag : ' || p_release_flag);
7186     END IF;
7187 
7188     -- Check for Required Parameters
7189     IF(p_visit_id IS NULL OR p_visit_id = FND_API.G_MISS_NUM) THEN
7190        FND_MESSAGE.Set_Name(G_PM_PRODUCT_CODE,'AHL_VWP_CST_INPUT_MISS');
7191        FND_MSG_PUB.ADD;
7192        IF (l_log_unexpected >= l_log_current_level)THEN
7193            fnd_log.string(l_log_unexpected,L_DEBUG_KEY,'Visit id is mandatory but found null in input');
7194        END IF;
7195        RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
7196     END IF;
7197 
7198     IF(p_unit_effectivity_id IS NULL OR p_unit_effectivity_id = FND_API.G_MISS_NUM) THEN
7199        FND_MESSAGE.Set_Name(G_PM_PRODUCT_CODE,'AHL_VWP_UE_INPUT_MISS');
7200        FND_MSG_PUB.ADD;
7201        IF (l_log_unexpected >= l_log_current_level)THEN
7202            fnd_log.string(l_log_unexpected,L_DEBUG_KEY,'Unit Effectivity id is mandatory but found null in input ');
7203        END IF;
7204        RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
7205     END IF;
7206 
7207     IF (l_log_statement >= l_log_current_level)THEN
7208         fnd_log.string(l_log_statement,L_DEBUG_KEY,'Before Calling Validate Before Production for visit Id: ' ||p_visit_id);
7209     END IF;
7210 
7211     --Valdate before push to production happens
7212     Validate_Before_Production
7213               (p_api_version       => l_api_version,
7214                p_init_msg_list     => p_init_msg_list,
7215                p_commit            => l_commit,
7216                p_validation_level  => p_validation_level,
7217                p_module_type       => p_module_type,
7218                p_visit_id          => p_visit_id,
7219                x_error_tbl         => l_error_tbl_type,
7220                x_return_status     => l_return_status,
7221                x_msg_count         => x_msg_count,
7222                x_msg_data          => x_msg_data);
7223 
7224     IF (l_log_statement >= l_log_current_level)THEN
7225       fnd_log.string(l_log_statement,L_DEBUG_KEY,'After Calling Validate Before Production - l_return_status : '|| l_return_status);
7226     END IF;
7227 
7228     IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
7229        -- Check Error Message stack.
7230        x_msg_count := FND_MSG_PUB.count_msg;
7231        IF (l_log_statement >= l_log_current_level)THEN
7232         fnd_log.string(l_log_statement,L_DEBUG_KEY,'Errors from Validate Before Production' || x_msg_count);
7233        END IF;
7234        RAISE Fnd_Api.g_exc_error;
7235     END IF;
7236 
7237     IF l_error_tbl_type.COUNT > 0 THEN
7238       x_return_status := l_validate_error;
7239     ELSE
7240       OPEN c_visit (p_visit_id);
7241       FETCH c_visit INTO c_visit_rec;
7242       CLOSE c_visit;
7243       -- Adjust Task Start/End time if visit start date is a past date
7244       -- ER #4552764
7245 
7246       IF c_visit_rec.STATUS_CODE = 'PARTIALLY RELEASED' AND c_visit_rec.start_date_time < SYSDATE THEN
7247         FOR l_get_independent_tasks IN get_independent_tasks(c_visit_rec.visit_id,p_unit_effectivity_id)
7248         LOOP
7249           AHL_VWP_TIMES_PVT.adjust_task_times(
7250                                p_api_version           => 1.0,
7251                                p_init_msg_list         => Fnd_Api.G_FALSE,
7252                                p_commit                => Fnd_Api.G_FALSE,
7253                                p_validation_level      => Fnd_Api.G_VALID_LEVEL_FULL,
7254                                x_return_status         => l_return_status,
7255                                x_msg_count             => l_msg_count,
7256                                x_msg_data              => l_msg_data,
7257                                p_task_id               => l_get_independent_tasks.visit_task_id,
7258                                p_reset_sysdate_flag    => FND_API.G_TRUE);
7259         END LOOP;
7260         l_visit_end_time := AHL_VWP_TIMES_PVT.get_visit_end_time(c_visit_rec.visit_id);
7261         IF l_visit_end_time > c_visit_rec.close_date_time THEN
7262           Fnd_Message.SET_NAME('AHL','AHL_VWP_PRD_VST_TSK_STDT_ADJU');
7263           Fnd_Message.Set_Token('VISIT_END_DATE', l_visit_end_time);
7264           Fnd_Msg_Pub.ADD;
7265           x_return_status := l_validate_error;
7266         END IF;
7267       END IF;
7268     END IF;
7269 
7270     IF x_return_status = FND_API.G_RET_STS_SUCCESS THEN
7271       /* Check visit end date instead
7272            --The MR end date
7273            OPEN get_summary_task_times_csr(p_visit_id, p_unit_effectivity_id);
7274            FETCH get_summary_task_times_csr into l_MR_end_time;
7275            CLOSE get_summary_task_times_csr;
7276       */
7277      l_visit_end_time := AHL_VWP_TIMES_PVT.get_visit_end_time(c_visit_rec.visit_id);
7278 
7279      OPEN c_get_wo_details(c_visit_rec.visit_id);
7280      FETCH c_get_wo_details into c_get_wo_details_rec;
7281      -- Validate to check if derived visit end time now exceeds scheduled master work order completion time
7282      -- Note: since we are checking for derived visit end time here, if there are other task in planning
7283      -- status with end date exceeding visit master WO end date, then MR tasks cannot be created
7284      IF TRUNC(l_visit_end_time) > TRUNC(c_get_wo_details_rec.scheduled_completion_date) THEN
7285         x_return_status := l_validate_error;
7286         -- Error Message
7287         Fnd_Message.SET_NAME('AHL','AHL_VWP_DATE_EXCD_WO_DATE');
7288         Fnd_Message.Set_Token('VISIT_END_DATE', l_visit_end_time);
7289         FND_MSG_PUB.ADD;
7290      END IF;
7291     END IF;
7292 
7293     IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
7294       -- Per MEL/CDL requirement, if tasks are sucessfully created but fail to be pushed
7295       -- to production, then they will stay in 'PLANNING' status.
7296       IF p_module_type <>'PROD' THEN
7297         -- Check Error Message stack.
7298         x_msg_count := FND_MSG_PUB.count_msg;
7299         IF (l_log_statement >= l_log_current_level)THEN
7300           fnd_log.string(l_log_statement,L_DEBUG_KEY,'Errors from Validate Before Production'|| x_msg_count);
7301         END IF;
7302         RAISE Fnd_Api.g_exc_error;
7303       END IF;
7304     ELSE
7305       IF (l_log_statement >= l_log_current_level)THEN
7306          fnd_log.string(l_log_statement,L_DEBUG_KEY,'Before Calling Push_MR_to_Production for UE Id: ' ||p_unit_effectivity_id);
7307       END IF;
7308 
7309       Push_MR_to_Production
7310              (p_api_version        => l_api_version,
7311               p_init_msg_list      => p_init_msg_list,
7312               p_commit             => l_commit,
7313               p_validation_level   => p_validation_level,
7314               p_module_type        => p_module_type,
7315               p_visit_id           => p_visit_id,
7316               p_unit_effectivity_id => p_unit_effectivity_id,
7317               p_release_flag       => p_release_flag,
7318               x_return_status      => l_return_status,
7319               x_msg_count          => l_msg_count,
7320               x_msg_data           => l_msg_data);
7321 
7322       IF (l_log_statement >= l_log_current_level)THEN
7323          fnd_log.string(l_log_statement,L_DEBUG_KEY,'After Calling Push_MR_to_Production - l_return_status : ' ||l_return_status);
7324       END IF;
7325 
7326       IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
7327        -- Check Error Message stack.
7328        x_msg_count := FND_MSG_PUB.count_msg;
7329        IF (l_log_statement >= l_log_current_level)THEN
7330         fnd_log.string(l_log_statement,L_DEBUG_KEY,'Errors from Push to Production: ' || x_msg_count);
7331        END IF;
7332        RAISE Fnd_Api.g_exc_error;
7333       END IF;
7334 
7335       /*Return root root workorder ID for the given UE*/
7336       OPEN get_wo(p_visit_id, p_unit_effectivity_id);
7337       FETCH get_wo INTO x_workorder_id;
7338       CLOSE get_wo;
7339     END IF;
7340 
7341     -- Standard check of p_commit
7342     IF FND_API.TO_BOOLEAN(p_commit) THEN
7343       COMMIT WORK;
7344     END IF;
7345 
7346     Fnd_Msg_Pub.count_and_get(
7347          p_encoded => Fnd_Api.g_false,
7348          p_count   => x_msg_count,
7349          p_data    => x_msg_data);
7350 
7351     IF (l_log_procedure >= l_log_current_level)THEN
7352         fnd_log.string(l_log_procedure,L_DEBUG_KEY||'.end','At the end of PLSQL procedure');
7353     END IF;
7354 
7355 EXCEPTION
7356  WHEN FND_API.G_EXC_ERROR THEN
7357    x_return_status := FND_API.G_RET_STS_ERROR;
7358    ROLLBACK TO Release_MR;
7359    FND_MSG_PUB.count_and_get( p_count => x_msg_count,
7360                               p_data  => x_msg_data,
7361                               p_encoded => fnd_api.g_false);
7362 
7363 
7364  WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
7365    x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
7366    ROLLBACK TO Release_MR;
7367    FND_MSG_PUB.count_and_get( p_count => x_msg_count,
7368                               p_data  => x_msg_data,
7369                               p_encoded => fnd_api.g_false);
7370 
7371 
7372  WHEN OTHERS THEN
7373     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
7374     ROLLBACK TO Release_MR;
7375     IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
7376        fnd_msg_pub.add_exc_msg(p_pkg_name       => G_PKG_NAME,
7377                                p_procedure_name => 'Release_MR',
7378                                p_error_text     => SUBSTR(SQLERRM,1,500));
7379     END IF;
7380     FND_MSG_PUB.count_and_get( p_count => x_msg_count,
7381                                p_data  => x_msg_data,
7382                                p_encoded => fnd_api.g_false);
7383 
7384 END Release_MR;
7385 
7386 --------------------------------------------------------------------
7387 -- PROCEDURE
7388 --    Get_MR_Dependencies
7389 --
7390 -- PURPOSE
7391 -- To get all the Technical Dependencies for the MR.
7392 --------------------------------------------------------------------
7393 
7394 PROCEDURE Get_MR_Dependencies
7395 (
7396   p_visit_id             IN            NUMBER,
7397   p_visit_number         IN            NUMBER,
7398   p_unit_effectivity_id  IN            NUMBER,
7399   p_module_type          IN            VARCHAR2  := Null, /*NR-MR Changes - sowsubra*/
7400   p_x_relationship_tbl   IN OUT NOCOPY AHL_PRD_WORKORDER_PVT.prd_workorder_rel_tbl
7401 )
7402 AS
7403 
7404 -- Get all the Task Dependencies for the given MR.
7405 CURSOR get_tech_dependencies( c_visit_id NUMBER, c_unit_effectivity_id NUMBER )
7406 IS
7407 SELECT distinct PARENT.visit_task_number parent_task_number,
7408        CHILD.visit_task_number child_task_number
7409 FROM   AHL_VISIT_TASKS_B PARENT,
7410        AHL_VISIT_TASKS_B CHILD,
7411        AHL_TASK_LINKS LINK
7412 WHERE  PARENT.visit_task_id = LINK.parent_task_id
7413 AND    CHILD.visit_task_id = LINK.visit_task_id
7414 AND    NVL(PARENT.STATUS_CODE,'X') = 'PLANNING' --Srini Bug #4075702
7415 AND    PARENT.visit_id = c_visit_id
7416 AND    CHILD.visit_id = c_visit_id
7417 AND PARENT.visit_task_id in (select visit_task_id from ahl_visit_tasks_b
7418                              where visit_id = c_visit_id
7419                               /*NR-MR Changes - For SR's created from non-routines have the originating wo as their originating task, hence they are not null.*/
7420                              START WITH unit_effectivity_id  = c_unit_effectivity_id
7421                                 AND (( originating_task_id is null AND 'SR' <> p_module_type)
7422                                       OR ( originating_task_id is not null AND 'SR' = p_module_type
7423                                             and service_request_id is not null))
7424                              CONNECT BY originating_task_id = PRIOR visit_task_id)
7425 AND CHILD.visit_task_id in ( select visit_task_id from ahl_visit_tasks_b
7426                              where visit_id = c_visit_id
7427                              /*NR-MR Changes - For SR's created from non-routines have the originating wo as their originating task, hence they are not null.*/
7428                              START WITH unit_effectivity_id  = c_unit_effectivity_id
7429                                 AND (( originating_task_id is null AND 'SR' <> p_module_type)
7430                                       OR ( originating_task_id is not null AND 'SR' = p_module_type
7431                                             and service_request_id is not null))
7432                              CONNECT BY originating_task_id = PRIOR visit_task_id);
7433 
7434 l_api_name CONSTANT VARCHAR2(30):= 'Get_MR_Dependencies';
7435 L_DEBUG_KEY    CONSTANT VARCHAR2(100):= 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
7436 rel_count           NUMBER;
7437 
7438 BEGIN
7439 
7440   IF (l_log_procedure >= l_log_current_level) THEN
7441     fnd_log.string(l_log_procedure,L_DEBUG_KEY||'.begin','At the start of the procedure');
7442   END IF;
7443 
7444   rel_count := p_x_relationship_tbl.COUNT;
7445 
7446   IF (l_log_statement >= l_log_current_level) THEN
7447     fnd_log.string(l_log_statement,L_DEBUG_KEY,'rel_count - '||rel_count);
7448   END IF;
7449 
7450   -- Get the Technical Dependencies between Visit Tasks for a Visit.
7451   FOR tsk_cursor IN get_tech_dependencies( p_visit_id , p_unit_effectivity_id) LOOP
7452     rel_count := rel_count + 1;
7453     p_x_relationship_tbl(rel_count).batch_id := p_visit_number;
7454     p_x_relationship_tbl(rel_count).parent_header_id := tsk_cursor.parent_task_number;
7455     p_x_relationship_tbl(rel_count).child_header_id := tsk_cursor.child_task_number;
7456     p_x_relationship_tbl(rel_count).relationship_type := 2;
7457     p_x_relationship_tbl(rel_count).dml_operation := 'C';
7458   END LOOP;
7459 
7460   IF (l_log_procedure >= l_log_current_level) THEN
7461     fnd_log.string(l_log_procedure,L_DEBUG_KEY,'Total Relationships : ' || p_x_relationship_tbl.COUNT);
7462     fnd_log.string(l_log_procedure,L_DEBUG_KEY||'.end','At the end of procedure');
7463   END IF;
7464 
7465 END Get_MR_Dependencies;
7466 
7467 --------------------------------------------------------------------
7468 -- PROCEDURE
7469 --    Get_MR_Relationships
7470 --
7471 -- PURPOSE
7472 -- To get all the Relationships for the MR. These include :
7473 -- 1.A record for Each MR to MR / Visit Relationship.
7474 -- 2.A record for Each Visit Task to MR Relationship.
7475 --------------------------------------------------------------------
7476 
7477 PROCEDURE Get_MR_Relationships
7478 (
7479   p_visit_id            IN            NUMBER,
7480   p_visit_number        IN            NUMBER,
7481   p_unit_effectivity_id IN            NUMBER,
7482   p_module_type         IN            VARCHAR2  := Null, /*NR-MR Changes - sowsubra*/
7483   p_x_relationship_tbl  IN OUT NOCOPY AHL_PRD_WORKORDER_PVT.prd_workorder_rel_tbl
7484 )
7485 AS
7486 -- Get all the MR tasks associated to the given UE.
7487 /*NR-MR Changes - sowsubra - modified the cursor to fetch the sr_id, mr_id and task type*/
7488 CURSOR   get_mrs_for_UE( c_visit_id NUMBER , c_unit_effectivity_id NUMBER)
7489 IS
7490 SELECT   distinct visit_task_id,
7491          visit_task_number,
7492          task_type_code,
7493          service_request_id,
7494          mr_id,
7495          NVL(originating_task_id, -1)
7496 FROM     AHL_VISIT_TASKS_B
7497 WHERE    visit_id = c_visit_id
7498 AND      task_type_code='SUMMARY'
7499 AND NVL(STATUS_CODE, 'X') = 'PLANNING'
7500 /*NR-MR Changes - For SR's created from non-routines have the originating wo as their originating task, hence they are not null.*/
7501 START WITH unit_effectivity_id  = c_unit_effectivity_id
7502    AND (( originating_task_id is null AND 'SR' <> p_module_type)
7503         OR ( originating_task_id is not null AND 'SR' = p_module_type
7504              and service_request_id is not null))
7505 CONNECT BY originating_task_id = PRIOR visit_task_id
7506 order by 2;
7507 
7508 TYPE mr_task_rec_type IS RECORD
7509 (
7510   visit_task_id        NUMBER,
7511   visit_task_number    NUMBER,
7512   /*NR-MR Changes - sowsubra - begin*/
7513   task_type_code       VARCHAR2(30),
7514   service_request_id   NUMBER,
7515   mr_id                NUMBER,
7516   /*NR-MR Changes - sowsubra - end*/
7517   originating_task_id  NUMBER
7518 );
7519 
7520 TYPE mr_task_tbl_type IS TABLE OF mr_task_rec_type INDEX BY BINARY_INTEGER;
7521 
7522 l_mrs_for_UE  mr_task_tbl_type;
7523 
7524 -- Get all the Tasks associated to a MR.
7525 CURSOR get_tasks_for_mr( c_visit_id NUMBER, c_mr_task_id NUMBER )
7526 IS
7527 SELECT visit_task_number, visit_task_id
7528 FROM   AHL_VISIT_TASKS_B
7529 WHERE  visit_id = c_visit_id
7530 AND    originating_task_id = c_mr_task_id
7531 AND    task_type_code <> 'SUMMARY'
7532 AND NVL(STATUS_CODE, 'X') = 'PLANNING';
7533 
7534 CURSOR get_wo(c_visit_task_id NUMBER)
7535 IS
7536 SELECT wip_entity_id
7537 FROM AHL_WORKORDERS
7538 WHERE VISIT_TASK_ID = c_visit_task_id
7539 AND STATUS_CODE NOT IN ('7', '22');
7540 
7541 CURSOR get_parent_wo(c_visit_task_id NUMBER)
7542 IS
7543 SELECT wip_entity_id
7544 FROM AHL_WORKORDERS
7545 WHERE VISIT_TASK_ID = c_visit_task_id
7546 AND STATUS_CODE NOT IN ('7', '22');
7547 
7548 CURSOR get_mwo(c_visit_id NUMBER)
7549 IS
7550 SELECT wip_entity_id
7551 FROM AHL_WORKORDERS
7552 WHERE visit_id = c_visit_id
7553 AND VISIT_TASK_ID IS NULL
7554 AND MASTER_WORKORDER_FLAG = 'Y'
7555 AND STATUS_CODE NOT IN ('7', '22');
7556 
7557 l_api_name        CONSTANT    VARCHAR2(30):= 'Get_MR_Relationships';
7558 L_DEBUG_KEY           CONSTANT   VARCHAR2(100):= 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
7559 
7560 l_wip_entity_id      NUMBER;
7561 l_parent_wip_entity_id      NUMBER;
7562 /*NR-MR Changes - sowsubra - begin*/
7563 l_parent_wo_id      NUMBER := 0;
7564 /*NR-MR Changes - sowsubra - end*/
7565 
7566 rel_count    NUMBER := 0;
7567 mr_count     NUMBER := 0;
7568 
7569 BEGIN
7570 
7571   IF (l_log_procedure >= l_log_current_level) THEN
7572     fnd_log.string(l_log_procedure,L_DEBUG_KEY||'.begin','At the start of the procedure');
7573   END IF;
7574 
7575   rel_count := p_x_relationship_tbl.COUNT;
7576 
7577   IF (l_log_statement >= l_log_current_level) THEN
7578     fnd_log.string(l_log_statement,L_DEBUG_KEY,'rel_count - '||rel_count);
7579   END IF;
7580 
7581   -- Get all the Task Records corresponding to a MR for the given UE.
7582   OPEN get_mrs_for_UE( p_visit_id, p_unit_effectivity_id );
7583   LOOP
7584     EXIT WHEN get_mrs_for_UE%NOTFOUND;
7585     mr_count := mr_count + 1;
7586     FETCH get_mrs_for_UE
7587     INTO  l_mrs_for_UE(mr_count).visit_task_id,
7588           l_mrs_for_UE(mr_count).visit_task_number,
7589           /*NR-MR Changes - sowsubra - begin*/
7590           l_mrs_for_UE(mr_count).task_type_code,
7591           l_mrs_for_UE(mr_count).service_request_id,
7592           l_mrs_for_UE(mr_count).mr_id,
7593           /*NR-MR Changes - sowsubra - end*/
7594           l_mrs_for_UE(mr_count).originating_task_id;
7595   END LOOP;
7596   CLOSE get_mrs_for_UE;
7597 
7598   IF (l_log_statement >= l_log_current_level) THEN
7599     fnd_log.string(l_log_statement,L_DEBUG_KEY,'Total MRs for Visit : ' || l_mrs_for_UE.COUNT);
7600   END IF;
7601 
7602   OPEN get_mwo(p_visit_id);
7603   FETCH get_mwo INTO l_parent_wip_entity_id;
7604   CLOSE get_mwo;
7605 
7606   IF ( l_mrs_for_UE.COUNT > 0 ) THEN
7607     FOR i IN l_mrs_for_UE.FIRST..l_mrs_for_UE.LAST LOOP
7608     -- if the visit task already has a workorder then do not
7609     -- create a relationship for it
7610     OPEN get_wo(l_mrs_for_UE(i).visit_task_id);
7611     FETCH get_wo INTO l_wip_entity_id;
7612     IF get_wo%NOTFOUND THEN
7613         rel_count := rel_count + 1;
7614         p_x_relationship_tbl(rel_count).batch_id := p_visit_number;
7615         p_x_relationship_tbl(rel_count).child_header_id := l_mrs_for_UE(i).visit_task_number;
7616         p_x_relationship_tbl(rel_count).relationship_type := 1;
7617         p_x_relationship_tbl(rel_count).dml_operation := 'C';
7618 
7619         -- Loop to Find out Parent MRs
7620         IF ( l_mrs_for_UE(i).originating_task_id <> -1 ) THEN
7621           /*NR-MR Changes - sowsubra - begin*/
7622           /*MWO created for the SR Summary task should be child of visit MWO only.
7623           Hence the parent of the SR Summary task created from production will be visit.*/
7624           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
7625             /*OPEN get_mwo(p_visit_id);
7626             FETCH get_mwo INTO l_parent_wip_entity_id;
7627             CLOSE get_mwo;*/
7628             p_x_relationship_tbl(rel_count).parent_wip_entity_id := l_parent_wip_entity_id;
7629             p_x_relationship_tbl(rel_count).parent_header_id := 0;
7630           ELSE
7631             /*NR-MR Changes - sowsubra - end*/
7632             FOR j IN l_mrs_for_UE.FIRST..l_mrs_for_UE.LAST LOOP
7633               IF ( l_mrs_for_UE(i).originating_task_id = l_mrs_for_UE(j).visit_task_id ) THEN
7634                 p_x_relationship_tbl(rel_count).parent_header_id := l_mrs_for_UE(j).visit_task_number;
7635                 OPEN get_parent_wo(l_mrs_for_UE(j).visit_task_id);
7636                 FETCH get_parent_wo INTO l_parent_wo_id;
7637                 IF get_parent_wo%FOUND THEN
7638                   p_x_relationship_tbl(rel_count).parent_wip_entity_id := l_parent_wo_id;
7639                 END IF;
7640                 CLOSE get_parent_wo;
7641                 EXIT;
7642               END IF;
7643             END LOOP;
7644           END IF; /*NR-MR Changes - sowsubra*/
7645         END IF;
7646 
7647         -- If no Parent MR is found set the parent as the Visit
7648         IF ( p_x_relationship_tbl(rel_count).parent_header_id IS NULL ) THEN
7649           p_x_relationship_tbl(rel_count).parent_header_id := 0;
7650           /*OPEN get_mwo(p_visit_id);
7651           FETCH get_mwo INTO l_parent_wip_entity_id;
7652           IF get_mwo%FOUND THEN*/
7653           p_x_relationship_tbl(rel_count).parent_wip_entity_id := l_parent_wip_entity_id;
7654           /*END IF;
7655           CLOSE get_mwo;*/
7656         END IF;
7657     END IF;
7658     CLOSE get_wo;
7659 
7660     IF (l_log_statement >= l_log_current_level) THEN
7661       fnd_log.string(l_log_statement,L_DEBUG_KEY,'Total MRs for Visit : ' || l_mrs_for_UE.COUNT);
7662     END IF;
7663     END LOOP;
7664   END IF;
7665 
7666   IF (l_log_statement >= l_log_current_level) THEN
7667     fnd_log.string(l_log_statement,L_DEBUG_KEY,'Getting Tasks for MRs');
7668   END IF;
7669   -- Get all the Tasks for a MR.
7670   IF ( l_mrs_for_UE.COUNT > 0 ) THEN
7671     FOR i IN l_mrs_for_UE.FIRST..l_mrs_for_UE.LAST
7672     LOOP
7673       FOR mr_tasks_cursor IN get_tasks_for_mr( p_visit_id, l_mrs_for_UE(i).visit_task_id )
7674       LOOP
7675         OPEN get_wo(mr_tasks_cursor.visit_task_id);
7676         FETCH get_wo INTO l_wip_entity_id;
7677         IF get_wo%NOTFOUND THEN
7678            rel_count := rel_count + 1;
7679            p_x_relationship_tbl(rel_count).batch_id := p_visit_number;
7680            p_x_relationship_tbl(rel_count).parent_header_id := l_mrs_for_UE(i).visit_task_number;
7681            p_x_relationship_tbl(rel_count).child_header_id := mr_tasks_cursor.visit_task_number;
7682            p_x_relationship_tbl(rel_count).relationship_type := 1;
7683            p_x_relationship_tbl(rel_count).dml_operation := 'C';
7684 
7685            -- if this visit task is already in shop floor then get the wip_entity_id
7686            OPEN get_parent_wo(l_mrs_for_UE(i).visit_task_id);
7687            FETCH get_parent_wo INTO l_parent_wip_entity_id;
7688            IF get_parent_wo%FOUND THEN
7689                p_x_relationship_tbl(rel_count).parent_wip_entity_id := l_parent_wip_entity_id;
7690            END IF;
7691            CLOSE get_parent_wo;
7692         END IF;
7693         CLOSE get_wo;
7694       END LOOP;
7695     END LOOP;
7696   END IF;
7697 
7698   IF (l_log_procedure >= l_log_current_level) THEN
7699     fnd_log.string(l_log_procedure,L_DEBUG_KEY,'Total Relationships : ' || p_x_relationship_tbl.COUNT );
7700     fnd_log.string(l_log_procedure,L_DEBUG_KEY||'.end','At the end of the procedure');
7701   END IF;
7702 
7703 END Get_MR_Relationships;
7704 
7705 --------------------------------------------------------------------
7706 -- PROCEDURE
7707 --    Push_MR_to_Production
7708 --
7709 -- PURPOSE
7710 --    To push MR along with all its tasks to Production
7711 --------------------------------------------------------------------
7712 PROCEDURE Push_MR_to_Production
7713 (    p_api_version          IN  NUMBER,
7714      p_init_msg_list        IN  VARCHAR2  := Fnd_Api.g_false,
7715      p_commit               IN  VARCHAR2  := Fnd_Api.g_false,
7716      p_validation_level     IN  NUMBER    := Fnd_Api.g_valid_level_full,
7717      p_module_type          IN  VARCHAR2  := Null,
7718      p_visit_id             IN  NUMBER,
7719      p_unit_effectivity_id  IN  NUMBER,
7720      p_release_flag         IN  VARCHAR2  := 'N',
7721      x_return_status        OUT NOCOPY VARCHAR2,
7722      x_msg_count            OUT NOCOPY NUMBER,
7723      x_msg_data             OUT NOCOPY VARCHAR2
7724 )
7725 IS
7726    L_API_VERSION  CONSTANT NUMBER := 1.0;
7727    L_API_NAME     CONSTANT VARCHAR2(30) := 'Push_MR_to_Production';
7728    L_DEBUG_KEY    CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
7729    l_prd_workorder_tbl     AHL_PRD_WORKORDER_PVT.PRD_WORKORDER_TBL;
7730    l_prd_workorder_rel_tbl AHL_PRD_WORKORDER_PVT.PRD_WORKORDER_REL_TBL;
7731    l_firm_planned_flag     VARCHAR2(1) := FND_PROFILE.value( 'AHL_PRD_FIRM_PLANNED_FLAG' );
7732    l_return_status         VARCHAR2(1);
7733    l_msg_count             NUMBER;
7734    l_msg_data              VARCHAR2(2000);
7735    l_init_msg_list         VARCHAR2(1) := 'F';
7736    l_commit                VARCHAR2(1) := 'F';
7737    idx                     NUMBER;
7738    l_count                 NUMBER;
7739    l_route_id              NUMBER;
7740    l_visit_end_time        DATE;
7741    l_dummy                 VARCHAR2(1);
7742 
7743    -- To find visit related information
7744    CURSOR c_visit (x_visit_id IN NUMBER) IS
7745     SELECT * FROM AHL_VISITS_VL
7746     WHERE VISIT_ID = x_visit_id;
7747 
7748    c_visit_rec c_visit%ROWTYPE;
7749 
7750    -- To get all the tasks for the given UE
7751    CURSOR c_task (x_visit_id IN NUMBER, x_unit_effectivity_id IN NUMBER) IS
7752     SELECT * FROM AHL_VISIT_TASKS_VL
7753     WHERE VISIT_ID = x_visit_id
7754     AND NVL( STATUS_CODE, 'X' ) = 'PLANNING'
7755     /*NR-MR Changes*/
7756     START WITH unit_effectivity_id  = x_unit_effectivity_id
7757         AND (( originating_task_id is null AND 'SR' <> p_module_type)
7758             OR ( originating_task_id is not null AND 'SR' = p_module_type
7759                  and service_request_id is not null))
7760     CONNECT BY originating_task_id = PRIOR visit_task_id;
7761 
7762    c_task_rec c_task%ROWTYPE;
7763 
7764    -- To get the count of all the tasks for the given UE
7765    CURSOR c_task_ct (x_visit_id IN NUMBER, x_unit_effectivity_id IN NUMBER) IS
7766     SELECT count(*) FROM AHL_VISIT_TASKS_B
7767     WHERE VISIT_ID = x_visit_id
7768     AND NVL( STATUS_CODE, 'X' ) = 'PLANNING'
7769     /*NR-MR Changes*/
7770     START WITH unit_effectivity_id  = x_unit_effectivity_id
7771         AND (( originating_task_id is null AND 'SR' <> p_module_type)
7772             OR ( originating_task_id is not null AND 'SR' = p_module_type
7773                  and service_request_id is not null))
7774     CONNECT BY originating_task_id = PRIOR visit_task_id;
7775 
7776    -- To find Route Id from MR Routes view
7777    CURSOR c_route (x_id IN NUMBER) IS
7778     SELECT Route_Id FROM AHL_MR_ROUTES_V
7779     WHERE MR_ROUTE_ID = x_id;
7780 
7781   --To get summary task start, end time
7782   CURSOR get_summary_task_times_csr(x_task_id IN NUMBER)IS
7783       SELECT min(start_date_time), max(end_date_time)
7784       FROM ahl_visit_tasks_vl VST
7785       START WITH visit_task_id  = x_task_id
7786         AND NVL(VST.status_code, 'Y') <> 'DELETED'
7787       CONNECT BY originating_task_id = PRIOR visit_task_id;
7788 
7789   CURSOR c_visit_task_exists(x_visit_id IN NUMBER)
7790   IS
7791     SELECT 'x'
7792     FROM   ahl_visit_tasks_b
7793     WHERE  visit_id = x_visit_id
7794     AND  STATUS_CODE = 'PLANNING';
7795 
7796 
7797   CURSOR c_get_wo_details(x_visit_id IN NUMBER)
7798   IS
7799     SELECT
7800         scheduled_start_date,
7801         SCHEDULED_COMPLETION_DATE
7802     FROM   wip_discrete_jobs
7803     WHERE wip_entity_id =
7804         (
7805          SELECT
7806          wip_entity_id
7807          FROM ahl_workorders
7808          WHERE
7809            master_workorder_flag = 'Y' AND
7810            visit_task_id IS null AND
7811            status_code not in (22,7) and
7812            visit_id=x_visit_id
7813           );
7814 
7815    c_get_wo_details_rec  c_get_wo_details%ROWTYPE;
7816    l_curr_task_id   NUMBER := 0;
7817 
7818   -- SATHAPLI::Bug 5758813, 04-Jun-2008
7819   -- Cursor to get the required format for the workorder description, given a visit task.
7820   CURSOR get_wo_dtls_for_mrtasks_cur (c_visit_task_id IN NUMBER) IS
7821   SELECT ar.route_no||'.'||SUBSTR(ar.title, 1, (240 - (LENGTH(ar.route_no) + 1))) workorder_description
7822     FROM ahl_routes_vl ar, ahl_visit_tasks_b avt,
7823          ahl_mr_routes mrr
7824    WHERE avt.visit_task_id         = c_visit_task_id
7825      AND NVL(avt.status_code, 'X') = 'PLANNING'
7826      AND avt.mr_route_id           = mrr.mr_route_id
7827      AND mrr.route_id              = ar.route_id;
7828 
7829   l_get_wo_dtls_rec get_wo_dtls_for_mrtasks_cur%ROWTYPE;
7830 
7831 BEGIN
7832    --------------------- initialize -----------------------
7833 
7834   SAVEPOINT Push_MR_to_Production;
7835 
7836   IF (l_log_procedure >= l_log_current_level) THEN
7837     fnd_log.string(l_log_procedure,L_DEBUG_KEY||'.begin','At the begin of the procedure');
7838   END IF;
7839 
7840   -- Initialize message list if p_init_msg_list is set to TRUE.
7841   IF Fnd_Api.to_boolean(p_init_msg_list) THEN
7842     Fnd_Msg_Pub.initialize;
7843   END IF;
7844 
7845   --  Initialize API return status to success
7846   x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
7847 
7848   -- Standard call to check for call compatibility.
7849   IF NOT Fnd_Api.COMPATIBLE_API_CALL(l_api_version,
7850                                      p_api_version,
7851                                      l_api_name,G_PKG_NAME) THEN
7852     RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
7853   END IF;
7854 
7855   IF (l_log_statement >= l_log_current_level) THEN
7856     fnd_log.string(l_log_statement,L_DEBUG_KEY,'p_unit_effectivity_id : '||p_unit_effectivity_id||'Visit Id : ' || p_visit_id);
7857   END IF;
7858 
7859   --Create project tasks for the given MR
7860   IF (l_log_statement >= l_log_current_level) THEN
7861     fnd_log.string(l_log_statement,L_DEBUG_KEY,'Before calling Add_MR_to_Projects');
7862   END IF;
7863 
7864   Add_MR_to_Project
7865         (p_api_version       => l_api_version,
7866          p_init_msg_list     => p_init_msg_list,
7867          p_commit            => l_commit,
7868          p_validation_level  => p_validation_level,
7869          p_module_type       => p_module_type,
7870          p_visit_id          => p_visit_id,
7871          p_unit_effectivity_id => p_unit_effectivity_id,
7872          x_return_status     => l_return_status,
7873          x_msg_count         => l_msg_count,
7874          x_msg_data          => x_msg_data);
7875 
7876   IF (l_log_statement >= l_log_current_level) THEN
7877     fnd_log.string(l_log_statement,L_DEBUG_KEY,'After calling Add_MR_to_Projects - l_return_status : '||l_return_status);
7878   END IF;
7879 
7880   IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
7881     -- Check Error Message stack.
7882     x_msg_count := FND_MSG_PUB.count_msg;
7883     RAISE Fnd_Api.g_exc_error;
7884   END IF;
7885 
7886   OPEN c_visit (p_visit_id);
7887   FETCH c_visit INTO c_visit_rec;
7888   CLOSE c_visit;
7889 
7890   -- Create Workorders for MR tasks
7891   OPEN c_task_ct(p_visit_id, p_unit_effectivity_id);
7892   FETCH c_task_ct INTO l_count;
7893   CLOSE c_task_ct;
7894 
7895   IF (l_log_statement >= l_log_current_level) THEN
7896     fnd_log.string(l_log_statement,L_DEBUG_KEY,'Task Count' || l_count);
7897   END IF;
7898 
7899   IF l_count > 0 THEN
7900     idx := 0;
7901     OPEN c_task(p_visit_id, p_unit_effectivity_id);
7902     FETCH c_task INTO c_task_rec;
7903     WHILE c_task%FOUND LOOP
7904       IF (l_curr_task_id <> c_task_rec.visit_task_id) THEN
7905         idx := idx+1;
7906         l_prd_workorder_tbl(idx).DML_OPERATION     := 'C';
7907         IF p_release_flag = 'Y' THEN
7908           l_prd_workorder_tbl(idx).STATUS_CODE  := '3';  -- Released
7909         ELSE
7910           l_prd_workorder_tbl(idx).STATUS_CODE  := '1';  -- Unreleased
7911         END IF;
7912 
7913         IF ( l_firm_planned_flag IS NOT NULL AND l_firm_planned_flag = '2' ) THEN
7914           l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG     := 2; -- Planned
7915         ELSE
7916           l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG     := 1; -- Firm
7917         END IF;
7918 
7919         IF ( c_task_rec.task_type_code = 'SUMMARY' ) THEN
7920           l_prd_workorder_tbl(idx).MASTER_WORKORDER_FLAG := 'Y';
7921         ELSE
7922           l_prd_workorder_tbl(idx).MASTER_WORKORDER_FLAG := 'N';
7923         END IF;
7924 
7925         l_prd_workorder_tbl(idx).BATCH_ID := c_visit_rec.visit_number;
7926         l_prd_workorder_tbl(idx).HEADER_ID := c_task_rec.visit_task_number;
7927         l_prd_workorder_tbl(idx).VISIT_ID          := p_visit_id;
7928         l_prd_workorder_tbl(idx).ORGANIZATION_ID   := c_visit_rec.organization_id;
7929         l_prd_workorder_tbl(idx).PROJECT_ID        := c_visit_rec.project_id;
7930         l_prd_workorder_tbl(idx).INVENTORY_ITEM_ID := c_task_rec.inventory_item_id ;
7931         l_prd_workorder_tbl(idx).ITEM_INSTANCE_ID  := c_task_rec.instance_id ;
7932         l_prd_workorder_tbl(idx).VISIT_TASK_ID     := c_task_rec.visit_task_id ;
7933         l_prd_workorder_tbl(idx).VISIT_TASK_NUMBER := c_task_rec.visit_task_number ;
7934         l_prd_workorder_tbl(idx).PROJECT_TASK_ID   := c_task_rec.project_task_id ;
7935 
7936         -- SATHAPLI::Bug 5758813, 04-Jun-2008, fix start
7937         -- For planned (route) tasks, set the workorder description  with the required format.
7938         -- l_prd_workorder_tbl(idx).JOB_DESCRIPTION   := c_task_rec.visit_task_name ;
7939         IF (c_task_rec.task_type_code IN ('SUMMARY','UNASSOCIATED')) THEN
7940           l_prd_workorder_tbl(idx).JOB_DESCRIPTION := c_task_rec.visit_task_name;
7941         ELSE
7942           -- Fetch the required format for the workorder description.
7943           OPEN get_wo_dtls_for_mrtasks_cur(c_task_rec.visit_task_id);
7944           FETCH get_wo_dtls_for_mrtasks_cur INTO l_get_wo_dtls_rec;
7945           CLOSE get_wo_dtls_for_mrtasks_cur;
7946           l_prd_workorder_tbl(idx).JOB_DESCRIPTION := l_get_wo_dtls_rec.workorder_description;
7947         END IF;
7948         -- SATHAPLI::Bug 5758813, 04-Jun-2008, fix end
7949 
7950         IF c_task_rec.mr_route_id IS NOT NULL AND c_task_rec.mr_route_id <> FND_API.g_miss_num THEN
7951           OPEN c_route (c_task_rec.mr_route_id);
7952           FETCH c_route INTO l_route_id;
7953           CLOSE c_route;
7954           l_prd_workorder_tbl(idx).ROUTE_ID := l_route_id ;
7955         ELSE
7956           l_prd_workorder_tbl(idx).ROUTE_ID := Null;
7957         END IF;
7958 
7959         IF c_task_rec.department_id IS NOT NULL
7960         AND c_task_rec.department_id <> FND_API.g_miss_num THEN
7961           l_prd_workorder_tbl(idx).DEPARTMENT_ID   := c_task_rec.department_id ;
7962         ELSE
7963           l_prd_workorder_tbl(idx).DEPARTMENT_ID   := c_visit_rec.department_id ;
7964         END IF;
7965 
7966         --If summary task, use the min,max for sub tasks
7967         IF (c_task_rec.task_type_code = 'SUMMARY') THEN
7968           OPEN get_summary_task_times_csr(c_task_rec.visit_task_id);
7969           FETCH get_summary_task_times_csr INTO l_prd_workorder_tbl(idx).SCHEDULED_START_DATE,
7970                                                 l_prd_workorder_tbl(idx).SCHEDULED_END_DATE  ;
7971           CLOSE get_summary_task_times_csr;
7972         ELSE
7973           l_prd_workorder_tbl(idx).SCHEDULED_START_DATE  := c_task_rec.START_DATE_TIME;
7974           l_prd_workorder_tbl(idx).SCHEDULED_END_DATE    := c_task_rec.END_DATE_TIME;
7975         END IF;
7976         /*NR-MR Changes*/
7977         l_curr_task_id := c_task_rec.visit_task_id;
7978       END IF;
7979       FETCH c_task INTO c_task_rec;
7980     END LOOP;
7981     CLOSE c_task;
7982   END IF; -- l_count
7983 
7984   IF l_prd_workorder_tbl.COUNT > 0  THEN
7985     IF (l_log_statement >= l_log_current_level) THEN
7986       fnd_log.string(l_log_statement,L_DEBUG_KEY,'Before Getting MR Relationships ');
7987     END IF;
7988 
7989     Get_MR_Relationships
7990        (
7991          p_visit_id         => p_visit_id,
7992          p_visit_number     => c_visit_rec.visit_number,
7993          p_unit_effectivity_id  =>p_unit_effectivity_id,
7994          p_module_type       => p_module_type, /*NR-MR Changes - sowsubra*/
7995          p_x_relationship_tbl => l_prd_workorder_rel_tbl
7996        );
7997 
7998     IF (l_log_statement >= l_log_current_level) THEN
7999       fnd_log.string(l_log_statement,L_DEBUG_KEY,'After Getting MR Relationships ');
8000       fnd_log.string(l_log_statement,L_DEBUG_KEY,'Before Getting MR Dependencies ');
8001     END IF;
8002 
8003     Get_MR_Dependencies
8004        (
8005          p_visit_id           => p_visit_id,
8006          p_visit_number       => c_visit_rec.visit_number,
8007          p_unit_effectivity_id  =>p_unit_effectivity_id,
8008          p_module_type       => p_module_type, /*NR-MR Changes - sowsubra*/
8009          p_x_relationship_tbl => l_prd_workorder_rel_tbl
8010        );
8011 
8012     IF (l_log_statement >= l_log_current_level) THEN
8013       fnd_log.string(l_log_statement,L_DEBUG_KEY,'After Getting MR Dependencies ');
8014       fnd_log.string(l_log_statement,L_DEBUG_KEY,'Before calling AHL_PRD_WORKORDER_PVT.Process_Jobs ');
8015     END IF;
8016 
8017     AHL_PRD_WORKORDER_PVT.Process_Jobs
8018      (
8019           p_api_version          => p_api_version,
8020           p_init_msg_list        => p_init_msg_list,
8021           p_commit               => FND_API.G_FALSE,
8022           p_validation_level     => p_validation_level,
8023           p_default              => FND_API.G_TRUE,
8024           p_module_type          => p_module_type,
8025           x_return_status        => l_return_status,
8026           x_msg_count            => x_msg_count,
8027           x_msg_data             => x_msg_data,
8028           p_x_prd_workorder_tbl  => l_prd_workorder_tbl,
8029           p_prd_workorder_rel_tbl=> l_prd_workorder_rel_tbl
8030      );
8031 
8032     IF (l_log_statement >= l_log_current_level) THEN
8033       fnd_log.string(l_log_statement,L_DEBUG_KEY,'After calling AHL_PRD_WORKORDER_PVT.Process_Jobs - l_return_status : '||l_return_status);
8034     END IF;
8035 
8036     IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
8037       IF (l_log_statement >= l_log_current_level) THEN
8038         fnd_log.string(l_log_statement,L_DEBUG_KEY,'Errors from process_jobs API : ' || x_msg_count );
8039       END IF;
8040       RAISE Fnd_Api.g_exc_error;
8041     END IF;
8042 
8043     -- SATHAPLI::Bug 5758813, 04-Jun-2008, fix start
8044     -- Update the project tasks' (corresponding to the visit tasks) start and end date with those of the workorders' created above.
8045     IF (l_log_statement >= l_log_current_level) THEN
8046       fnd_log.string(l_log_statement, l_debug_key, 'Before calling Update_Project_Task_Times.');
8047     END IF;
8048 
8049     Update_Project_Task_Times(
8050       p_prd_workorder_tbl => l_prd_workorder_tbl,
8051       p_commit            => 'F',
8052       x_return_status     => l_return_status,
8053       x_msg_count         => x_msg_count,
8054       x_msg_data          => x_msg_data
8055     );
8056 
8057     IF (l_log_statement >= l_log_current_level) THEN
8058       fnd_log.string(l_log_statement, l_debug_key, 'After calling Update_Project_Task_Times. x_return_status => '||x_return_status);
8059     END IF;
8060 
8061     IF (l_return_status = FND_API.G_RET_STS_ERROR) THEN
8062       RAISE FND_API.G_EXC_ERROR;
8063     ELSIF (l_return_status = FND_API.G_RET_STS_UNEXP_ERROR) THEN
8064       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
8065     END IF;
8066     -- SATHAPLI::Bug 5758813, 04-Jun-2008, fix end
8067   END IF; -- To find if the visit has any tasks
8068 
8069   -- Update the status of all the tasks for this given UE to RELEASED
8070   OPEN c_task(p_visit_id, p_unit_effectivity_id);
8071   FETCH c_task INTO c_task_rec;
8072   WHILE c_task%FOUND
8073   LOOP
8074       UPDATE AHL_VISIT_TASKS_B
8075       SET STATUS_CODE = 'RELEASED',
8076           OBJECT_VERSION_NUMBER = OBJECT_VERSION_NUMBER + 1
8077       WHERE VISIT_ID = p_visit_id
8078       AND VISIT_TASK_ID = c_task_rec.visit_task_id
8079       AND STATUS_CODE = 'PLANNING';
8080 
8081       FETCH c_task INTO c_task_rec;
8082   END LOOP;
8083   CLOSE c_task;
8084 
8085   -- Update visit status to RELEASED only if no other change of the visit
8086   -- needs to be pushed to production
8087   OPEN c_visit_task_exists(c_visit_rec.visit_id);
8088   FETCH c_visit_task_exists INTO l_dummy;
8089 
8090   OPEN c_get_wo_details(c_visit_rec.visit_id);
8091   FETCH c_get_wo_details into c_get_wo_details_rec;
8092   IF (c_visit_task_exists%NOTFOUND and
8093   c_visit_rec.start_date_time = c_get_wo_details_rec.scheduled_start_date and
8094   c_visit_rec.close_date_time = c_get_wo_details_rec.scheduled_completion_date) THEN
8095       UPDATE ahl_visits_b
8096       SET status_code = 'RELEASED',
8097           object_version_number = object_version_number + 1
8098       WHERE visit_id = c_visit_rec.visit_id;
8099 
8100       IF (l_log_statement >= l_log_current_level) THEN
8101         fnd_log.string(l_log_statement,L_DEBUG_KEY,'Before AHL_VWP_RULES_PVT.Update_Visit_Task_Flag Call');
8102       END IF;
8103 
8104       IF c_visit_rec.any_task_chg_flag = 'Y' THEN
8105           AHL_VWP_RULES_PVT.Update_Visit_Task_Flag
8106                 (p_visit_id      => c_visit_rec.visit_id,
8107                  p_flag          => 'N',
8108                  x_return_status => x_return_status);
8109       END IF;
8110 
8111       IF (l_log_statement >= l_log_current_level) THEN
8112         fnd_log.string(l_log_statement,L_DEBUG_KEY,'After AHL_VWP_RULES_PVT.Update_Visit_Task_Flag Call');
8113       END IF;
8114   END IF;
8115   ---------------------------End of Body-------------------------------------
8116   -- Standard check of p_commit.
8117   IF Fnd_Api.To_Boolean (p_commit) THEN
8118     COMMIT WORK;
8119   END IF;
8120 
8121   Fnd_Msg_Pub.count_and_get(
8122          p_encoded => Fnd_Api.g_false,
8123          p_count   => x_msg_count,
8124          p_data    => x_msg_data
8125    );
8126 
8127   IF (l_log_procedure >= l_log_current_level) THEN
8128     fnd_log.string(l_log_procedure,L_DEBUG_KEY||'.end','At the end of plsql procedure');
8129   END IF;
8130 
8131 EXCEPTION
8132    WHEN Fnd_Api.g_exc_error THEN
8133       ROLLBACK TO Push_MR_to_Production;
8134       x_return_status := Fnd_Api.g_ret_sts_error;
8135       Fnd_Msg_Pub.count_and_get (
8136             p_encoded => Fnd_Api.g_false,
8137             p_count   => x_msg_count,
8138             p_data    => x_msg_data
8139       );
8140    WHEN Fnd_Api.g_exc_unexpected_error THEN
8141       ROLLBACK TO Push_MR_to_Production;
8142       x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
8143       Fnd_Msg_Pub.count_and_get (
8144             p_encoded => Fnd_Api.g_false,
8145             p_count   => x_msg_count,
8146             p_data    => x_msg_data
8147       );
8148    WHEN OTHERS THEN
8149       ROLLBACK TO Push_MR_to_Production;
8150       x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
8151       IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_unexp_error)
8152     THEN
8153          Fnd_Msg_Pub.add_exc_msg (G_PKG_NAME, l_api_name);
8154       END IF;
8155       Fnd_Msg_Pub.count_and_get (
8156             p_encoded => Fnd_Api.g_false,
8157             p_count   => x_msg_count,
8158             p_data    => x_msg_data
8159       );
8160 END Push_MR_to_Production;
8161 
8162 --------------------------------------------------------------------
8163 -- PROCEDURE
8164 --    Add_MR_to_Project
8165 --
8166 -- PURPOSE
8167 --    To add Project Task for all the tasks for a given MR
8168 --    when SR tasks are created in prodution
8169 --------------------------------------------------------------------
8170 PROCEDURE Add_MR_to_Project(
8171    p_api_version         IN  NUMBER,
8172    p_init_msg_list       IN  VARCHAR2  := Fnd_Api.g_false,
8173    p_commit              IN  VARCHAR2  := Fnd_Api.g_false,
8174    p_validation_level    IN  NUMBER    := Fnd_Api.g_valid_level_full,
8175    p_module_type         IN  VARCHAR2  := Null,
8176    p_visit_id            IN  NUMBER,
8177    p_unit_effectivity_id IN  NUMBER,
8178    x_return_status       OUT NOCOPY VARCHAR2,
8179    x_msg_count           OUT NOCOPY NUMBER,
8180    x_msg_data            OUT NOCOPY VARCHAR2
8181   )
8182 IS
8183    L_API_VERSION  CONSTANT NUMBER := 1.0;
8184    L_API_NAME     CONSTANT VARCHAR2(30)  := 'Add_MR_to_Project';
8185    L_DEBUG_KEY    CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
8186    G_EXC_ERROR             EXCEPTION;
8187    l_msg_count             NUMBER;
8188    l_task_id               NUMBER;
8189    l_pa_project_id_out     NUMBER;
8190    l_msg_index_out         NUMBER;
8191    l_return_status         VARCHAR2(1);
8192    l_chk_project           VARCHAR2(1);
8193    l_proj_ref_flag         VARCHAR2(1);
8194    l_project_tsk_flag      VARCHAR2(1);
8195    l_msg_data              VARCHAR2(2000);
8196    l_pa_project_number_out VARCHAR2(25);
8197    l_commit                VARCHAR2(1) := 'F';
8198    l_init_msg_list         VARCHAR2(1) := 'F';
8199 
8200     -- To find visit related information
8201    CURSOR c_visit (x_id IN NUMBER) IS
8202     SELECT * FROM AHL_VISITS_VL
8203     WHERE VISIT_ID = x_id;
8204    c_visit_rec c_visit%ROWTYPE;
8205 
8206    -- To get all the tasks for the given UE
8207    CURSOR c_task (x_visit_id IN NUMBER, x_unit_effectivity_id IN NUMBER) IS
8208     SELECT * FROM AHL_VISIT_TASKS_VL
8209     WHERE VISIT_ID = x_visit_id
8210     AND NVL( STATUS_CODE, 'X' ) = 'PLANNING'
8211     START WITH unit_effectivity_id  = x_unit_effectivity_id
8212         AND (( originating_task_id is null AND 'SR' <> p_module_type)
8213             OR ( originating_task_id is not null AND 'SR' = p_module_type
8214                  and service_request_id is not null))
8215     CONNECT BY originating_task_id = PRIOR visit_task_id;
8216 
8217    c_task_rec c_task%ROWTYPE;
8218    l_curr_task_id   NUMBER := 0;
8219 
8220    -- SATHAPLI::Bug 5758813, 04-Jun-2008
8221    -- Cursor to get the required format used for the project task name and description, given a visit task.
8222    -- First part of the UNION is for the planned tasks (routes) attached to the NR.
8223    -- Second part is for the corresponding NR and MR summary tasks.
8224    CURSOR get_prj_task_dtls_cur (c_visit_task_id IN NUMBER) IS
8225    SELECT SUBSTR(NVL(ar.route_no, avt.visit_task_name), 1, 20) task_name,
8226           SUBSTR(NVL(ar.title, avt.visit_task_name), 1, 250) description
8227      FROM ahl_routes_vl ar, ahl_visit_tasks_vl avt,
8228           ahl_mr_routes mrr
8229     WHERE avt.visit_task_id         = c_visit_task_id
8230       AND NVL(avt.status_code, 'X') = 'PLANNING'
8231       AND avt.task_type_code        NOT IN ('SUMMARY', 'UNASSOCIATED')
8232       AND avt.mr_route_id           = mrr.mr_route_id (+)
8233       AND mrr.route_id              = ar.route_id (+)
8234    UNION ALL
8235    SELECT SUBSTR(NVL(amh.title, avt.visit_task_name), 1, 20) task_name,
8236           NVL(amh.title, avt.visit_task_name) description
8237      FROM ahl_mr_headers_v amh, ahl_visit_tasks_vl avt
8238     WHERE avt.visit_task_id         = c_visit_task_id
8239       AND NVL(avt.status_code, 'X') = 'PLANNING'
8240       AND avt.task_type_code        = 'SUMMARY'
8241       AND avt.summary_task_flag     = 'N'
8242       AND avt.mr_id                 = amh.mr_header_id (+);
8243 
8244    l_get_prj_task_dtls_cur_rec get_prj_task_dtls_cur%ROWTYPE;
8245 
8246 BEGIN
8247    --------------------- initialize -----------------------
8248   SAVEPOINT Add_MR_to_Project;
8249 
8250   IF (l_log_procedure >= l_log_current_level) THEN
8251     fnd_log.string(l_log_procedure,L_DEBUG_KEY||'.begin','At the start of plsql procedure');
8252   END IF;
8253 
8254   -- Initialize message list if p_init_msg_list is set to TRUE.
8255   IF Fnd_Api.to_boolean(p_init_msg_list) THEN
8256     Fnd_Msg_Pub.initialize;
8257   END IF;
8258 
8259   --  Initialize API return status to success
8260   x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
8261 
8262   -- Standard call to check for call compatibility.
8263   IF NOT Fnd_Api.COMPATIBLE_API_CALL(l_api_version,
8264                                       p_api_version,
8265                                       l_api_name,G_PKG_NAME) THEN
8266     RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
8267   END IF;
8268 
8269   IF (l_log_statement >= l_log_current_level) THEN
8270     fnd_log.string(l_log_statement,L_DEBUG_KEY,'Unit Effectivity ID = ' || p_unit_effectivity_id);
8271   END IF;
8272 
8273   ----------------------------------------- Start of Body ----------------------------------
8274   -- To check Project responsibilites
8275 
8276   -- Begin changes by jaramana on Mar 4, 2008 for bug 6788115 (FP of 6759574)
8277   -- As per update from ravichandran.velusamy in Projects team in the bug 6759574,
8278   -- the call to PA_INTERFACE_UTILS_PUB.Set_Global_Info may be removed.
8279   -- AHL_VWP_RULES_PVT.Check_Proj_Responsibility calls PA_INTERFACE_UTILS_PUB.Set_Global_Info
8280 /***
8281   AHL_VWP_RULES_PVT.Check_Proj_Responsibility
8282            (x_check_project    => l_chk_project,
8283             x_return_status    => l_return_status);
8284 
8285   IF l_return_status <> Fnd_Api.G_RET_STS_SUCCESS THEN
8286     x_return_status := l_return_status;
8287     RAISE G_EXC_ERROR;
8288   END IF;
8289 
8290 ***/
8291   l_chk_project := 'Y';
8292   -- End changes by jaramana on Mar 4, 2008 for bug 6788115 (FP of 6759574)
8293 
8294   IF (l_log_statement >= l_log_current_level) THEN
8295     fnd_log.string(l_log_statement,L_DEBUG_KEY,'l_chk_project = ' || l_chk_project);
8296   END IF;
8297 
8298   IF l_chk_project = 'Y' THEN
8299     ----------------------------------------- Cursor ----------------------------------
8300     OPEN c_Visit(p_visit_id);
8301     FETCH c_visit INTO c_visit_rec;
8302     CLOSE c_Visit;
8303 
8304     OPEN c_task(p_visit_id, p_unit_effectivity_id);
8305     FETCH c_task INTO c_task_rec;
8306     WHILE c_task%FOUND
8307     LOOP
8308       IF ((c_task_rec.PROJECT_TASK_ID IS NULL)  AND (l_curr_task_id <> c_task_rec.visit_task_id))THEN
8309         IF (l_log_statement >= l_log_current_level) THEN
8310           fnd_log.string(l_log_statement,L_DEBUG_KEY,'Before calling PA_PROJECT_PUB.Check_Unique_Task_Number');
8311         END IF;
8312 
8313         PA_PROJECT_PUB.Check_Unique_Task_Number
8314           ( p_api_version_number      => 1,
8315             p_init_msg_list           => l_init_msg_list,
8316             p_return_status           => l_return_status,
8317             p_msg_count               => l_msg_count,
8318             p_msg_data                => l_msg_data,
8319             p_project_id              => c_visit_rec.project_id,
8320             p_pm_project_reference    => c_visit_rec.visit_number,
8321             p_task_number             => c_task_rec.visit_task_number,
8322             p_unique_task_number_flag => l_project_tsk_flag
8323           ) ;
8324 
8325         IF (l_log_statement >= l_log_current_level) THEN
8326           fnd_log.string(l_log_statement,L_DEBUG_KEY,'After calling PA_PROJECT_PUB.Check_Unique_Task_Number - l_project_tsk_flag : '|| l_project_tsk_flag);
8327           fnd_log.string(l_log_statement,L_DEBUG_KEY,'Before calling PA_PROJECT_PUB.Check_Unique_Task_Reference');
8328         END IF;
8329 
8330         PA_PROJECT_PUB.Check_Unique_Task_Reference
8331          ( p_api_version_number      => 1,
8332            p_init_msg_list        => l_init_msg_list,
8333            p_return_status        => l_return_status,
8334            p_msg_count          => l_msg_count,
8335            p_msg_data          => l_msg_data,
8336            p_project_id             => c_visit_rec.project_id,
8337            p_pm_project_reference  => c_visit_rec.visit_number,
8338            p_pm_task_reference      => c_task_rec.visit_task_number,
8339            p_unique_task_ref_flag  => l_proj_ref_flag
8340          );
8341 
8342         IF (l_log_statement >= l_log_current_level) THEN
8343           fnd_log.string(l_log_statement,L_DEBUG_KEY,'After calling PA_PROJECT_PUB.Check_Unique_Task_Reference  - l_proj_ref_flag = ' || l_proj_ref_flag);
8344         END IF;
8345 
8346         IF l_project_tsk_flag = 'Y' AND l_proj_ref_flag = 'Y' THEN
8347           IF (l_log_statement >= l_log_current_level) THEN
8348              fnd_log.string(l_log_statement,L_DEBUG_KEY,'Before calling PA_PROJECT_PUB.ADD_TASK');
8349              fnd_log.string(l_log_statement,L_DEBUG_KEY,'c_task_rec.PROJECT_ID=:' || c_visit_rec.PROJECT_ID);
8350              fnd_log.string(l_log_statement,L_DEBUG_KEY,'c_task_rec.VISIT_NUMBER=:' || c_visit_rec.VISIT_NUMBER);
8351              fnd_log.string(l_log_statement,L_DEBUG_KEY,'c_task_rec.VISIT_TASK_NUMBER=:' || c_task_rec.VISIT_TASK_NUMBER);
8352              fnd_log.string(l_log_statement,L_DEBUG_KEY,'c_task_rec.VISIT_TASK_NAME=:' || c_task_rec.VISIT_TASK_NAME);
8353              fnd_log.string(l_log_statement,L_DEBUG_KEY,'c_task_rec.DESCRIPTION=:' || c_task_rec.DESCRIPTION);
8354           END IF;
8355 
8356           -- SATHAPLI::Bug 5758813, 04-Jun-2008 - Fetch the required format for the project task's name and description.
8357           OPEN get_prj_task_dtls_cur(c_task_rec.visit_task_id);
8358           FETCH get_prj_task_dtls_cur INTO l_get_prj_task_dtls_cur_rec;
8359           CLOSE get_prj_task_dtls_cur;
8360 
8361           PA_PROJECT_PUB.ADD_TASK
8362                (p_api_version_number      => 1
8363                ,p_commit                  => l_commit
8364                ,p_init_msg_list           => l_init_msg_list
8365                ,p_msg_count               => l_msg_count
8366                ,p_msg_data                => l_msg_data
8367                ,p_return_status           => l_return_status
8368                ,p_pm_product_code         => G_PM_PRODUCT_CODE
8369                -- yazhou 26Sept2005 starts
8370                -- ER#4618348
8371                -- ,p_pm_project_reference => c_task_rec.VISIT_NUMBER
8372                -- yazhou 26Sept2005 ends
8373                ,p_pa_project_id           => c_visit_rec.PROJECT_ID
8374                ,p_pm_task_reference       => c_task_rec.VISIT_TASK_NUMBER
8375                ,p_pa_task_number          => c_task_rec.VISIT_TASK_NUMBER
8376                -- SATHAPLI::Bug 5758813, 04-Jun-2008 - fix start
8377                -- Set the task name and description with the required format. Set the task start and end date too.
8378                -- ,p_task_name               => SUBSTR( c_task_rec.VISIT_TASK_NAME , 1,15)
8379                -- ,p_task_description        => c_task_rec.DESCRIPTION
8380                ,p_task_name               => l_get_prj_task_dtls_cur_rec.task_name
8381                ,p_task_description        => l_get_prj_task_dtls_cur_rec.description
8382                ,p_task_start_date         => trunc(c_task_rec.start_date_time)
8383                ,p_task_completion_date    => trunc(c_task_rec.end_date_time)
8384                -- SATHAPLI::Bug 5758813, 04-Jun-2008 - fix end
8385                ,p_pa_project_id_out       => l_pa_project_id_out
8386                ,p_pa_project_number_out   => l_pa_project_number_out
8387                ,p_task_id                 => l_task_id
8388                 );
8389 
8390           IF (l_log_statement >= l_log_current_level) THEN
8391             fnd_log.string(l_log_statement,L_DEBUG_KEY,'After calling PA_PROJECT_PUB.ADD_TASK -  l_return_status : '||l_return_status);
8392           END IF;
8393 
8394           IF (l_return_status <> 'S') THEN
8395             IF (fnd_msg_pub.count_msg > 0 ) THEN
8396               FOR i IN 1..fnd_msg_pub.count_msg
8397               LOOP
8398                 fnd_msg_pub.get(p_msg_index => i,
8399                                 p_encoded   => 'F',
8400                                 p_data      => l_msg_data,
8401                                 p_msg_index_out => l_msg_index_out);
8402                 IF (l_log_statement >= l_log_current_level) THEN
8403                   fnd_log.string(l_log_statement,L_DEBUG_KEY,': Error' ||l_msg_data);
8404                 END IF;
8405               END LOOP;
8406             ELSE
8407               IF (l_log_statement >= l_log_current_level) THEN
8408                 fnd_log.string(l_log_statement,L_DEBUG_KEY,': Another Error ='||l_msg_data);
8409               END IF;
8410             END IF;
8411             RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
8412           END IF;
8413 
8414           IF l_return_status = 'S' THEN
8415             /*NR-MR Changes - added this to ensure that duplicates are not passed*/
8416             l_curr_task_id := c_task_rec.visit_task_id;
8417             UPDATE AHL_VISIT_TASKS_B SET PROJECT_TASK_ID = l_task_id,
8418                    OBJECT_VERSION_NUMBER = c_task_rec.object_version_number + 1
8419             WHERE VISIT_TASK_ID = c_task_rec.visit_task_id;
8420           END IF;
8421         ELSIF l_project_tsk_flag = 'N' AND l_proj_ref_flag = 'Y' THEN
8422           x_return_status := Fnd_Api.g_ret_sts_error;
8423           IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_error) THEN
8424              Fnd_Message.set_name ('AHL', 'AHL_VWP_PROJ_TSK_REF_NOT_UNIQ');
8425              Fnd_Msg_Pub.ADD;
8426           END IF;
8427         ELSIF l_project_tsk_flag = 'Y' AND l_proj_ref_flag = 'N' THEN
8428           x_return_status := Fnd_Api.g_ret_sts_error;
8429           IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_error) THEN
8430             Fnd_Message.set_name ('AHL', 'AHL_VWP_PROJ_TSK_NUM_NOT_UNIQ');
8431             Fnd_Msg_Pub.ADD;
8432           END IF;
8433         ELSE
8434           x_return_status := Fnd_Api.g_ret_sts_error;
8435           IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_error) THEN
8436             Fnd_Message.set_name ('AHL', 'AHL_VWP_PROJ_TASK_NOT_UNIQUE');
8437             Fnd_Msg_Pub.ADD;
8438           END IF;
8439         END IF;
8440       END IF;  -- project_task_id is null
8441       FETCH c_task INTO c_task_rec;
8442     END LOOP;
8443     CLOSE c_task;
8444   END IF; -- l_chk_project
8445   ---------------------------End of Body-------------------------------------
8446   -- Standard check of p_commit.
8447 
8448   IF Fnd_Api.To_Boolean ( p_commit ) THEN
8449      COMMIT WORK;
8450   END IF;
8451 
8452   Fnd_Msg_Pub.count_and_get(
8453          p_encoded => Fnd_Api.g_false,
8454          p_count   => x_msg_count,
8455          p_data    => x_msg_data
8456    );
8457 
8458   IF (l_log_procedure >= l_log_current_level) THEN
8459     fnd_log.string(l_log_procedure,L_DEBUG_KEY||'.end','At the end of plsql procedure');
8460   END IF;
8461 
8462 EXCEPTION
8463    WHEN Fnd_Api.g_exc_error THEN
8464       ROLLBACK TO Add_MR_to_Project;
8465       x_return_status := Fnd_Api.g_ret_sts_error;
8466       Fnd_Msg_Pub.count_and_get (
8467             p_encoded => Fnd_Api.g_false,
8468             p_count   => x_msg_count,
8469             p_data    => x_msg_data
8470       );
8471    WHEN Fnd_Api.g_exc_unexpected_error THEN
8472       ROLLBACK TO Add_MR_to_Project;
8473       x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
8474       Fnd_Msg_Pub.count_and_get (
8475             p_encoded => Fnd_Api.g_false,
8476             p_count   => x_msg_count,
8477             p_data    => x_msg_data
8478       );
8479    WHEN OTHERS THEN
8480       ROLLBACK TO Add_MR_to_Project;
8481       x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
8482       IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_unexp_error)
8483     THEN
8484          Fnd_Msg_Pub.add_exc_msg (G_PKG_NAME, l_api_name);
8485       END IF;
8486       Fnd_Msg_Pub.count_and_get (
8487             p_encoded => Fnd_Api.g_false,
8488             p_count   => x_msg_count,
8489             p_data    => x_msg_data
8490       );
8491 END Add_MR_to_Project;
8492 
8493 -- AnRaj: Added as part of Material Requirement Aggrgation Enhancement, Bug#5303378
8494 -- Call aggregate_material_requirements for a visit
8495 -- If a visit task has more than one requirement for the same item, then this method will aggregate
8496 -- all those requirements into a single requirement
8497 PROCEDURE Aggregate_Material_Reqrs
8498           (p_api_version      IN         NUMBER,
8499            p_init_msg_list    IN         VARCHAR2,
8500            p_commit           IN         VARCHAR2,
8501            p_validation_level IN         NUMBER,
8502            p_module_type      IN         VARCHAR2,
8503            p_visit_id         IN         NUMBER,
8504            x_return_status    OUT NOCOPY VARCHAR2,
8505            x_msg_count        OUT NOCOPY NUMBER,
8506            x_msg_data         OUT NOCOPY VARCHAR2
8507           )
8508 IS
8509    -- get all tasks in planning status for a visit
8510    CURSOR   get_visit_tasks_cur(c_visit_id NUMBER) IS
8511     SELECT visit_task_id
8512     FROM ahl_visit_tasks_b
8513     WHERE visit_id = c_visit_id
8514      AND NVL(status_code,'X') = 'PLANNING';
8515 
8516    -- Declare local variables
8517    l_api_version  CONSTANT NUMBER        := 1.0;
8518    l_api_name     CONSTANT VARCHAR2(30)  := 'Aggregate_Material_Reqrs';
8519    L_DEBUG_KEY    CONSTANT VARCHAR2(100) := 'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name;
8520    l_init_msg_list         VARCHAR2(1)   := 'F';
8521    l_return_status         VARCHAR2(1);
8522    l_msg_count             NUMBER;
8523    l_msg_data              VARCHAR2(2000);
8524    l_visit_task_id         NUMBER;
8525    l_reservation_id        NUMBER;
8526    l_scheduled_matrial_id  NUMBER;
8527    l_previous_item         NUMBER := NULL;
8528 
8529 BEGIN
8530    -- Standard start of API savepoint
8531    SAVEPOINT AGGREGATE_MATERIAL_REQRS;
8532 
8533    -- Initialize return status to success before any code logic/validation
8534    x_return_status:= FND_API.G_RET_STS_SUCCESS;
8535 
8536    -- Standard call to check for call compatibility
8537    IF NOT FND_API.COMPATIBLE_API_CALL (l_api_version, p_api_version, l_api_name, G_PKG_NAME)
8538    THEN
8539       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
8540    END IF;
8541 
8542    -- Initialize message list if p_init_msg_list = FND_API.G_TRUE
8543    IF FND_API.TO_BOOLEAN(p_init_msg_list)
8544    THEN
8545       FND_MSG_PUB.INITIALIZE;
8546    END IF;
8547 
8548    IF (l_log_procedure >= l_log_current_level) THEN
8549       fnd_log.string(l_log_procedure,
8550                      L_DEBUG_KEY,
8551                      'At the start of PL SQL procedure. Visit Id = ' || p_visit_id);
8552    END IF;
8553 
8554    OPEN get_visit_tasks_cur(p_visit_id);
8555    LOOP
8556       FETCH get_visit_tasks_cur INTO l_visit_task_id;
8557       EXIT WHEN get_visit_tasks_cur%NOTFOUND;
8558       IF (l_log_statement >= l_log_current_level) THEN
8559          fnd_log.string(l_log_statement,
8560                         L_DEBUG_KEY,
8561                         'Before calling AGGREGATE_TASK_MATERIAL_REQRS for Visit Task Id: ' || l_visit_task_id);
8562       END IF;
8563 
8564       AHL_VWP_PROJ_PROD_PVT.Aggregate_Task_Material_Reqrs
8565         (p_api_version      => p_api_version,
8566          p_init_msg_list    => p_init_msg_list,
8567          p_commit           => p_commit,
8568          p_validation_level => p_validation_level,
8569          p_module_type      => p_module_type,
8570          p_task_id          => l_visit_task_id,
8571          p_rel_tsk_flag     => 'N',
8572          x_return_status    => l_return_status,
8573          x_msg_count        => l_msg_count,
8574          x_msg_data         => l_msg_data
8575         );
8576 
8577       IF (l_log_statement >= l_log_current_level) THEN
8578          fnd_log.string(l_log_statement,
8579                         L_DEBUG_KEY,
8580                         'After calling AGGREGATE_TASK_MATERIAL_REQRS for Visit Task Id: ' ||
8581                         l_visit_task_id || '. Return Status = '|| l_return_status);
8582       END IF;
8583 
8584       IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
8585          x_msg_count := FND_MSG_PUB.count_msg;
8586          IF (l_log_statement >= l_log_current_level) THEN
8587             fnd_log.string(l_log_statement,
8588                            L_DEBUG_KEY,
8589                            'Errors from AGGREGATE_TASK_MATERIAL_REQRS. Message count: ' || x_msg_count);
8590          END IF;
8591          IF l_return_status = FND_API.G_RET_STS_ERROR THEN
8592             RAISE FND_API.G_EXC_ERROR;
8593          ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
8594             RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
8595          END IF;
8596       END IF;
8597 
8598    END LOOP;
8599    CLOSE get_visit_tasks_cur;
8600 END Aggregate_Material_Reqrs;
8601 
8602 -------------------------------------------------------------------
8603 --  Procedure name : Aggregate_Task_Material_Reqrs
8604 --  Type           : Private
8605 --  Function       : Find the total requirment of a specific
8606 --                   item at the task level
8607 --  Parameters     :
8608 --
8609 --  Standard OUT Parameters :
8610 --      x_return_status OUT  VARCHAR2 Required
8611 --      x_msg_count     OUT  NUMBER   Required
8612 --      x_msg_data      OUT  VARCHAR2 Required
8613 --
8614 --  Aggregate_Task_Material_Reqrs Parameters:
8615 --      p_task_id       IN   NUMBER   Required
8616 --
8617 --  Version :
8618 --      30 November, 2007  RNAHATA  Initial Version - 1.0
8619 -------------------------------------------------------------------
8620 PROCEDURE Aggregate_Task_Material_Reqrs
8621     (p_api_version      IN         NUMBER,
8622      p_init_msg_list    IN         VARCHAR2,
8623      p_commit           IN         VARCHAR2,
8624      p_validation_level IN         NUMBER,
8625      p_module_type      IN         VARCHAR2,
8626      p_task_id          IN         NUMBER,
8627      p_rel_tsk_flag     IN         VARCHAR2 := 'Y',
8628      x_return_status    OUT NOCOPY VARCHAR2,
8629      x_msg_count        OUT NOCOPY NUMBER,
8630      x_msg_data         OUT NOCOPY VARCHAR2
8631     )
8632 IS
8633    -- Cursor to get the duplicate material requirements
8634    CURSOR get_material_reqrs_cur(c_visit_task_id NUMBER) IS
8635     SELECT UNIQUE asmt1.scheduled_material_id,
8636            asmt1.visit_id,
8637            asmt1.visit_task_id,
8638            asmt1.inventory_item_id,
8639            asmt1.requested_quantity,
8640            asmt1.scheduled_quantity,
8641            asmt1.rt_oper_material_id,
8642            asmt1.item_group_id
8643     FROM ahl_schedule_materials asmt1,
8644          ahl_Schedule_materials asmt2
8645     WHERE asmt1.visit_id = asmt2.visit_id
8646      AND asmt1.visit_task_id = asmt2.visit_task_id
8647      AND asmt1.inventory_item_id = asmt2.inventory_item_id
8648      AND NVL(asmt1.operation_code,'X') = NVL(asmt2.operation_code,'X')
8649      AND asmt1.scheduled_material_id <> asmt2.scheduled_material_id
8650      AND NVL(asmt1.status,'X') = 'ACTIVE'
8651      AND NVL(asmt2.status,'X') = 'ACTIVE'
8652      AND asmt1.visit_task_id = c_visit_task_id
8653     ORDER BY asmt1.inventory_item_id;
8654    l_material_reqrs_rec       get_material_reqrs_cur%ROWTYPE;
8655 
8656    CURSOR check_reservation_exist (c_scheduled_material_id IN NUMBER) IS
8657     SELECT reservation_id
8658     FROM mtl_reservations
8659     WHERE demand_source_line_detail = c_scheduled_material_id
8660      AND external_source_code = 'AHL';
8661 
8662    -- Declare local variables
8663    L_API_NAME    CONSTANT VARCHAR2(30)  := 'Aggregate_Task_Material_Reqrs';
8664    l_api_version CONSTANT NUMBER        := 1.0;
8665    L_DEBUG_KEY   CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
8666    l_init_msg_list        VARCHAR2(1)   := 'F';
8667    l_reservation_id       NUMBER;
8668    l_scheduled_matrial_id NUMBER;
8669    l_previous_item        NUMBER := NULL;
8670 
8671 BEGIN
8672    -- Initialize return status to success before any code logic/validation
8673    x_return_status:= FND_API.G_RET_STS_SUCCESS;
8674 
8675    IF (l_log_procedure >= l_log_current_level) THEN
8676       fnd_log.string(l_log_procedure,
8677                      L_DEBUG_KEY ||'.begin',
8678                      'At the start of PL SQL procedure. Visit Task Id = ' || p_task_id);
8679    END IF;
8680 
8681    -- Standard call to check for call compatibility
8682    IF NOT FND_API.COMPATIBLE_API_CALL (l_api_version, p_api_version, l_api_name, G_PKG_NAME)
8683    THEN
8684       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
8685    END IF;
8686 
8687    -- Initialize message list if p_init_msg_list = FND_API.G_TRUE
8688    IF FND_API.TO_BOOLEAN(p_init_msg_list)
8689    THEN
8690       FND_MSG_PUB.INITIALIZE;
8691    END IF;
8692 
8693    -- initialize the counter
8694    l_previous_item := NULL;
8695 
8696    -- For each task in status planning, get details if there mutiple requirements for the same item
8697    OPEN  get_material_reqrs_cur(p_task_id);
8698    LOOP
8699        FETCH get_material_reqrs_cur INTO l_material_reqrs_rec;
8700        EXIT  WHEN get_material_reqrs_cur%NOTFOUND;
8701 
8702        IF (l_log_statement >= l_log_current_level) THEN
8703           fnd_log.string(l_log_statement,
8704                          L_DEBUG_KEY,
8705                          'Fetching Material Requirements for task.');
8706        END IF;
8707 
8708        IF l_previous_item IS NULL THEN
8709        -- if the first duplicate occurance for a task
8710           l_scheduled_matrial_id := l_material_reqrs_rec.scheduled_material_id;
8711           IF (l_log_statement >= l_log_current_level) THEN
8712              fnd_log.string(l_log_statement,
8713                             L_DEBUG_KEY,
8714                             'First Requirement Id: ' || l_scheduled_matrial_id);
8715           END IF;
8716        ELSIF l_previous_item = l_material_reqrs_rec.inventory_item_id THEN
8717        -- merge the records
8718           IF p_rel_tsk_flag = 'Y' THEN
8719              OPEN  check_reservation_exist(l_material_reqrs_rec.scheduled_material_id);
8720              FETCH check_reservation_exist INTO l_reservation_id;
8721              IF check_reservation_exist%FOUND THEN
8722 
8723                 IF (l_log_statement >= l_log_current_level) THEN
8724                    fnd_log.string(l_log_statement,
8725                                   L_DEBUG_KEY,
8726                                   'Before calling AHL_RSV_RESERVATIONS_PVT.TRNSFR_RSRV_FOR_MATRL_REQR');
8727                    fnd_log.string(l_log_statement,
8728                                   L_DEBUG_KEY,
8729                                   'l_material_reqrs_rec.scheduled_material_id->' || l_material_reqrs_rec.scheduled_material_id);
8730                    fnd_log.string(l_log_statement,
8731                                   L_DEBUG_KEY,'l_scheduled_matrial_id->' || l_scheduled_matrial_id);
8732                 END IF;
8733 
8734                 -- Call Transfer reservations
8735                 AHL_RSV_RESERVATIONS_PVT.TRNSFR_RSRV_FOR_MATRL_REQR
8736                   (p_api_version     => l_api_version,
8737                    p_init_msg_list   => l_init_msg_list,
8738                    p_module_type     => p_module_type,
8739                    x_msg_count       => x_msg_count,
8740                    x_msg_data        => x_msg_data,
8741                    x_return_status   => x_return_status,
8742                    p_visit_task_id   => p_task_id,
8743                    p_from_mat_req_id => l_material_reqrs_rec.scheduled_material_id,
8744                    p_to_mat_req_id   => l_scheduled_matrial_id
8745                   );
8746 
8747                 IF (l_log_statement >= l_log_current_level) THEN
8748                    fnd_log.string(l_log_statement,
8749                                   L_DEBUG_KEY,
8750                                   'After calling AHL_RSV_RESERVATIONS_PVT.TRNSFR_RSRV_FOR_MATRL_REQR. Return Status = '||
8751                                   x_return_status);
8752                 END IF;
8753 
8754                 IF (x_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
8755                    x_msg_count := FND_MSG_PUB.count_msg;
8756                    IF (l_log_statement >= l_log_current_level) THEN
8757                       fnd_log.string(l_log_statement,
8758                                      L_DEBUG_KEY,
8759                                      'Errors from AHL_RSV_RESERVATIONS_PVT.TRNSFR_RSRV_FOR_MATRL_REQR. Message count: ' || x_msg_count);
8760                    END IF;
8761                    IF x_return_status = FND_API.G_RET_STS_ERROR THEN
8762                       RAISE FND_API.G_EXC_ERROR;
8763                    ELSIF x_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
8764                       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
8765                    END IF;
8766                 END IF;
8767              END IF;
8768           END IF;
8769 
8770           IF (l_log_statement >= l_log_current_level) THEN
8771              fnd_log.string(l_log_statement,
8772                             L_DEBUG_KEY,
8773                             'Updating ahl_schedule_materials with new Material Requirements');
8774           END IF;
8775 
8776           -- Add the requirements into the first record
8777           UPDATE ahl_schedule_materials
8778           SET scheduled_quantity = NVL(scheduled_quantity,0) + NVL(l_material_reqrs_rec.scheduled_quantity,0),
8779               item_group_id = NVL(item_group_id,l_material_reqrs_rec.item_group_id),
8780               requested_quantity = NVL(requested_quantity,0) +  NVL(l_material_reqrs_rec.requested_quantity,0)
8781           WHERE scheduled_material_id = l_scheduled_matrial_id;
8782 
8783           IF (l_log_statement >= l_log_current_level) THEN
8784              fnd_log.string(l_log_statement,
8785                             L_DEBUG_KEY,
8786                             'Deleting the old material requirements from table ahl_schedule_materials ');
8787           END IF;
8788 
8789           -- Mark the current row as deleted
8790           UPDATE ahl_Schedule_materials
8791           SET status = 'DELETED',requested_quantity = 0
8792           WHERE scheduled_material_id = l_material_reqrs_rec.scheduled_material_id;
8793 
8794        ELSE -- New duplicate inventory item id as material req
8795           l_scheduled_matrial_id := l_material_reqrs_rec.scheduled_material_id;
8796           IF (l_log_statement >= l_log_current_level) THEN
8797              fnd_log.string(l_log_statement,
8798                             L_DEBUG_KEY,
8799                             'New Duplicate Inventory Item Id. Requirement Id: ' || l_scheduled_matrial_id ||
8800                             ', Item Id: ' || l_material_reqrs_rec.inventory_item_id);
8801           END IF;
8802        END IF; -- not the same item
8803        -- make the current item the previous item, before reading the next record
8804        l_previous_item := l_material_reqrs_rec.inventory_item_id;
8805    END LOOP;
8806    CLOSE get_material_reqrs_cur;
8807 
8808    IF (l_log_procedure >= l_log_current_level) THEN
8809       fnd_log.string(l_log_procedure,
8810                      L_DEBUG_KEY ||'.end',
8811                      'At the end of PL SQL procedure. Return Status =' || x_return_status);
8812    END IF;
8813 
8814 END Aggregate_Task_Material_Reqrs;
8815 
8816 -------------------------------------------------------------------
8817 --  Procedure name    : Update_Project_Task_Times
8818 --  Type              : Private
8819 --  Function          : Update the project task start/end dates
8820 --                      with the workorder schedule start/end dates
8821 --  Parameters :
8822 --  Standard IN Parameters :
8823 --      p_commit                  IN      VARCHAR2 Fnd_Api.G_FALSE
8824 --
8825 --  Update_Project_Task_Times Parameters
8826 --      p_prd_workorder_tbl       IN      AHL_PRD_WORKORDER_PVT.PRD_WORKORDER_TBL Required
8827 --
8828 --  Standard OUT Parameters :
8829 --      x_return_status           OUT     VARCHAR2     Required
8830 --      x_msg_count               OUT     NUMBER       Required
8831 --      x_msg_data                OUT     VARCHAR2     Required
8832 --
8833 --  Version :
8834 --      04 January, 2007          Bug#5758813 SOWSUBRA  Initial Version - 1.0
8835 -------------------------------------------------------------------
8836 PROCEDURE Update_Project_Task_Times
8837 (   p_prd_workorder_tbl IN AHL_PRD_WORKORDER_PVT.PRD_WORKORDER_TBL,
8838     p_commit            IN VARCHAR2  := Fnd_Api.G_FALSE,
8839     x_return_status     OUT NOCOPY VARCHAR2,
8840     x_msg_count         OUT NOCOPY NUMBER,
8841     x_msg_data          OUT NOCOPY VARCHAR2
8842 )
8843 AS
8844 
8845 l_task_in_tbl      PA_PROJECT_PUB.TASK_IN_TBL_TYPE;
8846 task_index         NUMBER;
8847 idx                NUMBER;
8848 l_project_rec      PA_PROJECT_PUB.PROJECT_IN_REC_TYPE;
8849 L_API_NAME         CONSTANT VARCHAR2(30) := 'Update_Project_Task_Times';
8850 L_DEBUG_KEY        CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
8851 l_msg_count        NUMBER;
8852 l_msg_data         VARCHAR2(2000);
8853 l_return_status    VARCHAR2(1);
8854 l_task_out         PA_PROJECT_PUB.TASK_OUT_TBL_TYPE;
8855 l_workflow_started VARCHAR2(1);
8856 l_key_members      PA_PROJECT_PUB.PROJECT_ROLE_TBL_TYPE;
8857 l_class_categories PA_PROJECT_PUB.CLASS_CATEGORY_TBL_TYPE;
8858 l_project_out      PA_PROJECT_PUB.PROJECT_OUT_REC_TYPE;
8859 
8860 
8861 --fetches the schedule start and completion date of workorder
8862 CURSOR get_wo_schedule_dates_cur(p_wo_id IN NUMBER) IS
8863  SELECT WDJ.SCHEDULED_START_DATE, WDJ.SCHEDULED_COMPLETION_DATE
8864  FROM WIP_DISCRETE_JOBS WDJ, AHL_WORKORDERS WO
8865  WHERE WDJ.WIP_ENTITY_ID = WO.WIP_ENTITY_ID AND
8866        WO.WORKORDER_ID   = p_wo_id;
8867 get_wo_schedule_dates_rec  get_wo_schedule_dates_cur%ROWTYPE;
8868 
8869 --fetches project task id, the task start and end date of visit task
8870 CURSOR get_task_dates_cur(p_wo_id IN NUMBER) IS
8871  SELECT AVT.PROJECT_TASK_ID, AVT.START_DATE_TIME, AVT.END_DATE_TIME,
8872         PAT.DESCRIPTION  -- Pass the old description back again
8873  FROM AHL_VISIT_TASKS_B AVT, AHL_WORKORDERS WO,
8874       PA_TASKS PAT
8875  WHERE WO.VISIT_TASK_ID = AVT.VISIT_TASK_ID AND
8876        WO.WORKORDER_ID  = p_wo_id AND
8877        PAT.TASK_ID (+) = AVT.PROJECT_TASK_ID;
8878 get_task_dates_rec  get_task_dates_cur%ROWTYPE;
8879 
8880 --fetch the project id, visit start date and visit end date
8881 CURSOR get_visit_details_cur (p_wo_id IN NUMBER) IS
8882  SELECT wo.workorder_id, av.visit_id, av.project_id, av.start_date_time, av.close_date_time
8883  FROM ahl_workorders wo, ahl_visits_b av
8884  WHERE WO.WORKORDER_ID  = p_wo_id
8885   AND wo.visit_id = av.visit_id
8886   AND wo.visit_task_id IS NULL
8887   AND wo.master_workorder_flag = 'Y';
8888 visit_details_rec get_visit_details_cur%ROWTYPE;
8889 
8890 BEGIN
8891    -- Initialize return status to success before any code logic/validation
8892    x_return_status:= FND_API.G_RET_STS_SUCCESS;
8893 
8894    IF (l_log_procedure >= l_log_current_level) THEN
8895        fnd_log.string(l_log_procedure,
8896                       L_DEBUG_KEY ||'.begin',
8897                       'At the start of PL SQL procedure. p_prd_workorder_tbl.COUNT = ' || p_prd_workorder_tbl.COUNT);
8898     END IF;
8899    --for each workorder get the schduled start/end time
8900    IF p_prd_workorder_tbl.count > 0 THEN
8901       task_index := 1;
8902       FOR idx IN p_prd_workorder_tbl.FIRST..p_prd_workorder_tbl.LAST
8903       LOOP
8904          IF (l_log_statement >= l_log_current_level) THEN
8905             fnd_log.string(l_log_statement,
8906                            L_DEBUG_KEY,
8907                            'Workorder Id(' || idx || '): ' || p_prd_workorder_tbl(idx).workorder_id);
8908          END IF;
8909 
8910          OPEN get_wo_schedule_dates_cur(p_prd_workorder_tbl(idx).workorder_id);
8911          FETCH get_wo_schedule_dates_cur INTO get_wo_schedule_dates_rec;
8912          CLOSE get_wo_schedule_dates_cur;
8913 
8914          OPEN get_task_dates_cur(p_prd_workorder_tbl(idx).workorder_id);
8915          FETCH get_task_dates_cur INTO get_task_dates_rec;
8916          CLOSE get_task_dates_cur;
8917 
8918          --update the task start and end dates with workorder scheduled start/end dates.
8919          IF ((get_wo_schedule_dates_rec.scheduled_start_date <> get_task_dates_rec.start_date_time) OR
8920              (get_wo_schedule_dates_rec.scheduled_completion_date <> get_task_dates_rec.end_date_time)) THEN
8921             l_task_in_tbl(task_index).pa_task_id           := get_task_dates_rec.project_task_id;
8922             --Fix for the Bug 7009212; rnahata truncated the task times
8923             l_task_in_tbl(task_index).task_start_date      := trunc(get_wo_schedule_dates_rec.scheduled_start_date);
8924             l_task_in_tbl(task_index).task_completion_date := trunc(get_wo_schedule_dates_rec.scheduled_completion_date);
8925             --rnahata End
8926             -- jaramana Jan 5, 2005: Due to some reason, the task's Description does not get retained
8927             -- but gets corrupted if not passed (or left default at PA_INTERFACE_UTILS_PUB.G_PA_MISS_CHAR)
8928             l_task_in_tbl(task_index).TASK_DESCRIPTION     := get_task_dates_rec.description;
8929 
8930             IF (l_log_statement >= l_log_current_level) THEN
8931                fnd_log.string(l_log_statement,
8932                               L_DEBUG_KEY,
8933                               'task_index = ' || task_index);
8934                fnd_log.string(l_log_statement,
8935                               L_DEBUG_KEY,
8936                               'pa_task_id = '|| l_task_in_tbl(task_index).pa_task_id);
8937                fnd_log.string(l_log_statement,
8938                               L_DEBUG_KEY,
8939                               'task_start_date = ' || l_task_in_tbl(task_index).task_start_date);
8940                fnd_log.string(l_log_statement,
8941                               L_DEBUG_KEY,
8942                               'task_completion_date = ' || l_task_in_tbl(task_index).task_completion_date);
8943             END IF;
8944             task_index := task_index + 1;
8945          END IF;  -- Dates are not same
8946       END LOOP;
8947    END IF;  -- p_prd_workorder_tbl.count > 0
8948 
8949    IF (l_log_statement >= l_log_current_level) THEN
8950       fnd_log.string(l_log_statement,
8951                      L_DEBUG_KEY,
8952                      'l_task_in_tbl.count = ' || l_task_in_tbl.count);
8953    END IF;
8954    --update the master visit wo also with the visit start/end times.
8955    IF l_task_in_tbl.count > 0 THEN
8956       OPEN get_visit_details_cur(p_prd_workorder_tbl(p_prd_workorder_tbl.FIRST).workorder_id);
8957       FETCH get_visit_details_cur INTO visit_details_rec;
8958       CLOSE get_visit_details_cur;
8959 
8960       l_project_rec.PA_PROJECT_ID        := visit_details_rec.project_id;
8961       --Fix for the Bug 7009212; rnahata truncated the task times
8962       l_project_rec.START_DATE           := trunc(visit_details_rec.start_date_time);
8963       l_project_rec.COMPLETION_DATE      := trunc(visit_details_rec.close_date_time);
8964       l_project_rec.SCHEDULED_START_DATE := trunc(visit_details_rec.start_date_time);
8965       --rnahata End
8966       IF (l_log_statement >= l_log_current_level) THEN
8967          fnd_log.string(l_log_statement,
8968                         L_DEBUG_KEY,
8969                         'Before calling PA_PROJECT_PUB.update_project');
8970       END IF;
8971 
8972       --Now call update_project api to update the values in projects table
8973       PA_PROJECT_PUB.UPDATE_PROJECT(
8974             p_api_version_number => 1,
8975             p_commit             => p_commit,
8976             p_msg_count          => l_msg_count,
8977             p_msg_data           => l_msg_data,
8978             p_return_status      => l_return_status,
8979             p_workflow_started   => l_workflow_started,
8980             p_pm_product_code    => G_PM_PRODUCT_CODE,
8981             p_project_in         => l_project_rec,
8982             p_project_out        => l_project_out,
8983             p_key_members        => l_key_members,
8984             p_class_categories   => l_class_categories,
8985             p_tasks_in           => l_task_in_tbl,
8986             p_tasks_out          => l_task_out);
8987 
8988       IF (l_log_statement >= l_log_current_level) THEN
8989          fnd_log.string(l_log_statement,
8990                         L_DEBUG_KEY,
8991                         'After calling PA_PROJECT_PUB.update_project. Return Status = ' || l_return_status);
8992       END IF;
8993 
8994       IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
8995          IF (l_log_statement >= l_log_current_level) THEN
8996             fnd_log.string(l_log_statement,
8997                           L_DEBUG_KEY,
8998                           'Errors from PA_PROJECT_PUB.update_project. Message count: ' ||
8999                           l_msg_count || ', message data: ' || l_msg_data);
9000          END IF;
9001          IF l_return_status = FND_API.G_RET_STS_ERROR THEN
9002             RAISE FND_API.G_EXC_ERROR;
9003          ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
9004             RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
9005          END IF;
9006       END IF;  -- Return Status is not success
9007    END IF;  -- l_task_in_tbl.count > 0
9008 
9009    IF (l_log_procedure >= l_log_current_level) THEN
9010       fnd_log.string(l_log_procedure,
9011                      L_DEBUG_KEY ||'.end',
9012                      'At the end of PL SQL procedure. Return Status = ' || x_return_status);
9013    END IF;
9014 
9015 END Update_Project_Task_Times;
9016 
9017 -- SATHAPLI, 05-Jun-2008 - Cursory analysis shows that this API Create_Job_Tasks is not in use anymore.
9018 -- Retaining the API code in the end of the package for any future references.
9019 --------------------------------------------------------------------
9020 -- PROCEDURE
9021 --    Create_Job_Tasks
9022 --
9023 -- PURPOSE
9024 --
9025 --
9026 --------------------------------------------------------------------
9027 PROCEDURE Create_Job_Tasks(
9028    p_api_version      IN            NUMBER    :=1.0,
9029    p_init_msg_list    IN            VARCHAR2  := Fnd_Api.g_false,
9030    p_commit           IN            VARCHAR2  := Fnd_Api.g_false,
9031    p_validation_level IN            NUMBER    := Fnd_Api.g_valid_level_full,
9032    p_module_type      IN            VARCHAR2  := Null,
9033    p_x_task_Tbl       IN OUT NOCOPY Task_Tbl_Type,
9034    x_return_status       OUT NOCOPY VARCHAR2,
9035    x_msg_count           OUT NOCOPY NUMBER,
9036    x_msg_data            OUT NOCOPY VARCHAR2
9037  )
9038 IS
9039    L_API_VERSION  CONSTANT NUMBER := 1.0;
9040    L_API_NAME     CONSTANT VARCHAR2(30) := 'Create_Job_Tasks';
9041    L_DEBUG_KEY    CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
9042    l_msg_count             NUMBER;
9043    l_route_id              NUMBER;
9044    l_job_ct                NUMBER;
9045    i                       NUMBER;
9046    j                       NUMBER;
9047    z                       NUMBER;
9048    idx                     NUMBER;
9049    z_return_status         VARCHAR2(1);
9050    l_return_status         VARCHAR2(1);
9051    y_return_status         VARCHAR2(1);
9052    l_flag                  VARCHAR2(1);
9053    l_status_flag           VARCHAR2(1);
9054    l_msg_data              VARCHAR2(2000);
9055    l_prd_workorder_tbl     AHL_PRD_WORKORDER_PVT.PRD_WORKORDER_TBL;
9056    /* Begin Changes by Shkalyan */
9057    l_prd_workorder_rel_tbl AHL_PRD_WORKORDER_PVT.PRD_WORKORDER_REL_TBL;
9058    l_firm_planned_flag     VARCHAR2(1) := FND_PROFILE.value('AHL_PRD_FIRM_PLANNED_FLAG');
9059    l_visit_wo_id           NUMBER;
9060    l_visit_wo_ovn          NUMBER;
9061    /* End Changes by Shkalyan */
9062    l_visit_end_time        DATE;
9063 --
9064    -- To find count for tasks for visit
9065    CURSOR c_route (x_id IN NUMBER) IS
9066     SELECT Route_Id FROM AHL_MR_ROUTES_V
9067     WHERE MR_ROUTE_ID = x_id;
9068 
9069    -- To find visit related information
9070    CURSOR c_visit (x_id IN NUMBER) IS
9071     SELECT * FROM AHL_VISITS_VL
9072     WHERE VISIT_ID = x_id;
9073    c_visit_rec c_visit%ROWTYPE;
9074 
9075    -- To find task related information
9076    CURSOR c_task (x_id IN NUMBER) IS
9077     SELECT * FROM AHL_VISIT_TASKS_VL
9078     WHERE VISIT_TASK_ID = x_id ;
9079    c_task_rec c_task%ROWTYPE;
9080 
9081    -- To find count for jobs tasks
9082    CURSOR c_job (x_id IN NUMBER) IS
9083     SELECT count(*) FROM AHL_WORKORDERS
9084     WHERE VISIT_TASK_ID = x_id
9085     AND STATUS_CODE not in ('22','7');
9086 
9087    CURSOR c_chk_job (x_id IN NUMBER) IS
9088     SELECT * FROM AHL_WORKORDERS
9089     WHERE VISIT_TASK_ID = x_id
9090     AND STATUS_CODE not in ('22','7');
9091    c_chk_job_rec c_chk_job%ROWTYPE;
9092 
9093    -- To find job for Visit
9094    CURSOR c_visit_job (x_id IN NUMBER) IS
9095     SELECT workorder_id, object_version_number
9096     FROM AHL_WORKORDERS
9097     WHERE VISIT_ID = x_id
9098      AND VISIT_TASK_ID IS NULL
9099      AND MASTER_WORKORDER_FLAG = 'Y'
9100      AND STATUS_CODE not in ('22','7');
9101 
9102    --Post11510. Added to get summary task start, end time
9103    CURSOR get_summary_task_times_csr(p_task_id IN NUMBER)IS
9104     SELECT min(start_date_time), max(end_date_time)
9105       FROM ahl_visit_tasks_vl VST
9106     START WITH visit_task_id = p_task_id
9107     AND NVL(VST.status_code, 'Y') <> NVL ('DELETED', 'X')
9108     CONNECT BY originating_task_id = PRIOR visit_task_id;
9109 
9110 -- post 11.5.10
9111 -- yazhou Jul-20-2005 start
9112   CURSOR c_visit_task_exists(x_visit_id IN NUMBER)
9113   IS
9114     SELECT 'x'
9115     FROM   ahl_visit_tasks_b
9116     WHERE  visit_id = x_visit_id
9117     AND  STATUS_CODE = 'PLANNING';
9118 
9119    CURSOR c_get_wo_details(x_visit_id IN NUMBER)
9120     IS
9121     SELECT scheduled_start_date,
9122            SCHEDULED_COMPLETION_DATE
9123     FROM wip_discrete_jobs
9124     WHERE wip_entity_id =
9125           (
9126            SELECT
9127            wip_entity_id
9128            FROM ahl_workorders
9129            WHERE
9130              master_workorder_flag = 'Y' AND
9131              visit_task_id IS null AND
9132              status_code not in (22,7) and
9133              visit_id=x_visit_id
9134           );
9135       c_get_wo_details_rec  c_get_wo_details%ROWTYPE;
9136 
9137    l_dummy VARCHAR2(1);
9138 -- yazhou Jul-20-2005 end
9139 BEGIN
9140    --------------------- initialize -----------------------
9141   SAVEPOINT Create_Job_Tasks;
9142 
9143   IF (l_log_procedure >= l_log_current_level) THEN
9144     fnd_log.string(l_log_procedure,L_DEBUG_KEY||'.begin','At the start of the PLSQL procedure');
9145   END IF;
9146 
9147   -- Initialize message list if p_init_msg_list is set to TRUE.
9148   IF Fnd_Api.to_boolean(p_init_msg_list) THEN
9149      Fnd_Msg_Pub.initialize;
9150   END IF;
9151 
9152   --  Initialize API return status to success
9153   x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
9154 
9155   -- Standard call to check for call compatibility.
9156   IF NOT Fnd_Api.COMPATIBLE_API_CALL(l_api_version,
9157                                       p_api_version,
9158                                       l_api_name,G_PKG_NAME) THEN
9159     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
9160   END IF;
9161 
9162   --------------------------- Start of Body -------------------------------------
9163   IF (l_log_statement >= l_log_current_level) THEN
9164     fnd_log.string(l_log_statement,L_DEBUG_KEY,'Task table count = '||p_x_task_Tbl.COUNT);
9165   END IF;
9166 
9167   IF (p_x_task_Tbl.COUNT > 0) THEN
9168       i := p_x_task_Tbl.FIRST;
9169 
9170       IF (l_log_statement >= l_log_current_level) THEN
9171         fnd_log.string(l_log_statement,L_DEBUG_KEY,'Visit Id= ' || p_x_task_Tbl(i).visit_id);
9172         fnd_log.string(l_log_statement,L_DEBUG_KEY,'Task table value of Index i=' || i);
9173       END IF;
9174 
9175       WHILE i IS NOT NULL LOOP
9176         p_x_task_Tbl(i).operation_flag := 'C';
9177 
9178         OPEN c_visit (p_x_task_Tbl(i).visit_id);
9179         FETCH c_visit INTO c_visit_rec;
9180         CLOSE c_visit;
9181 
9182         --IF c_task_rec.department_id IS NULL THEN
9183         IF c_visit_rec.department_id IS NOT NULL THEN
9184           p_x_task_Tbl(i).department_id  := c_visit_rec.department_id ;
9185         ELSE
9186           p_x_task_Tbl(i).department_id  := NULL ;
9187         END IF;
9188         --END IF;
9189 
9190         IF (l_log_statement >= l_log_current_level) THEN
9191           fnd_log.string(l_log_statement,L_DEBUG_KEY,'Before calling AHL_VWP_TASKS_PVT.Create_Task');
9192         END IF;
9193 
9194         -- Call create Visit Task API
9195         AHL_VWP_TASKS_PVT.Create_Task (
9196           p_api_version      => p_api_version,
9197           p_init_msg_list    => Fnd_Api.g_false,
9198           p_validation_level => p_validation_level,
9199           p_module_type      => 'SR', --p_module_type,
9200           p_x_task_rec       => p_x_task_Tbl(i),
9201           x_return_status    => x_return_status,
9202           x_msg_count        => x_msg_count,
9203           x_msg_data         => x_msg_data);
9204 
9205         IF (l_log_statement >= l_log_current_level) THEN
9206           fnd_log.string(l_log_statement,L_DEBUG_KEY,'After calling AHL_VWP_TASKS_PVT.Create_Task - x_return_status = '|| x_return_status);
9207         END IF;
9208         EXIT WHEN x_return_status <> 'S';
9209         i:= p_x_task_Tbl.NEXT(i);
9210       END LOOP;
9211   END IF;
9212 
9213   IF x_return_status <> 'S' THEN
9214     RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
9215   END IF;
9216 
9217   IF (p_x_task_Tbl.COUNT > 0) THEN
9218     i := p_x_task_Tbl.FIRST;
9219     -- yazhou 15Aug2005 starts
9220     -- Bug# 4552764 fix
9221     OPEN c_visit (p_x_task_Tbl(i).visit_id);
9222     FETCH c_visit INTO c_visit_rec;
9223     CLOSE c_visit;
9224 
9225     IF (l_log_statement >= l_log_current_level) THEN
9226       fnd_log.string(l_log_statement,L_DEBUG_KEY,'Before calling AHL_VWP_TIMES_PVT.adjust_task_times');
9227     END IF;
9228 
9229     IF c_visit_rec.start_date_time < SYSDATE THEN
9230       WHILE i IS NOT NULL
9231       LOOP
9232           AHL_VWP_TIMES_PVT.adjust_task_times(
9233                   p_api_version        => 1.0,
9234                   p_init_msg_list      => Fnd_Api.G_FALSE,
9235                   p_commit             => Fnd_Api.G_FALSE,
9236                   p_validation_level   => Fnd_Api.G_VALID_LEVEL_FULL,
9237                   x_return_status      => l_return_status,
9238                   x_msg_count          => l_msg_count,
9239                   x_msg_data           => l_msg_data,
9240                   p_task_id            => p_x_task_Tbl(i).visit_task_id,
9241                   p_reset_sysdate_flag => FND_API.G_TRUE);
9242 
9243           i:= p_x_task_Tbl.NEXT(i);
9244        END LOOP;
9245      END IF;
9246      --The visit end date
9247      l_visit_end_time := AHL_VWP_TIMES_PVT.get_visit_end_time(c_visit_rec.visit_id);
9248 
9249      IF (l_log_statement >= l_log_current_level) THEN
9250       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);
9251      END IF;
9252      -- yazhou 15Aug2005 ends
9253   END IF;
9254 
9255   -- yazhou 06Oct2005 starts
9256   -- bug fix #4658861
9257   OPEN c_get_wo_details(c_visit_rec.visit_id);
9258   FETCH c_get_wo_details into c_get_wo_details_rec;
9259   CLOSE c_get_wo_details;
9260   -- yazhou 06Oct2005 ends
9261   -- Post 11.5.10
9262   -- RROY
9263 
9264   -- Yazhou Note: since we are checking for derived visit end time here, if there are other task in planning
9265   -- status with end date exceeding visit planned end date, then non-routine cannot be created
9266   IF TRUNC(l_visit_end_time) > TRUNC(c_visit_rec.close_date_time) THEN
9267     --yazhou Jul-20-2005 start
9268     -- Set visit status to partially released
9269     -- UPDATE AHL_VISITS_B SET STATUS_CODE = 'PARTIALLY RELEASED',
9270     -- OBJECT_VERSION_NUMBER = c_visit_rec.object_version_number + 1
9271     -- WHERE VISIT_ID = c_visit_rec.visit_id;
9272     --yazhou Jul-20-2005 end
9273 
9274     -- yazhou Sep-15-2005 starts
9275     -- bug fix 4613220
9276     IF (p_x_task_Tbl.COUNT > 0) THEN
9277       i := p_x_task_Tbl.FIRST;
9278     END IF;
9279     -- Error Message
9280     FND_MESSAGE.Set_Name('AHL','AHL_VWP_CRT_JOB_ERR');
9281     Fnd_Message.Set_Token('TASK_NUMBER', p_x_task_tbl(i).visit_task_number);
9282     Fnd_Message.Set_Token('END_DATE', TRUNC(l_visit_end_time));
9283     -- yazhou Sep-15-2005 ends
9284     FND_MSG_PUB.ADD;
9285     -- yazhou 06Oct2005 starts
9286     -- bug fix #4658861
9287     -- Note: since we are checking for derived end time here, if there are other task in planning
9288     -- status with end date exceeding visit master WO end date, then non-routine cannot be created
9289 
9290   ELSIF TRUNC(l_visit_end_time) > TRUNC(c_get_wo_details_rec.scheduled_completion_date) THEN
9291     -- Error Message
9292     Fnd_Message.SET_NAME('AHL','AHL_VWP_DATE_EXCD_WO_DATE');
9293     Fnd_Message.Set_Token('VISIT_END_DATE', l_visit_end_time);
9294     FND_MSG_PUB.ADD;
9295     -- yazhou 06Oct2005 ends
9296   ELSE
9297     -- Start for 11.5.10 release
9298     -- By shbhanda 05-Jun-03
9299     -- For creating/updating Master Workorder in production for the visit in VWP
9300     idx := 1;
9301     /* Begin Changes by Shkalyan */
9302     l_prd_workorder_tbl(idx).MASTER_WORKORDER_FLAG := 'Y';
9303     l_prd_workorder_tbl(idx).BATCH_ID := c_visit_rec.visit_number;
9304     l_prd_workorder_tbl(idx).HEADER_ID := 0; -- Visit
9305 
9306     OPEN c_visit_job (c_visit_rec.visit_id);
9307     FETCH c_visit_job INTO l_visit_wo_id, l_visit_wo_ovn;
9308     CLOSE c_visit_job;
9309 
9310     IF l_visit_wo_id IS NOT NULL THEN
9311       l_prd_workorder_tbl(idx).DML_OPERATION := 'U';
9312       l_prd_workorder_tbl(idx).WORKORDER_ID := l_visit_wo_id;
9313       l_prd_workorder_tbl(idx).OBJECT_VERSION_NUMBER := l_visit_wo_ovn;
9314     ELSE
9315       l_prd_workorder_tbl(idx).DML_OPERATION := 'C';
9316       l_prd_workorder_tbl(idx).STATUS_CODE           := '1';
9317       l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG     := 1; -- Firm
9318     END IF;
9319     /* End Changes by Shkalyan */
9320 
9321     l_prd_workorder_tbl(idx).VISIT_ID              := c_visit_rec.visit_id;
9322     l_prd_workorder_tbl(idx).ORGANIZATION_ID       := c_visit_rec.organization_id;
9323     l_prd_workorder_tbl(idx).PROJECT_ID            := c_visit_rec.project_id;
9324     l_prd_workorder_tbl(idx).DEPARTMENT_ID         := c_visit_rec.department_id ;
9325     l_prd_workorder_tbl(idx).INVENTORY_ITEM_ID     := c_visit_rec.inventory_item_id ;
9326     l_prd_workorder_tbl(idx).ITEM_INSTANCE_ID      := c_visit_rec.item_instance_id ;
9327     l_prd_workorder_tbl(idx).SCHEDULED_START_DATE  := c_visit_rec.start_date_time;
9328     --l_prd_workorder_tbl(idx).SCHEDULED_END_DATE  := l_visit_end_time;
9329     -- Changed by Shbhanda on 30th Jan 04
9330     l_prd_workorder_tbl(idx).SCHEDULED_END_DATE    := c_visit_rec.close_date_time;
9331     l_prd_workorder_tbl(idx).JOB_DESCRIPTION       := c_visit_rec.visit_name ;
9332 
9333     idx := idx + 1;
9334 
9335     IF (p_x_task_Tbl.COUNT > 0) THEN
9336       i := p_x_task_Tbl.FIRST;
9337       j := 0;
9338 
9339       WHILE i IS NOT NULL LOOP
9340         -- Call create WIP Job API
9341         OPEN c_job(p_x_task_Tbl(i).visit_task_id);
9342         FETCH c_job INTO l_job_ct;
9343         CLOSE c_job;
9344 
9345         IF (l_log_statement >= l_log_current_level) THEN
9346           fnd_log.string(l_log_statement,L_DEBUG_KEY,'For job count = ' || l_job_ct);
9347         END IF;
9348 
9349         IF l_job_ct > 0 THEN
9350           i := i + 1;
9351         ELSE
9352           OPEN c_task(p_x_task_Tbl(i).visit_task_id);
9353           FETCH c_task INTO c_task_rec;
9354           CLOSE c_task;
9355 
9356           /* Begin Changes by Shkalyan */
9357           -- Form the Workorder Relationship Parenting to the Visit
9358           l_prd_workorder_rel_tbl(idx-1).DML_OPERATION := 'C';
9359           l_prd_workorder_rel_tbl(idx-1).PARENT_HEADER_ID := 0; -- Visit
9360           l_prd_workorder_rel_tbl(idx-1).CHILD_HEADER_ID := c_task_rec.visit_task_number;
9361           l_prd_workorder_rel_tbl(idx-1).BATCH_ID := c_visit_rec.visit_number;
9362           l_prd_workorder_rel_tbl(idx-1).RELATIONSHIP_TYPE := 1;
9363 
9364           -- Form the Workorder Record
9365           l_prd_workorder_tbl(idx).DML_OPERATION     := 'C';
9366           l_prd_workorder_tbl(idx).MASTER_WORKORDER_FLAG := 'N';
9367           l_prd_workorder_tbl(idx).BATCH_ID := c_visit_rec.visit_number;
9368           l_prd_workorder_tbl(idx).HEADER_ID := c_task_rec.visit_task_number;
9369           /* End Changes by Shkalyan */
9370 
9371           l_prd_workorder_tbl(idx).VISIT_ID          := c_visit_rec.visit_id;
9372           l_prd_workorder_tbl(idx).ORGANIZATION_ID   := c_visit_rec.organization_id;
9373           l_prd_workorder_tbl(idx).PROJECT_ID        := c_visit_rec.project_id;
9374           l_prd_workorder_tbl(idx).STATUS_CODE       := '1';
9375           l_prd_workorder_tbl(idx).INVENTORY_ITEM_ID := c_task_rec.inventory_item_id ;
9376           l_prd_workorder_tbl(idx).ITEM_INSTANCE_ID  := c_task_rec.instance_id ;
9377           l_prd_workorder_tbl(idx).VISIT_TASK_ID     := c_task_rec.visit_task_id ;
9378           l_prd_workorder_tbl(idx).VISIT_TASK_NUMBER := c_task_rec.visit_task_number ;
9379           l_prd_workorder_tbl(idx).PROJECT_TASK_ID   := c_task_rec.project_task_id ;
9380           l_prd_workorder_tbl(idx).JOB_DESCRIPTION   := c_task_rec.visit_task_name ;
9381 
9382           IF c_task_rec.department_id IS NOT NULL AND c_task_rec.department_id <> FND_API.g_miss_num THEN
9383             l_prd_workorder_tbl(idx).DEPARTMENT_ID   := c_task_rec.department_id ;
9384           ELSE
9385             l_prd_workorder_tbl(idx).DEPARTMENT_ID   := c_visit_rec.department_id ;
9386           END IF;
9387 
9388           IF c_task_rec.mr_route_id IS NOT NULL AND c_task_rec.mr_route_id <> FND_API.g_miss_num THEN
9389             OPEN c_route (c_task_rec.mr_route_id);
9390             FETCH c_route INTO l_route_id;
9391             CLOSE c_route;
9392             l_prd_workorder_tbl(idx).ROUTE_ID := l_route_id ;
9393           ELSE
9394             l_prd_workorder_tbl(idx).ROUTE_ID := Null;
9395           END IF;
9396 
9397           --POST11510 cxcheng. If summary task, use the min,max for sub tasks
9398           IF (c_task_rec.task_type_code = 'SUMMARY') THEN
9399             OPEN get_summary_task_times_csr(c_task_rec.visit_task_id);
9400             FETCH get_summary_task_times_csr INTO l_prd_workorder_tbl(idx).SCHEDULED_START_DATE,
9401                                                   l_prd_workorder_tbl(idx).SCHEDULED_END_DATE  ;
9402             CLOSE get_summary_task_times_csr;
9403           ELSE
9404             l_prd_workorder_tbl(idx).SCHEDULED_START_DATE  := c_task_rec.start_date_time;
9405             l_prd_workorder_tbl(idx).SCHEDULED_END_DATE    := c_task_rec.end_date_time;
9406           END IF;
9407 
9408           /* Begin Changes by Shkalyan */
9409           IF (l_firm_planned_flag IS NOT NULL AND
9410             l_firm_planned_flag = '2') THEN
9411             l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG     := 2; -- Planned
9412           ELSE
9413             l_prd_workorder_tbl(idx).FIRM_PLANNED_FLAG     := 1; -- Firm
9414           END IF;
9415           /* End Changes by Shkalyan */
9416           idx := idx + 1;
9417           i := p_x_task_Tbl.NEXT(i);
9418         END IF;
9419       END LOOP;
9420     END IF;
9421 
9422     IF l_prd_workorder_tbl.COUNT > 0  THEN
9423       IF (l_log_statement >= l_log_current_level) THEN
9424         fnd_log.string(l_log_statement,L_DEBUG_KEY,'Before calling AHL_PRD_WORKORDER_PVT.Process_Jobs');
9425       END IF;
9426 
9427       /* Begin Changes by Shkalyan */
9428       AHL_PRD_WORKORDER_PVT.Process_Jobs
9429                  (p_api_version           => p_api_version,
9430                   p_init_msg_list         => p_init_msg_list,
9431                   p_commit                => Fnd_Api.g_false,
9432                   p_validation_level      => p_validation_level,
9433                   p_default               => FND_API.G_TRUE,
9434                   p_module_type           => p_module_type,
9435                   x_return_status         => x_return_status,
9436                   x_msg_count             => x_msg_count,
9437                   x_msg_data              => x_msg_data,
9438                   p_x_prd_workorder_tbl   => l_prd_workorder_tbl,
9439                   p_prd_workorder_rel_tbl => l_prd_workorder_rel_tbl
9440                   );
9441       /* End Changes by Shkalyan */
9442       IF (l_log_statement >= l_log_current_level) THEN
9443         fnd_log.string(l_log_statement,L_DEBUG_KEY,'After calling AHL_PRD_WORKORDER_PVT.Process_Jobs - x_return_status = '||x_return_status);
9444       END IF;
9445 
9446       IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
9447          RAISE Fnd_Api.G_EXC_ERROR;
9448       END IF;
9449     END IF; -- To find if the visit has any tasks
9450 
9451     IF (p_x_task_Tbl.COUNT > 0) THEN
9452         i := p_x_task_Tbl.FIRST;
9453          WHILE i IS NOT NULL LOOP
9454             OPEN c_chk_job(p_x_task_Tbl(i).visit_task_id);
9455             FETCH c_chk_job INTO c_chk_job_rec;
9456             CLOSE c_chk_job;
9457 
9458             p_x_task_Tbl(i).workorder_id  := c_chk_job_rec.workorder_id;
9459 
9460             --yazhou Jul-18-2005 start
9461             -- Fix for bug # 4078095
9462             UPDATE AHL_VISIT_TASKS_B
9463             SET STATUS_CODE = 'RELEASED',
9464                 OBJECT_VERSION_NUMBER = OBJECT_VERSION_NUMBER + 1
9465             WHERE VISIT_TASK_ID = p_x_task_Tbl(i).visit_task_id
9466             AND STATUS_CODE = 'PLANNING';
9467             --yazhou Jul-18-2005 end
9468             i := p_x_task_Tbl.NEXT(i);
9469          END LOOP;
9470     END IF;
9471 
9472     IF (l_log_statement >= l_log_current_level) THEN
9473         fnd_log.string(l_log_statement,L_DEBUG_KEY,'Updated visit to Released..');
9474     END IF;
9475     --yazhou Jul-20-2005 start
9476 
9477     OPEN c_visit_task_exists(c_visit_rec.visit_id);
9478     FETCH c_visit_task_exists INTO l_dummy;
9479 
9480     OPEN c_get_wo_details(c_visit_rec.visit_id);
9481     FETCH c_get_wo_details into c_get_wo_details_rec;
9482     IF (c_visit_task_exists%NOTFOUND and
9483         c_visit_rec.start_date_time = c_get_wo_details_rec.scheduled_start_date and
9484         c_visit_rec.close_date_time = c_get_wo_details_rec.scheduled_completion_date) THEN
9485           UPDATE ahl_visits_b
9486           SET status_code = 'RELEASED',
9487               object_version_number = object_version_number + 1
9488           WHERE visit_id = c_visit_rec.visit_id;
9489 
9490           IF (l_log_statement >= l_log_current_level) THEN
9491               fnd_log.string(l_log_statement,L_DEBUG_KEY,'Before updating the task flag');
9492           END IF;
9493 
9494           IF c_visit_rec.any_task_chg_flag = 'Y' THEN
9495              AHL_VWP_RULES_PVT.Update_Visit_Task_Flag
9496                          (p_visit_id      => c_visit_rec.visit_id,
9497                           p_flag          => 'N',
9498                           x_return_status => x_return_status);
9499           END IF;
9500       END IF;
9501       CLOSE c_visit_task_exists;
9502       CLOSE c_get_wo_details;
9503   END IF;
9504   -- yazhou Jul-20-2005 end
9505   -- RROY
9506   ---------------------------End of Body-------------------------------------
9507   -- END of API body.
9508   -- Standard check of p_commit.
9509 
9510   IF Fnd_Api.To_Boolean (p_commit) THEN
9511      COMMIT WORK;
9512   END IF;
9513 
9514   Fnd_Msg_Pub.count_and_get(
9515          p_encoded => Fnd_Api.g_false,
9516          p_count   => x_msg_count,
9517          p_data    => x_msg_data);
9518 
9519   IF (l_log_procedure >= l_log_current_level) THEN
9520     fnd_log.string(l_log_procedure,L_DEBUG_KEY||'.end','At the end of the PLSQL procedure');
9521   END IF;
9522 
9523 EXCEPTION
9524    WHEN Fnd_Api.g_exc_error THEN
9525       ROLLBACK TO Create_Job_Tasks;
9526       x_return_status := Fnd_Api.g_ret_sts_error;
9527       Fnd_Msg_Pub.count_and_get (
9528             p_encoded => Fnd_Api.g_false,
9529             p_count   => x_msg_count,
9530             p_data    => x_msg_data
9531      );
9532    WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
9533       ROLLBACK TO Create_Job_Tasks;
9534       x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
9535       Fnd_Msg_Pub.count_and_get (
9536             p_encoded => Fnd_Api.g_false,
9537             p_count   => x_msg_count,
9538             p_data    => x_msg_data
9539      );
9540    WHEN OTHERS THEN
9541       ROLLBACK TO Create_Job_Tasks;
9542       x_return_status := Fnd_Api.g_ret_sts_unexp_error ;
9543       IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_unexp_error)
9544     THEN
9545          Fnd_Msg_Pub.add_exc_msg (G_PKG_NAME, l_api_name);
9546       END IF;
9547       Fnd_Msg_Pub.count_and_get (
9548             p_encoded => Fnd_Api.g_false,
9549             p_count   => x_msg_count,
9550             p_data    => x_msg_data
9551      );
9552 END Create_Job_Tasks;
9553 
9554 END AHL_VWP_PROJ_PROD_PVT;