DBA Data[Home] [Help]

PACKAGE BODY: APPS.AHL_COMPLEX_MX_RWSC_PVT

Source


1 PACKAGE BODY AHL_COMPLEX_MX_RWSC_PVT AS
2 /* $Header: AHLVRWSB.pls 120.0.12020000.5 2013/02/19 23:22:07 sikumar noship $ */
3 
4 G_PKG_NAME   VARCHAR2(30)  := 'AHL_COMPLEX_MX_RWSC_PVT';
5 
6 -- Private Procedure
7 PROCEDURE get_uc_details(
8         p_unit_header_id      IN     NUMBER,
9         p_visit_id            IN	 NUMBER,
10         x_uc_details_tbl      OUT NOCOPY visit_ir_uc_details_tbl_type);
11 
12 PROCEDURE get_instance_details(
13         p_item_instance_id         IN         NUMBER,
14         p_visit_id                 IN	      NUMBER,
15         x_instance_details_tbl     OUT NOCOPY visit_ir_uc_details_tbl_type);
16 
17 PROCEDURE Create_Instance_Routing (
18    p_visit_id               IN            NUMBER,
19    p_item_instance_id       IN            NUMBER,
20    p_inst_routing_code      IN            VARCHAR2,
21    x_inst_routing_id        OUT NOCOPY    NUMBER,
22    x_return_status          OUT NOCOPY    VARCHAR2);
23 
24 PROCEDURE Update_Instance_Routing (
25    p_inst_routing_id        IN  NUMBER,
26    p_object_version_number  IN  NUMBER,
27    p_inst_routing_code      IN  VARCHAR2,
28    x_return_status          OUT NOCOPY    VARCHAR2);
29 
30 PROCEDURE Delete_Instance_Routing (
31     p_inst_routing_id  IN     NUMBER,
32     x_return_status       OUT NOCOPY    VARCHAR2);
33 
34 PROCEDURE Process_Inst_Rtng_Notes(
35   p_visit_id             IN NUMBER,
36   p_instance_id          IN NUMBER,
37   p_old_inst_rtng_code   IN VARCHAR2 := NULL,
38   p_new_inst_rtng_code   IN VARCHAR2 := NULL,
39   x_return_status        OUT NOCOPY VARCHAR2,
40   x_msg_count            OUT NOCOPY NUMBER,
41   x_msg_data             OUT NOCOPY VARCHAR2
42 ) ;
43 
44 -- Private Functions
45 FUNCTION Get_Build_Goal_Per_For_Pos(p_current_instance_id  NUMBER) RETURN NUMBER;
46 
47 ------------------------------------------------------------------------------------------------------
48 -- Start of Comments
49 --  Procedure name    : Get_visit_ir_uc_details
50 --  Type              : Public
51 --  Function          : This procedure will update the temparory table to show data in hGrid.
52 --                      Since this table is global temporary with ON COMMIT DELETE ROWS,
53 --                      Always call this method with p_commit value : FND_API.G_FALSE
54 --  Pre-reqs          :
55 --  Parameters        :
56 --
57 --  Get_visit_ir_uc_details Parameters
58 --       p_unit_header_id     IN	   NUMBER
59 --       p_item_instance_id   IN	   NUMBER
60 --       p_visit_id           IN	   NUMBER
61 --
62 --  End of Comments
63 -------------------------------------------------------------------------------------------------------
64 PROCEDURE Get_visit_ir_uc_details
65  (
66    	p_api_version        IN    NUMBER     := 1.0,
67    	p_init_msg_list      IN    VARCHAR2   := FND_API.G_FALSE,
68    	p_commit             IN    VARCHAR2   := FND_API.G_FALSE,
69    	p_validation_level   IN    NUMBER     := FND_API.G_VALID_LEVEL_FULL,
70    	p_default            IN    VARCHAR2   := FND_API.G_FALSE,
71    	p_module_type        IN    VARCHAR2   := NULL,
72  	p_unit_header_id     IN	   NUMBER,
73  	p_item_instance_id   IN	   NUMBER,
74  	p_visit_id           IN	   NUMBER,
75    	x_visit_ir_uc_details_tbl        OUT NOCOPY    visit_ir_uc_details_tbl_type,
76    	x_return_status                  OUT NOCOPY    VARCHAR2,
77    	x_msg_count                      OUT NOCOPY    NUMBER,
78    	x_msg_data                       OUT NOCOPY    VARCHAR2
79  )IS
80 
81  l_api_name       CONSTANT   VARCHAR2(30)   := 'Get_visit_ir_uc_details';
82  l_api_version    CONSTANT   NUMBER         := 1.0;
83 
84  CURSOR get_record_count IS
85   SELECT COUNT(1) from  ahl_visit_ir_uc_details;
86 
87  CURSOR is_visit_present(c_visit_id IN NUMBER) IS
88   SELECT COUNT(1) FROM AHL_VISIT_IR_UC_DETAILS WHERE visit_id = c_visit_id;
89 
90  CURSOR is_inst_present(c_instance_id IN NUMBER) IS
91   SELECT COUNT(1) FROM AHL_VISIT_IR_UC_DETAILS WHERE root_instance_id = c_instance_id;
92 
93  l_count NUMBER;
94  l_count_instance NUMBER;
95  l_count_visit NUMBER;
96 
97  BEGIN
98    --Initialize API return status to success
99   x_return_status := FND_API.G_RET_STS_SUCCESS;
100 
101   --Standard call to check for call compatibility.
102   IF NOT FND_API.compatible_api_call(
103     l_api_version,
104     p_api_version,
105     l_api_name,
106     G_PKG_NAME)
107   THEN
108     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
109   END IF;
110 
111   --Initialize message list if p_init_msg_list is set to TRUE.
112   IF FND_API.to_boolean( p_init_msg_list ) THEN
113     FND_MSG_PUB.initialize;
114   END IF;
115 
116   -- This table stores details of only one visit temporarily.
117   OPEN is_visit_present(p_visit_id);
118   FETCH is_visit_present  INTO l_count_visit;
119   CLOSE is_visit_present;
120 
121   IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
122       FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
123                    'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name,
124                    'Records having Visit id ' || p_visit_id || ': ' || l_count_visit);
125   END IF;
126 
127    /* This is global temparary table with ON COMMIT DELETE ROWS, hence its all values will be in sync with respective origin always-
128       If the visit in context is changed then we need to populate the temp table again.
129       If the visit in context is same and user has selected another unit/instance, retain the values in the table
130       There will be records in table only for one visit
131     */
132    IF l_count_visit = 0 THEN
133      IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
134        FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
135                    'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name,
136                    'Deleting all rows in ahl_visit_ir_uc_details');
137      END IF;
138 
139      -- even if table rows are zero it will not throw error.
140      DELETE FROM ahl_visit_ir_uc_details;
141 
142      IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
143        FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
144                    'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name,
145                    'all rows in ahl_visit_ir_uc_details deleted');
146      END IF;
147 
148    END IF;
149 
150    OPEN is_inst_present(p_item_instance_id);
151    FETCH is_inst_present INTO l_count_instance;
152    CLOSE is_inst_present;
153 
154    IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
155       FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
156                    'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name,
157                    'Records having inst id ' || p_item_instance_id || ': ' || l_count_instance);
158    END IF;
159 
160    -- if p_item_instance_id is not present: table does not have record for this.
161    -- insert new row in the table.
162    IF l_count_instance = 0 THEN
163         IF(p_unit_header_id IS NOT NULL)THEN
164            get_uc_details(
165               p_unit_header_id      => p_unit_header_id,
166               p_visit_id            => p_visit_id,
167               x_uc_details_tbl      => x_visit_ir_uc_details_tbl);
168         ELSIF(p_item_instance_id IS NOT NULL)THEN
169               get_instance_details(
170               p_item_instance_id       => p_item_instance_id,
171               p_visit_id               => p_visit_id,
172               x_instance_details_tbl   => x_visit_ir_uc_details_tbl);
173         END IF;
174 
175         IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
176           FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
177                          'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name,
178                          'New row Count ' || x_visit_ir_uc_details_tbl.count);
179         END IF;
180 
181         IF x_visit_ir_uc_details_tbl.FIRST IS NOT NULL THEN
182           FOR i IN x_visit_ir_uc_details_tbl.FIRST..x_visit_ir_uc_details_tbl.LAST LOOP
183              INSERT INTO ahl_visit_ir_uc_details
184              (
185                visit_ir_uc_id,
186                root_instance_id,
187                unit_header_id,
188                unit_name,
189                path_position_id,
190                relationship_id,
191                parent_rel_id,
192                curr_item_id,
193                curr_instance_id,
194                parent_instance_id,
195                curr_item_number,
196                curr_instance_number,
197                curr_serial_number,
198                position,
199                position_image,
200                item_group_id,
201                item_group_name,
202                reserved_serial_num,
203                available_parts,
204                unit_nha,
205                is_unit,
206                is_warranty_available,
207                mr_count,
208                task_count,
209                is_visit_available,
210                mc_header_id,
211                is_sb_rule_available,
212                route_dispositions_flag,
213                rd_rework_percent,
214                rd_replace_percent,
215                position_material_flag,
216                bg_position,
217                bg_instance,
218                inst_routing_id,
219                inst_routing_ovn,
220                visit_id,
221                inst_routing_code,
222                inst_routing_meaning,
223                inst_routing_flag,
224                qty_per_position,
225                installed_qty,
226                leaf_node_flag,
227                node_level,
228                hgrid_node_path
229              )VALUES
230              (
231                x_visit_ir_uc_details_tbl(i).visit_ir_uc_id,
232                x_visit_ir_uc_details_tbl(i).root_instance_id,
233                x_visit_ir_uc_details_tbl(i).unit_header_id,
234                x_visit_ir_uc_details_tbl(i).unit_name,
235                x_visit_ir_uc_details_tbl(i).path_position_id,
236                x_visit_ir_uc_details_tbl(i).relationship_id,
237                x_visit_ir_uc_details_tbl(i).parent_rel_id,
238                x_visit_ir_uc_details_tbl(i).curr_item_id,
239                x_visit_ir_uc_details_tbl(i).curr_instance_id,
240                x_visit_ir_uc_details_tbl(i).parent_instance_id,
241                x_visit_ir_uc_details_tbl(i).curr_item_number,
242                x_visit_ir_uc_details_tbl(i).curr_instance_number,
243                x_visit_ir_uc_details_tbl(i).curr_serial_number,
244                x_visit_ir_uc_details_tbl(i).position,
245                x_visit_ir_uc_details_tbl(i).position_image,
246                x_visit_ir_uc_details_tbl(i).item_group_id,
247                x_visit_ir_uc_details_tbl(i).item_group_name,
248                x_visit_ir_uc_details_tbl(i).reserved_serial_num,
249                x_visit_ir_uc_details_tbl(i).available_parts,
250                x_visit_ir_uc_details_tbl(i).unit_nha,
251                x_visit_ir_uc_details_tbl(i).is_unit,
252                x_visit_ir_uc_details_tbl(i).is_warranty_available,
253                x_visit_ir_uc_details_tbl(i).mr_count,
254                x_visit_ir_uc_details_tbl(i).task_count,
255                x_visit_ir_uc_details_tbl(i).is_visit_available,
256                x_visit_ir_uc_details_tbl(i).mc_header_id,
257                x_visit_ir_uc_details_tbl(i).is_sb_rule_available,
258                x_visit_ir_uc_details_tbl(i).route_dispositions_flag,
259                x_visit_ir_uc_details_tbl(i).rd_rework_percent,
260                x_visit_ir_uc_details_tbl(i).rd_replace_percent,
261                x_visit_ir_uc_details_tbl(i).position_material_flag,
262                x_visit_ir_uc_details_tbl(i).bg_position,
263                x_visit_ir_uc_details_tbl(i).bg_instance,
264                x_visit_ir_uc_details_tbl(i).inst_routing_id,
265                x_visit_ir_uc_details_tbl(i).inst_routing_ovn,
266                x_visit_ir_uc_details_tbl(i).visit_id,
267                x_visit_ir_uc_details_tbl(i).inst_routing_code,
268                x_visit_ir_uc_details_tbl(i).inst_routing_meaning,
269                x_visit_ir_uc_details_tbl(i).inst_routing_flag,
270                x_visit_ir_uc_details_tbl(i).qty_per_position,
271                x_visit_ir_uc_details_tbl(i).installed_qty,
272                x_visit_ir_uc_details_tbl(i).leaf_node_flag,
273                x_visit_ir_uc_details_tbl(i).node_level,
274                x_visit_ir_uc_details_tbl(i).hgrid_node_path
275              );
276           END LOOP;
277         END IF;
278 
279         IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
280           FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
281                          'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name,
282                          'Newly Inserted Rows' || x_visit_ir_uc_details_tbl.count);
283         END IF;
284 
285         -- Update Build  goal for Position
286         l_count := Get_Build_Goal_Per_For_Pos(p_item_instance_id);
287 
288         IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
289           FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, 'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name,
290                          'Update Done root build goal ' || l_count);
291         END IF;
292 
293    END IF; -- l_count_instance check if
294 
295  OPEN get_record_count;
296  FETCH get_record_count INTO l_count;
297  CLOSE get_record_count;
298 
299  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
300     FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
301                    'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name,
302                    'Records in Table are ' || l_count);
303  END IF;
304 
305   IF(p_commit = FND_API.G_TRUE) THEN
306     COMMIT WORK;
307   END IF;
308 
309   -- Get all the error messages from the previous steps (if any) and raise the appropriate Exception
310   x_msg_count := FND_MSG_PUB.count_msg;
311   IF x_msg_count > 0 THEN
312     RAISE FND_API.G_EXC_ERROR;
313   END IF;
314 
315   -- Count and Get messages (optional)
316   FND_MSG_PUB.count_and_get(
317     p_encoded  => FND_API.G_FALSE,
318     p_count    => x_msg_count,
319     p_data     => x_msg_data);
320 
321 EXCEPTION
322   WHEN FND_API.G_EXC_ERROR THEN
323     x_return_status := FND_API.G_RET_STS_ERROR ;
324     FND_MSG_PUB.count_and_get(
325       p_encoded  => FND_API.G_FALSE,
326       p_count    => x_msg_count,
327       p_data     => x_msg_data);
328 
329   WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
330     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
331     FND_MSG_PUB.count_and_get(
332       p_encoded  => FND_API.G_FALSE,
333       p_count    => x_msg_count,
334       p_data     => x_msg_data);
335 
336   WHEN OTHERS THEN
337     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
338     IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
339     THEN
340       FND_MSG_PUB.add_exc_msg(
341         p_pkg_name         => G_PKG_NAME,
342         p_procedure_name   => l_api_name,
343         p_error_text       => SUBSTRB(SQLERRM,1,240));
344     END IF;
345     FND_MSG_PUB.count_and_get(
346       p_encoded  => FND_API.G_FALSE,
347       p_count    => x_msg_count,
348       p_data     => x_msg_data);
349 END Get_visit_ir_uc_details;
350 
351 ------------------------------------------------------------------------------------------------------
352 -- Start of Comments
353 --  Procedure name    : Process_instance_routings
354 --  Type              : Public
355 --  Function          : This procedure will update the table AHL_VISIT_INST_ROUTINGS
356 -- OLD_INST_ROUTING_CODE params is old INST_ROUTING_CODE, used for update/delete case
357 --  Pre-reqs          :
358 --  Parameters        :
359 --
360 --  Get_visit_ir_uc_details Parameters
361 --       p_x_instance_routings_tbl IN    OUT NOCOPY    instance_routings_tbl_type
362 --
363 --  End of Comments
364 -------------------------------------------------------------------------------------------------------
365 PROCEDURE Process_instance_routings
366  (
367     p_api_version             IN    NUMBER     := 1.0,
368     p_init_msg_list           IN    VARCHAR2   := FND_API.G_FALSE,
369     p_commit                  IN    VARCHAR2   := FND_API.G_FALSE,
370     p_validation_level        IN    NUMBER     := FND_API.G_VALID_LEVEL_FULL,
371     p_default                 IN    VARCHAR2   := FND_API.G_FALSE,
372     p_module_type             IN    VARCHAR2   := NULL,
373     p_x_instance_routings_tbl IN  OUT NOCOPY   instance_routings_tbl_type,
374     x_return_status               OUT NOCOPY   VARCHAR2,
375     x_msg_count                   OUT NOCOPY   NUMBER,
376     x_msg_data                    OUT NOCOPY   VARCHAR2
377  )IS
378 
379  l_api_name       CONSTANT   VARCHAR2(30)   := 'Process_instance_routings';
380  l_api_version    CONSTANT   NUMBER         := 1.0;
381  l_inst_routing_id           NUMBER;
382  l_msg_count                 NUMBER;
383  l_msg_data                  VARCHAR2(2000);
384  l_return_status             VARCHAR2(1);
385 
386  BEGIN
387 
388   SAVEPOINT Process_instance_routings;
389 
390   --Initialize API return status to success
391   x_return_status := FND_API.G_RET_STS_SUCCESS;
392 
393   --Standard call to check for call compatibility.
394   IF NOT FND_API.compatible_api_call(
395     l_api_version,
396     p_api_version,
397     l_api_name,
398     G_PKG_NAME)
399   THEN
400     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
401   END IF;
402 
403   --Initialize message list if p_init_msg_list is set to TRUE.
404   IF FND_API.to_boolean( p_init_msg_list ) THEN
405     FND_MSG_PUB.initialize;
406   END IF;
407 
408   IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
409     FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, 'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name,
410                    'Rows Count ' || p_x_instance_routings_tbl.count);
411   END IF;
412 
413   IF p_x_instance_routings_tbl.FIRST IS NOT NULL THEN
414     FOR i IN p_x_instance_routings_tbl.FIRST..p_x_instance_routings_tbl.LAST LOOP
415       IF p_x_instance_routings_tbl(i).inst_routing_id IS NOT NULL THEN
416         IF p_x_instance_routings_tbl(i).inst_routing_code IS NOT NULL THEN
417            -- update record in table
418            Update_Instance_Routing (
419                p_inst_routing_id        => p_x_instance_routings_tbl(i).inst_routing_id,
420                p_object_version_number  => p_x_instance_routings_tbl(i).object_version_number,
421                p_inst_routing_code      => p_x_instance_routings_tbl(i).inst_routing_code,
422                x_return_status          => l_return_status
423            );
424            IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
425              RAISE FND_API.G_EXC_ERROR;
426            END IF;
427         ELSE
428           --  delete record from table
429           Delete_Instance_Routing (
430                p_inst_routing_id  => p_x_instance_routings_tbl(i).inst_routing_id,
431                x_return_status    => l_return_status
432           );
433           IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
434             RAISE FND_API.G_EXC_ERROR;
435           END IF;
436         END IF;
437       ELSE
438         -- Create New record in table
439         Create_Instance_Routing (
440            p_visit_id           => p_x_instance_routings_tbl(i).visit_id,
441            p_item_instance_id   => p_x_instance_routings_tbl(i).instance_id,
442            p_inst_routing_code  => p_x_instance_routings_tbl(i).inst_routing_code,
443            x_inst_routing_id    => l_inst_routing_id,
444            x_return_status      => l_return_status
445         );
446         IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
447           RAISE FND_API.G_EXC_ERROR;
448         END IF;
449 
450          --Assign out param
451 	    p_x_instance_routings_tbl(i).inst_routing_id := l_inst_routing_id;
452       END IF;
453 
454       --call WO turnover notes procedure
455       Process_Inst_Rtng_Notes(
456         p_visit_id             => p_x_instance_routings_tbl(i).visit_id,
457         p_instance_id          => p_x_instance_routings_tbl(i).instance_id,
458         p_old_inst_rtng_code   => p_x_instance_routings_tbl(i).old_inst_routing_code,
459         p_new_inst_rtng_code   => p_x_instance_routings_tbl(i).inst_routing_code,
460         x_return_status        => l_return_status,
461         x_msg_count            => l_msg_count,
462         x_msg_data             => l_msg_data
463       );
464       IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
465         RAISE FND_API.G_EXC_ERROR;
466       END IF;
467     END LOOP;
468   END IF;
469 
470   IF(p_commit = FND_API.G_TRUE) THEN
471     COMMIT WORK;
472   END IF;
473 
474   -- Get all the error messages from the previous steps (if any) and raise the appropriate Exception
475   x_msg_count := FND_MSG_PUB.count_msg;
476   IF x_msg_count > 0 THEN
477     RAISE FND_API.G_EXC_ERROR;
478   END IF;
479 
480   -- Count and Get messages (optional)
481   FND_MSG_PUB.count_and_get(
482     p_encoded  => FND_API.G_FALSE,
483     p_count    => x_msg_count,
484     p_data     => x_msg_data);
485 
486 EXCEPTION
487   WHEN FND_API.G_EXC_ERROR THEN
488     ROLLBACK TO Process_instance_routings;
489     x_return_status := FND_API.G_RET_STS_ERROR ;
490     FND_MSG_PUB.count_and_get(
491       p_encoded  => FND_API.G_FALSE,
492       p_count    => x_msg_count,
493       p_data     => x_msg_data);
494 
495   WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
496     ROLLBACK TO Process_instance_routings;
497     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
498     FND_MSG_PUB.count_and_get(
499       p_encoded  => FND_API.G_FALSE,
500       p_count    => x_msg_count,
501       p_data     => x_msg_data);
502 
503   WHEN OTHERS THEN
504     ROLLBACK TO Process_instance_routings;
505     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
506     IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
507     THEN
508       FND_MSG_PUB.add_exc_msg(
509         p_pkg_name         => G_PKG_NAME,
510         p_procedure_name   => l_api_name,
511         p_error_text       => SUBSTRB(SQLERRM,1,240));
512     END IF;
513     FND_MSG_PUB.count_and_get(
514       p_encoded  => FND_API.G_FALSE,
515       p_count    => x_msg_count,
516       p_data     => x_msg_data);
517 END Process_instance_routings;
518 
519 
520 ------------------------------------------------------------------------------------
521 -- Start of Comments
522 --  Function name    : Get_Build_Goal_Per_For_Pos
523 --  Type              : Public
524 --  Function          : Recursive function to update the build goal percentage for position.
525 --                    : This function fetches the minimum bg per of all the children n itself
526 --                      and returns it to the parent.
527 --                    : To avoid calling this function many times for each non-leaf node,
528 --                      It update the result value of sub nodes, in table directly.
529 --  Pre-reqs          :
530 --  Parameters        :
531 --
532 --  Get_Build_Goal_Per_For_Pos Parameters:
533 --       p_current_instance_id        IN  Required
534 --  End of Comments
535 
536 FUNCTION Get_Build_Goal_Per_For_Pos(p_current_instance_id  NUMBER) RETURN NUMBER IS
537 
538  /*This query will return non null child instances, also it returns zero records for leaf nodes. */
539  CURSOR get_immediate_childern(c_instance_id IN NUMBER) IS
540    SELECT curr_instance_id
541    FROM   AHL_VISIT_IR_UC_DETAILS
542    WHERE  parent_instance_id = c_instance_id
543    AND    curr_instance_id   IS NOT NULL;
544 
545   CURSOR get_bg_instance(c_instance_id IN NUMBER) IS
546    SELECT bg_instance, leaf_node_flag
547    FROM   AHL_VISIT_IR_UC_DETAILS
548    WHERE  curr_instance_id = c_instance_id;
549 
550  TYPE t_child_inst_tbl  IS  TABLE OF get_immediate_childern%ROWTYPE INDEX BY BINARY_INTEGER;
551 
552  l_child_inst_tbl t_child_inst_tbl;
553  l_child_bg_tbl get_bg_instance%ROWTYPE;
554 
555 j NUMBER;
556 /* This stores the min value.*/
557 bg_per NUMBER;
558 curr_bg_per NUMBER;
559 
560 BEGIN
561     OPEN get_bg_instance(p_current_instance_id);
562     FETCH get_bg_instance INTO l_child_bg_tbl;
563     CLOSE get_bg_instance;
564 
565     OPEN get_immediate_childern(p_current_instance_id);
566     FETCH get_immediate_childern BULK COLLECT INTO l_child_inst_tbl;
567     CLOSE get_immediate_childern;
568 
569     -- initialise with its own bg per value
570     bg_per := l_child_bg_tbl.bg_instance;
571     FOR i IN 1..l_child_inst_tbl.COUNT LOOP
572       -- get the min bg per value of i(th) child
573       curr_bg_per := Get_Build_Goal_Per_For_Pos(l_child_inst_tbl(i).curr_instance_id);
574       -- if this child 's per value is null then pick that value
575       IF bg_per IS NOT NULL THEN
576         IF curr_bg_per IS NOT NULL THEN
577           IF bg_per > curr_bg_per THEN
578             bg_per := curr_bg_per;
579           END IF;
580         END IF;
581       ELSE
582         IF curr_bg_per IS NOT NULL THEN
583           bg_per := curr_bg_per;
584         END IF;
585       END IF;
586     END LOOP;
587 
588     -- if this is not leaf node and bg_per value is not null, then set the bg_per value in table
589     IF l_child_bg_tbl.leaf_node_flag = 'N' AND bg_per IS NOT NULL THEN
590       UPDATE AHL_VISIT_IR_UC_DETAILS
591       SET bg_position = bg_per
592       WHERE curr_instance_id = p_current_instance_id;
593     END IF;
594 
595   RETURN bg_per;
596 END Get_Build_Goal_Per_For_Pos;
597 
598 ------------------------------------------------------------------------------------
599 -- Start of Comments
600 --  Procedure name    : get_uc_details
601 --  Type              : Private
602 --  Function          : Procedure to update the all position details in UC.
603 --  Pre-reqs          :
604 --  Parameters        :
605 --
606 --  Create_Instance_Routing Parameters:
607 --       p_visit_id           IN            Required
608 --       p_unit_header_id     IN         NUMBER Required
609 --  End of Comments
610 PROCEDURE get_uc_details(
611         p_unit_header_id     IN         NUMBER,
612         p_visit_id           IN	        NUMBER,
613    	    x_uc_details_tbl     OUT NOCOPY visit_ir_uc_details_tbl_type
614    ) IS
615 
616 
617  l_api_name       CONSTANT   VARCHAR2(30)   := 'get_uc_details';
618  l_uc_details_tbl visit_ir_uc_details_tbl_type;
619  l_return_status  VARCHAR2(1);
620  l_msg_count      NUMBER;
621  l_msg_data       VARCHAR2(2000);
622 
623  l_uc_descendant_tbl AHL_UC_TREE_PVT.uc_descendant_tbl_type;
624  l_unit_name VARCHAR2(80);
625  l_root_instance_id NUMBER;
626 
627  CURSOR get_max_pk_count IS
628   SELECT (NVL(MAX(visit_ir_uc_id),0) + 1) from  ahl_visit_ir_uc_details;
629 
630  CURSOR uc_header_information(c_unit_header_id IN NUMBER) IS
631   SELECT name,csi_item_instance_id FROM AHL_UNIT_CONFIG_HEADERS
632   WHERE unit_config_header_id = c_unit_header_id;
633 
634  CURSOR is_instance_unit(c_instance_id IN NUMBER) IS
635   SELECT 'U' FROM AHL_UNIT_CONFIG_HEADERS WHERE csi_item_instance_id = c_instance_id;
636 
637  CURSOR get_part_info(c_instance_id NUMBER) IS
638   SELECT MTL.inventory_item_id,MTL.concatenated_segments,CSI.instance_number,CSI.serial_number, CSI.quantity
639   FROM   MTL_SYSTEM_ITEMS_VL MTL, CSI_ITEM_INSTANCES CSI
640   WHERE  CSI.instance_id = c_instance_id
641   AND    CSI.inventory_item_id = MTL.inventory_item_id
642   AND    CSI.inv_master_organization_id = MTL.organization_id;
643 
644  CURSOR get_item_gr_info(c_relationship_id IN NUMBER) IS
645   SELECT MCR.mc_header_id, MCR.item_group_id, GRP.name item_group_name, MCR.quantity
646   FROM   AHL_MC_RELATIONSHIPS MCR, AHL_ITEM_GROUPS_B GRP
647   WHERE  MCR.item_group_id    = GRP.item_group_id (+)
648   AND    MCR.relationship_id  = c_relationship_id;
649 
650  CURSOR get_sb_rules_info(c_relationship_id IN NUMBER, c_mc_header_id IN NUMBER) IS
651   SELECT CASE COUNT(rule_id)
652            WHEN 0 THEN 'N'
653            ELSE 'Y'
654          END sb_rules_flag
655   FROM  AHL_SB_POSITION_RULES
656   WHERE  mc_header_id = c_mc_header_id
657   AND    relationship_id = c_relationship_id
658   AND TRUNC(NVL(active_start_date, SYSDATE)) <= TRUNC(SYSDATE)
659   AND TRUNC(NVL(active_end_date, SYSDATE+1))  > TRUNC(SYSDATE);
660 
661  CURSOR get_inst_routings_info(c_instance_id IN NUMBER, c_visit_id IN NUMBER) IS
662   SELECT VIR.inst_routing_id, VIR.object_version_number, VIR.inst_routing_code, IRC.meaning
663   FROM AHL_VISIT_INST_ROUTINGS VIR, FND_LOOKUP_VALUES_VL IRC
664   WHERE VIR.instance_id      = c_instance_id
665   AND   VIR.visit_id         = c_visit_id
666   AND   IRC.lookup_code (+)  = VIR.inst_routing_code
667   AND   IRC.lookup_type (+)  = 'AHL_INSTANCE_ROUTING';
668 
669  CURSOR get_mr_count_info(c_instance_id IN NUMBER, c_visit_id IN NUMBER) IS
670   -- Keeping old query for reference
671   --SELECT COUNT(MRH.MR_HEADER_ID) MR_HEADER_ID_COUNT
672   --FROM  AHL_VISIT_TASKS_B TSK, AHL_MR_HEADERS_B MRH
673   --WHERE TSK.instance_id            = c_instance_id
674   --AND   TSK.visit_id               = c_visit_id
675   --AND   TSK.mr_id                  = MRH.mr_header_id
676   --AND   NVL(TSK.status_code,'X')  <> 'DELETED'
677   --AND   TSK.TASK_TYPE_CODE         = 'SUMMARY';
678 
679   SELECT COUNT(1) MR_COUNT
680   FROM (SELECT DISTINCT unit_effectivity_id
681         FROM   AHL_VISIT_TASKS_B TSK
682         WHERE TSK.instance_id                   = c_instance_id
683         AND   TSK.visit_id                      = c_visit_id
684         AND   NVL(TSK.status_code,'X')         <> 'DELETED'
685         AND   TSK.TASK_TYPE_CODE                = 'SUMMARY'
686         AND   TSK.unit_effectivity_id IS NOT NULL
687         --Commenting this line as it is redundant check
688 	--AND   NVL(TSK.TASK_TYPE_CODE , 'X')    <> 'STAGE'
689         );
690 
691  CURSOR get_task_count_info(c_instance_id IN NUMBER, c_visit_id IN NUMBER) IS
692   SELECT COUNT(TSK.VISIT_TASK_ID) TASK_ID_COUNT
693   FROM  AHL_VISIT_TASKS_B TSK
694   WHERE TSK.instance_id                = c_instance_id
695   AND   TSK.visit_id                   = c_visit_id
696   AND   NVL(TSK.status_code,'X')      <> 'DELETED'
697   AND   NVL(TSK.TASK_TYPE_CODE , 'X') <> 'STAGE';
698 
699  CURSOR get_other_visits (c_instance_id IN NUMBER, c_visit_id IN NUMBER) IS
700   SELECT CASE COUNT(visit_id)
701            WHEN 0 THEN 'N'
702            ELSE 'Y'
703          END visits_count
704   FROM  AHL_VISITS_B VST
705   WHERE VST.item_instance_id  = c_instance_id
706   AND   VST.visit_id         <> c_visit_id;
707 
708  -- 16 Nov 2011, for now, removing check for scheduled_quantity,
709  -- TODO: We may need to fix it when we finilise the quantity field(scheduled or requested) to consider here.
710  CURSOR get_replace_rework_per(c_inventory_item_id IN NUMBER, c_relationship_id IN NUMBER, c_visit_id IN NUMBER) IS
711   SELECT *
712   FROM (SELECT ROM.rework_percent, ROM.replace_percent
713       FROM AHL_SCHEDULE_MATERIALS ASL,
714            AHL_RT_OPER_MATERIALS ROM
715       WHERE ASL.position_path_id IS NOT NULL
716       AND   ASL.relationship_id            = c_relationship_id
717       AND   ASL.visit_id                   = c_visit_id
718       AND   ASL.rt_oper_material_id        = ROM.rt_oper_material_id
719       AND   ROM.association_type_code      = 'DISPOSITION'
720       AND   ASL.status                     = 'ACTIVE'
721       --AND   ASL.scheduled_quantity         > 0
722 
723       UNION ALL
724 
725       -- For item based dispositions
726       SELECT ROM.rework_percent, ROM.replace_percent
727       FROM AHL_SCHEDULE_MATERIALS ASL,
728            AHL_RT_OPER_MATERIALS ROM
729       WHERE ASL.position_path_id IS NULL
730       AND   ASL.inventory_item_id      = c_inventory_item_id
731       AND   ASL.visit_id               = c_visit_id
732       AND   ASL.rt_oper_material_id    = ROM.rt_oper_material_id
733       AND   ROM.association_type_code  = 'DISPOSITION'
734       AND   ASL.status                 = 'ACTIVE'
735       --AND   ASL.scheduled_quantity     > 0
736       )
737   WHERE rownum < 3;
738   TYPE t_replace_rework_per_tbl  IS  TABLE OF get_replace_rework_per%ROWTYPE INDEX BY BINARY_INTEGER;
739   l_replace_rework_per_tbl t_replace_rework_per_tbl;
740 
741  CURSOR get_position_material_flag(c_relationship_id IN NUMBER, c_visit_id IN NUMBER) IS
742   SELECT CASE COUNT(scheduled_material_id)
743            WHEN 0  THEN 'N'
744            WHEN 1  THEN 'Y'
745            ELSE 'M'
746          END  position_material
747   FROM AHL_SCHEDULE_MATERIALS ASM, AHL_MC_RELATIONSHIPS MCR
748   WHERE MCR.relationship_id = c_relationship_id
749   AND   ASM.visit_id        = c_visit_id
750   AND   ASM.mc_header_id    = MCR.mc_header_id
751   AND   ASM.position_key    = MCR.position_key;
752 
753   TYPE t_number_tbl IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
754   TYPE t_varchar_tbl IS TABLE OF VARCHAR2(30) INDEX BY BINARY_INTEGER;
755   l_root_path_tbl     t_varchar_tbl; -- will be used as an associatve array, it stores the parents path from root
756   l_min_child_id_tbl  t_number_tbl; -- will be used as an associatve array, it stores the child number of parent
757 
758 
759  j NUMBER;
760  l_curr_row NUMBER;
761  l_curr_pk NUMBER;
762  temp_bg_pos NUMBER;
763 
764  l_parent_uc_header_id NUMBER; -- PRAKKUM :: 27/03/2012 :: Bug# : 13488251
765  l_parent_uc_instance_id NUMBER; -- PRAKKUM :: 27/03/2012 :: Bug# : 13488251
766 
767 BEGIN
768   OPEN uc_header_information(p_unit_header_id);
769   FETCH uc_header_information INTO l_unit_name,l_root_instance_id;
770   CLOSE uc_header_information;
771 
772   AHL_UC_TREE_PVT.get_whole_uc_tree(
773         p_api_version       =>  1.0,
774         p_init_msg_list     => FND_API.G_TRUE,
775         p_validation_level  => FND_API.G_VALID_LEVEL_FULL,
776         x_return_status     => l_return_status,
777         x_msg_count         => l_msg_count,
778         x_msg_data          => l_msg_data,
779         p_uc_header_id      => p_unit_header_id,
780         x_uc_descendant_tbl => l_uc_descendant_tbl);
781   IF(l_return_status <> FND_API.G_RET_STS_SUCCESS)THEN
782     RAISE FND_API.G_EXC_ERROR;
783   END IF;
784 
785   /*OPEN get_child_instances(l_root_instance_id);
786   FETCH get_child_instances BULK COLLECT INTO l_child_inst_tbl;
787   CLOSE get_child_instances;*/
788 
789  OPEN get_max_pk_count;
790  FETCH get_max_pk_count INTO l_curr_pk;
791  CLOSE get_max_pk_count;
792 
793  l_curr_row := 1;
794 
795  IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
796     FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
797                    'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name,
798                    'Value of current pk ' || l_curr_pk);
799  END IF;
800 
801   IF l_uc_descendant_tbl.FIRST IS NOT NULL THEN
802    FOR i IN l_uc_descendant_tbl.FIRST..l_uc_descendant_tbl.LAST LOOP
803     l_uc_details_tbl(l_curr_row).visit_ir_uc_id := l_curr_pk;
804     l_uc_details_tbl(l_curr_row).root_instance_id := l_root_instance_id;
805     l_uc_details_tbl(l_curr_row).unit_header_id := p_unit_header_id;
806     l_uc_details_tbl(l_curr_row).unit_name := l_unit_name;
807     l_uc_details_tbl(l_curr_row).visit_id := p_visit_id;
808 
809     l_uc_details_tbl(l_curr_row).path_position_id := null;
810 
811     l_uc_details_tbl(l_curr_row).relationship_id := l_uc_descendant_tbl(i).relationship_id;
812     l_uc_details_tbl(l_curr_row).parent_rel_id := l_uc_descendant_tbl(i).parent_rel_id;
813 
814     l_uc_details_tbl(l_curr_row).curr_instance_id := l_uc_descendant_tbl(i).instance_id;
815     l_uc_details_tbl(l_curr_row).parent_instance_id := l_uc_descendant_tbl(i).parent_instance_id;
816 
817     -- Position
818     l_uc_details_tbl(l_curr_row).position := l_uc_descendant_tbl(i).position_reference;
819     -- Leaf node
820     l_uc_details_tbl(l_curr_row).leaf_node_flag := l_uc_descendant_tbl(i).leaf_node_flag;
821     -- Position details image
822     IF l_uc_descendant_tbl(i).node_type = 'X' THEN
823      l_uc_details_tbl(l_curr_row).position_image := G_EXTRA_NODE_IMAGE;
824     ELSIF l_uc_descendant_tbl(i).node_type = 'E' THEN
825      l_uc_details_tbl(l_curr_row).position_image := G_MISSING_NODE_IMAGE;
826     ELSIF l_uc_descendant_tbl(i).node_type = 'S' THEN
827      l_uc_details_tbl(l_curr_row).position_image := G_SB_RULE_VIOLATED_NODE_IMAGE;
828     ELSE
829      l_uc_details_tbl(l_curr_row).position_image := G_FILLED_NODE_IMAGE;
830     END IF;
831 
832     IF l_uc_details_tbl(l_curr_row).curr_instance_id IS NOT NULL THEN
833      -- Instance details and installed quantity
834      OPEN get_part_info(l_uc_details_tbl(l_curr_row).curr_instance_id);
835      FETCH get_part_info INTO l_uc_details_tbl(l_curr_row).curr_item_id,
836                               l_uc_details_tbl(l_curr_row).curr_item_number,
837                               l_uc_details_tbl(l_curr_row).curr_instance_number,
838                               l_uc_details_tbl(l_curr_row).curr_serial_number,
839                               l_uc_details_tbl(l_curr_row).installed_qty;
840      CLOSE get_part_info;
841 
842      -- Update Position reference
843      l_uc_details_tbl(l_curr_row).position := l_uc_details_tbl(l_curr_row).position || '(' ||
844                                      l_uc_details_tbl(l_curr_row).curr_item_number;
845      IF(l_uc_details_tbl(l_curr_row).curr_serial_number IS NOT NULL)THEN
846         l_uc_details_tbl(l_curr_row).position := l_uc_details_tbl(l_curr_row).position || '\ ' ||
847                                           l_uc_details_tbl(l_curr_row).curr_serial_number || ')';
848      ELSE
849         l_uc_details_tbl(l_curr_row).position := l_uc_details_tbl(l_curr_row).position || ')';
850      END IF;
851 
852      -- PRAKKUM :: 27/03/2012 :: Bug# : 13488251 :: Fixed code to get parent instance id's unit name :: START
853      --unit NHA
854      --l_uc_details_tbl(l_curr_row).unit_nha := AHL_UTIL_UC_PKG.get_sub_unit_name(l_uc_details_tbl(l_curr_row).curr_instance_id);
855      AHL_UTIL_UC_PKG.get_parent_uc_header(l_uc_details_tbl(l_curr_row).curr_instance_id, l_parent_uc_header_id, l_parent_uc_instance_id);
856      IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
857          FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, 'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name, 'l_parent_uc_header_id --@>'||l_parent_uc_header_id);
858          FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, 'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name, 'l_parent_uc_instance_id --@>'||l_parent_uc_instance_id);
859      END IF;
860      IF l_parent_uc_header_id IS NOT NULL THEN
861         l_uc_details_tbl(l_curr_row).unit_nha := AHL_UTIL_UC_PKG.get_sub_unit_name(l_parent_uc_instance_id);
862      ELSE
863         l_uc_details_tbl(l_curr_row).unit_nha := NULL;
864      END IF;
865      IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
866          FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, 'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name, 'unit_name --@>'||l_uc_details_tbl(l_curr_row).unit_name);
867          FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT, 'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name, 'unit_nha --@>'||l_uc_details_tbl(l_curr_row).unit_nha);
868      END IF;
869      -- PRAKKUM :: 27/03/2012 :: Bug# : 13488251 :: Fixed code to get parent instance id's unit name :: END
870 
871      -- If it is same as unit_name then leave it as blank
872      IF l_uc_details_tbl(l_curr_row).unit_nha = l_uc_details_tbl(l_curr_row).unit_name THEN
873        l_uc_details_tbl(l_curr_row).unit_nha := null;
874      END IF;
875 
876      -- is Unit : null means it is instance
877     OPEN is_instance_unit(l_uc_details_tbl(l_curr_row).curr_instance_id);
878      FETCH is_instance_unit INTO l_uc_details_tbl(l_curr_row).is_unit;
879     CLOSE is_instance_unit;
880 
881      -- Is warranty Available
882      l_uc_details_tbl(l_curr_row).is_warranty_available := AHL_WARRANTY_CONTRACTS_PVT.Is_Instance_Warranty_Available(l_uc_details_tbl(l_curr_row).curr_instance_id);
883 
884      -- Other Visits available
885      OPEN get_other_visits(l_uc_details_tbl(l_curr_row).curr_instance_id, p_visit_id);
886      FETCH get_other_visits INTO l_uc_details_tbl(l_curr_row).is_visit_available;
887      CLOSE get_other_visits;
888 
889      -- MR number count
890      OPEN get_mr_count_info(l_uc_details_tbl(l_curr_row).curr_instance_id, p_visit_id);
891      FETCH get_mr_count_info INTO l_uc_details_tbl(l_curr_row).mr_count;
892      CLOSE get_mr_count_info;
893 
894      -- Task Number count
895      OPEN get_task_count_info(l_uc_details_tbl(l_curr_row).curr_instance_id, p_visit_id);
896      FETCH get_task_count_info INTO l_uc_details_tbl(l_curr_row).task_count;
897      CLOSE get_task_count_info;
898 
899      -- Instance rounting details
900      OPEN get_inst_routings_info(l_uc_details_tbl(l_curr_row).curr_instance_id, p_visit_id);
901      FETCH get_inst_routings_info INTO l_uc_details_tbl(l_curr_row).inst_routing_id,
902                                        l_uc_details_tbl(l_curr_row).inst_routing_ovn,
903                                        l_uc_details_tbl(l_curr_row).inst_routing_code,
904                                        l_uc_details_tbl(l_curr_row).inst_routing_meaning;
905      CLOSE get_inst_routings_info;
906 
907      -- Build goal
908      l_uc_details_tbl(l_curr_row).bg_instance  := AHL_COMPLEX_MX_PVT.CALC_BUILD_GOAL(l_uc_details_tbl(l_curr_row).curr_instance_id, p_visit_id);
909 
910      /*--set nade level from the assc array
911      l_uc_details_tbl(l_curr_row).node_level := l_inst_level_tbl(l_uc_details_tbl(l_curr_row).curr_instance_id); */
912 
913     END IF;
914 
915     -- Item Group Details and position quantity
916     OPEN get_item_gr_info(l_uc_details_tbl(l_curr_row).relationship_id);
917     FETCH get_item_gr_info INTO l_uc_details_tbl(l_curr_row).mc_header_id,
918                                 l_uc_details_tbl(l_curr_row).item_group_id,
919                                 l_uc_details_tbl(l_curr_row).item_group_name,
920                                 l_uc_details_tbl(l_curr_row).qty_per_position;
921     CLOSE get_item_gr_info;
922 
923     -- SB Rules
924     OPEN get_sb_rules_info(l_uc_details_tbl(l_curr_row).relationship_id, l_uc_details_tbl(l_curr_row).mc_header_id);
925     FETCH get_sb_rules_info INTO l_uc_details_tbl(l_curr_row).is_sb_rule_available;
926     CLOSE get_sb_rules_info;
927 
928     -- Position Material
929     OPEN get_position_material_flag(l_uc_details_tbl(l_curr_row).relationship_id, p_visit_id);
930     FETCH get_position_material_flag INTO l_uc_details_tbl(l_curr_row).position_material_flag;
931     CLOSE get_position_material_flag;
932 
933     -- Instance Routings flag, fetch with functional based security
934     -- Set it Y or N
935     IF  FND_FUNCTION.test('AHL_WORKSCOPE_ROUTING') THEN
936       l_uc_details_tbl(l_curr_row).inst_routing_flag := 'Y';
937     ELSE
938       l_uc_details_tbl(l_curr_row).inst_routing_flag := 'N';
939     END IF;
940 
941     -- hGrid root path, since instance can be null
942     l_min_child_id_tbl(l_uc_details_tbl(l_curr_row).relationship_id) := 0;
943     IF l_uc_details_tbl(l_curr_row).parent_rel_id IS NULL THEN
944       l_root_path_tbl(l_uc_details_tbl(l_curr_row).relationship_id) := '0';
945     ELSE
946       l_root_path_tbl(l_uc_details_tbl(l_curr_row).relationship_id) := l_root_path_tbl(l_uc_details_tbl(l_curr_row).parent_rel_id) || ',' ||
947                                                              l_min_child_id_tbl(l_uc_details_tbl(l_curr_row).parent_rel_id) ;
948       l_min_child_id_tbl(l_uc_details_tbl(l_curr_row).parent_rel_id) := l_min_child_id_tbl(l_uc_details_tbl(l_curr_row).parent_rel_id) + 1;
949     END IF;
950      l_uc_details_tbl(l_curr_row).hgrid_node_path := l_root_path_tbl(l_uc_details_tbl(l_curr_row).relationship_id);
951 
952     -- Rework and Replace precent
953     OPEN get_replace_rework_per(l_uc_details_tbl(l_curr_row).curr_item_id, l_uc_details_tbl(l_curr_row).relationship_id, p_visit_id);
954     FETCH get_replace_rework_per BULK COLLECT INTO l_replace_rework_per_tbl;
955     CLOSE get_replace_rework_per;
956 
957     IF l_replace_rework_per_tbl.COUNT = 1 THEN
958       l_uc_details_tbl(l_curr_row).route_dispositions_flag := 'Y';
959       l_uc_details_tbl(l_curr_row).rd_rework_percent := l_replace_rework_per_tbl(1).rework_percent;
960       l_uc_details_tbl(l_curr_row).rd_replace_percent := l_replace_rework_per_tbl(1).replace_percent;
961     ELSIF l_replace_rework_per_tbl.COUNT = 0 THEN
962       l_uc_details_tbl(l_curr_row).route_dispositions_flag := 'N';
963     ELSE
964       l_uc_details_tbl(l_curr_row).route_dispositions_flag := NULL;
965     END IF;
966 
967     /*   l_uc_details_tbl(l_curr_row).reserved_item,
968          l_uc_details_tbl(l_curr_row).available_parts,
969          */
970 
971     l_curr_row := l_curr_row + 1;
972     l_curr_pk  := l_curr_pk  + 1;
973    END LOOP;
974   END IF;
975 
976 
977   IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
978     FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
979                    'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name,
980                    'Done fetching details');
981   END IF;
982 
983   x_uc_details_tbl := l_uc_details_tbl;
984 
985 END get_uc_details;
986 
987 
988 ------------------------------------------------------------------------------------
989 -- Start of Comments
990 --  Procedure name    : get_instance_details
991 --  Type              : Private
992 --  Function          : Procedure to update the instance details.
993 --  Pre-reqs          :
994 --  Parameters        :
995 --
996 --  Create_Instance_Routing Parameters:
997 --       p_visit_id               IN            Required
998 --       p_item_instance_id       IN            Required
999 --  End of Comments
1000 PROCEDURE get_instance_details(
1001         p_item_instance_id         IN         NUMBER,
1002         p_visit_id                 IN	      NUMBER,
1003         x_instance_details_tbl     OUT NOCOPY visit_ir_uc_details_tbl_type
1004    ) IS
1005 
1006 
1007  l_api_name       CONSTANT   VARCHAR2(30)   := 'get_instance_details';
1008  l_inst_details_tbl visit_ir_uc_details_tbl_type;
1009  l_return_status  VARCHAR2(1);
1010  l_msg_count      NUMBER;
1011  l_msg_data       VARCHAR2(2000);
1012 
1013  CURSOR get_max_pk_count IS
1014   SELECT (NVL(MAX(visit_ir_uc_id),0) + 1) from  ahl_visit_ir_uc_details;
1015 
1016  CURSOR get_part_info(c_instance_id NUMBER) IS
1017   SELECT MTL.inventory_item_id,MTL.concatenated_segments,CSI.instance_number,CSI.serial_number, CSI.quantity
1018   FROM   MTL_SYSTEM_ITEMS_VL MTL, CSI_ITEM_INSTANCES CSI
1019   WHERE  CSI.instance_id = c_instance_id
1020   AND    CSI.inventory_item_id = MTL.inventory_item_id
1021   AND    CSI.inv_master_organization_id = MTL.organization_id;
1022 
1023  CURSOR get_inst_routings_info(c_instance_id IN NUMBER, c_visit_id IN NUMBER) IS
1024   SELECT VIR.inst_routing_id, VIR.object_version_number, VIR.inst_routing_code, IRC.meaning
1025   FROM AHL_VISIT_INST_ROUTINGS VIR, FND_LOOKUP_VALUES_VL IRC
1026   WHERE VIR.instance_id      = c_instance_id
1027   AND   VIR.visit_id         = c_visit_id
1028   AND   IRC.lookup_code (+)  = VIR.inst_routing_code
1029   AND   IRC.lookup_type (+)  = 'AHL_INSTANCE_ROUTING';
1030 
1031  CURSOR get_mr_count_info(c_instance_id IN NUMBER, c_visit_id IN NUMBER) IS
1032   SELECT COUNT(MRH.MR_HEADER_ID) MR_HEADER_ID_COUNT
1033   FROM  AHL_VISIT_TASKS_B TSK, AHL_MR_HEADERS_B MRH
1034   WHERE TSK.instance_id            = c_instance_id
1035   AND   TSK.visit_id               = c_visit_id
1036   AND   TSK.mr_id                  = MRH.mr_header_id
1037   AND   NVL(TSK.status_code,'X')  <> 'DELETED'
1038   AND   TSK.TASK_TYPE_CODE         = 'SUMMARY';
1039 
1040  CURSOR get_task_count_info(c_instance_id IN NUMBER, c_visit_id IN NUMBER) IS
1041   SELECT COUNT(TSK.VISIT_TASK_ID) TASK_ID_COUNT
1042   FROM  AHL_VISIT_TASKS_B TSK
1043   WHERE TSK.instance_id                = c_instance_id
1044   AND   TSK.visit_id                   = c_visit_id
1045   AND   NVL(TSK.status_code,'X')      <> 'DELETED'
1046   AND   NVL(TSK.TASK_TYPE_CODE , 'X') <> 'STAGE';
1047 
1048  CURSOR get_other_visits (c_instance_id IN NUMBER, c_visit_id IN NUMBER) IS
1049   SELECT CASE COUNT(visit_id)
1050            WHEN 0 THEN 'F'
1051            ELSE 'T'
1052          END visits_count
1053   FROM  AHL_VISITS_B VST
1054   WHERE VST.item_instance_id  = c_instance_id
1055   AND   VST.visit_id         <> c_visit_id;
1056 
1057  l_curr_row NUMBER;
1058  l_curr_pk NUMBER;
1059 
1060 BEGIN
1061   OPEN get_max_pk_count;
1062   FETCH get_max_pk_count INTO l_curr_pk;
1063   CLOSE get_max_pk_count;
1064 
1065   l_curr_row := 1;
1066 
1067   IF p_item_instance_id IS NOT NULL THEN
1068      l_inst_details_tbl(l_curr_row).visit_ir_uc_id := l_curr_pk;
1069      l_inst_details_tbl(l_curr_row).visit_id := p_visit_id;
1070      l_inst_details_tbl(l_curr_row).curr_instance_id := p_item_instance_id;
1071      l_inst_details_tbl(l_curr_row).root_instance_id := p_item_instance_id;
1072      l_inst_details_tbl(l_curr_row).is_unit := NULL;
1073 
1074      -- Instance details and installed quantity
1075      OPEN get_part_info(p_item_instance_id);
1076      FETCH get_part_info INTO l_inst_details_tbl(l_curr_row).curr_item_id,
1077                               l_inst_details_tbl(l_curr_row).curr_item_number,
1078                               l_inst_details_tbl(l_curr_row).curr_instance_number,
1079                               l_inst_details_tbl(l_curr_row).curr_serial_number,
1080                               l_inst_details_tbl(l_curr_row).installed_qty;
1081      CLOSE get_part_info;
1082 
1083      --unit NHA
1084      l_inst_details_tbl(l_curr_row).unit_nha := AHL_UTIL_UC_PKG.get_sub_unit_name(p_item_instance_id);
1085 
1086      -- Is warranty Available
1087      l_inst_details_tbl(l_curr_row).is_warranty_available := AHL_WARRANTY_CONTRACTS_PVT.Is_Instance_Warranty_Available(p_item_instance_id);
1088      -- Decode the values Y or N to T or F resp
1089      IF  l_inst_details_tbl(l_curr_row).is_warranty_available = 'Y' THEN
1090        l_inst_details_tbl(l_curr_row).is_warranty_available := 'T';
1091      ELSE
1092        l_inst_details_tbl(l_curr_row).is_warranty_available := 'F';
1093      END IF;
1094 
1095      -- Other Visits available
1096      OPEN get_other_visits(p_item_instance_id, p_visit_id);
1097      FETCH get_other_visits INTO l_inst_details_tbl(l_curr_row).is_visit_available;
1098      CLOSE get_other_visits;
1099 
1100      -- MR number count
1101      OPEN get_mr_count_info(p_item_instance_id, p_visit_id);
1102      FETCH get_mr_count_info INTO l_inst_details_tbl(l_curr_row).mr_count;
1103      CLOSE get_mr_count_info;
1104 
1105      -- Task Number count
1106      OPEN get_task_count_info(p_item_instance_id, p_visit_id);
1107      FETCH get_task_count_info INTO l_inst_details_tbl(l_curr_row).task_count;
1108      CLOSE get_task_count_info;
1109 
1110      -- Instance rounting details
1111      OPEN get_inst_routings_info(p_item_instance_id, p_visit_id);
1112      FETCH get_inst_routings_info INTO l_inst_details_tbl(l_curr_row).inst_routing_id,
1113                                        l_inst_details_tbl(l_curr_row).inst_routing_ovn,
1114                                        l_inst_details_tbl(l_curr_row).inst_routing_code,
1115                                        l_inst_details_tbl(l_curr_row).inst_routing_meaning;
1116      CLOSE get_inst_routings_info;
1117 
1118      -- Build goal
1119      l_inst_details_tbl(l_curr_row).bg_instance  := AHL_COMPLEX_MX_PVT.CALC_BUILD_GOAL(p_item_instance_id, p_visit_id);
1120 
1121     END IF;
1122 
1123     -- Instance Routings flag, fetch with functional based security
1124     -- Set it T or F
1125     IF  FND_FUNCTION.test('AHL_WORKSCOPE_ROUTING') THEN
1126       l_inst_details_tbl(l_curr_row).inst_routing_flag := 'T';
1127     ELSE
1128       l_inst_details_tbl(l_curr_row).inst_routing_flag := 'F';
1129     END IF;
1130 
1131   IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1132     FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
1133                    'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name,
1134                    'Done fetching details');
1135   END IF;
1136 
1137   x_instance_details_tbl := l_inst_details_tbl;
1138 
1139 END get_instance_details;
1140 
1141 ------------------------------------------------------------------------------------
1142 -- Start of Comments
1143 --  Procedure name    : Create_Instance_Routing
1144 --  Type              : Private
1145 --  Function          : Procedure to create instance routing.
1146 --  Pre-reqs          :
1147 --  Parameters        :
1148 --
1149 --  Create_Instance_Routing Parameters:
1150 --       p_visit_id               IN            Required
1151 --       p_item_instance_id       IN            Required
1152 --       p_inst_routing_code      IN            Required
1153 --  End of Comments
1154 PROCEDURE Create_Instance_Routing (
1155    p_visit_id               IN            NUMBER,
1156    p_item_instance_id       IN            NUMBER,
1157    p_inst_routing_code      IN            VARCHAR2,
1158    x_inst_routing_id        OUT NOCOPY    NUMBER,
1159    x_return_status          OUT NOCOPY    VARCHAR2
1160    )
1161 IS
1162 
1163  l_api_name    CONSTANT VARCHAR2(30) := 'Create_Instance_Routing';
1164  l_inst_routing_id      NUMBER;
1165  l_dummy                VARCHAR2(1);
1166 
1167 -- cursor to validate the given instance id
1168 CURSOR validate_instance_csr (c_item_instance_id NUMBER) IS
1169      SELECT 'X'
1170      FROM   CSI_ITEM_INSTANCES
1171      WHERE  INSTANCE_ID = c_item_instance_id;
1172 
1173 -- cursor to validate the given visit id
1174 CURSOR validate_visit_csr (c_visit_id NUMBER) IS
1175      SELECT 'X'
1176      FROM   AHL_VISITS_B
1177      WHERE  visit_id = c_visit_id;
1178 
1179 BEGIN
1180 
1181   -- Initialize API return status to success
1182   x_return_status := FND_API.G_RET_STS_SUCCESS;
1183 
1184   IF (FND_LOG.level_procedure >= FND_LOG.g_current_runtime_level) THEN
1185     FND_LOG.string(FND_LOG.level_procedure, 'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name||': Begin',
1186                   'Create_Instance_Routing. visit id = '||p_visit_id||
1187                                            'Item Instance id = '||p_item_instance_id||
1188                                            'Inst routing code = '||p_inst_routing_code
1189                   );
1190   END IF;
1191 
1192   -- validate the visit id
1193   OPEN  validate_visit_csr (p_visit_id);
1194   FETCH validate_visit_csr INTO l_dummy;
1195   IF validate_visit_csr%NOTFOUND THEN
1196     CLOSE  validate_visit_csr;
1197     Fnd_Message.SET_NAME('AHL','AHL_VWP_INVALID_VST' ); -- Visit id VISIT_ID is invalid.
1198     Fnd_Message.Set_Token('VISIT_ID', p_visit_id);
1199     Fnd_Msg_Pub.ADD;
1200 
1201     x_return_status := FND_API.G_RET_STS_ERROR;
1202     RETURN;
1203   END IF;
1204   CLOSE  validate_visit_csr;
1205 
1206   -- validate the instance id
1207   OPEN  validate_instance_csr (p_item_instance_id);
1208   FETCH validate_instance_csr INTO l_dummy;
1209   IF validate_instance_csr%NOTFOUND THEN
1210     CLOSE  validate_instance_csr;
1211     Fnd_Message.SET_NAME('AHL','AHL_FMP_INVALID_ITEM_INSTANCE' ); -- The item instance INSTANCE is invalid.
1212     Fnd_Message.Set_Token('INSTANCE', p_item_instance_id);
1213     Fnd_Msg_Pub.ADD;
1214 
1215     x_return_status := FND_API.G_RET_STS_ERROR;
1216     RETURN;
1217   END IF;
1218   CLOSE  validate_instance_csr;
1219 
1220   -- fetch the next value from the sequence
1221   l_inst_routing_id := AHL_VISIT_INST_ROUTINGS_S.NEXTVAL;
1222 
1223   -- insert a record in the AHL_VISIT_INST_ROUTINGS table
1224   INSERT INTO AHL_VISIT_INST_ROUTINGS
1225               (
1226                INST_ROUTING_ID,
1227                VISIT_ID,
1228                INSTANCE_ID,
1229                INST_ROUTING_CODE,
1230                OBJECT_VERSION_NUMBER,
1231                SECURITY_GROUP_ID,
1232                LAST_UPDATE_DATE,
1233                LAST_UPDATED_BY,
1234                CREATION_DATE,
1235                CREATED_BY,
1236                LAST_UPDATE_LOGIN
1237               )
1238               values
1239               (
1240                 l_inst_routing_id,
1241                 p_visit_id,
1242                 p_item_instance_id,
1243                 p_inst_routing_code,
1244                 1,
1245                 NULL,
1246                 SYSDATE,
1247                 Fnd_Global.USER_ID,
1248                 SYSDATE,
1249                 Fnd_Global.USER_ID,
1250                 Fnd_Global.LOGIN_ID
1251               );
1252 
1253   -- populate the OUT parameter
1254   x_inst_routing_id := l_inst_routing_id;
1255 
1256   IF (FND_LOG.level_procedure >= FND_LOG.g_current_runtime_level)THEN
1257      FND_LOG.string(FND_LOG.level_procedure, 'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name||'.end',
1258                     'Create_Instance_Routing, x_return_status=' || x_return_status);
1259   END IF;
1260 END Create_Instance_Routing;
1261 
1262 ------------------------------------------------------------------------------------
1263 -- Start of Comments
1264 --  Procedure name    : Update_Instance_Routing
1265 --  Type              : Private
1266 --  Function          : Procedure to update instance routing.
1267 --  Pre-reqs          :
1268 --  Parameters        :
1269 --
1270 --  Update_Instance_Routing Parameters:
1271 --       p_inst_routing_id        IN  Required
1272 --       p_object_version_number  IN  Required
1273 --       p_inst_routing_code      IN  Required
1274 --  End of Comments
1275 
1276 PROCEDURE Update_Instance_Routing (
1277    p_inst_routing_id        IN  NUMBER,
1278    p_object_version_number  IN  NUMBER,
1279    p_inst_routing_code      IN  VARCHAR2,
1280    x_return_status          OUT NOCOPY    VARCHAR2
1281     )
1282 IS
1283 
1284 -- cursor to validate the given routing id
1285 CURSOR validate_routing_csr (c_inst_routing_id NUMBER) IS
1286  SELECT *
1287  FROM   AHL_VISIT_INST_ROUTINGS
1288  WHERE  inst_routing_id = c_inst_routing_id;
1289 
1290  l_api_name    CONSTANT VARCHAR2(30) := 'Update_Instance_Routing';
1291  l_inst_routings_rec    validate_routing_csr%ROWTYPE;
1292 
1293 BEGIN
1294 
1295  IF (FND_LOG.level_procedure >= FND_LOG.g_current_runtime_level) THEN
1296     FND_LOG.string(FND_LOG.level_procedure, 'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name|| '.begin',
1297                   'Update_Instance_Routing. instance routing id = ' || p_inst_routing_id||
1298                                            'inst_routing_code = ' || p_inst_routing_code
1299                   );
1300  END IF;
1301 
1302   -- Initialize API return status to success
1303   x_return_status := FND_API.G_RET_STS_SUCCESS;
1304 
1305   -- validate the instance routing id
1306   OPEN  validate_routing_csr (p_inst_routing_id);
1307   FETCH validate_routing_csr INTO l_inst_routings_rec;
1308    IF validate_routing_csr%NOTFOUND THEN
1309     CLOSE  validate_routing_csr;
1310     Fnd_Message.SET_NAME('AHL','AHL_CAM_INVALID_INST_ROUTING' ); -- The Instance routing id ROUTID is invalid.
1311     Fnd_Message.Set_Token('ROUTID', p_inst_routing_id);
1312     Fnd_Msg_Pub.ADD;
1313 
1314      x_return_status := FND_API.G_RET_STS_ERROR;
1315     RETURN;
1316   END IF;
1317   CLOSE  validate_routing_csr;
1318 
1319   -- check for object_version_number
1320   IF(p_object_version_number <> l_inst_routings_rec.object_version_number) THEN
1321     IF (FND_LOG.level_statement >= FND_LOG.g_current_runtime_level) THEN
1322        FND_LOG.string(FND_LOG.level_statement, 'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name, 'object_version_number mismatch');
1323     END IF;
1324     FND_MESSAGE.Set_Name('AHL', 'AHL_COM_RECORD_CHANGED'); -- Record has been modified by another user.
1325     FND_MSG_PUB.ADD;
1326 
1327     x_return_status := FND_API.G_RET_STS_ERROR;
1328     RETURN;
1329   END IF;
1330 
1331   -- update a record in the AHL_VISIT_INST_ROUTINGS table
1332   UPDATE  AHL_VISIT_INST_ROUTINGS SET
1333               inst_routing_code    = p_inst_routing_code,
1334               object_version_number = object_version_number + 1,
1335               security_group_id     = NULL,
1336               last_update_date      = SYSDATE,
1337               last_updated_by       = Fnd_Global.USER_ID,
1338               last_update_login     = Fnd_Global.LOGIN_ID
1339   WHERE  inst_routing_id = p_inst_routing_id;
1340 
1341   IF (FND_LOG.level_procedure >= FND_LOG.g_current_runtime_level)THEN
1342      fnd_log.string(FND_LOG.level_procedure,'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name||'.end',
1343                     'Update_Instance_Routing, x_return_status=' || x_return_status);
1344   END IF;
1345 END Update_Instance_Routing;
1346 
1347 ------------------------------------------------------------------------------------
1348 -- Start of Comments
1349 --  Procedure name    : Delete_Instance_Routing
1350 --  Type              : Private
1351 --  Function          : Procedure to delete instance routing.
1352 --  Pre-reqs          :
1353 --  Parameters        :
1354 --
1355 --  Update_Instance_Routing Parameters:
1356 --       p_inst_routing_id        IN  Required
1357 --  End of Comments
1358 PROCEDURE Delete_Instance_Routing (
1359     p_inst_routing_id  IN     NUMBER,
1360     x_return_status       OUT NOCOPY    VARCHAR2
1361 ) IS
1362 
1363  l_api_name   CONSTANT VARCHAR2(30)  := 'Delete_Instance_Routing';
1364  l_dummy                VARCHAR2(1);
1365 -- cursor to validate the given routing id
1366 CURSOR validate_routing_csr (c_inst_routing_id NUMBER) IS
1367  SELECT 'X'
1368  FROM   AHL_VISIT_INST_ROUTINGS
1369  WHERE  inst_routing_id = c_inst_routing_id;
1370 l_inst_routings_rec    validate_routing_csr%ROWTYPE;
1371 
1372 BEGIN
1373     IF (FND_LOG.level_procedure >= FND_LOG.g_current_runtime_level) THEN
1374         FND_LOG.string(FND_LOG.level_procedure, 'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name||'.begin', 'Entering Procedure');
1375     END IF;
1376 
1377   -- Initialize API return status to success
1378   x_return_status := FND_API.G_RET_STS_SUCCESS;
1379 
1380   -- validate the instance routing id
1381   OPEN  validate_routing_csr (p_inst_routing_id);
1382   FETCH validate_routing_csr INTO l_inst_routings_rec;
1383    IF validate_routing_csr%NOTFOUND THEN
1384     CLOSE  validate_routing_csr;
1385     Fnd_Message.SET_NAME('AHL','AHL_CAM_INVALID_INST_ROUTING' ); -- The Instance routing id ROUTID is invalid.
1386     Fnd_Message.Set_Token('ROUTID', p_inst_routing_id);
1387     Fnd_Msg_Pub.ADD;
1388 
1389      x_return_status := FND_API.G_RET_STS_ERROR;
1390     RETURN;
1391   END IF;
1392   CLOSE  validate_routing_csr;
1393 
1394   -- delete row
1395   DELETE FROM AHL_VISIT_INST_ROUTINGS
1396   WHERE  inst_routing_id = p_inst_routing_id;
1397 
1398   IF (FND_LOG.level_procedure >= FND_LOG.g_current_runtime_level) THEN
1399     FND_LOG.string(FND_LOG.level_procedure, 'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name||'.end',
1400                       ' x_return_status=' || x_return_status);
1401   END IF;
1402 END Delete_Instance_Routing;
1403 
1404 
1405 /*
1406 Procedure Process_Inst_Rtng_Notes create workorder's turnover notes for instance routing attachted to workorder instance
1407 under given visit and instance.
1408 
1409 Parameters:
1410 
1411 visit_id        Valid Visit id
1412 instance_id     Instance_id for which instance routing is defined/updated/deleted.
1413 p_old_inst_rtng_code Old Instance routing (Lookup Code) for instance.
1414 p_new_inst_rtng_code New Instnace routing (Lookup Code) for instance.
1415 
1416 */
1417 
1418 PROCEDURE Process_Inst_Rtng_Notes(
1419   p_visit_id             IN NUMBER,
1420   p_instance_id          IN NUMBER,
1421   p_old_inst_rtng_code   IN VARCHAR2 := NULL,
1422   p_new_inst_rtng_code   IN VARCHAR2 := NULL,
1423   x_return_status        OUT NOCOPY VARCHAR2,
1424   x_msg_count            OUT NOCOPY NUMBER,
1425   x_msg_data             OUT NOCOPY VARCHAR2
1426 ) IS
1427 
1428  --Local Variable Declaration.
1429  l_msg_count             NUMBER;
1430  l_msg_data              VARCHAR2(2000);
1431  l_return_status         VARCHAR2(1);
1432  l_api_name    VARCHAR2(30) := 'Process_Inst_Rtng_Notes';
1433  l_jtf_note_id           NUMBER;
1434  l_notes                 VARCHAR2(2000);
1435  CURSOR Get_Visit_Instance_Workorders(p_visit_id IN NUMBER, p_instance_id IN NUMBER) IS
1436  SELECT WO.WORKORDER_ID WORKORDER_ID
1437  FROM
1438  AHL_VISITS_B VST, AHL_VISIT_TASKS_B TSK, AHL_WORKORDERS WO
1439  WHERE
1440  VST.VISIT_ID = p_visit_id
1441  AND VST.VISIT_ID = TSK.VISIT_ID
1442  AND TSK.INSTANCE_ID = p_instance_id
1443  AND TSK.VISIT_TASK_ID = WO.VISIT_TASK_ID
1444  AND WO.STATUS_CODE NOT IN (7,12,4,5,22); -- Cancelled, Closed,Complete,Complete No-charge,Deleted
1445 BEGIN
1446   SAVEPOINT process_inst_rtng;
1447   x_return_status:=FND_API.G_RET_STS_SUCCESS;
1448 
1449    IF (p_visit_id IS NULL) THEN
1450     FND_MESSAGE.SET_NAME('AHL','AHL_VWP_VISIT_NULL');
1451     FND_MSG_PUB.ADD;
1452     RAISE FND_API.G_EXC_ERROR;
1453   END IF;
1454 
1455    IF (p_instance_id IS NULL) THEN
1456     FND_MESSAGE.SET_NAME('AHL','AHL_LTP_APS_INST_ID_NULL');
1457     FND_MSG_PUB.ADD;
1458     RAISE FND_API.G_EXC_ERROR;
1459   END IF;
1460 
1461   IF (p_old_inst_rtng_code IS NULL AND p_new_inst_rtng_code IS NULL) THEN
1462     FND_MESSAGE.SET_NAME('AHL','AHL_CAM_INST_RTNG_NULL'); -- pending to define.
1463     FND_MSG_PUB.ADD;
1464     RAISE FND_API.G_EXC_ERROR;
1465   END IF;
1466 
1467   IF (NVL(p_old_inst_rtng_code,'A') <> NVL(p_new_inst_rtng_code,'B')) THEN
1468     --Process instance routing only if new and old instance routing is not same
1469     FOR i in Get_Visit_Instance_Workorders(p_visit_id,p_instance_id )
1470     LOOP
1471       AHL_PRD_WORKORDER_PVT.Add_Inst_Rtng_Notes_To_WO(
1472       p_api_version          => 1.0,
1473       p_init_msg_list        => FND_API.G_FALSE,
1474       p_commit               => FND_API.G_FALSE,
1475       p_validation_level     => FND_API.G_VALID_LEVEL_FULL,
1476       x_return_status        => l_return_status,
1477       x_msg_count            => l_msg_count,
1478       x_msg_data             => l_msg_data,
1479       p_workorder_id         => i.workorder_id,
1480       p_old_inst_rtng        => p_old_inst_rtng_code,
1481       p_new_inst_rtng        => p_new_inst_rtng_code
1482       );
1483 
1484       l_msg_count := FND_MSG_PUB.count_msg;
1485       IF l_msg_count > 0 THEN
1486        RAISE FND_API.G_EXC_ERROR;
1487       END IF;
1488 
1489     END LOOP;
1490   END IF;
1491 
1492 EXCEPTION
1493  WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
1494     ROLLBACK TO process_inst_rtng;
1495     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1496     FND_MSG_PUB.count_and_get( p_encoded => FND_API.G_FALSE,
1497                                p_count => x_msg_count,
1498                                p_data  => x_msg_data);
1499  WHEN FND_API.G_EXC_ERROR THEN
1500     ROLLBACK TO process_inst_rtng;
1501     x_return_status := FND_API.G_RET_STS_ERROR;
1502     FND_MSG_PUB.count_and_get( p_encoded => FND_API.G_FALSE,
1503                                p_count => x_msg_count,
1504                                p_data  => x_msg_data);
1505 WHEN OTHERS THEN
1506     ROLLBACK TO process_inst_rtng;
1507     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1508     IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
1509       FND_MSG_PUB.add_exc_msg(p_pkg_name        => g_pkg_name,
1510                               p_procedure_name  => l_api_name,
1511                               p_error_text      => SUBSTRB(SQLERRM,1,240));
1512 
1513     END IF;
1514     FND_MSG_PUB.count_and_get( p_encoded => FND_API.G_FALSE,
1515                                p_count => x_msg_count,
1516                                p_data  => x_msg_data);
1517 END Process_Inst_Rtng_Notes;
1518 
1519 ------------------------------------------------------------------------------------------------------
1520 -- Start of Comments
1521 --  Procedure name    : Get_Instance_Location
1522 --  Type              : Public
1523 --  Function          : Returns details of instance in Visit;workorder; inventory;locator;OSP format
1524 --  Pre-reqs          :
1525 --  Parameters        :
1526 --
1527 --  Get_visit_ir_uc_details Parameters
1528 --           p_visit_id      IN  NUMBER
1529 --           p_instance_id   IN  NUMBER
1530 --
1531 --  End of Comments
1532 -------------------------------------------------------------------------------------------------------
1533 FUNCTION Get_Instance_Location(
1534    p_visit_id      IN  NUMBER,
1535    p_instance_id   IN  NUMBER
1536 )RETURN VARCHAR2 IS
1537 
1538 --Cursor to Get Instance Attributes
1539 -- fix for bug 16304850
1540 /* CURSOR Get_Instance_Attributes(c_instance_id IN NUMBER) IS
1541  SELECT CII.instance_id, CII.location_type_code,
1542         CII.instance_usage_code, CII.wip_job_id, CII.inv_locator_id,
1543         MIL.segment19, MIL.segment20, MIL.concatenated_segments inv_locator_name,
1544         MIL.subinventory_code, WO.workorder_name
1545  FROM  CSI_ITEM_INSTANCES CII , MTL_ITEM_LOCATIONS_KFV MIL, AHL_WORKORDERS WO
1546  WHERE CII.instance_id = c_instance_id
1547  AND   CII.inv_locator_id = MIL.inventory_location_id (+)
1548  AND   CII.wip_job_id = WO.wip_entity_id(+);*/
1549 
1550 CURSOR Get_Instance_Attributes(c_instance_id IN NUMBER) IS
1551 SELECT CII.instance_id, CII.location_type_code,
1552         CII.instance_usage_code, CII.wip_job_id, CII.inv_locator_id,
1553         MIL.segment19, MIL.segment20, MIL_kfv.concatenated_segments inv_locator_name,
1554         MIL.subinventory_code, WO.workorder_name
1555  FROM  CSI_ITEM_INSTANCES CII , MTL_ITEM_LOCATIONS MIL, MTL_ITEM_LOCATIONS_KFV MIL_kfv, AHL_WORKORDERS WO
1556  WHERE CII.instance_id = c_instance_id
1557  AND   CII.inv_locator_id = MIL.inventory_location_id (+)
1558  AND   MIL_kfv.INVENTORY_LOCATION_ID(+) = MIL.INVENTORY_LOCATION_ID
1559  AND   MIL_kfv.ORGANIZATION_ID(+) = MIL.ORGANIZATION_ID
1560  AND   CII.wip_job_id = WO.wip_entity_id(+);
1561 -- end fix for bug 16304850
1562 
1563  --Cursor to Get Visit Attributes
1564 CURSOR Get_Visit_Attributes(c_visit_id  IN NUMBER) IS
1565 SELECT item_instance_id, visit_number
1566 FROM AHL_VISITS_B
1567 WHERE visit_id = c_visit_id;
1568 
1569 --Cursor to Get Visit Number From Project Task ID
1570 Cursor Get_Visit_From_Prj_Task(c_project_id IN NUMBER, c_project_task_id IN NUMBER) IS
1571 SELECT vst.visit_number
1572 FROM ahl_visits_b vst, ahl_visit_tasks_b vts
1573 WHERE
1574 vst.project_id = c_project_id
1575 and vst.visit_id = vts.visit_id
1576 and vts.project_task_id = c_project_task_id
1577 and rownum < 2;
1578 
1579 --Cursor to Get Visit Number and OSP number From Workorder.
1580 Cursor Get_Visit_And_OSP_From_Wip_Job(c_wip_entity_id IN NUMBER) IS
1581 SELECT vst.visit_number,osph.osp_order_number
1582 FROM ahl_visits_b vst, ahl_visit_tasks_b vts, ahl_workorders wo,ahl_osp_orders_b osph, ahl_osp_order_lines ospl
1583 WHERE
1584 wo.wip_entity_id = c_wip_entity_id
1585 and wo.visit_task_id IS NOT NULL
1586 and wo.visit_task_id = vts.visit_task_id
1587 and vts.visit_id = vst.visit_id
1588 and wo.workorder_id = ospl.workorder_id (+)
1589 and ospl.osp_order_id = osph.osp_order_id (+)
1590 --PRAKKUM :: 28/03/2012 :: Bug 13579487 :: OSP Line status is null (non null values are used only for cancelled, deleted cases)
1591 --and NVL(OSPL.STATUS_CODE(+), 'ENTERED') NOT IN ( 'PO_DELETED' , 'PO_CANCELLED' )
1592 and OSPL.STATUS_CODE IS NULL
1593 AND NVL(OSPH.STATUS_CODE(+), 'ENTERED') NOT IN ( 'CLOSED' );
1594 
1595 --PRAKKUM :: 28/03/2012 :: Bug 13579487
1596 --Cursor to get last osp order number for the given item
1597 CURSOR Get_OSP_Number(c_instance_id IN NUMBER) IS
1598 select OSP_ORDER_NUMBER from
1599 (
1600 select OSP_ORDER_NUMBER
1601 from CSI_ITEM_INSTANCES CII , ahl_osp_orders_b osph, ahl_osp_order_lines ospl
1602 WHERE CII.instance_id = c_instance_id
1603 and CII.inventory_item_id = ospl.inventory_item_id
1604 and CII.serial_number = ospl.serial_number
1605 and ospl.osp_order_id = osph.osp_order_id (+)
1606 --and NVL(OSPL.STATUS_CODE(+), 'ENTERED') NOT IN ( 'PO_DELETED' , 'PO_CANCELLED' )
1607 and OSPL.STATUS_CODE IS NULL
1608 AND NVL(OSPH.STATUS_CODE(+), 'ENTERED') NOT IN ( 'CLOSED' )
1609 order by ospl.osp_order_line_id desc
1610 )
1611 where rownum=1;
1612 
1613 --Local Variable Declaration.
1614 l_inst_attr Get_Instance_Attributes%ROWTYPE;
1615 l_inst_location     VARCHAR2(200) := NULL;
1616 l_visit_attr    Get_Visit_Attributes%ROWTYPE;
1617 l_visit_number  NUMBER := NULL;
1618 -- fix for bug 16304850
1619 --l_sub_inventory mtl_item_locations_kfv.subinventory_code%TYPE;
1620 --l_locator_name  mtl_item_locations_kfv.concatenated_segments%TYPE;
1621 l_sub_inventory mtl_item_locations.subinventory_code%TYPE;
1622 l_locator_name  VARCHAR2(204);
1623 -- end fix for bug 16304850
1624 l_job_name      ahl_workorders.workorder_name%TYPE;
1625 l_osp_order     ahl_osp_orders_b.osp_order_number%TYPE;
1626 
1627 BEGIN
1628 
1629 --Return NULL if visit or instance is null
1630 IF (p_visit_id IS NULL OR p_instance_id IS NULL) THEN
1631     RETURN NULL;
1632 END IF;
1633 
1634 
1635 --Open Instance Attribute Cursor.
1636 OPEN Get_Instance_Attributes(p_instance_id);
1637 FETCH Get_Instance_Attributes INTO l_inst_attr;
1638 CLOSE Get_Instance_Attributes;
1639 
1640 --Open Visit Cursor
1641 OPEN Get_Visit_Attributes(p_visit_id);
1642 FETCH Get_Visit_Attributes INTO l_visit_attr;
1643 CLOSE Get_Visit_Attributes;
1644 
1645 --Return NULL if either of the input parameters are not deriving valid data from db.
1646 IF (l_visit_attr.item_instance_id IS NULL OR l_inst_attr.instance_id IS NULL) THEN
1647     RETURN NULL;
1648 END IF;
1649 
1650 IF (l_inst_attr.location_type_code = 'HZ_PARTY_SITES') THEN
1651 --If instance is on Unit.
1652     l_inst_location := NULL;
1653     RETURN l_inst_location;
1654 ELSIF(l_inst_attr.location_type_code = 'INVENTORY') THEN
1655 --If instance is lying in physical locator or visit locator.
1656     IF(l_inst_attr.segment19 IS NOT NULL AND l_inst_attr.segment20 IS NOT NULL) THEN
1657         --Instance is on Visit locator. In this case get visit number also.
1658         IF(l_visit_attr.item_instance_id = l_inst_attr.instance_id) THEN
1659             --If instance is same as visit header instance. In this case get visit number based upon locator.
1660             OPEN Get_Visit_From_Prj_Task(l_inst_attr.segment19, l_inst_attr.segment20);
1661             FETCH Get_Visit_From_Prj_Task INTO l_visit_number;
1662             CLOSE Get_Visit_From_Prj_Task;
1663         ELSE
1664             --If instance is not same as visit header instance then visit number is same as sent as parameter.
1665             l_visit_number := l_visit_attr.visit_number;
1666         END IF;
1667     END IF;
1668     l_locator_name := l_inst_attr.inv_locator_name;
1669     l_sub_inventory := l_inst_attr.subinventory_code;
1670 
1671     --PRAKKUM :: 28/03/2012 :: Bug 13579487 :: Since OSP order can be inventory based and as inventory based OSP doesn't have work order info.,
1672     --fetch details based on given instance.
1673     IF(l_visit_attr.item_instance_id = l_inst_attr.instance_id) THEN --Fetch only if instance is visit unit
1674         OPEN Get_OSP_Number(l_inst_attr.instance_id);
1675         FETCH Get_OSP_Number INTO l_osp_order;
1676         CLOSE Get_OSP_Number;
1677     END IF;
1678 
1679 ELSIF(l_inst_attr.location_type_code = 'WIP') THEN
1680 --If instance is on WIP job. In this case... sub inventory and locator will not be shown.
1681         IF(l_visit_attr.item_instance_id = l_inst_attr.instance_id) THEN
1682             --If instance is same as visit header instance. In this case get visit number based upon Workorder.
1683             OPEN Get_Visit_And_OSP_From_Wip_Job(l_inst_attr.wip_job_id);
1684             FETCH Get_Visit_And_OSP_From_Wip_Job INTO l_visit_number, l_osp_order;
1685             CLOSE Get_Visit_And_OSP_From_Wip_Job;
1686         ELSE
1687             --If instance is not same as visit header instance then visit number is same as input parameter.
1688             l_visit_number := l_visit_attr.visit_number;
1689         END IF;
1690         l_job_name  := l_inst_attr.workorder_name;
1691 END IF;
1692 
1693 --Construct location detail
1694 l_inst_location := NVL(TO_CHAR(l_visit_number), '-') || ';' ||
1695                    NVL(l_job_name, '-') || ';' ||
1696                    NVL(l_sub_inventory, '-') || ';' ||
1697                    NVL(l_locator_name, '-') || ';' ||
1698                    NVL(TO_CHAR(l_osp_order), '-');
1699 
1700 RETURN l_inst_location;
1701 
1702 END Get_Instance_Location;
1703 
1704 ------------------------------------------------------------------------------------------------------
1705 -- Start of Comments
1706 --  Procedure name    : Get_disposition_count
1707 --  Type              : Public
1708 --  Function          : Returns disposition count of work orders associated with given visit n instacne
1709 --                      Returns null if count is zero.
1710 --  Pre-reqs          :
1711 --  Parameters        :
1712 --
1713 --  Get_visit_ir_uc_details Parameters
1714 --       p_x_instance_routings_tbl IN    OUT NOCOPY    instance_routings_tbl_type
1715 --
1716 --  End of Comments
1717 -------------------------------------------------------------------------------------------------------
1718 FUNCTION Get_disposition_count(
1719    p_visit_id      IN  NUMBER,
1720    p_instance_id   IN  NUMBER
1721 )RETURN NUMBER IS
1722  -- c_instance_id is sufficient as an input parameter
1723  -- but keeping c_visit_id field
1724  CURSOR get_dispo_count(c_instance_id IN NUMBER, c_visit_id IN NUMBER) IS
1725    SELECT SUM(quantity)
1726    FROM (
1727    /* STHILAK bug #13641891 : commented the query and framed the modified query
1728    SELECT 1 quantity
1729       FROM AHL_PRD_DISPOSITIONS_B DISP,
1730            AHL_WORKORDERS WO,
1731            CSI_ITEM_INSTANCES CSI
1732       WHERE DISP.workorder_id           = WO.workorder_id
1733       AND   DISP.instance_id            = CSI.instance_id
1734       AND   CSI.wip_job_id              = WO.wip_entity_id
1735       AND   DISP.status_code       NOT IN ('TERMINATED','COMPLETED')
1736       AND   CSI.location_type_code      = 'WIP'
1737       AND   CSI.serial_number IS NOT NULL
1738       AND   CSI.instance_id             = c_instance_id
1739 
1740      UNION ALL
1741 
1742      -- For non serial controlled items
1743      SELECT DISP.quantity quantity
1744      FROM AHL_PRD_DISPOSITIONS_B DISP,
1745           AHL_WORKORDERS WO,
1746           CSI_ITEM_INSTANCES CSI
1747      WHERE DISP.workorder_id             = WO.workorder_id
1748      AND   DISP.inventory_item_id        = CSI.inventory_item_id
1749      AND   CSI.wip_job_id                = WO.wip_entity_id
1750      AND   DISP.status_code         NOT IN ('TERMINATED','COMPLETED')
1751      AND   CSI.location_type_code        = 'WIP'
1752      AND   NVL(DISP.lot_number,'x')      = NVL(CSI.lot_number,'x')
1753      AND   NVL(DISP.item_revision,'x')   = NVL(CSI.inventory_revision,'x')
1754      AND   CSI.serial_number       IS NULL
1755      AND   CSI.instance_id               = c_instance_id */
1756 
1757 	 SELECT 1 quantity
1758 		FROM AHL_PRD_DISPOSITIONS_B DISP,
1759 		  CSI_ITEM_INSTANCES CSI
1760 		WHERE DISP.instance_id     = CSI.instance_id
1761 		AND CSI.instance_id        = c_instance_id
1762 		AND CSI.location_type_code = 'WIP'
1763 		AND CSI.serial_number     IS NOT NULL
1764 		AND disp.workorder_id     IN
1765 		  (SELECT workorder_id FROM AHL_WORKORDERS WHERE visit_id =c_visit_id
1766 		  )
1767 		AND NVL(DISP.status_code,'x') NOT IN ('TERMINATED','COMPLETED')
1768 
1769 		UNION ALL
1770 
1771 		SELECT DISP.quantity quantity
1772 		FROM AHL_PRD_DISPOSITIONS_B DISP,
1773 		  CSI_ITEM_INSTANCES CSI
1774 		WHERE DISP.inventory_item_id       = CSI.inventory_item_id
1775 		AND CSI.location_type_code         = 'WIP'
1776 		AND CSI.serial_number             IS NULL
1777 		AND CSI.instance_id                = c_instance_id
1778 		AND NVL(DISP.status_code,'x') NOT IN ('TERMINATED','COMPLETED')
1779 		AND NVL(DISP.lot_number,'x')       = NVL(CSI.lot_number,'x')
1780 		AND NVL(DISP.item_revision,'x')    = NVL(CSI.inventory_revision,'x')
1781 		AND DISP.workorder_id             IN
1782 		  (SELECT workorder_id FROM AHL_WORKORDERS WHERE visit_id =c_visit_id
1783 		  )
1784     );
1785 
1786  l_count NUMBER;
1787 
1788 BEGIN
1789 
1790    OPEN get_dispo_count(p_instance_id, p_visit_id);
1791    FETCH get_dispo_count INTO l_count;
1792    CLOSE get_dispo_count;
1793 
1794    IF l_count = 0 THEN
1795      RETURN NULL;
1796    ELSE
1797     RETURN l_count;
1798    END IF;
1799 
1800 END Get_disposition_count;
1801 
1802 END AHL_COMPLEX_MX_RWSC_PVT;