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