DBA Data[Home] [Help]

PACKAGE BODY: APPS.AHL_VWP_RULES_PVT

Source


1 PACKAGE BODY AHL_VWP_RULES_PVT AS
2 /* $Header: AHLVRULB.pls 120.13 2008/04/17 06:01:10 rnahata ship $ */
3 -----------------------------------------------------------
4 -- PACKAGE
5 --    AHL_VWP_RULES_PVT
6 --
7 -- PURPOSE
8 --    This package body is a Private API for managing VWP Visit and Tasks
9 --    general utilities procedures in Complex Maintainance, Repair and Overhauling(CMRO).
10 --    It defines few global constants, various local functions and procedures
11 --    used by other Visit Work Package(VWP) APIs
12 --
13 -- PROCEDURES
14 --    Check_Serial_No_by_UConfig    -- Check_Item_name_Or_Id
15 --    Check_Serial_Name_Or_Id       -- Check_Lookup_name_Or_Id
16 --    Check_Org_Name_Or_Id          -- Check_Dept_Desc_Or_Id
17 --    Check_Visit_is_Simulated      -- Check_Unit_Name_Valid
18 --    Check_Stage_Number_Or_Id      -- Check_SR_request_number_Or_Id
19 --    Check_Visit_Task_Number_Or_Id -- Check_Project_Template_Or_Id
20 --    Check_Proj_Responsibility     -- Check_Cost_Parent_Loop
21 --    Check_Origin_Task_Loop        -- Check_Price_List_Name_Or_Id
22 
23 --    Validate_bef_Times_Derive     -- Insert_Task
24 --    Create_Tasks_for_MR           -- Tech_Dependency
25 
26 --    Get_Visit_Task_Id             -- Get_Visit_Task_Number
27 --    Get_Serial_Item_by_Unit       -- Get_Cost_Originating_Id
28 --    Get_Summary_Task_Time         --
29 --
30 --    Update_Cost_Origin_Task       -- Update_Visit_Task_Flag
31 --    Merge_for_Unique_Items        -- Merge_for_Unique_Items
32 --
33 -- NOTES
34 --
35 -- HISTORY
36 -- 03-MAR-2003  SHBHANDA  Created.
37 -- 06-AUG-2003  SHBHANDA  11.5.10 Changes.
38 -- 09-12-2003   RTADIKON  Merge_for_Unique_Items Coded for costing 11.5.10
39 --                        Along with the logging mechanism.
40 -- 05-NOV-2007  RNAHATA   Replaced all Ahl_Debug_Pub.debug with STATEMENT
41 --                        level logs and added more STATEMENT level logs at
42 --                        key decision points. Added PROCEDURE level logs
43 --                        when entering and exiting a procedure.
44 -----------------------------------------------------------------
45 
46 -----------------------------------------------------------------
47 --   Define Global CONSTANTS                                   --
48 -----------------------------------------------------------------
49 G_APP_NAME        CONSTANT VARCHAR2(3)  := 'AHL';
50 G_PKG_NAME        CONSTANT VARCHAR2(30) := 'AHL_VWP_RULES_PVT';
51 G_OPER_ASSOC_TYPE CONSTANT VARCHAR2(30) := 'OPERATION';
52 G_RT_ASSOC_TYPE   CONSTANT VARCHAR2(30) := 'ROUTE';
53 ------------------------------------
54 -- Common constants and variables --
55 ------------------------------------
56 l_log_current_level   NUMBER   := fnd_log.g_current_runtime_level;
57 l_log_statement       NUMBER   := fnd_log.level_statement;
58 l_log_procedure       NUMBER   := fnd_log.level_procedure;
59 l_log_error           NUMBER   := fnd_log.level_error;
60 l_log_unexpected      NUMBER   := fnd_log.level_unexpected;
61 ---------------------------------------------------------------------
62 -- Define Record Types for record structures needed by the APIs --
63 ---------------------------------------------------------------------
64 --  Serial record type for validating serial exists in unit-config tree of the visit
65 TYPE Serial_Rec_Type IS RECORD
66    (INSTANCE_ID          NUMBER,
67     SERIAL_NUMBER        VARCHAR2(30));
68 
69 ---------------------------------------------------------------------
70 -- Define Table Types for table structures of records needed by the APIs --
71 ---------------------------------------------------------------------
72 --  Table type for storing 'Serial_Rec_Type' record datatype
73 TYPE Serial_Tbl_Type IS TABLE OF Serial_Rec_Type
74    INDEX BY BINARY_INTEGER;
75 
76 --------------------------------------------------------------------
77 -- Define local procedures signature                              --
78 --------------------------------------------------------------------
79 
80 --------------------------------------------------------------------
81 -- Define local functions signature                               --
82 --------------------------------------------------------------------
83 
84 --------------------------------------------------------------------
85 -- Define local procedures body                                   --
86 --------------------------------------------------------------------
87 -----------------------------------------------------------------------
88 -- FUNCTION
89 --    instance_in_config_tree
90 --
91 -- PURPOSE
92 --    Check whether p_instance_id belongs to the instance of p_visit_id
93 --    Return 'Y' for the following cases:
94 --      1. p_visit_id doesn't have instance_id associated at all
95 --      2. The instance_id of p_visit_id = p_instance_id regardless whether
96 --         the instance of p_visit_id has components or not
97 --      3. p_instance_id is a component of the instance of p_visit_id regardless
98 --         whether it is a UC tree or IB tree
99 --    Return 'N' otherwise
100 -----------------------------------------------------------------------
101 FUNCTION instance_in_config_tree(p_visit_id NUMBER, p_instance_id NUMBER) RETURN VARCHAR2
102 IS
103   l_instance_id        NUMBER;
104   l_visit_instance_id  NUMBER;
105   L_API_NAME    CONSTANT VARCHAR2(30)  := 'instance_in_config_tree';
106   L_DEBUG_KEY   CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
107 
108   CURSOR get_visit_instance IS
109     SELECT item_instance_id
110       FROM ahl_visits_b
111      WHERE visit_id = p_visit_id;
112   CURSOR check_instance_in_tree(c_top_instance_id NUMBER, c_instance_id NUMBER) IS
113     SELECT subject_id
114       FROM csi_ii_relationships
115      WHERE subject_id = c_instance_id
116 START WITH object_id = c_top_instance_id
117        AND relationship_type_code = 'COMPONENT-OF'
118        AND trunc(nvl(active_start_date, SYSDATE)) <= trunc(SYSDATE)
119        AND trunc(nvl(active_end_date, SYSDATE+1)) > trunc(SYSDATE)
120 CONNECT BY object_id = PRIOR subject_id
121        AND relationship_type_code = 'COMPONENT-OF'
122        AND trunc(nvl(active_start_date, SYSDATE)) <= trunc(SYSDATE)
123        AND trunc(nvl(active_end_date, SYSDATE+1)) > trunc(SYSDATE);
124 
125 BEGIN
126   IF (l_log_procedure >= l_log_current_level) THEN
127      fnd_log.string(l_log_procedure,
128                     L_DEBUG_KEY ||'.begin',
129                     'At the start of PL SQL function. Visit Id = ' || p_visit_id ||
130                     ', p_instance_id = ' || p_instance_id);
131   END IF;
132   OPEN get_visit_instance;
133   FETCH get_visit_instance INTO l_visit_instance_id;
134   -- Added additional or condition by senthil as the Visit Instance Id can be null.
135   IF get_visit_instance%NOTFOUND OR l_visit_instance_id is NULL THEN
136      CLOSE get_visit_instance;
137      RETURN FND_API.G_RET_STS_SUCCESS;
138   ELSE
139      CLOSE get_visit_instance;
140      IF l_visit_instance_id = p_instance_id THEN
141         RETURN FND_API.G_RET_STS_SUCCESS;
142      ELSE
143         OPEN check_instance_in_tree(l_visit_instance_id, p_instance_id);
144         FETCH check_instance_in_tree INTO l_instance_id;
145         IF check_instance_in_tree%FOUND THEN
146            CLOSE check_instance_in_tree;
147            RETURN FND_API.G_RET_STS_SUCCESS;
148         ELSE
149            CLOSE check_instance_in_tree;
150            RETURN FND_API.G_RET_STS_ERROR;
151         END IF;
152      END IF;
153   END IF;
154 END;
155 
156 --------------------------------------------------------------------
157 -- PROCEDURE
158 --    Check_Item_Name_OR_Id
159 --
160 -- PURPOSE
161 --    Converts Item Name and Inventory Org to Inventory Item Id
162 --------------------------------------------------------------------
163 PROCEDURE Check_Item_Name_Or_Id
164     (p_item_id              IN NUMBER,
165      p_org_id               IN NUMBER,
166      p_item_name            IN VARCHAR2,
167 
168      x_item_id              OUT NOCOPY NUMBER,
169      x_org_id               OUT NOCOPY NUMBER,
170      x_item_name            OUT NOCOPY VARCHAR2,
171      x_return_status        OUT NOCOPY VARCHAR2,
172      x_error_msg_code       OUT NOCOPY VARCHAR2
173      )
174 IS
175   -- Define local variables
176   L_API_NAME  CONSTANT VARCHAR2(30) := 'Check_Item_Name_Or_Id';
177   L_DEBUG_KEY CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
178 BEGIN
179    IF (l_log_procedure >= l_log_current_level) THEN
180       fnd_log.string(l_log_procedure,
181                      L_DEBUG_KEY ||'.begin',
182                      'At the start of PL SQL procedure. Item Id = ' ||
183                      p_item_id || ', Item Name = ' || p_item_name || ', Org Id = ' || p_org_id);
184    END IF;
185 
186    IF p_org_id IS NOT NULL THEN
187       IF p_item_name IS NOT NULL THEN
188          -- SELECT concatenated_segments, inventory_item_id, inventory_org_id
189          -- INTO x_item_name, x_item_id, x_org_id
190          -- FROM AHL_MTL_ITEMS_OU_V
191          -- WHERE concatenated_segments = p_item_name AND inventory_org_id = p_org_id;
192 
193          -- Fix for ADS bug# 4357001.
194          -- AnRaj:Changes made for fixing bug#4919353, issue# 1
195          /* SELECT concatenated_segments, inventory_item_id, organization_id
196          INTO x_item_name, x_item_id, x_org_id
197          FROM MTL_SYSTEM_ITEMS_KFV
198          WHERE concatenated_segments = p_item_name AND organization_id = p_org_id
199          AND organization_id IN (Select DISTINCT m.master_organization_id
200                                  FROM org_organization_definitions org, mtl_parameters m
201                                  WHERE org.organization_id = m.organization_id
202                                  AND NVL(org.operating_unit, mo_global.get_current_org_id())
203                                  = mo_global.get_current_org_id()
204                                 );*/
205 
206         SELECT concatenated_segments, inventory_item_id, organization_id
207         INTO x_item_name, x_item_id, x_org_id
208         FROM MTL_SYSTEM_ITEMS_KFV
209         WHERE concatenated_segments = p_item_name
210         AND organization_id = p_org_id
211         AND organization_id IN
212             (SELECT DISTINCT m.master_organization_id
213              FROM INV_ORGANIZATION_INFO_V org,
214                   mtl_parameters m
215               WHERE org.organization_id = m.organization_id
216               AND NVL(org.operating_unit,mo_global.get_current_org_id()) = mo_global.get_current_org_id()
217             ) ;
218       ELSIF p_item_id IS NOT NULL THEN
219          -- SELECT concatenated_segments, inventory_item_id, inventory_org_id
220          -- INTO x_item_name, x_item_id, x_org_id
221          -- FROM AHL_MTL_ITEMS_OU_V
222          -- WHERE inventory_item_id = p_item_id AND inventory_org_id = p_org_id;
223 
224          -- Fix for ADS bug# 4357001.
225          /* SELECT concatenated_segments, inventory_item_id, organization_id
226          INTO x_item_name, x_item_id, x_org_id
227          FROM MTL_SYSTEM_ITEMS_KFV
228          WHERE inventory_item_id = p_item_id AND organization_id = p_org_id
229          AND organization_id IN (Select DISTINCT m.master_organization_id
230                                  FROM org_organization_definitions org, mtl_parameters m
231                                  WHERE org.organization_id = m.organization_id
232                                  AND NVL(org.operating_unit, mo_global.get_current_org_id())
233                                  = mo_global.get_current_org_id()
234                                 ); */
235          -- AnRaj: Changes made for fixing bug#4919353
236          SELECT concatenated_segments, inventory_item_id, organization_id
237          INTO x_item_name, x_item_id, x_org_id
238          FROM MTL_SYSTEM_ITEMS_KFV
239          WHERE inventory_item_id = p_item_id AND organization_id = p_org_id
240          AND organization_id IN (Select DISTINCT m.master_organization_id
241                                  FROM inv_organization_info_v org,
242                                       mtl_parameters m
243                                  WHERE org.organization_id = m.organization_id
244                                  AND NVL(org.operating_unit,mo_global.get_current_org_id())
245                                  = mo_global.get_current_org_id()
246                                 ) ;
247       END IF;
248       x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
249    ELSE
250       x_return_status := Fnd_Api.G_RET_STS_ERROR;
251    END IF;
252 
253    IF (l_log_procedure >= l_log_current_level) THEN
254       fnd_log.string(l_log_procedure,
255                      L_DEBUG_KEY ||'.end',
256                      'At the end of PL SQL procedure. Return Status = ' || x_return_status ||
257                      '. Item Id = ' || x_item_id || ', Item Name = ' || x_item_name ||
258                      ', Org Id = ' || x_org_id);
259    END IF;
260 
261 EXCEPTION
262        WHEN NO_DATA_FOUND THEN
263          x_return_status:= Fnd_Api.G_RET_STS_ERROR;
264          x_error_msg_code:= 'AHL_VWP_ITEM_NOT_EXISTS';
265        WHEN TOO_MANY_ROWS THEN
266          x_return_status:= Fnd_Api.G_RET_STS_ERROR;
267          x_error_msg_code:= 'AHL_VWP_ITEM_NOT_EXISTS';
268        WHEN OTHERS THEN
269          x_return_status:= Fnd_Api.G_RET_STS_UNEXP_ERROR;
270        RAISE;
271 END Check_Item_Name_Or_Id;
272 
273 -- Post 11.5.10 Enhancements
274 -- Added Procedure for Checking Project Template Name of Id.
275 --------------------------------------------------------------------
276 -- PROCEDURE
277 --    Check_Project_Template_Or_Id
278 --
279 -- PURPOSE
280 --    Procedure to check project template name and retrieve project id
281 --------------------------------------------------------------------
282 PROCEDURE Check_Project_Template_Or_Id
283 (
284  p_proj_temp_name     IN VARCHAR2,
285 
286  x_project_id         OUT NOCOPY NUMBER,
287  x_return_status      OUT NOCOPY VARCHAR2,
288  x_error_msg_code     OUT NOCOPY VARCHAR2
289 )
290 IS
291   -- Define local variables
292    L_API_NAME   CONSTANT VARCHAR2(30) := 'Check_Project_Template_Or_Id';
293    L_DEBUG_KEY  CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
294 
295   CURSOR c_proj_template(p_proj_temp_name IN VARCHAR2)
296   IS
297     -- AnRaj:Changes made for fixing bug#4919353, issue# 8
298     SELECT  project_id
299     FROM  PA_PROJECTS
300     WHERE name = p_proj_temp_name
301     AND TEMPLATE_FLAG = 'Y';
302 
303     /*
304     -- Commented by rnahata on June 25, 2007 for Bug 6147752
305     -- Check removed to avoid having to setup Project's
306     -- Carrying-out Org as an Inventory Org
307     AND carrying_out_organization_id IN
308         ( SELECT  organization_id
309           FROM  INV_ORGANIZATION_INFO_V
310           WHERE NVL(operating_unit,mo_global.get_current_org_id()) =
311               mo_global.get_current_org_id()
312         );
313     */
314     /*
315     SELECT project_id
316     FROM PA_PROJECTS
317     WHERE name = p_proj_temp_name
318     AND TEMPLATE_FLAG = 'Y'
319     AND  carrying_out_organization_id IN (SELECT organization_id
320       FROM org_organization_definitions
321       WHERE NVL(operating_unit, mo_global.get_current_org_id()) =
322             mo_global.get_current_org_id());
323     */
324 
325 BEGIN
326 
327    IF (l_log_procedure >= l_log_current_level) THEN
328       fnd_log.string(l_log_procedure,
329                      L_DEBUG_KEY ||'.begin',
330                      'At the start of PL SQL procedure. Project Template Name = ' || p_proj_temp_name);
331    END IF;
332 
333    IF p_proj_temp_name IS NOT NULL THEN
334       OPEN c_proj_template(p_proj_temp_name);
335       FETCH c_proj_template INTO x_project_id;
336       IF c_proj_template%NOTFOUND
337       THEN
338          x_return_status := Fnd_Api.G_RET_STS_ERROR;
339       ELSE
340          IF (l_log_statement >= l_log_current_level) THEN
341             fnd_log.string(l_log_statement,
342                            L_DEBUG_KEY,
343                            'Project Id = ' || x_project_id);
344          END IF;
345          x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
346       END IF;
347       CLOSE c_proj_template;
348    END IF;
349 
350    IF (l_log_procedure >= l_log_current_level) THEN
351       fnd_log.string(l_log_procedure,
352                      L_DEBUG_KEY ||'.end',
353                      'At the end of PL SQL procedure. Return Status = ' || x_return_status);
354    END IF;
355 
356 EXCEPTION
357    WHEN OTHERS THEN
358         x_return_status:= Fnd_Api.G_RET_STS_UNEXP_ERROR;
359 RAISE;
360 END Check_Project_Template_Or_Id;
361 
362 --------------------------------------------------------------------
363 -- PROCEDURE
364 --    Check_Serial_Name_Or_Id
365 --
366 -- PURPOSE
367 --    Converts Serial Name to Instance Id
368 --------------------------------------------------------------------
369 PROCEDURE Check_Serial_Name_Or_Id
370   (p_item_id          IN NUMBER,
371    p_org_id           IN NUMBER,
372    p_serial_id        IN NUMBER,
373    p_serial_number    IN VARCHAR2,
374 
375    x_serial_id        OUT NOCOPY NUMBER,
376    x_return_status    OUT NOCOPY VARCHAR2,
377    x_error_msg_code   OUT NOCOPY VARCHAR2
378  )
379 IS
380   -- Define local variables
381    L_API_NAME    CONSTANT VARCHAR2(30) := 'Check_Serial_Name_Or_Id';
382    L_DEBUG_KEY   CONSTANT VARCHAR2(100):= 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
383 BEGIN
384    IF (l_log_procedure >= l_log_current_level) THEN
385       fnd_log.string(l_log_procedure,
386                      L_DEBUG_KEY ||'.begin',
387                      'At the start of PL SQL procedure. Org Id = ' || p_org_id ||
388                      ', Item Id = ' || p_item_id ||
389                      ', Serial Id = ' || p_serial_id ||
390                      ', Serial Number' || p_serial_number);
391    END IF;
392 
393    IF (p_serial_id IS NOT NULL AND p_item_id IS NOT NULL AND p_org_id IS NOT NULL) THEN
394       SELECT Instance_Id INTO x_serial_id
395       FROM CSI_ITEM_INSTANCES
396       WHERE Instance_Id  = p_serial_id AND Inventory_Item_Id = p_item_id AND Inv_Master_Organization_Id = p_org_id
397        AND ACTIVE_START_DATE <= sysdate AND (ACTIVE_END_DATE >= sysdate OR ACTIVE_END_DATE IS NULL);
398    END IF;
399 
400    IF (p_serial_number IS NOT NULL AND p_item_id IS NOT NULL AND p_org_id IS NOT NULL) THEN
401       SELECT Instance_Id INTO x_serial_id
402       FROM CSI_ITEM_INSTANCES
403       WHERE Serial_Number = p_serial_number AND Inventory_Item_Id = p_item_id AND Inv_Master_Organization_Id = p_org_id
404        AND ACTIVE_START_DATE <= sysdate AND (ACTIVE_END_DATE >= sysdate OR ACTIVE_END_DATE IS NULL);
405    END IF;
406 
407    x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
408 
409    IF (l_log_procedure >= l_log_current_level) THEN
410       fnd_log.string(l_log_procedure,
411                      L_DEBUG_KEY ||'.end',
412                      'At the end of PL SQL procedure. Return Status = ' ||
413                      x_return_status || ', Serial Id = ' || x_serial_id);
414    END IF;
415 
416 EXCEPTION
417     WHEN NO_DATA_FOUND THEN
418          x_return_status:= Fnd_Api.G_RET_STS_ERROR;
419          x_error_msg_code:= 'AHL_VWP_SERIAL_NOT_EXISTS';
420     WHEN TOO_MANY_ROWS THEN
421          x_return_status:= Fnd_Api.G_RET_STS_ERROR;
422          x_error_msg_code:= 'AHL_VWP_SERIAL_NOT_EXISTS';
423     WHEN OTHERS THEN
424          x_return_status:= Fnd_Api.G_RET_STS_UNEXP_ERROR;
425 RAISE;
426 END Check_Serial_Name_Or_Id;
427 
428 --------------------------------------------------------------------
429 -- PROCEDURE
430 --    Check_Dept_Desc_Or_Id
431 --
432 -- PURPOSE
433 --    Converts Deparment Name to Department Id.
434 --------------------------------------------------------------------
435 PROCEDURE Check_Dept_Desc_Or_Id
436     (p_organization_id  IN NUMBER,
437      p_department_id    IN NUMBER,
438      p_dept_name        IN VARCHAR2,
439 
440      x_department_id    OUT NOCOPY NUMBER,
441      x_return_status    OUT NOCOPY VARCHAR2,
442      x_error_msg_code   OUT NOCOPY VARCHAR2
443      )
444 IS
445    -- Define local variables
446    L_API_NAME    CONSTANT VARCHAR2(30) := 'Check_Dept_Desc_Or_Id';
447    L_DEBUG_KEY   CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
448 BEGIN
449    IF (l_log_procedure >= l_log_current_level) THEN
450       fnd_log.string(l_log_procedure,
451                      L_DEBUG_KEY ||'.begin',
452                      'At the start of PL SQL procedure. Org Id = ' || p_organization_id ||
453                      ', Dept Id = ' || p_department_id || ', Dept Name = ' || p_dept_name);
454    END IF;
455    IF (p_department_id IS NOT NULL) THEN
456       SELECT department_id INTO x_department_id
457       FROM BOM_DEPARTMENTS
458       WHERE organization_id = p_organization_id
459        AND department_id   = p_department_id;
460    END IF;
461 
462    IF (p_dept_name IS NOT NULL) THEN
463       SELECT department_id INTO x_department_id
464       FROM BOM_DEPARTMENTS
465       WHERE organization_id =  p_organization_id
466        AND description = p_dept_name;
467    END IF;
468 
469   x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
470 
471   IF (l_log_procedure >= l_log_current_level) THEN
472      fnd_log.string(l_log_procedure,
473                     L_DEBUG_KEY ||'.end',
474                     'At the end of PL SQL procedure. Return Status = ' || x_return_status ||
475                     '. Department Id = ' || x_department_id);
476   END IF;
477 
478   EXCEPTION
479        WHEN NO_DATA_FOUND THEN
480             x_return_status:= Fnd_Api.G_RET_STS_ERROR;
481             x_error_msg_code:= 'AHL_VWP_DEPT_NOT_EXISTS';
482        WHEN TOO_MANY_ROWS THEN
483             x_return_status:= Fnd_Api.G_RET_STS_ERROR;
484             x_error_msg_code:= 'AHL_VWP_DEPT_NOT_EXISTS';
485        WHEN OTHERS THEN
486             x_return_status:= Fnd_Api.G_RET_STS_UNEXP_ERROR;
487   RAISE;
488 END Check_Dept_Desc_Or_Id;
489 
490 --------------------------------------------------------------------
491 -- PROCEDURE
492 --    Check_Org_Name_Or_Id
493 --
494 -- PURPOSE
495 --    Converts Organization Name to Organization Id
496 --------------------------------------------------------------------
497 PROCEDURE Check_Org_Name_Or_Id
498     (p_organization_id IN NUMBER,
499      p_org_name        IN VARCHAR2,
500 
501      x_organization_id OUT NOCOPY NUMBER,
502      x_return_status   OUT NOCOPY VARCHAR2,
503      x_error_msg_code  OUT NOCOPY VARCHAR2
504      )
505 IS
506    -- Define local variables
507    L_API_NAME    CONSTANT VARCHAR2(30) := 'Check_Org_Name_Or_Id';
508    L_DEBUG_KEY   CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
509 
510 BEGIN
511    IF (l_log_procedure >= l_log_current_level) THEN
512        fnd_log.string(l_log_procedure,
513                       L_DEBUG_KEY ||'.begin',
514                       'At the start of PL SQL procedure. Organization Id = ' || p_organization_id ||
515                       'Organization Name = ' || p_org_name);
516     END IF;
517     IF (p_organization_id IS NOT NULL) THEN
518     -- AnRaj:Changes made for fixing bug#4919353, issue# 6
519        SELECT hou.organization_id
520        INTO x_organization_id
521        FROM hr_organization_units hou, mtl_parameters MP
522        WHERE hou.organization_id = mp.organization_id
523         AND hou.organization_id = p_organization_id
524         AND hou.organization_id IN
525         (SELECT organization_id
526          FROM INV_ORGANIZATION_INFO_V
527          WHERE hou.organization_id = mp.organization_id
528           AND NVL(operating_unit, mo_global.get_current_org_id()) = mo_global.get_current_org_id())
529           AND MP.EAM_enabled_flag='Y';
530     ELSE
531       -- AnRaj:Changes made for fixing bug#4919353, issue# 5
532        SELECT hou.organization_id
533        INTO x_organization_id
534        FROM hr_organization_units hou, mtl_parameters MP
535        WHERE hou.organization_id = mp.organization_id
536         AND hou.Name = p_org_name
537         AND hou.organization_id IN
538         (SELECT organization_id
539          FROM INV_ORGANIZATION_INFO_V
540          WHERE hou.organization_id = mp.organization_id
541           AND NVL(operating_unit, mo_global.get_current_org_id()) =  mo_global.get_current_org_id())
542           AND MP.EAM_enabled_flag='Y';
543     END IF;
544     x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
545     IF (l_log_procedure >= l_log_current_level) THEN
546        fnd_log.string(l_log_procedure,
547                       L_DEBUG_KEY ||'.end',
548                       'At the end of PL SQL procedure. Return Status = ' || x_return_status ||
549                       'Organization Id = ' || x_organization_id);
550     END IF;
551 
552 EXCEPTION
553        WHEN NO_DATA_FOUND THEN
554             x_return_status:= Fnd_Api.G_RET_STS_ERROR;
555             x_error_msg_code:= 'AHL_VWP_ORG_NOT_EXISTS';
556        WHEN TOO_MANY_ROWS THEN
557             x_return_status:= Fnd_Api.G_RET_STS_ERROR;
558             x_error_msg_code:= 'AHL_VWP_ORG_NOT_EXISTS';
559        WHEN OTHERS THEN
560             x_return_status:= Fnd_Api.G_RET_STS_UNEXP_ERROR;
561             RAISE;
562 END Check_Org_Name_Or_Id;
563 
564 --------------------------------------------------------------------
565 -- PROCEDURE
566 --    Check_SR_Request_Number_Or_Id
567 --
568 -- PURPOSE
569 --    Converts Service Request Number to Service Request Id
570 --------------------------------------------------------------------
571 PROCEDURE Check_SR_Request_Number_Or_Id
572     (p_service_id       IN NUMBER,
573      p_service_number   IN VARCHAR2,
574 
575      x_service_id       OUT NOCOPY NUMBER,
576      x_return_status    OUT NOCOPY VARCHAR2,
577      x_error_msg_code   OUT NOCOPY VARCHAR2
578      )
579 IS
580    L_API_NAME  CONSTANT VARCHAR2(30) := 'Check_SR_Request_Number_Or_Id';
581    L_DEBUG_KEY CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
582 
583 BEGIN
584 
585    IF (l_log_procedure >= l_log_current_level) THEN
586       fnd_log.string(l_log_procedure,
587                      L_DEBUG_KEY ||'.begin',
588                      'At the start of PL SQL procedure. SR Number= ' ||
589                      p_service_number || ', SR Id = ' || p_service_id);
590    END IF;
591 
592    -- yazhou 19Oct2005 Starts
593    -- Bug fix #4415024
594    IF p_service_id IS NOT NULL THEN
595       SELECT a.Incident_Id INTO x_service_id
596       FROM CS_INCIDENTS_ALL_B a, CS_INCIDENT_TYPES_VL CIT
597       WHERE a.incident_type_id = cit.incident_type_id
598        AND cit.INCIDENT_SUBTYPE = 'INC'
599        AND cit.CMRO_FLAG = 'Y'
600        AND Incident_Id  = p_service_id;
601    ELSIF p_service_number IS NOT NULL THEN
602       SELECT a.Incident_Id INTO x_service_id
603       FROM CS_INCIDENTS_ALL_B a, CS_INCIDENT_TYPES_VL CIT
604       WHERE a.incident_type_id = cit.incident_type_id
605        AND cit.INCIDENT_SUBTYPE = 'INC'
606        AND cit.CMRO_FLAG = 'Y'
607        AND Incident_Number  = p_service_number;
608    -- yazhou 19Oct2005 ends
609    ELSE
610       x_return_status:= Fnd_Api.G_RET_STS_ERROR;
611       x_error_msg_code:= 'AHL_VWP_SERVICE_REQ_NOT_EXISTS';
612    END IF;
613 
614    x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
615 
616    IF (l_log_procedure >= l_log_current_level) THEN
617       fnd_log.string(l_log_procedure,
618                      L_DEBUG_KEY ||'.end',
619                      'At the end of PL SQL procedure. Return Status = ' || x_return_status ||
620                      'Service Id = ' || x_service_id);
621    END IF;
622 
623 EXCEPTION
624     WHEN NO_DATA_FOUND THEN
625          x_return_status:= Fnd_Api.G_RET_STS_ERROR;
626          x_error_msg_code:= 'AHL_VWP_SERVICE_REQ_NOT_EXISTS';
627     WHEN TOO_MANY_ROWS THEN
628          x_return_status:= Fnd_Api.G_RET_STS_ERROR;
629          x_error_msg_code:= 'AHL_VWP_SERVICE_REQ_NOT_EXISTS';
630     WHEN OTHERS THEN
631          x_return_status:= Fnd_Api.G_RET_STS_UNEXP_ERROR;
632 RAISE;
633 END Check_SR_Request_Number_Or_Id;
634 
635 --------------------------------------------------------------------
636 -- PROCEDURE
637 --    Check_Visit_is_Simulated
638 --
639 -- PURPOSE
640 --    Check if the Visit is Simulated or not
641 --------------------------------------------------------------------
642 PROCEDURE Check_Visit_is_Simulated
643     (p_Visit_id             IN NUMBER,
644 
645      x_bln_flag             OUT NOCOPY VARCHAR2,
646      x_return_status        OUT NOCOPY VARCHAR2,
647      x_error_msg_code       OUT NOCOPY VARCHAR2
648      )
649 IS
650    -- Define local variables
651    L_API_NAME  CONSTANT VARCHAR2(30) := 'Check_Visit_is_Simulated';
652    L_DEBUG_KEY CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
653 
654    l_simulation_plan    NUMBER;
655    l_simulation_plan_id NUMBER;
656    l_dummy VARCHAR2(1);
657 
658    -- Define local cursors
659    CURSOR c_visit(x_id IN NUMBER)IS
660     SELECT SIMULATION_PLAN_ID FROM
661     AHL_VISITS_VL WHERE VISIT_ID = x_id;
662    /*
663    CURSOR c_sim_visit(x_id IN NUMBER) IS
664     SELECT 'x'
665     FROM   ahl_simulation_plans_vl ASP
666     WHERE primary_plan_flag = 'Y'
667      AND EXISTS ( SELECT 1
668                   FROM ahl_visits_b
669                   WHERE visit_id = x_id
670                    AND NVL(simulation_plan_id,-99) = ASP.simulation_plan_id);
671    */
672 BEGIN
673    IF (l_log_procedure >= l_log_current_level) THEN
674       fnd_log.string(l_log_procedure,
675                      L_DEBUG_KEY ||'.begin',
676                      'At the start of PL SQL procedure. Visit Id = ' || p_Visit_id);
677    END IF;
678    IF (p_visit_id IS NOT NULL) THEN
679        OPEN c_visit(p_visit_id);
680        FETCH c_visit INTO l_simulation_plan;
681        CLOSE c_visit;
682 
683        IF (l_simulation_plan IS NOT NULL) THEN
684 
685           IF (l_log_statement >= l_log_current_level)THEN
686              fnd_log.string(l_log_statement,
687                             L_DEBUG_KEY,
688                             'Simulation Id Check' || l_simulation_plan);
689           END IF;
690           SELECT SIMULATION_PLAN_ID INTO l_simulation_plan_id
691           FROM AHL_SIMULATION_PLANS_VL WHERE primary_plan_flag = 'Y';
692 
693           IF l_simulation_plan_id = l_simulation_plan THEN
694              x_bln_flag := 'Y';
695           ELSE
696              x_bln_flag := 'N';
697           END IF;
698        END IF;
699    END IF;
700 
701    /*
702    OPEN c_sim_visit(p_visit_id);
703    FETCH c_sim_visit INTO l_dummy;
704    IF c_sim_visit%FOUND THEN
705       x_bln_flag := 'Y';
706    ELSE
707       x_bln_flag := 'N';
708    END IF;
709    CLOSE c_sim_visit;
710    */
711    x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
712 
713    IF (l_log_procedure >= l_log_current_level) THEN
714       fnd_log.string(l_log_procedure,
715                      L_DEBUG_KEY ||'.end',
716                      'At the end of PL SQL procedure. Return Status = ' || x_return_status ||
717                      'x_bln_flag = ' || x_bln_flag);
718    END IF;
719 
720 EXCEPTION
721     WHEN NO_DATA_FOUND THEN
722          x_return_status := Fnd_Api.G_RET_STS_ERROR;
723          x_error_msg_code:= 'AHL_LTP_SIMULATION_PLAN_NOT_EXISTS';
724     WHEN TOO_MANY_ROWS THEN
725          x_return_status := Fnd_Api.G_RET_STS_ERROR;
726          x_error_msg_code:= 'AHL_LTP_SIMULATION_PLAN_NOT_EXISTS';
727     WHEN OTHERS THEN
728          x_return_status:= Fnd_Api.G_RET_STS_UNEXP_ERROR;
729 RAISE;
730 END Check_Visit_is_Simulated;
731 
732 --------------------------------------------------------------------
733 -- PROCEDURE
734 --    Check_Visit_Task_Number_Or_Id
735 --
736 -- PURPOSE
737 --    Converts Visit Task Number to Visit Task Id
738 --------------------------------------------------------------------
739 PROCEDURE Check_Visit_Task_Number_Or_Id
740     (p_visit_task_id     IN NUMBER,
741      p_visit_task_number IN NUMBER,
742      p_visit_id          IN NUMBER,
743 
744      x_visit_task_id     OUT NOCOPY NUMBER,
745      x_return_status     OUT NOCOPY VARCHAR2,
746      x_error_msg_code    OUT NOCOPY VARCHAR2
747      )
748 IS
749    -- Define local variables
750    L_API_NAME    CONSTANT VARCHAR2(30) := 'Check_Visit_Task_Number_Or_Id';
751    L_DEBUG_KEY   CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
752 
753   --mpothuku added status_code <> 'DELETED' clause to fix #206 on 03/30/05
754 BEGIN
755     IF (l_log_procedure >= l_log_current_level) THEN
756        fnd_log.string(l_log_procedure,
757                       L_DEBUG_KEY ||'.begin',
758                       'At the start of PL SQL procedure. Visit Task Id = ' || p_visit_task_id ||
759                       ', Visit Task Number = ' || p_visit_task_number || ', Visit Id = ' || p_visit_id);
760     END IF;
761     IF (p_visit_task_id IS NOT NULL) THEN
762        SELECT Visit_Task_Id INTO x_visit_task_id
763        FROM AHL_VISIT_TASKS_B
764        WHERE Visit_Task_Id  = p_visit_task_id AND Visit_Id = p_visit_id AND status_code <> 'DELETED';
765        x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
766     ELSIF (p_visit_task_number IS NOT NULL) THEN
767        SELECT Visit_Task_Id INTO x_visit_task_id
768        FROM AHL_VISIT_TASKS_B
769        WHERE Visit_Task_Number = p_visit_task_number AND Visit_Id = p_visit_id AND status_code <> 'DELETED';
770        x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
771     ELSE
772        x_return_status:= Fnd_Api.G_RET_STS_ERROR;
773        Fnd_Message.set_name ('AHL', 'AHL_VWP_VISIT_TASKS_NOT_EXISTS');
774        Fnd_Msg_Pub.ADD;
775     END IF;
776 
777     x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
778     IF (l_log_procedure >= l_log_current_level) THEN
779        fnd_log.string(l_log_procedure,
780                       L_DEBUG_KEY ||'.end',
781                       'At the end of PL SQL procedure. Return Status = ' || x_return_status ||
782                       'Visit Task Id = ' || x_visit_task_id);
783     END IF;
784 EXCEPTION
785     WHEN NO_DATA_FOUND THEN
786          x_return_status:= Fnd_Api.G_RET_STS_ERROR;
787          x_error_msg_code:= 'AHL_VWP_VISIT_TASKS_NOT_EXISTS';
788     WHEN TOO_MANY_ROWS THEN
789          x_return_status:= Fnd_Api.G_RET_STS_ERROR;
790          x_error_msg_code:= 'AHL_VWP_VISIT_TASKS_NOT_EXISTS';
791     WHEN OTHERS THEN
792          x_return_status:= Fnd_Api.G_RET_STS_UNEXP_ERROR;
793 RAISE;
794 END Check_Visit_Task_Number_OR_ID;
795 
796 --------------------------------------------------------------------
797 -- PROCEDURE
798 --    Check_Lookup_Name_Or_Id
799 --
800 -- PURPOSE
801 --    To derive the any of the lookup codes to its lookup values
802 --------------------------------------------------------------------
803 PROCEDURE Check_Lookup_Name_Or_Id
804  ( p_lookup_type   IN         FND_LOOKUPS.lookup_type%TYPE,
805    p_lookup_code   IN         FND_LOOKUPS.lookup_code%TYPE,
806    p_meaning       IN         FND_LOOKUPS.meaning%TYPE,
807    p_check_id_flag IN         VARCHAR2,
808 
809    x_lookup_code   OUT NOCOPY VARCHAR2,
810    x_return_status OUT NOCOPY VARCHAR2)
811 IS
812    -- Define local variables
813    L_API_NAME    CONSTANT VARCHAR2(30) := 'Check_Lookup_Name_Or_Id';
814    L_DEBUG_KEY   CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
815 BEGIN
816   IF (l_log_procedure >= l_log_current_level) THEN
817      fnd_log.string(l_log_procedure,
818                     L_DEBUG_KEY ||'.begin',
819                     'At the start of PL SQL procedure. p_lookup_type = ' || p_lookup_type ||
820                     ', p_lookup_code = ' || p_lookup_code ||
821                     ', p_meaning = ' || p_meaning ||
822                     ', p_check_id_flag = ' || p_check_id_flag);
823   END IF;
824   IF (p_lookup_code IS NOT NULL) THEN
825      IF (p_check_id_flag = 'Y') THEN
826         SELECT Lookup_Code INTO x_lookup_code
827         FROM FND_LOOKUP_VALUES_VL
828         WHERE Lookup_Type = p_lookup_type
829          AND Lookup_Code = p_lookup_code
830             AND enabled_flag = 'Y'   --sowsubra FP:Bug#5758829
831          AND SYSDATE BETWEEN nvl(start_date_active,sysdate) --Sowmya Bug#5715342
832          AND NVL(end_date_active,SYSDATE);
833      ELSE
834         x_lookup_code := p_lookup_code;
835      END IF;
836   ELSE
837      SELECT Lookup_Code INTO x_lookup_code
838      FROM FND_LOOKUP_VALUES_VL
839      WHERE Lookup_Type = p_lookup_type
840       AND Meaning = p_meaning
841             AND enabled_flag = 'Y'   --sowsubra FP:Bug#5758829
842             AND SYSDATE BETWEEN nvl(start_date_active,sysdate) --sowsubra FP:Bug#5758829
843       AND NVL(end_date_active,SYSDATE);
844   END IF;
845 
846    x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
847 
848    IF (l_log_procedure >= l_log_current_level) THEN
849       fnd_log.string(l_log_procedure,
850                      L_DEBUG_KEY ||'.end',
851                      'At the end of PL SQL procedure. Return Status = ' || x_return_status ||
852                      '. x_lookup_code = ' || x_lookup_code);
853    END IF;
854 
855   EXCEPTION
856    WHEN NO_DATA_FOUND THEN
857         x_return_status := Fnd_Api.G_RET_STS_ERROR;
858    WHEN TOO_MANY_ROWS THEN
859         x_return_status := Fnd_Api.G_RET_STS_ERROR;
860    WHEN OTHERS THEN
861         x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
862   RAISE;
863 END Check_Lookup_Name_Or_Id;
864 
865 
866 --------------------------------------------------------------------
867 -- PROCEDURE
868 --    Check_Proj_Responsibility
869 --
870 -- PURPOSE
871 --    While integrating with projects,
872 --    VWP need to check for valid project resposibilities
873 --------------------------------------------------------------------
874 PROCEDURE Check_Proj_Responsibility
875  ( x_check_project    OUT NOCOPY VARCHAR2,
876    x_return_status    OUT NOCOPY VARCHAR2)
877 IS
878   -- Define local variables
879    L_API_NAME  CONSTANT VARCHAR2(30) := 'Check_Proj_Responsibility';
880    L_DEBUG_KEY CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
881    l_msg_count          NUMBER;
882    l_responsibility_id  NUMBER;
883    l_return_status      VARCHAR2(1);
884    l_msg_data           VARCHAR2(2000);
885    G_EXC_ERROR          EXCEPTION;
886 
887    -- Define local cursors
888    -- To find the responsibiltiy_id for Project Billing Superuser
889    -- Not using project superuser resposibility as the menu associated is changed in 11.5.9
890    CURSOR c_fnd_response IS
891     SELECT RESPONSIBILITY_ID
892     FROM FND_RESPONSIBILITY_VL
893     WHERE RESPONSIBILITY_KEY LIKE 'PROJECT_BILLING_SUPER_USER';
894 
895    -- To find the responsibiltiy_id for Project Superuser
896  /*
897    CURSOR c_fnd_user_resp(x_resp_id IN NUMBER) IS
898     SELECT RESPONSIBILITY_ID
899     FROM FND_USER_RESP_GROUPS
900     WHERE USER_ID = Fnd_Global.USER_ID AND RESPONSIBILITY_ID = x_resp_id;
901 */
902 BEGIN
903 
904    IF (l_log_procedure >= l_log_current_level) THEN
905       fnd_log.string(l_log_procedure,
906                      L_DEBUG_KEY ||'.begin',
907                      'At the start of PL SQL procedure.');
908    END IF;
909    x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
910    -- Always return x_check_project = 'Y' as we no longer need to check for Project Billing
911    -- Superuser Resp. Part of ADS bug fix 4357001.
912    x_check_project := 'Y';
913 
914 /* -- Commented out hardcoding of Responsibility. AMG's function security functions will be
915    -- included into ahlmenu instead. Part of ADS bug fix 4357001.
916    OPEN c_fnd_response;
917    FETCH c_fnd_response INTO l_responsibility_id;
918 
919    IF (l_log_procedure >= l_log_current_level) THEN
920       fnd_log.string(l_log_procedure,L_DEBUG_KEY, 'Responsiblity_Id from c_fnd_response = ' || l_responsibility_id);
921    END IF;
922 
923    IF c_fnd_response%NOTFOUND THEN
924       x_return_status := Fnd_Api.g_ret_sts_error;
925       IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_error) THEN
926          Fnd_Message.set_name ('AHL', 'AHL_VWP_PROJ_NO_SUPERUSER');
927          Fnd_Msg_Pub.ADD;
928          CLOSE c_fnd_response;
929          RAISE G_EXC_ERROR;
930       END IF;
931    END IF;
932    CLOSE c_fnd_response;
933 
934    OPEN c_fnd_user_resp(l_responsibility_id);
935    FETCH c_fnd_user_resp INTO l_responsibility_id;
936 
937    IF (l_log_procedure >= l_log_current_level) THEN
938       fnd_log.string(l_log_procedure,L_DEBUG_KEY, 'Responsiblity_Id from c_fnd_user_resp = ' || l_responsibility_id);
939    END IF;
940 
941    IF c_fnd_user_resp%NOTFOUND THEN
942       x_return_status := Fnd_Api.g_ret_sts_error;
943       IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_error) THEN
944          Fnd_Message.set_name ('AHL', 'AHL_VWP_PROJ_NO_USER_GROUPS');
945          Fnd_Msg_Pub.ADD;
946       END IF;
947    END IF;
948    CLOSE c_fnd_user_resp;
949 
950    IF x_return_status =Fnd_Api.G_RET_STS_SUCCESS THEN
951 
952       IF l_responsibility_id = l_responsibility_id THEN
953          x_check_project := 'Y';
954 
955          -- Project Billing Super user
956          PA_INTERFACE_UTILS_PUB.Set_Global_Info
957          ( p_api_version_number => 1.0,
958            p_responsibility_id  => l_responsibility_id,
959            p_user_id            => Fnd_Global.USER_ID,
960            p_msg_count          => l_msg_count,
961            p_msg_data           => l_msg_data,
962 */
963 
964 /* Fix for Bug 4086726 on Dec 23, 2004 by JR.
965  * Commenting out the calling mode param.
966  * Need to add if required, along with build dependency and a one-off
967  * fix from PA.
968              p_return_status => l_return_status ,
969              p_calling_mode  => 'PUBLISH');
970              p_return_status => l_return_status);
971        IF l_return_status <> Fnd_Api.G_RET_STS_SUCCESS THEN
972           RAISE G_EXC_ERROR;
973        END IF;
974 
975     ELSE
976        x_check_project := 'N';
977        x_return_status := Fnd_Api.g_ret_sts_error;
978 
979        IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_error) THEN
980           Fnd_Message.set_name ('AHL', 'AHL_VWP_PROJ_NO_RESPONSIBILITY');
981           Fnd_Msg_Pub.ADD;
982        END IF;
983     END IF;
984   END IF;
985 */
986 
987    -- jaramana July 25, 2005
988    /* From Majid Ansari's email dated June 8, 2005:
989     * Before calling any AMG api, its mandatory to call PA_INTERFACE_UTILS_PUB.Set_Global_Info.
990     * This has been mentioned in the AMG doc. You cannot get rid of this call.
991     * None of the APIs will be usable.
992     */
993    -- So, reintroduced the call to PA_INTERFACE_UTILS_PUB.Set_Global_Info.
994    -- However, passing the current responsibilty id instead of the hardcoded
995    -- Project Billing Superuser Responsibility as was done before the ADS Bug 4357001 Fix.
996    PA_INTERFACE_UTILS_PUB.Set_Global_Info( p_api_version_number => 1.0,
997                                            p_responsibility_id  => Fnd_Global.RESP_ID,
998                                            p_resp_appl_id       => Fnd_Global.RESP_APPL_ID,
999                                            p_user_id            => Fnd_Global.USER_ID,
1000                                            p_operating_unit_id  => mo_global.get_current_org_id, -- Yazhou added for MOAC changes on 05Oct2005
1001                                            p_msg_count          => l_msg_count,
1002                                            p_msg_data           => l_msg_data,
1003                                            p_return_status      => x_return_status);
1004    IF (fnd_log.level_event >= l_log_current_level) THEN
1005      fnd_log.string(fnd_log.level_event,
1006                     L_DEBUG_KEY,
1007                     'After calling PA_INTERFACE_UTILS_PUB.Set_Global_Info. Return Status = ' || x_return_status);
1008    END IF;
1009    IF (x_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
1010       IF (l_log_statement >= l_log_current_level) THEN
1011          fnd_log.string(l_log_statement,
1012                         L_DEBUG_KEY,
1013                         'Errors from PA_INTERFACE_UTILS_PUB.Set_Global_Info. Message count: ' ||
1014                         l_msg_count || ', message data: ' || l_msg_data);
1015       END IF;
1016       IF x_return_status = FND_API.G_RET_STS_ERROR THEN
1017          RAISE FND_API.G_EXC_ERROR;
1018       ELSE
1019          RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1020       END IF;
1021    END IF;
1022    -- End Changes made by jaramana on July 25, 2005
1023 
1024   IF (l_log_procedure >= l_log_current_level) THEN
1025      fnd_log.string(l_log_procedure,
1026                     L_DEBUG_KEY ||'.end',
1027                     'At the end of PL SQL procedure. Return Status = ' ||
1028                     x_return_status || '. x_check_project = ' || x_check_project);
1029   END IF;
1030 
1031   EXCEPTION
1032    WHEN NO_DATA_FOUND THEN
1033         x_return_status := Fnd_Api.G_RET_STS_ERROR;
1034    WHEN TOO_MANY_ROWS THEN
1035         x_return_status := Fnd_Api.G_RET_STS_ERROR;
1036    WHEN OTHERS THEN
1037         x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
1038   RAISE;
1039 END Check_Proj_Responsibility;
1040 
1041 --------------------------------------------------------------------
1042 -- PROCEDURE
1043 --    Get_Serial_Item_by_Unit
1044 --
1045 -- PURPOSE
1046 --    To retrieve Inventory Item Id, Item Org Id and Instance Id from Unit Name
1047 --------------------------------------------------------------------
1048 PROCEDURE Get_Serial_Item_by_Unit
1049  ( p_unit_name      IN         VARCHAR2,
1050    x_instance_id    OUT NOCOPY NUMBER,
1051    x_item_id        OUT NOCOPY NUMBER,
1052    x_item_org_id    OUT NOCOPY NUMBER,
1053    x_return_status  OUT NOCOPY VARCHAR2,
1054    x_error_msg_code OUT NOCOPY VARCHAR2)
1055 IS
1056 -- Define local variables
1057    L_API_NAME    CONSTANT VARCHAR2(30)  := 'Get_Serial_Item_by_Unit';
1058    L_DEBUG_KEY   CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
1059 
1060 -- Define local cursors
1061   CURSOR c_serial (p_unit_name IN VARCHAR2) IS
1062    SELECT csi_item_instance_id
1063    FROM ahl_unit_config_headers
1064    WHERE name = p_unit_name AND unit_config_status_code = 'COMPLETE'
1065     AND (active_end_date is null or active_end_date > sysdate);
1066 
1067 BEGIN
1068    IF (l_log_procedure >= l_log_current_level) THEN
1069        fnd_log.string(l_log_procedure,
1070                       L_DEBUG_KEY ||'.begin',
1071                       'At the start of PL SQL procedure. Unit Name = ' || p_unit_name);
1072    END IF;
1073    IF (p_unit_name IS NOT NULL) THEN
1074       OPEN c_serial(p_unit_name);
1075       FETCH c_serial INTO x_instance_id;
1076       CLOSE c_serial;
1077 
1078       IF (l_log_statement >= l_log_current_level) THEN
1079          fnd_log.string(l_log_statement,
1080                         L_DEBUG_KEY,
1081                         'Instance Id = ' || x_instance_id);
1082       END IF;
1083 
1084       IF x_instance_id IS NOT NULL THEN
1085          SELECT Inventory_Item_Id, Inv_Master_Organization_Id
1086          INTO x_Item_Id, x_Item_Org_Id
1087          FROM CSI_ITEM_INSTANCES
1088          WHERE Instance_Id = x_instance_id;
1089       ELSE
1090          Fnd_Message.SET_NAME('AHL','AHL_VWP_SERIAL_NOT_EXISTS');
1091          Fnd_Msg_Pub.ADD;
1092          RAISE Fnd_Api.G_EXC_ERROR;
1093       END IF;
1094    END IF;
1095 
1096    x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
1097    IF (l_log_procedure >= l_log_current_level) THEN
1098       fnd_log.string(l_log_procedure,
1099                      L_DEBUG_KEY ||'.end',
1100                      'At the end of PL SQL procedure. Return Status = ' || x_return_status ||
1101                      '. Item Id = ' || x_item_id || ' Item Org Id' || x_item_org_id);
1102    END IF;
1103    EXCEPTION
1104       WHEN NO_DATA_FOUND THEN
1105            x_return_status := Fnd_Api.G_RET_STS_ERROR;
1106       WHEN TOO_MANY_ROWS THEN
1107            x_return_status := Fnd_Api.G_RET_STS_ERROR;
1108       WHEN OTHERS THEN
1109            x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
1110    RAISE;
1111 END Get_Serial_Item_by_Unit;
1112 
1113 --------------------------------------------------------------------
1114 -- PROCEDURE
1115 --    Insert_Tasks
1116 --
1117 -- PURPOSE
1118 --    To call when inserting planned/unplanned tasks
1119 --------------------------------------------------------------------
1120 PROCEDURE Insert_Tasks (
1121    p_visit_id      IN    NUMBER,
1122    p_unit_id       IN    NUMBER,
1123    p_serial_id     IN    NUMBER,
1124    p_service_id    IN    NUMBER,
1125    p_dept_id       IN    NUMBER,
1126    p_item_id       IN    NUMBER,
1127    p_item_org_id   IN    NUMBER,
1128    p_mr_id         IN    NUMBER,
1129    p_mr_route_id   IN    NUMBER,
1130    p_parent_id     IN    NUMBER,
1131    p_flag          IN    VARCHAR2,
1132    p_stage_id      IN    NUMBER := NULL,
1133    p_quantity      IN    NUMBER := NULL, -- Added by rnahata for Issue 105
1134    x_task_id       OUT   NOCOPY NUMBER,
1135    x_return_status OUT   NOCOPY VARCHAR2,
1136    x_msg_count     OUT   NOCOPY NUMBER,
1137    x_msg_data      OUT   NOCOPY VARCHAR2
1138 )
1139 IS
1140    -- Define local variables
1141    L_API_NAME   CONSTANT VARCHAR2(30) := 'Insert_Tasks';
1142    L_DEBUG_KEY  CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
1143 
1144    -- Added by sjayacha for Servie Request Integration
1145 
1146    CURSOR c_mr_title(c_mr_id IN NUMBER) IS
1147     SELECT title, description /*Bug 5758813- Fetch the description of the MR*/
1148     FROM ahl_mr_headers_vl
1149     WHERE mr_header_id = c_mr_id;
1150 
1151    CURSOR c_unit_eff_title(c_unit_eff_id IN NUMBER) IS
1152     SELECT substr(title,1,80), description /*Bug 5758813 - Fetch the description.*/
1153     FROM ahl_unit_effectivities_v
1154     WHERE unit_effectivity_id = c_unit_eff_id;
1155 
1156    /*Bug 5758813 - rnahata - Route title and route remarks should be passed
1157    to visit as visit task name and visit task description*/
1158    CURSOR c_route_title(c_mr_route_id IN NUMBER) IS
1159     SELECT substr(ar.title,1,80), ar.remarks
1160     FROM ahl_routes_vl ar, ahl_mr_routes mrr
1161     WHERE mrr.mr_route_id = c_mr_route_id
1162      AND mrr.route_id = ar.route_id;
1163 
1164    -- Local variables defined for the procedure
1165    l_msg_data      VARCHAR2(2000);
1166    l_name          VARCHAR2(80);
1167    l_rowid         VARCHAR2(30);
1168    l_type          VARCHAR2(30);
1169    l_return_status VARCHAR2(1);
1170    l_template_flag VARCHAR2(1);
1171 
1172    l_msg_count     NUMBER;
1173    l_task_number   NUMBER;
1174    l_task_id       NUMBER;
1175    l_item_id       NUMBER;
1176    l_item_org_id   NUMBER;
1177    l_serial_id     NUMBER;
1178    l_mr_id         NUMBER;
1179    l_mr_route_id   NUMBER;
1180    l_description   ahl_routes_vl.remarks%TYPE; --Bug 5758813
1181 
1182 BEGIN
1183    IF (l_log_procedure >= l_log_current_level) THEN
1184       fnd_log.string(l_log_procedure,
1185                      L_DEBUG_KEY ||'.begin',
1186                      'At the start of PL SQL procedure. Visit Id = ' || p_visit_id ||
1187                      ', parent id = ' || p_parent_id || ', p_serial_id = ' || p_serial_id ||
1188                      ', p_item_id = ' || p_item_id || ', p_mr_id = ' || p_mr_id ||
1189                      ', p_mr_route_id = ' || p_mr_route_id);
1190    END IF;
1191    IF p_visit_id IS NOT NULL THEN
1192       IF p_unit_id IS NOT NULL THEN
1193          l_type := 'PLANNED';
1194       ELSE
1195          l_type := 'UNPLANNED';
1196          IF p_serial_id IS NULL THEN
1197             x_return_status := Fnd_Api.g_ret_sts_error;
1198             IF (l_log_statement >= l_log_current_level) THEN
1199                fnd_log.string(l_log_statement,
1200                               L_DEBUG_KEY,
1201                               'Error in Insert_Tasks. Serial Id missing.');
1202             END IF;
1203             IF Fnd_Msg_Pub.check_msg_level (Fnd_Msg_Pub.g_msg_lvl_error) THEN
1204                Fnd_Message.SET_NAME('AHL','AHL_VWP_SERIAL_MISSING');
1205                Fnd_Msg_Pub.ADD;
1206             END IF;
1207          END IF;
1208       END IF; -- End of p_unit_id check
1209 
1210       IF p_flag = 'Y' THEN
1211          l_type := 'SUMMARY';
1212          IF p_mr_id IS NOT NULL THEN
1213             -- MR Summary Task
1214             /*Bug 5758813 - rnahata*/
1215             OPEN c_mr_title(p_mr_id);
1216             FETCH c_mr_title INTO l_name, l_description;
1217             CLOSE c_mr_title;
1218             IF (l_log_statement >= l_log_current_level) THEN
1219                fnd_log.string(l_log_statement,
1220                               L_DEBUG_KEY,
1221                               'Summary Task. MR Title = ' || l_name || ', MR Description = ' || l_description);
1222             END IF;
1223          ELSIF p_unit_id IS NOT NULL THEN
1224             -- Added by sjayacha for Servie Request Integration
1225             /*Bug 5758813 - rnahata*/
1226             OPEN c_unit_eff_title(p_unit_id);
1227             FETCH c_unit_eff_title INTO l_name, l_description;
1228             CLOSE c_unit_eff_title;
1229             IF (l_log_statement >= l_log_current_level) THEN
1230                fnd_log.string(l_log_statement,
1231                               L_DEBUG_KEY,
1232                               'Summary Task. Unit Eff Title = ' || l_name || ', Unit Eff Description = ' || l_description);
1233             END IF;
1234          END IF;
1235       ELSE
1236          -- Not a Summary Task
1237          IF p_mr_route_id IS NOT NULL THEN
1238             /*Bug 5758813 - rnahata*/
1239             OPEN c_route_title(p_mr_route_id);
1240             FETCH c_route_title INTO l_name, l_description;
1241             CLOSE c_route_title;
1242             IF (l_log_statement >= l_log_current_level) THEN
1243                fnd_log.string(l_log_statement,
1244                               L_DEBUG_KEY,
1245                               'Task. Route Title = ' || l_name || ', Route Description = ' || l_description);
1246             END IF;
1247          ELSIF p_unit_id IS NOT NULL THEN
1248             -- Added by sjayacha for Service Request Integration
1249             /*Bug 5758813 - rnahata*/
1250             OPEN c_unit_eff_title(p_unit_id);
1251             FETCH c_unit_eff_title INTO l_name, l_description;
1252             CLOSE c_unit_eff_title;
1253             IF (l_log_statement >= l_log_current_level) THEN
1254                fnd_log.string(l_log_statement,
1255                               L_DEBUG_KEY,
1256                               'Task. Unit Eff Title = ' || l_name || ', Unit Eff Description = ' || l_description);
1257             END IF;
1258          END IF;
1259       END IF;  -- Summary Task or Not
1260 
1261       -- Check for the Visit Task ID and Number.
1262       l_task_ID := Get_Visit_Task_Id();
1263       l_task_number := Get_Visit_Task_Number(p_visit_id);
1264       IF (l_log_statement >= l_log_current_level) THEN
1265          fnd_log.string(l_log_statement,
1266                         L_DEBUG_KEY,
1267                         'Task ID = ' || l_task_id || ', Task Number = ' || l_task_number);
1268       END IF;
1269 
1270       l_msg_count := Fnd_Msg_Pub.count_msg;
1271       IF l_msg_count > 0 OR l_return_status <> Fnd_Api.g_ret_sts_success THEN
1272          x_msg_count := l_msg_count;
1273          x_return_status := Fnd_Api.G_RET_STS_ERROR;
1274          RAISE Fnd_Api.G_EXC_ERROR;
1275       END IF;
1276 
1277       IF (l_log_statement >= l_log_current_level) THEN
1278          fnd_log.string(l_log_statement,
1279                         L_DEBUG_KEY,
1280                         'Before calling AHL_VISIT_TASKS_PKG.Insert_Row.');
1281       END IF;
1282 
1283       -- Insert a record in AHL_VISIT_TASKS base and translational tables
1284       Ahl_Visit_Tasks_Pkg.Insert_Row (
1285        X_ROWID                 => l_rowid,
1286        X_VISIT_TASK_ID         => l_task_ID ,
1287        X_VISIT_TASK_NUMBER     => l_task_number,
1288        X_OBJECT_VERSION_NUMBER => 1,
1289        X_VISIT_ID              => p_visit_id,
1290        X_PROJECT_TASK_ID       => NULL,
1291        X_COST_PARENT_ID        => p_parent_id,
1292        X_MR_ROUTE_ID           => p_mr_route_id,
1293        X_MR_ID                 => p_mr_id,
1294        X_DURATION              => NULL,
1295        X_UNIT_EFFECTIVITY_ID   => p_unit_id,
1296        X_START_FROM_HOUR       => NULL,
1297        X_INVENTORY_ITEM_ID     => p_item_id,
1298        X_ITEM_ORGANIZATION_ID  => p_item_org_id,
1299        X_INSTANCE_ID           => p_serial_id,
1300        X_PRIMARY_VISIT_TASK_ID => NULL,
1301        X_ORIGINATING_TASK_ID   => p_parent_id,
1302        X_SERVICE_REQUEST_ID    => p_service_id,
1303        X_TASK_TYPE_CODE        => l_type,
1304        X_DEPARTMENT_ID         => p_dept_id,
1305        X_SUMMARY_TASK_FLAG     => 'N',
1306        X_PRICE_LIST_ID         => NULL,
1307        X_STATUS_CODE           => 'PLANNING',
1308        X_ESTIMATED_PRICE       => NULL,
1309        X_ACTUAL_PRICE          => NULL,
1310        X_ACTUAL_COST           => NULL,
1311        X_STAGE_ID              => p_stage_id,
1312        -- Added cxcheng POST11510--------------
1313        X_START_DATE_TIME       => NULL,
1314        X_END_DATE_TIME         => NULL,
1315        X_ATTRIBUTE_CATEGORY    => NULL,
1316        X_ATTRIBUTE1            => NULL,
1317        X_ATTRIBUTE2            => NULL,
1318        X_ATTRIBUTE3            => NULL,
1319        X_ATTRIBUTE4            => NULL,
1320        X_ATTRIBUTE5            => NULL,
1321        X_ATTRIBUTE6            => NULL,
1322        X_ATTRIBUTE7            => NULL,
1323        X_ATTRIBUTE8            => NULL,
1324        X_ATTRIBUTE9            => NULL,
1325        X_ATTRIBUTE10           => NULL,
1326        X_ATTRIBUTE11           => NULL,
1327        X_ATTRIBUTE12           => NULL,
1328        X_ATTRIBUTE13           => NULL,
1329        X_ATTRIBUTE14           => NULL,
1330        X_ATTRIBUTE15           => NULL,
1331        X_VISIT_TASK_NAME       => l_name, --Bug 5758813
1332        X_DESCRIPTION           => l_description, --Bug 5758813
1333        -- Added by rnahata for Issue 105
1334        X_QUANTITY              => p_quantity,
1335        X_CREATION_DATE         => SYSDATE,
1336        X_CREATED_BY            => Fnd_Global.USER_ID,
1337        X_LAST_UPDATE_DATE      => SYSDATE,
1338        X_LAST_UPDATED_BY       => Fnd_Global.USER_ID,
1339        X_LAST_UPDATE_LOGIN     => Fnd_Global.LOGIN_ID);
1340 
1341       IF (l_log_statement >= l_log_current_level) THEN
1342          fnd_log.string(l_log_statement,
1343                         L_DEBUG_KEY,
1344                         'After calling AHL_VISIT_TASKS_PKG.Insert_Row.');
1345       END IF;
1346 
1347       x_task_id := l_task_id;
1348 
1349       -- Added cxcheng POST11510--------------
1350       --Now adjust the times derivation for task
1351       IF (l_log_statement >= l_log_current_level) THEN
1352          fnd_log.string(l_log_statement,
1353                         L_DEBUG_KEY,
1354                         'Before calling AHL_VWP_TIMES_PVT.Adjust_Task_Times.');
1355       END IF;
1356 
1357       AHL_VWP_TIMES_PVT.Adjust_Task_Times
1358            (p_api_version      => 1.0,
1359             p_init_msg_list    => Fnd_Api.G_FALSE,
1360             p_commit           => Fnd_Api.G_FALSE,
1361             p_validation_level => Fnd_Api.G_VALID_LEVEL_FULL,
1362             x_return_status    => l_return_status,
1363             x_msg_count        => l_msg_count,
1364             x_msg_data         => l_msg_data,
1365             p_task_id          => l_task_id);
1366 
1367       IF (l_log_statement >= l_log_current_level) THEN
1368          fnd_log.string(l_log_statement,
1369                         L_DEBUG_KEY,
1370                         'After calling AHL_VWP_TIMES_PVT.Adjust_Task_Times. Return Status = ' ||
1371                         l_return_status);
1372       END IF;
1373 
1374       l_msg_count := Fnd_Msg_Pub.count_msg;
1375       IF l_msg_count > 0 OR l_return_status <> Fnd_Api.g_ret_sts_success THEN
1376          IF (l_log_statement >= l_log_current_level) THEN
1377             fnd_log.string(l_log_statement,
1378                            L_DEBUG_KEY,
1379                            'Errors from AHL_VWP_TIMES_PVT.Adjust_Task_Times. Message count: ' ||
1380                            l_msg_count || ', message data: ' || l_msg_data);
1381          END IF;
1382          x_msg_count := l_msg_count;
1383          x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
1384          RAISE Fnd_Api.G_EXC_UNEXPECTED_ERROR;
1385       END IF;
1386 
1387       x_return_status := Fnd_Api.g_ret_sts_success;
1388       IF (l_log_procedure >= l_log_current_level) THEN
1389          fnd_log.string(l_log_procedure,
1390                         L_DEBUG_KEY || '.end',
1391                         'Return Status = ' || x_return_status || '. Task Id = ' || x_task_id);
1392       END IF;
1393    END IF; -- p_visit_id IS NOT NULL
1394 END Insert_Tasks;
1395 
1396 --------------------------------------------------------------------
1397 -- Define local functions body                                   --
1398 --------------------------------------------------------------------
1399 
1400 
1401 --------------------------------------------------------------------
1402 -- FUNCTION
1403 --    Get_Cost_Originating_Id
1404 --
1405 -- PURPOSE
1406 --    To seek Cost Parent Id and Originating Task Id for the
1407 --    planned/unplanned task which has to be created.
1408 --------------------------------------------------------------------
1409 FUNCTION Get_Cost_Originating_Id (p_mr_main_id IN NUMBER, p_mr_header_id IN NUMBER)
1410 RETURN NUMBER
1411 IS
1412 -- Define local variables
1413    L_API_NAME  CONSTANT VARCHAR2(30) := 'Get_Cost_Originating_Id';
1414    L_DEBUG_KEY CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
1415    l_flag1              VARCHAR2(1);
1416    x_parent_id          NUMBER;
1417    y                    NUMBER := 0;
1418    i                    NUMBER := 0;
1419 
1420 -- Define local cursors
1421  -- To find all relationships between various MR_HEADER_IDs
1422  -- under main MR_HEADER_IDs which was retreived on basis of the Unit Effectivity
1423    CURSOR c_relationship(x_MR_id IN NUMBER) IS
1424     SELECT MR_HEADER_ID, RELATED_MR_HEADER_ID
1425       FROM AHL_MR_RELATIONSHIPS
1426        START WITH MR_HEADER_ID = (
1427            SELECT MR_HEADER_ID
1428            FROM AHL_MR_HEADERS_APP_V
1429            WHERE MR_HEADER_ID = x_MR_id)
1430        CONNECT BY PRIOR RELATED_MR_HEADER_ID = MR_HEADER_ID;
1431    relation_rec c_relationship%ROWTYPE;
1432 
1433 -- Define local record type for storing MR_Id and Related MR_Header_Id
1434    TYPE Task_Rel_Type IS RECORD
1435    (MR_HEADER_ID                NUMBER,
1436     RELATED_MR_HEADER_ID        NUMBER);
1437 
1438 -- Define local table type for storing MR_Id and Related MR_Header_Id
1439    TYPE relation_tbl IS TABLE OF Task_Rel_Type
1440    INDEX BY BINARY_INTEGER;
1441 
1442    relation_rec_tbl relation_tbl;
1443 
1444 BEGIN
1445    IF (l_log_procedure >= l_log_current_level) THEN
1446       fnd_log.string(l_log_procedure,
1447                      L_DEBUG_KEY ||'.begin',
1448                      'At the start of PL SQL function. MAIN HEADER = ' || p_MR_main_id ||
1449                      'CURRENT MR HEADER = ' || p_MR_HEADER_id);
1450    END IF;
1451    -- To store all related rows of relationship with main mr_header id in a form of a table datatype
1452    OPEN c_relationship (p_mr_main_id);
1453    LOOP
1454    FETCH c_relationship INTO relation_rec;
1455        EXIT WHEN c_relationship%NOTFOUND;
1456        relation_rec_tbl(i).MR_HEADER_ID:=relation_rec.MR_HEADER_ID;
1457        relation_rec_tbl(i).RELATED_MR_HEADER_ID:=relation_rec.RELATED_MR_HEADER_ID;
1458        i:=i+1;
1459    END LOOP;
1460    CLOSE c_relationship;
1461 
1462    -- Find out parent of MR_HEADER_ID as cost and parent ID
1463    IF relation_rec_tbl.COUNT > 0 THEN
1464       y := relation_rec_tbl.FIRST;
1465       LOOP
1466          IF relation_rec_tbl(y).RELATED_MR_HEADER_ID = p_MR_HEADER_id THEN
1467             IF relation_rec_tbl(y).RELATED_MR_HEADER_ID = p_mr_main_id THEN
1468                x_parent_id := NULL;
1469                l_flag1 := 'Y';
1470                EXIT WHEN l_flag1 = 'Y';
1471             ELSE
1472                x_parent_id := relation_rec_tbl(y).MR_HEADER_ID;
1473                l_flag1 := 'Y';
1474                EXIT WHEN l_flag1 = 'Y';
1475             END IF;
1476          END IF;
1477          EXIT WHEN y = relation_rec_tbl.LAST ;
1478          y :=relation_rec_tbl.NEXT(y);
1479       END LOOP;
1480    END IF;
1481 
1482    IF (l_log_procedure >= l_log_current_level) THEN
1483       fnd_log.string(l_log_procedure,
1484                      L_DEBUG_KEY ||'.end',
1485                      'At the end of PL SQL function. Parent_Id' || x_parent_id);
1486    END IF;
1487    RETURN x_parent_id;
1488 END Get_Cost_Originating_Id;
1489 
1490 --------------------------------------------------------------------
1491 -- FUNCTION
1492 --    Get_Visit_Task_Id
1493 --
1494 -- PURPOSE
1495 --    To retrieve visit task id from the sequence
1496 --------------------------------------------------------------------
1497 FUNCTION  Get_Visit_Task_Id
1498 RETURN NUMBER
1499 IS
1500    -- Define local cursors
1501    CURSOR c_seq_t IS
1502     SELECT Ahl_Visit_Tasks_B_S.NEXTVAL
1503     FROM   dual;
1504 
1505    CURSOR c_id_exists_t (c_id IN NUMBER) IS
1506     SELECT 1
1507     FROM   Ahl_Visit_Tasks_VL
1508     WHERE  Visit_Task_id = c_id;
1509 
1510    -- Define local variables
1511    x_visit_task_id NUMBER;
1512    l_dummy         NUMBER;
1513    L_API_NAME   CONSTANT VARCHAR2(30) := 'Get_Visit_Task_Id';
1514    L_DEBUG_KEY  CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
1515 
1516 BEGIN
1517    IF (l_log_procedure >= l_log_current_level) THEN
1518       fnd_log.string(l_log_procedure,
1519                      L_DEBUG_KEY ||'.begin',
1520                      'At the start of PL SQL function.');
1521    END IF;
1522 
1523    -- If the ID is not passed into the API, then grab a value from the sequence.
1524    OPEN c_seq_t;
1525    FETCH c_seq_t INTO x_visit_task_id;
1526    CLOSE c_seq_t;
1527 
1528    -- Check to be sure that the sequence does not exist.
1529    OPEN c_id_exists_t (x_visit_task_id);
1530    FETCH c_id_exists_t INTO l_dummy;
1531    IF c_id_exists_t%FOUND THEN
1532       x_visit_task_id := Get_Visit_Task_Id();
1533    END IF;
1534    CLOSE c_id_exists_t;
1535 
1536    IF (l_log_procedure >= l_log_current_level) THEN
1537       fnd_log.string(l_log_procedure,
1538                      L_DEBUG_KEY ||'.end',
1539                      'At the end of PL SQL function. Visit Task Id = ' || x_visit_task_id);
1540    END IF;
1541    RETURN x_visit_task_id;
1542 END Get_Visit_Task_Id;
1543 
1544 --------------------------------------------------------------------
1545 -- FUNCTION
1546 --    Get_Visit_Task_Number
1547 --
1548 -- PURPOSE
1549 --    To retrieve visit task's task number with maximum plus one criteria
1550 --------------------------------------------------------------------
1551 
1552 FUNCTION Get_Visit_Task_Number(p_visit_id IN NUMBER)
1553 RETURN NUMBER
1554 IS
1555  -- To find out the maximum task number value in the visit
1556   CURSOR c_task_number IS
1557    SELECT MAX(visit_task_number)
1558    FROM Ahl_Visit_Tasks_B
1559    WHERE Visit_Id = p_visit_id;
1560 
1561   x_Visit_Task_Number NUMBER;
1562   L_API_NAME   CONSTANT VARCHAR2(30) := 'Get_Visit_Task_Number';
1563   L_DEBUG_KEY  CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
1564 
1565 BEGIN
1566    IF (l_log_procedure >= l_log_current_level) THEN
1567       fnd_log.string(l_log_procedure,
1568                      L_DEBUG_KEY ||'.begin',
1569                      'At the start of PL SQL function. Visit Id = ' || p_visit_id);
1570    END IF;
1571 
1572    -- Check for Visit Number
1573    OPEN c_Task_Number;
1574    FETCH c_Task_Number INTO x_Visit_Task_Number;
1575    CLOSE c_Task_Number;
1576    IF x_Visit_Task_Number IS NOT NULL THEN
1577       x_Visit_Task_Number := x_Visit_Task_Number + 1;
1578    ELSE
1579       x_Visit_Task_Number := 1;
1580    END IF;
1581 
1582    IF (l_log_procedure >= l_log_current_level) THEN
1583       fnd_log.string(l_log_procedure,
1584                      L_DEBUG_KEY ||'.end',
1585                      'At the end of PL SQL function. Visit Task Number = ' || x_Visit_Task_Number);
1586    END IF;
1587    RETURN x_Visit_Task_Number;
1588 END Get_Visit_Task_Number;
1589 
1590 --------------------------------------------------------------------
1591 -- PROCEDURE
1592 --    Tech_Dependency
1593 --
1594 --
1595 --------------------------------------------------------------------
1596 PROCEDURE Tech_Dependency (
1597    p_visit_id       IN         NUMBER,
1598    p_task_type      IN         VARCHAR2,
1599    p_MR_Serial_Tbl  IN         MR_Serial_Tbl_Type,
1600    x_return_status  OUT NOCOPY VARCHAR2)
1601 IS
1602   -- Define local variables
1603    L_API_NAME  CONSTANT VARCHAR2(30) := 'Tech_Dependency';
1604    L_DEBUG_KEY CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
1605    l_task_rec           Task_Rec_Type;
1606    l_return_status      VARCHAR2(1);
1607    l_flag               VARCHAR2(1);
1608    l_tsk_flag           VARCHAR2(1);
1609    l_serial_id          NUMBER;
1610    l_count              NUMBER;
1611    l_task_link_id       NUMBER;
1612    l_child_task_id      NUMBER;
1613    l_parent_task_id     NUMBER;
1614    l_route_id           NUMBER;
1615    y                    NUMBER;
1616 
1617    --  Table type for storing Task Ids record type
1618    TYPE Task_Tbl_Type IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
1619    l_parent_Task_Tbl    Task_Tbl_Type;
1620    l_child_Task_Tbl     Task_Tbl_Type;
1621 
1622 -- Define local variables
1623    -- To find out the count for the relationship with MR Route Id
1624    CURSOR c_route_seq_ct (x_route_id IN NUMBER) IS
1625     SELECT COUNT(*) FROM AHL_MR_ROUTE_SEQUENCES_APP_V
1626     WHERE MR_ROUTE_ID = x_route_id;
1627 
1628    -- To find out the the relationship between MR Route Id and Related MR Route Id
1629    CURSOR c_route_seq (x_route_id IN NUMBER) IS
1630     SELECT MR_ROUTE_ID, RELATED_MR_ROUTE_ID FROM AHL_MR_ROUTE_SEQUENCES_APP_V
1631     WHERE MR_ROUTE_ID = x_route_id;
1632    c_route_seq_rec c_route_seq%ROWTYPE;
1633 
1634    -- To find out the tasks with tasktype code as planned for visits
1635    CURSOR c_route_task (x_route_id IN NUMBER, x_serial_id IN NUMBER,
1636                         x_id IN NUMBER, x_type IN VARCHAR2) IS
1637     SELECT VISIT_TASK_ID FROM AHL_VISIT_TASKS_VL
1638     WHERE MR_ROUTE_ID = x_route_id AND INSTANCE_ID = x_serial_id
1639     AND VISIT_ID = x_id AND TASK_TYPE_CODE = x_type
1640     AND  nvl(STATUS_CODE,'x') <> 'DELETED';
1641 
1642    -- To find MR_ROUTE_ID for the particular MR_HEADER_ID
1643    CURSOR c_MR_route (x_mr_id IN NUMBER) IS
1644       SELECT   T1.MR_ROUTE_ID
1645       FROM     AHL_MR_ROUTES_V T1,
1646                AHL_ROUTES_B T2
1647       WHERE    T1.MR_HEADER_ID = x_mr_id
1648        AND     T1.ROUTE_ID = T2.ROUTE_ID
1649        AND     T2.REVISION_STATUS_CODE = 'COMPLETE'
1650        -- Added as of Bug# 3562914
1651        -- By shbhanda 04/22/2004
1652        AND     T1.ROUTE_REVISION_NUMBER
1653        IN      (  SELECT MAX(T3.ROUTE_REVISION_NUMBER)
1654                   FROM   AHL_MR_ROUTES_V T3
1655                 WHERE  T3.MR_HEADER_ID = x_mr_id
1656                   AND T3.ROUTE_NUMBER = T1.ROUTE_NUMBER
1657                GROUP BY T3.ROUTE_NUMBER
1658             );
1659 BEGIN
1660  ---------------------------Start of Body-------------------------------------
1661    IF (l_log_procedure >= l_log_current_level) THEN
1662       fnd_log.string(l_log_procedure,
1663                      L_DEBUG_KEY ||'.begin',
1664                      'At the start of PL SQL procedure. Visit Id = ' || p_visit_id ||
1665                      ', Task Type = ' || p_task_type || ', MR count = ' || p_MR_Serial_tbl.count);
1666    END IF;
1667 
1668    IF p_MR_Serial_tbl.count > 0 THEN
1669       y := p_MR_Serial_tbl.FIRST;
1670       LOOP
1671          IF (l_log_statement >= l_log_current_level)THEN
1672             fnd_log.string(l_log_statement,
1673                            L_DEBUG_KEY,
1674                            'MR ID = ' || p_MR_Serial_tbl(y).MR_ID);
1675          END IF;
1676 
1677          -- Cursor to find all MR routes under the current MR
1678          OPEN c_MR_route (p_MR_Serial_tbl(y).MR_ID);
1679          LOOP
1680          FETCH c_MR_route INTO l_route_id;
1681          EXIT WHEN c_MR_route%NOTFOUND;
1682 
1683          -- Cursor to find the count of number of MR routes
1684          -- which have parent-child relationship with the current MR Route
1685          OPEN c_route_seq_ct (l_route_id);
1686          FETCH c_route_seq_ct INTO l_count;
1687          CLOSE c_route_seq_ct;
1688 
1689          IF (l_log_statement >= l_log_current_level) THEN
1690             fnd_log.string(l_log_statement,
1691                            L_DEBUG_KEY,
1692                            'Route sequence count = ' || l_count);
1693          END IF;
1694 
1695          IF l_count > 0 THEN
1696 
1697             -- To know parent-child MR Routes in AHL_MR_ROUTE_SEQUENCES
1698             OPEN c_route_seq (l_route_id);
1699             LOOP
1700             FETCH c_route_seq INTO c_route_seq_rec;
1701             EXIT WHEN c_route_seq%NOTFOUND;
1702             l_parent_task_id := 0;
1703             l_child_task_id  := 0;
1704 
1705             IF p_task_type = 'UNPLANNED' THEN  -- For Unplanned task: Serial Id remains same for all Routes within a MR
1706                l_serial_id   :=  p_MR_Serial_tbl(y).SERIAL_ID ;
1707 
1708                IF (l_log_statement >= l_log_current_level) THEN
1709                   fnd_log.string(l_log_statement,
1710                                  L_DEBUG_KEY,
1711                                  'Task type code = ' || p_task_type || ', MR ROUTE = ' || c_route_seq_rec.MR_ROUTE_ID);
1712                END IF;
1713 
1714                OPEN c_route_task (c_route_seq_rec.MR_ROUTE_ID, l_serial_id, p_visit_id, p_task_type);
1715                FETCH c_route_task INTO l_parent_task_id;
1716                CLOSE c_route_task;
1717 
1718                IF (l_log_statement >= l_log_current_level) THEN
1719                   fnd_log.string(l_log_statement,
1720                                  L_DEBUG_KEY,
1721                                  'Parent Id = ' || l_parent_task_id || ', RELATED MR ROUTE = ' || c_route_seq_rec.RELATED_MR_ROUTE_ID);
1722                END IF;
1723 
1724                OPEN c_route_task (c_route_seq_rec.RELATED_MR_ROUTE_ID, l_serial_id, p_visit_id, p_task_type);
1725                FETCH c_route_task INTO l_child_task_id;
1726                CLOSE c_route_task;
1727 
1728                IF (l_log_statement >= l_log_current_level) THEN
1729                   fnd_log.string(l_log_statement,
1730                                  L_DEBUG_KEY,
1731                                  'Child Id = ' || l_child_task_id);
1732                END IF;
1733 
1734                IF l_parent_task_id <> 0 AND l_child_task_id <> 0 THEN
1735                   IF (l_log_statement >= l_log_current_level) THEN
1736                      fnd_log.string(l_log_statement,
1737                                     L_DEBUG_KEY,
1738                                     'Parent Id = ' || l_parent_task_id || ', Child Id = ' || l_child_task_id);
1739                   END IF;
1740                   l_tsk_flag := 'Y';
1741                ELSE
1742                   l_tsk_flag := 'N';
1743                END IF;
1744 
1745             ELSE -- Else of p_task_type = 'UNPLANNED' check
1746             -- For Planned task Serial Id are different for each MR Route within a MR,
1747             -- because of Unit effectivites relations
1748 
1749                l_serial_id   :=  p_MR_Serial_tbl(y).SERIAL_ID ;
1750 
1751                OPEN c_route_task (c_route_seq_rec.MR_ROUTE_ID, l_serial_id, p_visit_id, p_task_type);
1752                FETCH c_route_task INTO l_parent_task_id;
1753                CLOSE c_route_task;
1754 
1755                OPEN c_route_task (c_route_seq_rec.RELATED_MR_ROUTE_ID, l_serial_id, p_visit_id, p_task_type);
1756                FETCH c_route_task INTO l_child_task_id;
1757                CLOSE c_route_task;
1758 
1759                IF l_parent_task_id <> 0 AND l_child_task_id <> 0 THEN
1760                   l_tsk_flag := 'Y';
1761                ELSE
1762                   l_tsk_flag := 'N';
1763                END IF;
1764 
1765             END IF; -- End of check p_task_type = 'UNPLANNED' check
1766 
1767             IF (l_log_statement >= l_log_current_level) THEN
1768                fnd_log.string(l_log_statement,
1769                               L_DEBUG_KEY,
1770                               'Value of L_TSK_FLAG after task type check' || l_tsk_flag);
1771             END IF;
1772 
1773             IF l_tsk_flag = 'Y' THEN
1774                SELECT ahl_task_links_s.nextval INTO l_task_link_id FROM DUAL;
1775 
1776                IF l_task_rec.attribute_category = Fnd_Api.G_MISS_CHAR THEN
1777                   l_task_rec.attribute_category := NULL;
1778                END IF;
1779                --
1780                IF l_task_rec.attribute1 = Fnd_Api.G_MISS_CHAR THEN
1781                   l_task_rec.attribute1 := NULL;
1782                END IF;
1783                --
1784                IF  l_task_rec.attribute2 = Fnd_Api.G_MISS_CHAR THEN
1785                   l_task_rec.attribute2 := NULL;
1786                END IF;
1787                --
1788                IF l_task_rec.attribute3 = Fnd_Api.G_MISS_CHAR THEN
1789                   l_task_rec.attribute3 := NULL;
1790                END IF;
1791                --
1792                IF l_task_rec.attribute4 = Fnd_Api.G_MISS_CHAR THEN
1793                   l_task_rec.attribute4 := NULL;
1794                END IF;
1795                --
1796                IF l_task_rec.attribute5 = Fnd_Api.G_MISS_CHAR THEN
1797                   l_task_rec.attribute5 := NULL;
1798                END IF;
1799                --
1800                IF l_task_rec.attribute6 = Fnd_Api.G_MISS_CHAR THEN
1801                   l_task_rec.attribute6 := NULL;
1802                END IF;
1803                --
1804                IF l_task_rec.attribute7 = Fnd_Api.G_MISS_CHAR THEN
1805                   l_task_rec.attribute7 := NULL;
1806                END IF;
1807                --
1808                IF l_task_rec.attribute8 = Fnd_Api.G_MISS_CHAR THEN
1809                   l_task_rec.attribute8 := NULL;
1810                END IF;
1811                --
1812                IF l_task_rec.attribute9 = Fnd_Api.G_MISS_CHAR THEN
1813                   l_task_rec.attribute9 := NULL;
1814                END IF;
1815                --
1816                IF l_task_rec.attribute10 = Fnd_Api.G_MISS_CHAR THEN
1817                   l_task_rec.attribute10 := NULL;
1818                END IF;
1819                --
1820                IF  l_task_rec.attribute11 = Fnd_Api.G_MISS_CHAR THEN
1821                   l_task_rec.attribute11 := NULL;
1822                END IF;
1823                --
1824                IF  l_task_rec.attribute12 = Fnd_Api.G_MISS_CHAR THEN
1825                   l_task_rec.attribute12 := NULL;
1826                END IF;
1827                --
1828                IF  l_task_rec.attribute13 = Fnd_Api.G_MISS_CHAR THEN
1829                  l_task_rec.attribute13 := NULL;
1830                END IF;
1831                --
1832                IF  l_task_rec.attribute14 = Fnd_Api.G_MISS_CHAR THEN
1833                   l_task_rec.attribute14 := NULL;
1834                END IF;
1835                --
1836                IF  l_task_rec.attribute15 = Fnd_Api.G_MISS_CHAR THEN
1837                   l_task_rec.attribute15 := NULL;
1838                END IF;
1839 
1840                IF (l_log_statement >= l_log_current_level) THEN
1841                   fnd_log.string(l_log_statement,
1842                                  L_DEBUG_KEY,
1843                                  'Before inserting record into AHL_TASK_LINKS');
1844                END IF;
1845 
1846                INSERT INTO AHL_TASK_LINKS
1847                (
1848                 TASK_LINK_ID,OBJECT_VERSION_NUMBER, LAST_UPDATE_DATE, LAST_UPDATED_BY,
1849                 CREATION_DATE, CREATED_BY, LAST_UPDATE_LOGIN, VISIT_TASK_ID, PARENT_TASK_ID,
1850                 ATTRIBUTE_CATEGORY, ATTRIBUTE1, ATTRIBUTE2, ATTRIBUTE3, ATTRIBUTE4,
1851                 ATTRIBUTE5, ATTRIBUTE6, ATTRIBUTE7, ATTRIBUTE8, ATTRIBUTE9, ATTRIBUTE10,
1852                 ATTRIBUTE11, ATTRIBUTE12, ATTRIBUTE13, ATTRIBUTE14, ATTRIBUTE15
1853                )
1854                VALUES
1855                (
1856                 l_TASK_LINK_ID, 1,sysdate, fnd_global.user_id, sysdate,
1857                 fnd_global.user_id, fnd_global.user_id, l_child_task_id, l_parent_task_id,
1858                 l_task_rec.ATTRIBUTE_CATEGORY, l_task_rec.ATTRIBUTE1, l_task_rec.ATTRIBUTE2,
1859                 l_task_rec.ATTRIBUTE3, l_task_rec.ATTRIBUTE4, l_task_rec.ATTRIBUTE5,
1860                 l_task_rec.ATTRIBUTE6, l_task_rec.ATTRIBUTE7, l_task_rec.ATTRIBUTE8,
1861                 l_task_rec.ATTRIBUTE9, l_task_rec.ATTRIBUTE10,l_task_rec.ATTRIBUTE11,
1862                 l_task_rec.ATTRIBUTE12, l_task_rec.ATTRIBUTE13, l_task_rec.ATTRIBUTE14,
1863                 l_task_rec.ATTRIBUTE15
1864                );
1865 
1866                IF (l_log_statement >= l_log_current_level) THEN
1867                   fnd_log.string(l_log_statement,
1868                                  L_DEBUG_KEY,
1869                                  'After inserting record into AHL_TASK_LINKS');
1870                END IF;
1871             END IF; --  -- End of check l_tsk_flag = 'Y'
1872          END LOOP;
1873          CLOSE c_route_seq;
1874       END IF; -- End of check l_count > 0
1875 
1876    END LOOP;
1877    CLOSE c_MR_route;
1878 
1879    EXIT WHEN y = p_MR_Serial_tbl.LAST ;
1880    y := p_MR_Serial_tbl.NEXT(y);
1881 END LOOP;
1882 END IF; -- End of check p_MR_Id_tbl.count > 0
1883    x_return_status := Fnd_Api.g_ret_sts_success;
1884    IF (l_log_procedure >= l_log_current_level) THEN
1885       fnd_log.string(l_log_procedure,
1886                      L_DEBUG_KEY ||'.end',
1887                      'At the end of PL SQL procedure. Return Status = ' || x_return_status);
1888    END IF;
1889 END Tech_Dependency;
1890 
1891 --------------------------------------------------------------------
1892 -- PROCEDURE
1893 --    Create_Tasks_for_MR
1894 --
1895 -- PURPOSE
1896 --    To create tasks for MR
1897 --------------------------------------------------------------------
1898 PROCEDURE Create_Tasks_for_MR
1899  (  p_visit_id       IN            NUMBER,
1900     p_unit_id        IN            NUMBER,
1901     p_item_id        IN            NUMBER,
1902     p_org_id         IN            NUMBER,
1903     p_serial_id      IN            NUMBER,
1904     p_mr_id          IN            NUMBER,
1905     p_department_id  IN            NUMBER,
1906     p_service_req_id IN            NUMBER,
1907     -- Added by rnahata for Issue 105
1908     p_quantity       IN            NUMBER,
1909     p_x_parent_MR_Id IN OUT NOCOPY NUMBER,
1910     x_return_status     OUT NOCOPY VARCHAR2)
1911 IS
1912    -- Define local variables
1913    L_API_NAME   CONSTANT VARCHAR2(30) := 'Create_Tasks_for_MR';
1914    L_DEBUG_KEY  CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
1915 
1916    -- Define Cursors
1917    -- To find MR_ROUTE_ID for the particular MR_HEADER_ID
1918    CURSOR c_MR_route(x_mr_id IN NUMBER) IS
1919    -- AnRaj: Changes made for fixing bug#4919353, issue# 10
1920     SELECT T1.MR_ROUTE_ID,
1921     -- Added for 11.5.10 Changes done by Senthil.
1922            T1.STAGE
1923     FROM AHL_MR_ROUTES_V T1, AHL_ROUTES_B T2
1924     WHERE T1.MR_HEADER_ID = x_mr_id
1925      AND T1.ROUTE_ID = T2.ROUTE_ID
1926      AND T2.REVISION_STATUS_CODE = 'COMPLETE'
1927      -- Added as of Bug# 3562914
1928      -- By shbhanda 04/22/2004
1929      AND T1.ROUTE_REVISION_NUMBER
1930          IN (SELECT MAX(T3.ROUTE_REVISION_NUMBER)
1931              FROM AHL_MR_ROUTES_V T3
1932              WHERE T3.MR_HEADER_ID = x_mr_id
1933               AND T3.ROUTE_NUMBER = T1.ROUTE_NUMBER
1934              GROUP BY T3.ROUTE_NUMBER
1935             );
1936 
1937    -- To find any visit task exists for the retrieve Serial Number, Unit Effectivity ID and MR Route ID and other info
1938    CURSOR c_task (x_mroute_id IN NUMBER, x_serial_id IN NUMBER, x_unit_id IN NUMBER) IS
1939     SELECT Visit_Id, Visit_Task_id
1940     FROM AHL_VISIT_TASKS_B
1941     WHERE MR_Route_Id = x_mroute_id
1942      AND Instance_Id = x_serial_id
1943      AND Unit_Effectivity_Id = x_unit_id
1944      AND (STATUS_CODE IS NULL OR STATUS_CODE <> 'DELETED');
1945     c_task_rec c_task%ROWTYPE;
1946 
1947    -- To find on the basis of input unit effectivity the related information
1948    CURSOR c_info(x_mr_header_id IN NUMBER, x_unit_id IN NUMBER, x_serial_id IN NUMBER) IS
1949     SELECT CSI.INV_MASTER_ORGANIZATION_ID, CSI.INVENTORY_ITEM_ID
1950     FROM AHL_UNIT_EFFECTIVITIES_VL AUEB, CSI_ITEM_INSTANCES CSI
1951     WHERE AUEB.CSI_ITEM_INSTANCE_ID = CSI.INSTANCE_ID
1952      AND AUEB.CSI_ITEM_INSTANCE_ID = x_serial_id
1953      AND (AUEB.STATUS_CODE IS NULL OR AUEB.STATUS_CODE = 'INIT-DUE')
1954      AND AUEB.UNIT_EFFECTIVITY_ID = x_unit_id
1955      AND AUEB.MR_HEADER_ID = x_mr_header_id;
1956 
1957    -- To find any visit task exists for the retrieve Serial Number, Unit Effectivity ID and MR Route ID and other info
1958    CURSOR c_task_chk (x_id IN NUMBER, x_mr_id IN NUMBER, x_serial_id in NUMBER) IS
1959     SELECT AMHV.Title
1960     FROM AHL_VISIT_TASKS_B AVTB, AHL_MR_HEADERS_APP_V AMHV
1961     WHERE AVTB.MR_ID = AMHV.MR_HEADER_ID
1962      AND AVTB.MR_Id =  x_mr_id
1963      AND AVTB.Instance_Id = x_serial_id
1964      AND AVTB.VISIT_ID = x_id
1965      AND (AVTB.STATUS_CODE IS NULL OR AVTB.STATUS_CODE <> 'DELETED');
1966      c_task_chk_rec c_task_chk%ROWTYPE;
1967 
1968    CURSOR c_stage(p_stage_number IN NUMBER, p_visit_id IN NUMBER) IS
1969     SELECT stage_id,
1970            stage_name
1971     FROM ahl_vwp_stages_vl
1972     WHERE stage_num = p_stage_number
1973      AND visit_id = p_visit_id;
1974 
1975    CURSOR c_mr_title(p_mr_id IN NUMBER) IS
1976     SELECT TITLE
1977     FROM ahl_mr_headers_b
1978     WHERE mr_header_id = p_mr_id;
1979 
1980    CURSOR c_task_det(p_visit_task_id NUMBER) IS
1981     SELECT visit_task_id,
1982            start_date_time,
1983            end_date_time
1984     FROM   ahl_visit_tasks_b
1985     WHERE  visit_task_id = p_visit_task_id;
1986 
1987 l_task_det c_task_det%rowtype;
1988 
1989  -- Table type for storing MR Route Id
1990    TYPE MR_Route_Tbl_Type IS TABLE OF INTEGER
1991    INDEX BY BINARY_INTEGER;
1992 
1993  -- Table type for storing MR Route Id
1994  -- 11.5.10 Changes done by Senthil.
1995    TYPE Stage_num_Tbl_Type IS TABLE OF INTEGER
1996    INDEX BY BINARY_INTEGER;
1997 
1998    MR_Route_Tbl         MR_Route_Tbl_Type;
1999    l_Stage_num_Tbl      Stage_num_Tbl_Type;
2000    l_return_status      VARCHAR2(1);
2001    l_msg_data           VARCHAR2(2000);
2002    l_planned_order_flag VARCHAR2(1);
2003    l_msg_count          NUMBER;
2004    l_visit_id           NUMBER;
2005    l_Unit_Id            NUMBER;
2006    l_MR_Id              NUMBER;
2007    l_serial_id          NUMBER;
2008    l_service_req_id     NUMBER;
2009    l_department_id      NUMBER;
2010    l_parent_MR_Id       NUMBER;
2011    l_org_id             NUMBER;
2012    l_item_id            NUMBER;
2013    l_mr_route_id        NUMBER;
2014    l_task_id            NUMBER;
2015    l_parent_task_id     NUMBER;
2016    i                    NUMBER;
2017    l_stage_number       NUMBER;
2018    l_stage_name         VARCHAR2(80);
2019    l_stage_id           NUMBER;
2020    l_mr_title           VARCHAR2(80);
2021 
2022 BEGIN
2023    IF (l_log_procedure >= l_log_current_level) THEN
2024        fnd_log.string(l_log_procedure,
2025                       L_DEBUG_KEY ||'.begin',
2026                       'At the start of PL SQL procedure. p_visit_id' || p_visit_id ||
2027                       ', p_unit_id' || p_unit_id || ', p_item_id' || p_item_id ||
2028                       ', p_mr_id' || p_mr_id || ', p_service_req_id' || p_service_req_id ||
2029                       ', p_quantity' || p_quantity);
2030    END IF;
2031    l_visit_id      :=  p_visit_id;
2032    l_Unit_Id       :=  p_Unit_Id ;
2033    l_MR_Id         :=  p_MR_Id   ;
2034    l_serial_id     :=  p_serial_id ;
2035    l_service_req_id:=  p_service_req_id;
2036    l_department_id :=  p_department_id;
2037    l_parent_MR_Id  :=  p_x_parent_MR_Id;
2038 
2039    IF l_Unit_Id IS NOT NULL then
2040       -- Cursor to find MR Id, Uniteffectivty and Serial with in task entity.
2041       -- Check if the results falls in the same visit as the input visit
2042       OPEN c_task(l_MR_id, l_serial_id, l_unit_Id);
2043       FETCH c_task INTO c_task_rec;
2044 
2045       IF c_task%FOUND THEN
2046          IF (l_log_statement >= l_log_current_level)THEN
2047             fnd_log.string(l_log_statement,
2048                            L_DEBUG_KEY,
2049                            'Inner c_task found. Unit Effectivity is found');
2050          END IF;
2051          CLOSE c_task;
2052          OPEN c_mr_title(l_MR_id);
2053          FETCH c_mr_title into l_mr_title;
2054          CLOSE c_mr_title;
2055          Fnd_Message.SET_NAME('AHL','AHL_VWP_VISIT_TASK_FOUND');
2056          FND_MESSAGE.SET_TOKEN('MR',l_mr_title);
2057          Fnd_Msg_Pub.ADD;
2058 
2059       ELSE -- else of c_task cursor found or not
2060          --Dup-MR ER#6338208 - sowsubra - start
2061          --commented to allow duplicate MR's in a visit
2062          /*
2063          -- Cursor to find MR and Serial with in all tasks of a visit.
2064          OPEN c_task_chk(l_visit_id, l_MR_Id, l_serial_id);
2065          FETCH c_task_chk INTO c_task_chk_rec;
2066          IF c_task_chk%FOUND THEN
2067             IF (l_log_statement >= l_log_current_level)THEN
2068                fnd_log.string(l_log_statement,
2069                               L_DEBUG_KEY,
2070                               ' Inner c_task2 found');
2071             END IF;
2072             Fnd_Message.SET_NAME('AHL','AHL_VWP_MR_FOUND');
2073             Fnd_Message.SET_TOKEN('MR_TITLE',c_task_chk_rec.title);
2074             Fnd_Msg_Pub.ADD;
2075          ELSE
2076          */
2077          --Dup-MR ER#6338208 - sowsubra - end
2078 
2079          -- To retrieve Item Id and Organization Id with the input Unit Effectivity and MR Id
2080          OPEN c_info (l_MR_Id, l_Unit_Id, l_serial_id);
2081          FETCH c_info INTO l_org_id, l_item_id;
2082          CLOSE c_info;
2083 
2084          IF (l_log_statement >= l_log_current_level)THEN
2085             fnd_log.string(l_log_statement,
2086                            L_DEBUG_KEY,
2087                            'c_info cursor - Organization = '||l_org_id ||
2088                            'and Item = ' || l_item_id);
2089          END IF;
2090         --Dup-MR ER#6338208 - sowsubra - commented out
2091          --  END IF;
2092          --  CLOSE c_task_chk;
2093       END IF;
2094       CLOSE c_task;
2095    ELSE
2096       -- Cursor to find MR and Serial with in all tasks of a visit.
2097         --Dup-MR ER#6338208 - sowsubra - start
2098         --commented to allow duplicate MR's in a visit
2099       /*
2100       OPEN c_task_chk(l_visit_id, l_MR_Id, l_serial_id);
2101       FETCH c_task_chk INTO c_task_chk_rec;
2102       IF c_task_chk%FOUND THEN
2103          IF (l_log_statement >= l_log_current_level)THEN
2104             fnd_log.string(l_log_statement,
2105                            L_DEBUG_KEY,
2106                            ' Inner c_task2 found');
2107          END IF;
2108          Fnd_Message.SET_NAME('AHL','AHL_VWP_MR_FOUND');
2109          Fnd_Message.SET_TOKEN('MR_TITLE',c_task_chk_rec.title);
2110          Fnd_Msg_Pub.ADD;
2111       END IF;
2112       CLOSE c_task_chk;
2113       */
2114           --Dup-MR ER#6338208 - sowsubra - end
2115 
2116       l_item_id  := p_item_id;
2117       l_org_id   := p_org_id;
2118    END IF;
2119 
2120    l_msg_count := FND_MSG_PUB.count_msg;
2121    IF l_msg_count > 0 OR l_return_status <> Fnd_Api.g_ret_sts_success THEN
2122        x_return_status := FND_API.G_RET_STS_ERROR;
2123        RAISE FND_API.G_EXC_ERROR;
2124    END IF;
2125 
2126    IF (l_log_statement >= l_log_current_level) THEN
2127       fnd_log.string(l_log_statement,
2128                      L_DEBUG_KEY,
2129                      'Before calling INSERT_TASKS for Summary Task. Task Id = ' || l_task_id);
2130    END IF;
2131 
2132    INSERT_TASKS
2133          (p_visit_id        => l_visit_id,
2134           p_unit_id         => l_unit_id,
2135           p_serial_id       => l_serial_id,
2136           p_service_id      => l_service_req_id,
2137           p_dept_id         => l_department_id,
2138           p_item_id         => l_item_id,
2139           p_item_org_id     => l_org_id,
2140           p_mr_id           => l_MR_id,
2141           p_mr_route_id     => NULL,
2142           p_parent_id       => l_parent_MR_Id,
2143           p_flag            => 'Y',
2144           P_STAGE_ID        => NULL,
2145           -- Added by rnahata for Issue 105 - pass the quantity for summary task
2146           p_quantity        => p_quantity,
2147           x_task_id         => l_task_id,
2148           x_return_status   => l_return_status,
2149           x_msg_count       => l_msg_count,
2150           x_msg_data        => l_msg_data);
2151 
2152    IF (l_log_statement >= l_log_current_level) THEN
2153       fnd_log.string(l_log_statement,
2154                      L_DEBUG_KEY,
2155                      'After calling INSERT_TASKS for Summary Task. Task Id = ' || l_task_id ||
2156                      '. Return Status = ' || l_return_status);
2157    END IF;
2158 
2159    l_msg_count := FND_MSG_PUB.count_msg;
2160    IF l_msg_count > 0 OR l_return_status <> Fnd_Api.g_ret_sts_success THEN
2161       IF (l_log_statement >= l_log_current_level) THEN
2162          fnd_log.string(l_log_statement,
2163                         L_DEBUG_KEY,
2164                         'Errors from INSERT_TASKS. Message count: ' ||
2165                         l_msg_count || ', message data: ' || l_msg_data);
2166       END IF;
2167       x_return_status := FND_API.G_RET_STS_ERROR;
2168       RAISE FND_API.G_EXC_ERROR;
2169    END IF;
2170 
2171    p_x_parent_MR_Id := l_task_id;  -- To get MR as parent for child summary tasks
2172    l_parent_Task_Id := l_task_id;  -- To get MR as parent for child planned/unplanned tasks
2173 
2174    /*
2175      y := 0;
2176      -- To retrieve all MR Route Id's for MR Header Id
2177 
2178      OPEN c_MR_route (l_MR_Id);
2179      FETCH c_MR_route INTO l_mr_route_id,l_stage_number;
2180      WHILE c_MR_route%FOUND LOOP
2181         MR_Route_Tbl(y) := l_mr_route_id;
2182         y := y + 1;
2183      FETCH c_MR_route INTO l_mr_route_id;
2184      END LOOP;
2185      CLOSE c_MR_route;
2186    */
2187 
2188    -- To retrieve all MR Route Id's for MR Header Id
2189    --  11.5.10 Changes by Senthil.
2190    -- AnRaj: Changes made for fixing bug#4919353, issue# 11
2191    SELECT T1.MR_ROUTE_ID, T1.STAGE
2192    BULK COLLECT INTO MR_Route_Tbl,l_Stage_num_Tbl
2193    FROM AHL_MR_ROUTES_V T1, AHL_ROUTES_B T2
2194    WHERE T1.MR_HEADER_ID = l_MR_Id
2195     AND T1.ROUTE_ID = T2.ROUTE_ID
2196     AND T2.revision_status_code = 'COMPLETE'
2197     AND T1.ROUTE_REVISION_NUMBER IN
2198         (SELECT MAX(T3.ROUTE_REVISION_NUMBER)
2199          FROM   AHL_MR_ROUTES_V T3
2200          WHERE  T3.MR_HEADER_ID = l_MR_Id
2201           AND T3.ROUTE_NUMBER = T1.ROUTE_NUMBER
2202          GROUP BY T3.ROUTE_NUMBER
2203         );
2204 
2205    -- To Create Planned Tasks
2206    i := 0 ;
2207    IF MR_Route_Tbl.COUNT > 0 THEN
2208       i := MR_Route_Tbl.FIRST;
2209       LOOP
2210          IF l_Stage_num_Tbl(i) IS NOT NULL THEN
2211             OPEN c_stage(l_Stage_num_Tbl(i),l_visit_id);
2212             FETCH c_stage INTO l_stage_id, l_stage_name ;
2213             IF c_stage%NOTFOUND THEN
2214                Fnd_Message.SET_NAME('AHL','AHL_VWP_STAGE_NO_EXIST');
2215                Fnd_Msg_Pub.ADD;
2216                CLOSE c_stage;
2217                RAISE FND_API.G_EXC_ERROR;
2218             END IF;
2219             CLOSE c_stage;
2220          END IF;
2221 ---  End of 11.5.10 Changes by Senthil.
2222 
2223          l_mr_route_id := MR_Route_Tbl(i);
2224 
2225          IF (l_log_statement >= l_log_current_level) THEN
2226             fnd_log.string(l_log_statement,
2227                            L_DEBUG_KEY,
2228                            'l_mr_route_id = ' || l_mr_route_id);
2229             fnd_log.string(l_log_statement,
2230                            L_DEBUG_KEY,
2231                            'Before calling INSERT_TASKS for Simple Task');
2232          END IF;
2233 
2234          INSERT_TASKS
2235             (p_visit_id        => l_visit_id,
2236              p_unit_id         => l_unit_id,
2237              p_serial_id       => l_serial_id,
2238              p_service_id      => l_service_req_id,
2239              p_dept_id         => l_department_id,
2240              p_item_id         => l_item_id,
2241              p_item_org_id     => l_org_id,
2242              p_mr_id           => l_MR_Id,
2243              p_MR_Route_id     => l_MR_route_id,
2244              p_parent_id       => l_parent_task_id,
2245              p_flag            => 'N',
2246              P_STAGE_ID        => l_stage_id,
2247              -- Added by rnahata for Issue 105 - pass the quantity for the simple tasks
2248              p_quantity        => p_quantity,
2249              x_task_id         => l_task_id,
2250              x_return_status   => l_return_status,
2251              x_msg_count       => l_msg_count,
2252              x_msg_data        => l_msg_data);
2253 
2254          IF (l_log_statement >= l_log_current_level) THEN
2255             fnd_log.string(l_log_statement,
2256                            L_DEBUG_KEY,
2257                            'After calling INSERT_TASKS for Simple Task. Task Id = ' || l_task_id ||
2258                            '. Visit ID = ' || l_visit_id);
2259          END IF;
2260 
2261          l_msg_count := FND_MSG_PUB.count_msg;
2262          IF l_msg_count > 0 OR l_return_status <> Fnd_Api.g_ret_sts_success THEN
2263             IF (l_log_statement >= l_log_current_level) THEN
2264                fnd_log.string(l_log_statement,
2265                               L_DEBUG_KEY,
2266                               'Errors from INSERT_TASKS. Message count: ' ||
2267                               l_msg_count || ', message data: ' || l_msg_data);
2268             END IF;
2269             x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2270             RAISE FND_API.G_EXC_ERROR;
2271          END IF;
2272 
2273          -- To call LTP Process Materials API for APS Integration by Shbhanda 04-Dec-03
2274          OPEN c_task_det(l_task_id);
2275          FETCH c_task_det INTO l_task_det;
2276          CLOSE c_task_det;
2277 
2278          IF l_task_det.start_date_time IS NOT NULL THEN
2279 
2280             IF (l_log_statement >= l_log_current_level) THEN
2281                fnd_log.string(l_log_statement,
2282                               L_DEBUG_KEY,
2283                               'PLANNED TASK - Before calling AHL_LTP_REQST_MATRL_PVT.Process_Planned_Materials');
2284             END IF;
2285             AHL_LTP_REQST_MATRL_PVT.Process_Planned_Materials (
2286                 p_api_version          => 1.0,
2287                 p_init_msg_list        => FND_API.g_false,
2288                 p_commit               => FND_API.g_false,
2289                 p_validation_level     => FND_API.g_valid_level_full,
2290                 p_visit_id             => l_Visit_Id,
2291                 p_visit_task_id        => l_Task_Id,
2292                 p_org_id               => NULL,
2293                 p_start_date           => NULL,
2294                 p_operation_flag       => 'C',
2295                 x_planned_order_flag   => l_planned_order_flag ,
2296                 x_return_status        => x_return_status,
2297                 x_msg_count            => l_msg_count,
2298                 x_msg_data             => l_msg_data );
2299             IF (l_log_statement >= l_log_current_level) THEN
2300                 fnd_log.string(l_log_statement,
2301                                L_DEBUG_KEY,
2302                                'PLANNED TASK - After calling AHL_LTP_REQST_MATRL_PVT.Process_Planned_Materials');
2303             END IF;
2304             l_msg_count := FND_MSG_PUB.count_msg;
2305             IF l_msg_count > 0 OR l_return_status <> Fnd_Api.g_ret_sts_success THEN
2306                 X_return_status := FND_API.G_RET_STS_ERROR;
2307                 RAISE FND_API.G_EXC_ERROR;
2308             END IF;
2309          END IF; --check for Visit Task Start Date
2310 
2311          EXIT WHEN i = MR_Route_Tbl.LAST ;
2312          i := MR_Route_Tbl.NEXT(i);
2313       END LOOP;
2314    END IF;
2315 
2316    x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
2317    IF (l_log_procedure >= l_log_current_level) THEN
2318       fnd_log.string(l_log_procedure,
2319                      L_DEBUG_KEY ||'.end',
2320                      'At the end of PL SQL procedure. Return Status = ' || x_return_status ||
2321                      ', p_x_parent_MR_Id = ' || p_x_parent_MR_Id);
2322    END IF;
2323 
2324   EXCEPTION
2325    WHEN NO_DATA_FOUND THEN
2326         x_return_status := Fnd_Api.G_RET_STS_ERROR;
2327    WHEN TOO_MANY_ROWS THEN
2328         x_return_status := Fnd_Api.G_RET_STS_ERROR;
2329    WHEN OTHERS THEN
2330         x_return_status := Fnd_Api.G_RET_STS_UNEXP_ERROR;
2331         RAISE;
2332 END Create_Tasks_for_MR;
2333 
2334 
2335 --------------------------------------------------------------------
2336 -- PROCEDURE
2337 --    Check_Cost_Parent_Loop
2338 --
2339 -- PURPOSE
2340 --    To check if the cost parent task not forming loop among other tasks
2341 --------------------------------------------------------------------
2342 PROCEDURE Check_Cost_Parent_Loop
2343     (p_visit_id       IN  NUMBER,
2344      p_visit_task_id  IN  NUMBER,
2345      p_cost_parent_id IN  NUMBER
2346     )
2347 IS
2348    -- Define local variables
2349    L_API_NAME  CONSTANT VARCHAR2(30)  := 'Check_Cost_Parent_Loop';
2350    L_DEBUG_KEY CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
2351 
2352   -- Define local cursors
2353   -- For all children of cost_parent_id
2354   CURSOR c_child (c_cost_id IN NUMBER, c_id IN NUMBER) IS
2355    SELECT VISIT_TASK_ID FROM AHL_VISIT_TASKS_B
2356    WHERE VISIT_ID = c_id
2357    START WITH COST_PARENT_ID = c_cost_id
2358    CONNECT BY PRIOR VISIT_TASK_ID = COST_PARENT_ID;
2359    c_child_rec c_child%ROWTYPE;
2360 
2361 BEGIN
2362   IF (l_log_procedure >= l_log_current_level) THEN
2363      fnd_log.string(l_log_procedure,
2364                     L_DEBUG_KEY ||'.begin',
2365                     'At the start of PL SQL procedure. Visit Id = ' || p_visit_id ||
2366                     'Visit Task Id = ' || p_visit_task_id || 'Cost Parent Id = ' || p_cost_parent_id);
2367   END IF;
2368   -- Check for cost parent task id not forming loop
2369   IF (p_cost_parent_id IS NOT NULL AND
2370       p_cost_parent_id <> Fnd_Api.G_MISS_NUM ) THEN
2371 
2372       IF p_cost_parent_id = p_visit_task_id THEN
2373          IF (l_log_statement >= l_log_current_level) THEN
2374             fnd_log.string(l_log_statement,
2375                            L_DEBUG_KEY,
2376                            'p_cost_parent_id = p_visit_task_id');
2377          END IF;
2378          Fnd_Message.SET_NAME('AHL','AHL_VWP_NO_COST_LOOP');
2379          Fnd_Msg_Pub.ADD;
2380          RAISE Fnd_Api.G_EXC_ERROR;
2381       END IF;
2382 
2383       OPEN c_child (p_visit_task_id, p_visit_id);
2384       LOOP
2385          FETCH c_child INTO c_child_rec;
2386 
2387          IF p_cost_parent_id = c_child_rec.VISIT_TASK_ID THEN
2388             IF (l_log_statement >= l_log_current_level) THEN
2389                fnd_log.string(l_log_statement,
2390                               L_DEBUG_KEY,
2391                               'TASK LOOP');
2392             END IF;
2393             Fnd_Message.SET_NAME('AHL','AHL_VWP_NO_COST_LOOP');
2394             Fnd_Msg_Pub.ADD;
2395             CLOSE c_child;
2396             RAISE Fnd_Api.G_EXC_ERROR;
2397          END IF;
2398          EXIT WHEN c_child%NOTFOUND;
2399       END LOOP;
2400       CLOSE c_child;
2401    END IF;
2402    IF (l_log_procedure >= l_log_current_level) THEN
2403       fnd_log.string(l_log_procedure,
2404                      L_DEBUG_KEY ||'.end',
2405                      'At the end of PL SQL procedure.');
2406    END IF;
2407 
2408 END Check_Cost_Parent_Loop;
2409 
2410 --------------------------------------------------------------------
2411 -- PROCEDURE
2412 --    Check_Origin_Task_Loop
2413 --
2414 -- PURPOSE
2415 --    To check if the originating task not forming loop among other tasks
2416 --------------------------------------------------------------------
2417 PROCEDURE Check_Origin_Task_Loop
2418   (p_visit_id            IN  NUMBER,
2419    p_visit_task_id       IN  NUMBER,
2420    p_originating_task_id IN NUMBER
2421    )
2422 IS
2423  -- Define local variables
2424    L_API_NAME  CONSTANT VARCHAR2(30) := 'Check_Origin_Task_Loop';
2425    L_DEBUG_KEY CONSTANT VARCHAR2(100):= 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
2426 
2427  -- Define local cursors
2428  -- For all children of originating_task_id
2429     CURSOR c_child (x_org_id IN NUMBER, x_id IN NUMBER) IS
2430      SELECT VISIT_TASK_ID FROM AHL_VISIT_TASKS_B
2431      WHERE VISIT_ID = x_id
2432       AND NVL(STATUS_CODE,'X') <> 'DELETED'
2433      START WITH ORIGINATING_TASK_ID = x_org_id
2434      CONNECT BY PRIOR VISIT_TASK_ID = ORIGINATING_TASK_ID;
2435     c_child_rec c_child%ROWTYPE;
2436 
2437 BEGIN
2438     IF (l_log_procedure >= l_log_current_level) THEN
2439        fnd_log.string(l_log_procedure,
2440                       L_DEBUG_KEY ||'.begin',
2441                       'At the start of PL SQL procedure. Visit Id = ' || p_visit_id || '. Visit Task Id = ' ||
2442                       p_visit_task_id || '. Originating Task Id' || p_originating_task_id);
2443     END IF;
2444     -- Check for originating task id not forming loop
2445     IF (p_originating_task_id IS NOT NULL AND
2446         p_originating_task_id <> Fnd_Api.G_MISS_NUM ) THEN
2447 
2448        IF p_originating_task_id = p_visit_task_id THEN
2449           IF (l_log_statement >= l_log_current_level) THEN
2450              fnd_log.string(l_log_statement,
2451                             L_DEBUG_KEY,
2452                             'TASK LOOP1');
2453           END IF;
2454           Fnd_Message.SET_NAME('AHL','AHL_VWP_NO_ORIGIN_LOOP');
2455           Fnd_Msg_Pub.ADD;
2456           RAISE Fnd_Api.G_EXC_ERROR;
2457        END IF;
2458 
2459        OPEN c_child (p_visit_task_id, p_visit_id);
2460        LOOP
2461        FETCH c_child INTO c_child_rec;
2462 
2463        IF p_originating_task_id = c_child_rec.VISIT_TASK_ID THEN
2464           IF (l_log_statement >= l_log_current_level) THEN
2465              fnd_log.string(l_log_statement,
2466                             L_DEBUG_KEY,
2467                             'TASK LOOP2');
2468           END IF;
2469 
2470           Fnd_Message.SET_NAME('AHL','AHL_VWP_NO_ORIGIN_LOOP');
2471           Fnd_Msg_Pub.ADD;
2472           CLOSE c_child;
2473           RAISE Fnd_Api.G_EXC_ERROR;
2474        END IF;
2475 
2476        EXIT WHEN c_child%NOTFOUND;
2477        END LOOP;
2478        CLOSE c_child;
2479     END IF;
2480     IF (l_log_procedure >= l_log_current_level) THEN
2481        fnd_log.string(l_log_procedure,
2482                       L_DEBUG_KEY ||'.end',
2483                       'At the end of PL SQL procedure.');
2484     END IF;
2485 END Check_Origin_Task_Loop;
2486 
2487 --------------------------------------------------------------------
2488 -- PROCEDURE
2489 --    Update_Visit_Task_Flag
2490 --
2491 -- PURPOSE
2492 --    To update visit entity any_task_chg_flag attribute whenever there
2493 --    are changes in visit task - either addition or deletion or change
2494 --    in cost parent of any task
2495 --------------------------------------------------------------------
2496 PROCEDURE Update_Visit_Task_Flag
2497     (p_visit_id       IN  NUMBER,
2498      p_flag           IN  VARCHAR2,
2499      x_return_status  OUT NOCOPY VARCHAR2
2500     )
2501 IS
2502  -- Define local variables
2503    L_API_NAME    CONSTANT VARCHAR2(30) := 'Update_Visit_Task_Flag';
2504    L_DEBUG_KEY   CONSTANT VARCHAR2(100):= 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
2505 
2506 BEGIN
2507    IF (l_log_procedure >= l_log_current_level) THEN
2508       fnd_log.string(l_log_procedure,
2509                      L_DEBUG_KEY ||'.begin',
2510                      'At the start of PL SQL procedure. Visit Id = ' || p_visit_id ||
2511                      'p_flag' || p_flag);
2512    END IF;
2513    x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
2514    IF p_visit_id  IS NOT NULL THEN
2515       UPDATE AHL_VISITS_B
2516       SET OBJECT_VERSION_NUMBER = OBJECT_VERSION_NUMBER + 1,
2517           ANY_TASK_CHG_FLAG = p_flag
2518       WHERE VISIT_ID = p_visit_id;
2519    END IF;
2520    IF (l_log_procedure >= l_log_current_level) THEN
2521       fnd_log.string(l_log_procedure,
2522                      L_DEBUG_KEY ||'.end',
2523                      'At the end of PL SQL procedure. Return Status = ' || x_return_status);
2524    END IF;
2525 END Update_Visit_Task_Flag;
2526 
2527 --------------------------------------------------------------------
2528 -- PROCEDURE
2529 --    Check_Price_List_Name_Or_Id
2530 --
2531 -- PURPOSE
2532 --    To find out price list id for price list name for a visit or tasks
2533 --------------------------------------------------------------------
2534 PROCEDURE Check_Price_List_Name_Or_Id(
2535      p_visit_id        IN         NUMBER,
2536      p_price_list_name IN         VARCHAR2,
2537      x_price_list_id   OUT NOCOPY NUMBER,
2538      x_return_status   OUT NOCOPY VARCHAR2
2539      ) IS
2540  -- Define local variables
2541    L_API_NAME  CONSTANT VARCHAR2(30) := 'Check_Price_List_Name_Or_Id';
2542    L_DEBUG_KEY CONSTANT VARCHAR2(100):= 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
2543 
2544    CURSOR visit_info_csr(p_visit_id IN NUMBER)IS
2545    SELECT service_request_id FROM ahl_visits_b
2546    WHERE visit_id = p_visit_id;
2547 
2548    l_service_request_id NUMBER;
2549 
2550    CURSOR customer_id_csr(p_service_request_id IN NUMBER)IS
2551    SELECT customer_id FROM CS_INCIDENTS_ALL_B
2552    WHERE incident_id = p_service_request_id;
2553 
2554    l_customer_id NUMBER;
2555 
2556    /*CURSOR price_list_id_csr(p_price_list_name IN VARCHAR2,p_customer_id IN NUMBER)IS
2557    SELECT qlhv.list_header_id
2558    FROM qp_list_headers_vl qlhv, FINANCIALS_SYSTEM_PARAMETERS FSP, qp_qualifiers qpq, GL_SETS_OF_BOOKS GSB
2559    WHERE FSP.set_of_books_id = GSB.set_of_books_id
2560    AND qlhv.list_type_code = 'PRL'
2561    AND qlhv.currency_code = gsb.currency_code
2562    AND UPPER(qlhv.name) like UPPER(p_price_list_name)
2563    AND qpq.QUALIFIER_ATTR_VALUE = p_customer_id
2564    AND qpq.list_header_id=qlhv.list_header_id
2565    AND  qpq.qualifier_context = 'CUSTOMER'
2566    AND  qpq.qualifier_attribute = 'QUALIFIER_ATTRIBUTE16'
2567    UNION
2568    SELECT qlhv.list_header_id
2569    FROM qp_list_headers_vl qlhv,oe_agreements oa, qp_qualifiers qpq, FINANCIALS_SYSTEM_PARAMETERS FSP, GL_SETS_OF_BOOKS GSB
2570    WHERE FSP.set_of_books_id = GSB.set_of_books_id
2571    AND ((oa.price_list_id = qlhv.list_header_id AND qlhv.list_type_code
2572    IN('PRL', 'AGR')) OR qlhv.list_type_code = 'PRL')
2573    AND qlhv.currency_code = gsb.currency_code
2574    AND UPPER(qlhv.name) like UPPER(p_price_list_name)
2575    AND qpq.QUALIFIER_ATTR_VALUE = p_customer_id
2576    AND qpq.list_header_id=qlhv.list_header_id
2577    AND  qpq.qualifier_context = 'CUSTOMER'
2578    AND  qpq.qualifier_attribute = 'QUALIFIER_ATTRIBUTE16';*/
2579 
2580    CURSOR price_list_id_csr(p_price_list_name IN VARCHAR2,p_customer_id IN NUMBER)IS
2581    SELECT qlhv.list_header_id
2582    from qp_list_headers_vl qlhv, qp_qualifiers qpq
2583    where qlhv.list_type_code = 'PRL'
2584    and upper(qlhv.name) like upper(p_price_list_name)
2585    and qpq.QUALIFIER_ATTR_VALUE = p_customer_id
2586    and qpq.list_header_id=qlhv.list_header_id
2587    and  qpq.qualifier_context = 'CUSTOMER'
2588    and  qpq.qualifier_attribute = 'QUALIFIER_ATTRIBUTE16';
2589 
2590 BEGIN
2591    IF (l_log_procedure >= l_log_current_level) THEN
2592       fnd_log.string(l_log_procedure,
2593                      L_DEBUG_KEY ||'.begin',
2594                      'At the start of PL SQL procedure. Visit Id = ' ||
2595                      p_visit_id || 'Price List Name = ' || p_price_list_name);
2596    END IF;
2597    -- Initialize API return status to success
2598    x_return_status := FND_API.G_RET_STS_SUCCESS;
2599 
2600    OPEN visit_info_csr(p_visit_id);
2601    FETCH visit_info_csr INTO l_service_request_id;
2602    IF (visit_info_csr%NOTFOUND) THEN
2603       FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_VWP_CST_INV_VISIT');
2604       FND_MSG_PUB.ADD;
2605       IF (l_log_unexpected >= l_log_current_level)THEN
2606          fnd_log.string(l_log_unexpected,
2607                         L_DEBUG_KEY,
2608                         'Visit id not found in AHL_VISITS_B table');
2609       END IF;
2610       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2611    ELSIF(l_service_request_id IS NULL)THEN
2612       FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_VWP_CST_INV_VISIT_UPDT_NOS');
2613       FND_MSG_PUB.ADD;
2614       IF (fnd_log.level_error >= l_log_current_level)THEN
2615          fnd_log.string(fnd_log.level_error,
2616                         L_DEBUG_KEY,
2617                         'price list can not be associated because service request id is not associated to visit');
2618       END IF;
2619       x_return_status := FND_API.G_RET_STS_ERROR;
2620    END IF;
2621    CLOSE visit_info_csr;
2622 
2623    IF(x_return_status <> FND_API.G_RET_STS_SUCCESS)THEN
2624       RETURN;
2625    END IF;
2626 
2627    OPEN customer_id_csr(l_service_request_id);
2628    FETCH customer_id_csr INTO l_customer_id;
2629    IF(customer_id_csr%NOTFOUND)THEN
2630       FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_VWP_CST_INV_SR_ID');
2631       FND_MSG_PUB.ADD;
2632       IF (l_log_unexpected >= l_log_current_level)THEN
2633          fnd_log.string(l_log_unexpected,
2634                         L_DEBUG_KEY,
2635                         'Associated Service Request ' || l_service_request_id ||
2636                         ' is invalid as record not found.');
2637       END IF;
2638       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2639    ELSIF(l_customer_id IS NULL)THEN
2640       FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_VWP_CST_INV_SRVREQ_NOCUST');
2641       FND_MSG_PUB.ADD;
2642       IF (fnd_log.level_error >= l_log_current_level)THEN
2643          fnd_log.string(fnd_log.level_error,
2644                         L_DEBUG_KEY,
2645                         'Customer id for corresponding service request ' || l_service_request_id || ' is null.');
2646       END IF;
2647       x_return_status := FND_API.G_RET_STS_ERROR;
2648    END IF;
2649    CLOSE customer_id_csr;
2650 
2651    IF (x_return_status <> FND_API.G_RET_STS_SUCCESS)THEN
2652       RETURN;
2653    END IF;
2654 
2655    -- find out the price list id
2656    OPEN price_list_id_csr(p_price_list_name,l_customer_id);
2657    FETCH price_list_id_csr INTO x_price_list_id;
2658    IF(price_list_id_csr%NOTFOUND)THEN
2659      FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_VWP_CST_PLIST_NFOUND');
2660      FND_MESSAGE.Set_Token('PRICE_LIST',p_price_list_name);
2661      FND_MSG_PUB.ADD;
2662      IF (fnd_log.level_error >= l_log_current_level)THEN
2663         fnd_log.string(fnd_log.level_error,
2664                        L_DEBUG_KEY,
2665                        'Valid price list not found with price list name ' || p_price_list_name);
2666       END IF;
2667       x_return_status := FND_API.G_RET_STS_ERROR;
2668    END IF;
2669    CLOSE price_list_id_csr;
2670 
2671    IF (x_return_status <> FND_API.G_RET_STS_SUCCESS)THEN
2672       RETURN;
2673    END IF;
2674    IF (l_log_procedure >= l_log_current_level) THEN
2675       fnd_log.string(l_log_procedure,
2676                      L_DEBUG_KEY ||'.end',
2677                      'At the end of PL SQL procedure. x_price_list_id = ' || x_price_list_id);
2678    END IF;
2679 
2680 END Check_Price_List_Name_Or_Id;
2681 --------------------------------------------------------------------
2682 -- PROCEDURE
2683 --    Update_Cost_Origin_Task
2684 --
2685 -- PURPOSE
2686 --    To update all tasks which have the deleting task as cost or originating task
2687 --------------------------------------------------------------------
2688 PROCEDURE Update_Cost_Origin_Task
2689     (p_visit_task_id  IN  NUMBER,
2690      x_return_status  OUT NOCOPY VARCHAR2
2691     )
2692 IS
2693    -- Define local variables
2694    L_API_NAME  CONSTANT VARCHAR2(30) := 'Update_Cost_Origin_Task';
2695    L_DEBUG_KEY CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
2696    l_task_id            NUMBER;
2697 
2698    -- To find any task which have originating id as deleted task id
2699    CURSOR c_origin (x_task_id IN NUMBER) IS
2700     SELECT Visit_Task_Id, Object_Version_Number
2701     FROM  Ahl_Visit_Tasks_VL
2702     WHERE ORIGINATING_TASK_ID = x_task_id;
2703    c_origin_rec      c_origin%ROWTYPE;
2704 
2705    -- To find any task which have parent id as deleted task id
2706    CURSOR c_parent (x_task_id IN NUMBER) IS
2707     SELECT Visit_Task_Id, Object_Version_Number
2708     FROM  Ahl_Visit_Tasks_VL
2709     WHERE COST_PARENT_ID = x_task_id;
2710    c_parent_rec      c_parent%ROWTYPE;
2711 
2712    -- Post 11.5.10
2713    --RR
2714    -- For updating the Cost Parent Task
2715    CURSOR c_parent_id(x_task_id IN NUMBER) IS
2716     SELECT cost_parent_id
2717     FROM AHL_VISIT_TASKS_VL
2718     WHERE visit_task_id = x_task_id;
2719    l_parent_id NUMBER;
2720    -- Post 11.5.10
2721    --RR
2722 BEGIN
2723 
2724    IF (l_log_procedure >= l_log_current_level) THEN
2725       fnd_log.string(l_log_procedure,
2726                      L_DEBUG_KEY ||'.begin',
2727                      'At the start of PL SQL procedure. Visit Task Id = ' || p_visit_task_id);
2728    END IF;
2729    l_task_id := p_visit_task_id;
2730 
2731    -- Post 11.5.10
2732    -- RR
2733    OPEN c_parent_id(l_task_id);
2734    FETCH c_parent_id INTO l_parent_id;
2735    CLOSE c_parent_id;
2736 
2737    -- To find if a task deleted is the "originating task" for another task,
2738    -- then association/s must be removed before the task can be deleted.
2739    OPEN c_origin (l_task_id);
2740    LOOP
2741        FETCH c_origin INTO c_origin_rec;
2742        EXIT WHEN c_origin%NOTFOUND;
2743        IF c_origin_rec.visit_task_id IS NOT NULL THEN
2744            IF (l_log_statement >= l_log_current_level) THEN
2745               fnd_log.string(l_log_statement,
2746                              L_DEBUG_KEY,
2747                              'update origin');
2748            END IF;
2749            UPDATE AHL_VISIT_TASKS_B SET ORIGINATING_TASK_ID = NULL,
2750            OBJECT_VERSION_NUMBER = c_origin_rec.object_version_number + 1
2751            WHERE VISIT_TASK_ID = c_origin_rec.visit_task_id;
2752        END IF;
2753    END LOOP;
2754    CLOSE c_origin;
2755 
2756    -- To find if a task deleted is the "cost parent task" for another task,
2757    -- then association/s must be removed before the task can be deleted.
2758    -- Post 11.5.10
2759    -- RR
2760    OPEN c_parent (l_task_id);
2761    LOOP
2762        FETCH c_parent INTO c_parent_rec;
2763        EXIT WHEN c_parent%NOTFOUND;
2764        IF c_parent_rec.visit_task_id IS NOT NULL THEN
2765           IF (l_log_statement >= l_log_current_level) THEN
2766               fnd_log.string(l_log_statement,
2767                              L_DEBUG_KEY,
2768                              'update parent');
2769           END IF;
2770           UPDATE AHL_VISIT_TASKS_B SET COST_PARENT_ID = l_parent_id,
2771           OBJECT_VERSION_NUMBER = c_parent_rec.object_version_number + 1
2772           WHERE VISIT_TASK_ID = c_parent_rec.visit_task_id;
2773        END IF;
2774    END LOOP;
2775    CLOSE c_parent;
2776    -- RR
2777    x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
2778    IF (l_log_procedure >= l_log_current_level) THEN
2779       fnd_log.string(l_log_procedure,
2780                      L_DEBUG_KEY ||'.end',
2781                      'At the end of PL SQL procedure. Return Status = ' || x_return_status);
2782    END IF;
2783 END Update_Cost_Origin_Task;
2784 
2785 --------------------------------------------------------------------
2786 -- PROCEDURE
2787 --    Merge_for_Unique_Items
2788 --
2789 -- PURPOSE
2790 --    To merge two item tables and remove the redundant items
2791 --    in table for which no price is defined
2792 --------------------------------------------------------------------
2793 PROCEDURE Merge_for_Unique_Items
2794     (p_item_tbl1  IN  Item_Tbl_Type,
2795      p_item_tbl2  IN  Item_Tbl_Type,
2796      x_item_tbl   OUT NOCOPY Item_Tbl_Type
2797      )
2798 IS
2799  -- Define local variables
2800    L_API_NAME  CONSTANT VARCHAR2(30) := 'Merge_for_Unique_Items';
2801    L_DEBUG_KEY CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
2802    l_index              NUMBER:=0;
2803    l_item_present       boolean:=false;
2804 BEGIN
2805 
2806    IF (l_log_procedure >= l_log_current_level) THEN
2807       fnd_log.string(l_log_procedure,
2808                      L_DEBUG_KEY ||'.begin',
2809                      'At the start of PL SQL procedure. p_item_tbl1.count = ' || p_item_tbl1.count ||
2810                      '. p_item_tbl2.count = ' || p_item_tbl2.count);
2811    END IF;
2812 
2813    IF p_item_tbl1.count > 0 THEN
2814       x_item_tbl := p_item_tbl1;
2815       l_index:=x_item_tbl.count;
2816    ELSE
2817       x_item_tbl := p_item_tbl2;
2818       RETURN;
2819    END IF;
2820 
2821    IF p_item_tbl2.count > 0 THEN
2822       FOR i IN p_item_tbl2.first ..p_item_tbl2.last
2823       LOOP
2824          l_item_present:=false;
2825          IF x_item_tbl.count > 0 THEN
2826             FOR k IN  x_item_tbl.first .. x_item_tbl.last
2827             LOOP
2828                IF x_item_tbl(k).item_id=p_item_tbl2(i).item_id
2829                AND  x_item_tbl(k).uom_code=p_item_tbl2(i).uom_code
2830                AND  x_item_tbl(k).effective_date=p_item_tbl2(i).effective_date
2831                THEN
2832                   IF x_item_tbl(k).duration is not NULL AND x_item_tbl(k).duration <> FND_API.G_MISS_NUM
2833                       AND p_item_tbl2(i).duration is not NULL AND p_item_tbl2(i).duration <> FND_API.G_MISS_NUM THEN
2834                       x_item_tbl(k).duration := nvl(x_item_tbl(k).duration,0)+nvl(p_item_tbl2(i).duration,0);
2835                       l_item_present:=true;
2836                   ELSIF (x_item_tbl(k).duration is NULL OR x_item_tbl(k).duration = FND_API.G_MISS_NUM )
2837                          AND (p_item_tbl2(i).duration is NULL OR p_item_tbl2(i).duration = FND_API.G_MISS_NUM) THEN
2838                          x_item_tbl(k).quantity := nvl(x_item_tbl(k).quantity,0)+nvl(p_item_tbl2(i).quantity,0);
2839                          l_item_present:=true;
2840                   END IF;
2841                END IF;
2842             END LOOP;
2843          END IF;
2844 
2845          IF l_item_present=FALSE THEN
2846             l_index:=l_index+1;
2847             x_item_tbl(l_index) := p_item_tbl2(i);
2848          END IF;
2849       END LOOP;
2850    END IF;
2851 
2852    IF (l_log_procedure >= l_log_current_level) THEN
2853       fnd_log.string(l_log_procedure,
2854                      L_DEBUG_KEY ||'.end',
2855                      'At the end of PL SQL procedure. x_item_tbl.COUNT = ' || x_item_tbl.COUNT);
2856    END IF;
2857 
2858 END Merge_for_Unique_Items;
2859 
2860 -------------------------------------------------------------------
2861 -- PROCEDURE
2862 --    Check_Item_in_Price_List
2863 --
2864 -- PURPOSE
2865 --    To Check if item of MR is defined in price list.
2866 --------------------------------------------------------------------
2867 /* commented as this is not being used anywhere
2868 PROCEDURE Check_Item_in_Price_List
2869     (p_price_list  IN   NUMBER,
2870      p_item_id       IN   NUMBER,
2871      x_item_chk_flag OUT  NOCOPY NUMBER
2872      )
2873 IS
2874  -- Define local variables
2875    L_API_NAME    CONSTANT VARCHAR2(30) := 'Check_Item_in_Price_List';
2876    L_DEBUG_KEY   CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
2877    l_item_chk_flag        VARCHAR2(1) ;
2878    I                      NUMBER;
2879 
2880      CURSOR c_task(p_visit_id NUMBER, p_tsk_id NUMBER) IS
2881      SELECT visit_task_id, originating_task_id
2882      FROM AHL_VISIT_TASKS_B
2883      WHERE VISIT_ID = p_visit_id
2884       AND VISIT_TASK_ID = p_tsk_id
2885       AND (STATUS_CODE IS NULL OR STATUS_CODE <> 'DELETED');
2886      c_task_rec c_task%ROWTYPE;
2887 
2888 BEGIN
2889 
2890    OPEN c_task(p_price_list, p_item_id);
2891    LOOP
2892       FETCH c_task INTO c_task_rec;
2893       EXIT WHEN c_task%NOTFOUND;
2894 
2895       IF c_task_rec.originating_task_id IS NOT NULL THEN
2896          l_item_chk_flag := 'Y';
2897          Check_Item_in_Price_List
2898          ( p_price_list   => p_price_list,
2899            p_item_id      => c_task_rec.originating_task_id,
2900            x_item_chk_flag  => l_item_chk_flag);
2901 
2902          IF (l_log_procedure >= l_log_current_level)THEN
2903             fnd_log.string(l_log_procedure,
2904                            L_DEBUG_KEY||'.end',
2905                            'Check for RECURSIVE task id = ' || p_item_id);
2906          END IF;
2907       ELSE
2908          l_item_chk_flag := 'N';
2909          IF (l_log_procedure >= l_log_current_level)THEN
2910             fnd_log.string(l_log_procedure,
2911                            L_DEBUG_KEY||'.end',
2912                            'Check for NON RECURSIVE task id = ' || p_item_id);
2913          END IF;
2914       END IF;
2915       I:=I+1;
2916    END LOOP;
2917    CLOSE c_task;
2918 
2919 END Check_Item_in_Price_List;
2920 */
2921 
2922 --------------------------------------------------------------------
2923 -- PROCEDURE
2924 --    Check_Currency_for_Costing
2925 --
2926 -- PURPOSE
2927 --    To used to retrieve currency code and pass as input parameter to Pricing API
2928 --------------------------------------------------------------------
2929 PROCEDURE Check_Currency_for_Costing
2930     (p_visit_id   IN  NUMBER,
2931      x_currency_code OUT NOCOPY VARCHAR2
2932      )
2933 IS
2934    -- Define local variables
2935    L_API_NAME  CONSTANT VARCHAR2(30) := 'Check_Currency_for_Costing';
2936    L_DEBUG_KEY CONSTANT VARCHAR2(100):= 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
2937 
2938    CURSOR organization_csr(p_visit_id IN NUMBER)IS
2939     SELECT VST.organization_id FROM AHL_VISITS_B VST
2940     WHERE VST.visit_id = p_visit_id;
2941 
2942    l_org_id NUMBER;
2943 
2944    -- AnRaj:Changes made for fixing bug#4919353, issue# 7
2945    CURSOR currency_code_csr(p_org_id IN NUMBER) IS
2946     SELECT currency_code
2947     FROM cst_acct_info_v COD, GL_SETS_OF_BOOKS GSOB
2948     WHERE COD.Organization_Id = p_org_id
2949      AND LEDGER_ID = GSOB.SET_OF_BOOKS_ID
2950      AND NVL(operating_unit, mo_global.get_current_org_id())= mo_global.get_current_org_id();
2951 
2952    /*SELECT currency_code
2953    -- into x_currency_code
2954    FROM   CST_ORGANIZATION_DEFINITIONS COD --,AHL_VISITS_B VST
2955    WHERE --VST.visit_id = p_visit_id AND
2956    --COD.Organization_Id = VST.organization_id
2957    COD.Organization_Id = p_org_id
2958    AND NVL(operating_unit, mo_global.get_current_org_id())
2959        = mo_global.get_current_org_id();*/
2960 
2961 BEGIN
2962 
2963    IF (l_log_procedure >= l_log_current_level) THEN
2964       fnd_log.string(l_log_procedure,
2965                      L_DEBUG_KEY ||'.begin',
2966                      'At the start of PL SQL procedure. Visit Id = ' || p_visit_id);
2967    END IF;
2968    -- FETCH organization id
2969    OPEN organization_csr(p_visit_id);
2970    FETCH organization_csr INTO l_org_id;
2971    CLOSE organization_csr;
2972 
2973    IF (l_org_id IS NOT NULL)THEN
2974       OPEN currency_code_csr(l_org_id);
2975       FETCH currency_code_csr INTO x_currency_code;
2976       IF (currency_code_csr%NOTFOUND)THEN
2977          FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_VWP_CST_NO_CURRENCY');
2978          FND_MSG_PUB.ADD;
2979          IF (fnd_log.level_error >= l_log_current_level)THEN
2980             fnd_log.string(fnd_log.level_error,
2981                            L_DEBUG_KEY,
2982                            'No curency is defined for the organization of the visit. l_org_id = ' || l_org_id);
2983          END IF;
2984       END IF;
2985       CLOSE currency_code_csr;
2986    END IF;
2987 
2988    IF (l_log_procedure >= l_log_current_level) THEN
2989       fnd_log.string(l_log_procedure,
2990                      L_DEBUG_KEY ||'.end',
2991                      'At the end of PL SQL procedure. Currency Code = ' || x_currency_code);
2992    END IF;
2993 END Check_Currency_for_Costing;
2994 -------------------------------------------------------------------------------
2995 -- PROCEDURE
2996 --    Check_Job_Status
2997 --
2998 -- PURPOSE
2999 --    To find out valid job status on shop floor for a Visit/MR/Task
3000 -------------------------------------------------------------------------------
3001 PROCEDURE Check_Job_Status
3002     (p_id             IN         NUMBER,
3003      p_is_task_flag   IN         VARCHAR2,
3004      x_status_code    OUT NOCOPY NUMBER,
3005      x_status_meaning OUT NOCOPY VARCHAR2
3006      )
3007 IS
3008   -- Define local variables
3009   L_API_NAME  CONSTANT VARCHAR2(30)  := 'Check_Job_Status';
3010   L_DEBUG_KEY CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
3011 
3012   -- To find if job exists for the visit at shop floor not in Cancelled-7 Or Deleted-22
3013   CURSOR c_job(x_id IN NUMBER) IS
3014    SELECT AWO.STATUS_CODE, FLV.MEANING
3015    FROM AHL_WORKORDERS AWO, FND_LOOKUP_VALUES_VL FLV
3016    WHERE AWO.VISIT_ID = x_id
3017     AND AWO.STATUS_CODE <> 7 AND AWO.STATUS_CODE <> 22
3018     AND FLV.LOOKUP_TYPE(+) = 'AHL_JOB_STATUS'
3019     AND AWO.STATUS_CODE = FLV.LOOKUP_CODE(+)
3020     AND AWO.MASTER_WORKORDER_FLAG = 'Y'
3021     AND AWO.VISIT_TASK_ID IS NULL;
3022 
3023   -- To find if job exists for the Task/MR at shop floor not in Cancelled-7 Or Deleted-22
3024   CURSOR c_job_tsk(x_id IN NUMBER)IS
3025    SELECT AWO.STATUS_CODE, FLV.MEANING
3026    FROM AHL_WORKORDERS AWO, FND_LOOKUP_VALUES_VL FLV
3027    WHERE AWO.VISIT_TASK_ID = x_id
3028     AND AWO.STATUS_CODE <> 7 AND AWO.STATUS_CODE <> 22
3029     AND FLV.LOOKUP_TYPE(+) = 'AHL_JOB_STATUS'
3030     AND AWO.STATUS_CODE = FLV.LOOKUP_CODE(+);
3031 BEGIN
3032     IF (l_log_procedure >= l_log_current_level) THEN
3033        fnd_log.string(l_log_procedure,
3034                       L_DEBUG_KEY ||'.begin',
3035                       'At the start of PL SQL procedure. Visit OR Task Id = ' || p_id ||
3036                       'p_is_task_flag = '|| p_is_task_flag);
3037     END IF;
3038 
3039     IF p_is_task_flag = 'N' THEN -- For Visit
3040        OPEN c_job(p_id);
3041        FETCH c_job INTO x_status_code, x_status_meaning;
3042        CLOSE c_job;
3043     ELSE -- For MR/Task
3044        OPEN c_job_tsk(p_id);
3045        FETCH c_job_tsk INTO x_status_code, x_status_meaning;
3046        CLOSE c_job_tsk;
3047    END IF;
3048 
3049    IF (l_log_procedure >= l_log_current_level) THEN
3050       fnd_log.string(l_log_procedure,
3051                      L_DEBUG_KEY ||'.end',
3052                      'At the end of PL SQL procedure. Status Code = '|| x_status_code ||
3053                      'Status Meaning = ' || x_status_meaning);
3054    END IF;
3055 
3056 END Check_Job_Status;
3057 
3058 -------------------------------------------------------------------------------
3059 -- PROCEDURE
3060 --    Check_Department_Shift
3061 --
3062 -- PURPOSE
3063 --    To find out valid job status on shop floor for a Visit/MR/Task
3064 -------------------------------------------------------------------------------
3065 PROCEDURE Check_Department_Shift(
3066     p_dept_id        IN            NUMBER,
3067     x_return_status  OUT NOCOPY    VARCHAR2
3068 )
3069 is
3070 L_DUMMY VARCHAR2(1);
3071 L_API_NAME  CONSTANT VARCHAR2(30)  := 'Check_Department_Shift';
3072 L_DEBUG_KEY CONSTANT VARCHAR2(100) := 'ahl.plsql.' || G_PKG_NAME || '.' || L_API_NAME;
3073 --
3074 CURSOR get_dept_csr (p_dept_id IN NUMBER) IS
3075  SELECT 'x'
3076  FROM AHL_DEPARTMENT_SHIFTS
3077  WHERE DEPARTMENT_ID = P_DEPT_ID;
3078 --
3079 BEGIN
3080    IF (l_log_procedure >= l_log_current_level) THEN
3081       fnd_log.string(l_log_procedure,
3082                      L_DEBUG_KEY ||'.begin',
3083                      'At the start of PL SQL procedure. Department Id = ' || p_dept_id);
3084    END IF;
3085    IF P_DEPT_ID IS NOT NULL AND P_DEPT_ID <> FND_API.G_MISS_NUM
3086    THEN
3087       OPEN get_dept_csr (p_dept_id);
3088       FETCH get_dept_csr INTO l_dummy;
3089       IF (get_dept_csr%NOTFOUND) THEN
3090           x_return_status:= Fnd_Api.G_RET_STS_ERROR;
3091       ELSE
3092           x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
3093       END IF;
3094       CLOSE get_dept_csr;
3095    ELSE
3096       x_return_status := Fnd_Api.G_RET_STS_SUCCESS;
3097    END IF;
3098    IF (l_log_procedure >= l_log_current_level) THEN
3099       fnd_log.string(l_log_procedure,
3100                      L_DEBUG_KEY ||'.end',
3101                      'At the end of PL SQL procedure. Return Status = ' || x_return_status);
3102    END IF;
3103 END CHECK_DEPARTMENT_SHIFT;
3104 
3105 END AHL_VWP_RULES_PVT;