DBA Data[Home] [Help]

PACKAGE BODY: APPS.AHL_UMP_UNITMAINT_PVT

Source


1 PACKAGE BODY AHL_UMP_UNITMAINT_PVT AS
2 /* $Header: AHLVUMXB.pls 120.20.12010000.3 2008/12/29 02:29:26 sracha ship $ */
3 
4 
5 G_PKG_NAME          CONSTANT VARCHAR2(30) := 'AHL_UMP_UnitMaint_PVT';
6 
7 G_DEBUG                      VARCHAR2(1)  := AHL_DEBUG_PUB.is_log_enabled;
8 
9 TYPE CounterCurTyp is REF CURSOR;
10 
11 
12 -------------------------------
13 -- Declare Local Procedures --
14 -------------------------------
15   -- Converts Value to Id for a Threshold
16   PROCEDURE Convert_Threshold_Val_To_ID(
17      p_x_unit_threshold_rec IN OUT NOCOPY AHL_UMP_UNITMAINT_PVT.Unit_Threshold_rec_type,
18      x_return_status           OUT NOCOPY VARCHAR2);
19 
20   -- Converts Value to Id for an Accomplishment
21   PROCEDURE Convert_Accomplish_Val_To_ID(
22      p_x_unit_accomplish_rec IN OUT NOCOPY AHL_UMP_UNITMAINT_PVT.Unit_Accomplish_rec_type,
23      x_return_status            OUT NOCOPY VARCHAR2);
24 
25   -- Converts Value to Id for an Unit Effectivity
26   PROCEDURE Convert_Effectivity_Val_To_ID(
27      p_x_unit_Effectivity_rec IN OUT NOCOPY AHL_UMP_UNITMAINT_PVT.Unit_Effectivity_rec_type,
28      x_return_status          OUT    NOCOPY VARCHAR2);
29 
30   -- Validates an Unit Effectivity
31   PROCEDURE Validate_Effectivity(
32      p_unit_Effectivity_rec IN            AHL_UMP_UNITMAINT_PVT.Unit_Effectivity_rec_type,
33      p_authorized_user_flag IN            VARCHAR2 := 'N',
34      x_return_status        IN OUT NOCOPY VARCHAR2);
35 
36   -- Validates Thresholds
37   PROCEDURE Validate_Thresholds(
38      p_unit_threshold_tbl   IN OUT  NOCOPY AHL_UMP_UNITMAINT_PVT.Unit_Threshold_tbl_type,
39      x_return_status        IN OUT  NOCOPY VARCHAR2);
40 
41   -- Validates Accomplishments
42   -- Added accomplishment date to fix bug# 6750836.
43   PROCEDURE Validate_Accomplishments(
44      p_unit_accomplish_tbl  IN OUT NOCOPY AHL_UMP_UNITMAINT_PVT.Unit_Accomplish_tbl_type,
45      p_accomplishment_date  IN            DATE,
46      p_ue_status_code       IN            VARCHAR2,
47      x_return_status        IN OUT NOCOPY VARCHAR2);
48 
49   -- Updates a Unit Effectivity
50   PROCEDURE Update_Unit_Effectivity(
51      p_unit_Effectivity_rec IN AHL_UMP_UNITMAINT_PVT.Unit_Effectivity_rec_type);
52 
53   -- Terminates a descendent Unit Effectivity
54   PROCEDURE Terminate_Descendent(
55      p_descendent_ue_id IN NUMBER);
56 
57   -- Updates Thresholds
58   PROCEDURE Update_Thresholds(
59      p_unit_Effectivity_rec IN AHL_UMP_UNITMAINT_PVT.Unit_Effectivity_rec_type,
60      p_x_unit_threshold_tbl IN OUT NOCOPY AHL_UMP_UNITMAINT_PVT.Unit_Threshold_tbl_type);
61 
62   -- Updates Accomplishments
63   -- Added p_unit_Effectivity_rec for R12: for counter lock
64   PROCEDURE Update_Accomplishments(
65      p_x_unit_accomplish_tbl IN OUT NOCOPY AHL_UMP_UNITMAINT_PVT.Unit_Accomplish_tbl_type,
66      p_unit_Effectivity_rec  IN            AHL_UMP_UNITMAINT_PVT.Unit_Effectivity_rec_type);
67 
68   -- Copies updated Thresholds from a sublist back to the original master list
69   PROCEDURE Restore_Thresholds(
70      p_x_unit_threshold_tbl   IN OUT NOCOPY AHL_UMP_UNITMAINT_PVT.Unit_Threshold_tbl_type,
71      p_unit_threshold_tbl     IN     AHL_UMP_UNITMAINT_PVT.Unit_Threshold_tbl_type);
72 
73   -- Copies updated Accomplishments from a sublist back to the original master list
74   PROCEDURE Restore_Accomplishments(
75      p_x_unit_accomplish_tbl   IN OUT NOCOPY AHL_UMP_UNITMAINT_PVT.Unit_Accomplish_tbl_type,
76      p_unit_accomplish_tbl     IN     AHL_UMP_UNITMAINT_PVT.Unit_Accomplish_tbl_type);
77 
78   -- Calls FMP API to match counters before accomplishments and terminations
79   PROCEDURE Match_Counters_with_FMP(
80      p_unit_effectivity_id     IN  NUMBER,
81      p_item_instance_id        IN  NUMBER,
82      p_mr_header_id            IN  NUMBER,
83      x_counters                OUT NOCOPY VARCHAR2,
84      x_return_status           OUT NOCOPY VARCHAR2);
85 
86   -- Converts value to ID for an MR.
87   Procedure Convert_MRID (p_x_mr_id        IN OUT NOCOPY  NUMBER,
88                           p_mr_title       IN             VARCHAR2,
89                           p_version_number IN             NUMBER);
90 
91   -- Converts value to ID for a Unit Configuration.
92   Procedure Convert_Unit (p_x_uc_header_id IN OUT NOCOPY  NUMBER,
93                           p_unit_name      IN             VARCHAR2);
94 
95   -- Converts value to ID for an item instance.
96   Procedure Convert_Instance (p_x_csi_item_instance_id IN OUT NOCOPY  NUMBER,
97                               p_csi_instance_number    IN             VARCHAR2);
98 
99   -- Validation procedure.
100   Procedure Validate_Input_Parameters (p_mr_header_id  IN  NUMBER,
101                                        p_x_csi_item_instance_id   IN OUT NOCOPY NUMBER,
102                                        p_unit_config_header_id  IN  NUMBER);
103 
104   -- AMSRINIV : Bug #4360784.. Removed p_unit_config_header_id as a input for Validate_PM_Input_Parameters
105   -- Tamal: Bug #4207212, #4114368 Begin
106   -- Validation procedure for PM mode.
107   Procedure Validate_PM_Input_Parameters (p_mr_header_id  IN  NUMBER,
108                                           p_csi_item_instance_id   IN  NUMBER,
109                                           p_contract_number  IN  VARCHAR2,
110                                           p_contract_modifier  IN  VARCHAR2);
111   -- Tamal: Bug #4207212, #4114368 End
112 
113   -- Procedure to mark a unit effectivity as MR-Terminated.
114   PROCEDURE MR_Terminate(p_unit_effectivity_id IN NUMBER);
115 
116   -- To log error messages into a log file if called from concurrent process.
117   PROCEDURE log_error_messages;
118 
119 -------------------------------------
120 -- End Local Procedures Declaration--
121 -------------------------------------
122 
123 -- Start of Comments --
124 --  Procedure name    : Process_UnitEffectivity
125 --  Type        : Private
126 --  Function    : Manages Create/Modify/Delete operations for unit maintenance requirements.
127 --  Pre-reqs    :
128 --  Parameters  :
129 --
130 --  Standard IN  Parameters :
131 --      p_api_version                   IN      NUMBER                Required
132 --      p_init_msg_list                 IN      VARCHAR2     Default  FND_API.G_FALSE
133 --      p_commit                        IN      VARCHAR2     Default  FND_API.G_FALSE
134 --      p_validation_level              IN      NUMBER       Default  FND_API.G_VALID_LEVEL_FULL
135 --      p_default                       IN      VARCHAR2     Default  FND_API.G_TRUE
136 --         Based on this flag, the API will set the default attributes.
137 --      p_module_type                   In      VARCHAR2     Default  NULL
138 --         This will be null.
139 --  Standard OUT Parameters :
140 --      x_return_status                 OUT     VARCHAR2               Required
141 --      x_msg_count                     OUT     NUMBER                 Required
142 --      x_msg_data                      OUT     VARCHAR2               Required
143 --
144 --  Process_UnitEffectivity Parameters :
145 --      If no input parameters are passed, then effectivity will be built for all units.
146 --      If either p_mr_header_id OR p_mr_title and p_mr_version_number are passed, then effectivity
147 --        will be built for all units having this maintenance requirement.
148 --      If either p_csi_item_instance_id OR p_csi_instance_number are passed, then effectivity
149 --        will be built for the specfic unit this item instance belongs to.
150 --      If either p_unit_name OR p_unit_config_header_id are passed, then effectivity will be
151 --        built for this specific unit configuration.
152 --      p_mr_header_id is the unique identifier of a maintenance requirement.
153 --
154 
155 PROCEDURE Process_UnitEffectivity (
156     p_api_version            IN            NUMBER,
157     p_init_msg_list          IN            VARCHAR2  := FND_API.G_FALSE,
158     p_commit                 IN            VARCHAR2  := FND_API.G_FALSE,
159     p_validation_level       IN            NUMBER    := FND_API.G_VALID_LEVEL_FULL,
160     p_default                IN            VARCHAR2  := FND_API.G_TRUE,
161     p_module_type            IN            VARCHAR2  := NULL,
162     x_return_status          OUT  NOCOPY   VARCHAR2,
163     x_msg_count              OUT  NOCOPY   NUMBER,
164     x_msg_data               OUT  NOCOPY   VARCHAR2,
165     p_mr_header_id           IN            NUMBER    := NULL,
166     p_mr_title               IN            VARCHAR2  := NULL,
167     p_mr_version_number      IN            NUMBER    := NULL,
168     p_unit_config_header_id  IN            NUMBER    := NULL,
169     p_unit_name              IN            VARCHAR2  := NULL,
170     p_csi_item_instance_id   IN            NUMBER    := NULL,
171     p_csi_instance_number    IN            VARCHAR2  := NULL
172 
173 )  IS
174 
175   l_api_version     CONSTANT NUMBER       := 1.0;
176   l_api_name        CONSTANT VARCHAR2(30) := 'Process_UnitEffectivity';
177 
178   -- Local variables.
179   l_mr_id                  NUMBER  := p_mr_header_id;
180   l_unit_config_header_id  NUMBER  := p_unit_config_header_id;
181   l_csi_item_instance_id   NUMBER  := p_csi_item_instance_id;
182   l_msg_count              NUMBER;
183 
184 
185 BEGIN
186   -- Standard start of API savepoint
187   SAVEPOINT Process_UnitEffectivity_PVT;
188 
189   -- Standard call to check for call compatibility
190   IF NOT FND_API.Compatible_API_Call(l_api_version, p_api_version, l_api_name,
191                                      G_PKG_NAME) THEN
192     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
193   END IF;
194 
195   -- Initialize message list if p_init_msg_list is set to TRUE
196   IF FND_API.To_Boolean(p_init_msg_list) THEN
197     FND_MSG_PUB.Initialize;
198   END IF;
199 
200   -- Initialize Procedure return status to success
201   x_return_status := FND_API.G_RET_STS_SUCCESS;
202 
203   -- Enable Debug.
204   IF G_DEBUG='Y'  THEN
205     AHL_DEBUG_PUB.enable_debug;
206   END IF;
207 
208   -- Add debug mesg.
209   IF G_DEBUG='Y'  THEN
210     AHL_DEBUG_PUB.debug('Begin private API:' ||  G_PKG_NAME || '.' || l_api_name);
211   END IF;
212 
213   -- Convert Value to IDs and validate.
214   -- For maintenance requirement.
215   IF (l_mr_id IS NULL OR l_mr_id = FND_API.G_MISS_NUM) THEN
216     Convert_MRID (l_mr_id, p_mr_title, p_mr_version_number);
217   END IF;
218 
219   -- For instance id.
220   IF (l_csi_item_instance_id IS NULL OR
221       l_csi_item_instance_id = FND_API.G_MISS_NUM) THEN
222     Convert_Instance (l_csi_item_instance_id, p_csi_instance_number);
223   END IF;
224 
225   -- For unit name.
226   IF (l_unit_config_header_id IS NULL OR
227       l_unit_config_header_id = FND_API.G_MISS_NUM) THEN
228     Convert_Unit (l_unit_config_header_id, p_unit_name);
229   END IF;
230 
231   Validate_Input_Parameters (l_mr_id, l_csi_item_instance_id, l_unit_config_header_id);
232 
233   -- Check Error Message stack.
234   l_msg_count := FND_MSG_PUB.count_msg;
235   IF l_msg_count > 0 THEN
236      RAISE  FND_API.G_EXC_ERROR;
237   END IF;
238 
239  -- Depending on input parameters call procedures for processing.
240   IF (l_mr_id IS NOT NULL) THEN
241            -- process all units affected by the MR.
242            AHL_UMP_ProcessUnit_PVT.Process_MRAffected_Units (
243                             x_msg_count      => x_msg_count,
244                             x_msg_data       => x_msg_data,
245                             x_return_status => x_return_status,
246                             p_mr_header_id  => l_mr_id);
247 
248   ELSIF (l_csi_item_instance_id IS NOT NULL) THEN
249            -- Call Process Unit for the item instance.
250            AHL_UMP_ProcessUnit_PVT.Process_Unit (
251                             x_msg_count            => x_msg_count,
252                             x_msg_data             => x_msg_data,
253                             x_return_status        => x_return_status,
254                             p_csi_item_instance_id => l_csi_item_instance_id);
255 
256 
257   ELSE
258            -- process all units.
259            AHL_UMP_ProcessUnit_PVT.Process_All_Units (
260                             x_msg_count            => x_msg_count,
261                             x_msg_data             => x_msg_data,
262                             x_return_status        => x_return_status);
263 
264   END IF;
265 
266   -- Check return status.
267   IF x_return_status = FND_API.G_RET_STS_ERROR THEN
268     RAISE FND_API.G_EXC_ERROR;
269   ELSIF x_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
270     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
271   END IF;
272 
273   -- Standard check of p_commit
274   IF FND_API.TO_BOOLEAN(p_commit) THEN
275       COMMIT WORK;
276   END IF;
277 
278   -- Standard call to get message count and if count is 1, get message info
279   FND_MSG_PUB.Count_And_Get
280     ( p_count => x_msg_count,
281       p_data  => x_msg_data,
282       p_encoded => fnd_api.g_false
283     );
284 
285 --
286 EXCEPTION
287  WHEN FND_API.G_EXC_ERROR THEN
288    x_return_status := FND_API.G_RET_STS_ERROR;
289    Rollback to Process_UnitEffectivity_PVT;
290    FND_MSG_PUB.count_and_get( p_count => x_msg_count,
291                               p_data  => x_msg_data,
292                               p_encoded => fnd_api.g_false);
293 
294    -- Disable debug
295    AHL_DEBUG_PUB.disable_debug;
296 
297 
298 
299  WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
300    x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
301    Rollback to Process_UnitEffectivity_PVT;
302    FND_MSG_PUB.count_and_get( p_count => x_msg_count,
303                               p_data  => x_msg_data,
304                               p_encoded => fnd_api.g_false);
305 
306    -- Disable debug
307    AHL_DEBUG_PUB.disable_debug;
308 
309  WHEN OTHERS THEN
310     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
311     Rollback to Process_UnitEffectivity_PVT;
312     IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
313        fnd_msg_pub.add_exc_msg(p_pkg_name       => G_PKG_NAME,
314                                p_procedure_name => 'Process_UnitEffectivity_PVT',
315                                p_error_text     => SUBSTR(SQLERRM,1,240));
316     END IF;
317     FND_MSG_PUB.count_and_get( p_count => x_msg_count,
318                                p_data  => x_msg_data,
319                                p_encoded => fnd_api.g_false);
320 
321     -- Disable debug
322     AHL_DEBUG_PUB.disable_debug;
323 
324 END Process_UnitEffectivity;
325 
326 --------------------------------------------------------------------------------------------
327 -- Start of Comments --
328 --  Procedure name    : Build_UnitEffectivity
329 --  Type        : Private
330 --  Function    : This procedure will build unit and item effectivity and commit.
331 --                Build_UnitEffectivity will commit at a unit level. If the
332 --                unit has any errors, then rollback will be performed for that unit only.
333 --
334 --  Pre-reqs    :
335 --  Parameters  :
336 --
337 --  Standard OUT Parameters :
338 --      x_return_status                 OUT     VARCHAR2               Required
339 --      x_msg_count                     OUT     NUMBER                 Required
340 --      x_msg_data                      OUT     VARCHAR2               Required
341 --
342 -- Parameters:
343 --  If no input parameters are passed, then effectivity will be built for all units.
344 --  If either p_mr_header_id OR p_mr_title and p_mr_version_number are passed, then effectivity
345 --  will be built for all units having this maintenance requirement; p_mr_header_id being
346 --  the unique
347 --  identifier of a maintenance requirement.
348 --  If either p_csi_item_instance_id OR p_csi_instance_number are passed, then effectivity
349 --  will be built for the unit this item instance belongs to.
350 --  If either p_unit_name OR p_unit_config_header_id are passed, then effectivity will be
351 --  built for the unit configuration.
352 --
353 
354 PROCEDURE Build_UnitEffectivity (
355               p_init_msg_list          IN            VARCHAR2 := FND_API.G_FALSE,
356               p_validation_level       IN            NUMBER    := FND_API.G_VALID_LEVEL_FULL,
357               p_default                IN            VARCHAR2  := FND_API.G_TRUE,
358               p_module_type            IN            VARCHAR2  := NULL,
359               x_return_status          OUT  NOCOPY   VARCHAR2,
360               x_msg_count              OUT  NOCOPY   NUMBER,
361               x_msg_data               OUT  NOCOPY   VARCHAR2,
362               p_mr_header_id           IN            NUMBER    := NULL,
363               p_mr_title               IN            VARCHAR2  := NULL,
364               p_mr_version_number      IN            NUMBER    := NULL,
365               p_unit_config_header_id  IN            NUMBER    := NULL,
366               p_unit_name              IN            VARCHAR2  := NULL,
367               p_csi_item_instance_id   IN            NUMBER    := NULL,
368               p_csi_instance_number    IN            VARCHAR2  := NULL,
369               -- Tamal: Bug #4207212, #4114368 Begin
370               p_contract_number        IN            VARCHAR2  := NULL,
371               p_contract_modifier      IN            VARCHAR2  := NULL,
372               -- Tamal: Bug #4207212, #4114368 End
373               p_concurrent_flag        IN            VARCHAR2  := 'N' ,
374               -- sracha: Added parameter to launch multiple workers.
375               p_num_of_workers         IN            NUMBER    := 1,
376               p_mtl_category_id        IN            NUMBER    := NULL,
377               p_process_option         IN            VARCHAR2  := NULL)
378 IS
379 
380   -- Local variables.
381   l_api_name               VARCHAR2(200) := 'Build_UnitEffectivity';
382   l_mr_id                  NUMBER  := p_mr_header_id;
383   l_unit_config_header_id  NUMBER  := p_unit_config_header_id;
384   l_csi_item_instance_id   NUMBER  := p_csi_item_instance_id;
385   l_contract_number        VARCHAR2(120)  := p_contract_number;
386   l_contract_modifier      VARCHAR2(120)  := p_contract_modifier;
387   l_return_status          VARCHAR2(1);
388   l_msg_count              NUMBER;
389 
390 BEGIN
391 
392   -- Initialize message list if p_init_msg_list is set to TRUE
393   IF FND_API.To_Boolean(p_init_msg_list) THEN
394     FND_MSG_PUB.Initialize;
395   END IF;
396 
397   -- Initialize Procedure return status to success
398   x_return_status := FND_API.G_RET_STS_SUCCESS;
399 
400   -- Enable Debug.
401   IF G_DEBUG='Y'  THEN
402     AHL_DEBUG_PUB.enable_debug;
403   END IF;
404 
405   -- Add debug mesg.
406   IF G_DEBUG='Y'  THEN
407     AHL_DEBUG_PUB.debug('Begin private API:' ||  G_PKG_NAME || '.' || l_api_name);
408   END IF;
409 
410   -- Convert Value to IDs and validate.
411   -- For maintenance requirement.
412   IF (l_mr_id IS NULL OR l_mr_id = FND_API.G_MISS_NUM) THEN
413     Convert_MRID (l_mr_id, p_mr_title, p_mr_version_number);
414   END IF;
415 
416   -- For instance id.
417   IF (l_csi_item_instance_id IS NULL OR
418       l_csi_item_instance_id = FND_API.G_MISS_NUM) THEN
419     Convert_Instance (l_csi_item_instance_id, p_csi_instance_number);
420   END IF;
421 
422   -- For unit name.
423   IF (l_unit_config_header_id IS NULL OR
424       l_unit_config_header_id = FND_API.G_MISS_NUM) THEN
425     Convert_Unit (l_unit_config_header_id, p_unit_name);
426   END IF;
427 
428   --AMSRINIV: Bug #4360784
429   -- Tamal: Bug #4207212, #4114368 Begin
430   IF (ahl_util_pkg.is_pm_installed = 'Y')
431   THEN
432     Validate_PM_Input_Parameters (l_mr_id, l_csi_item_instance_id, l_contract_number, l_contract_modifier);
433   ELSE
434     Validate_Input_Parameters (l_mr_id, l_csi_item_instance_id, l_unit_config_header_id);
435   END IF;
436   -- Tamal: Bug #4207212, #4114368 End
437 
438   -- Check Error Message stack.
439   l_msg_count := FND_MSG_PUB.count_msg;
440   IF l_msg_count > 0 THEN
441      RAISE  FND_API.G_EXC_ERROR;
442   END IF;
443 
444   -- Depending on input parameters call procedures for processing.
445   -- Tamal: Bug #4207212, #4114368 Begin
446   IF (l_contract_number IS NOT NULL and ahl_util_pkg.is_pm_installed = 'Y') THEN
447         -- Process all units affected by the contract number...
448         AHL_UMP_ProcessUnit_PVT.Process_PM_Contracts
449         (
450             p_commit            => FND_API.G_TRUE,
451             p_init_msg_list     => FND_API.G_FALSE,
452             x_msg_count         => x_msg_count,
453             x_msg_data          => x_msg_data,
454             x_return_status     => x_return_status,
455             p_contract_number   => l_contract_number,
456             p_contract_modifier => l_contract_modifier,
457             p_concurrent_flag   => p_concurrent_flag
458         );
459   -- Tamal: Bug #4207212, #4114368 End
460   ELSIF (l_mr_id IS NOT NULL) THEN
461            -- process all units affected by the MR.
462            AHL_UMP_ProcessUnit_PVT.Process_MRAffected_Units (
463                             p_commit           => FND_API.G_TRUE,
464                             x_msg_count        => x_msg_count,
465                             x_msg_data         => x_msg_data,
466                             x_return_status    => x_return_status,
467                             p_mr_header_id     => l_mr_id,
468                             p_concurrent_flag  => p_concurrent_flag,
469                             p_num_of_workers   => p_num_of_workers,
470                             p_mtl_category_id  => p_mtl_category_id,
471                             p_process_option   => p_process_option);
472 
473   ELSIF (l_csi_item_instance_id IS NOT NULL) THEN
474            -- Call Process Unit for the item instance.
475            AHL_UMP_ProcessUnit_PVT.Process_Unit (
476                             p_commit               => FND_API.G_TRUE,
477                             x_msg_count            => x_msg_count,
478                             x_msg_data             => x_msg_data,
479                             x_return_status        => x_return_status,
480                             p_csi_item_instance_id => l_csi_item_instance_id,
481                             p_concurrent_flag      => p_concurrent_flag);
482 
483   ELSE
484            -- process all units.
485            AHL_UMP_ProcessUnit_PVT.Process_All_Units (
486                             p_commit               => FND_API.G_TRUE,
487                             x_msg_count            => x_msg_count,
488                             x_msg_data             => x_msg_data,
489                             x_return_status        => x_return_status,
490                             p_concurrent_flag      => p_concurrent_flag,
491                             p_num_of_workers       => p_num_of_workers,
492                             p_mtl_category_id      => p_mtl_category_id,
493                             p_process_option       => p_process_option);
494 
495   END IF;
496 
497   -- Check return status.
498   IF l_return_status = FND_API.G_RET_STS_ERROR THEN
499     RAISE FND_API.G_EXC_ERROR;
500   ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
501     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
502   END IF;
503 
504   -- Standard call to get message count and if count is 1, get message info
505   FND_MSG_PUB.Count_And_Get
506     ( p_count => x_msg_count,
507       p_data  => x_msg_data,
508       p_encoded => fnd_api.g_false
509     );
510 
511 --
512 EXCEPTION
513  WHEN FND_API.G_EXC_ERROR THEN
514    x_return_status := FND_API.G_RET_STS_ERROR;
515    FND_MSG_PUB.count_and_get( p_count => x_msg_count,
516                               p_data  => x_msg_data,
517                               p_encoded => fnd_api.g_false);
518    IF (p_concurrent_flag = 'Y') THEN
519      fnd_file.put_line(fnd_file.log, 'Building Unit Effectivity failed. Refer to the error message below.');
520      log_error_messages;
521    END IF;
522    -- Disable debug
523    AHL_DEBUG_PUB.disable_debug;
524 
525 
526 
527  WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
528    x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
529    FND_MSG_PUB.count_and_get( p_count => x_msg_count,
530                               p_data  => x_msg_data,
531                               p_encoded => fnd_api.g_false);
532 
533    IF (p_concurrent_flag = 'Y') THEN
534      fnd_file.put_line(fnd_file.log, 'Building Unit Effectivity failed. Refer to the error message below.');
535      log_error_messages;
536    END IF;
537    -- Disable debug
538    AHL_DEBUG_PUB.disable_debug;
539 
540  WHEN OTHERS THEN
541     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
542     IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
543        fnd_msg_pub.add_exc_msg(p_pkg_name       => G_PKG_NAME,
544                                p_procedure_name => 'Build_UnitEffectivity_PVT',
545                                p_error_text     => SUBSTR(SQLERRM,1,240));
546     END IF;
547     FND_MSG_PUB.count_and_get( p_count => x_msg_count,
548                                p_data  => x_msg_data,
549                                p_encoded => fnd_api.g_false);
550 
551     IF (p_concurrent_flag = 'Y') THEN
552      fnd_file.put_line(fnd_file.log, 'Building Unit Effectivity failed. Refer to the error message below.');
553      log_error_messages;
554     END IF;
555 
556     -- Disable debug
557     AHL_DEBUG_PUB.disable_debug;
558 
559 END Build_UnitEffectivity;
560 
561 -----------------------------
562 
563 PROCEDURE Capture_MR_Updates
564 (
565     p_api_version           IN            NUMBER,
566     p_init_msg_list         IN            VARCHAR2  := FND_API.G_FALSE,
567     p_commit                IN            VARCHAR2  := FND_API.G_FALSE,
568     p_validation_level      IN            NUMBER    := FND_API.G_VALID_LEVEL_FULL,
569     p_default               IN            VARCHAR2  := FND_API.G_TRUE,
570     p_module_type           IN            VARCHAR2  := NULL,
571     p_unit_Effectivity_tbl  IN            AHL_UMP_UNITMAINT_PVT.Unit_Effectivity_tbl_type,
572     p_x_unit_threshold_tbl  IN OUT NOCOPY AHL_UMP_UNITMAINT_PVT.Unit_Threshold_tbl_type,
573     p_x_unit_accomplish_tbl IN OUT NOCOPY AHL_UMP_UNITMAINT_PVT.Unit_Accomplish_tbl_type,
574     x_return_status         OUT    NOCOPY VARCHAR2,
575     x_msg_count             OUT    NOCOPY NUMBER,
576     x_msg_data              OUT    NOCOPY VARCHAR2) IS
577 
578    l_api_version            CONSTANT NUMBER := 1.5;
579    l_api_name               CONSTANT VARCHAR2(30) := 'Capture_MR_Updates';
580    l_unit_Effectivity_rec   AHL_UMP_UNITMAINT_PVT.Unit_Effectivity_rec_type;
581    l_unit_threshold_tbl     AHL_UMP_UNITMAINT_PVT.Unit_Threshold_tbl_type;
582    l_unit_accomplish_tbl    AHL_UMP_UNITMAINT_PVT.Unit_Accomplish_tbl_type;
583    l_MR_Initialization_flag VARCHAR2(1) := 'N';
584    l_prev_status            VARCHAR2(30);
585    l_prev_object_version_no NUMBER;
586    l_counter_index          BINARY_INTEGER   := 0;
587    l_temp_return_status     VARCHAR2(30);
588 
589 BEGIN
590 
591   -- Standard start of API savepoint
592   SAVEPOINT Capture_MR_Updates_pvt;
593 
594   -- Standard call to check for call compatibility
595   IF NOT FND_API.Compatible_API_Call(l_api_version, p_api_version, l_api_name,
596                                      G_PKG_NAME) THEN
597     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
598   END IF;
599 
600     -- Initialize message list if p_init_msg_list is set to TRUE
601   IF FND_API.To_Boolean(p_init_msg_list) THEN
602     FND_MSG_PUB.Initialize;
603   END IF;
604 
605   -- Initialize API return status to success
606   x_return_status := FND_API.G_RET_STS_SUCCESS;
607 
608   -- Begin Processing
609 
610   -- Enable Debug (optional)
611   IF G_DEBUG='Y'  THEN
612     AHL_DEBUG_PUB.enable_debug;
613   END IF;
614 
615   -- Check if the user is authorized: is in role AHL_UMP_MR_INITIALIZE
616   -- This functionality is not available now. So allow always
617   l_MR_Initialization_flag := 'Y';
618 
619   IF (p_unit_Effectivity_tbl.COUNT > 0) THEN
620     -- If from JSP, nullify counter ids since they come from LOV
621     IF (p_module_type = 'JSP') THEN
622         IF (p_x_unit_threshold_tbl.COUNT > 0) THEN
623           FOR i IN p_x_unit_threshold_tbl.FIRST..p_x_unit_threshold_tbl.LAST LOOP
624             p_x_unit_threshold_tbl(i).COUNTER_ID := null;
625           END LOOP;
626         END IF;
627         IF (p_x_unit_accomplish_tbl.COUNT > 0) THEN
628           FOR j IN p_x_unit_accomplish_tbl.FIRST..p_x_unit_accomplish_tbl.LAST LOOP
629             p_x_unit_accomplish_tbl(j).COUNTER_ID := null;
630           END LOOP;
631         END IF;
632     END IF;
633 
634     IF FND_API.to_boolean( p_default ) THEN
635       -- No special default settings required in this API
636       null;
637     END IF;
638     IF G_DEBUG='Y'  THEN
639       AHL_DEBUG_PUB.debug('Beginning Processing... ', 'UMP');
640     END IF;
641     -- Start processing
642     FOR i IN p_unit_Effectivity_tbl.FIRST..p_unit_Effectivity_tbl.LAST LOOP
643       -- Initialize Return Status for this Unit Effectivity to SUCCESS
644       l_temp_return_status := FND_API.G_RET_STS_SUCCESS;
645       l_unit_Effectivity_rec := p_unit_Effectivity_tbl(i);
646 
647       -- Resolve Values to Ids
648       convert_effectivity_val_to_id(l_unit_Effectivity_rec, l_temp_return_status);
649       IF G_DEBUG='Y'  THEN
650         AHL_DEBUG_PUB.debug('Resolved Values to Id for Effectivity', 'UMP');
651       END IF;
652       -- Ignore errors from the resolution process
653       l_temp_return_status := FND_API.G_RET_STS_SUCCESS;
654 
655       -- Validate the current unit effectivity record
656       Validate_Effectivity(l_unit_Effectivity_rec, l_MR_Initialization_flag, l_temp_return_status);
657       IF G_DEBUG='Y'  THEN
658         AHL_DEBUG_PUB.debug('Validated Effectivity, Status = ' || l_temp_return_status, 'UMP');
659 
660       END IF;
661       -- Continue processing this effectivity only if there are no errors
662       IF G_DEBUG='Y'  THEN
663         AHL_DEBUG_PUB.debug('About to process thresholds', 'UMP');
664         AHL_DEBUG_PUB.debug('Count threshold:' || p_x_unit_threshold_tbl.count, 'UMP');
665       END IF;
666       IF l_temp_return_status = FND_API.G_RET_STS_SUCCESS THEN
667         -- Get all the thresholds for the current effectivity
668         IF (p_x_unit_threshold_tbl.COUNT > 0) THEN
669           l_counter_index := 0;
670           FOR j IN p_x_unit_threshold_tbl.FIRST..p_x_unit_threshold_tbl.LAST LOOP
671             IF (p_x_unit_threshold_tbl(j).UNIT_EFFECTIVITY_ID = l_unit_Effectivity_rec.UNIT_EFFECTIVITY_ID) THEN
672               l_counter_index := l_counter_index + 1;
673               l_unit_threshold_tbl(l_counter_index) := p_x_unit_threshold_tbl(j);
674             END IF;
675           END LOOP;  /* thresholds-table */
676           Validate_Thresholds(l_unit_threshold_tbl, l_temp_return_status);
677           IF G_DEBUG='Y'  THEN
678             AHL_DEBUG_PUB.debug('Validated Threshold', 'UMP');
679           END IF;
680         END IF;
681 
682         IF G_DEBUG='Y'  THEN
683           AHL_DEBUG_PUB.debug('About to process accomplishments', 'UMP');
684           AHL_DEBUG_PUB.debug('Count accomplishments Tbl:' || p_x_unit_accomplish_tbl.count, 'UMP');
685         END IF;
686         -- Get all the accomplishments for the current effectivity
687         IF (p_x_unit_accomplish_tbl.COUNT > 0) THEN
688           l_counter_index := 0;
689           FOR k IN p_x_unit_accomplish_tbl.FIRST..p_x_unit_accomplish_tbl.LAST LOOP
690             IF (p_x_unit_accomplish_tbl(k).UNIT_EFFECTIVITY_ID = l_unit_Effectivity_rec.UNIT_EFFECTIVITY_ID) THEN
691               l_counter_index := l_counter_index + 1;
692               l_unit_accomplish_tbl(l_counter_index) := p_x_unit_accomplish_tbl(k);
693             END IF;
694           END LOOP;  /* accomplishments-table */
695           Validate_Accomplishments(l_unit_accomplish_tbl, l_unit_Effectivity_rec.ACCOMPLISHED_DATE,
696                                    l_unit_Effectivity_rec.STATUS_CODE, l_temp_return_status);
697           IF G_DEBUG='Y'  THEN
698             AHL_DEBUG_PUB.debug('Validated Accomplishment', 'UMP');
699           END IF;
700         END IF;
701 
702         -- Proceed to updating the database only if there are no errors
703         IF l_temp_return_status = FND_API.G_RET_STS_SUCCESS THEN
704 
705           IF G_DEBUG='Y'  THEN
706             AHL_DEBUG_PUB.debug('About to update thresholds', 'UMP');
707           END IF;
708           -- First Update the Unit Thresholds Table
709           Update_Thresholds(l_unit_Effectivity_rec,
710                             l_unit_threshold_tbl);
711           IF G_DEBUG='Y'  THEN
712             AHL_DEBUG_PUB.debug('About to restore thresholds', 'UMP');
713           END IF;
714           -- Restore the saved thresholds in the IN OUT parameter
715           Restore_Thresholds(p_x_unit_threshold_tbl, l_unit_threshold_tbl);
716 
717           IF G_DEBUG='Y'  THEN
718             AHL_DEBUG_PUB.debug('About to update accomplishments', 'UMP');
719           END IF;
720           -- Next Update the Unit Accomplishments Table
721           Update_Accomplishments(l_unit_accomplish_tbl, l_unit_Effectivity_rec);
722           IF G_DEBUG='Y'  THEN
723             AHL_DEBUG_PUB.debug('About to restore accomplishments', 'UMP');
724           END IF;
725           -- Restore the saved accomplishments in the IN OUT parameter
726           Restore_Accomplishments(p_x_unit_accomplish_tbl, l_unit_accomplish_tbl);
727 
728           IF G_DEBUG='Y'  THEN
729             AHL_DEBUG_PUB.debug('About to update unit effectivity', 'UMP');
730           END IF;
731           -- Finally update the Unit Effectivities Table
732           Update_Unit_Effectivity(l_unit_Effectivity_rec);
733           IF G_DEBUG='Y'  THEN
734             AHL_DEBUG_PUB.debug('Updated unit effectivity', 'UMP');
735           END IF;
736         END IF;
737       END IF;
738 
739       -- Clear the local tables to prepare for next Unit effectivity
740       l_unit_threshold_tbl.DELETE;
741       l_unit_accomplish_tbl.DELETE;
742     END LOOP;  /* effectivity-table */
743   END IF;
744 
745   IF G_DEBUG='Y'  THEN
746     AHL_DEBUG_PUB.debug('Completed Processing. Checking for errors', 'UMP');
747   END IF;
748   -- Check Error Message stack.
749   x_msg_count := FND_MSG_PUB.count_msg;
750   IF x_msg_count > 0 THEN
751     RAISE  FND_API.G_EXC_ERROR;
752   END IF;
753 
754   -- Standard check of p_commit
755   IF FND_API.TO_BOOLEAN(p_commit) THEN
756       COMMIT WORK;
757   END IF;
758 
759   -- Standard call to get message count and if count is 1, get message info
760   FND_MSG_PUB.Count_And_Get
761     ( p_count => x_msg_count,
762       p_data  => x_msg_data,
763       p_encoded => fnd_api.g_false
764     );
765 
766   -- Disable debug (if enabled)
767   AHL_DEBUG_PUB.disable_debug;
768 
769 EXCEPTION
770  WHEN FND_API.G_EXC_ERROR THEN
771    Rollback to Capture_MR_Updates_pvt;
772    x_return_status := FND_API.G_RET_STS_ERROR;
773    FND_MSG_PUB.count_and_get( p_count => x_msg_count,
774                               p_data  => x_msg_data,
775                               p_encoded => fnd_api.g_false);
776    --AHL_UTIL_PKG.Err_Mesg_To_Table(x_err_mesg_tbl);
777 
778 
779  WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
780    Rollback to Capture_MR_Updates_pvt;
781    x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
782    FND_MSG_PUB.count_and_get( p_count => x_msg_count,
783                               p_data  => x_msg_data,
784                               p_encoded => fnd_api.g_false);
785    --AHL_UTIL_PKG.Err_Mesg_To_Table(x_err_mesg_tbl);
786 
787  WHEN OTHERS THEN
788     Rollback to Capture_MR_Updates_pvt;
789     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
790     IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
791        fnd_msg_pub.add_exc_msg(p_pkg_name       => G_PKG_NAME,
792                                p_procedure_name => 'Capture_MR_Updates',
793                                p_error_text     => SUBSTR(SQLERRM,1,240));
794     END IF;
795     FND_MSG_PUB.count_and_get( p_count => x_msg_count,
796                                p_data  => x_msg_data,
797                                p_encoded => fnd_api.g_false);
798     --AHL_UTIL_PKG.Err_Mesg_To_Table(x_err_mesg_tbl);
799 
800 
801 END Capture_MR_Updates;
802 
803 -----------------------------
804 
805 PROCEDURE Validate_For_Initialize
806 (
807     p_api_version           IN            NUMBER,
808     p_init_msg_list         IN            VARCHAR2  := FND_API.G_FALSE,
809     p_commit                IN            VARCHAR2  := FND_API.G_FALSE,
810     p_validation_level      IN            NUMBER    := FND_API.G_VALID_LEVEL_FULL,
811     p_default               IN            VARCHAR2  := FND_API.G_TRUE,
812     p_module_type           IN            VARCHAR2  := NULL,
813     p_unit_effectivity_id   IN            NUMBER,
814     x_return_status         OUT  NOCOPY   VARCHAR2,
815     x_msg_count             OUT  NOCOPY   NUMBER,
816     x_msg_data              OUT  NOCOPY   VARCHAR2
817 ) IS
818 
819 
820   CURSOR l_child_mr_csr(p_ue_id IN NUMBER) IS
821     SELECT 'x'
822     FROM  AHL_UE_RELATIONSHIPS
823     WHERE related_ue_id = p_ue_id;
824 
825   CURSOR l_prior_initializations_csr(p_mr_id IN NUMBER,
826                                      p_item_instance_id IN NUMBER,
827                                      p_ue_id IN NUMBER) IS
828     SELECT 'x'
829     FROM  AHL_UNIT_EFFECTIVITIES_APP_V
830     WHERE MR_HEADER_ID = p_mr_id AND
831     CSI_ITEM_INSTANCE_ID = p_item_instance_id AND
832     status_code IN ('INIT-DUE', 'INIT-ACCOMPLISHED') AND
833     UNIT_EFFECTIVITY_ID <> p_ue_id;
834 
835   CURSOR l_ue_details_csr(p_ue_id IN NUMBER) IS
836     SELECT MR_HEADER_ID, CSI_ITEM_INSTANCE_ID, REPETITIVE_MR_FLAG, STATUS_CODE
837     FROM  AHL_UNIT_EFFECTIVITIES_APP_V
838     WHERE UNIT_EFFECTIVITY_ID = p_ue_id;
839 
840   l_api_version            CONSTANT NUMBER := 1.0;
841   l_api_name               CONSTANT VARCHAR2(30) := 'Validate_For_Initialize';
842   l_junk                   VARCHAR2(1);
843   l_mr_id                  NUMBER;
844   l_item_instance_id       NUMBER;
845   l_repetitive_mr_flag     VARCHAR2(1);
846   l_status_code            VARCHAR2(30);
847   l_MR_Initialization_flag VARCHAR2(1) := 'N';
848   l_last_accomplish_date   DATE := null;
849   l_last_ue_id             NUMBER := null;
850   l_temp_status            BOOLEAN;
851   l_temp_status_code       VARCHAR2(30);
852   l_temp_deferral_flag     BOOLEAN;
853 
854   l_prior_ue_status        VARCHAR2(30);
855 
856   -- added for visit validation
857   l_visit_status           VARCHAR2(100);
858 
859 BEGIN
860   --IF G_DEBUG='Y'  THEN
861   --  AHL_DEBUG_PUB.enable_debug;
862   --END IF;
863   -- Standard call to check for call compatibility
864   IF NOT FND_API.Compatible_API_Call(l_api_version, p_api_version, l_api_name,
865                                      G_PKG_NAME) THEN
866     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
867   END IF;
868 
869     -- Initialize message list if p_init_msg_list is set to TRUE
870   IF FND_API.To_Boolean(p_init_msg_list) THEN
871     FND_MSG_PUB.Initialize;
872   END IF;
873 
874   -- Initialize API return status to success
875   x_return_status := FND_API.G_RET_STS_SUCCESS;
876 
877   -- Begin Processing
878 
879   -- Ensure that the User is authorized to initialize
880   -- This functionality is not available now. So allow always
881   l_MR_Initialization_flag := 'Y';
882   IF (l_MR_Initialization_flag <> 'Y') THEN
883     x_return_status := FND_API.G_RET_STS_ERROR;
884     FND_MESSAGE.Set_Name('AHL','AHL_UMP_UNAUTHORIZED_USER');
885     FND_MSG_PUB.ADD;
886     --IF G_DEBUG='Y'  THEN
887       --AHL_DEBUG_PUB.debug('Unauthorized User', 'UMP:Validate_For_Initialize');
888     --END IF;
889     RAISE  FND_API.G_EXC_ERROR;
890   END IF;
891 
892   IF (p_unit_effectivity_id IS NULL OR p_unit_effectivity_id = FND_API.G_MISS_NUM) THEN
893     x_return_status := FND_API.G_RET_STS_ERROR;
894     FND_MESSAGE.Set_Name('AHL','AHL_UMP_UE_ID_NULL');
895     FND_MSG_PUB.ADD;
896     --IF G_DEBUG='Y'  THEN
897       --AHL_DEBUG_PUB.debug('Null Effectivity', 'UMP:Validate_For_Initialize');
898     --END IF;
899     RAISE  FND_API.G_EXC_ERROR;
900   END IF;
901 
902   -- Ensure that this is not a repetitive MR
903   OPEN l_ue_details_csr(p_unit_effectivity_id);
904   FETCH l_ue_details_csr INTO l_mr_id, l_item_instance_id, l_repetitive_mr_flag, l_status_code;
905   IF (l_ue_details_csr%NOTFOUND) THEN
906     x_return_status := FND_API.G_RET_STS_ERROR;
907     FND_MESSAGE.Set_Name('AHL','AHL_UMP_UE_ID_INVALID');
908     FND_MESSAGE.Set_Token('UEID', p_unit_effectivity_id);
909     FND_MSG_PUB.ADD;
910     CLOSE l_ue_details_csr;
911     --IF G_DEBUG='Y'  THEN
912       --AHL_DEBUG_PUB.debug('Invalid Effectivity Id', 'UMP:Validate_For_Initialize');
913     --END IF;
914     RAISE  FND_API.G_EXC_ERROR;
915   ELSE
916     --Ensure that unit is not locked
917     IF(AHL_UTIL_UC_PKG.IS_UNIT_QUARANTINED(p_unit_header_id => null, p_instance_id => l_item_instance_id) = FND_API.G_TRUE) THEN
918 	  x_return_status := FND_API.G_RET_STS_ERROR;
919 	  FND_MESSAGE.Set_Name('AHL','AHL_UMP_INIT_UNIT_LOCKED');
920           FND_MSG_PUB.ADD;
921 	  CLOSE l_ue_details_csr;
922 	  RAISE  FND_API.G_EXC_ERROR;
923     END IF;
924     IF (l_repetitive_mr_flag = 'Y') THEN
925       x_return_status := FND_API.G_RET_STS_ERROR;
926       FND_MESSAGE.Set_Name('AHL','AHL_UMP_INVALID_MR_TYPE');
927       FND_MSG_PUB.ADD;
928       --IF G_DEBUG='Y'  THEN
929         --AHL_DEBUG_PUB.debug('Repetitive Effectivity', 'UMP:Validate_For_Initialize');
930       --END IF;
931       CLOSE l_ue_details_csr;
932       RAISE  FND_API.G_EXC_ERROR;
933     ELSE
934       CLOSE l_ue_details_csr;
935     END IF;
936   END IF;
937 
938   -- Ensure that this is not a child MR
939   OPEN l_child_mr_csr(p_unit_effectivity_id);
940   FETCH l_child_mr_csr INTO l_junk;
941   IF (l_child_mr_csr%FOUND) THEN
942     FND_MESSAGE.Set_Name('AHL','AHL_UMP_CHILD_MR');
943     FND_MSG_PUB.ADD;
944     CLOSE l_child_mr_csr;
945     --IF G_DEBUG='Y'  THEN
946       --AHL_DEBUG_PUB.debug('Child MR', 'UMP:Validate_For_Initialize');
947     --END IF;
948     RAISE  FND_API.G_EXC_ERROR;
949   ELSE
950     CLOSE l_child_mr_csr;
951   END IF;
952 
953   -- Ensure that the Current status is null, init-due or init-accomplished only
954   IF ((l_status_code IS NOT NULL) AND (l_status_code <> 'INIT-DUE') AND (l_status_code <> 'INIT-ACCOMPLISHED')) THEN
955     x_return_status := FND_API.G_RET_STS_ERROR;
956     FND_MESSAGE.Set_Name('AHL','AHL_UMP_INVALID_STATUS');
957     FND_MESSAGE.Set_Token('STATUS', l_status_code);
958     FND_MSG_PUB.ADD;
959     --IF G_DEBUG='Y'  THEN
960       --AHL_DEBUG_PUB.debug('Invalid Status: ' || 'l_status_code', 'UMP:Validate_For_Initialize');
961     --END IF;
962     RAISE  FND_API.G_EXC_ERROR;
963   END IF;
964 
965   -- Ensure that there are no prior accomplishments
966   AHL_UMP_UTIL_PKG.get_last_accomplishment(l_item_instance_id, l_mr_id, l_last_accomplish_date, l_last_ue_id, l_temp_deferral_flag, l_temp_status_code, l_temp_status);
967   IF (l_temp_status = FALSE) THEN
968     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
969   END IF;
970   IF (l_temp_status_code <> 'INIT-ACCOMPLISHED' and l_last_accomplish_date IS NOT null) THEN
971     FND_MESSAGE.Set_Name('AHL','AHL_UMP_ALRDY_ACCMPLSHD');
972     FND_MSG_PUB.ADD;
973     --IF G_DEBUG='Y'  THEN
974       --AHL_DEBUG_PUB.debug('Already Accomplished', 'UMP:Validate_For_Initialize');
975     --END IF;
976     RAISE  FND_API.G_EXC_ERROR;
977   END IF;
978 
979   -- Ensure that there are no prior initializations
980   OPEN l_prior_initializations_csr(l_mr_id, l_item_instance_id, p_unit_effectivity_id);
981   FETCH l_prior_initializations_csr INTO l_prior_ue_status;
982   IF (l_prior_initializations_csr%FOUND) THEN
983     x_return_status := FND_API.G_RET_STS_ERROR;
984     IF (l_prior_ue_status = 'DEFERRED') THEN
985         FND_MESSAGE.Set_Name('AHL','AHL_UMP_ALRDY_DEFERRED');
986         FND_MSG_PUB.ADD;
987     ELSE
988         FND_MESSAGE.Set_Name('AHL','AHL_UMP_ALRDY_INITLZD');
989     FND_MSG_PUB.ADD;
990     END IF;
991     CLOSE l_prior_initializations_csr;
992     --IF G_DEBUG='Y'  THEN
993       --AHL_DEBUG_PUB.debug('Has prior Initializations', 'UMP:Validate_For_Initialize');
994     --END IF;
995     RAISE  FND_API.G_EXC_ERROR;
996   ELSE
997     CLOSE l_prior_initializations_csr;
998   END IF;
999 
1000   x_msg_count := FND_MSG_PUB.count_msg;
1001   IF x_msg_count > 0 THEN
1002     RAISE  FND_API.G_EXC_ERROR;
1003   END IF;
1004 
1005 EXCEPTION
1006  WHEN FND_API.G_EXC_ERROR THEN
1007    x_return_status := FND_API.G_RET_STS_ERROR;
1008    x_msg_count := FND_MSG_PUB.count_msg;
1009    FND_MSG_PUB.count_and_get( p_count => x_msg_count,
1010                               p_data  => x_msg_data,
1011                               p_encoded => fnd_api.g_false);
1012 
1013 
1014  WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
1015    x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1016    x_msg_count := FND_MSG_PUB.count_msg;
1017    FND_MSG_PUB.count_and_get( p_count => x_msg_count,
1018                               p_data  => x_msg_data,
1019                               p_encoded => fnd_api.g_false);
1020 
1021  WHEN OTHERS THEN
1022    x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1023    x_msg_count := FND_MSG_PUB.count_msg;
1024 --    IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
1025 --       fnd_msg_pub.add_exc_msg(p_pkg_name       => G_PKG_NAME,
1026 --                               p_procedure_name => 'Validate_For_Initialize',
1027 --                               p_error_text     => SUBSTR(SQLERRM,1,240));
1028 --    END IF;
1029    FND_MSG_PUB.count_and_get( p_count => x_msg_count,
1030                                p_data  => x_msg_data,
1031                                p_encoded => fnd_api.g_false);
1032 
1033 END Validate_For_Initialize;
1034 
1035 ----------------------------------------
1036 -- Local Procedure Definitions follow --
1037 ----------------------------------------
1038 
1039 PROCEDURE Convert_Effectivity_Val_To_ID(
1040      p_x_unit_Effectivity_rec IN OUT  NOCOPY AHL_UMP_UNITMAINT_PVT.Unit_Effectivity_rec_type,
1041      x_return_status          OUT     NOCOPY VARCHAR2 ) IS
1042 
1043   CURSOR l_get_mr_id_csr(p_mr_title          IN VARCHAR2,
1044                      p_mr_version_number IN NUMBER) IS
1045     SELECT MR_HEADER_ID
1046     FROM  AHL_MR_HEADERS_B
1047     WHERE TITLE = p_mr_title AND
1048           VERSION_NUMBER = p_mr_version_number;
1049 
1050   CURSOR l_get_item_instance_id_csr(p_instance_number IN VARCHAR2) IS
1051     SELECT INSTANCE_ID
1052     FROM  CSI_ITEM_INSTANCES
1053     WHERE INSTANCE_NUMBER = p_instance_number;
1054 
1055   CURSOR l_get_status_code_csr(p_status_meaning IN VARCHAR2) IS
1056     SELECT LOOKUP_CODE
1057     FROM  fnd_lookup_values_vl
1058     WHERE lookup_type = 'AHL_UNIT_EFFECTIVITY_STATUS' AND
1059           MEANING = p_status_meaning;
1060 
1061    l_mr_id             NUMBER;
1062    l_item_instance_id  NUMBER;
1063    l_status_code       VARCHAR2(30);
1064 
1065 BEGIN
1066   -- Initialize API return status to success
1067   x_return_status := FND_API.G_RET_STS_SUCCESS;
1068 
1069   -- Resolve MR_ID
1070   IF(p_x_unit_Effectivity_rec.MR_ID IS NULL OR p_x_unit_Effectivity_rec.MR_ID = FND_API.G_MISS_NUM) THEN
1071     IF((p_x_unit_Effectivity_rec.MR_TITLE IS NOT NULL AND p_x_unit_Effectivity_rec.MR_TITLE <> FND_API.G_MISS_CHAR) AND
1072        (p_x_unit_Effectivity_rec.MR_VERSION_NUMBER IS NOT NULL AND p_x_unit_Effectivity_rec.MR_VERSION_NUMBER <> FND_API.G_MISS_NUM)) THEN
1073       OPEN l_get_mr_id_csr(p_x_unit_Effectivity_rec.MR_TITLE, p_x_unit_Effectivity_rec.MR_VERSION_NUMBER);
1074       FETCH l_get_mr_id_csr INTO l_mr_id;
1075       IF (l_get_mr_id_csr%FOUND) THEN
1076         p_x_unit_Effectivity_rec.MR_ID := l_mr_id;
1077       ELSE
1078         -- No match
1079         x_return_status := FND_API.G_RET_STS_ERROR;
1080       END IF;
1081       CLOSE l_get_mr_id_csr;
1082     ELSE
1083       -- Insufficient information to retrieve mr_id
1084       x_return_status := FND_API.G_RET_STS_ERROR;
1085     END IF;
1086   END IF;
1087 
1088   -- Resolve CSI_ITEM_INSTANCE_ID
1089   IF(p_x_unit_Effectivity_rec.CSI_ITEM_INSTANCE_ID IS NULL OR p_x_unit_Effectivity_rec.CSI_ITEM_INSTANCE_ID = FND_API.G_MISS_NUM) THEN
1090     IF(p_x_unit_Effectivity_rec.CSI_INSTANCE_NUMBER IS NOT NULL AND p_x_unit_Effectivity_rec.CSI_INSTANCE_NUMBER <> FND_API.G_MISS_CHAR) THEN
1091       OPEN l_get_item_instance_id_csr(p_x_unit_Effectivity_rec.CSI_INSTANCE_NUMBER);
1092       FETCH l_get_item_instance_id_csr INTO l_item_instance_id;
1093       IF (l_get_item_instance_id_csr%FOUND) THEN
1094         p_x_unit_Effectivity_rec.CSI_ITEM_INSTANCE_ID := l_item_instance_id;
1095       ELSE
1096         -- No match
1097         x_return_status := FND_API.G_RET_STS_ERROR;
1098       END IF;
1099       CLOSE l_get_item_instance_id_csr;
1100     ELSE
1101       -- Insufficient information to retrieve item instance id
1102       x_return_status := FND_API.G_RET_STS_ERROR;
1103     END IF;
1104   END IF;
1105 
1106   -- Resolve STATUS_CODE
1107   IF(p_x_unit_Effectivity_rec.STATUS_CODE IS NULL OR p_x_unit_Effectivity_rec.STATUS_CODE = FND_API.G_MISS_CHAR) THEN
1108     IF(p_x_unit_Effectivity_rec.STATUS IS NOT NULL AND p_x_unit_Effectivity_rec.STATUS <> FND_API.G_MISS_CHAR) THEN
1109       OPEN l_get_status_code_csr(p_x_unit_Effectivity_rec.STATUS);
1110       FETCH l_get_status_code_csr INTO l_status_code;
1111       IF (l_get_status_code_csr%FOUND) THEN
1112         p_x_unit_Effectivity_rec.STATUS_CODE := l_status_code;
1113       ELSE
1114         -- No match
1115         x_return_status := FND_API.G_RET_STS_ERROR;
1116       END IF;
1117       CLOSE l_get_status_code_csr;
1118     ELSE
1119       -- Insufficient information to retrieve status code
1120       x_return_status := FND_API.G_RET_STS_ERROR;
1121     END IF;
1122   END IF;
1123 
1124   --
1125 
1126 END Convert_Effectivity_Val_To_ID;
1127 
1128 ------------------------------------
1129 
1130 PROCEDURE Convert_Threshold_Val_To_ID(
1131      p_x_unit_threshold_rec IN OUT  NOCOPY AHL_UMP_UNITMAINT_PVT.Unit_Threshold_Rec_Type,
1132      x_return_status        OUT     NOCOPY VARCHAR2 ) IS
1133 
1134   CURSOR l_get_counter_id(p_counter_name IN VARCHAR2,
1135                           p_ue_id        IN NUMBER) IS
1136     /*SELECT co.counter_id
1137     FROM csi_cp_counters_v co, ahl_unit_effectivities_app_v ue
1138     WHERE co.COUNTER_NAME = p_counter_name AND
1139     ue.UNIT_EFFECTIVITY_ID = p_ue_id AND
1140     ue.csi_item_instance_id = CUSTOMER_PRODUCT_ID;*/
1141 
1142     --performace tuning related change
1143 
1144     /*SELECT c.counter_id
1145     FROM CS_COUNTERS C, CS_COUNTER_GROUPS CTRGRP, CSI_ITEM_INSTANCES CII, MTL_SYSTEM_ITEMS_KFV MSITEM, ahl_unit_effectivities_app_v ue
1146     WHERE C.COUNTER_GROUP_ID(+) = CTRGRP.COUNTER_GROUP_ID
1147     AND CTRGRP.SOURCE_OBJECT_CODE = 'CP'
1148     AND CTRGRP.SOURCE_OBJECT_ID = CII.INSTANCE_ID
1149     AND MSITEM.INVENTORY_ITEM_ID = CII.INVENTORY_ITEM_ID
1150     AND MSITEM.ORGANIZATION_ID = CII.INV_MASTER_ORGANIZATION_ID
1151     AND ue.csi_item_instance_id = CII.INSTANCE_ID
1152     AND c.NAME = p_counter_name
1153     AND ue.UNIT_EFFECTIVITY_ID = p_ue_id;*/
1154 
1155 	--Priyan
1156 	--Query changes due to performance related issues
1157 	--Refer Bug # 4918732
1158 
1159 	select
1160 		cc.counter_id
1161 	from
1162 		csi_counters_vl cc,
1163         csi_counter_associations cca,
1164         ahl_unit_effectivities_b ue
1165 	where
1166 			cc.counter_id (+)       = cca.counter_id
1167 		and cca.source_object_code = 'CP'
1168 		and cca.source_object_id   = ue.csi_item_instance_id
1169 		and cc.name                = p_counter_name
1170 		--and cc.counter_template_name = p_counter_name
1171 		and ue.unit_effectivity_id = p_ue_id;
1172 
1173   l_counter_id  NUMBER;
1174 
1175 BEGIN
1176   -- Initialize API return status to success
1177   x_return_status := FND_API.G_RET_STS_SUCCESS;
1178 
1179   -- Resolve Counter_ID
1180   IF (p_x_unit_threshold_rec.counter_id IS NULL) OR (p_x_unit_threshold_rec.counter_id =  FND_API.G_MISS_NUM) THEN
1181     IF ((p_x_unit_threshold_rec.counter_name IS NOT NULL AND p_x_unit_threshold_rec.counter_name <> FND_API.G_MISS_CHAR) AND
1182         (p_x_unit_threshold_rec.unit_effectivity_id IS NOT NULL AND p_x_unit_threshold_rec.unit_effectivity_id <> FND_API.G_MISS_NUM))THEN
1183       OPEN l_get_counter_id(p_x_unit_threshold_rec.counter_name, p_x_unit_threshold_rec.unit_effectivity_id);
1184       FETCH l_get_counter_id INTO l_counter_id;
1185       IF (l_get_counter_id%FOUND) THEN
1186         p_x_unit_threshold_rec.counter_id := l_counter_id;
1187       ELSE
1188         -- No match
1189         x_return_status := FND_API.G_RET_STS_ERROR;
1190       END IF;
1191       CLOSE l_get_counter_id;
1192     ELSE
1193       -- Insufficient information to retrieve counter_id
1194       x_return_status := FND_API.G_RET_STS_ERROR;
1195     END IF;
1196   END IF;
1197 
1198 END Convert_Threshold_Val_To_ID;
1199 
1200 ------------------------------------
1201 
1202 PROCEDURE Convert_Accomplish_Val_To_ID(
1203      p_x_unit_accomplish_rec IN OUT NOCOPY AHL_UMP_UNITMAINT_PVT.Unit_Accomplish_rec_type,
1204      x_return_status            OUT NOCOPY VARCHAR2 ) IS
1205 
1206     CURSOR l_get_counter_id(p_counter_name IN VARCHAR2,
1207                           p_ue_id        IN NUMBER) IS
1208     /*SELECT co.counter_id
1209     FROM csi_cp_counters_v co, ahl_unit_effectivities_app_v ue
1210     WHERE co.COUNTER_NAME = p_counter_name AND
1211     ue.UNIT_EFFECTIVITY_ID = p_ue_id AND
1212     ue.csi_item_instance_id = CUSTOMER_PRODUCT_ID;*/
1213 
1214     --performace tuning related change
1215     /*
1216     SELECT c.counter_id
1217     FROM CS_COUNTERS C, CS_COUNTER_GROUPS CTRGRP, CSI_ITEM_INSTANCES CII, MTL_SYSTEM_ITEMS_KFV MSITEM, ahl_unit_effectivities_app_v ue
1218     WHERE C.COUNTER_GROUP_ID(+) = CTRGRP.COUNTER_GROUP_ID
1219     AND CTRGRP.SOURCE_OBJECT_CODE = 'CP'
1220     AND CTRGRP.SOURCE_OBJECT_ID = CII.INSTANCE_ID
1221     AND MSITEM.INVENTORY_ITEM_ID = CII.INVENTORY_ITEM_ID
1222     AND MSITEM.ORGANIZATION_ID = CII.INV_MASTER_ORGANIZATION_ID
1223     AND ue.csi_item_instance_id = CII.INSTANCE_ID
1224     AND c.NAME = p_counter_name
1225     AND ue.UNIT_EFFECTIVITY_ID = p_ue_id; */
1226 
1227     select
1228         cc.counter_id
1229     from
1230         csi_counters_vl cc,
1231         csi_counter_associations cca,
1232         ahl_unit_effectivities_b ue
1233     where
1234         cc.counter_id (+)       = cca.counter_id
1235         and cca.source_object_code = 'CP'
1236         and cca.source_object_id   = ue.csi_item_instance_id
1237         and cc.name                = p_counter_name
1238         --and cc.counter_template_name = p_counter_name
1239         and ue.unit_effectivity_id = p_ue_id;
1240 
1241   l_counter_id  NUMBER;
1242 
1243 BEGIN
1244   -- Initialize API return status to success
1245   x_return_status := FND_API.G_RET_STS_SUCCESS;
1246 
1247   -- Resolve Counter_ID
1248   IF (p_x_unit_accomplish_rec.counter_id IS NULL) OR (p_x_unit_accomplish_rec.counter_id =  FND_API.G_MISS_NUM) THEN
1249     IF ((p_x_unit_accomplish_rec.counter_name IS NOT NULL AND p_x_unit_accomplish_rec.counter_name <> FND_API.G_MISS_CHAR) AND
1250         (p_x_unit_accomplish_rec.unit_effectivity_id IS NOT NULL AND p_x_unit_accomplish_rec.unit_effectivity_id <> FND_API.G_MISS_NUM))THEN
1251       OPEN l_get_counter_id(p_x_unit_accomplish_rec.counter_name, p_x_unit_accomplish_rec.unit_effectivity_id);
1252       FETCH l_get_counter_id INTO l_counter_id;
1253       IF (l_get_counter_id%FOUND) THEN
1254         p_x_unit_accomplish_rec.counter_id := l_counter_id;
1255       ELSE
1256         -- No match
1257         x_return_status := FND_API.G_RET_STS_ERROR;
1258       END IF;
1259       CLOSE l_get_counter_id;
1260     ELSE
1261       -- Insufficient information to retrieve counter_id
1262       x_return_status := FND_API.G_RET_STS_ERROR;
1263     END IF;
1264   END IF;
1265 
1266 END Convert_Accomplish_Val_To_ID;
1267 
1268 -----------------------------
1269 
1270 PROCEDURE Validate_Effectivity
1271 (
1272    p_unit_Effectivity_rec IN            AHL_UMP_UNITMAINT_PVT.Unit_Effectivity_rec_type,
1273    p_authorized_user_flag IN            VARCHAR2 := 'N',
1274    x_return_status        IN OUT NOCOPY VARCHAR2) IS
1275 
1276   CURSOR l_invalid_descendents_csr(p_ue_id IN NUMBER) IS
1277     SELECT 'x'
1278     FROM ahl_unit_effectivities_app_v
1279     WHERE (status_code not in ('INIT-ACCOMPLISHED', 'TERMINATED', 'MR-TERMINATE', 'ACCOMPLISHED','SR-CLOSED','DEFERRED','CANCELLED') OR status_code IS NULL)
1280     AND unit_effectivity_id in (
1281         SELECT related_ue_id
1282         FROM ahl_ue_relationships
1283         START WITH ue_id = p_ue_id
1284         AND relationship_code = 'PARENT'
1285         CONNECT BY ue_id = PRIOR related_ue_id
1286         AND relationship_code = 'PARENT');
1287 
1288   CURSOR l_prior_initializations_csr(p_mr_id IN NUMBER,
1289                                      p_item_instance_id IN NUMBER,
1290                                      p_ue_id IN NUMBER) IS
1291     SELECT status_code
1292     FROM  AHL_UNIT_EFFECTIVITIES_APP_V
1293     WHERE MR_HEADER_ID = p_mr_id AND
1294     CSI_ITEM_INSTANCE_ID = p_item_instance_id AND
1295     status_code IN ('INIT-DUE', 'INIT-ACCOMPLISHED','DEFERRED') AND
1296     UNIT_EFFECTIVITY_ID <> p_ue_id;
1297 
1298   CURSOR l_ue_details_csr(p_ue_id IN NUMBER) IS
1299     SELECT STATUS_CODE, OBJECT_VERSION_NUMBER, MR_HEADER_ID,
1300            CSI_ITEM_INSTANCE_ID, PRECEDING_UE_ID,SERVICE_LINE_ID
1301     FROM  AHL_UNIT_EFFECTIVITIES_APP_V
1302     WHERE UNIT_EFFECTIVITY_ID = p_ue_id;
1303 
1304   -- Added p_service_line_id as part of bugfix 6903768(FP for bug# 5764351).
1305   CURSOR l_prior_ue_csr(p_mr_id IN NUMBER,
1306                         p_item_instance_id IN NUMBER,
1307                         p_service_line_id  IN NUMBER) IS
1308     /*
1309     SELECT UNIT_EFFECTIVITY_ID
1310     FROM AHL_UNIT_EFFECTIVITIES_APP_V
1311     WHERE MR_HEADER_ID = p_mr_id AND
1312     CSI_ITEM_INSTANCE_ID = p_item_instance_id AND
1313     FORECAST_SEQUENCE = (SELECT MIN(FORECAST_SEQUENCE) FROM AHL_UNIT_EFFECTIVITIES_APP_V
1314                          WHERE MR_HEADER_ID = p_mr_id AND
1315                                CSI_ITEM_INSTANCE_ID = p_item_instance_id AND
1316                               (STATUS_CODE IS NULL OR
1317                                STATUS_CODE = 'INIT-DUE'))
1318     AND (STATUS_CODE IS NULL OR STATUS_CODE = 'INIT-DUE');
1319     */
1320 
1321     -- For preventive maintenance bug# 4692366, changing logic to base
1322     -- on min unit_effectivity_id as duplicate forecast seq can exist if
1323     -- contract numbers are different(renewal, modification cases).
1324     SELECT MIN(unit_effectivity_id)
1325     FROM AHL_UNIT_EFFECTIVITIES_VL
1326     WHERE MR_HEADER_ID = p_mr_id AND
1327           CSI_ITEM_INSTANCE_ID = p_item_instance_id AND
1328           service_line_id = p_service_line_id AND
1329           (STATUS_CODE IS NULL OR
1330            STATUS_CODE IN ('INIT-DUE'));
1331 
1332   CURSOR l_get_pred_details_csr(p_pred_ue_id IN NUMBER) IS
1333     SELECT MR_HEADER_ID, CSI_ITEM_INSTANCE_ID
1334     FROM  AHL_UNIT_EFFECTIVITIES_APP_V
1335     WHERE UNIT_EFFECTIVITY_ID = p_pred_ue_id;
1336 
1337   CURSOR l_validate_status_csr(p_status_code IN VARCHAR2) IS
1338     SELECT 'x'
1339     FROM FND_LOOKUP_VALUES_VL
1340     WHERE LOOKUP_TYPE = 'AHL_UNIT_EFFECTIVITY_STATUS' AND
1341     LOOKUP_CODE IN ('ACCOMPLISHED','INIT-ACCOMPLISHED','INIT-DUE','CANCELLED') AND
1342     LOOKUP_CODE = p_status_code;
1343 
1344   -- Added for 11.5.10 enhancements.
1345   CURSOR l_qa_collection_csr(p_qa_collection_id IN NUMBER) IS
1346     SELECT collection_id
1347     FROM QA_RESULTS
1348     WHERE collection_id = p_qa_collection_id
1349       AND rownum < 2;
1350 
1351   -- validate deferral ID
1352   CURSOR l_unit_deferral_csr (p_unit_deferral_id IN NUMBER) IS
1353     SELECT 'x'
1354     FROM ahl_unit_deferrals_b
1355     WHERE unit_deferral_id = p_unit_deferral_id
1356       AND unit_deferral_type = 'INIT-DUE';
1357 
1358   -- For bug# 4172783.
1359   CURSOR l_ue_err_details_csr (p_ue_id IN NUMBER) IS
1360     SELECT CSI.instance_number, UE.due_date, MR.title
1361     FROM ahl_unit_effectivities_b UE, ahl_mr_headers_b MR,
1362          csi_item_instances CSI
1363     WHERE UE.unit_effectivity_id = p_ue_id
1364       AND UE.mr_header_id = MR.mr_header_id
1365       AND UE.csi_item_instance_id = CSI.instance_id;
1366 
1367   CURSOR l_servq_num_csr (p_ue_id IN NUMBER,  p_object_type IN VARCHAR2,
1368                           p_subject_type IN VARCHAR2, p_link_type_id IN NUMBER) IS
1369     SELECT CS.incident_number
1370     FROM cs_incident_links CLK, CS_INCIDENTS_ALL_B CS
1371     WHERE CS.incident_id = CLK.subject_id
1372       AND CLK.object_id = p_ue_id
1373       AND CLK.object_type = p_object_type
1374       AND CLK.subject_type = p_subject_type
1375       AND CLK.link_type_id = p_link_type_id;
1376 
1377   -- Added to validate if UE ID is a child UE.
1378   CURSOR l_child_mr_csr(p_ue_id IN NUMBER) IS
1379     SELECT 'x'
1380     FROM  AHL_UE_RELATIONSHIPS
1381     WHERE related_ue_id = p_ue_id;
1382 
1383    l_prev_status            VARCHAR2(30);
1384    l_prev_object_version_no NUMBER;
1385    l_item_instance_id       NUMBER;
1386    l_mr_id                  NUMBER;
1387    l_preceding_ue_id        NUMBER := null;
1388    l_last_accomplished_date DATE := null;
1389    l_junk                   VARCHAR2(1);
1390    l_temp_ue_id             NUMBER;
1391    l_pred_mr_id             NUMBER;
1392    l_pred_item_instance_id  NUMBER;
1393    l_last_ue_id             NUMBER := null;
1394    l_temp_status            BOOLEAN;
1395    l_temp_status_code       VARCHAR2(30);
1396    l_temp_deferral_flag     BOOLEAN;
1397 
1398    l_prior_ue_status        VARCHAR2(20);
1399 
1400    l_err_instance_number    CSI_ITEM_INSTANCES.instance_number%TYPE;
1401    l_err_due_date           DATE;
1402    l_err_title              ahl_mr_headers_b.title%TYPE;
1403    l_err_serreq_num         cs_incidents_all_b.incident_number%TYPE;
1404    l_service_line_id        ahl_unit_effectivities_b.service_line_id%TYPE;
1405    -- added to validate visit status.
1406    l_visit_status           VARCHAR2(100);
1407 
1408 BEGIN
1409       -- DO NOT Initialize API return status to success
1410 
1411       IF G_DEBUG='Y'  THEN
1412         AHL_DEBUG_PUB.debug('Start of Validate Effectivity:' || p_unit_Effectivity_rec.UNIT_EFFECTIVITY_ID, 'UMP');
1413         AHL_DEBUG_PUB.debug('Start Validation Set1:' || x_return_status, 'UMP');
1414       END IF;
1415 
1416       -- Check if the unit effectivity id is not null
1417       IF (p_unit_Effectivity_rec.UNIT_EFFECTIVITY_ID IS NULL OR p_unit_Effectivity_rec.UNIT_EFFECTIVITY_ID = FND_API.G_MISS_NUM) THEN
1418         FND_MESSAGE.Set_Name('AHL','AHL_UMP_UE_ID_NULL');
1419         FND_MSG_PUB.ADD;
1420         x_return_status := FND_API.G_RET_STS_ERROR;
1421       END IF;
1422 
1423       -- Check if the status is valid
1424       --IF (p_unit_Effectivity_rec.STATUS_CODE IS NOT NULL AND p_unit_Effectivity_rec.STATUS_CODE <> FND_API.G_MISS_CHAR) THEN
1425         OPEN l_validate_status_csr(p_unit_Effectivity_rec.STATUS_CODE);
1426         FETCH l_validate_status_csr into l_junk;
1427         IF (l_validate_status_csr%NOTFOUND) THEN
1428           FND_MESSAGE.Set_Name('AHL','AHL_UMP_STATUS_INVALID');
1429           FND_MESSAGE.Set_Token('STATUS', p_unit_Effectivity_rec.STATUS_CODE);
1430           FND_MSG_PUB.ADD;
1431           x_return_status := FND_API.G_RET_STS_ERROR;
1432         END IF;
1433         CLOSE l_validate_status_csr;
1434       --END IF;
1435 
1436       -- If the status is INIT-ACCOMPLISHED or INIT-DUE, ensure that the user has permission
1437       IF ((p_unit_Effectivity_rec.STATUS_CODE = 'INIT-ACCOMPLISHED') OR (p_unit_Effectivity_rec.STATUS_CODE = 'INIT-DUE')) THEN
1438         IF (p_authorized_user_flag = 'N') THEN
1439           FND_MESSAGE.Set_Name('AHL','AHL_UMP_UNAUTHORIZED_USER');
1440           FND_MSG_PUB.ADD;
1441           x_return_status := FND_API.G_RET_STS_ERROR;
1442           --RAISE USER_NOT_AUTHORIZED;
1443         END IF;
1444 
1445         -- validate that UE is not assigned to any visit.
1446         IF (p_unit_Effectivity_rec.STATUS_CODE = 'INIT-ACCOMPLISHED') THEN
1447           l_visit_status := AHL_UMP_UTIL_PKG.get_Visit_Status(p_unit_Effectivity_rec.UNIT_EFFECTIVITY_ID);
1448           IF (l_visit_status IS NOT NULL) THEN
1449             FND_MESSAGE.Set_Name('AHL','AHL_UMP_VISIT_ASSIGNED');
1450             FND_MSG_PUB.ADD;
1451             x_return_status := FND_API.G_RET_STS_ERROR;
1452           END IF;
1453         END IF;
1454 
1455         -- validate that UE is not a child UE.
1456         OPEN l_child_mr_csr(p_unit_Effectivity_rec.UNIT_EFFECTIVITY_ID);
1457         FETCH l_child_mr_csr INTO l_junk;
1458         IF (l_child_mr_csr%FOUND) THEN
1459           FND_MESSAGE.Set_Name('AHL','AHL_UMP_CHILD_MR');
1460           FND_MSG_PUB.ADD;
1461           x_return_status := FND_API.G_RET_STS_ERROR;
1462         END IF;
1463         CLOSE l_child_mr_csr;
1464 
1465       END IF;
1466 
1467       IF (x_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
1468         -- Cannot proceed further
1469         RETURN;
1470       END IF;
1471 
1472       -- Retrieve current status, object version no. mr_id, item_instance id and
1473       -- preceding ue id for current ue
1474       OPEN l_ue_details_csr(p_unit_Effectivity_rec.UNIT_EFFECTIVITY_ID);
1475       FETCH l_ue_details_csr into
1476       l_prev_status, l_prev_object_version_no, l_mr_id, l_item_instance_id, l_preceding_ue_id,
1477       l_service_line_id;
1478       IF (l_ue_details_csr%NOTFOUND) THEN
1479         FND_MESSAGE.Set_Name('AHL','AHL_UMP_UE_ID_INVALID');
1480         FND_MESSAGE.Set_Token('UEID',p_unit_Effectivity_rec.UNIT_EFFECTIVITY_ID);
1481         FND_MSG_PUB.ADD;
1482         x_return_status := FND_API.G_RET_STS_ERROR;
1483         -- Cannot proceed further
1484         RETURN;
1485       END IF;
1486       CLOSE l_ue_details_csr;
1487 
1488       --Ensure that unit is not locked
1489       IF(AHL_UTIL_UC_PKG.IS_UNIT_QUARANTINED(p_unit_header_id => null, p_instance_id => l_item_instance_id) = FND_API.G_TRUE) THEN
1490           x_return_status := FND_API.G_RET_STS_ERROR;
1491           FND_MESSAGE.Set_Name('AHL','AHL_UMP_INIT_UNIT_LOCKED');
1492           FND_MSG_PUB.ADD;
1493           RETURN; -- cannot proceed further
1494       END IF;
1495 
1496       -- Returning only after doing all of the following checks
1497 
1498       -- If object version no is different, write error message and skip to next unit effectivity
1499       IF(l_prev_object_version_no <> p_unit_Effectivity_rec.OBJECT_VERSION_NUMBER) THEN
1500 --        FND_MESSAGE.Set_Name('AHL','AHL_UMP_UE_CHANGED');
1501         FND_MESSAGE.Set_Name('AHL','AHL_COM_RECORD_CHANGED');
1502         FND_MSG_PUB.ADD;
1503         x_return_status := FND_API.G_RET_STS_ERROR;
1504       END IF;
1505 
1506 -- 07/03/2002: Allow termination even if visit is in execution
1507 --      -- Ensure that an in-progress MR is not terminated
1508 --      IF(p_unit_Effectivity_rec.STATUS_CODE = 'TERMINATED') THEN
1509 --        -- Call VWP API to ensure that this is not assigned to a visit
1510 --        -- and if the visit is not in progress
1511 --        IF(AHL_UMP_UTIL_PKG.Is_UE_In_Execution(p_unit_Effectivity_rec.UNIT_EFFECTIVITY_ID) = TRUE) THEN
1512 --          FND_MESSAGE.Set_Name('AHL','AHL_UMP_UE_IN_EXEC');
1513 --          FND_MSG_PUB.ADD;
1514 --          x_return_status := FND_API.G_RET_STS_ERROR;
1515 --        END IF;
1516 --      END IF;
1517 
1518       IF G_DEBUG='Y'  THEN
1519         AHL_DEBUG_PUB.debug('p_unit_Effectivity_rec.STATUS_CODE:' || p_unit_Effectivity_rec.STATUS_CODE, 'UMP');
1520         AHL_DEBUG_PUB.debug('p_unit_Effectivity_rec.SET_DUE_DATE:' || p_unit_Effectivity_rec.SET_DUE_DATE, 'UMP');
1521         AHL_DEBUG_PUB.debug('p_unit_Effectivity_rec.ACCOMPLISHED_DATE:' || p_unit_Effectivity_rec.ACCOMPLISHED_DATE, 'UMP');
1522       END IF;
1523 
1524       -- Both the dates (due and accomplished) should not be set. Only one should be set.
1525       IF (p_unit_Effectivity_rec.STATUS_CODE IS NOT NULL) THEN
1526         IF ((p_unit_Effectivity_rec.SET_DUE_DATE IS NOT NULL AND p_unit_Effectivity_rec.SET_DUE_DATE <> FND_API.G_MISS_DATE) AND
1527             (p_unit_Effectivity_rec.ACCOMPLISHED_DATE IS NOT NULL AND p_unit_Effectivity_rec.ACCOMPLISHED_DATE <> FND_API.G_MISS_DATE)) THEN
1528           FND_MESSAGE.Set_Name('AHL','AHL_UMP_BOTH_DATES_SET');
1529           FND_MSG_PUB.ADD;
1530           x_return_status := FND_API.G_RET_STS_ERROR;
1531         END IF;
1532       END IF;
1533 
1534       -- If the status is INIT-ACCOMPLISHED, or ACCOMPLISHED, ensure that the accomplished date is set
1535       IF ((p_unit_Effectivity_rec.STATUS_CODE = 'INIT-ACCOMPLISHED') OR
1536           (p_unit_Effectivity_rec.STATUS_CODE = 'ACCOMPLISHED')) THEN
1537         -- validate ACCOMPLISHED_DATE = G_MISS_DATE for INIT-ACCOMPLISHED later in update_unit_effectivity proc.
1538         IF (p_unit_Effectivity_rec.ACCOMPLISHED_DATE IS NULL OR (p_unit_Effectivity_rec.ACCOMPLISHED_DATE = FND_API.G_MISS_DATE AND p_unit_Effectivity_rec.STATUS_CODE = 'ACCOMPLISHED')) THEN
1539           FND_MESSAGE.Set_Name('AHL','AHL_UMP_ACCMPLSHD_DATE_NULL');
1540           FND_MSG_PUB.ADD;
1541           x_return_status := FND_API.G_RET_STS_ERROR;
1542         ELSIF (p_unit_Effectivity_rec.ACCOMPLISHED_DATE <> FND_API.G_MISS_DATE
1543                AND p_unit_Effectivity_rec.ACCOMPLISHED_DATE > sysdate) THEN
1544           FND_MESSAGE.Set_Name('AHL','AHL_UMP_ACC_DATE_IN_FUTR');
1545           FND_MESSAGE.Set_Token('ACCDATE',p_unit_Effectivity_rec.ACCOMPLISHED_DATE);
1546           FND_MSG_PUB.ADD;
1547           x_return_status := FND_API.G_RET_STS_ERROR;
1548         END IF;
1549         -- If this is a group MR, ensure that all descendents are accomplished
1550         /*
1551         OPEN l_invalid_descendents_csr(p_unit_Effectivity_rec.UNIT_EFFECTIVITY_ID);
1552         FETCH l_invalid_descendents_csr INTO l_junk;
1553         IF (l_invalid_descendents_csr%FOUND) THEN
1554           FND_MESSAGE.Set_Name('AHL','AHL_UMP_CHILD_UNACCMPLSHD');
1555           FND_MSG_PUB.ADD;
1556           x_return_status := FND_API.G_RET_STS_ERROR;
1557         END IF;
1558         CLOSE l_invalid_descendents_csr;
1559         */
1560       END IF;
1561 
1562       -- Ensure that the previous status of the current effectivity is not MR-TERMINATE, DEFERRED or SR-CLOSED or CANCELLED.
1563       -- Allow updates to UE in status ACCOMPLISHED and TERMINATED. Only Counter values can be updated for this case.
1564       IF ((l_prev_status = 'MR-TERMINATE') OR (l_prev_status = 'DEFERRED') OR
1565           (l_prev_status = 'SR-CLOSED') OR (l_prev_status = 'CANCELLED') ) THEN
1566         FND_MESSAGE.Set_Name('AHL','AHL_UMP_INVALID_STTS_CHNG');
1567         FND_MESSAGE.Set_Token('FROM_STATUS', l_prev_status);
1568         FND_MESSAGE.Set_Token('TO_STATUS', p_unit_Effectivity_rec.STATUS_CODE);
1569         FND_MSG_PUB.ADD;
1570         x_return_status := FND_API.G_RET_STS_ERROR;
1571       END IF;
1572 
1573       -- If initializing, ensure that there are no prior initializations or accomplishments
1574       IF ((p_unit_Effectivity_rec.STATUS_CODE = 'INIT-ACCOMPLISHED') OR (p_unit_Effectivity_rec.STATUS_CODE = 'INIT-DUE')) THEN
1575         -- Ensure that there are no prior accomplishments
1576         AHL_UMP_UTIL_PKG.get_last_accomplishment(l_item_instance_id, l_mr_id, l_last_accomplished_date, l_last_ue_id, l_temp_deferral_flag, l_temp_status_code, l_temp_status);
1577         IF (l_temp_status = FALSE) THEN
1578           RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1579         END IF;
1580         IF (l_temp_status_code <> 'INIT-ACCOMPLISHED' and l_last_accomplished_date IS NOT null) THEN
1581           FND_MESSAGE.Set_Name('AHL','AHL_UMP_ALRDY_ACCMPLSHD');
1582           FND_MSG_PUB.ADD;
1583           x_return_status := FND_API.G_RET_STS_ERROR;
1584         END IF;
1585         -- Ensure that there are no prior initializations
1586         OPEN l_prior_initializations_csr(l_mr_id, l_item_instance_id, p_unit_Effectivity_rec.UNIT_EFFECTIVITY_ID);
1587         FETCH l_prior_initializations_csr INTO l_prior_ue_status;
1588         IF (l_prior_initializations_csr%FOUND) THEN
1589           IF (l_prior_ue_status = 'DEFERRED') THEN
1590             FND_MESSAGE.Set_Name('AHL','AHL_UMP_ALRDY_DEFERRED');
1591             FND_MSG_PUB.ADD;
1592           ELSE
1593             FND_MESSAGE.Set_Name('AHL','AHL_UMP_ALRDY_INITLZD');
1594             FND_MSG_PUB.ADD;
1595           END IF;
1596           x_return_status := FND_API.G_RET_STS_ERROR;
1597         END IF;
1598         CLOSE l_prior_initializations_csr;
1599       END IF;
1600 
1601       -- If accomplishing or terminating, ensure that the most recent accomplishment
1602       -- of this MR for this instance has an accomplishment date before the
1603       -- currently set accomplishment date
1604       -- Check for l_mr_id not null for Service Request accomplishment.
1605       IF ((p_unit_Effectivity_rec.STATUS_CODE = 'ACCOMPLISHED' OR p_unit_Effectivity_rec.STATUS_CODE = 'TERMINATED') AND l_mr_id IS NOT NULL) THEN
1606         AHL_UMP_UTIL_PKG.get_last_accomplishment(l_item_instance_id, l_mr_id, l_last_accomplished_date, l_last_ue_id, l_temp_deferral_flag, l_temp_status_code, l_temp_status);
1607         IF (l_temp_status = FALSE) THEN
1608           RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1609         END IF;
1610         IF (AHL_UTIL_PKG.IS_PM_INSTALLED = 'Y') THEN
1611           IF (p_unit_Effectivity_rec.ACCOMPLISHED_DATE < l_last_accomplished_date) THEN
1612             -- Get service request number.
1613             OPEN l_servq_num_csr(p_unit_Effectivity_rec.UNIT_EFFECTIVITY_ID,
1614                                  'AHL_UMP_EFF','SR',6);
1615             FETCH l_servq_num_csr INTO l_err_serreq_num;
1616             CLOSE l_servq_num_csr;
1617 
1618             FND_MESSAGE.Set_Name('AHL','AHL_UMP_LTR_ACCMPLSH_EXSTS');
1619             FND_MESSAGE.Set_Token('UEID', p_unit_Effectivity_rec.UNIT_EFFECTIVITY_ID);
1620             FND_MESSAGE.Set_Token('NEW_ACC_DATE',to_char(p_unit_Effectivity_rec.ACCOMPLISHED_DATE,fnd_date.outputDT_mask));
1621             FND_MESSAGE.Set_Token('ACC_DATE',to_char(l_last_accomplished_date,fnd_date.outputDT_mask));
1622             FND_MESSAGE.Set_Token('SERVQ_NUM',l_err_serreq_num);
1623             FND_MSG_PUB.ADD;
1624             x_return_status := FND_API.G_RET_STS_ERROR;
1625           END IF;
1626         END IF;
1627       END IF;
1628 
1629       -- Enable this validation for PM only as the execution sequence needs to be retained
1630       -- for cases where schedule is defined in Contracts. We use the due date to get the next
1631       -- set of open records.
1632 
1633       -- If TERMINATING or ACCOMPLISHING, ensure that this is the earliest
1634       -- effectivity (nothing outstanding) for the given MR
1635       IF (AHL_UTIL_PKG.IS_PM_INSTALLED = 'Y') THEN
1636         IF ((p_unit_Effectivity_rec.STATUS_CODE = 'TERMINATED') OR
1637             (p_unit_Effectivity_rec.STATUS_CODE = 'ACCOMPLISHED')) THEN
1638           OPEN l_prior_ue_csr(l_mr_id, l_item_instance_id,l_service_line_id);
1639           FETCH l_prior_ue_csr INTO l_temp_ue_id;
1640           IF (l_prior_ue_csr%FOUND) THEN
1641             IF (l_temp_ue_id <> p_unit_Effectivity_rec.UNIT_EFFECTIVITY_ID) THEN
1642               -- get full details for error message. For bug# 4172783.
1643               OPEN l_ue_err_details_csr(l_temp_ue_id);
1644               FETCH l_ue_err_details_csr INTO l_err_instance_number, l_err_due_date,
1645                                               l_err_title;
1646               CLOSE l_ue_err_details_csr;
1647 
1648               -- Get service request number.
1649               OPEN l_servq_num_csr(p_unit_Effectivity_rec.UNIT_EFFECTIVITY_ID,
1650                                    'AHL_UMP_EFF','SR',6);
1651               FETCH l_servq_num_csr INTO l_err_serreq_num;
1652               CLOSE l_servq_num_csr;
1653 
1654               FND_MESSAGE.Set_Name('AHL','AHL_UMP_ERLR_EFF_EXISTS');
1655               FND_MESSAGE.Set_Token('INST', l_err_instance_number);
1656               FND_MESSAGE.Set_Token('BEF_UEID', l_temp_ue_id);
1657               FND_MESSAGE.Set_Token('UEID',p_unit_Effectivity_rec.UNIT_EFFECTIVITY_ID);
1658               FND_MESSAGE.Set_Token('DUEDATE',l_err_due_date);
1659               FND_MESSAGE.Set_Token('TITLE',l_err_title);
1660               FND_MESSAGE.Set_Token('SERVQ_NUM',l_err_serreq_num);
1661               FND_MSG_PUB.ADD;
1662               x_return_status := FND_API.G_RET_STS_ERROR;
1663             END IF;
1664           END IF;
1665           CLOSE l_prior_ue_csr;
1666         END IF;
1667       END IF;
1668 
1669       -- If INIT-ACCOMPLISHED, ensure that the predecessor (if any)
1670       -- has at least one accomplishment
1671       IF (p_unit_Effectivity_rec.STATUS_CODE IN ('INIT-ACCOMPLISHED','ACCOMPLISHED','TERMINATED')
1672            AND (l_preceding_ue_id IS NOT NULL)) THEN
1673         -- Get the item instance id and the mr_id for the preceding ue
1674         OPEN l_get_pred_details_csr(l_preceding_ue_id);
1675         FETCH l_get_pred_details_csr INTO l_pred_mr_id, l_pred_item_instance_id;
1676         IF (l_get_pred_details_csr%FOUND) THEN
1677           AHL_UMP_UTIL_PKG.get_last_accomplishment(l_pred_item_instance_id, l_pred_mr_id, l_last_accomplished_date, l_last_ue_id, l_temp_deferral_flag, l_temp_status_code, l_temp_status);
1678           IF (l_temp_status = FALSE) THEN
1679             CLOSE l_get_pred_details_csr;
1680             x_return_status := FND_API.G_RET_STS_ERROR;
1681             RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1682           END IF;
1683           IF (l_last_accomplished_date IS NULL) THEN
1684             FND_MESSAGE.Set_Name('AHL','AHL_UMP_PRED_NOT_ACCMPLSHD');
1685             FND_MSG_PUB.ADD;
1686             x_return_status := FND_API.G_RET_STS_ERROR;
1687           END IF;
1688         END IF;
1689         CLOSE l_get_pred_details_csr;
1690       END IF;
1691 
1692       -- If terminating, ensure that the Accomplished Date if given, is in the past
1693       IF (p_unit_Effectivity_rec.STATUS_CODE = 'TERMINATED' OR p_unit_Effectivity_rec.STATUS_CODE = 'MR-TERMINATE') THEN
1694         IF (p_unit_Effectivity_rec.ACCOMPLISHED_DATE IS NOT NULL AND p_unit_Effectivity_rec.ACCOMPLISHED_DATE <> FND_API.G_MISS_DATE) THEN
1695           IF (TRUNC(p_unit_Effectivity_rec.ACCOMPLISHED_DATE) > TRUNC(sysdate)) THEN
1696             FND_MESSAGE.Set_Name('AHL','AHL_UMP_ACC_DATE_IN_FUTR');
1697             FND_MESSAGE.Set_Token('ACCDATE', p_unit_Effectivity_rec.ACCOMPLISHED_DATE);
1698             FND_MSG_PUB.ADD;
1699             x_return_status := FND_API.G_RET_STS_ERROR;
1700           END IF;
1701         END IF;
1702       END IF;
1703 
1704       -- If INIT-DUE, ensure that the Set Due Date if given, is in the future
1705       IF (p_unit_Effectivity_rec.STATUS_CODE = 'INIT-DUE') THEN
1706         IF (p_unit_Effectivity_rec.SET_DUE_DATE IS NOT NULL AND p_unit_Effectivity_rec.SET_DUE_DATE <> FND_API.G_MISS_DATE) THEN
1707           IF (TRUNC(p_unit_Effectivity_rec.SET_DUE_DATE) < TRUNC(sysdate)) THEN
1708             FND_MESSAGE.Set_Name('AHL','AHL_UMP_DUE_DATE_IN_PAST');
1709             FND_MESSAGE.Set_Token('DUEDATE', p_unit_Effectivity_rec.SET_DUE_DATE);
1710             FND_MSG_PUB.ADD;
1711             x_return_status := FND_API.G_RET_STS_ERROR;
1712           END IF;
1713         END IF;
1714       END IF;
1715 
1716       -- Validate CollectionID if present.
1717       IF (p_unit_Effectivity_rec.qa_collection_id IS NOT NULL) AND
1718          (p_unit_Effectivity_rec.qa_collection_id <> FND_API.G_MISS_NUM) THEN
1719          OPEN l_qa_collection_csr  (p_unit_Effectivity_rec.qa_collection_id);
1720          IF l_qa_collection_csr%NOTFOUND THEN
1721             FND_MESSAGE.Set_Name('AHL','AHL_UMP_QA_COLLECTION_INVALID');
1722             FND_MESSAGE.Set_Token('COLLECT_ID', p_unit_Effectivity_rec.qa_collection_id);
1723             FND_MSG_PUB.ADD;
1724             x_return_status := FND_API.G_RET_STS_ERROR;
1725          END IF;
1726          CLOSE l_qa_collection_csr;
1727 
1728          -- This validation already done above.
1729          -- Validate the current UE status is not ACCOMPLISHED.
1730          IF (l_prev_status = 'ACCOMPLISHED' OR l_prev_status = 'TERMINATED' OR
1731              l_prev_status = 'DEFERRED' OR l_prev_status = 'INIT-ACCOMPLISHED' OR
1732              l_prev_status = 'SR-CLOSED' OR l_prev_status = 'CANCELLED') THEN
1733             FND_MESSAGE.Set_Name('AHL','AHL_UMP_INVALID_STTS_CHNG');
1734             FND_MESSAGE.Set_Token('FROM_STATUS', l_prev_status);
1735             FND_MESSAGE.Set_Token('TO_STATUS', p_unit_Effectivity_rec.STATUS_CODE);
1736             FND_MSG_PUB.ADD;
1737             x_return_status := FND_API.G_RET_STS_ERROR;
1738          END IF;
1739 
1740       END IF;
1741 
1742       -- Validate Deferral ID if present.
1743       IF (p_unit_Effectivity_rec.unit_deferral_id IS NOT NULL) AND
1744          (p_unit_Effectivity_rec.unit_deferral_ID <> FND_API.G_MISS_NUM) THEN
1745          OPEN l_unit_deferral_csr (p_unit_Effectivity_rec.unit_deferral_id);
1746          FETCH l_unit_deferral_csr INTO l_junk;
1747          IF (l_unit_deferral_csr%NOTFOUND) THEN
1748            FND_MESSAGE.Set_Name('AHL','AHL_UMP_DEFERRAL_INVALID');
1749            FND_MESSAGE.Set_Token('DEFERRAL_ID', p_unit_Effectivity_rec.unit_deferral_id);
1750            FND_MSG_PUB.ADD;
1751            x_return_status := FND_API.G_RET_STS_ERROR;
1752          END IF;
1753 
1754       END IF;
1755 
1756 END Validate_Effectivity;
1757 ------------------------------------
1758 
1759 PROCEDURE Validate_Thresholds
1760 (
1761    p_unit_threshold_tbl   IN OUT  NOCOPY AHL_UMP_UNITMAINT_PVT.Unit_Threshold_tbl_type,
1762    x_return_status        IN OUT  NOCOPY VARCHAR2) IS
1763 
1764   CURSOR l_validate_counter_csr(p_ue_id      IN NUMBER,
1765                                 p_counter_id IN NUMBER) IS
1766     /*
1767     SELECT NVL(net_reading, 0)
1768     FROM  CSI_CP_COUNTERS_V CO, AHL_UNIT_EFFECTIVITIES_APP_V UE
1769     WHERE co.customer_product_id = ue.csi_item_instance_id and
1770           ue.unit_effectivity_id = p_ue_id and
1771           co.counter_id = p_counter_id;
1772     */
1773 
1774     /*
1775     SELECT NVL(net_reading, 0)
1776     FROM csi_counter_values_v cv, csi_counter_associations cca, AHL_UNIT_EFFECTIVITIES_APP_V UE
1777     WHERE cca.source_object_code = 'CP'
1778       AND cca.source_object_id = ue.csi_item_instance_id
1779       AND cca.counter_id = cv.counter_id
1780       AND ue.unit_effectivity_id = p_ue_id
1781       AND cv.counter_id = p_counter_id
1782       ORDER BY cv.value_timestamp desc;
1783     */
1784     -- Added for R12 IB Uptake. If counter does not have any reading,
1785     -- csi_counter_values_v does not retrieve any row.
1786     -- split above cursor into 2 cursors.
1787     SELECT 'x'
1788     FROM CSI_COUNTERS_VL CC, csi_counter_associations cca, AHL_UNIT_EFFECTIVITIES_APP_V UE
1789     WHERE cca.source_object_code = 'CP'
1790       AND cca.source_object_id = ue.csi_item_instance_id
1791       AND cca.counter_id = cc.counter_id
1792       AND ue.unit_effectivity_id = p_ue_id
1793       AND cc.counter_id = p_counter_id;
1794 
1795     -- Added for R12 bug# 6080133.
1796     CURSOR get_ctr_reading_csr(p_counter_id IN NUMBER) IS
1797     SELECT NVL(CCR.net_reading, 0)
1798     FROM
1799       CSI_COUNTERS_VL CC,
1800       CSI_COUNTER_READINGS CCR
1801     WHERE
1802       CCR.COUNTER_ID = CC.COUNTER_ID
1803       AND CC.COUNTER_ID = p_counter_id
1804     ORDER BY
1805       CCR.VALUE_TIMESTAMP DESC;
1806 
1807   CURSOR l_get_prev_ctr_csr(p_threshold_id IN NUMBER) IS
1808     SELECT OBJECT_VERSION_NUMBER, COUNTER_ID
1809     FROM  AHL_UNIT_THRESHOLDS
1810     WHERE UNIT_THRESHOLD_ID = p_threshold_id;
1811 
1812   CURSOR l_ue_id_check_csr(p_threshold_id IN NUMBER, p_ue_id IN NUMBER) IS
1813     SELECT 'x'
1814     FROM  AHL_UNIT_THRESHOLDS UTH, AHL_UNIT_DEFERRALS_B UDF
1815     WHERE UTH.unit_deferral_id = UDF.unit_deferral_ID AND
1816           UTH.UNIT_THRESHOLD_ID = p_threshold_id AND
1817           UDF.UNIT_EFFECTIVITY_ID = p_ue_id AND
1818           UDF.Unit_deferral_type = 'INIT-DUE';
1819 
1820    l_prev_object_version_no NUMBER;
1821    l_prev_counter           NUMBER;
1822    l_net_reading            NUMBER;
1823    l_return_status          VARCHAR2(30);
1824    l_junk                   VARCHAR2(1);
1825 
1826 BEGIN
1827   -- DO NOT Initialize API return status to success
1828 
1829   IF (p_unit_threshold_tbl.COUNT > 0) THEN
1830 
1831     FOR i IN p_unit_threshold_tbl.FIRST..p_unit_threshold_tbl.LAST LOOP
1832 
1833       -- Resolve Counter Id
1834       Convert_Threshold_Val_To_ID(p_unit_threshold_tbl(i), l_return_status);
1835 
1836       -- Ensure that for Modify or delete operation, the threshold id is present
1837       IF (p_unit_threshold_tbl(i).OPERATION_FLAG = 'M' OR p_unit_threshold_tbl(i).OPERATION_FLAG = 'D') THEN
1838         IF (p_unit_threshold_tbl(i).UNIT_THRESHOLD_ID IS NULL OR p_unit_threshold_tbl(i).UNIT_THRESHOLD_ID = FND_API.G_MISS_NUM) THEN
1839           FND_MESSAGE.Set_Name('AHL','AHL_UMP_THRESHOLD_ID_NULL');
1840           FND_MSG_PUB.ADD;
1841           x_return_status := FND_API.G_RET_STS_ERROR;
1842         END IF;
1843       END IF;
1844 
1845       -- Ensure that for Modify operation, the unit effectivity Id matches the threshold
1846       IF (p_unit_threshold_tbl(i).OPERATION_FLAG = 'M') THEN
1847         OPEN l_ue_id_check_csr(p_unit_threshold_tbl(i).UNIT_THRESHOLD_ID,
1848                                p_unit_threshold_tbl(i).UNIT_EFFECTIVITY_ID);
1849         FETCH l_ue_id_check_csr INTO l_junk;
1850         IF (l_ue_id_check_csr%NOTFOUND) THEN
1851           FND_MESSAGE.Set_Name('AHL','AHL_UMP_UE_ID_INVALID');
1852           FND_MESSAGE.Set_Token('UEID', p_unit_threshold_tbl(i).UNIT_EFFECTIVITY_ID);
1853           FND_MSG_PUB.ADD;
1854           x_return_status := FND_API.G_RET_STS_ERROR;
1855         END IF;
1856         CLOSE l_ue_id_check_csr;
1857       END IF;
1858 
1859       -- Ensure that the Counter ID is valid for a Create or Modify operation
1860       IF (p_unit_threshold_tbl(i).COUNTER_ID IS NULL OR p_unit_threshold_tbl(i).COUNTER_ID = FND_API.G_MISS_NUM) THEN
1861         IF (p_unit_threshold_tbl(i).OPERATION_FLAG = 'C' OR p_unit_threshold_tbl(i).OPERATION_FLAG = 'M') THEN
1862           FND_MESSAGE.Set_Name('AHL','AHL_UMP_COUNTER_INVALID');
1863           FND_MESSAGE.Set_Token('COUNTER', p_unit_threshold_tbl(i).COUNTER_NAME);
1864           FND_MSG_PUB.ADD;
1865           x_return_status := FND_API.G_RET_STS_ERROR;
1866         END IF;
1867       END IF;
1868 
1869       -- Ensure that the counter is appropriate for the current item instance
1870       IF (p_unit_threshold_tbl(i).COUNTER_ID IS NOT NULL AND p_unit_threshold_tbl(i).COUNTER_ID <> FND_API.G_MISS_NUM) THEN
1871         OPEN l_validate_counter_csr(p_unit_threshold_tbl(i).UNIT_EFFECTIVITY_ID, p_unit_threshold_tbl(i).COUNTER_ID);
1872         FETCH l_validate_counter_csr INTO l_junk;
1873         IF (l_validate_counter_csr%NOTFOUND) THEN
1874           FND_MESSAGE.Set_Name('AHL','AHL_UMP_COUNTER_INVALID');
1875           FND_MESSAGE.Set_Token('COUNTER', p_unit_threshold_tbl(i).COUNTER_NAME);
1876           FND_MSG_PUB.ADD;
1877           x_return_status := FND_API.G_RET_STS_ERROR;
1878         ELSE
1879           -- get counter reading.
1880           OPEN get_ctr_reading_csr(p_unit_threshold_tbl(i).COUNTER_ID);
1881           FETCH get_ctr_reading_csr INTO l_net_reading;
1882           IF (get_ctr_reading_csr%NOTFOUND) THEN
1883             l_net_reading := 0;
1884           END IF;
1885           CLOSE get_ctr_reading_csr;
1886         END IF;
1887         CLOSE l_validate_counter_csr;
1888       END IF;
1889 
1890       -- Ensure that the Threshold has not changed
1891       IF (p_unit_threshold_tbl(i).UNIT_THRESHOLD_ID IS NOT NULL AND p_unit_threshold_tbl(i).UNIT_THRESHOLD_ID <> FND_API.G_MISS_NUM) THEN
1892         -- Retrieve object version no. for this threshold
1893         OPEN l_get_prev_ctr_csr(p_unit_threshold_tbl(i).UNIT_THRESHOLD_ID);
1894         FETCH l_get_prev_ctr_csr into l_prev_object_version_no, l_prev_counter;
1895         IF (l_get_prev_ctr_csr%NOTFOUND) THEN
1896           FND_MESSAGE.Set_Name('AHL','AHL_UMP_THRSHLD_ID_INVALID');
1897           FND_MESSAGE.Set_Token('THRESHOLDID', p_unit_threshold_tbl(i).UNIT_THRESHOLD_ID);
1898           FND_MSG_PUB.ADD;
1899           CLOSE l_get_prev_ctr_csr;
1900           x_return_status := FND_API.G_RET_STS_ERROR;
1901           RETURN;
1902         END IF;
1903         CLOSE l_get_prev_ctr_csr;
1904         -- Check if object version no is different
1905         IF(l_prev_object_version_no <> p_unit_threshold_tbl(i).OBJECT_VERSION_NUMBER) THEN
1906 --          FND_MESSAGE.Set_Name('AHL','AHL_UMP_THRESHOLD_CHANGED');
1907 --          FND_MESSAGE.Set_Token('COUNTER', p_unit_threshold_tbl(i).COUNTER_NAME);
1908           FND_MESSAGE.Set_Name('AHL', 'AHL_COM_RECORD_CHANGED');
1909           FND_MSG_PUB.ADD;
1910           x_return_status := FND_API.G_RET_STS_ERROR;
1911           RETURN;
1912         END IF;
1913         -- For modify operation, ensure that the counter (id) has not changed
1914         IF (p_unit_threshold_tbl(i).OPERATION_FLAG = 'M') THEN
1915           IF (p_unit_threshold_tbl(i).COUNTER_ID <> l_prev_counter) THEN
1916             FND_MESSAGE.Set_Name('AHL','AHL_UMP_THR_COUNTER_CHANGED');
1917             FND_MSG_PUB.ADD;
1918             x_return_status := FND_API.G_RET_STS_ERROR;
1919           END IF;
1920         END IF;
1921       END IF;
1922 
1923       -- Ensure that the counter value is valid
1924       IF (p_unit_threshold_tbl(i).OPERATION_FLAG = 'C' OR p_unit_threshold_tbl(i).OPERATION_FLAG = 'M') THEN
1925         IF (p_unit_threshold_tbl(i).COUNTER_VALUE IS NULL OR p_unit_threshold_tbl(i).COUNTER_VALUE = FND_API.G_MISS_NUM) THEN
1926           FND_MESSAGE.Set_Name('AHL','AHL_UMP_CNTR_VALUE_MISSING');
1927           FND_MESSAGE.Set_Token('COUNTER', p_unit_threshold_tbl(i).COUNTER_NAME);
1928           FND_MSG_PUB.ADD;
1929           x_return_status := FND_API.G_RET_STS_ERROR;
1930         ELSE
1931           -- Ensure that the entered value is not lesser than the Net Reading
1932           IF (p_unit_threshold_tbl(i).COUNTER_VALUE < l_net_reading) THEN
1933             FND_MESSAGE.Set_Name('AHL','AHL_UMP_CTR_VAL_LESSER');
1934             FND_MESSAGE.Set_Token('COUNTER', p_unit_threshold_tbl(i).COUNTER_NAME);
1935             FND_MESSAGE.Set_Token('ENTVAL', p_unit_threshold_tbl(i).COUNTER_VALUE);
1936             FND_MESSAGE.Set_Token('CURRVAL', l_net_reading);
1937             FND_MSG_PUB.ADD;
1938             x_return_status := FND_API.G_RET_STS_ERROR;
1939           END IF;
1940         END IF;
1941       END IF;
1942     END LOOP;  -- All thresholds
1943   END IF;
1944 END Validate_Thresholds;
1945 
1946 ------------------------------------
1947 
1948 -- Added accomplishment date to fix bug# 6750836.
1949 PROCEDURE Validate_Accomplishments
1950 (
1951    p_unit_accomplish_tbl  IN OUT  NOCOPY AHL_UMP_UNITMAINT_PVT.Unit_Accomplish_tbl_type,
1952    p_accomplishment_date  IN             DATE,
1953    p_ue_status_code       IN             VARCHAR2,
1954    x_return_status        IN OUT  NOCOPY VARCHAR2) IS
1955 
1956   CURSOR l_validate_counter_csr(p_ue_id      IN NUMBER,
1957                                 p_counter_id IN NUMBER) IS
1958 
1959     /*
1960     SELECT NVL(net_reading, 0)
1961     FROM  CSI_CP_COUNTERS_V CO, AHL_UNIT_EFFECTIVITIES_APP_V UE
1962     WHERE co.customer_product_id = ue.csi_item_instance_id and
1963           ue.unit_effectivity_id = p_ue_id and
1964           co.counter_id = p_counter_id;
1965     */
1966     -- Added for R12 IB Uptake. If counter does not have any reading,
1967     -- csi_counter_values_v does not retrieve any row.
1968     -- split above cursor into 2 cursors.
1969     SELECT 'x'
1970     FROM CSI_COUNTERS_VL CC, csi_counter_associations cca, AHL_UNIT_EFFECTIVITIES_APP_V UE
1971     WHERE cca.source_object_code = 'CP'
1972       AND cca.source_object_id = ue.csi_item_instance_id
1973       AND cca.counter_id = cc.counter_id
1974       AND ue.unit_effectivity_id = p_ue_id
1975       AND cc.counter_id = p_counter_id;
1976 
1977   -- Added for R12 bug# 6080133.
1978   CURSOR get_ctr_reading_csr(p_counter_id IN NUMBER,
1979                              p_accomplishment_date IN DATE) IS
1980     SELECT NVL(CCR.net_reading, 0)
1981     FROM
1982       CSI_COUNTERS_VL CC,
1983       CSI_COUNTER_READINGS CCR
1984     WHERE
1985       CCR.COUNTER_ID = CC.COUNTER_ID
1986       AND CC.COUNTER_ID = p_counter_id
1987       AND CCR.VALUE_TIMESTAMP <= p_accomplishment_date
1988     ORDER BY
1989       CCR.VALUE_TIMESTAMP DESC;
1990 
1991   -- Added for R12 bug# 6080133.
1992   CURSOR get_max_ctr_reading_csr(p_counter_id IN NUMBER,
1993                                  p_accomplishment_date IN DATE) IS
1994     SELECT NVL(CCR.net_reading, 0)
1995     FROM
1996       CSI_COUNTERS_VL CC,
1997       CSI_COUNTER_READINGS CCR
1998     WHERE
1999       CCR.COUNTER_ID = CC.COUNTER_ID
2000       AND CC.COUNTER_ID = p_counter_id
2001       AND trunc(CCR.VALUE_TIMESTAMP) <= trunc(p_accomplishment_date)
2002     ORDER BY
2003       CCR.VALUE_TIMESTAMP DESC;
2004 
2005   -- Added for R12 bug# 7016783.
2006   CURSOR get_nxt_max_ctr_reading_csr(p_counter_id IN NUMBER,
2007                                      p_accomplishment_date IN DATE) IS
2008     SELECT NVL(CCR.net_reading, 0)
2009     FROM
2010       CSI_COUNTER_READINGS CCR
2011     WHERE
2012       CCR.COUNTER_ID = p_counter_id
2013       -- fix for bug# 7016783. pick next highest counter value.
2014       AND trunc(CCR.VALUE_TIMESTAMP) > trunc(p_accomplishment_date)
2015     ORDER BY
2016       -- fix for bug# 7016783
2017       CCR.VALUE_TIMESTAMP ASC;
2018 
2019   CURSOR l_get_prev_ctr_csr(p_accomplishment_id IN NUMBER) IS
2020     SELECT OBJECT_VERSION_NUMBER, COUNTER_ID
2021     FROM  AHL_UNIT_ACCOMPLISHMNTS
2022     WHERE UNIT_ACCOMPLISHMNT_ID = p_accomplishment_id;
2023 
2024   CURSOR l_ue_id_check_csr(p_accomplishment_id IN NUMBER, p_ue_id IN NUMBER) IS
2025     SELECT 'x'
2026     FROM  AHL_UNIT_ACCOMPLISHMNTS
2027     WHERE UNIT_ACCOMPLISHMNT_ID = p_accomplishment_id AND
2028     UNIT_EFFECTIVITY_ID = p_ue_id;
2029 
2030    l_prev_object_version_no NUMBER;
2031    l_prev_counter           NUMBER;
2032    l_net_reading            NUMBER;
2033    l_return_status          VARCHAR2(30);
2034    l_junk                   VARCHAR2(1);
2035 
2036 BEGIN
2037   -- DO NOT Initialize API return status to success
2038 
2039   IF (p_unit_accomplish_tbl.COUNT > 0) THEN
2040 
2041     FOR i IN p_unit_accomplish_tbl.FIRST..p_unit_accomplish_tbl.LAST LOOP
2042       -- Resolve Counter Id
2043       Convert_Accomplish_Val_To_ID(p_unit_accomplish_tbl(i), l_return_status);
2044 
2045       -- Ensure that for Modify or delete operation, the accomplishment id is present
2046       IF (p_unit_accomplish_tbl(i).OPERATION_FLAG = 'M' OR p_unit_accomplish_tbl(i).OPERATION_FLAG = 'D') THEN
2047         IF (p_unit_accomplish_tbl(i).UNIT_ACCOMPLISH_ID IS NULL OR p_unit_accomplish_tbl(i).UNIT_ACCOMPLISH_ID = FND_API.G_MISS_NUM) THEN
2048           FND_MESSAGE.Set_Name('AHL','AHL_UMP_ACCOMPLISH_ID_NULL');
2049           FND_MSG_PUB.ADD;
2050           x_return_status := FND_API.G_RET_STS_ERROR;
2051         END IF;
2052       END IF;
2053 
2054       -- Ensure that for Modify operation, the UE Id matches the accomplishment
2055       IF (p_unit_accomplish_tbl(i).OPERATION_FLAG = 'M') THEN
2056         OPEN l_ue_id_check_csr(p_unit_accomplish_tbl(i).UNIT_ACCOMPLISH_ID,
2057                                p_unit_accomplish_tbl(i).UNIT_EFFECTIVITY_ID);
2058         FETCH l_ue_id_check_csr INTO l_junk;
2059         IF (l_ue_id_check_csr%NOTFOUND) THEN
2060           FND_MESSAGE.Set_Name('AHL','AHL_UMP_UE_ID_INVALID');
2061           FND_MESSAGE.Set_Token('UEID', p_unit_accomplish_tbl(i).UNIT_EFFECTIVITY_ID);
2062           FND_MSG_PUB.ADD;
2063           x_return_status := FND_API.G_RET_STS_ERROR;
2064         END IF;
2065         CLOSE l_ue_id_check_csr;
2066       END IF;
2067 
2068       -- Ensure that the Counter ID is valid for a Create or Modify operation
2069       IF (p_unit_accomplish_tbl(i).COUNTER_ID IS NULL OR p_unit_accomplish_tbl(i).COUNTER_ID = FND_API.G_MISS_NUM) THEN
2070         IF (p_unit_accomplish_tbl(i).OPERATION_FLAG = 'C' OR p_unit_accomplish_tbl(i).OPERATION_FLAG = 'M') THEN
2071           FND_MESSAGE.Set_Name('AHL','AHL_UMP_COUNTER_INVALID');
2072           FND_MESSAGE.Set_Token('COUNTER', p_unit_accomplish_tbl(i).COUNTER_NAME);
2073           FND_MSG_PUB.ADD;
2074           x_return_status := FND_API.G_RET_STS_ERROR;
2075         END IF;
2076       END IF;
2077 
2078       -- Ensure that the counter is appropriate for the current item instance
2079       IF (p_unit_accomplish_tbl(i).COUNTER_ID IS NOT NULL AND p_unit_accomplish_tbl(i).COUNTER_ID <> FND_API.G_MISS_NUM) THEN
2080         -- Add check for accomplishment date - need in the case of init-accomplishment update when the
2081         -- user passes G MISS date or NULL. We bypass date validation in validate_effectivity
2082         -- to allow for init-accomplishment deletion along with counter values; so there is a
2083         -- possibility for accomplishment date to be null or g-miss date.
2084         IF (p_accomplishment_date IS NULL OR p_accomplishment_date = FND_API.G_MISS_DATE)
2085         THEN
2086           FND_MESSAGE.Set_Name('AHL','AHL_UMP_ACCMPLSHD_DATE_NULL');
2087           FND_MSG_PUB.ADD;
2088           x_return_status := FND_API.G_RET_STS_ERROR;
2089           RETURN;
2090         END IF;
2091         -- Modified for IB uptake of R12 schema. Split original cursor into 2 cursors.
2092         OPEN l_validate_counter_csr(p_unit_accomplish_tbl(i).UNIT_EFFECTIVITY_ID,
2093                                     p_unit_accomplish_tbl(i).COUNTER_ID);
2094         FETCH l_validate_counter_csr INTO l_junk;
2095         IF (l_validate_counter_csr%NOTFOUND) THEN
2096           FND_MESSAGE.Set_Name('AHL','AHL_UMP_COUNTER_INVALID');
2097           FND_MESSAGE.Set_Token('COUNTER', p_unit_accomplish_tbl(i).COUNTER_NAME);
2098           FND_MSG_PUB.ADD;
2099           x_return_status := FND_API.G_RET_STS_ERROR;
2100         ELSE
2101           IF (p_ue_status_code = 'INIT-ACCOMPLISHED') THEN
2102             -- get max counter reading.
2103             -- Added accomplishment date to fix bug# 6750836.
2104             OPEN get_max_ctr_reading_csr(p_unit_accomplish_tbl(i).COUNTER_ID, p_accomplishment_date);
2105             FETCH get_max_ctr_reading_csr INTO l_net_reading;
2106             IF (get_max_ctr_reading_csr%NOTFOUND) THEN
2107               -- added to fix bug# 7016783.
2108               OPEN get_nxt_max_ctr_reading_csr(p_unit_accomplish_tbl(i).COUNTER_ID, p_accomplishment_date);
2109               FETCH get_nxt_max_ctr_reading_csr INTO l_net_reading;
2110               IF (get_nxt_max_ctr_reading_csr%NOTFOUND) THEN
2111                 l_net_reading := 0;
2112               END IF;
2113               CLOSE get_nxt_max_ctr_reading_csr;
2114             END IF;
2115             CLOSE get_max_ctr_reading_csr;
2116           ELSE
2117             -- get counter reading.
2118             -- Added accomplishment date to fix bug# 6750836.
2119             OPEN get_ctr_reading_csr(p_unit_accomplish_tbl(i).COUNTER_ID, p_accomplishment_date);
2120             FETCH get_ctr_reading_csr INTO l_net_reading;
2121             IF (get_ctr_reading_csr%NOTFOUND) THEN
2122               l_net_reading := 0;
2123             END IF;
2124             CLOSE get_ctr_reading_csr;
2125           END IF;
2126         END IF;
2127         CLOSE l_validate_counter_csr;
2128       END IF;
2129 
2130       -- Ensure that the Accomplishment has not changed
2131       IF (p_unit_accomplish_tbl(i).UNIT_ACCOMPLISH_ID IS NOT NULL AND p_unit_accomplish_tbl(i).UNIT_ACCOMPLISH_ID <> FND_API.G_MISS_NUM) THEN
2132         -- Retrieve object version no. for this accomplishment
2133         OPEN l_get_prev_ctr_csr(p_unit_accomplish_tbl(i).UNIT_ACCOMPLISH_ID);
2134         FETCH l_get_prev_ctr_csr into l_prev_object_version_no, l_prev_counter;
2135         IF (l_get_prev_ctr_csr%NOTFOUND) THEN
2136           FND_MESSAGE.Set_Name('AHL','AHL_UMP_ACCMPLSH_ID_INVALID');
2137           FND_MESSAGE.Set_Token('ACCOMPLISHMENTID', p_unit_accomplish_tbl(i).UNIT_ACCOMPLISH_ID);
2138           FND_MSG_PUB.ADD;
2139           CLOSE l_get_prev_ctr_csr;
2140           x_return_status := FND_API.G_RET_STS_ERROR;
2141           RETURN;
2142         END IF;
2143         CLOSE l_get_prev_ctr_csr;
2144         -- Check if object version no is different
2145         IF(l_prev_object_version_no <> p_unit_accomplish_tbl(i).OBJECT_VERSION_NUMBER) THEN
2146 --          FND_MESSAGE.Set_Name('AHL','AHL_UMP_ACCMPLSHMNT_CHANGED');
2147 --          FND_MESSAGE.Set_Token('COUNTER', p_unit_accomplish_tbl(i).COUNTER_NAME);
2148           FND_MESSAGE.Set_Name('AHL', 'AHL_COM_RECORD_CHANGED');
2149           FND_MSG_PUB.ADD;
2150           x_return_status := FND_API.G_RET_STS_ERROR;
2151           RETURN;
2152         END IF;
2153         -- For modify operation, ensure that the counter (id) has not changed
2154         IF (p_unit_accomplish_tbl(i).OPERATION_FLAG = 'M') THEN
2155           IF (p_unit_accomplish_tbl(i).COUNTER_ID <> l_prev_counter) THEN
2156             FND_MESSAGE.Set_Name('AHL','AHL_UMP_ACC_COUNTER_CHANGED');
2157             FND_MSG_PUB.ADD;
2158             x_return_status := FND_API.G_RET_STS_ERROR;
2159           END IF;
2160         END IF;
2161       END IF;
2162 
2163       -- Ensure that the counter value is valid
2164       IF (p_unit_accomplish_tbl(i).OPERATION_FLAG = 'C' OR p_unit_accomplish_tbl(i).OPERATION_FLAG = 'M') THEN
2165         IF (p_unit_accomplish_tbl(i).COUNTER_VALUE IS NULL OR p_unit_accomplish_tbl(i).COUNTER_VALUE = FND_API.G_MISS_NUM) THEN
2166           FND_MESSAGE.Set_Name('AHL','AHL_UMP_CNTR_VALUE_MISSING');
2167           FND_MESSAGE.Set_Token('COUNTER', p_unit_accomplish_tbl(i).COUNTER_NAME);
2168           FND_MSG_PUB.ADD;
2169           x_return_status := FND_API.G_RET_STS_ERROR;
2170         ELSE
2171           -- Ensure that the entered value is not greater than the Net Reading
2172           IF (p_unit_accomplish_tbl(i).COUNTER_VALUE > l_net_reading) THEN
2173             FND_MESSAGE.Set_Name('AHL','AHL_UMP_CTR_VAL_GREATER');
2174             FND_MESSAGE.Set_Token('COUNTER', p_unit_accomplish_tbl(i).COUNTER_NAME);
2175             FND_MESSAGE.Set_Token('ENTVAL', p_unit_accomplish_tbl(i).COUNTER_VALUE);
2176             FND_MESSAGE.Set_Token('CURRVAL', l_net_reading);
2177             FND_MSG_PUB.ADD;
2178             x_return_status := FND_API.G_RET_STS_ERROR;
2179           END IF;
2180         END IF;
2181       END IF;
2182 
2183     END LOOP; -- All Accomplishments
2184   END IF;
2185 END Validate_Accomplishments;
2186 
2187 ------------------------------------
2188 -- This procedure updates an Unit Effectivity
2189 -- It also ensures that if there are no counters during
2190 -- initialization, then the date is set
2191 ------------------------------------
2192 
2193 PROCEDURE Update_Unit_Effectivity
2194 (
2195    p_unit_Effectivity_rec IN AHL_UMP_UNITMAINT_PVT.Unit_Effectivity_rec_type) IS
2196 
2197   CURSOR l_threshold_exists_csr(p_ue_id IN NUMBER) IS
2198     SELECT 'x'
2199     FROM  AHL_UNIT_THRESHOLDS UTH, AHL_UNIT_DEFERRALS_B UDF
2200     WHERE UTH.unit_deferral_id = UDF.unit_deferral_id
2201        AND UDF.unit_deferral_type = 'INIT-DUE'
2202        AND UDF.unit_effectivity_id = p_ue_id;
2203 
2204   CURSOR l_accomplish_exists_csr(p_ue_id IN NUMBER) IS
2205     SELECT 'x'
2206     FROM  AHL_UNIT_ACCOMPLISHMNTS
2207     WHERE unit_effectivity_id = p_ue_id;
2208 
2209   CURSOR l_get_unit_effectivity_csr(p_ue_id IN NUMBER) IS
2210     SELECT
2211       OBJECT_VERSION_NUMBER,
2212       CSI_ITEM_INSTANCE_ID,
2213       MR_INTERVAL_ID,
2214       MR_EFFECTIVITY_ID,
2215       MR_HEADER_ID,
2216       STATUS_CODE,
2217       DUE_DATE,
2218       ACCOMPLISHED_DATE,
2219       SET_DUE_DATE,
2220       DUE_COUNTER_VALUE,
2221       FORECAST_SEQUENCE,
2222       REPETITIVE_MR_FLAG,
2223       TOLERANCE_FLAG,
2224       DATE_RUN,
2225       PRECEDING_UE_ID,
2226       MESSAGE_CODE,
2227       REMARKS,
2228       SERVICE_LINE_ID,
2229       PROGRAM_MR_HEADER_ID,
2230       CANCEL_REASON_CODE,
2231       EARLIEST_DUE_DATE,
2232       LATEST_DUE_DATE,
2233       DEFER_FROM_UE_ID,
2234       CS_INCIDENT_ID,
2235       QA_COLLECTION_ID,
2236       ORIG_DEFERRAL_UE_ID,
2237       APPLICATION_USG_CODE,
2238       OBJECT_TYPE,
2239       COUNTER_ID,
2240       MANUALLY_PLANNED_FLAG,
2241       LOG_SERIES_CODE,
2242       LOG_SERIES_NUMBER,
2243       FLIGHT_NUMBER,
2244       MEL_CDL_TYPE_CODE,
2245       POSITION_PATH_ID,
2246       ATA_CODE,
2247       UNIT_CONFIG_HEADER_ID,
2248       ATTRIBUTE_CATEGORY,
2249       ATTRIBUTE1,
2250       ATTRIBUTE2,
2251       ATTRIBUTE3,
2252       ATTRIBUTE4,
2253       ATTRIBUTE5,
2254       ATTRIBUTE6,
2255       ATTRIBUTE7,
2256       ATTRIBUTE8,
2257       ATTRIBUTE9,
2258       ATTRIBUTE10,
2259       ATTRIBUTE11,
2260       ATTRIBUTE12,
2261       ATTRIBUTE13,
2262       ATTRIBUTE14,
2263       ATTRIBUTE15
2264     FROM  AHL_UNIT_EFFECTIVITIES_APP_V
2265     WHERE unit_effectivity_id = p_ue_id
2266     FOR UPDATE OF OBJECT_VERSION_NUMBER;
2267 
2268     CURSOR l_get_descendents(p_ue_id IN NUMBER) IS
2269         SELECT related_ue_id
2270         FROM ahl_ue_relationships
2271         START WITH ue_id = p_ue_id
2272         AND relationship_code = 'PARENT'
2273         CONNECT BY ue_id = PRIOR related_ue_id
2274         AND relationship_code = 'PARENT';
2275 
2276     CURSOR l_get_accomplishments(p_ue_id IN NUMBER) IS
2277         SELECT UNIT_ACCOMPLISHMNT_ID
2278         FROM ahl_unit_accomplishmnts
2279         WHERE UNIT_EFFECTIVITY_ID = p_ue_id;
2280 
2281     CURSOR l_get_thresholds(p_ue_id IN NUMBER) IS
2282         SELECT UNIT_THRESHOLD_ID
2283         FROM ahl_unit_thresholds
2284         WHERE UNIT_DEFERRAL_ID = p_ue_id;
2285 
2286     CURSOR ahl_unit_def_csr(p_ue_id IN NUMBER) IS
2287         SELECT unit_deferral_id,
2288                ata_sequence_id,
2289                object_version_number,
2290                unit_deferral_type,
2291                approval_status_code,
2292                defer_reason_code,
2293                skip_mr_flag,
2294                affect_due_calc_flag,
2295                set_due_date,
2296                deferral_effective_on,
2297                remarks,approver_notes,attribute_category, attribute1,
2298                attribute2, attribute3, attribute4, attribute5, attribute6, attribute7,
2299                attribute8, attribute9, attribute10, attribute11, attribute12,
2300                attribute13, attribute14, attribute15
2301         FROM ahl_unit_deferrals_vl
2302         WHERE unit_effectivity_id = p_ue_id
2303          AND UNIT_DEFERRAL_TYPE = 'INIT-DUE'
2304         FOR UPDATE OF OBJECT_VERSION_NUMBER;
2305 
2306    l_ue_rec                 l_get_unit_effectivity_csr%rowtype;
2307 
2308    l_descendent_ue_id       NUMBER;
2309    l_status_code            VARCHAR2(30);
2310    l_accomplished_date      DATE;
2311    l_set_due_date           DATE;
2312    l_junk                   VARCHAR2(1);
2313    l_date_missing_flag      boolean := false;
2314    l_accomplishment_id      NUMBER;
2315    l_threshold_id           NUMBER;
2316    l_return_status          VARCHAR2(32);
2317    l_counters_msg           VARCHAR2(1000);
2318 
2319    -- Added for 11.5.10.
2320    l_unit_deferral_operation VARCHAR2(1) := 'X';
2321    l_unit_deferral_id        NUMBER;
2322    l_unit_def_rec            ahl_unit_def_csr%ROWTYPE;
2323    l_rowid                   VARCHAR2(30);
2324 
2325 
2326 BEGIN
2327   l_status_code := p_unit_Effectivity_rec.status_code;
2328   l_accomplished_date := p_unit_Effectivity_rec.ACCOMPLISHED_DATE;
2329   l_set_due_date := p_unit_Effectivity_rec.SET_DUE_DATE;
2330 
2331   -- Get current state
2332   OPEN l_get_unit_effectivity_csr(p_unit_Effectivity_rec.UNIT_EFFECTIVITY_ID);
2333   FETCH l_get_unit_effectivity_csr INTO l_ue_rec;
2334   CLOSE l_get_unit_effectivity_csr;
2335 
2336   IF G_DEBUG='Y'  THEN
2337     AHL_DEBUG_PUB.debug('In Update_Unit_Effectivity', 'UMP');
2338     AHL_DEBUG_PUB.debug('Unit Eff ID:' || p_unit_Effectivity_rec.UNIT_EFFECTIVITY_ID, 'UMP');
2339     AHL_DEBUG_PUB.debug('l_status_code:' || l_status_code, 'UMP');
2340     AHL_DEBUG_PUB.debug('l_ue_rec.status_code:' || l_ue_rec.status_code, 'UMP');
2341 
2342   END IF;
2343 
2344   -- If there are no accomplishments during initialization, reset status to null
2345   -- If the accomplishment date is not set during termination, set it to sysdate
2346   IF (l_status_code = 'INIT-DUE') THEN
2347     OPEN l_threshold_exists_csr(p_unit_Effectivity_rec.UNIT_EFFECTIVITY_ID);
2348     FETCH l_threshold_exists_csr INTO l_junk;
2349     IF (l_threshold_exists_csr%NOTFOUND) THEN
2350       IF(l_set_due_date = FND_API.G_MISS_DATE) THEN
2351         l_status_code := null;
2352         l_unit_deferral_operation := 'D';
2353       ELSE
2354         l_unit_deferral_operation := 'U';
2355       END IF;
2356     ELSE
2357         l_unit_deferral_operation := 'U';
2358     END IF;
2359     CLOSE l_threshold_exists_csr;
2360 
2361   ELSIF (l_status_code = 'INIT-ACCOMPLISHED') THEN
2362     OPEN l_accomplish_exists_csr(p_unit_Effectivity_rec.UNIT_EFFECTIVITY_ID);
2363     FETCH l_accomplish_exists_csr INTO l_junk;
2364     IF (l_accomplish_exists_csr%NOTFOUND) THEN
2365       IF(l_accomplished_date IS NULL OR l_accomplished_date = FND_API.G_MISS_DATE) THEN
2366         l_status_code := null;
2367       END IF;
2368     -- raise error if date is null or g_miss.
2369     ELSIF (l_accomplished_date IS NULL OR l_accomplished_date = FND_API.G_MISS_DATE) THEN
2370         FND_MESSAGE.Set_Name('AHL','AHL_UMP_ACCMPLSHD_DATE_NULL');
2371         FND_MSG_PUB.ADD;
2372         RETURN;
2373     END IF;
2374     CLOSE l_accomplish_exists_csr;
2375     -- For INIT-ACCOMPLISHED, reset DUE_DATE, DUE_COUNTER_VALUE and MR_INTERVAL_ID
2376     l_ue_rec.DUE_DATE := null;
2377     l_ue_rec.earliest_due_date := null;
2378     l_ue_rec.latest_due_date := null;
2379     l_ue_rec.DUE_COUNTER_VALUE := null;
2380     l_ue_rec.MR_INTERVAL_ID := null;
2381   ELSIF (l_status_code = 'TERMINATED' OR l_status_code = 'MR-TERMINATE') THEN
2382     IF (l_accomplished_date IS NULL OR l_accomplished_date = FND_API.G_MISS_DATE) THEN
2383       l_accomplished_date := sysdate;
2384     END IF;
2385   END IF;
2386 
2387   -- If object version no is different, write error message and skip to next unit effectivity
2388   IF(l_ue_rec.OBJECT_VERSION_NUMBER <> p_unit_Effectivity_rec.OBJECT_VERSION_NUMBER) THEN
2389 --    FND_MESSAGE.Set_Name('AHL','AHL_UMP_UE_CHANGED');
2390     FND_MESSAGE.Set_Name('AHL', 'AHL_COM_RECORD_CHANGED');
2391     FND_MSG_PUB.ADD;
2392     RETURN;
2393   END IF;
2394 
2395   /* Moved this validation to the end of this procedure to validate after
2396    * init-accomplishment deletes as well.
2397   -- If this an accomplishment, init-accomplishment or termination, ensure that
2398   -- values for all counters are given by calling FMP API
2399   IF l_ue_rec.MR_HEADER_ID IS NOT NULL THEN
2400    IF (l_status_code = 'TERMINATED' OR l_status_code = 'MR-TERMINATE' OR
2401      l_status_code = 'ACCOMPLISHED') OR (l_status_code = 'INIT-ACCOMPLISHED' AND l_ue_rec.status_code IS NULL) THEN
2402     Match_Counters_with_FMP(
2403       p_unit_effectivity_id => p_unit_Effectivity_rec.UNIT_EFFECTIVITY_ID,
2404       p_item_instance_id    => l_ue_rec.CSI_ITEM_INSTANCE_ID,
2405       p_mr_header_id        => l_ue_rec.MR_HEADER_ID,
2406       x_counters            => l_counters_msg,
2407       x_return_status       => l_return_status);
2408     IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
2409       FND_MESSAGE.Set_Name('AHL','AHL_UMP_MISSING_COUNTERS');
2410       FND_MESSAGE.Set_Token('COUNTERS', l_counters_msg);
2411       FND_MSG_PUB.ADD;
2412       RETURN;
2413     END IF;
2414    END IF;
2415   END IF;
2416   */
2417 
2418   -- Handle G_MISS and null values
2419   IF l_accomplished_date = FND_API.G_MISS_DATE THEN
2420     l_accomplished_date := null;
2421   ELSIF l_accomplished_date IS NULL THEN
2422     l_accomplished_date := l_ue_rec.accomplished_date;
2423   END IF;
2424 
2425   -- For qa collection id.
2426   IF p_unit_Effectivity_rec.qa_collection_id = FND_API.G_MISS_NUM THEN
2427     l_ue_rec.qa_collection_id := null;
2428   ELSIF p_unit_Effectivity_rec.qa_collection_id IS NOT NULL THEN
2429     l_ue_rec.qa_collection_id := p_unit_Effectivity_rec.qa_collection_id ;
2430   END IF;
2431 
2432   IF p_unit_Effectivity_rec.REMARKS = FND_API.G_MISS_CHAR THEN
2433     l_ue_rec.REMARKS := null;
2434   ELSIF p_unit_Effectivity_rec.REMARKS IS NOT null THEN
2435     l_ue_rec.REMARKS := p_unit_Effectivity_rec.REMARKS;
2436   END IF;
2437   IF p_unit_Effectivity_rec.ATTRIBUTE_CATEGORY = FND_API.G_MISS_CHAR THEN
2438     l_ue_rec.ATTRIBUTE_CATEGORY := null;
2439   ELSIF p_unit_Effectivity_rec.ATTRIBUTE_CATEGORY IS NOT null THEN
2440     l_ue_rec.ATTRIBUTE_CATEGORY := p_unit_Effectivity_rec.ATTRIBUTE_CATEGORY;
2441   END IF;
2442   IF p_unit_Effectivity_rec.ATTRIBUTE1 = FND_API.G_MISS_CHAR THEN
2443     l_ue_rec.ATTRIBUTE1 := null;
2444   ELSIF p_unit_Effectivity_rec.ATTRIBUTE1 IS NOT null THEN
2445     l_ue_rec.ATTRIBUTE1 := p_unit_Effectivity_rec.ATTRIBUTE1;
2446   END IF;
2447   IF p_unit_Effectivity_rec.ATTRIBUTE2 = FND_API.G_MISS_CHAR THEN
2448     l_ue_rec.ATTRIBUTE2 := null;
2449   ELSIF p_unit_Effectivity_rec.ATTRIBUTE2 IS NOT null THEN
2450     l_ue_rec.ATTRIBUTE2 := p_unit_Effectivity_rec.ATTRIBUTE2;
2451   END IF;
2452   IF p_unit_Effectivity_rec.ATTRIBUTE3 = FND_API.G_MISS_CHAR THEN
2453     l_ue_rec.ATTRIBUTE3 := null;
2454   ELSIF p_unit_Effectivity_rec.ATTRIBUTE3 IS NOT null THEN
2455     l_ue_rec.ATTRIBUTE3 := p_unit_Effectivity_rec.ATTRIBUTE3;
2456   END IF;
2457   IF p_unit_Effectivity_rec.ATTRIBUTE4 = FND_API.G_MISS_CHAR THEN
2458     l_ue_rec.ATTRIBUTE4 := null;
2459   ELSIF p_unit_Effectivity_rec.ATTRIBUTE4 IS NOT null THEN
2460     l_ue_rec.ATTRIBUTE4 := p_unit_Effectivity_rec.ATTRIBUTE4;
2461   END IF;
2462   IF p_unit_Effectivity_rec.ATTRIBUTE5 = FND_API.G_MISS_CHAR THEN
2463     l_ue_rec.ATTRIBUTE5 := null;
2464   ELSIF p_unit_Effectivity_rec.ATTRIBUTE5 IS NOT null THEN
2465     l_ue_rec.ATTRIBUTE5 := p_unit_Effectivity_rec.ATTRIBUTE5;
2466   END IF;
2467   IF p_unit_Effectivity_rec.ATTRIBUTE6 = FND_API.G_MISS_CHAR THEN
2468     l_ue_rec.ATTRIBUTE6 := null;
2469   ELSIF p_unit_Effectivity_rec.ATTRIBUTE6 IS NOT null THEN
2470     l_ue_rec.ATTRIBUTE6 := p_unit_Effectivity_rec.ATTRIBUTE6;
2471   END IF;
2472   IF p_unit_Effectivity_rec.ATTRIBUTE7 = FND_API.G_MISS_CHAR THEN
2473     l_ue_rec.ATTRIBUTE7 := null;
2474   ELSIF p_unit_Effectivity_rec.ATTRIBUTE7 IS NOT null THEN
2475     l_ue_rec.ATTRIBUTE7 := p_unit_Effectivity_rec.ATTRIBUTE7;
2476   END IF;
2477   IF p_unit_Effectivity_rec.ATTRIBUTE8 = FND_API.G_MISS_CHAR THEN
2478     l_ue_rec.ATTRIBUTE8 := null;
2479   ELSIF p_unit_Effectivity_rec.ATTRIBUTE8 IS NOT null THEN
2480     l_ue_rec.ATTRIBUTE8 := p_unit_Effectivity_rec.ATTRIBUTE8;
2481   END IF;
2482   IF p_unit_Effectivity_rec.ATTRIBUTE9 = FND_API.G_MISS_CHAR THEN
2483     l_ue_rec.ATTRIBUTE9 := null;
2484   ELSIF p_unit_Effectivity_rec.ATTRIBUTE9 IS NOT null THEN
2485     l_ue_rec.ATTRIBUTE9 := p_unit_Effectivity_rec.ATTRIBUTE9;
2486   END IF;
2487   IF p_unit_Effectivity_rec.ATTRIBUTE10 = FND_API.G_MISS_CHAR THEN
2488     l_ue_rec.ATTRIBUTE10 := null;
2489   ELSIF p_unit_Effectivity_rec.ATTRIBUTE10 IS NOT null THEN
2490     l_ue_rec.ATTRIBUTE10 := p_unit_Effectivity_rec.ATTRIBUTE10;
2491   END IF;
2492   IF p_unit_Effectivity_rec.ATTRIBUTE11 = FND_API.G_MISS_CHAR THEN
2493     l_ue_rec.ATTRIBUTE11 := null;
2494   ELSIF p_unit_Effectivity_rec.ATTRIBUTE11 IS NOT null THEN
2495     l_ue_rec.ATTRIBUTE11 := p_unit_Effectivity_rec.ATTRIBUTE11;
2496   END IF;
2497   IF p_unit_Effectivity_rec.ATTRIBUTE12 = FND_API.G_MISS_CHAR THEN
2498     l_ue_rec.ATTRIBUTE12 := null;
2499   ELSIF p_unit_Effectivity_rec.ATTRIBUTE12 IS NOT null THEN
2500     l_ue_rec.ATTRIBUTE12 := p_unit_Effectivity_rec.ATTRIBUTE12;
2501   END IF;
2502   IF p_unit_Effectivity_rec.ATTRIBUTE13 = FND_API.G_MISS_CHAR THEN
2503     l_ue_rec.ATTRIBUTE13 := null;
2504   ELSIF p_unit_Effectivity_rec.ATTRIBUTE13 IS NOT null THEN
2505     l_ue_rec.ATTRIBUTE13 := p_unit_Effectivity_rec.ATTRIBUTE13;
2506   END IF;
2507   IF p_unit_Effectivity_rec.ATTRIBUTE14 = FND_API.G_MISS_CHAR THEN
2508     l_ue_rec.ATTRIBUTE14 := null;
2509   ELSIF p_unit_Effectivity_rec.ATTRIBUTE14 IS NOT null THEN
2510     l_ue_rec.ATTRIBUTE14 := p_unit_Effectivity_rec.ATTRIBUTE14;
2511   END IF;
2512   IF p_unit_Effectivity_rec.ATTRIBUTE15 = FND_API.G_MISS_CHAR THEN
2513     l_ue_rec.ATTRIBUTE15 := null;
2514   ELSIF p_unit_Effectivity_rec.ATTRIBUTE15 IS NOT null THEN
2515     l_ue_rec.ATTRIBUTE15 := p_unit_Effectivity_rec.ATTRIBUTE15;
2516   END IF;
2517 
2518   -- Call Table Handler to update record
2519   AHL_UNIT_EFFECTIVITIES_PKG.update_row(
2520             x_unit_effectivity_id => p_unit_Effectivity_rec.UNIT_EFFECTIVITY_ID,
2521             x_csi_item_instance_id => l_ue_rec.CSI_ITEM_INSTANCE_ID,
2522             x_mr_interval_id => l_ue_rec.MR_INTERVAL_ID,
2523             x_mr_effectivity_id => l_ue_rec.MR_EFFECTIVITY_ID,
2524             x_mr_header_id => l_ue_rec.MR_HEADER_ID,
2525             x_status_code => l_status_code,
2526             x_due_date => l_ue_rec.DUE_DATE,
2527             x_due_counter_value => l_ue_rec.DUE_COUNTER_VALUE,
2528             x_forecast_sequence => l_ue_rec.FORECAST_SEQUENCE,
2529             x_repetitive_mr_flag => l_ue_rec.REPETITIVE_MR_FLAG,
2530             x_tolerance_flag => l_ue_rec.TOLERANCE_FLAG,
2531             x_remarks => l_ue_rec.REMARKS,
2532             x_message_code => l_ue_rec.MESSAGE_CODE,
2533             x_preceding_ue_id => l_ue_rec.PRECEDING_UE_ID,
2534             x_date_run => l_ue_rec.DATE_RUN,
2535             x_set_due_date => null,
2536             x_accomplished_date => l_accomplished_date,
2537             x_service_line_id   => l_ue_rec.service_line_id,
2538             x_program_mr_header_id => l_ue_rec.program_mr_header_id,
2539             x_cancel_reason_code   => l_ue_rec.cancel_reason_code,
2540             x_earliest_due_date    => l_ue_rec.earliest_due_date,
2541             x_latest_due_date      => l_ue_rec.latest_due_date,
2542             x_defer_from_ue_id     => l_ue_rec.defer_from_ue_id,
2543             x_qa_collection_id     => l_ue_rec.qa_collection_id,
2544             x_cs_incident_id       => l_ue_rec.cs_incident_id,
2545             x_orig_deferral_ue_id  => l_ue_rec.orig_deferral_ue_id,
2546             x_application_usg_code  => l_ue_rec.application_usg_code,
2547             x_object_type           => l_ue_rec.object_type,
2548             x_counter_id            => l_ue_rec.counter_id,
2549             x_manually_planned_flag => l_ue_rec.manually_planned_flag,
2550             X_LOG_SERIES_CODE       => l_ue_rec.log_series_code,
2551             X_LOG_SERIES_NUMBER     => l_ue_rec.log_series_number,
2552             X_FLIGHT_NUMBER         => l_ue_rec.flight_number,
2553             X_MEL_CDL_TYPE_CODE     => l_ue_rec.mel_cdl_type_code,
2554             X_POSITION_PATH_ID      => l_ue_rec.position_path_id,
2555             X_ATA_CODE              => l_ue_rec.ATA_CODE,
2556             X_UNIT_CONFIG_HEADER_ID  => l_ue_rec.unit_config_header_id,
2557             x_attribute_category => l_ue_rec.ATTRIBUTE_CATEGORY,
2558             x_attribute1 => l_ue_rec.ATTRIBUTE1,
2559             x_attribute2 => l_ue_rec.ATTRIBUTE2,
2560             x_attribute3 => l_ue_rec.ATTRIBUTE3,
2561             x_attribute4 => l_ue_rec.ATTRIBUTE4,
2562             x_attribute5 => l_ue_rec.ATTRIBUTE5,
2563             x_attribute6 => l_ue_rec.ATTRIBUTE6,
2564             x_attribute7 => l_ue_rec.ATTRIBUTE7,
2565             x_attribute8 => l_ue_rec.ATTRIBUTE8,
2566             x_attribute9 => l_ue_rec.ATTRIBUTE9,
2567             x_attribute10 => l_ue_rec.ATTRIBUTE10,
2568             x_attribute11 => l_ue_rec.ATTRIBUTE11,
2569             x_attribute12 => l_ue_rec.ATTRIBUTE12,
2570             x_attribute13 => l_ue_rec.ATTRIBUTE13,
2571             x_attribute14 => l_ue_rec.ATTRIBUTE14,
2572             x_attribute15 => l_ue_rec.ATTRIBUTE15,
2573             x_object_version_number => l_ue_rec.OBJECT_VERSION_NUMBER + 1,
2574             x_last_update_date => TRUNC(sysdate),
2575             x_last_updated_by => fnd_global.user_id,
2576             x_last_update_login => fnd_global.login_id);
2577 
2578 
2579   -- Update/Delete the unit_deferrals record.
2580   OPEN ahl_unit_def_csr (p_unit_Effectivity_rec.unit_effectivity_id);
2581   FETCH ahl_unit_def_csr INTO l_unit_def_rec;
2582   IF (ahl_unit_def_csr%FOUND) THEN
2583     IF (l_unit_deferral_operation = 'D') THEN
2584        -- Check Object version.
2585        IF (l_unit_def_rec.object_version_number <> p_unit_Effectivity_rec.unit_deferral_object_version)
2586        THEN
2587          FND_MESSAGE.Set_Name('AHL', 'AHL_COM_RECORD_CHANGED');
2588          FND_MSG_PUB.ADD;
2589          RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2590        END IF;
2591 
2592        AHL_UNIT_DEFERRALS_PKG.delete_row(x_unit_deferral_id => l_unit_def_rec.unit_deferral_id);
2593 
2594     ELSIF (l_unit_deferral_operation = 'U') THEN
2595 
2596        -- Check Object version.
2597        IF (l_unit_def_rec.object_version_number <> p_unit_Effectivity_rec.unit_deferral_object_version)
2598        THEN
2599          FND_MESSAGE.Set_Name('AHL', 'AHL_COM_RECORD_CHANGED');
2600          FND_MSG_PUB.ADD;
2601          RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2602        END IF;
2603 
2604        IF l_set_due_date = FND_API.G_MISS_DATE THEN
2605          l_set_due_date := null;
2606        ELSIF l_set_due_date IS NULL THEN
2607          l_set_due_date  := l_unit_def_rec.set_due_date;
2608        END IF;
2609 
2610        IF (nvl(l_unit_def_rec.set_due_date, sysdate+1) <> nvl(l_set_due_date, sysdate+1)) THEN
2611          AHL_UNIT_DEFERRALS_PKG.update_row(
2612             x_unit_deferral_id => l_unit_def_rec.unit_deferral_id,
2613             x_ata_sequence_id => l_unit_def_rec.ata_sequence_id,
2614             x_object_version_number => l_unit_def_rec.object_version_number + 1,
2615             x_last_updated_by => fnd_global.user_id,
2616             x_last_update_date => sysdate,
2617             x_last_update_login => fnd_global.login_id,
2618             x_unit_effectivity_id => p_unit_Effectivity_rec.UNIT_EFFECTIVITY_ID,
2619             x_unit_deferral_type => l_unit_def_rec.unit_deferral_type,
2620             x_set_due_date => l_set_due_date,
2621             x_deferral_effective_on => l_unit_def_rec.deferral_effective_on,
2622             x_approval_status_code => l_unit_def_rec.approval_status_code,
2623             x_defer_reason_code => l_unit_def_rec.defer_reason_code,
2624             x_affect_due_calc_flag => l_unit_def_rec.affect_due_calc_flag,
2625             x_skip_mr_flag => l_unit_def_rec.skip_mr_flag,
2626             x_remarks => l_unit_def_rec.remarks,
2627             x_approver_notes => l_unit_def_rec.approver_notes,
2628             x_user_deferral_type => null,
2629             x_attribute_category => l_unit_def_rec.attribute_category,
2630             x_attribute1 => l_unit_def_rec.attribute1,
2631             x_attribute2 => l_unit_def_rec.attribute2,
2632             x_attribute3 => l_unit_def_rec.attribute3,
2633             x_attribute4 => l_unit_def_rec.attribute4,
2634             x_attribute5 => l_unit_def_rec.attribute5,
2635             x_attribute6 => l_unit_def_rec.attribute6,
2636             x_attribute7 => l_unit_def_rec.attribute7,
2637             x_attribute8 => l_unit_def_rec.attribute8,
2638             x_attribute9 => l_unit_def_rec.attribute9,
2639             x_attribute10 => l_unit_def_rec.attribute10,
2640             x_attribute11 => l_unit_def_rec.attribute11,
2641             x_attribute12 => l_unit_def_rec.attribute12,
2642             x_attribute13 => l_unit_def_rec.attribute13,
2643             x_attribute14 => l_unit_def_rec.attribute14,
2644             x_attribute15 => l_unit_def_rec.attribute15
2645             );
2646       END IF; -- set due date.
2647     END IF;
2648   ELSE -- unit deferral not found.
2649     -- If set due date is not null, create a new unit deferral record.
2650     -- Create unit_deferral record.
2651     AHL_UNIT_DEFERRALS_PKG.insert_row(
2652             x_rowid => l_rowid,
2653             x_unit_deferral_id => l_unit_deferral_id,
2654             x_ata_sequence_id => null,
2655             x_object_version_number => 1,
2656             x_created_by => fnd_global.user_id,
2657             x_creation_date => sysdate,
2658             x_last_updated_by => fnd_global.user_id,
2659             x_last_update_date => sysdate,
2660             x_last_update_login => fnd_global.login_id,
2661             x_unit_effectivity_id => p_unit_Effectivity_rec.UNIT_EFFECTIVITY_ID,
2662             x_unit_deferral_type => 'INIT-DUE',
2663             x_set_due_date => p_unit_Effectivity_rec.set_due_date,
2664             x_deferral_effective_on => null,
2665             x_approval_status_code => null,
2666             x_defer_reason_code => null,
2667             x_affect_due_calc_flag => 'Y',
2668             x_skip_mr_flag => null,
2669             x_remarks => null,
2670             x_approver_notes => null,
2671             x_user_deferral_type => null,
2672             x_attribute_category => null,
2673             x_attribute1 => null,
2674             x_attribute2 => null,
2675             x_attribute3 => null,
2676             x_attribute4 => null,
2677             x_attribute5 => null,
2678             x_attribute6 => null,
2679             x_attribute7 => null,
2680             x_attribute8 => null,
2681             x_attribute9 => null,
2682             x_attribute10 => null,
2683             x_attribute11 => null,
2684             x_attribute12 => null,
2685             x_attribute13 => null,
2686             x_attribute14 => null,
2687             x_attribute15 => null
2688             );
2689 
2690   END IF;
2691   CLOSE ahl_unit_def_csr ;
2692 
2693   -- Post Processing
2694   -- If this is a parent of a group, terminate all its descendents also
2695   IF (l_status_code = 'TERMINATED') THEN
2696     OPEN l_get_descendents(p_unit_Effectivity_rec.UNIT_EFFECTIVITY_ID);
2697     LOOP
2698       FETCH l_get_descendents into l_descendent_ue_id;
2699       EXIT WHEN l_get_descendents%NOTFOUND;
2700       Terminate_Descendent(l_descendent_ue_id);
2701     END LOOP;
2702     CLOSE l_get_descendents;
2703   END IF;
2704 
2705   -- If this is an INIT-DUE, remove all accomplishments if any exists
2706   IF (l_status_code = 'INIT-DUE') THEN
2707     OPEN l_get_accomplishments(p_unit_Effectivity_rec.UNIT_EFFECTIVITY_ID);
2708     LOOP
2709       FETCH l_get_accomplishments into l_accomplishment_id;
2710       EXIT WHEN l_get_accomplishments%NOTFOUND;
2711       AHL_UNIT_ACCOMPLISH_PKG.delete_row(l_accomplishment_id);
2712     END LOOP;
2713     CLOSE l_get_accomplishments;
2714   END IF;
2715 
2716   -- If this is an INIT-ACCOMPLISHED, remove all thresholds if any exists
2717   IF (l_status_code = 'INIT-ACCOMPLISHED') THEN
2718     OPEN ahl_unit_def_csr (p_unit_Effectivity_rec.UNIT_EFFECTIVITY_ID);
2719     FETCH ahl_unit_def_csr INTO l_unit_def_rec;
2720     IF (ahl_unit_def_csr%FOUND) THEN
2721 
2722       -- delete thresholds.
2723       OPEN l_get_thresholds(l_unit_def_rec.unit_deferral_id);
2724       LOOP
2725         FETCH l_get_thresholds into l_threshold_id;
2726         EXIT WHEN l_get_thresholds%NOTFOUND;
2727         AHL_UNIT_THRESHOLDS_PKG.delete_row(l_threshold_id);
2728       END LOOP;
2729       CLOSE l_get_thresholds;
2730 
2731       -- delete unit_deferrals.
2732       AHL_UNIT_DEFERRALS_PKG.delete_row(x_unit_deferral_id => l_unit_def_rec.unit_deferral_id);
2733 
2734     END IF;
2735     CLOSE ahl_unit_def_csr;
2736   END IF;
2737 
2738   -- For an MR, if this an accomplishment, init-accomplishment or termination, ensure that
2739   -- values for all counters are given by calling FMP API
2740   IF l_ue_rec.MR_HEADER_ID IS NOT NULL THEN
2741      IF (l_status_code = 'TERMINATED' OR --l_status_code = 'MR-TERMINATE' OR
2742         l_status_code = 'ACCOMPLISHED' OR l_status_code = 'INIT-ACCOMPLISHED')
2743      THEN
2744        Match_Counters_with_FMP(
2745          p_unit_effectivity_id => p_unit_Effectivity_rec.UNIT_EFFECTIVITY_ID,
2746          p_item_instance_id    => l_ue_rec.CSI_ITEM_INSTANCE_ID,
2747          p_mr_header_id        => l_ue_rec.MR_HEADER_ID,
2748          x_counters            => l_counters_msg,
2749          x_return_status       => l_return_status);
2750        IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
2751          FND_MESSAGE.Set_Name('AHL','AHL_UMP_MISSING_COUNTERS');
2752          FND_MESSAGE.Set_Token('COUNTERS', l_counters_msg);
2753          FND_MSG_PUB.ADD;
2754          --RETURN;
2755        END IF;
2756      END IF;
2757   END IF;
2758 
2759 END Update_Unit_Effectivity;
2760 
2761 ------------------------------------
2762 -- This procedure terminates a descendent unit effectivity
2763 -- Only the following fields are affected (The rest are retained):
2764 --   OBJECT_VERSION_NUMBER
2765 --   STATUS_CODE
2766 --   ACCOMPLISHED_DATE
2767 --   LAST_UPDATE_DATE
2768 --   LAST_UPDATED_BY
2769 --   LAST_UPDATE_LOGIN
2770 ------------------------------------
2771 PROCEDURE Terminate_Descendent(
2772    p_descendent_ue_id IN NUMBER) IS
2773   CURSOR l_get_unit_effectivity_csr(p_ue_id IN NUMBER) IS
2774     SELECT
2775       OBJECT_VERSION_NUMBER,
2776       CSI_ITEM_INSTANCE_ID,
2777       MR_INTERVAL_ID,
2778       MR_EFFECTIVITY_ID,
2779       MR_HEADER_ID,
2780       DUE_DATE,
2781       DUE_COUNTER_VALUE,
2782       FORECAST_SEQUENCE,
2783       REPETITIVE_MR_FLAG,
2784       TOLERANCE_FLAG,
2785       REMARKS,
2786       MESSAGE_CODE,
2787       PRECEDING_UE_ID,
2788       DATE_RUN,
2789       SET_DUE_DATE,
2790       SERVICE_LINE_ID,
2791       PROGRAM_MR_HEADER_ID,
2792       CANCEL_REASON_CODE,
2793       EARLIEST_DUE_DATE,
2794       LATEST_DUE_DATE,
2795       DEFER_FROM_UE_ID,
2796       CS_INCIDENT_ID,
2797       QA_COLLECTION_ID,
2798       ORIG_DEFERRAL_UE_ID,
2799       APPLICATION_USG_CODE,
2800       OBJECT_TYPE,
2801       COUNTER_ID,
2802       MANUALLY_PLANNED_FLAG,
2803       LOG_SERIES_CODE,
2804       LOG_SERIES_NUMBER,
2805       FLIGHT_NUMBER,
2806       MEL_CDL_TYPE_CODE,
2807       POSITION_PATH_ID,
2808       ATA_CODE,
2809       UNIT_CONFIG_HEADER_ID,
2810       ATTRIBUTE_CATEGORY,
2811       ATTRIBUTE1,
2812       ATTRIBUTE2,
2813       ATTRIBUTE3,
2814       ATTRIBUTE4,
2815       ATTRIBUTE5,
2816       ATTRIBUTE6,
2817       ATTRIBUTE7,
2818       ATTRIBUTE8,
2819       ATTRIBUTE9,
2820       ATTRIBUTE10,
2821       ATTRIBUTE11,
2822       ATTRIBUTE12,
2823       ATTRIBUTE13,
2824       ATTRIBUTE14,
2825       ATTRIBUTE15
2826     FROM  AHL_UNIT_EFFECTIVITIES_APP_V
2827     WHERE unit_effectivity_id = p_ue_id
2828     FOR UPDATE OF OBJECT_VERSION_NUMBER;
2829 
2830    l_ue_rec   l_get_unit_effectivity_csr%rowtype;
2831 
2832 BEGIN
2833   IF G_DEBUG='Y'  THEN
2834     AHL_DEBUG_PUB.debug('Terminating Descendent with ue_id ' || p_descendent_ue_id, 'UMP');
2835   END IF;
2836   OPEN l_get_unit_effectivity_csr(p_descendent_ue_id);
2837   FETCH l_get_unit_effectivity_csr INTO l_ue_rec;
2838   CLOSE l_get_unit_effectivity_csr;
2839 
2840   -- Call Table Handler to update record
2841   AHL_UNIT_EFFECTIVITIES_PKG.update_row(
2842             x_unit_effectivity_id => p_descendent_ue_id,
2843             x_csi_item_instance_id => l_ue_rec.CSI_ITEM_INSTANCE_ID,
2844             x_mr_interval_id => l_ue_rec.MR_INTERVAL_ID,
2845             x_mr_effectivity_id => l_ue_rec.MR_EFFECTIVITY_ID,
2846             x_mr_header_id => l_ue_rec.MR_HEADER_ID,
2847             x_status_code => 'TERMINATED',
2848             x_due_date => l_ue_rec.DUE_DATE,
2849             x_due_counter_value => l_ue_rec.DUE_COUNTER_VALUE,
2850             x_forecast_sequence => l_ue_rec.FORECAST_SEQUENCE,
2851             x_repetitive_mr_flag => l_ue_rec.REPETITIVE_MR_FLAG,
2852             x_tolerance_flag => l_ue_rec.TOLERANCE_FLAG,
2853             x_remarks => l_ue_rec.REMARKS,
2854             x_message_code => l_ue_rec.MESSAGE_CODE,
2855             x_preceding_ue_id => l_ue_rec.PRECEDING_UE_ID,
2856             x_date_run => l_ue_rec.DATE_RUN,
2857             x_set_due_date => l_ue_rec.SET_DUE_DATE,
2858             x_accomplished_date => TRUNC(sysdate),
2859             x_service_line_id  => l_ue_rec.service_line_id,
2860             x_program_mr_header_id => l_ue_rec.program_mr_header_id,
2861             x_cancel_reason_code => l_ue_rec.cancel_reason_code,
2862             x_earliest_due_date  => l_ue_rec.earliest_due_date,
2863             x_latest_due_date    => l_ue_rec.latest_due_date,
2864             x_defer_from_ue_id     => l_ue_rec.defer_from_ue_id,
2865             x_qa_collection_id     => l_ue_rec.qa_collection_id,
2866             x_orig_deferral_ue_id  => l_ue_rec.orig_deferral_ue_id,
2867             x_cs_incident_id       => l_ue_rec.cs_incident_id,
2868             x_application_usg_code => l_ue_rec.application_usg_code,
2869             x_object_type          => l_ue_rec.object_type,
2870             x_counter_id           => l_ue_rec.counter_id,
2871             x_manually_planned_flag => l_ue_rec.manually_planned_flag,
2872             X_LOG_SERIES_CODE       => l_ue_rec.log_series_code,
2873             X_LOG_SERIES_NUMBER     => l_ue_rec.log_series_number,
2874             X_FLIGHT_NUMBER         => l_ue_rec.flight_number,
2875             X_MEL_CDL_TYPE_CODE     => l_ue_rec.mel_cdl_type_code,
2876             X_POSITION_PATH_ID      => l_ue_rec.position_path_id,
2877             X_ATA_CODE              => l_ue_rec.ATA_CODE,
2878             X_UNIT_CONFIG_HEADER_ID  => l_ue_rec.unit_config_header_id,
2879             x_attribute_category => l_ue_rec.ATTRIBUTE_CATEGORY,
2880             x_attribute1 => l_ue_rec.ATTRIBUTE1,
2881             x_attribute2 => l_ue_rec.ATTRIBUTE2,
2882             x_attribute3 => l_ue_rec.ATTRIBUTE3,
2883             x_attribute4 => l_ue_rec.ATTRIBUTE4,
2884             x_attribute5 => l_ue_rec.ATTRIBUTE5,
2885             x_attribute6 => l_ue_rec.ATTRIBUTE6,
2886             x_attribute7 => l_ue_rec.ATTRIBUTE7,
2887             x_attribute8 => l_ue_rec.ATTRIBUTE8,
2888             x_attribute9 => l_ue_rec.ATTRIBUTE9,
2889             x_attribute10 => l_ue_rec.ATTRIBUTE10,
2890             x_attribute11 => l_ue_rec.ATTRIBUTE11,
2891             x_attribute12 => l_ue_rec.ATTRIBUTE12,
2892             x_attribute13 => l_ue_rec.ATTRIBUTE13,
2893             x_attribute14 => l_ue_rec.ATTRIBUTE14,
2894             x_attribute15 => l_ue_rec.ATTRIBUTE15,
2895             x_object_version_number => l_ue_rec.OBJECT_VERSION_NUMBER + 1,
2896             x_last_update_date => TRUNC(sysdate),
2897             x_last_updated_by => fnd_global.user_id,
2898             x_last_update_login => fnd_global.login_id);
2899 
2900 END Terminate_Descendent;
2901 
2902 ------------------------------------
2903 -- This procedure saves the thresholds by calling
2904 -- the insert_row, update_row or delete_row methods
2905 -- of the Thresholds table handler
2906 ------------------------------------
2907 PROCEDURE Update_Thresholds(
2908     p_unit_Effectivity_rec IN AHL_UMP_UNITMAINT_PVT.Unit_Effectivity_rec_type,
2909     p_x_unit_threshold_tbl IN OUT NOCOPY AHL_UMP_UNITMAINT_PVT.Unit_Threshold_tbl_type) IS
2910 
2911   CURSOR l_get_unit_threshold_csr(p_threshold_id IN NUMBER) IS
2912     SELECT OBJECT_VERSION_NUMBER,
2913       --UNIT_EFFECTIVITY_ID,
2914       UNIT_DEFERRAL_ID,
2915       COUNTER_ID,
2916       CTR_VALUE_TYPE_CODE,
2917       ATTRIBUTE_CATEGORY,
2918       ATTRIBUTE1,
2919       ATTRIBUTE2,
2920       ATTRIBUTE3,
2921       ATTRIBUTE4,
2922       ATTRIBUTE5,
2923       ATTRIBUTE6,
2924       ATTRIBUTE7,
2925       ATTRIBUTE8,
2926       ATTRIBUTE9,
2927       ATTRIBUTE10,
2928       ATTRIBUTE11,
2929       ATTRIBUTE12,
2930       ATTRIBUTE13,
2931       ATTRIBUTE14,
2932       ATTRIBUTE15
2933     FROM AHL_UNIT_THRESHOLDS
2934     WHERE UNIT_THRESHOLD_ID = p_threshold_id
2935     FOR UPDATE OF OBJECT_VERSION_NUMBER;
2936 
2937   CURSOR l_get_dup_counter_csr(p_unit_def_id IN NUMBER,
2938                                p_counter_id  IN NUMBER) IS
2939     SELECT 'x'
2940     FROM AHL_UNIT_THRESHOLDS UTH
2941     WHERE UTH.unit_deferral_id = p_unit_def_id AND
2942           UTH.COUNTER_ID = p_counter_id;
2943 
2944   CURSOR l_get_def_csr(p_ue_id      IN NUMBER) IS
2945     SELECT unit_deferral_id
2946     FROM AHL_UNIT_DEFERRALS_B UDF
2947     WHERE UDF.UNIT_EFFECTIVITY_ID = p_ue_id AND
2948           UDF.UNIT_DEFERRAL_TYPE = 'INIT-DUE';
2949 
2950   l_threshold_details  l_get_unit_threshold_csr%ROWTYPE;
2951   l_junk               VARCHAR2(1);
2952   l_unit_deferral_id   NUMBER;
2953   l_rowid              VARCHAR2(30);
2954 
2955 BEGIN
2956   IF (p_x_unit_threshold_tbl.COUNT > 0) THEN
2957     FOR i IN p_x_unit_threshold_tbl.FIRST..p_x_unit_threshold_tbl.LAST LOOP
2958       IF (p_x_unit_threshold_tbl(i).OPERATION_FLAG = 'D') THEN
2959         -- delete row
2960         AHL_UNIT_THRESHOLDS_PKG.delete_row(p_x_unit_threshold_tbl(i).UNIT_THRESHOLD_ID);
2961       ELSIF (p_x_unit_threshold_tbl(i).OPERATION_FLAG = 'M') THEN
2962         -- modify row
2963         OPEN l_get_unit_threshold_csr(p_x_unit_threshold_tbl(i).UNIT_THRESHOLD_ID);
2964         FETCH l_get_unit_threshold_csr INTO l_threshold_details;
2965         IF (l_get_unit_threshold_csr%FOUND) THEN
2966           -- If object version no is different, write error message and skip to next unit effectivity
2967           IF(l_threshold_details.OBJECT_VERSION_NUMBER <> p_x_unit_threshold_tbl(i).OBJECT_VERSION_NUMBER) THEN
2968 --            FND_MESSAGE.Set_Name('AHL','AHL_UMP_THRESHOLD_CHANGED');
2969 --            FND_MESSAGE.Set_Token('COUNTER', p_x_unit_threshold_tbl(i).COUNTER_NAME);
2970             FND_MESSAGE.Set_Name('AHL', 'AHL_COM_RECORD_CHANGED');
2971             FND_MSG_PUB.ADD;
2972             RETURN;
2973           END IF;
2974           p_x_unit_threshold_tbl(i).OBJECT_VERSION_NUMBER := l_threshold_details.OBJECT_VERSION_NUMBER + 1;
2975           -- Handle G_MISS and null values
2976           IF p_x_unit_threshold_tbl(i).ATTRIBUTE_CATEGORY = FND_API.G_MISS_CHAR THEN
2977             p_x_unit_threshold_tbl(i).ATTRIBUTE_CATEGORY := null;
2978           ELSIF p_x_unit_threshold_tbl(i).ATTRIBUTE_CATEGORY IS null THEN
2979             p_x_unit_threshold_tbl(i).ATTRIBUTE_CATEGORY := l_threshold_details.ATTRIBUTE_CATEGORY;
2980           END IF;
2981           IF p_x_unit_threshold_tbl(i).ATTRIBUTE1 = FND_API.G_MISS_CHAR THEN
2982             p_x_unit_threshold_tbl(i).ATTRIBUTE1 := null;
2983           ELSIF p_x_unit_threshold_tbl(i).ATTRIBUTE1 IS null THEN
2984             p_x_unit_threshold_tbl(i).ATTRIBUTE1 := l_threshold_details.ATTRIBUTE1;
2985           END IF;
2986           IF p_x_unit_threshold_tbl(i).ATTRIBUTE2 = FND_API.G_MISS_CHAR THEN
2987             p_x_unit_threshold_tbl(i).ATTRIBUTE2 := null;
2988           ELSIF p_x_unit_threshold_tbl(i).ATTRIBUTE2 IS null THEN
2989             p_x_unit_threshold_tbl(i).ATTRIBUTE2 := l_threshold_details.ATTRIBUTE2;
2990           END IF;
2991           IF p_x_unit_threshold_tbl(i).ATTRIBUTE3 = FND_API.G_MISS_CHAR THEN
2992             p_x_unit_threshold_tbl(i).ATTRIBUTE3 := null;
2993           ELSIF p_x_unit_threshold_tbl(i).ATTRIBUTE3 IS null THEN
2994             p_x_unit_threshold_tbl(i).ATTRIBUTE3 := l_threshold_details.ATTRIBUTE3;
2995           END IF;
2996           IF p_x_unit_threshold_tbl(i).ATTRIBUTE4 = FND_API.G_MISS_CHAR THEN
2997             p_x_unit_threshold_tbl(i).ATTRIBUTE4 := null;
2998           ELSIF p_x_unit_threshold_tbl(i).ATTRIBUTE4 IS null THEN
2999             p_x_unit_threshold_tbl(i).ATTRIBUTE4 := l_threshold_details.ATTRIBUTE4;
3000           END IF;
3001           IF p_x_unit_threshold_tbl(i).ATTRIBUTE5 = FND_API.G_MISS_CHAR THEN
3002             p_x_unit_threshold_tbl(i).ATTRIBUTE5 := null;
3003           ELSIF p_x_unit_threshold_tbl(i).ATTRIBUTE5 IS null THEN
3004             p_x_unit_threshold_tbl(i).ATTRIBUTE5 := l_threshold_details.ATTRIBUTE5;
3005           END IF;
3006           IF p_x_unit_threshold_tbl(i).ATTRIBUTE6 = FND_API.G_MISS_CHAR THEN
3007             p_x_unit_threshold_tbl(i).ATTRIBUTE6 := null;
3008           ELSIF p_x_unit_threshold_tbl(i).ATTRIBUTE6 IS null THEN
3009             p_x_unit_threshold_tbl(i).ATTRIBUTE6 := l_threshold_details.ATTRIBUTE6;
3010           END IF;
3011           IF p_x_unit_threshold_tbl(i).ATTRIBUTE7 = FND_API.G_MISS_CHAR THEN
3012             p_x_unit_threshold_tbl(i).ATTRIBUTE7 := null;
3013           ELSIF p_x_unit_threshold_tbl(i).ATTRIBUTE7 IS null THEN
3014             p_x_unit_threshold_tbl(i).ATTRIBUTE7 := l_threshold_details.ATTRIBUTE7;
3015           END IF;
3016           IF p_x_unit_threshold_tbl(i).ATTRIBUTE8 = FND_API.G_MISS_CHAR THEN
3017             p_x_unit_threshold_tbl(i).ATTRIBUTE8 := null;
3018           ELSIF p_x_unit_threshold_tbl(i).ATTRIBUTE8 IS null THEN
3019             p_x_unit_threshold_tbl(i).ATTRIBUTE8 := l_threshold_details.ATTRIBUTE8;
3020           END IF;
3021           IF p_x_unit_threshold_tbl(i).ATTRIBUTE9 = FND_API.G_MISS_CHAR THEN
3022             p_x_unit_threshold_tbl(i).ATTRIBUTE9 := null;
3023           ELSIF p_x_unit_threshold_tbl(i).ATTRIBUTE9 IS null THEN
3024             p_x_unit_threshold_tbl(i).ATTRIBUTE9 := l_threshold_details.ATTRIBUTE9;
3025           END IF;
3026           IF p_x_unit_threshold_tbl(i).ATTRIBUTE10 = FND_API.G_MISS_CHAR THEN
3027             p_x_unit_threshold_tbl(i).ATTRIBUTE10 := null;
3028           ELSIF p_x_unit_threshold_tbl(i).ATTRIBUTE10 IS null THEN
3029             p_x_unit_threshold_tbl(i).ATTRIBUTE10 := l_threshold_details.ATTRIBUTE10;
3030           END IF;
3031           IF p_x_unit_threshold_tbl(i).ATTRIBUTE11 = FND_API.G_MISS_CHAR THEN
3032             p_x_unit_threshold_tbl(i).ATTRIBUTE11 := null;
3033           ELSIF p_x_unit_threshold_tbl(i).ATTRIBUTE11 IS null THEN
3034             p_x_unit_threshold_tbl(i).ATTRIBUTE11 := l_threshold_details.ATTRIBUTE11;
3035           END IF;
3036           IF p_x_unit_threshold_tbl(i).ATTRIBUTE12 = FND_API.G_MISS_CHAR THEN
3037             p_x_unit_threshold_tbl(i).ATTRIBUTE12 := null;
3038           ELSIF p_x_unit_threshold_tbl(i).ATTRIBUTE12 IS null THEN
3039             p_x_unit_threshold_tbl(i).ATTRIBUTE12 := l_threshold_details.ATTRIBUTE12;
3040           END IF;
3041           IF p_x_unit_threshold_tbl(i).ATTRIBUTE13 = FND_API.G_MISS_CHAR THEN
3042             p_x_unit_threshold_tbl(i).ATTRIBUTE13 := null;
3043           ELSIF p_x_unit_threshold_tbl(i).ATTRIBUTE13 IS null THEN
3044             p_x_unit_threshold_tbl(i).ATTRIBUTE13 := l_threshold_details.ATTRIBUTE13;
3045           END IF;
3046           IF p_x_unit_threshold_tbl(i).ATTRIBUTE14 = FND_API.G_MISS_CHAR THEN
3047             p_x_unit_threshold_tbl(i).ATTRIBUTE14 := null;
3048           ELSIF p_x_unit_threshold_tbl(i).ATTRIBUTE14 IS null THEN
3049             p_x_unit_threshold_tbl(i).ATTRIBUTE14 := l_threshold_details.ATTRIBUTE14;
3050           END IF;
3051           IF p_x_unit_threshold_tbl(i).ATTRIBUTE15 = FND_API.G_MISS_CHAR THEN
3052             p_x_unit_threshold_tbl(i).ATTRIBUTE15 := null;
3053           ELSIF p_x_unit_threshold_tbl(i).ATTRIBUTE15 IS null THEN
3054             p_x_unit_threshold_tbl(i).ATTRIBUTE15 := l_threshold_details.ATTRIBUTE15;
3055           END IF;
3056 
3057           -- Call table handler to update
3058           AHL_UNIT_THRESHOLDS_PKG.update_row (
3059             P_UNIT_THRESHOLD_ID       => p_x_unit_threshold_tbl(i).UNIT_THRESHOLD_ID,
3060             --P_UNIT_EFFECTIVITY_ID     => l_threshold_details.UNIT_EFFECTIVITY_ID,
3061             P_UNIT_DEFERRAL_ID        => l_threshold_details.UNIT_DEFERRAL_ID,
3062             P_CTR_VALUE_TYPE_CODE     => l_threshold_details.CTR_VALUE_TYPE_CODE,
3063             P_COUNTER_ID              => l_threshold_details.COUNTER_ID,
3064             P_COUNTER_VALUE           => p_x_unit_threshold_tbl(i).COUNTER_VALUE,
3065             P_ATTRIBUTE_CATEGORY      => p_x_unit_threshold_tbl(i).ATTRIBUTE_CATEGORY,
3066             P_ATTRIBUTE1              => p_x_unit_threshold_tbl(i).ATTRIBUTE1,
3067             P_ATTRIBUTE2              => p_x_unit_threshold_tbl(i).ATTRIBUTE2,
3068             P_ATTRIBUTE3              => p_x_unit_threshold_tbl(i).ATTRIBUTE3,
3069             P_ATTRIBUTE4              => p_x_unit_threshold_tbl(i).ATTRIBUTE4,
3070             P_ATTRIBUTE5              => p_x_unit_threshold_tbl(i).ATTRIBUTE5,
3071             P_ATTRIBUTE6              => p_x_unit_threshold_tbl(i).ATTRIBUTE6,
3072             P_ATTRIBUTE7              => p_x_unit_threshold_tbl(i).ATTRIBUTE7,
3073             P_ATTRIBUTE8              => p_x_unit_threshold_tbl(i).ATTRIBUTE8,
3074             P_ATTRIBUTE9              => p_x_unit_threshold_tbl(i).ATTRIBUTE9,
3075             P_ATTRIBUTE10             => p_x_unit_threshold_tbl(i).ATTRIBUTE10,
3076             P_ATTRIBUTE11             => p_x_unit_threshold_tbl(i).ATTRIBUTE11,
3077             P_ATTRIBUTE12             => p_x_unit_threshold_tbl(i).ATTRIBUTE12,
3078             P_ATTRIBUTE13             => p_x_unit_threshold_tbl(i).ATTRIBUTE13,
3079             P_ATTRIBUTE14             => p_x_unit_threshold_tbl(i).ATTRIBUTE14,
3080             P_ATTRIBUTE15             => p_x_unit_threshold_tbl(i).ATTRIBUTE15,
3081             P_OBJECT_VERSION_NUMBER   => p_x_unit_threshold_tbl(i).OBJECT_VERSION_NUMBER,
3082             P_LAST_UPDATE_DATE        => TRUNC(sysdate),
3083             P_LAST_UPDATED_BY         => fnd_global.user_id,
3084             P_LAST_UPDATE_LOGIN       => fnd_global.login_id);
3085           ELSE
3086             FND_MESSAGE.Set_Name('AHL','AHL_UMP_THRSHLD_ID_INVALID');
3087             FND_MESSAGE.Set_Token('THRESHOLDID', p_x_unit_threshold_tbl(i).UNIT_THRESHOLD_ID);
3088             FND_MSG_PUB.ADD;
3089           END IF;
3090           CLOSE l_get_unit_threshold_csr;
3091       ELSIF (p_x_unit_threshold_tbl(i).OPERATION_FLAG = 'C') THEN
3092         -- insert threshold row
3093         -- Check if record exists in ahl_unit_deferral.
3094         OPEN l_get_def_csr(p_x_unit_threshold_tbl(i).UNIT_EFFECTIVITY_ID);
3095         FETCH l_get_def_csr INTO l_unit_deferral_id;
3096         IF (l_get_def_csr%FOUND) THEN
3097           OPEN l_get_dup_counter_csr(l_unit_deferral_id, p_x_unit_threshold_tbl(i).COUNTER_ID);
3098           FETCH l_get_dup_counter_csr INTO l_junk;
3099           IF (l_get_dup_counter_csr%FOUND) THEN
3100             FND_MESSAGE.Set_Name('AHL','AHL_UMP_DUPLICATE_COUNTER');
3101             FND_MESSAGE.Set_Token('COUNTERID', p_x_unit_threshold_tbl(i).COUNTER_ID);
3102             FND_MSG_PUB.ADD;
3103             CLOSE l_get_dup_counter_csr;
3104             RETURN;
3105           END IF;
3106           CLOSE l_get_dup_counter_csr;
3107         ELSE
3108           -- Create unit_deferral record.
3109           AHL_UNIT_DEFERRALS_PKG.insert_row(
3110             x_rowid => l_rowid,
3111             x_unit_deferral_id => l_unit_deferral_id,
3112             x_ata_sequence_id => null,
3113             x_object_version_number => 1,
3114             x_created_by => fnd_global.user_id,
3115             x_creation_date => sysdate,
3116             x_last_updated_by => fnd_global.user_id,
3117             x_last_update_date => sysdate,
3118             x_last_update_login => fnd_global.login_id,
3119             x_unit_effectivity_id => p_x_unit_threshold_tbl(i).unit_effectivity_id,
3120             x_unit_deferral_type => 'INIT-DUE',
3121             x_set_due_date => p_unit_Effectivity_rec.set_due_date,
3122             x_deferral_effective_on => null,
3123             x_approval_status_code => null,
3124             x_defer_reason_code => null,
3125             x_affect_due_calc_flag => 'Y',
3126             x_skip_mr_flag => null,
3127             x_remarks => null,
3128             x_approver_notes => null,
3129             x_user_deferral_type => null,
3130             x_attribute_category => null,
3131             x_attribute1 => null,
3132             x_attribute2 => null,
3133             x_attribute3 => null,
3134             x_attribute4 => null,
3135             x_attribute5 => null,
3136             x_attribute6 => null,
3137             x_attribute7 => null,
3138             x_attribute8 => null,
3139             x_attribute9 => null,
3140             x_attribute10 => null,
3141             x_attribute11 => null,
3142             x_attribute12 => null,
3143             x_attribute13 => null,
3144             x_attribute14 => null,
3145             x_attribute15 => null
3146             );
3147 
3148         END IF;
3149         CLOSE l_get_def_csr;
3150 
3151         p_x_unit_threshold_tbl(i).OBJECT_VERSION_NUMBER := 1;
3152         -- Handle G_MISS and null values
3153         IF p_x_unit_threshold_tbl(i).ATTRIBUTE_CATEGORY = FND_API.G_MISS_CHAR THEN
3154           p_x_unit_threshold_tbl(i).ATTRIBUTE_CATEGORY := null;
3155         END IF;
3156         IF p_x_unit_threshold_tbl(i).ATTRIBUTE1 = FND_API.G_MISS_CHAR THEN
3157           p_x_unit_threshold_tbl(i).ATTRIBUTE1 := null;
3158         END IF;
3159         IF p_x_unit_threshold_tbl(i).ATTRIBUTE2 = FND_API.G_MISS_CHAR THEN
3160           p_x_unit_threshold_tbl(i).ATTRIBUTE2 := null;
3161         END IF;
3162         IF p_x_unit_threshold_tbl(i).ATTRIBUTE3 = FND_API.G_MISS_CHAR THEN
3163           p_x_unit_threshold_tbl(i).ATTRIBUTE3 := null;
3164         END IF;
3165         IF p_x_unit_threshold_tbl(i).ATTRIBUTE4 = FND_API.G_MISS_CHAR THEN
3166           p_x_unit_threshold_tbl(i).ATTRIBUTE4 := null;
3167         END IF;
3168         IF p_x_unit_threshold_tbl(i).ATTRIBUTE5 = FND_API.G_MISS_CHAR THEN
3169           p_x_unit_threshold_tbl(i).ATTRIBUTE5 := null;
3170         END IF;
3171         IF p_x_unit_threshold_tbl(i).ATTRIBUTE6 = FND_API.G_MISS_CHAR THEN
3172           p_x_unit_threshold_tbl(i).ATTRIBUTE6 := null;
3173         END IF;
3174         IF p_x_unit_threshold_tbl(i).ATTRIBUTE7 = FND_API.G_MISS_CHAR THEN
3175           p_x_unit_threshold_tbl(i).ATTRIBUTE7 := null;
3176         END IF;
3177         IF p_x_unit_threshold_tbl(i).ATTRIBUTE8 = FND_API.G_MISS_CHAR THEN
3178           p_x_unit_threshold_tbl(i).ATTRIBUTE8 := null;
3179         END IF;
3180         IF p_x_unit_threshold_tbl(i).ATTRIBUTE9 = FND_API.G_MISS_CHAR THEN
3181           p_x_unit_threshold_tbl(i).ATTRIBUTE9 := null;
3182         END IF;
3183         IF p_x_unit_threshold_tbl(i).ATTRIBUTE10 = FND_API.G_MISS_CHAR THEN
3184           p_x_unit_threshold_tbl(i).ATTRIBUTE10 := null;
3185         END IF;
3186         IF p_x_unit_threshold_tbl(i).ATTRIBUTE11 = FND_API.G_MISS_CHAR THEN
3187           p_x_unit_threshold_tbl(i).ATTRIBUTE11 := null;
3188         END IF;
3189         IF p_x_unit_threshold_tbl(i).ATTRIBUTE12 = FND_API.G_MISS_CHAR THEN
3190           p_x_unit_threshold_tbl(i).ATTRIBUTE12 := null;
3191         END IF;
3192         IF p_x_unit_threshold_tbl(i).ATTRIBUTE13 = FND_API.G_MISS_CHAR THEN
3193           p_x_unit_threshold_tbl(i).ATTRIBUTE13 := null;
3194         END IF;
3195         IF p_x_unit_threshold_tbl(i).ATTRIBUTE14 = FND_API.G_MISS_CHAR THEN
3196           p_x_unit_threshold_tbl(i).ATTRIBUTE14 := null;
3197         END IF;
3198         IF p_x_unit_threshold_tbl(i).ATTRIBUTE15 = FND_API.G_MISS_CHAR THEN
3199           p_x_unit_threshold_tbl(i).ATTRIBUTE15 := null;
3200         END IF;
3201         -- Call table handler to insert
3202         AHL_UNIT_THRESHOLDS_PKG.insert_row (
3203           P_X_UNIT_THRESHOLD_ID     => p_x_unit_threshold_tbl(i).UNIT_THRESHOLD_ID,
3204           --P_UNIT_EFFECTIVITY_ID     => p_x_unit_threshold_tbl(i).UNIT_EFFECTIVITY_ID,
3205           P_UNIT_DEFERRAL_ID        => l_UNIT_DEFERRAL_ID,
3206           P_COUNTER_ID              => p_x_unit_threshold_tbl(i).COUNTER_ID,
3207           P_COUNTER_VALUE           => p_x_unit_threshold_tbl(i).COUNTER_VALUE,
3208           P_CTR_VALUE_TYPE_CODE     => 'DEFER_TO',
3209           P_ATTRIBUTE_CATEGORY      => p_x_unit_threshold_tbl(i).ATTRIBUTE_CATEGORY,
3210           P_ATTRIBUTE1              => p_x_unit_threshold_tbl(i).ATTRIBUTE1,
3211           P_ATTRIBUTE2              => p_x_unit_threshold_tbl(i).ATTRIBUTE2,
3212           P_ATTRIBUTE3              => p_x_unit_threshold_tbl(i).ATTRIBUTE3,
3213           P_ATTRIBUTE4              => p_x_unit_threshold_tbl(i).ATTRIBUTE4,
3214           P_ATTRIBUTE5              => p_x_unit_threshold_tbl(i).ATTRIBUTE5,
3215           P_ATTRIBUTE6              => p_x_unit_threshold_tbl(i).ATTRIBUTE6,
3216           P_ATTRIBUTE7              => p_x_unit_threshold_tbl(i).ATTRIBUTE7,
3217           P_ATTRIBUTE8              => p_x_unit_threshold_tbl(i).ATTRIBUTE8,
3218           P_ATTRIBUTE9              => p_x_unit_threshold_tbl(i).ATTRIBUTE9,
3219           P_ATTRIBUTE10             => p_x_unit_threshold_tbl(i).ATTRIBUTE10,
3220           P_ATTRIBUTE11             => p_x_unit_threshold_tbl(i).ATTRIBUTE11,
3221           P_ATTRIBUTE12             => p_x_unit_threshold_tbl(i).ATTRIBUTE12,
3222           P_ATTRIBUTE13             => p_x_unit_threshold_tbl(i).ATTRIBUTE13,
3223           P_ATTRIBUTE14             => p_x_unit_threshold_tbl(i).ATTRIBUTE14,
3224           P_ATTRIBUTE15             => p_x_unit_threshold_tbl(i).ATTRIBUTE15,
3225           P_OBJECT_VERSION_NUMBER   => p_x_unit_threshold_tbl(i).OBJECT_VERSION_NUMBER,
3226           P_LAST_UPDATE_DATE        => TRUNC(sysdate),
3227           P_LAST_UPDATED_BY         => fnd_global.user_id,
3228           P_CREATION_DATE           => TRUNC(sysdate),
3229           P_CREATED_BY              => fnd_global.user_id,
3230           P_LAST_UPDATE_LOGIN       => fnd_global.login_id);
3231       ELSE
3232         -- unrecognized operation flag
3233         FND_MESSAGE.Set_Name('AHL','AHL_UMP_OPERATION_INVALID');
3234         FND_MESSAGE.Set_Token('OPERATION', p_x_unit_threshold_tbl(i).OPERATION_FLAG);
3235         FND_MSG_PUB.ADD;
3236       END IF;
3237     END LOOP;
3238   END IF;
3239 END Update_Thresholds;
3240 
3241 ------------------------------------
3242 -- This procedure saves the accomplishments by calling
3243 -- the insert_row, update_row or delete_row methods
3244 -- of the Accomplishments table handler
3245 ------------------------------------
3246 PROCEDURE Update_Accomplishments(
3247    p_x_unit_accomplish_tbl IN OUT NOCOPY AHL_UMP_UNITMAINT_PVT.Unit_Accomplish_tbl_type,
3248    p_unit_Effectivity_rec  IN            AHL_UMP_UNITMAINT_PVT.Unit_Effectivity_rec_type) IS
3249 
3250   CURSOR l_get_unit_accomplish_csr(p_accomplish_id IN NUMBER) IS
3251     SELECT OBJECT_VERSION_NUMBER,
3252       UNIT_EFFECTIVITY_ID,
3253       COUNTER_ID,
3254       ATTRIBUTE_CATEGORY,
3255       ATTRIBUTE1,
3256       ATTRIBUTE2,
3257       ATTRIBUTE3,
3258       ATTRIBUTE4,
3259       ATTRIBUTE5,
3260       ATTRIBUTE6,
3261       ATTRIBUTE7,
3262       ATTRIBUTE8,
3263       ATTRIBUTE9,
3264       ATTRIBUTE10,
3265       ATTRIBUTE11,
3266       ATTRIBUTE12,
3267       ATTRIBUTE13,
3268       ATTRIBUTE14,
3269       ATTRIBUTE15
3270     FROM AHL_UNIT_ACCOMPLISHMNTS
3271     WHERE UNIT_ACCOMPLISHMNT_ID = p_accomplish_id
3272     FOR UPDATE OF OBJECT_VERSION_NUMBER;
3273 
3274   CURSOR l_get_dup_counter_csr(p_ue_id      IN NUMBER,
3275                                p_counter_id IN NUMBER) IS
3276     SELECT 'x'
3277     FROM AHL_UNIT_ACCOMPLISHMNTS
3278     WHERE UNIT_EFFECTIVITY_ID = p_ue_id AND
3279     COUNTER_ID = p_counter_id;
3280 
3281   l_accomplish_details  l_get_unit_accomplish_csr%ROWTYPE;
3282   l_junk                VARCHAR2(1);
3283 
3284   l_counter_reading_lock_rec  csi_ctr_datastructures_pub.ctr_reading_lock_rec;
3285   l_reading_lock_id           NUMBER;
3286   l_msg_count                 NUMBER;
3287   l_msg_data                  VARCHAR2(2000);
3288   l_return_status             VARCHAR2(1);
3289 
3290 BEGIN
3291   IF (p_x_unit_accomplish_tbl.COUNT > 0) THEN
3292     FOR i IN p_x_unit_accomplish_tbl.FIRST..p_x_unit_accomplish_tbl.LAST LOOP
3293       IF (p_x_unit_accomplish_tbl(i).OPERATION_FLAG = 'D') THEN
3294         -- delete row
3295         AHL_UNIT_ACCOMPLISH_PKG.delete_row(p_x_unit_accomplish_tbl(i).UNIT_ACCOMPLISH_ID);
3296       ELSIF (p_x_unit_accomplish_tbl(i).OPERATION_FLAG = 'M') THEN
3297         -- modify row
3298         OPEN l_get_unit_accomplish_csr(p_x_unit_accomplish_tbl(i).UNIT_ACCOMPLISH_ID);
3299         FETCH l_get_unit_accomplish_csr INTO l_accomplish_details;
3300         IF (l_get_unit_accomplish_csr%FOUND) THEN
3301           -- If object version no is different, write error message and skip to next unit effectivity
3302           IF(l_accomplish_details.OBJECT_VERSION_NUMBER <> p_x_unit_accomplish_tbl(i).OBJECT_VERSION_NUMBER) THEN
3303 --            FND_MESSAGE.Set_Name('AHL','AHL_UMP_ACCMPLSHMNT_CHANGED');
3304 --            FND_MESSAGE.Set_Token('COUNTER', p_x_unit_accomplish_tbl(i).COUNTER_NAME);
3305             FND_MESSAGE.Set_Name('AHL', 'AHL_COM_RECORD_CHANGED');
3306             FND_MSG_PUB.ADD;
3307             RETURN;
3308           END IF;
3309           p_x_unit_accomplish_tbl(i).OBJECT_VERSION_NUMBER := l_accomplish_details.OBJECT_VERSION_NUMBER + 1;
3310           -- Handle G_MISS and null values
3311           IF p_x_unit_accomplish_tbl(i).ATTRIBUTE_CATEGORY = FND_API.G_MISS_CHAR THEN
3312             p_x_unit_accomplish_tbl(i).ATTRIBUTE_CATEGORY := null;
3313           ELSIF p_x_unit_accomplish_tbl(i).ATTRIBUTE_CATEGORY IS null THEN
3314             p_x_unit_accomplish_tbl(i).ATTRIBUTE_CATEGORY := l_accomplish_details.ATTRIBUTE_CATEGORY;
3315           END IF;
3316           IF p_x_unit_accomplish_tbl(i).ATTRIBUTE1 = FND_API.G_MISS_CHAR THEN
3317             p_x_unit_accomplish_tbl(i).ATTRIBUTE1 := null;
3318           ELSIF p_x_unit_accomplish_tbl(i).ATTRIBUTE1 IS null THEN
3319             p_x_unit_accomplish_tbl(i).ATTRIBUTE1 := l_accomplish_details.ATTRIBUTE1;
3320           END IF;
3321           IF p_x_unit_accomplish_tbl(i).ATTRIBUTE2 = FND_API.G_MISS_CHAR THEN
3322             p_x_unit_accomplish_tbl(i).ATTRIBUTE2 := null;
3323           ELSIF p_x_unit_accomplish_tbl(i).ATTRIBUTE2 IS null THEN
3324             p_x_unit_accomplish_tbl(i).ATTRIBUTE2 := l_accomplish_details.ATTRIBUTE2;
3325           END IF;
3326           IF p_x_unit_accomplish_tbl(i).ATTRIBUTE3 = FND_API.G_MISS_CHAR THEN
3327             p_x_unit_accomplish_tbl(i).ATTRIBUTE3 := null;
3328           ELSIF p_x_unit_accomplish_tbl(i).ATTRIBUTE3 IS null THEN
3329             p_x_unit_accomplish_tbl(i).ATTRIBUTE3 := l_accomplish_details.ATTRIBUTE3;
3330           END IF;
3331           IF p_x_unit_accomplish_tbl(i).ATTRIBUTE4 = FND_API.G_MISS_CHAR THEN
3332             p_x_unit_accomplish_tbl(i).ATTRIBUTE4 := null;
3333           ELSIF p_x_unit_accomplish_tbl(i).ATTRIBUTE4 IS null THEN
3334             p_x_unit_accomplish_tbl(i).ATTRIBUTE4 := l_accomplish_details.ATTRIBUTE4;
3335           END IF;
3336           IF p_x_unit_accomplish_tbl(i).ATTRIBUTE5 = FND_API.G_MISS_CHAR THEN
3337             p_x_unit_accomplish_tbl(i).ATTRIBUTE5 := null;
3338           ELSIF p_x_unit_accomplish_tbl(i).ATTRIBUTE5 IS null THEN
3339             p_x_unit_accomplish_tbl(i).ATTRIBUTE5 := l_accomplish_details.ATTRIBUTE5;
3340           END IF;
3341           IF p_x_unit_accomplish_tbl(i).ATTRIBUTE6 = FND_API.G_MISS_CHAR THEN
3342             p_x_unit_accomplish_tbl(i).ATTRIBUTE6 := null;
3343           ELSIF p_x_unit_accomplish_tbl(i).ATTRIBUTE6 IS null THEN
3344             p_x_unit_accomplish_tbl(i).ATTRIBUTE6 := l_accomplish_details.ATTRIBUTE6;
3345           END IF;
3346           IF p_x_unit_accomplish_tbl(i).ATTRIBUTE7 = FND_API.G_MISS_CHAR THEN
3347             p_x_unit_accomplish_tbl(i).ATTRIBUTE7 := null;
3348           ELSIF p_x_unit_accomplish_tbl(i).ATTRIBUTE7 IS null THEN
3349             p_x_unit_accomplish_tbl(i).ATTRIBUTE7 := l_accomplish_details.ATTRIBUTE7;
3350           END IF;
3351           IF p_x_unit_accomplish_tbl(i).ATTRIBUTE8 = FND_API.G_MISS_CHAR THEN
3352             p_x_unit_accomplish_tbl(i).ATTRIBUTE8 := null;
3353           ELSIF p_x_unit_accomplish_tbl(i).ATTRIBUTE8 IS null THEN
3354             p_x_unit_accomplish_tbl(i).ATTRIBUTE8 := l_accomplish_details.ATTRIBUTE8;
3355           END IF;
3356           IF p_x_unit_accomplish_tbl(i).ATTRIBUTE9 = FND_API.G_MISS_CHAR THEN
3357             p_x_unit_accomplish_tbl(i).ATTRIBUTE9 := null;
3358           ELSIF p_x_unit_accomplish_tbl(i).ATTRIBUTE9 IS null THEN
3359             p_x_unit_accomplish_tbl(i).ATTRIBUTE9 := l_accomplish_details.ATTRIBUTE9;
3360           END IF;
3361           IF p_x_unit_accomplish_tbl(i).ATTRIBUTE10 = FND_API.G_MISS_CHAR THEN
3362             p_x_unit_accomplish_tbl(i).ATTRIBUTE10 := null;
3363           ELSIF p_x_unit_accomplish_tbl(i).ATTRIBUTE10 IS null THEN
3364             p_x_unit_accomplish_tbl(i).ATTRIBUTE10 := l_accomplish_details.ATTRIBUTE10;
3365           END IF;
3366           IF p_x_unit_accomplish_tbl(i).ATTRIBUTE11 = FND_API.G_MISS_CHAR THEN
3367             p_x_unit_accomplish_tbl(i).ATTRIBUTE11 := null;
3368           ELSIF p_x_unit_accomplish_tbl(i).ATTRIBUTE11 IS null THEN
3369             p_x_unit_accomplish_tbl(i).ATTRIBUTE11 := l_accomplish_details.ATTRIBUTE11;
3370           END IF;
3371           IF p_x_unit_accomplish_tbl(i).ATTRIBUTE12 = FND_API.G_MISS_CHAR THEN
3372             p_x_unit_accomplish_tbl(i).ATTRIBUTE12 := null;
3373           ELSIF p_x_unit_accomplish_tbl(i).ATTRIBUTE12 IS null THEN
3374             p_x_unit_accomplish_tbl(i).ATTRIBUTE12 := l_accomplish_details.ATTRIBUTE12;
3375           END IF;
3376           IF p_x_unit_accomplish_tbl(i).ATTRIBUTE13 = FND_API.G_MISS_CHAR THEN
3377             p_x_unit_accomplish_tbl(i).ATTRIBUTE13 := null;
3378           ELSIF p_x_unit_accomplish_tbl(i).ATTRIBUTE13 IS null THEN
3379             p_x_unit_accomplish_tbl(i).ATTRIBUTE13 := l_accomplish_details.ATTRIBUTE13;
3380           END IF;
3381           IF p_x_unit_accomplish_tbl(i).ATTRIBUTE14 = FND_API.G_MISS_CHAR THEN
3382             p_x_unit_accomplish_tbl(i).ATTRIBUTE14 := null;
3383           ELSIF p_x_unit_accomplish_tbl(i).ATTRIBUTE14 IS null THEN
3384             p_x_unit_accomplish_tbl(i).ATTRIBUTE14 := l_accomplish_details.ATTRIBUTE14;
3385           END IF;
3386           IF p_x_unit_accomplish_tbl(i).ATTRIBUTE15 = FND_API.G_MISS_CHAR THEN
3387             p_x_unit_accomplish_tbl(i).ATTRIBUTE15 := null;
3388           ELSIF p_x_unit_accomplish_tbl(i).ATTRIBUTE15 IS null THEN
3389             p_x_unit_accomplish_tbl(i).ATTRIBUTE15 := l_accomplish_details.ATTRIBUTE15;
3390           END IF;
3391 
3392           -- Call table handler to update
3393           AHL_UNIT_ACCOMPLISH_PKG.update_row (
3394             P_UNIT_ACCOMPLISHMNT_ID   => p_x_unit_accomplish_tbl(i).UNIT_ACCOMPLISH_ID,
3395             P_UNIT_EFFECTIVITY_ID     => p_x_unit_accomplish_tbl(i).UNIT_EFFECTIVITY_ID,
3396             P_COUNTER_ID              => p_x_unit_accomplish_tbl(i).COUNTER_ID,
3397             P_COUNTER_VALUE           => p_x_unit_accomplish_tbl(i).COUNTER_VALUE,
3398             P_ATTRIBUTE_CATEGORY      => p_x_unit_accomplish_tbl(i).ATTRIBUTE_CATEGORY,
3399             P_ATTRIBUTE1              => p_x_unit_accomplish_tbl(i).ATTRIBUTE1,
3400             P_ATTRIBUTE2              => p_x_unit_accomplish_tbl(i).ATTRIBUTE2,
3401             P_ATTRIBUTE3              => p_x_unit_accomplish_tbl(i).ATTRIBUTE3,
3402             P_ATTRIBUTE4              => p_x_unit_accomplish_tbl(i).ATTRIBUTE4,
3403             P_ATTRIBUTE5              => p_x_unit_accomplish_tbl(i).ATTRIBUTE5,
3404             P_ATTRIBUTE6              => p_x_unit_accomplish_tbl(i).ATTRIBUTE6,
3405             P_ATTRIBUTE7              => p_x_unit_accomplish_tbl(i).ATTRIBUTE7,
3406             P_ATTRIBUTE8              => p_x_unit_accomplish_tbl(i).ATTRIBUTE8,
3407             P_ATTRIBUTE9              => p_x_unit_accomplish_tbl(i).ATTRIBUTE9,
3408             P_ATTRIBUTE10             => p_x_unit_accomplish_tbl(i).ATTRIBUTE10,
3409             P_ATTRIBUTE11             => p_x_unit_accomplish_tbl(i).ATTRIBUTE11,
3410             P_ATTRIBUTE12             => p_x_unit_accomplish_tbl(i).ATTRIBUTE12,
3411             P_ATTRIBUTE13             => p_x_unit_accomplish_tbl(i).ATTRIBUTE13,
3412             P_ATTRIBUTE14             => p_x_unit_accomplish_tbl(i).ATTRIBUTE14,
3413             P_ATTRIBUTE15             => p_x_unit_accomplish_tbl(i).ATTRIBUTE15,
3414             P_OBJECT_VERSION_NUMBER   => p_x_unit_accomplish_tbl(i).OBJECT_VERSION_NUMBER,
3415             P_LAST_UPDATE_DATE        => TRUNC(sysdate),
3416             P_LAST_UPDATED_BY         => fnd_global.user_id,
3417             P_LAST_UPDATE_LOGIN       => fnd_global.login_id);
3418           ELSE
3419             FND_MESSAGE.Set_Name('AHL','AHL_UMP_ACCMPLSH_ID_INVALID');
3420             FND_MESSAGE.Set_Token('ACCOMPLISHMENTID', p_x_unit_accomplish_tbl(i).UNIT_ACCOMPLISH_ID);
3421             FND_MSG_PUB.ADD;
3422           END IF;
3423           CLOSE l_get_unit_accomplish_csr;
3424       ELSIF (p_x_unit_accomplish_tbl(i).OPERATION_FLAG = 'C') THEN
3425         -- insert row
3426         OPEN l_get_dup_counter_csr(p_x_unit_accomplish_tbl(i).UNIT_EFFECTIVITY_ID, p_x_unit_accomplish_tbl(i).COUNTER_ID);
3427         FETCH l_get_dup_counter_csr INTO l_junk;
3428         IF (l_get_dup_counter_csr%FOUND) THEN
3429           FND_MESSAGE.Set_Name('AHL','AHL_UMP_DUPLICATE_COUNTER');
3430           FND_MESSAGE.Set_Token('COUNTERID', p_x_unit_accomplish_tbl(i).COUNTER_ID);
3431           FND_MSG_PUB.ADD;
3432           CLOSE l_get_dup_counter_csr;
3433           RETURN;
3434         END IF;
3435         CLOSE l_get_dup_counter_csr;
3436         p_x_unit_accomplish_tbl(i).OBJECT_VERSION_NUMBER := 1;
3437         -- Handle G_MISS and null values
3438         IF p_x_unit_accomplish_tbl(i).ATTRIBUTE_CATEGORY = FND_API.G_MISS_CHAR THEN
3439           p_x_unit_accomplish_tbl(i).ATTRIBUTE_CATEGORY := null;
3440         END IF;
3441         IF p_x_unit_accomplish_tbl(i).ATTRIBUTE1 = FND_API.G_MISS_CHAR THEN
3442           p_x_unit_accomplish_tbl(i).ATTRIBUTE1 := null;
3443         END IF;
3444         IF p_x_unit_accomplish_tbl(i).ATTRIBUTE2 = FND_API.G_MISS_CHAR THEN
3445           p_x_unit_accomplish_tbl(i).ATTRIBUTE2 := null;
3446         END IF;
3447         IF p_x_unit_accomplish_tbl(i).ATTRIBUTE3 = FND_API.G_MISS_CHAR THEN
3448           p_x_unit_accomplish_tbl(i).ATTRIBUTE3 := null;
3449         END IF;
3450         IF p_x_unit_accomplish_tbl(i).ATTRIBUTE4 = FND_API.G_MISS_CHAR THEN
3451           p_x_unit_accomplish_tbl(i).ATTRIBUTE4 := null;
3452         END IF;
3453         IF p_x_unit_accomplish_tbl(i).ATTRIBUTE5 = FND_API.G_MISS_CHAR THEN
3454           p_x_unit_accomplish_tbl(i).ATTRIBUTE5 := null;
3455         END IF;
3456         IF p_x_unit_accomplish_tbl(i).ATTRIBUTE6 = FND_API.G_MISS_CHAR THEN
3457           p_x_unit_accomplish_tbl(i).ATTRIBUTE6 := null;
3458         END IF;
3459         IF p_x_unit_accomplish_tbl(i).ATTRIBUTE7 = FND_API.G_MISS_CHAR THEN
3460           p_x_unit_accomplish_tbl(i).ATTRIBUTE7 := null;
3461         END IF;
3462         IF p_x_unit_accomplish_tbl(i).ATTRIBUTE8 = FND_API.G_MISS_CHAR THEN
3463           p_x_unit_accomplish_tbl(i).ATTRIBUTE8 := null;
3464         END IF;
3465         IF p_x_unit_accomplish_tbl(i).ATTRIBUTE9 = FND_API.G_MISS_CHAR THEN
3466           p_x_unit_accomplish_tbl(i).ATTRIBUTE9 := null;
3467         END IF;
3468         IF p_x_unit_accomplish_tbl(i).ATTRIBUTE10 = FND_API.G_MISS_CHAR THEN
3469           p_x_unit_accomplish_tbl(i).ATTRIBUTE10 := null;
3470         END IF;
3471         IF p_x_unit_accomplish_tbl(i).ATTRIBUTE11 = FND_API.G_MISS_CHAR THEN
3472           p_x_unit_accomplish_tbl(i).ATTRIBUTE11 := null;
3473         END IF;
3474         IF p_x_unit_accomplish_tbl(i).ATTRIBUTE12 = FND_API.G_MISS_CHAR THEN
3475           p_x_unit_accomplish_tbl(i).ATTRIBUTE12 := null;
3476         END IF;
3477         IF p_x_unit_accomplish_tbl(i).ATTRIBUTE13 = FND_API.G_MISS_CHAR THEN
3478           p_x_unit_accomplish_tbl(i).ATTRIBUTE13 := null;
3479         END IF;
3480         IF p_x_unit_accomplish_tbl(i).ATTRIBUTE14 = FND_API.G_MISS_CHAR THEN
3481           p_x_unit_accomplish_tbl(i).ATTRIBUTE14 := null;
3482         END IF;
3483         IF p_x_unit_accomplish_tbl(i).ATTRIBUTE15 = FND_API.G_MISS_CHAR THEN
3484           p_x_unit_accomplish_tbl(i).ATTRIBUTE15 := null;
3485         END IF;
3486         -- Call table handler to insert
3487         AHL_UNIT_ACCOMPLISH_PKG.insert_row (
3488           P_X_UNIT_ACCOMPLISHMNT_ID => p_x_unit_accomplish_tbl(i).UNIT_ACCOMPLISH_ID,
3489           P_UNIT_EFFECTIVITY_ID     => p_x_unit_accomplish_tbl(i).UNIT_EFFECTIVITY_ID,
3490           P_COUNTER_ID              => p_x_unit_accomplish_tbl(i).COUNTER_ID,
3491           P_COUNTER_VALUE           => p_x_unit_accomplish_tbl(i).COUNTER_VALUE,
3492           P_ATTRIBUTE_CATEGORY      => p_x_unit_accomplish_tbl(i).ATTRIBUTE_CATEGORY,
3493           P_ATTRIBUTE1              => p_x_unit_accomplish_tbl(i).ATTRIBUTE1,
3494           P_ATTRIBUTE2              => p_x_unit_accomplish_tbl(i).ATTRIBUTE2,
3495           P_ATTRIBUTE3              => p_x_unit_accomplish_tbl(i).ATTRIBUTE3,
3496           P_ATTRIBUTE4              => p_x_unit_accomplish_tbl(i).ATTRIBUTE4,
3497           P_ATTRIBUTE5              => p_x_unit_accomplish_tbl(i).ATTRIBUTE5,
3498           P_ATTRIBUTE6              => p_x_unit_accomplish_tbl(i).ATTRIBUTE6,
3499           P_ATTRIBUTE7              => p_x_unit_accomplish_tbl(i).ATTRIBUTE7,
3500           P_ATTRIBUTE8              => p_x_unit_accomplish_tbl(i).ATTRIBUTE8,
3501           P_ATTRIBUTE9              => p_x_unit_accomplish_tbl(i).ATTRIBUTE9,
3502           P_ATTRIBUTE10             => p_x_unit_accomplish_tbl(i).ATTRIBUTE10,
3503           P_ATTRIBUTE11             => p_x_unit_accomplish_tbl(i).ATTRIBUTE11,
3504           P_ATTRIBUTE12             => p_x_unit_accomplish_tbl(i).ATTRIBUTE12,
3505           P_ATTRIBUTE13             => p_x_unit_accomplish_tbl(i).ATTRIBUTE13,
3506           P_ATTRIBUTE14             => p_x_unit_accomplish_tbl(i).ATTRIBUTE14,
3507           P_ATTRIBUTE15             => p_x_unit_accomplish_tbl(i).ATTRIBUTE15,
3508           P_OBJECT_VERSION_NUMBER   => p_x_unit_accomplish_tbl(i).OBJECT_VERSION_NUMBER,
3509           P_LAST_UPDATE_DATE        => TRUNC(sysdate),
3510           P_LAST_UPDATED_BY         => fnd_global.user_id,
3511           P_CREATION_DATE           => TRUNC(sysdate),
3512           P_CREATED_BY              => fnd_global.user_id,
3513           P_LAST_UPDATE_LOGIN       => fnd_global.login_id);
3514 
3515           /* Commented out call for locking counter reading for bug# 6388834.
3516            * User can adjust counter readings/record for prior dated counter
3517            * readings after MR signoff.
3518           -- lock counter reading if UMP being accomplished.
3519           IF (p_unit_Effectivity_rec.status_code = 'ACCOMPLISHED' OR
3520               p_unit_Effectivity_rec.status_code = 'TERMINATED') THEN
3521                l_counter_reading_lock_rec.reading_lock_date := p_unit_Effectivity_rec.accomplished_date;
3522                l_counter_reading_lock_rec.counter_id := p_x_unit_accomplish_tbl(i).COUNTER_ID;
3523                l_counter_reading_lock_rec.source_line_ref_id := p_x_unit_accomplish_tbl(i).UNIT_ACCOMPLISH_ID;
3524                l_counter_reading_lock_rec.source_line_ref := 'MAINTENANCE_ACCOMPLISHMENT';
3525 
3526                CSI_COUNTER_PUB.Create_Reading_Lock
3527                (
3528                     p_api_version          => 1.0,
3529                     p_commit               => FND_API.G_FALSE,
3530                     p_init_msg_list        => FND_API.G_FALSE,
3531                     p_validation_level     => FND_API.G_VALID_LEVEL_FULL,
3532                     p_ctr_reading_lock_rec => l_counter_reading_lock_rec,
3533                     x_return_status       => l_return_status,
3534                     x_msg_count           => l_msg_count,
3535                     x_msg_data            => l_msg_data,
3536                     x_reading_lock_id     => l_reading_lock_id
3537                );
3538 
3539                -- Raise errors if exception occurs
3540                IF (l_return_status = FND_API.G_RET_STS_UNEXP_ERROR) THEN
3541                    RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3542                ELSIF (l_return_status = FND_API.G_RET_STS_ERROR) THEN
3543                    RAISE FND_API.G_EXC_ERROR;
3544                END IF;
3545 
3546           END IF;
3547           */
3548       ELSE
3549         -- unrecognized operation flag
3550         FND_MESSAGE.Set_Name('AHL','AHL_UMP_OPERATION_INVALID');
3551         FND_MESSAGE.Set_Token('OPERATION', p_x_unit_accomplish_tbl(i).OPERATION_FLAG);
3552         FND_MSG_PUB.ADD;
3553       END IF;
3554     END LOOP;
3555   END IF;
3556 END Update_Accomplishments;
3557 
3558 ------------------------------------
3559 -- This procedure transfers data to the master
3560 -- table from the sub list
3561 ------------------------------------
3562 PROCEDURE Restore_Thresholds(
3563    p_x_unit_threshold_tbl   IN OUT NOCOPY AHL_UMP_UNITMAINT_PVT.Unit_Threshold_tbl_type,
3564    p_unit_threshold_tbl     IN     AHL_UMP_UNITMAINT_PVT.Unit_Threshold_tbl_type) IS
3565    l_index         NUMBER;
3566    l_curr_ue_id    NUMBER;
3567 BEGIN
3568   IF (p_unit_threshold_tbl.COUNT > 0) THEN
3569     l_index := p_unit_threshold_tbl.FIRST;
3570     l_curr_ue_id := p_unit_threshold_tbl(l_index).UNIT_EFFECTIVITY_ID;
3571     FOR i IN p_x_unit_threshold_tbl.FIRST..p_x_unit_threshold_tbl.LAST LOOP
3572       IF (p_x_unit_threshold_tbl(i).UNIT_EFFECTIVITY_ID = l_curr_ue_id) THEN
3573         p_x_unit_threshold_tbl(i) := p_unit_threshold_tbl(l_index);
3574         l_index := l_index + 1;
3575       END IF;
3576     END LOOP;
3577   END IF;
3578 END Restore_Thresholds;
3579 
3580 ------------------------------------
3581 -- This procedure transfers data to the master
3582 -- table from the sub list
3583 ------------------------------------
3584 PROCEDURE Restore_Accomplishments(
3585    p_x_unit_accomplish_tbl   IN OUT NOCOPY AHL_UMP_UNITMAINT_PVT.Unit_Accomplish_tbl_type,
3586    p_unit_accomplish_tbl     IN     AHL_UMP_UNITMAINT_PVT.Unit_Accomplish_tbl_type) IS
3587    l_index         NUMBER;
3588    l_curr_ue_id    NUMBER;
3589 BEGIN
3590   IF (p_unit_accomplish_tbl.COUNT > 0) THEN
3591     l_index := p_unit_accomplish_tbl.FIRST;
3592     l_curr_ue_id := p_unit_accomplish_tbl(l_index).UNIT_EFFECTIVITY_ID;
3593     FOR i IN p_x_unit_accomplish_tbl.FIRST..p_x_unit_accomplish_tbl.LAST LOOP
3594       IF (p_x_unit_accomplish_tbl(i).UNIT_EFFECTIVITY_ID = l_curr_ue_id) THEN
3595         p_x_unit_accomplish_tbl(i) := p_unit_accomplish_tbl(l_index);
3596         l_index := l_index + 1;
3597       END IF;
3598     END LOOP;
3599   END IF;
3600 END Restore_Accomplishments;
3601 
3602 ------------------------------------
3603 -- This procedure checks if all required counters are available for a given UE.
3604 -- Uses FMP API in the process
3605 ------------------------------------
3606 PROCEDURE Match_Counters_with_FMP(
3607    p_unit_effectivity_id IN  NUMBER,
3608    p_item_instance_id    IN  NUMBER,
3609    p_mr_header_id        IN  NUMBER,
3610    x_counters            OUT NOCOPY VARCHAR2,
3611    x_return_status       OUT NOCOPY VARCHAR2) IS
3612 
3613    l_temp_counter_name  VARCHAR2(30);
3614    l_temp_sql_str       VARCHAR2(4000);
3615    l_fmp_eff            VARCHAR2(3000);
3616    l_fmp_sql            VARCHAR2(3500);
3617    l_inst_sql           VARCHAR2(250);
3618    l_acc_sql            VARCHAR2(250);
3619    l_counters_csr       CounterCurTyp;
3620    l_effectivities_tbl  AHL_FMP_PVT.APPLICABLE_MR_TBL_TYPE;
3621    l_return_status      VARCHAR2(1);
3622    l_msg_count          NUMBER;
3623    l_msg_data           VARCHAR2(30);
3624    l_counters_msg       VARCHAR2(1000);
3625 
3626    CURSOR get_unmatched_counter(p_mr_effectivity_id IN NUMBER,
3627                                    p_instance_id IN NUMBER,
3628                                    p_unit_effectivity_id IN NUMBER)
3629       IS
3630       -- Fix for bug# 6956784. Replace CS_COUNTERS with csi_counter_template_vl.
3631       -- select distinct name counter_name from cs_counters co, ahl_mr_intervals mr
3632       select distinct name counter_name from csi_counter_template_vl co, ahl_mr_intervals mr
3633       where co.counter_id = mr.counter_id
3634       and mr.mr_effectivity_id = p_mr_effectivity_id
3635       intersect
3636       /* Fix for bug# 6956784. Replace CS_COUNTERS with CSI_COUNTERS_VL.
3637        * Use COUNTER_TEMPLATE_NAME for counter name
3638        * Uptake R12 Counters Changes.
3639       SELECT c.name
3640            FROM CS_COUNTERS C, CS_COUNTER_GROUPS CTRGRP, CSI_ITEM_INSTANCES CII--, MTL_SYSTEM_ITEMS_KFV MSITEM
3641            WHERE C.COUNTER_GROUP_ID = CTRGRP.COUNTER_GROUP_ID
3642            AND CTRGRP.SOURCE_OBJECT_CODE = 'CP'
3643            AND CTRGRP.SOURCE_OBJECT_ID = CII.INSTANCE_ID
3644            --AND MSITEM.INVENTORY_ITEM_ID = CII.INVENTORY_ITEM_ID
3645            --AND MSITEM.ORGANIZATION_ID = CII.INV_MASTER_ORGANIZATION_ID
3646            AND CII.INSTANCE_ID = p_instance_id
3647       */
3648       SELECT cc.COUNTER_TEMPLATE_NAME counter_name
3649            FROM csi_counters_vl cc,
3650            csi_counter_associations cca --, CSI_ITEM_INSTANCES CII
3651            WHERE cc.counter_id = cca.counter_id
3652              and cca.source_object_code = 'CP'
3653              and cca.source_object_id   = p_instance_id
3654       MINUS
3655       --SELECT c.name counter_name
3656       SELECt c.COUNTER_TEMPLATE_NAME counter_name
3657            --FROM CS_COUNTERS C, ahl_unit_accomplishmnts ua
3658            FROM csi_counters_vl C, ahl_unit_accomplishmnts ua
3659            WHERE c.COUNTER_ID = UA.COUNTER_ID
3660         AND UA.unit_effectivity_id = p_unit_effectivity_id;
3661 
3662 BEGIN
3663   IF G_DEBUG='Y'  THEN
3664     AHL_DEBUG_PUB.debug('Entering Match_Counters_with_FMP', 'UMP');
3665     AHL_DEBUG_PUB.debug('Input CSI:MR:' || p_item_instance_id || ':' || p_mr_header_id, 'UMP');
3666     AHL_DEBUG_PUB.debug('p_unit_effectivity_id:' || p_unit_effectivity_id, 'UMP');
3667   END IF;
3668   -- Initialize API return status to success
3669   x_return_status := FND_API.G_RET_STS_SUCCESS;
3670 
3671   -- Call FMP API to get the list of effectivities for this MR_ID and item_instance_id
3672   AHL_FMP_PVT.GET_APPLICABLE_MRS(
3673     p_api_version         => 1.0,
3674     p_init_msg_list       => FND_API.G_FALSE,
3675     p_commit              => FND_API.G_FALSE,
3676     p_validation_level    => FND_API.G_VALID_LEVEL_FULL,
3677     x_return_status       => l_return_status,
3678     x_msg_count           => l_msg_count,
3679     x_msg_data            => l_msg_data,
3680     p_item_instance_id    => p_item_instance_id,
3681     p_mr_header_id        => p_mr_header_id,
3682     p_components_flag     => 'N',
3683     x_applicable_mr_tbl   => l_effectivities_tbl
3684   );
3685 
3686   -- Raise errors if exceptions occur
3687   IF (l_return_status = FND_API.G_RET_STS_ERROR) THEN
3688     RAISE FND_API.G_EXC_ERROR;
3689   ELSIF (l_return_status = FND_API.G_RET_STS_UNEXP_ERROR) THEN
3690     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3691   END IF;
3692 
3693   -- fix for bug number 6761311
3694 
3695   /*IF (l_effectivities_tbl.COUNT = 0) THEN
3696     RETURN;
3697   ELSE
3698     l_fmp_eff := '(';
3699     FOR i IN l_effectivities_tbl.FIRST..l_effectivities_tbl.LAST LOOP
3700       l_fmp_eff := l_fmp_eff || l_effectivities_tbl(i).MR_EFFECTIVITY_ID || ',';
3701     END LOOP;
3702     l_fmp_eff := rtrim(l_fmp_eff, ',') || ')';
3703     IF G_DEBUG='Y'  THEN
3704       AHL_DEBUG_PUB.debug('Match_Counters_with_FMP: Effectivities list from FMP: ' || l_fmp_eff, 'UMP');
3705     END IF;
3706   END IF;
3707 
3708   -- Counters for the given MR
3709   -- Modified from cs_counters_v to csi_counter_template_vl for R12 bug# 6080133.
3710   --l_fmp_sql := ' select distinct name counter_name from cs_counters_v co, ahl_mr_intervals mr';
3711   l_fmp_sql := ' select distinct name counter_name from csi_counter_template_vl co, ahl_mr_intervals mr';
3712   l_fmp_sql := l_fmp_sql || ' where co.counter_id = mr.counter_id and';
3713   l_fmp_sql := l_fmp_sql || ' mr.mr_effectivity_id in ' || l_fmp_eff;
3714 
3715   -- Counters for the given item instance
3716   --l_inst_sql := ' select distinct counter_name from csi_cp_counters_v';
3717   l_inst_sql := ' select distinct counter_template_name counter_name from csi_counters_vl cc, csi_counter_associations cca ';
3718   l_inst_sql := l_inst_sql || ' where cc.counter_id = cca.counter_id and cca.source_object_code = ''CP'' and cca.source_object_id = :1';
3719 
3720   -- Counters for the Accomplishment
3721   --l_acc_sql := ' select distinct counter_name from csi_cp_counters_v co, ahl_unit_accomplishmnts ua';
3722   l_acc_sql := ' select distinct counter_template_name counter_name from csi_counters_vl cc, ahl_unit_accomplishmnts ua';
3723   l_acc_sql := l_acc_sql || ' where ua.unit_effectivity_id = :2';
3724   l_acc_sql := l_acc_sql || ' and ua.counter_id = cc.counter_id';
3725   l_acc_sql := l_acc_sql || ' order by counter_name ';
3726 
3727   l_temp_sql_str := l_fmp_sql || ' INTERSECT ' || l_inst_sql || ' MINUS ' || l_acc_sql;
3728   IF G_DEBUG='Y'  THEN
3729     AHL_DEBUG_PUB.debug('Match_Counters_with_FMP: Final SQL: ' || l_temp_sql_str, 'UMP');
3730 
3731   END IF;
3732   OPEN l_counters_csr for l_temp_sql_str USING p_item_instance_id, p_unit_effectivity_id;
3733   l_counters_msg := '';
3734   LOOP
3735     FETCH l_counters_csr INTO l_temp_counter_name;
3736     EXIT WHEN l_counters_csr%NOTFOUND;
3737     l_counters_msg := l_counters_msg || l_temp_counter_name || ', ';
3738     x_return_status := FND_API.G_RET_STS_ERROR;
3739   END LOOP;
3740   CLOSE l_counters_csr;
3741   l_counters_msg := rtrim(l_counters_msg);
3742   l_counters_msg := rtrim(l_counters_msg, ',');
3743   x_counters := l_counters_msg;*/
3744 
3745   IF G_DEBUG='Y'  THEN
3746     AHL_DEBUG_PUB.debug('Count of l_effectivities_tbl:' || l_effectivities_tbl.count , 'UMP');
3747   END IF;
3748 
3749   IF (l_effectivities_tbl.COUNT = 0) THEN
3750       RETURN;
3751     ELSE
3752       l_counters_msg := '';
3753       FOR i IN l_effectivities_tbl.FIRST..l_effectivities_tbl.LAST LOOP
3754         FOR counter_name_rec IN get_unmatched_counter(l_effectivities_tbl(i).MR_EFFECTIVITY_ID
3755                         ,p_item_instance_id,p_unit_effectivity_id) LOOP
3756             l_counters_msg := l_counters_msg || counter_name_rec.counter_name || ', ';
3757             x_return_status := FND_API.G_RET_STS_ERROR;
3758         END LOOP;
3759       END LOOP;
3760   END IF;
3761   l_counters_msg := rtrim(l_counters_msg);
3762   l_counters_msg := rtrim(l_counters_msg, ',');
3763   x_counters := l_counters_msg;
3764 
3765   IF G_DEBUG='Y'  THEN
3766     AHL_DEBUG_PUB.debug('x_counters:' || x_counters, 'UMP');
3767     AHL_DEBUG_PUB.debug('Exiting Match_Counters_with_FMP', 'UMP');
3768 
3769   END IF;
3770 END Match_Counters_with_FMP;
3771 
3772 ------------------------------------
3773 
3774 
3775 
3776 ------------------------
3777 -- Define  Procedures --
3778 ------------------------
3779 PROCEDURE Terminate_MR_Instances (
3780     p_api_version         IN            NUMBER    := 1.0,
3781     p_init_msg_list       IN            VARCHAR2  := FND_API.G_FALSE,
3782     p_commit              IN            VARCHAR2  := FND_API.G_FALSE,
3783     p_validation_level    IN            NUMBER    := FND_API.G_VALID_LEVEL_FULL,
3784     p_default             IN            VARCHAR2  := FND_API.G_TRUE,
3785     p_module_type         IN            VARCHAR2  := NULL,
3786     p_old_mr_header_id    IN            NUMBER,
3787     p_old_mr_title        IN            VARCHAR2,
3788     p_old_version_number  IN            NUMBER,
3789     p_new_mr_header_id    IN            NUMBER    := NULL,
3790     p_new_mr_title        IN            VARCHAR2  := NULL,
3791     p_new_version_number  IN            NUMBER    := NULL,
3792     x_return_status       OUT  NOCOPY   VARCHAR2,
3793     x_msg_count           OUT  NOCOPY   NUMBER,
3794     x_msg_data            OUT  NOCOPY   VARCHAR2 ) IS
3795 
3796 
3797    l_api_version            CONSTANT NUMBER := 1.0;
3798    l_api_name               CONSTANT VARCHAR2(30) := 'Terminate_MR_Instances';
3799    l_new_mr_header_id       NUMBER;
3800    l_old_mr_header_id       NUMBER;
3801    l_effective_to_date      DATE;
3802    l_effective_from_date    DATE;
3803    l_visit_status           VARCHAR2(30);
3804 
3805    l_return_status          VARCHAR2(1);
3806    l_msg_count              NUMBER;
3807    l_msg_data               VARCHAR2(30);
3808    --l_old_mr_item_instance_tbl       AHL_FMP_PVT.MR_ITEM_INSTANCE_TBL_TYPE;
3809    l_new_mr_item_instance_tbl       AHL_FMP_PVT.MR_ITEM_INSTANCE_TBL_TYPE;
3810 
3811 
3812 
3813 
3814   CURSOR l_get_mr_header_id(p_mr_title IN VARCHAR2, p_version_number IN NUMBER) IS
3815          SELECT MR_HEADER_ID  FROM AHL_MR_HEADERS_B
3816          WHERE TITLE = p_mr_title AND VERSION_NUMBER = p_version_number;
3817 
3818   CURSOR l_get_effective_to_date(p_mr_header_id IN NUMBER) IS
3819      SELECT EFFECTIVE_TO, application_usg_code FROM AHL_MR_HEADERS_VL WHERE MR_HEADER_ID = p_mr_header_id;
3820 
3821   CURSOR l_get_effective_from_date(p_mr_header_id IN NUMBER) IS
3822      SELECT EFFECTIVE_FROM FROM AHL_MR_HEADERS_VL WHERE MR_HEADER_ID = p_mr_header_id;
3823 
3824   CURSOR l_unit_effectivity_csr(p_header_id IN NUMBER) IS SELECT
3825                       EFF.UNIT_EFFECTIVITY_ID,
3826                       EFF.CSI_ITEM_INSTANCE_ID,
3827                       EFF.MR_INTERVAL_ID     ,
3828                       EFF.MR_EFFECTIVITY_ID  ,
3829                       EFF.MR_HEADER_ID       ,
3830                       EFF.STATUS_CODE        ,
3831                       EFF.DUE_DATE           ,
3832                       EFF.DUE_COUNTER_VALUE  ,
3833                       EFF.FORECAST_SEQUENCE  ,
3834                       EFF.REPETITIVE_MR_FLAG,
3835                       EFF.TOLERANCE_FLAG    ,
3836                       EFF.REMARKS           ,
3837                       EFF.MESSAGE_CODE      ,
3838                       EFF.PRECEDING_UE_ID    ,
3839                       EFF.DATE_RUN,
3840                       EFF.SET_DUE_DATE,
3841                       EFF.ACCOMPLISHED_DATE,
3842                       EFF.SERVICE_LINE_ID,
3843                       EFF.PROGRAM_MR_HEADER_ID,
3844                       EFF.CANCEL_REASON_CODE,
3845                       EFF.EARLIEST_DUE_DATE,
3846                       EFF.LATEST_DUE_DATE,
3847                       EFF.DEFER_FROM_UE_ID,
3848                       EFF.CS_INCIDENT_ID,
3849                       EFF.QA_COLLECTION_ID,
3850                       EFF.ORIG_DEFERRAL_UE_ID,
3851                       EFF.APPLICATION_USG_CODE,
3852                       EFF.OBJECT_TYPE,
3853                       EFF.COUNTER_ID,
3854                       EFF.MANUALLY_PLANNED_FLAG,
3855                       EFF.LOG_SERIES_CODE,
3856                       EFF.LOG_SERIES_NUMBER,
3857                       EFF.FLIGHT_NUMBER,
3858                       EFF.MEL_CDL_TYPE_CODE,
3859                       EFF.POSITION_PATH_ID,
3860                       EFF.ATA_CODE,
3861                       EFF.UNIT_CONFIG_HEADER_ID,
3862                       EFF.ATTRIBUTE_CATEGORY,
3863                       EFF.ATTRIBUTE1,
3864                       EFF.ATTRIBUTE2,
3865                       EFF.ATTRIBUTE3,
3866                       EFF.ATTRIBUTE4,
3867                       EFF.ATTRIBUTE5,
3868                       EFF.ATTRIBUTE6,
3869                       EFF.ATTRIBUTE7,
3870                       EFF.ATTRIBUTE8,
3871                       EFF.ATTRIBUTE9,
3872                       EFF.ATTRIBUTE10,
3873                       EFF.ATTRIBUTE11,
3874                       EFF.ATTRIBUTE12,
3875                       EFF.ATTRIBUTE13,
3876                       EFF.ATTRIBUTE14,
3877                       EFF.ATTRIBUTE15,
3878                       EFF.OBJECT_VERSION_NUMBER,
3879                       EFF.LAST_UPDATE_DATE,
3880                       EFF.LAST_UPDATED_BY    ,
3881                       EFF.LAST_UPDATE_LOGIN
3882     FROM  AHL_UNIT_EFFECTIVITIES_APP_V EFF
3883       WHERE EFF.MR_HEADER_ID = p_header_id
3884         AND object_type = 'MR'
3885      -- AND (EFF.status_code is null or EFF.status_code in ('INIT-DUE','DEFERRED'))
3886         AND (EFF.status_code is null or EFF.status_code = 'INIT-DUE')
3887         AND not exists (select 'x' from ahl_ue_relationships where
3888                         related_ue_id = EFF.unit_effectivity_id)
3889         FOR UPDATE;
3890 
3891    l_ue_rec                 l_unit_effectivity_csr%ROWTYPE;
3892 
3893    CURSOR l_ue_descendent_csr(p_effectivity_id IN NUMBER) IS SELECT
3894                       EFF.UNIT_EFFECTIVITY_ID,
3895                       EFF.CSI_ITEM_INSTANCE_ID,
3896                       EFF.MR_INTERVAL_ID     ,
3897                       EFF.MR_EFFECTIVITY_ID  ,
3898                       EFF.MR_HEADER_ID       ,
3899                       EFF.STATUS_CODE        ,
3900                       EFF.DUE_DATE           ,
3901                       EFF.DUE_COUNTER_VALUE  ,
3902                       EFF.FORECAST_SEQUENCE  ,
3903                       EFF.REPETITIVE_MR_FLAG,
3904                       EFF.TOLERANCE_FLAG    ,
3905                       EFF.REMARKS           ,
3906                       EFF.MESSAGE_CODE      ,
3907                       EFF.PRECEDING_UE_ID    ,
3908                       EFF.DATE_RUN,
3909                       EFF.SET_DUE_DATE,
3910                       EFF.ACCOMPLISHED_DATE,
3911                       EFF.SERVICE_LINE_ID,
3912                       EFF.PROGRAM_MR_HEADER_ID,
3913                       EFF.CANCEL_REASON_CODE,
3914                       EFF.EARLIEST_DUE_DATE,
3915                       EFF.LATEST_DUE_DATE,
3916                       EFF.DEFER_FROM_UE_ID,
3917                       EFF.CS_INCIDENT_ID,
3918                       EFF.QA_COLLECTION_ID,
3919                       EFF.ORIG_DEFERRAL_UE_ID,
3920                       EFF.APPLICATION_USG_CODE,
3921                       EFF.OBJECT_TYPE,
3922                       EFF.COUNTER_ID,
3923                       EFF.MANUALLY_PLANNED_FLAG,
3924                       EFF.LOG_SERIES_CODE,
3925                       EFF.LOG_SERIES_NUMBER,
3926                       EFF.FLIGHT_NUMBER,
3927                       EFF.MEL_CDL_TYPE_CODE,
3928                       EFF.POSITION_PATH_ID,
3929                       EFF.ATA_CODE,
3930                       EFF.UNIT_CONFIG_HEADER_ID,
3931                       EFF.ATTRIBUTE_CATEGORY,
3932                       EFF.ATTRIBUTE1,
3933                       EFF.ATTRIBUTE2,
3934                       EFF.ATTRIBUTE3,
3935                       EFF.ATTRIBUTE4,
3936                       EFF.ATTRIBUTE5,
3937                       EFF.ATTRIBUTE6,
3938                       EFF.ATTRIBUTE7,
3939                       EFF.ATTRIBUTE8,
3940                       EFF.ATTRIBUTE9,
3941                       EFF.ATTRIBUTE10,
3942                       EFF.ATTRIBUTE11,
3943                       EFF.ATTRIBUTE12,
3944                       EFF.ATTRIBUTE13,
3945                       EFF.ATTRIBUTE14,
3946                       EFF.ATTRIBUTE15,
3947                       EFF.OBJECT_VERSION_NUMBER,
3948                       EFF.LAST_UPDATE_DATE,
3949                       EFF.LAST_UPDATED_BY,
3950                       EFF.LAST_UPDATE_LOGIN
3951            FROM AHL_UNIT_EFFECTIVITIES_APP_V EFF
3952               WHERE EFF.UNIT_EFFECTIVITY_ID IN
3953                    (SELECT REL.RELATED_UE_ID FROM AHL_UE_RELATIONSHIPS REL
3954                        WHERE REL.ORIGINATOR_UE_ID = p_effectivity_id)
3955            FOR UPDATE;
3956                  --   AND REL.UE_ID = EFF.UNIT_EFFECTIVITY_ID;
3957 
3958 
3959    -- For processsing object type = 'SR'
3960    /*CURSOR ahl_sr_ue_csr(p_mr_header_id IN NUMBER) IS
3961      SELECT UE1.unit_effectivity_id
3962        FROM ahl_unit_effectivities_app_v UE,
3963             ahl_ue_relationships UER, ahl_unit_effectivities_b UE1
3964        WHERE UER.ue_id = UE.unit_effectivity_id
3965          AND UER.related_ue_id = UE1.unit_effectivity_id
3966          AND UE.object_type = 'SR'
3967          AND (UE.status_code is null or UE.status_code = 'INIT-DUE')
3968          AND UE1.mr_header_id = p_mr_header_id;*/-- commented for performance tuning
3969    /*-Start-----Above cursor go devided into two----------*/
3970 
3971    CURSOR  ahl_sr_ue_valid_csr(p_mr_header_id IN NUMBER,
3972                                p_unit_effectivity_id IN NUMBER) IS
3973      SELECT 'x'
3974      FROM ahl_unit_effectivities_app_v UE1
3975      WHERE UE1.unit_effectivity_id = p_unit_effectivity_id
3976       AND UE1.mr_header_id = p_mr_header_id;
3977 
3978    CURSOR ahl_sr_ue_csr IS
3979      SELECT UER.related_ue_id
3980      FROM ahl_unit_effectivities_app_v UE, ahl_ue_relationships UER
3981      WHERE UER.ue_id = UE.unit_effectivity_id
3982      AND UER.relationship_code = 'PARENT'
3983      AND UE.object_type = 'SR'
3984      AND (UE.status_code is null or UE.status_code = 'INIT-DUE');
3985 
3986    /*-End-----split---------------------------------------*/
3987 
3988 
3989    CURSOR get_descendents_csr(p_ue_id IN NUMBER) IS
3990      SELECT related_ue_id
3991      FROM ahl_ue_relationships
3992      START WITH ue_id = p_ue_id
3993         AND relationship_code = 'PARENT'
3994       CONNECT BY ue_id = PRIOR related_ue_id
3995         AND relationship_code = 'PARENT';
3996 
3997    l_ue_descendent_rec        l_ue_descendent_csr%ROWTYPE;
3998    l_application_usg_code     ahl_mr_headers_b.application_usg_code%TYPE;
3999    l_junk                     varchar2(1);
4000    --l_req_id                   number;
4001 
4002    CURSOR get_mr_copy_dtls_csr(p_mr_header_id IN NUMBER) IS
4003    SELECT COPY_INIT_ACCOMPL_FLAG, COPY_DEFERRALS_FLAG FROM AHL_MR_HEADERS_APP_V
4004    WHERE MR_HEADER_ID = p_mr_header_id;
4005 
4006    l_COPY_FIRST_DUE_FLAG VARCHAR2(1);
4007    l_COPY_DEFERRALS_FLAG VARCHAR2(1);
4008 
4009    CURSOR l_cp_ue_csr(p_header_id IN NUMBER,p_csi_item_instance_id IN NUMBER) IS SELECT
4010                       EFF.UNIT_EFFECTIVITY_ID,
4011                       EFF.CSI_ITEM_INSTANCE_ID,
4012                       EFF.MR_INTERVAL_ID     ,
4013                       EFF.MR_EFFECTIVITY_ID  ,
4014                       EFF.MR_HEADER_ID       ,
4015                       EFF.STATUS_CODE        ,
4016                       EFF.DUE_DATE           ,
4017                       EFF.DUE_COUNTER_VALUE  ,
4018                       EFF.FORECAST_SEQUENCE  ,
4019                       EFF.REPETITIVE_MR_FLAG,
4020                       EFF.TOLERANCE_FLAG    ,
4021                       EFF.REMARKS           ,
4022                       EFF.MESSAGE_CODE      ,
4023                       EFF.PRECEDING_UE_ID    ,
4024                       EFF.DATE_RUN,
4025                       EFF.SET_DUE_DATE,
4026                       EFF.ACCOMPLISHED_DATE,
4027                       EFF.SERVICE_LINE_ID,
4028                       EFF.PROGRAM_MR_HEADER_ID,
4029                       EFF.CANCEL_REASON_CODE,
4030                       EFF.EARLIEST_DUE_DATE,
4031                       EFF.LATEST_DUE_DATE,
4032                       EFF.DEFER_FROM_UE_ID,
4033                       EFF.CS_INCIDENT_ID,
4034                       EFF.QA_COLLECTION_ID,
4035                       EFF.ORIG_DEFERRAL_UE_ID,
4036                       EFF.APPLICATION_USG_CODE,
4037                       EFF.OBJECT_TYPE,
4038                       EFF.COUNTER_ID,
4039                       EFF.MANUALLY_PLANNED_FLAG,
4040                       EFF.LOG_SERIES_CODE,
4041                       EFF.LOG_SERIES_NUMBER,
4042                       EFF.FLIGHT_NUMBER,
4043                       EFF.MEL_CDL_TYPE_CODE,
4044                       EFF.POSITION_PATH_ID,
4045                       EFF.ATA_CODE,
4046                       EFF.UNIT_CONFIG_HEADER_ID,
4047                       EFF.ATTRIBUTE_CATEGORY,
4048                       EFF.ATTRIBUTE1,
4049                       EFF.ATTRIBUTE2,
4050                       EFF.ATTRIBUTE3,
4051                       EFF.ATTRIBUTE4,
4052                       EFF.ATTRIBUTE5,
4053                       EFF.ATTRIBUTE6,
4054                       EFF.ATTRIBUTE7,
4055                       EFF.ATTRIBUTE8,
4056                       EFF.ATTRIBUTE9,
4057                       EFF.ATTRIBUTE10,
4058                       EFF.ATTRIBUTE11,
4059                       EFF.ATTRIBUTE12,
4060                       EFF.ATTRIBUTE13,
4061                       EFF.ATTRIBUTE14,
4062                       EFF.ATTRIBUTE15,
4063                       EFF.OBJECT_VERSION_NUMBER,
4064                       EFF.LAST_UPDATE_DATE,
4065                       EFF.LAST_UPDATED_BY    ,
4066                       EFF.LAST_UPDATE_LOGIN
4067     FROM  AHL_UNIT_EFFECTIVITIES_APP_V EFF
4068       WHERE EFF.MR_HEADER_ID = p_header_id
4069         AND EFF.CSI_ITEM_INSTANCE_ID = p_csi_item_instance_id
4070         AND object_type = 'MR'
4071      -- AND (EFF.status_code is null or EFF.status_code in ('INIT-DUE','DEFERRED'))
4072         AND (EFF.status_code  = 'MR-TERMINATE')
4073         AND not exists (select 'x' from ahl_ue_relationships where
4074                         related_ue_id = EFF.unit_effectivity_id);
4075 
4076 l_copy_record BOOLEAN;
4077 l_copy_ud_record BOOLEAN;
4078 
4079 CURSOR unit_deferral_id_csr(p_unit_effectivity_id IN NUMBER) IS
4080 SELECT unit_deferral_id from ahl_unit_deferrals_b
4081 where UNIT_EFFECTIVITY_ID = p_unit_effectivity_id
4082 AND UNIT_DEFERRAL_TYPE = 'INIT-DUE';
4083 
4084 l_unit_deferral_id NUMBER;
4085 l_unit_effectivity_id NUMBER;
4086 l_rowid               VARCHAR2(30);
4087 
4088 
4089 
4090 
4091 BEGIN
4092 
4093   -- Standard start of API savepoint
4094   SAVEPOINT Terminate_MR_Instances_pvt;
4095 
4096   -- Enable Debug (optional)
4097   IF G_DEBUG='Y'  THEN
4098     AHL_DEBUG_PUB.enable_debug;
4099   END IF;
4100 
4101   IF G_DEBUG='Y'  THEN
4102     AHL_DEBUG_PUB.debug('Beginning Processing... ', 'UMP-TERMINATE: ');
4103   END IF;
4104   -- Standard call to check for call compatibility
4105   IF NOT FND_API.Compatible_API_Call(l_api_version, p_api_version, l_api_name,
4106                                      G_PKG_NAME) THEN
4107     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4108   END IF;
4109 
4110   IF G_DEBUG='Y'  THEN
4111     AHL_DEBUG_PUB.debug('After call compatible api ', 'UMP-TERMINATE:');
4112     AHL_DEBUG_PUB.debug('Input Parameters:');
4113     AHL_DEBUG_PUB.debug('p_new_mr_header_id: ' || p_new_mr_header_id);
4114     AHL_DEBUG_PUB.debug('p_old_mr_header_id: ' || p_old_mr_header_id);
4115     AHL_DEBUG_PUB.debug('p_old_mr_title: ' || p_old_mr_title);
4116     AHL_DEBUG_PUB.debug('p_old_version_number: ' || p_old_version_number);
4117     AHL_DEBUG_PUB.debug('p_new_mr_header_id: ' || p_new_mr_header_id);
4118     AHL_DEBUG_PUB.debug('p_new_mr_title: ' || p_new_mr_title);
4119     AHL_DEBUG_PUB.debug('p_new_version_number: ' || p_new_version_number);
4120   END IF;
4121 
4122     -- Initialize message list if p_init_msg_list is set to TRUE
4123   IF FND_API.To_Boolean(p_init_msg_list) THEN
4124     FND_MSG_PUB.Initialize;
4125   END IF;
4126 
4127   -- Initialize API return status to success
4128   x_return_status := FND_API.G_RET_STS_SUCCESS;
4129 
4130   -- Begin Processing
4131 
4132   l_new_mr_header_id := p_new_mr_header_id;
4133   l_old_mr_header_id := p_old_mr_header_id;
4134 
4135   --resolve new mr_header_id
4136 
4137   IF(p_new_mr_header_id IS NULL OR p_new_mr_header_id = FND_API.G_MISS_NUM) THEN
4138     IF((p_new_mr_title IS NOT NULL AND p_new_mr_title <> FND_API.G_MISS_CHAR) AND
4139        (p_new_version_number IS NOT NULL AND p_new_version_number <> FND_API.G_MISS_NUM)) THEN
4140 
4141          OPEN l_get_mr_header_id(p_new_mr_title, p_new_version_number);
4142            FETCH l_get_mr_header_id INTO l_new_mr_header_id;
4143            -- IF (l_get_mr_header_id%NOTFOUND) THEN
4144          CLOSE l_get_mr_header_id;
4145      END IF;
4146    END IF;
4147 
4148 
4149   --resolve old mr_header_id
4150 
4151   IF(p_old_mr_header_id IS NULL OR p_old_mr_header_id = FND_API.G_MISS_NUM) THEN
4152     IF((p_old_mr_title IS NOT NULL AND p_old_mr_title <> FND_API.G_MISS_CHAR) AND
4153        (p_old_version_number IS NOT NULL AND p_old_version_number <> FND_API.G_MISS_NUM)) THEN
4154          OPEN l_get_mr_header_id(p_old_mr_title, p_old_version_number);
4155            FETCH l_get_mr_header_id INTO l_old_mr_header_id;
4156          CLOSE l_get_mr_header_id;
4157     END IF;
4158   END IF;
4159 
4160   IF (l_old_mr_header_id IS NULL) THEN
4161    x_return_status := FND_API.G_RET_STS_ERROR;
4162     FND_MESSAGE.Set_Name('AHL','AHL_UMP_TERMNT_MR_DET_MAND');
4163     FND_MSG_PUB.ADD;
4164     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4165    -- RETURN;
4166   END IF;
4167 
4168 /*
4169   IF (l_new_mr_header_id IS NULL) THEN
4170     x_return_status := FND_API.G_RET_STS_ERROR;
4171     FND_MESSAGE.Set_Name('AHL','AHL_UMP_CUR_MR_DET_MAND');
4172     FND_MSG_PUB.ADD;
4173     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4174    -- RETURN;
4175   END IF;
4176 */
4177 
4178   OPEN l_get_effective_to_date(l_old_mr_header_id);
4179     FETCH l_get_effective_to_date INTO l_effective_to_date, l_application_usg_code; --, l_effective_from_date;
4180     IF (l_get_effective_to_date%FOUND) THEN
4181       --check if effective to date has passed
4182      /* IF( TRUNC(l_effective_to_date) > TRUNC(SYSDATE)) THEN
4183         x_return_status := FND_API.G_RET_STS_ERROR;
4184         FND_MESSAGE.Set_Name('AHL','AHL_UMP_EFF_TO_DATE');
4185         FND_MESSAGE.Set_Token('EFF_TO', l_effective_to_date);
4186         FND_MSG_PUB.ADD;
4187         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4188       END IF; */
4189 
4190       -- Set the profile for due date calculation as the work flow user may not have this
4191       -- profile set.
4192       FND_PROFILE.PUT('AHL_APPLN_USG', l_application_usg_code);
4193 
4194     END IF;
4195   CLOSE l_get_effective_to_date;
4196 
4197   IF G_DEBUG='Y'  THEN
4198     AHL_DEBUG_PUB.debug('l_effective_to_date = ' || l_effective_to_date);
4199   END IF;
4200 
4201 
4202   IF (l_new_mr_header_id IS NOT NULL) THEN
4203     OPEN l_get_effective_from_date(l_new_mr_header_id);
4204       FETCH l_get_effective_from_date INTO l_effective_from_date;
4205       IF (l_get_effective_from_date%NOTFOUND) THEN
4206          x_return_status := FND_API.G_RET_STS_ERROR;
4207          FND_MESSAGE.Set_Name('AHL','AHL_UMP_PUE_MR_NOTFOUND');
4208          FND_MESSAGE.Set_Token('MR_ID',l_new_mr_header_id);
4209          FND_MSG_PUB.ADD;
4210          RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4211       END IF;
4212     CLOSE l_get_effective_from_date;
4213   END IF;
4214 
4215   IF G_DEBUG='Y'  THEN
4216     AHL_DEBUG_PUB.debug('l_effective_from_date = ' || l_effective_from_date);
4217   END IF;
4218 
4219  OPEN l_unit_effectivity_csr(l_old_mr_header_id);
4220  LOOP
4221     FETCH l_unit_effectivity_csr INTO l_ue_rec;             --l_ue_id, l_repetitive_flag, l_status_code;
4222 
4223     IF G_DEBUG='Y'  THEN
4224       AHL_DEBUG_PUB.debug('l_ue_rec.unit_effectivity_id = ' || l_ue_rec.UNIT_EFFECTIVITY_ID);
4225       AHL_DEBUG_PUB.debug('l_ue_rec.mr_header_id = ' || l_ue_rec.mr_header_id);
4226       AHL_DEBUG_PUB.debug('l_ue_rec.object_version_number = ' || l_ue_rec.object_version_number);
4227     END IF;
4228     EXIT WHEN l_unit_effectivity_csr%NOTFOUND;
4229 
4230 
4231     l_visit_status := AHL_UMP_UTIL_PKG.get_Visit_Status ( l_ue_rec.UNIT_EFFECTIVITY_ID);
4232 
4233     -- only if visit is in planning status we must mark an exception or delete.
4234     -- if visit is already on the floor, we do nothing.
4235     IF (nvl(l_visit_status,'X') NOT IN ('RELEASED','CLOSED')) THEN
4236       IF (l_ue_rec.REPETITIVE_MR_FLAG = 'N'
4237           OR l_ue_rec.STATUS_CODE = 'INIT-DUE' OR l_ue_rec.defer_from_ue_id IS NOT NULL) THEN
4238 
4239           IF G_DEBUG='Y'  THEN
4240             AHL_DEBUG_PUB.debug('IN if repetitive_mr_flag = N');
4241           END IF;
4242           l_ue_rec.STATUS_CODE := 'MR-TERMINATE';
4243           l_ue_rec.MESSAGE_CODE := 'TERMINATE-W-NEW-REV';
4244           l_ue_rec.ACCOMPLISHED_DATE := SYSDATE;
4245 
4246           IF G_DEBUG='Y'  THEN
4247             AHL_DEBUG_PUB.debug('before update record status to MR-TERMINATE');
4248            END IF;
4249           AHL_UNIT_EFFECTIVITIES_PKG.UPDATE_ROW (
4250             x_unit_effectivity_id =>        l_ue_rec.UNIT_EFFECTIVITY_ID,
4251             x_csi_item_instance_id =>       l_ue_rec.CSI_ITEM_INSTANCE_ID,
4252             x_mr_interval_id =>             l_ue_rec.MR_INTERVAL_ID     ,
4253             x_MR_EFFECTIVITY_ID =>          l_ue_rec.MR_EFFECTIVITY_ID  ,
4254             x_MR_HEADER_ID =>               l_ue_rec.MR_HEADER_ID       ,
4255             x_STATUS_CODE =>                l_ue_rec.STATUS_CODE        ,
4256             x_DUE_DATE =>                   l_ue_rec.DUE_DATE           ,
4257             x_DUE_COUNTER_VALUE =>          l_ue_rec.DUE_COUNTER_VALUE  ,
4258             x_FORECAST_SEQUENCE =>          l_ue_rec.FORECAST_SEQUENCE  ,
4259             x_REPETITIVE_MR_FLAG =>         l_ue_rec.REPETITIVE_MR_FLAG,
4260             x_TOLERANCE_FLAG =>             l_ue_rec.TOLERANCE_FLAG    ,
4261             x_REMARKS =>                    l_ue_rec.REMARKS           ,
4262             x_MESSAGE_CODE =>               l_ue_rec.MESSAGE_CODE      ,
4263             x_PRECEDING_UE_ID =>            l_ue_rec.PRECEDING_UE_ID    ,
4264             x_DATE_RUN =>                   l_ue_rec.DATE_RUN,
4265             x_SET_DUE_DATE =>               l_ue_rec.SET_DUE_DATE,
4266             x_ACCOMPLISHED_DATE =>          l_ue_rec.ACCOMPLISHED_DATE,
4267             x_SERVICE_LINE_ID =>            l_ue_rec.SERVICE_LINE_ID,
4268             x_PROGRAM_MR_HEADER_ID =>       l_ue_rec.PROGRAM_MR_HEADER_ID,
4269             x_CANCEL_REASON_CODE =>         l_ue_rec.CANCEL_REASON_CODE,
4270             x_EARLIEST_DUE_DATE =>          l_ue_rec.EARLIEST_DUE_DATE,
4271             x_LATEST_DUE_DATE =>            l_ue_rec.LATEST_DUE_DATE,
4272             x_defer_from_ue_id =>           l_ue_rec.defer_from_ue_id,
4273             x_qa_collection_id =>           l_ue_rec.qa_collection_id,
4274             x_orig_deferral_ue_id =>        l_ue_rec.orig_deferral_ue_id,
4275             x_cs_incident_id  =>            l_ue_rec.cs_incident_id,
4276             x_application_usg_code =>       l_ue_rec.application_usg_code,
4277             x_object_type          =>       l_ue_rec.object_type,
4278             x_counter_id           =>       l_ue_rec.counter_id,
4279             x_manually_planned_flag =>      l_ue_rec.manually_planned_flag,
4280             X_LOG_SERIES_CODE       =>      l_ue_rec.log_series_code,
4281             X_LOG_SERIES_NUMBER     =>      l_ue_rec.log_series_number,
4282             X_FLIGHT_NUMBER         =>      l_ue_rec.flight_number,
4283             X_MEL_CDL_TYPE_CODE     =>      l_ue_rec.mel_cdl_type_code,
4284             X_POSITION_PATH_ID      =>      l_ue_rec.position_path_id,
4285             X_ATA_CODE              =>      l_ue_rec.ATA_CODE,
4286             X_UNIT_CONFIG_HEADER_ID  =>     l_ue_rec.unit_config_header_id,
4287             x_ATTRIBUTE_CATEGORY =>         l_ue_rec.ATTRIBUTE_CATEGORY,
4288             x_ATTRIBUTE1 =>                 l_ue_rec.ATTRIBUTE1,
4289             x_ATTRIBUTE2 =>                 l_ue_rec.ATTRIBUTE2,
4290             x_ATTRIBUTE3 =>                 l_ue_rec.ATTRIBUTE3,
4291             x_ATTRIBUTE4 =>                 l_ue_rec.ATTRIBUTE4,
4292             x_ATTRIBUTE5 =>                 l_ue_rec.ATTRIBUTE5,
4293             x_ATTRIBUTE6 =>                 l_ue_rec.ATTRIBUTE6,
4294             x_ATTRIBUTE7 =>                 l_ue_rec.ATTRIBUTE7,
4295             x_ATTRIBUTE8 =>                 l_ue_rec.ATTRIBUTE8,
4296             x_ATTRIBUTE9 =>                 l_ue_rec.ATTRIBUTE9,
4297             x_ATTRIBUTE10 =>                l_ue_rec.ATTRIBUTE10,
4298             x_ATTRIBUTE11 =>                l_ue_rec.ATTRIBUTE11,
4299             x_ATTRIBUTE12 =>                l_ue_rec.ATTRIBUTE12,
4300             x_ATTRIBUTE13 =>                l_ue_rec.ATTRIBUTE13,
4301             x_ATTRIBUTE14 =>                l_ue_rec.ATTRIBUTE14,
4302             x_ATTRIBUTE15 =>                l_ue_rec.ATTRIBUTE15,
4303             x_OBJECT_VERSION_NUMBER =>      l_ue_rec.OBJECT_VERSION_NUMBER + 1,
4304             x_LAST_UPDATE_DATE =>           sysdate,
4305             X_LAST_UPDATED_BY  =>           fnd_global.user_id,
4306             X_LAST_UPDATE_LOGIN  =>         fnd_global.login_id);
4307 
4308             IF G_DEBUG='Y'  THEN
4309               AHL_DEBUG_PUB.debug('After update record');
4310             END IF;
4311 
4312           --update all descendent Unit Effectivities
4313           OPEN l_ue_descendent_csr(l_ue_rec.UNIT_EFFECTIVITY_ID);
4314           LOOP
4315              FETCH l_ue_descendent_csr INTO l_ue_descendent_rec;
4316              EXIT WHEN l_ue_descendent_csr%NOTFOUND;
4317 
4318              IF G_DEBUG='Y'  THEN
4319                AHL_DEBUG_PUB.debug('descedant ue_id' || l_ue_descendent_rec.UNIT_EFFECTIVITY_ID);
4320              END IF;
4321              l_ue_descendent_rec.STATUS_CODE := 'MR-TERMINATE';
4322              l_ue_descendent_rec.MESSAGE_CODE := 'TERMINATE-W-NEW-REV';
4323              l_ue_descendent_rec.ACCOMPLISHED_DATE := SYSDATE;
4324              AHL_UNIT_EFFECTIVITIES_PKG.UPDATE_ROW (
4325                x_unit_effectivity_id =>     l_ue_descendent_rec.UNIT_EFFECTIVITY_ID,
4326                x_csi_item_instance_id =>    l_ue_descendent_rec.CSI_ITEM_INSTANCE_ID,
4327                x_mr_interval_id =>          l_ue_descendent_rec.MR_INTERVAL_ID     ,
4328                x_MR_EFFECTIVITY_ID =>       l_ue_descendent_rec.MR_EFFECTIVITY_ID  ,
4329                x_MR_HEADER_ID =>            l_ue_descendent_rec.MR_HEADER_ID       ,
4330                x_STATUS_CODE =>             l_ue_descendent_rec.STATUS_CODE        ,
4331                x_DUE_DATE =>                l_ue_descendent_rec.DUE_DATE           ,
4332                x_DUE_COUNTER_VALUE =>       l_ue_descendent_rec.DUE_COUNTER_VALUE  ,
4333                x_FORECAST_SEQUENCE =>       l_ue_descendent_rec.FORECAST_SEQUENCE  ,
4334                x_REPETITIVE_MR_FLAG =>      l_ue_descendent_rec.REPETITIVE_MR_FLAG,
4335                x_TOLERANCE_FLAG =>          l_ue_descendent_rec.TOLERANCE_FLAG    ,
4336                x_REMARKS =>                 l_ue_descendent_rec.REMARKS           ,
4337                x_MESSAGE_CODE =>            l_ue_descendent_rec.MESSAGE_CODE      ,
4338                x_PRECEDING_UE_ID =>         l_ue_descendent_rec.PRECEDING_UE_ID    ,
4339                x_DATE_RUN =>                l_ue_descendent_rec.DATE_RUN,
4340                x_SET_DUE_DATE =>            l_ue_descendent_rec.SET_DUE_DATE,
4341                x_ACCOMPLISHED_DATE =>       l_ue_descendent_rec.ACCOMPLISHED_DATE,
4342                x_SERVICE_LINE_ID =>         l_ue_descendent_rec.SERVICE_LINE_ID,
4343                x_PROGRAM_MR_HEADER_ID =>    l_ue_descendent_rec.PROGRAM_MR_HEADER_ID,
4344                x_CANCEL_REASON_CODE =>      l_ue_descendent_rec.CANCEL_REASON_CODE,
4345                x_EARLIEST_DUE_DATE =>       l_ue_descendent_rec.EARLIEST_DUE_DATE,
4346                x_LATEST_DUE_DATE =>         l_ue_descendent_rec.LATEST_DUE_DATE,
4347                x_defer_from_ue_id =>        l_ue_descendent_rec.defer_from_ue_id,
4348                x_qa_collection_id =>        l_ue_descendent_rec.qa_collection_id,
4349                x_orig_deferral_ue_id =>     l_ue_descendent_rec.orig_deferral_ue_id,
4350                x_cs_incident_id  =>         l_ue_descendent_rec.cs_incident_id,
4351                x_application_usg_code =>    l_ue_descendent_rec.application_usg_code,
4352                x_object_type          =>    l_ue_descendent_rec.object_type,
4353                x_counter_id           =>    l_ue_descendent_rec.counter_id,
4354                x_manually_planned_flag =>   l_ue_descendent_rec.manually_planned_flag,
4355                X_LOG_SERIES_CODE       =>   l_ue_descendent_rec.log_series_code,
4356                X_LOG_SERIES_NUMBER     =>   l_ue_descendent_rec.log_series_number,
4357                X_FLIGHT_NUMBER         =>   l_ue_descendent_rec.flight_number,
4358                X_MEL_CDL_TYPE_CODE     =>   l_ue_descendent_rec.mel_cdl_type_code,
4359                X_POSITION_PATH_ID      =>   l_ue_descendent_rec.position_path_id,
4360                X_ATA_CODE              =>   l_ue_descendent_rec.ATA_CODE,
4361                X_UNIT_CONFIG_HEADER_ID  =>  l_ue_descendent_rec.unit_config_header_id,
4362                x_ATTRIBUTE_CATEGORY =>      l_ue_descendent_rec.ATTRIBUTE_CATEGORY,
4363                x_ATTRIBUTE1 =>              l_ue_descendent_rec.ATTRIBUTE1,
4364                x_ATTRIBUTE2 =>              l_ue_descendent_rec.ATTRIBUTE2,
4365                x_ATTRIBUTE3 =>              l_ue_descendent_rec.ATTRIBUTE3,
4366                x_ATTRIBUTE4 =>              l_ue_descendent_rec.ATTRIBUTE4,
4367                x_ATTRIBUTE5 =>              l_ue_descendent_rec.ATTRIBUTE5,
4368                x_ATTRIBUTE6 =>              l_ue_descendent_rec.ATTRIBUTE6,
4369                x_ATTRIBUTE7 =>              l_ue_descendent_rec.ATTRIBUTE7,
4370                x_ATTRIBUTE8 =>              l_ue_descendent_rec.ATTRIBUTE8,
4371                x_ATTRIBUTE9 =>              l_ue_descendent_rec.ATTRIBUTE9,
4372                x_ATTRIBUTE10 =>             l_ue_descendent_rec.ATTRIBUTE10,
4373                x_ATTRIBUTE11 =>             l_ue_descendent_rec.ATTRIBUTE11,
4374                x_ATTRIBUTE12 =>             l_ue_descendent_rec.ATTRIBUTE12,
4375                x_ATTRIBUTE13 =>             l_ue_descendent_rec.ATTRIBUTE13,
4376                x_ATTRIBUTE14 =>             l_ue_descendent_rec.ATTRIBUTE14,
4377                x_ATTRIBUTE15 =>             l_ue_descendent_rec.ATTRIBUTE15,
4378                x_OBJECT_VERSION_NUMBER =>   l_ue_descendent_rec.OBJECT_VERSION_NUMBER + 1,
4379                x_LAST_UPDATE_DATE =>        sysdate,
4380                x_LAST_UPDATED_BY   =>       fnd_global.user_id,
4381                X_LAST_UPDATE_LOGIN  =>      fnd_global.login_id);
4382 
4383 
4384           END LOOP;
4385           CLOSE l_ue_descendent_csr;
4386      -- END IF;
4387       ELSIF (l_ue_rec.REPETITIVE_MR_FLAG = 'Y') THEN
4388          IF (nvl(l_visit_status,'X') =  'PLANNING') THEN
4389 
4390             IF G_DEBUG='Y'  THEN
4391               AHL_DEBUG_PUB.debug('In repetitive_mr_flag = Y');
4392             END IF;
4393             l_ue_rec.STATUS_CODE := 'EXCEPTION';
4394             l_ue_rec.MESSAGE_CODE := 'TERMINATE-W-NEW-REV';
4395             l_ue_rec.ACCOMPLISHED_DATE := SYSDATE;
4396 
4397             IF G_DEBUG='Y'  THEN
4398               AHL_DEBUG_PUB.debug('Before update record status to EXCEPTION');
4399             END IF;
4400             AHL_UNIT_EFFECTIVITIES_PKG.UPDATE_ROW (
4401             x_unit_effectivity_id =>        l_ue_rec.UNIT_EFFECTIVITY_ID,
4402             x_csi_item_instance_id =>       l_ue_rec.CSI_ITEM_INSTANCE_ID,
4403             x_mr_interval_id =>             l_ue_rec.MR_INTERVAL_ID     ,
4404             x_MR_EFFECTIVITY_ID =>          l_ue_rec.MR_EFFECTIVITY_ID  ,
4405             x_MR_HEADER_ID =>               l_ue_rec.MR_HEADER_ID       ,
4406             x_STATUS_CODE =>                l_ue_rec.STATUS_CODE        ,
4407             x_DUE_DATE =>                   l_ue_rec.DUE_DATE           ,
4408             x_DUE_COUNTER_VALUE =>          l_ue_rec.DUE_COUNTER_VALUE  ,
4409             x_FORECAST_SEQUENCE =>          l_ue_rec.FORECAST_SEQUENCE  ,
4410             x_REPETITIVE_MR_FLAG =>         l_ue_rec.REPETITIVE_MR_FLAG,
4411             x_TOLERANCE_FLAG =>             l_ue_rec.TOLERANCE_FLAG    ,
4412             x_REMARKS =>                    l_ue_rec.REMARKS           ,
4413             x_MESSAGE_CODE =>               l_ue_rec.MESSAGE_CODE      ,
4414             x_PRECEDING_UE_ID =>            l_ue_rec.PRECEDING_UE_ID    ,
4415             x_DATE_RUN =>                   l_ue_rec.DATE_RUN,
4416             x_SET_DUE_DATE =>               l_ue_rec.SET_DUE_DATE,
4417             x_ACCOMPLISHED_DATE =>          l_ue_rec.ACCOMPLISHED_DATE,
4418             x_SERVICE_LINE_ID =>            l_ue_rec.SERVICE_LINE_ID,
4419             x_PROGRAM_MR_HEADER_ID =>       l_ue_rec.PROGRAM_MR_HEADER_ID,
4420             x_CANCEL_REASON_CODE =>         l_ue_rec.CANCEL_REASON_CODE,
4421             x_EARLIEST_DUE_DATE =>          l_ue_rec.EARLIEST_DUE_DATE,
4422             x_LATEST_DUE_DATE =>            l_ue_rec.LATEST_DUE_DATE,
4423             x_defer_from_ue_id =>           l_ue_rec.defer_from_ue_id,
4424             x_qa_collection_id =>           l_ue_rec.qa_collection_id,
4425             x_orig_deferral_ue_id =>        l_ue_rec.orig_deferral_ue_id,
4426             x_cs_incident_id  =>            l_ue_rec.cs_incident_id,
4427             x_application_usg_code =>       l_ue_rec.application_usg_code,
4428             x_object_type          =>       l_ue_rec.object_type,
4429             x_counter_id           =>       l_ue_rec.counter_id,
4430             x_manually_planned_flag =>      l_ue_rec.manually_planned_flag,
4431             X_LOG_SERIES_CODE       =>      l_ue_rec.log_series_code,
4432             X_LOG_SERIES_NUMBER     =>      l_ue_rec.log_series_number,
4433             X_FLIGHT_NUMBER         =>      l_ue_rec.flight_number,
4434             X_MEL_CDL_TYPE_CODE     =>      l_ue_rec.mel_cdl_type_code,
4435             X_POSITION_PATH_ID      =>      l_ue_rec.position_path_id,
4436             X_ATA_CODE              =>      l_ue_rec.ATA_CODE,
4437             X_UNIT_CONFIG_HEADER_ID  =>     l_ue_rec.unit_config_header_id,
4438             x_ATTRIBUTE_CATEGORY =>         l_ue_rec.ATTRIBUTE_CATEGORY,
4439             x_ATTRIBUTE1 =>                 l_ue_rec.ATTRIBUTE1,
4440             x_ATTRIBUTE2 =>                 l_ue_rec.ATTRIBUTE2,
4441             x_ATTRIBUTE3 =>                 l_ue_rec.ATTRIBUTE3,
4442             x_ATTRIBUTE4 =>                 l_ue_rec.ATTRIBUTE4,
4443             x_ATTRIBUTE5 =>                 l_ue_rec.ATTRIBUTE5,
4444             x_ATTRIBUTE6 =>                 l_ue_rec.ATTRIBUTE6,
4445             x_ATTRIBUTE7 =>                 l_ue_rec.ATTRIBUTE7,
4446             x_ATTRIBUTE8 =>                 l_ue_rec.ATTRIBUTE8,
4447             x_ATTRIBUTE9 =>                 l_ue_rec.ATTRIBUTE9,
4448             x_ATTRIBUTE10 =>                l_ue_rec.ATTRIBUTE10,
4449             x_ATTRIBUTE11 =>                l_ue_rec.ATTRIBUTE11,
4450             x_ATTRIBUTE12 =>                l_ue_rec.ATTRIBUTE12,
4451             x_ATTRIBUTE13 =>                l_ue_rec.ATTRIBUTE13,
4452             x_ATTRIBUTE14 =>                l_ue_rec.ATTRIBUTE14,
4453             x_ATTRIBUTE15 =>                l_ue_rec.ATTRIBUTE15,
4454             x_OBJECT_VERSION_NUMBER =>      l_ue_rec.OBJECT_VERSION_NUMBER + 1,
4455             x_LAST_UPDATE_DATE =>           sysdate, --l_ue_rec.LAST_UPDATE_DATE,
4456             x_LAST_UPDATED_BY  =>           fnd_global.user_id, --l_ue_rec.LAST_UPDATED_BY,
4457             x_LAST_UPDATE_LOGIN  =>         fnd_global.login_id); -- l_ue_rec.LAST_UPDATE_LOGIN );
4458 
4459 
4460             IF G_DEBUG='Y'  THEN
4461               AHL_DEBUG_PUB.debug('After update record');
4462             END IF;
4463              --update all descendent Unit Effectivities
4464             OPEN l_ue_descendent_csr(l_ue_rec.UNIT_EFFECTIVITY_ID);
4465             LOOP
4466              FETCH l_ue_descendent_csr INTO l_ue_descendent_rec;
4467              EXIT WHEN l_ue_descendent_csr%NOTFOUND;
4468              l_ue_descendent_rec.STATUS_CODE := 'EXCEPTION';
4469              --l_ue_descendent_rec.MESSAGE_CODE := 'TERMINATE-W-NEW-REV';
4470              l_ue_descendent_rec.ACCOMPLISHED_DATE := SYSDATE;
4471 
4472               IF G_DEBUG='Y'  THEN
4473                 AHL_DEBUG_PUB.debug('start update status to Exception descedant ue_id' || l_ue_descendent_rec.UNIT_EFFECTIVITY_ID);
4474               END IF;
4475              AHL_UNIT_EFFECTIVITIES_PKG.UPDATE_ROW (
4476                x_unit_effectivity_id =>     l_ue_descendent_rec.UNIT_EFFECTIVITY_ID,
4477                x_csi_item_instance_id =>    l_ue_descendent_rec.CSI_ITEM_INSTANCE_ID,
4478                x_mr_interval_id =>          l_ue_descendent_rec.MR_INTERVAL_ID     ,
4479                x_MR_EFFECTIVITY_ID =>       l_ue_descendent_rec.MR_EFFECTIVITY_ID  ,
4480                x_MR_HEADER_ID =>            l_ue_descendent_rec.MR_HEADER_ID       ,
4481                x_STATUS_CODE =>             l_ue_descendent_rec.STATUS_CODE        ,
4482                x_DUE_DATE =>                l_ue_descendent_rec.DUE_DATE           ,
4483                x_DUE_COUNTER_VALUE =>       l_ue_descendent_rec.DUE_COUNTER_VALUE  ,
4484                x_FORECAST_SEQUENCE =>       l_ue_descendent_rec.FORECAST_SEQUENCE  ,
4485                x_REPETITIVE_MR_FLAG =>      l_ue_descendent_rec.REPETITIVE_MR_FLAG,
4486                x_TOLERANCE_FLAG =>          l_ue_descendent_rec.TOLERANCE_FLAG    ,
4487                x_REMARKS =>                 l_ue_descendent_rec.REMARKS           ,
4488                x_MESSAGE_CODE =>            l_ue_descendent_rec.MESSAGE_CODE      ,
4489                x_PRECEDING_UE_ID =>         l_ue_descendent_rec.PRECEDING_UE_ID    ,
4490                x_DATE_RUN =>                l_ue_descendent_rec.DATE_RUN,
4491                x_SET_DUE_DATE =>            l_ue_descendent_rec.SET_DUE_DATE,
4492                x_ACCOMPLISHED_DATE =>       l_ue_descendent_rec.ACCOMPLISHED_DATE,
4493                x_SERVICE_LINE_ID =>         l_ue_descendent_rec.SERVICE_LINE_ID,
4494                x_PROGRAM_MR_HEADER_ID =>    l_ue_descendent_rec.PROGRAM_MR_HEADER_ID,
4495                x_CANCEL_REASON_CODE =>      l_ue_descendent_rec.CANCEL_REASON_CODE,
4496                x_EARLIEST_DUE_DATE =>       l_ue_descendent_rec.EARLIEST_DUE_DATE,
4497                x_LATEST_DUE_DATE =>         l_ue_descendent_rec.LATEST_DUE_DATE,
4498                x_defer_from_ue_id =>        l_ue_descendent_rec.defer_from_ue_id,
4499                x_qa_collection_id =>        l_ue_descendent_rec.qa_collection_id,
4500                x_orig_deferral_ue_id =>     l_ue_descendent_rec.orig_deferral_ue_id,
4501                x_cs_incident_id  =>         l_ue_descendent_rec.cs_incident_id,
4502                x_application_usg_code =>    l_ue_descendent_rec.application_usg_code,
4503                x_object_type          =>    l_ue_descendent_rec.object_type,
4504                x_counter_id         =>      l_ue_descendent_rec.counter_id,
4505                x_manually_planned_flag =>   l_ue_descendent_rec.manually_planned_flag,
4506                X_LOG_SERIES_CODE       =>   l_ue_descendent_rec.log_series_code,
4507                X_LOG_SERIES_NUMBER     =>   l_ue_descendent_rec.log_series_number,
4508                X_FLIGHT_NUMBER         =>   l_ue_descendent_rec.flight_number,
4509                X_MEL_CDL_TYPE_CODE     =>   l_ue_descendent_rec.mel_cdl_type_code,
4510                X_POSITION_PATH_ID      =>   l_ue_descendent_rec.position_path_id,
4511                X_ATA_CODE              =>   l_ue_descendent_rec.ATA_CODE,
4512                X_UNIT_CONFIG_HEADER_ID  =>  l_ue_descendent_rec.unit_config_header_id,
4513                x_ATTRIBUTE_CATEGORY =>      l_ue_descendent_rec.ATTRIBUTE_CATEGORY,
4514                x_ATTRIBUTE1 =>              l_ue_descendent_rec.ATTRIBUTE1,
4515                x_ATTRIBUTE2 =>              l_ue_descendent_rec.ATTRIBUTE2,
4516                x_ATTRIBUTE3 =>              l_ue_descendent_rec.ATTRIBUTE3,
4517                x_ATTRIBUTE4 =>              l_ue_descendent_rec.ATTRIBUTE4,
4518                x_ATTRIBUTE5 =>              l_ue_descendent_rec.ATTRIBUTE5,
4519                x_ATTRIBUTE6 =>              l_ue_descendent_rec.ATTRIBUTE6,
4520                x_ATTRIBUTE7 =>              l_ue_descendent_rec.ATTRIBUTE7,
4521                x_ATTRIBUTE8 =>              l_ue_descendent_rec.ATTRIBUTE8,
4522                x_ATTRIBUTE9 =>              l_ue_descendent_rec.ATTRIBUTE9,
4523                x_ATTRIBUTE10 =>             l_ue_descendent_rec.ATTRIBUTE10,
4524                x_ATTRIBUTE11 =>             l_ue_descendent_rec.ATTRIBUTE11,
4525                x_ATTRIBUTE12 =>             l_ue_descendent_rec.ATTRIBUTE12,
4526                x_ATTRIBUTE13 =>             l_ue_descendent_rec.ATTRIBUTE13,
4527                x_ATTRIBUTE14 =>             l_ue_descendent_rec.ATTRIBUTE14,
4528                x_ATTRIBUTE15 =>             l_ue_descendent_rec.ATTRIBUTE15,
4529                x_OBJECT_VERSION_NUMBER =>   l_ue_descendent_rec.OBJECT_VERSION_NUMBER + 1,
4530                x_LAST_UPDATE_DATE =>        sysdate, --l_ue_descendent_rec.LAST_UPDATE_DATE,
4531                x_LAST_UPDATED_BY =>         fnd_global.user_id, --l_ue_descendent_rec.LAST_UPDATED_BY    ,
4532                x_LAST_UPDATE_LOGIN =>       fnd_global.login_id); --l_ue_descendent_rec.LAST_UPDATE_LOGIN );
4533             END LOOP;
4534             CLOSE l_ue_descendent_csr;
4535 
4536         ELSE
4537             AHL_UNIT_EFFECTIVITIES_PKG.Delete_Row(l_ue_rec.UNIT_EFFECTIVITY_ID);
4538 
4539             --Delete Descendants effectivities
4540             OPEN l_ue_descendent_csr(l_ue_rec.UNIT_EFFECTIVITY_ID);
4541             LOOP
4542               FETCH l_ue_descendent_csr INTO l_ue_descendent_rec;
4543               EXIT WHEN l_ue_descendent_csr%NOTFOUND;
4544 
4545                IF G_DEBUG='Y'  THEN
4546                  AHL_DEBUG_PUB.debug('start delete descedant ue_id' ||l_ue_descendent_rec.UNIT_EFFECTIVITY_ID);
4547                 END IF;
4548               AHL_UNIT_EFFECTIVITIES_PKG.Delete_Row(l_ue_descendent_rec.UNIT_EFFECTIVITY_ID);
4549             END LOOP;
4550             CLOSE l_ue_descendent_csr;
4551 
4552         END IF;
4553       END IF;   -- end if mr_repetitive_flag = 'Y'
4554     END IF;  -- visit status.
4555   END LOOP;
4556 
4557    CLOSE l_unit_effectivity_csr;
4558 
4559    IF G_DEBUG='Y'  THEN
4560      AHL_DEBUG_PUB.debug('Start of Processing SRs');
4561    END IF;
4562 
4563    -- Process for SRs.
4564    FOR ahl_sr_ue_rec IN ahl_sr_ue_csr LOOP
4565     OPEN ahl_sr_ue_valid_csr(l_old_mr_header_id, ahl_sr_ue_rec.RELATED_UE_ID);
4566     FETCH ahl_sr_ue_valid_csr INTO l_junk;
4567     IF(ahl_sr_ue_valid_csr%FOUND)THEN
4568       IF G_DEBUG='Y'  THEN
4569         AHL_DEBUG_PUB.debug('Found ue:' || ahl_sr_ue_rec.RELATED_UE_ID);
4570       END IF;
4571 
4572      l_visit_status := AHL_UMP_UTIL_PKG.get_Visit_Status ( ahl_sr_ue_rec.RELATED_UE_ID);
4573 
4574      -- only if visit is in planning status we must mark it for termination.
4575      -- if visit is already on the floor, we do nothing.
4576      IF (nvl(l_visit_status,'X') NOT IN ('RELEASED','CLOSED')) THEN
4577 
4578        IF G_DEBUG='Y'  THEN
4579          AHL_DEBUG_PUB.debug('Processing ue:' || ahl_sr_ue_rec.RELATED_UE_ID || ' for termination');
4580        END IF;
4581 
4582        MR_Terminate (ahl_sr_ue_rec.RELATED_UE_ID);
4583 
4584        -- For child MRs.
4585        FOR descendent_rec IN get_descendents_csr(ahl_sr_ue_rec.RELATED_UE_ID) LOOP
4586          MR_Terminate (descendent_rec.related_ue_id);
4587        END LOOP;
4588 
4589      END IF; -- Visit status.
4590     END IF;--end of if found
4591     CLOSE ahl_sr_ue_valid_csr;
4592    END LOOP;
4593 
4594    -- Check Error Message stack.
4595   x_msg_count := FND_MSG_PUB.count_msg;
4596   IF x_msg_count > 0 THEN
4597      x_return_status := 'U';
4598      RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4599   END IF;
4600 
4601   IF(l_new_mr_header_id  IS NOT NULL)THEN
4602     OPEN get_mr_copy_dtls_csr(l_new_mr_header_id);
4603     FETCH get_mr_copy_dtls_csr INTO l_COPY_FIRST_DUE_FLAG,l_COPY_DEFERRALS_FLAG;
4604     CLOSE get_mr_copy_dtls_csr;
4605     IF(l_COPY_FIRST_DUE_FLAG = 'Y' OR l_COPY_DEFERRALS_FLAG = 'Y') THEN
4606       AHL_FMP_PVT.GET_MR_AFFECTED_ITEMS(
4607             p_api_version          =>  1.0,
4608             p_init_msg_list        =>  FND_API.G_FALSE,
4609             p_commit               =>  FND_API.G_FALSE,
4610             p_validation_level     =>  FND_API.G_VALID_LEVEL_FULL,
4611             x_return_status        => l_return_status,
4612             x_msg_count            => l_msg_count,
4613             x_msg_data             => l_msg_data,
4614             p_mr_header_id         => l_new_mr_header_id,
4615             p_mr_effectivity_id    => NULL,
4616             p_top_node_flag        => 'N',
4617             p_unique_inst_flag     => 'N',
4618             p_sort_flag            => 'N',
4619             x_mr_item_inst_tbl     =>  l_new_mr_item_instance_tbl
4620       );
4621       IF(l_return_status = 'U') THEN
4622         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4623       END IF;
4624       IF(l_return_status = 'E') THEN
4625        RAISE  FND_API.G_EXC_ERROR;
4626       END IF;
4627 
4628       IF (l_new_mr_item_instance_tbl.COUNT) > 0 THEN
4629          FOR i IN l_new_mr_item_instance_tbl.FIRST..l_new_mr_item_instance_tbl.LAST LOOP
4630             FOR cp_ue_rec IN l_cp_ue_csr(l_old_mr_header_id,l_new_mr_item_instance_tbl(i).ITEM_INSTANCE_ID) LOOP
4631                l_copy_record := FALSE;
4632                l_copy_ud_record := FALSE;
4633                IF(NVL(l_COPY_DEFERRALS_FLAG,'N') = 'N') THEN
4634                   cp_ue_rec.DEFER_FROM_UE_ID := NULL;
4635                   cp_ue_rec.ORIG_DEFERRAL_UE_ID := NULL;
4636                ELSE
4637                   IF cp_ue_rec.DEFER_FROM_UE_ID IS NOT NULL THEN
4638                     l_copy_record := TRUE;
4639                   END IF;
4640                END IF;
4641 
4642                cp_ue_rec.status_code := NULL;
4643                l_unit_deferral_id := NULL;
4644 
4645                IF(NVL(l_COPY_FIRST_DUE_FLAG,'N') = 'Y') THEN
4646                  -- check whether init due data exists
4647                   OPEN unit_deferral_id_csr(cp_ue_rec.unit_effectivity_id);
4648                   FETCH unit_deferral_id_csr INTO l_unit_deferral_id;
4649                   IF(unit_deferral_id_csr%FOUND)THEN
4650                     l_copy_record := TRUE;
4651                     l_copy_ud_record := TRUE;
4652                     cp_ue_rec.status_code := 'INIT-DUE';
4653                   END IF;
4654                   CLOSE unit_deferral_id_csr;
4655                END IF;
4656 
4657                IF(l_copy_record)THEN
4658                  AHL_UNIT_EFFECTIVITIES_PKG.Insert_Row (
4659                     X_ROWID               =>  l_rowid,
4660                     X_UNIT_EFFECTIVITY_ID =>   l_unit_effectivity_id,
4661                     X_CSI_ITEM_INSTANCE_ID  => cp_ue_rec.csi_item_instance_id,
4662                     X_MR_INTERVAL_ID        => cp_ue_rec.mr_interval_id,
4663                     X_MR_EFFECTIVITY_ID     => cp_ue_rec.mr_effectivity_id,
4664                     X_MR_HEADER_ID          => l_new_mr_header_id,
4665                     X_STATUS_CODE           => cp_ue_rec.status_code, /* status_code */
4666                     X_DUE_DATE              => cp_ue_rec.due_date,
4667                     X_DUE_COUNTER_VALUE     => cp_ue_rec.due_counter_value,
4668                     X_FORECAST_SEQUENCE     => cp_ue_rec.forecast_sequence,
4669                     X_REPETITIVE_MR_FLAG    => cp_ue_rec.repetitive_mr_flag,
4670                     X_TOLERANCE_FLAG        => cp_ue_rec.tolerance_flag,
4671                     X_REMARKS               => null, /* remarks */
4672                     X_MESSAGE_CODE          => null,
4673                     X_PRECEDING_UE_ID       => null, /* p_x_temp_mr_rec.preceding_ue_id */
4674                     X_DATE_RUN              => sysdate, /* date_run */
4675                     X_SET_DUE_DATE          => cp_ue_rec.set_due_date,
4676                     X_ACCOMPLISHED_DATE     => null, /* accomplished date */
4677                     X_SERVICE_LINE_ID       => cp_ue_rec.service_line_id,
4678                     X_PROGRAM_MR_HEADER_ID  => cp_ue_rec.program_mr_header_id,
4679                     X_CANCEL_REASON_CODE    => null, /* cancel_reason_code */
4680                     X_EARLIEST_DUE_DATE     => cp_ue_rec.earliest_due_date,
4681                     X_LATEST_DUE_DATE       => cp_ue_rec.latest_due_date,
4682                     X_defer_from_ue_id      => cp_ue_rec.DEFER_FROM_UE_ID,
4683                     X_cs_incident_id        => null,
4684                     X_qa_collection_id      => null,
4685                     X_orig_deferral_ue_id   => cp_ue_rec.ORIG_DEFERRAL_UE_ID,
4686                     X_application_usg_code  => cp_ue_rec.APPLICATION_USG_CODE,
4687                     X_object_type           => 'MR',
4688                     X_counter_id            => cp_ue_rec.counter_id,
4689                     X_MANUALLY_PLANNED_FLAG => cp_ue_rec.MANUALLY_PLANNED_FLAG,
4690                     X_LOG_SERIES_CODE       => cp_ue_rec.LOG_SERIES_CODE,
4691                     X_LOG_SERIES_NUMBER     => cp_ue_rec.LOG_SERIES_NUMBER,
4692                     X_FLIGHT_NUMBER         => cp_ue_rec.FLIGHT_NUMBER,
4693                     X_MEL_CDL_TYPE_CODE     => cp_ue_rec.MEL_CDL_TYPE_CODE,
4694                     X_POSITION_PATH_ID      => cp_ue_rec.POSITION_PATH_ID,
4695                     X_ATA_CODE              => cp_ue_rec.ATA_CODE,
4696                     X_UNIT_CONFIG_HEADER_ID  => cp_ue_rec.UNIT_CONFIG_HEADER_ID,
4697                     X_ATTRIBUTE_CATEGORY    => cp_ue_rec.ATTRIBUTE_CATEGORY,
4698                     X_ATTRIBUTE1            => cp_ue_rec.ATTRIBUTE1,
4699                     X_ATTRIBUTE2            =>  cp_ue_rec.ATTRIBUTE2,
4700                     X_ATTRIBUTE3            =>  cp_ue_rec.ATTRIBUTE3,
4701                     X_ATTRIBUTE4            => cp_ue_rec.ATTRIBUTE4,
4702                     X_ATTRIBUTE5            =>  cp_ue_rec.ATTRIBUTE5,
4703                     X_ATTRIBUTE6            =>  cp_ue_rec.ATTRIBUTE6,
4704                     X_ATTRIBUTE7            =>  cp_ue_rec.ATTRIBUTE7,
4705                     X_ATTRIBUTE8            =>  cp_ue_rec.ATTRIBUTE8,
4706                     X_ATTRIBUTE9            =>  cp_ue_rec.ATTRIBUTE9,
4707                     X_ATTRIBUTE10           =>  cp_ue_rec.ATTRIBUTE10,
4708                     X_ATTRIBUTE11           =>  cp_ue_rec.ATTRIBUTE11,
4709                     X_ATTRIBUTE12           =>  cp_ue_rec.ATTRIBUTE12,
4710                     X_ATTRIBUTE13           =>  cp_ue_rec.ATTRIBUTE13,
4711                     X_ATTRIBUTE14           =>  cp_ue_rec.ATTRIBUTE14,
4712                     X_ATTRIBUTE15           =>  cp_ue_rec.ATTRIBUTE15,
4713                     X_OBJECT_VERSION_NUMBER => 1, /* object version */
4714                     X_CREATION_DATE         => sysdate,
4715                     X_CREATED_BY            => fnd_global.user_id,
4716                     X_LAST_UPDATE_DATE      => sysdate,
4717                     X_LAST_UPDATED_BY       => fnd_global.user_id,
4718                     X_LAST_UPDATE_LOGIN     => fnd_global.login_id );
4719                  IF(l_copy_ud_record)THEN
4720                    Update AHL_UNIT_DEFERRALS_B SET UNIT_EFFECTIVITY_ID = l_unit_effectivity_id,
4721                           last_update_date = sysdate,
4722                           object_version_number = object_version_number + 1,
4723                           LAST_UPDATED_BY = fnd_global.user_id,
4724                           LAST_UPDATE_LOGIN = fnd_global.login_id
4725                    WHERE unit_deferral_id = l_unit_deferral_id;
4726                  END IF;
4727                END IF;
4728              END LOOP;
4729             END LOOP;
4730            END IF; -- call fmp if
4731       END IF; -- count > 0
4732   END IF;
4733 
4734   -- Standard check of p_commit
4735   IF FND_API.TO_BOOLEAN(p_commit) THEN
4736       COMMIT WORK;
4737       IF G_DEBUG='Y'  THEN
4738         AHL_DEBUG_PUB.debug('Committed Changes', 'UMP');
4739       END IF;
4740   END IF;
4741 
4742   /* commented call from here as BUE api commits. Launching concurrent program instead.
4743   IF (l_new_mr_header_id IS NOT NULL AND trunc(l_effective_from_date) <= trunc(sysdate)) THEN
4744       AHL_UMP_UNITMAINT_PVT.Build_UnitEffectivity (
4745             p_init_msg_list          =>  FND_API.G_FALSE,
4746             p_validation_level      =>  FND_API.G_VALID_LEVEL_FULL,
4747             p_default                   =>    FND_API.G_TRUE,
4748             p_module_type          =>  NULL,
4749             x_return_status         => l_return_status,
4750             x_msg_count             => l_msg_count,
4751             x_msg_data              => l_msg_data,
4752             p_mr_header_id          => l_new_mr_header_id
4753           ) ;
4754 
4755     IF(l_return_status = 'U') THEN
4756         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4757     END IF;
4758     IF(l_return_status = 'E') THEN
4759        RAISE  FND_API.G_EXC_ERROR;
4760     END IF;
4761 
4762   END IF;
4763   */
4764 
4765   -- launch concurrent program to build UEs for applicable old and new MRs.
4766   -- commenting the cc pgm - modified for FP bug# 7414814
4767   /*
4768   l_req_id := fnd_request.submit_request('AHL','AHLWUEFF',NULL,NULL,FALSE, l_old_mr_header_id,
4769                                          l_new_mr_header_id);
4770   IF (l_req_id = 0 OR l_req_id IS NULL) THEN
4771     IF G_debug = 'Y' THEN
4772       AHL_DEBUG_PUB.debug('Tried to submit concurrent request but failed');
4773     END IF;
4774   END IF;
4775   */
4776 
4777   -- Standard call to get message count and if count is 1, get message info
4778   FND_MSG_PUB.Count_And_Get
4779     ( p_count => x_msg_count,
4780       p_data  => x_msg_data,
4781       p_encoded => fnd_api.g_false
4782     );
4783 
4784 --
4785 EXCEPTION
4786  WHEN FND_API.G_EXC_ERROR THEN
4787    x_return_status := FND_API.G_RET_STS_ERROR;
4788    Rollback to Terminate_MR_Instances_pvt;
4789    FND_MSG_PUB.count_and_get( p_count => x_msg_count,
4790                               p_data  => x_msg_data,
4791                               p_encoded => fnd_api.g_false);
4792 
4793    -- Disable debug
4794    AHL_DEBUG_PUB.disable_debug;
4795 
4796   WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
4797    x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4798    Rollback to Terminate_MR_Instances_pvt;
4799    FND_MSG_PUB.count_and_get( p_count => x_msg_count,
4800                               p_data  => x_msg_data,
4801                               p_encoded => fnd_api.g_false);
4802 
4803    -- Disable debug
4804    AHL_DEBUG_PUB.disable_debug;
4805 
4806  WHEN OTHERS THEN
4807     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4808     Rollback to Terminate_MR_Instances_pvt;
4809     IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
4810        fnd_msg_pub.add_exc_msg(p_pkg_name       => G_PKG_NAME,
4811                                p_procedure_name => 'Terminate_MR_Instances_pvt',
4812                                p_error_text     => SUBSTR(SQLERRM,1,240));
4813     END IF;
4814     FND_MSG_PUB.count_and_get( p_count => x_msg_count,
4815                                p_data  => x_msg_data,
4816                                p_encoded => fnd_api.g_false);
4817 
4818 
4819     -- Disable debug
4820     AHL_DEBUG_PUB.disable_debug;
4821 
4822 
4823 END TERMINATE_MR_INSTANCES;
4824 
4825 
4826 ------------------------------
4827 -- Define Local Procedures --
4828 ------------------------------
4829 PROCEDURE Convert_MRID (p_x_mr_id        IN OUT NOCOPY  NUMBER,
4830                         p_mr_title       IN             VARCHAR2,
4831                         p_version_number IN             NUMBER)
4832 IS
4833 
4834   -- For case where title and version is known.
4835   CURSOR ahl_mr_headers_csr (p_title          IN  VARCHAR2,
4836                              p_version_number IN  NUMBER) IS
4837     /*SELECT mr_header_id, effective_to
4838     FROM   ahl_mr_headers_v
4839     WHERE title = p_title
4840           AND version_number = p_version_number;*/
4841     SELECT mr_header_id, effective_to
4842     FROM   ahl_mr_headers_app_v
4843     WHERE title = p_title
4844           AND version_number = p_version_number;
4845 
4846   -- local variables.
4847   l_mr_id  NUMBER;
4848   l_effective_to ahl_mr_headers_app_v.EFFECTIVE_TO%TYPE;
4849   l_mr_title  ahl_mr_headers_app_v.TITLE%TYPE;
4850   l_version_number ahl_mr_headers_app_v.VERSION_NUMBER%TYPE;
4851 
4852 BEGIN
4853 
4854   IF (p_x_mr_id IS NULL OR p_x_mr_id = FND_API.G_MISS_NUM) THEN
4855      IF (p_mr_title IS NOT NULL AND p_mr_title <> FND_API.G_MISS_CHAR) AND
4856         (p_version_number IS NOT NULL AND p_version_number <> FND_API.G_MISS_NUM) THEN
4857         OPEN ahl_mr_headers_csr(p_mr_title, p_version_number);
4858         FETCH ahl_mr_headers_csr INTO l_mr_id, l_effective_to;
4859         IF (ahl_mr_headers_csr%NOTFOUND) THEN
4860           FND_MESSAGE.Set_Name ('AHL','AHL_UMP_PUE_TITLE_INVALID');
4861           FND_MESSAGE.Set_Token('TITLE',p_mr_title);
4862           FND_MESSAGE.Set_Token('VERSION',p_version_number);
4863           FND_MSG_PUB.ADD;
4864         ELSIF (trunc(l_effective_to) < trunc(sysdate)) THEN
4865           FND_MESSAGE.Set_Name ('AHL','AHL_UMP_PUE_MR_EXPIRED');
4866           FND_MESSAGE.Set_Token('TITLE',p_mr_title);
4867           FND_MESSAGE.Set_Token('VERSION',p_version_number);
4868           FND_MSG_PUB.ADD;
4869         ELSE
4870           p_x_mr_id := l_mr_id;
4871         END IF;
4872         CLOSE ahl_mr_headers_csr;
4873      END IF;
4874   END IF;
4875 
4876 END Convert_MRID;
4877 
4878 PROCEDURE Convert_Unit (p_x_uc_header_id  IN OUT NOCOPY  NUMBER,
4879                         p_unit_name       IN             VARCHAR2)
4880 IS
4881 
4882   CURSOR ahl_uc_headers_csr(p_unit_name IN VARCHAR2) IS
4883     SELECT unit_config_header_id
4884     FROM   ahl_unit_config_headers
4885     WHERE  name = p_unit_name;
4886 
4887   l_uc_header_id  NUMBER;
4888   l_junk          VARCHAR2(1);
4889 
4890 BEGIN
4891 
4892  IF (p_x_uc_header_id IS NULL OR p_x_uc_header_id = FND_API.G_MISS_NUM) THEN
4893     IF (p_unit_name IS NOT NULL AND p_unit_name <> FND_API.G_MISS_CHAR) THEN
4894       OPEN ahl_uc_headers_csr(p_unit_name);
4895       FETCH ahl_uc_headers_csr INTO l_uc_header_id;
4896       IF (ahl_uc_headers_csr%NOTFOUND) THEN
4897          FND_MESSAGE.Set_Name ('AHL','AHL_UMP_PUE_UNIT_INVALID');
4898          FND_MESSAGE.Set_Token('NAME',p_unit_name);
4899          FND_MSG_PUB.ADD;
4900       ELSE
4901          p_x_uc_header_id := l_uc_header_id;
4902       END IF;
4903     END IF;
4904   END IF;
4905 
4906 END Convert_Unit;
4907 
4908 PROCEDURE Convert_Instance (p_x_csi_item_instance_id  IN OUT NOCOPY  NUMBER,
4909                             p_csi_instance_number     IN             VARCHAR2)
4910 IS
4911 
4912   CURSOR csi_item_instances_csr(p_csi_instance_number IN VARCHAR2) IS
4913     SELECT instance_id
4914     FROM   csi_item_instances
4915     WHERE  instance_number = p_csi_instance_number
4916     AND trunc(sysdate) < trunc(nvl(active_end_date, sysdate+1));
4917 
4918   l_csi_item_instance_id  NUMBER;
4919 
4920 BEGIN
4921 
4922   IF (p_x_csi_item_instance_id IS NULL OR
4923       p_x_csi_item_instance_id = FND_API.G_MISS_NUM) THEN
4924     IF (p_csi_instance_number IS NOT NULL AND
4925         p_csi_instance_number <> FND_API.G_MISS_CHAR) THEN
4926       -- get instance_id.
4927       OPEN csi_item_instances_csr (p_csi_instance_number);
4928       FETCH csi_item_instances_csr INTO l_csi_item_instance_id;
4929       IF (csi_item_instances_csr%NOTFOUND) THEN
4930         FND_MESSAGE.Set_Name ('AHL','AHL_UMP_PUE_INST_NOTFOUND');
4931         FND_MESSAGE.Set_Token('NUMBER',p_csi_instance_number);
4932         FND_MSG_PUB.ADD;
4933       ELSE
4934         p_x_csi_item_instance_id := l_csi_item_instance_id;
4935       END IF;
4936       CLOSE csi_item_instances_csr;
4937     END IF;
4938   END IF;
4939 
4940 END Convert_Instance;
4941 
4942 -------------------------------
4943 -- Validate input parameters.
4944 Procedure Validate_Input_Parameters (p_mr_header_id  IN  NUMBER,
4945                                      p_x_csi_item_instance_id IN OUT NOCOPY NUMBER,
4946                                      p_unit_config_header_id  IN  NUMBER)
4947 IS
4948 
4949   -- To validate mr id.
4950   CURSOR ahl_mr_headers_csr(p_mr_header_id   IN  NUMBER) IS
4951     SELECT title, version_number, effective_to, effective_from
4952     FROM  ahl_mr_headers_app_v
4953     WHERE mr_header_id = p_mr_header_id;
4954 
4955   -- To validate instance.
4956   CURSOR csi_item_instances_csr(p_csi_item_instance_id IN  NUMBER) IS
4957     SELECT instance_number, active_end_date
4958     FROM csi_item_instances
4959     WHERE instance_id = p_csi_item_instance_id;
4960 
4961   -- To validate unit.
4962   CURSOR ahl_unit_config_headers_csr (p_uc_header_id IN NUMBER) IS
4963     SELECT name, active_start_date, active_end_date, csi_item_instance_id
4964     FROM  ahl_unit_config_headers
4965     WHERE unit_config_header_id = p_uc_header_id;
4966 
4967   l_effective_from ahl_mr_headers_app_v.EFFECTIVE_FROM%TYPE;
4968   l_effective_to   ahl_mr_headers_app_v.EFFECTIVE_TO%TYPE;
4969   l_mr_title       ahl_mr_headers_app_v.TITLE%TYPE;
4970   l_version_number ahl_mr_headers_app_v.VERSION_NUMBER%TYPE;
4971   l_csi_item_instance_id  NUMBER;
4972   l_active_end_date       DATE;
4973   l_active_start_date     DATE;
4974   l_name                  ahl_unit_config_headers.name%TYPE;
4975   l_instance_number       csi_item_instances.instance_number%TYPE;
4976 
4977 BEGIN
4978 
4979   -- validate mr id.
4980   IF (p_mr_header_id IS NOT NULL) THEN
4981     OPEN ahl_mr_headers_csr (p_mr_header_id);
4982     FETCH ahl_mr_headers_csr INTO l_mr_title, l_version_number,
4983                                   l_effective_to, l_effective_from;
4984     IF (ahl_mr_headers_csr%NOTFOUND) THEN
4985       FND_MESSAGE.Set_Name('AHL','AHL_UMP_PUE_MR_NOTFOUND');
4986       FND_MESSAGE.Set_Token('MR_ID',p_mr_header_id);
4987       FND_MSG_PUB.ADD;
4988       CLOSE ahl_mr_headers_csr;
4989       --dbms_output.put_line('MR not found.');
4990       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4991     ELSIF ( trunc(l_effective_from) > trunc(sysdate) OR
4992             trunc(sysdate) > trunc(l_effective_to)) THEN
4993       FND_MESSAGE.Set_Name('AHL','AHL_UMP_PUE_MR_EXPIRED');
4994     FND_MESSAGE.Set_Token('TITLE',l_mr_title);
4995       FND_MESSAGE.Set_Token('VERSION',l_version_number);
4996       FND_MSG_PUB.ADD;
4997       --dbms_output.put_line('MR is not valid for today.');
4998     END IF;
4999 
5000     CLOSE ahl_mr_headers_csr;
5001   END IF;
5002 
5003   -- validate item instance.
5004   IF (p_x_csi_item_instance_id IS NOT NULL) THEN
5005     OPEN csi_item_instances_csr (p_x_csi_item_instance_id);
5006     FETCH csi_item_instances_csr INTO l_instance_number, l_active_end_date;
5007     IF (csi_item_instances_csr%NOTFOUND) THEN
5008       FND_MESSAGE.Set_Name('AHL','AHL_UMP_PUE_INSTID_NOTFOUND');
5009       FND_MESSAGE.Set_Token('INST_ID', p_x_csi_item_instance_id);
5010       FND_MSG_PUB.ADD;
5011       CLOSE csi_item_instances_csr;
5012       --dbms_output.put_line('Instance not found');
5013       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5014     ELSIF (trunc(l_active_end_date) < trunc(sysdate)) THEN
5015       FND_MESSAGE.Set_Name('AHL','AHL_UMP_PUE_INST_EXPIRED');
5016       FND_MESSAGE.Set_Token('NUMBER', l_instance_number);
5017       FND_MSG_PUB.ADD;
5018       --dbms_output.put_line('Instance has expired');
5019     END IF;
5020     CLOSE csi_item_instances_csr;
5021   END IF;
5022 
5023   -- Validate unit config id.
5024   IF (p_unit_config_header_id IS NOT NULL) THEN
5025      OPEN ahl_unit_config_headers_csr (p_unit_config_header_id);
5026      FETCH ahl_unit_config_headers_csr INTO l_name, l_active_start_date,
5027                      l_active_end_date, l_csi_item_instance_id;
5028      IF (ahl_unit_config_headers_csr%NOTFOUND) THEN
5029        FND_MESSAGE.Set_Name('AHL','AHL_UMP_PUE_UNIT_NOTFOUND');
5030        FND_MESSAGE.Set_Token('UNIT_ID',p_unit_config_header_id);
5031        FND_MSG_PUB.ADD;
5032        --dbms_output.put_line('Unit not found');
5033        CLOSE ahl_unit_config_headers_csr;
5034        RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5035 
5036        -- Dates obsoleted 11.5.10.
5037 --     ELSIF (trunc(l_active_start_date) > trunc(sysdate) OR
5038 --            trunc(sysdate) > trunc(l_active_end_date)) THEN
5039 --       FND_MESSAGE.Set_Name('AHL','AHL_UMP_PUE_UC_EXPIRED');
5040 --       FND_MESSAGE.Set_Token('NAME',l_name);
5041 --       FND_MSG_PUB.ADD;
5042        --dbms_output.put_line('Unit has expired');
5043      ELSIF (p_x_csi_item_instance_id IS NULL) THEN
5044        p_x_csi_item_instance_id := l_csi_item_instance_id;
5045      END IF;
5046   END IF;
5047 
5048   -- Validate for too many parameters.
5049   -- If both item instance and mr_id present then raise error.
5050   IF (p_mr_header_id IS NOT NULL AND p_x_csi_item_instance_id IS NOT NULL) THEN
5051     FND_MESSAGE.Set_Name('AHL','AHL_UMP_PUE_INPUT_INVALID');
5052     -- Fix for bug# 3962903.
5053     --FND_MESSAGE.Set_Token('MR_ID',p_mr_header_id);
5054     --FND_MESSAGE.Set_Token('INST_ID',p_x_csi_item_instance_id);
5055     FND_MSG_PUB.ADD;
5056   END IF;
5057 
5058   -- If both p_unit_config_header_id and p_x_csi_item_instance_id are not
5059   -- null, then p_x_csi_item_instance_id should match l_csi_item_instance_id.
5060   IF ((p_x_csi_item_instance_id IS NOT NULL) AND
5061      (p_unit_config_header_id IS NOT NULL)) THEN
5062      IF (l_csi_item_instance_id <> p_x_csi_item_instance_id) THEN
5063        FND_MESSAGE.Set_Name('AHL','AHL_UMP_PUE_INPUT_INVALID');
5064        -- Fix for bug# 3962903.
5065        --FND_MESSAGE.Set_Token('MR_ID',p_mr_header_id);
5066        --FND_MESSAGE.Set_Token('INST_ID',p_x_csi_item_instance_id);
5067        FND_MSG_PUB.ADD;
5068      END IF;
5069   END IF;
5070 
5071 
5072 END Validate_Input_Parameters;
5073 
5074 -- AMSRINIV : #4360784 Modified Validate_PM_Input_Parameters so that Validate_Input_Parameters needn't be called. Begin
5075 -- Tamal: Bug #4207212, #4114368 Begin
5076 -- Validation procedure for PM mode.
5077 Procedure Validate_PM_Input_Parameters (p_mr_header_id  IN  NUMBER,
5078                                         p_csi_item_instance_id   IN  NUMBER,
5079                                         p_contract_number  IN  VARCHAR2,
5080                                         p_contract_modifier  IN  VARCHAR2)
5081 IS
5082     -- To validate mr id.
5083     CURSOR ahl_mr_headers_csr(p_mr_header_id   IN  NUMBER) IS
5084         SELECT title, version_number, effective_to, effective_from
5085         FROM  ahl_mr_headers_app_v
5086         WHERE mr_header_id = p_mr_header_id;
5087 
5088     -- To validate instance.
5089     CURSOR csi_item_instances_csr(p_csi_item_instance_id IN  NUMBER) IS
5090         SELECT instance_number, active_end_date
5091         FROM csi_item_instances
5092         WHERE instance_id = p_csi_item_instance_id;
5093 
5094     -- Invalid assumption post bug #4360784. Fixed by AMSRINIV
5095     -- The assumption in this package is that Validate_Input_Parameters has already been called before calling this
5096     -- R12: replaced okc_k_headers_b with okc_k_headers_all_b for MOAC (ref bug# 4337173).
5097     cursor contract_number_csr
5098     is
5099         select 'x'
5100         from okc_k_headers_all_b
5101         where contract_number = p_contract_number
5102         and nvl(contract_number_modifier, 'X') = nvl(decode(p_contract_modifier, FND_API.G_MISS_CHAR, null, p_contract_modifier), 'X');
5103 
5104         l_effective_from ahl_mr_headers_app_v.EFFECTIVE_FROM%TYPE;
5105         l_effective_to   ahl_mr_headers_app_v.EFFECTIVE_TO%TYPE;
5106         l_mr_title       ahl_mr_headers_app_v.TITLE%TYPE;
5107         l_version_number ahl_mr_headers_app_v.VERSION_NUMBER%TYPE;
5108         l_csi_item_instance_id  NUMBER;
5109         l_active_end_date       DATE;
5110         l_active_start_date     DATE;
5111         l_instance_number       csi_item_instances.instance_number%TYPE;
5112         l_dummy VARCHAR2(1);
5113 
5114 BEGIN
5115 
5116       -- validate mr id.
5117     IF (p_mr_header_id IS NOT NULL) THEN
5118     OPEN ahl_mr_headers_csr (p_mr_header_id);
5119     FETCH ahl_mr_headers_csr INTO l_mr_title, l_version_number,
5120                                   l_effective_to, l_effective_from;
5121     IF (ahl_mr_headers_csr%NOTFOUND) THEN
5122       FND_MESSAGE.Set_Name('AHL','AHL_UMP_PUE_MR_NOTFOUND');
5123       FND_MESSAGE.Set_Token('MR_ID',p_mr_header_id);
5124       FND_MSG_PUB.ADD;
5125       CLOSE ahl_mr_headers_csr;
5126       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5127     ELSIF ( trunc(l_effective_from) > trunc(sysdate) OR
5128             trunc(sysdate) > trunc(l_effective_to)) THEN
5129       FND_MESSAGE.Set_Name('AHL','AHL_UMP_PUE_MR_EXPIRED');
5130       FND_MESSAGE.Set_Token('TITLE',l_mr_title);
5131       FND_MESSAGE.Set_Token('VERSION',l_version_number);
5132       FND_MSG_PUB.ADD;
5133     END IF;
5134 
5135     CLOSE ahl_mr_headers_csr;
5136   END IF;
5137 
5138   -- validate item instance.
5139   IF (p_csi_item_instance_id IS NOT NULL) THEN
5140     OPEN csi_item_instances_csr (p_csi_item_instance_id);
5141     FETCH csi_item_instances_csr INTO l_instance_number, l_active_end_date;
5142     IF (csi_item_instances_csr%NOTFOUND) THEN
5143       FND_MESSAGE.Set_Name('AHL','AHL_UMP_PUE_INSTID_NOTFOUND');
5144       FND_MESSAGE.Set_Token('INST_ID', p_csi_item_instance_id);
5145       FND_MSG_PUB.ADD;
5146       CLOSE csi_item_instances_csr;
5147       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5148     ELSIF (trunc(l_active_end_date) < trunc(sysdate)) THEN
5149       FND_MESSAGE.Set_Name('AHL','AHL_UMP_PUE_INST_EXPIRED');
5150       FND_MESSAGE.Set_Token('NUMBER', l_instance_number);
5151       FND_MSG_PUB.ADD;
5152     END IF;
5153     CLOSE csi_item_instances_csr;
5154   END IF;
5155 
5156     -- Validate whether contract number + modifier combination exists
5157     -- Validate whether contract modifier is NOT NULL but contract number IS NULL
5158     IF (p_contract_number is not null and p_contract_number <> FND_API.G_MISS_CHAR)
5159     THEN
5160         OPEN contract_number_csr;
5161         FETCH contract_number_csr INTO l_dummy;
5162         IF (contract_number_csr%NOTFOUND)
5163         THEN
5164             FND_MESSAGE.Set_Name('AHL','AHL_UMP_PUE_CONT_NOTFOUND');
5165             FND_MESSAGE.Set_Token('CONTRACT',p_contract_number);
5166             FND_MESSAGE.Set_Token('MODIFIER',p_contract_modifier);
5167             FND_MSG_PUB.ADD;
5168         END IF;
5169         CLOSE contract_number_csr;
5170     ELSIF (p_contract_modifier IS NOT NULL and p_contract_modifier <> FND_API.G_MISS_CHAR)
5171     THEN
5172         FND_MESSAGE.Set_Name('AHL','AHL_UMP_PUE_CONT_MOD_INV');
5173         FND_MESSAGE.Set_Token('MODIFIER',p_contract_modifier);
5174         FND_MSG_PUB.ADD;
5175     END IF;
5176 
5177     -- Validate for too many params(any combination of 2 is an issue)
5178     IF (
5179         (p_mr_header_id IS NOT NULL AND p_csi_item_instance_id IS NOT NULL)
5180         OR
5181         (
5182                 (p_mr_header_id IS NOT NULL or p_csi_item_instance_id IS NOT NULL)
5183                 and
5184                 p_contract_number IS NOT NULL
5185         )
5186     )
5187     THEN
5188         FND_MESSAGE.Set_Name('AHL','AHL_UMP_PUE_PM_INPUT_INVALID');
5189         FND_MSG_PUB.ADD;
5190     END IF;
5191 END Validate_PM_Input_Parameters;
5192 -- Tamal: Bug #4207212, #4114368 End
5193 -- AMSRINIV: Bug #4360784. End
5194 
5195 -- Procedure to mark a UE record as MR-Terminated.
5196 PROCEDURE MR_Terminate(p_unit_effectivity_id IN NUMBER) IS
5197 
5198   CURSOR get_unit_effectivity_csr(p_ue_id IN NUMBER) IS
5199     SELECT
5200       OBJECT_VERSION_NUMBER,
5201       CSI_ITEM_INSTANCE_ID,
5202       MR_INTERVAL_ID,
5203       MR_EFFECTIVITY_ID,
5204       MR_HEADER_ID,
5205       STATUS_CODE,
5206       ACCOMPLISHED_DATE,
5207       DUE_DATE,
5208       DUE_COUNTER_VALUE,
5209       FORECAST_SEQUENCE,
5210       REPETITIVE_MR_FLAG,
5211       TOLERANCE_FLAG,
5212       REMARKS,
5213       MESSAGE_CODE,
5214       PRECEDING_UE_ID,
5215       DATE_RUN,
5216       SET_DUE_DATE,
5217       SERVICE_LINE_ID,
5218       PROGRAM_MR_HEADER_ID,
5219       CANCEL_REASON_CODE,
5220       EARLIEST_DUE_DATE,
5221       LATEST_DUE_DATE,
5222       DEFER_FROM_UE_ID,
5223       CS_INCIDENT_ID,
5224       QA_COLLECTION_ID,
5225       ORIG_DEFERRAL_UE_ID,
5226       APPLICATION_USG_CODE,
5227       OBJECT_TYPE,
5228       COUNTER_ID,
5229       MANUALLY_PLANNED_FLAG,
5230       LOG_SERIES_CODE,
5231       LOG_SERIES_NUMBER,
5232       FLIGHT_NUMBER,
5233       MEL_CDL_TYPE_CODE,
5234       POSITION_PATH_ID,
5235       ATA_CODE,
5236       UNIT_CONFIG_HEADER_ID,
5237       ATTRIBUTE_CATEGORY,
5238       ATTRIBUTE1,
5239       ATTRIBUTE2,
5240       ATTRIBUTE3,
5241       ATTRIBUTE4,
5242       ATTRIBUTE5,
5243       ATTRIBUTE6,
5244       ATTRIBUTE7,
5245       ATTRIBUTE8,
5246       ATTRIBUTE9,
5247       ATTRIBUTE10,
5248       ATTRIBUTE11,
5249       ATTRIBUTE12,
5250       ATTRIBUTE13,
5251       ATTRIBUTE14,
5252       ATTRIBUTE15
5253     FROM  AHL_UNIT_EFFECTIVITIES_APP_V
5254     WHERE unit_effectivity_id = p_ue_id
5255     FOR UPDATE OF OBJECT_VERSION_NUMBER;
5256 
5257    l_ue_rec   get_unit_effectivity_csr%rowtype;
5258 
5259 BEGIN
5260   IF G_DEBUG='Y'  THEN
5261     AHL_DEBUG_PUB.debug('MR-Terminating UE record with ue_id ' || p_unit_effectivity_id, 'UMP');
5262   END IF;
5263 
5264   OPEN get_unit_effectivity_csr(p_unit_effectivity_id);
5265   FETCH get_unit_effectivity_csr INTO l_ue_rec;
5266   CLOSE get_unit_effectivity_csr;
5267 
5268   l_ue_rec.STATUS_CODE := 'MR-TERMINATE';
5269   l_ue_rec.MESSAGE_CODE := 'TERMINATE-W-NEW-REV';
5270   l_ue_rec.ACCOMPLISHED_DATE := SYSDATE;
5271 
5272   -- Call Table Handler to update record
5273   AHL_UNIT_EFFECTIVITIES_PKG.update_row(
5274             x_unit_effectivity_id => p_unit_effectivity_id,
5275             x_csi_item_instance_id => l_ue_rec.CSI_ITEM_INSTANCE_ID,
5276             x_mr_interval_id => l_ue_rec.MR_INTERVAL_ID,
5277             x_mr_effectivity_id => l_ue_rec.MR_EFFECTIVITY_ID,
5278             x_mr_header_id => l_ue_rec.MR_HEADER_ID,
5279             x_status_code => l_ue_rec.STATUS_CODE,
5280             x_due_date => null,
5281             x_due_counter_value => null,
5282             x_forecast_sequence => null,
5283             x_repetitive_mr_flag => null,
5284             x_tolerance_flag => null,
5285             x_remarks => l_ue_rec.REMARKS,
5286             x_message_code => l_ue_rec.message_code,
5287             x_preceding_ue_id => l_ue_rec.PRECEDING_UE_ID,
5288             x_date_run => l_ue_rec.DATE_RUN,
5289             x_set_due_date => l_ue_rec.SET_DUE_DATE,
5290             x_accomplished_date => TRUNC(sysdate),
5291             x_service_line_id  => l_ue_rec.service_line_id,
5292             x_program_mr_header_id => l_ue_rec.program_mr_header_id,
5293             x_cancel_reason_code => l_ue_rec.cancel_reason_code,
5294             x_earliest_due_date  => l_ue_rec.earliest_due_date,
5295             x_latest_due_date    => l_ue_rec.latest_due_date,
5296             x_defer_from_ue_id     => l_ue_rec.defer_from_ue_id,
5297             x_qa_collection_id     => l_ue_rec.qa_collection_id,
5298             x_orig_deferral_ue_id  => l_ue_rec.orig_deferral_ue_id,
5299             x_cs_incident_id       => l_ue_rec.cs_incident_id,
5300             x_application_usg_code => l_ue_rec.application_usg_code,
5301             x_object_type          => l_ue_rec.object_type,
5302             x_counter_id           => l_ue_rec.counter_id,
5303             x_manually_planned_flag => l_ue_rec.manually_planned_flag,
5304             X_LOG_SERIES_CODE       => l_ue_rec.log_series_code,
5305             X_LOG_SERIES_NUMBER     => l_ue_rec.log_series_number,
5306             X_FLIGHT_NUMBER         => l_ue_rec.flight_number,
5307             X_MEL_CDL_TYPE_CODE     => l_ue_rec.mel_cdl_type_code,
5308             X_POSITION_PATH_ID      => l_ue_rec.position_path_id,
5309             X_ATA_CODE              => l_ue_rec.ATA_CODE,
5310             X_UNIT_CONFIG_HEADER_ID  => l_ue_rec.unit_config_header_id,
5311             x_attribute_category => l_ue_rec.ATTRIBUTE_CATEGORY,
5312             x_attribute1 => l_ue_rec.ATTRIBUTE1,
5313             x_attribute2 => l_ue_rec.ATTRIBUTE2,
5314             x_attribute3 => l_ue_rec.ATTRIBUTE3,
5315             x_attribute4 => l_ue_rec.ATTRIBUTE4,
5316             x_attribute5 => l_ue_rec.ATTRIBUTE5,
5317             x_attribute6 => l_ue_rec.ATTRIBUTE6,
5318             x_attribute7 => l_ue_rec.ATTRIBUTE7,
5319             x_attribute8 => l_ue_rec.ATTRIBUTE8,
5320             x_attribute9 => l_ue_rec.ATTRIBUTE9,
5321             x_attribute10 => l_ue_rec.ATTRIBUTE10,
5322             x_attribute11 => l_ue_rec.ATTRIBUTE11,
5323             x_attribute12 => l_ue_rec.ATTRIBUTE12,
5324             x_attribute13 => l_ue_rec.ATTRIBUTE13,
5325             x_attribute14 => l_ue_rec.ATTRIBUTE14,
5326             x_attribute15 => l_ue_rec.ATTRIBUTE15,
5327             x_object_version_number => l_ue_rec.OBJECT_VERSION_NUMBER + 1,
5328             x_last_update_date => TRUNC(sysdate),
5329             x_last_updated_by => fnd_global.user_id,
5330             x_last_update_login => fnd_global.login_id);
5331 
5332 
5333 END MR_Terminate;
5334 
5335 -- Tamal: Bug #4207212, #4114368 Begin
5336 PROCEDURE Building_PM_Unit_Effectivities (
5337     errbuf                  OUT NOCOPY  VARCHAR2,
5338     retcode                 OUT NOCOPY  NUMBER,
5339     p_api_version           IN          NUMBER,
5340     p_mr_header_id          IN          NUMBER := NULL,
5341     p_csi_item_instance_id  IN          NUMBER := NULL,
5342     p_contract_number       IN          VARCHAR2 := NULL,
5343     p_contract_modifier     IN          VARCHAR2 := NULL,
5344     p_num_of_workers        IN          NUMBER   := 1
5345 )
5346 IS
5347 
5348     l_return_status     VARCHAR2(30);
5349     l_msg_count         NUMBER;
5350 
5351     l_api_name          VARCHAR2(30) := 'Building_PM_Unit_Effectivities';
5352     l_api_version       NUMBER := 1.0;
5353 
5354 BEGIN
5355 
5356     -- Initialize error message stack by default
5357     FND_MSG_PUB.Initialize;
5358 
5359     -- Standard call to check for call compatibility
5360     IF NOT FND_API.Compatible_API_Call(l_api_version, p_api_version, l_api_name, G_PKG_NAME)
5361     THEN
5362         retcode := 2;
5363         errbuf := FND_MSG_PUB.Get;
5364 
5365         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5366     END IF;
5367 
5368     Build_UnitEffectivity (
5369         p_init_msg_list         => FND_API.G_TRUE,
5370         p_validation_level      => FND_API.G_VALID_LEVEL_FULL,
5371         p_default               => FND_API.G_TRUE,
5372         p_module_type           => NULL,
5373         x_return_status         => l_return_status,
5374         x_msg_count             => l_msg_count,
5375         x_msg_data              => errbuf,
5376         p_mr_header_id          => p_mr_header_id,
5377         p_csi_item_instance_id  => p_csi_item_instance_id,
5378         p_contract_number       => p_contract_number,
5379         p_contract_modifier     => p_contract_modifier,
5380         p_concurrent_flag       => 'Y'
5381     );
5382 
5383     l_msg_count := FND_MSG_PUB.Count_Msg;
5384     IF (l_return_status <> FND_API.G_RET_STS_SUCCESS)
5385     THEN
5386         retcode := 2;  -- error based only on return status
5387     ELSIF (l_msg_count > 0 AND l_return_status = FND_API.G_RET_STS_SUCCESS)
5388     THEN
5389         retcode := 1;  -- warning based on return status + msg count
5390     ELSE
5391         retcode := 0;  -- success, since nothing is wrong
5392     END IF;
5393 END Building_PM_Unit_Effectivities;
5394 -- Tamal: Bug #4207212, #4114368 End
5395 
5396 -- SATHAPLI::Bug# 6504069, 26-Mar-2008
5397 -- API to build the unit effectivities for all the attached units for a given PC.
5398 -- The API is configured as the concurrent program AHLPCUEFF.
5399 PROCEDURE Building_PC_Unit_Effectivities (
5400     errbuf                  OUT NOCOPY  VARCHAR2,
5401     retcode                 OUT NOCOPY  NUMBER,
5402     p_api_version           IN          NUMBER,
5403     p_pc_header_id          IN          NUMBER
5404 ) IS
5405 
5406     CURSOR check_for_pc_csr (c_pc_header_id NUMBER) IS
5407         SELECT 'X'
5408         FROM   ahl_pc_headers_b
5409         WHERE  pc_header_id = c_pc_header_id
5410         AND    status       = 'COMPLETE';
5411 
5412     CURSOR get_mr_for_pc_csr (c_pc_header_id NUMBER) IS
5413         SELECT mrh.mr_header_id, mre.mr_effectivity_id
5414         FROM   ahl_mr_headers_b mrh, ahl_mr_effectivities mre,
5415                ahl_pc_nodes_b pcn
5416         WHERE  mrh.mr_header_id = mre.mr_header_id
5417         AND    mre.pc_node_id   = pcn.pc_node_id
5418         AND    pcn.pc_header_id = c_pc_header_id
5419         AND    TRUNC(NVL(mrh.effective_to, SYSDATE+1)) > TRUNC(SYSDATE);
5420 
5421 --
5422     l_return_status         VARCHAR2(30);
5423     l_msg_count             NUMBER;
5424 
5425     l_api_version           NUMBER        := 1.0;
5426     l_api_name     CONSTANT VARCHAR2(30)  := 'Building_PC_Unit_Effectivities';
5427     l_full_name    CONSTANT VARCHAR2(100) := 'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name;
5428 
5429     TYPE MR_ITM_INST_TBL_TYPE IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
5430 
5431     l_pc_mr_item_inst_tbl   MR_ITM_INST_TBL_TYPE;
5432     l_get_mr_for_pc_rec     get_mr_for_pc_csr%ROWTYPE;
5433     l_mr_item_inst_tbl      AHL_FMP_PVT.MR_ITEM_INSTANCE_TBL_TYPE;
5434     indx                    NUMBER;
5435     l_dummy                 VARCHAR2(1);
5436 --
5437 
5438 BEGIN
5439     IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
5440         FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,l_full_name,'Start of the API');
5441     END IF;
5442 
5443     -- initialize error message stack
5444     FND_MSG_PUB.Initialize;
5445 
5446     -- standard call to check for call compatibility
5447     IF NOT FND_API.Compatible_API_Call(l_api_version, p_api_version,
5448                                        l_api_name, G_PKG_NAME) THEN
5449         IF (FND_LOG.level_statement >= FND_LOG.g_current_runtime_level) THEN
5450             FND_LOG.string(FND_LOG.level_statement,l_full_name,
5451                            ' Incompatible call. Raising exception.');
5452         END IF;
5453 
5454         retcode := 2;
5455         errbuf  := FND_MSG_PUB.Get;
5456         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5457     END IF;
5458 
5459     -- check for pc_header_id validity
5460     OPEN check_for_pc_csr(p_pc_header_id);
5461     FETCH check_for_pc_csr INTO l_dummy;
5462     IF check_for_pc_csr%NOTFOUND THEN
5463         IF (FND_LOG.level_statement >= FND_LOG.g_current_runtime_level) THEN
5464             FND_LOG.string(FND_LOG.level_statement,l_full_name,
5465                            ' Invalid PC');
5466         END IF;
5467 
5468         CLOSE check_for_pc_csr;
5469         -- invalid pc_header_id
5470         FND_MESSAGE.Set_Name('AHL','AHL_PC_NOT_FOUND');
5471         FND_MSG_PUB.ADD;
5472 
5473         retcode := 2;
5474         errbuf  := FND_MSG_PUB.Get;
5475         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5476     END IF;
5477     CLOSE check_for_pc_csr;
5478 
5479     -- get all the applicable MRs for the PC
5480     IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
5481         FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,l_full_name,
5482                        ' p_pc_header_id => '||p_pc_header_id);
5483     END IF;
5484 
5485     OPEN get_mr_for_pc_csr(p_pc_header_id);
5486     LOOP
5487         FETCH get_mr_for_pc_csr INTO l_get_mr_for_pc_rec;
5488         EXIT WHEN get_mr_for_pc_csr%NOTFOUND;
5489 
5490         -- get the top level applicable instances for the MR
5491         AHL_FMP_PVT.GET_MR_AFFECTED_ITEMS(
5492             p_api_version           => 1.0,
5493             p_init_msg_list         => FND_API.G_FALSE,
5494             p_commit                => FND_API.G_FALSE,
5495             p_validation_level      => FND_API.G_VALID_LEVEL_FULL,
5496             x_return_status         => l_return_status,
5497             x_msg_count             => l_msg_count,
5498             x_msg_data              => errbuf,
5499             p_mr_header_id          => l_get_mr_for_pc_rec.mr_header_id,
5500             p_mr_effectivity_id     => l_get_mr_for_pc_rec.mr_effectivity_id,
5501             p_top_node_flag         => 'Y',
5502             p_unique_inst_flag      => 'Y',
5503             x_mr_item_inst_tbl      => l_mr_item_inst_tbl);
5504 
5505         -- check for the return status
5506         IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
5507             IF (FND_LOG.level_statement >= FND_LOG.g_current_runtime_level) THEN
5508                 FND_LOG.string(FND_LOG.level_statement,l_full_name,
5509                                ' Raising exception with x_return_status => '||l_return_status);
5510             END IF;
5511 
5512             retcode := 2;
5513             errbuf  := FND_MSG_PUB.Get;
5514 
5515             IF (l_return_status = FND_API.G_RET_STS_UNEXP_ERROR) THEN
5516                 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5517             ELSE
5518                 RAISE FND_API.G_EXC_ERROR;
5519             END IF;
5520         END IF;
5521 
5522         -- populate the associative array of instances for the PC
5523         IF (l_mr_item_inst_tbl.COUNT > 0) THEN
5524             FOR i IN l_mr_item_inst_tbl.FIRST..l_mr_item_inst_tbl.LAST LOOP
5525                 indx := l_mr_item_inst_tbl(i).item_instance_id;
5526                 l_pc_mr_item_inst_tbl(indx) := l_mr_item_inst_tbl(i).item_instance_id;
5527             END LOOP;
5528         END IF;
5529     END LOOP;
5530     CLOSE get_mr_for_pc_csr;
5531 
5532     -- put all the applicable instances for the PC in the debug logs
5533     indx := l_pc_mr_item_inst_tbl.FIRST;
5534     IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
5535         WHILE indx IS NOT NULL LOOP
5536             FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,l_full_name,
5537                            ' l_pc_mr_item_inst_tbl indx, item_instance_id => '||indx||
5538                            ' ,'||l_pc_mr_item_inst_tbl(indx));
5539             indx := l_pc_mr_item_inst_tbl.NEXT(indx);
5540         END LOOP;
5541     END IF;
5542 
5543     -- for each of the top level instances fetched in l_pc_mr_item_inst_tbl above, call the API Build_UnitEffectivity
5544     indx := l_pc_mr_item_inst_tbl.FIRST;
5545     WHILE indx IS NOT NULL LOOP
5546         -- call the API Build_UnitEffectivity
5547         Build_UnitEffectivity (
5548             p_init_msg_list         => FND_API.G_TRUE,
5549             p_validation_level      => FND_API.G_VALID_LEVEL_FULL,
5550             p_default               => FND_API.G_TRUE,
5551             p_module_type           => NULL,
5552             x_return_status         => l_return_status,
5553             x_msg_count             => l_msg_count,
5554             x_msg_data              => errbuf,
5555             p_csi_item_instance_id  => l_pc_mr_item_inst_tbl(indx),
5556             p_concurrent_flag       => 'Y');
5557 
5558         l_msg_count := FND_MSG_PUB.Count_Msg;
5559         IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
5560             -- error based only on return status
5561             IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
5562                 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,l_full_name,
5563                                ' Build_UnitEffectivity failed for l_pc_mr_item_inst_tbl(indx) => '||
5564                                l_pc_mr_item_inst_tbl(indx));
5565             END IF;
5566 
5567             retcode := 2;
5568             EXIT; -- stop building unit effectivities for rest of the instances
5569         ELSIF (l_msg_count > 0 AND l_return_status = FND_API.G_RET_STS_SUCCESS) THEN
5570             -- warning based on return status + msg count
5571             IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
5572                 FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,l_full_name,
5573                                ' Build_UnitEffectivity had warnings for l_pc_mr_item_inst_tbl(indx) => '||
5574                                l_pc_mr_item_inst_tbl(indx));
5575             END IF;
5576 
5577             retcode := 1;
5578         ELSE
5579             -- success, since nothing is wrong
5580             retcode := 0;
5581         END IF;
5582 
5583         indx := l_pc_mr_item_inst_tbl.NEXT(indx);
5584     END LOOP;
5585 
5586     IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
5587         FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,l_full_name,'End of the API');
5588     END IF;
5589 
5590 END Building_PC_Unit_Effectivities;
5591 
5592 --------------------------------------------------------------------------
5593 -- To log error messages into a log file if called from concurrent process.
5594 -- fix for bug#3602277
5595 ---------------------------------------------------------------------------
5596 
5597 PROCEDURE log_error_messages IS
5598 
5599 l_msg_count      NUMBER;
5600 l_msg_index_out  NUMBER;
5601 l_msg_data       VARCHAR2(2000);
5602 
5603 BEGIN
5604 
5605 IF G_DEBUG = 'Y' THEN
5606      AHL_DEBUG_PUB.Debug('Start log error messages');
5607 END IF;
5608 
5609  -- Standard call to get message count.
5610 l_msg_count := FND_MSG_PUB.Count_Msg;
5611 
5612 FOR i IN 1..l_msg_count LOOP
5613   FND_MSG_PUB.get (
5614       p_msg_index      => i,
5615       p_encoded        => FND_API.G_FALSE,
5616       p_data           => l_msg_data,
5617       p_msg_index_out  => l_msg_index_out );
5618 
5619   fnd_file.put_line(FND_FILE.LOG, 'Err message-'||l_msg_index_out||':' || l_msg_data);
5620   IF G_DEBUG = 'Y' THEN
5621      AHL_DEBUG_PUB.Debug('Err message-'||l_msg_index_out||':' || substr(l_msg_data,1,240));
5622   END IF;
5623 
5624 END LOOP;
5625 
5626 IF G_DEBUG = 'Y' THEN
5627      AHL_DEBUG_PUB.Debug('Start log error messages');
5628 END IF;
5629 
5630 
5631 END log_error_messages;
5632 -------------------------------
5633 -- End Local Procedures --
5634 -------------------------------
5635 
5636 END AHL_UMP_UNITMAINT_PVT;